From c60a0f4f56f0cf5f259eb0b4520b84e43741e876 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 27 Sep 2024 05:33:02 -0700 Subject: [PATCH 001/169] 16136 remove Django Admin (#17619) * 16136 remove Django Admin * 16136 fix plugin test * 16136 fix migrations * Revert "16136 fix migrations" This reverts commit 80296fa1ecc294e4df8d11d11ea6dc10921517b0. * Remove obsolete admin module from dummy plugin * Remove obsolete admin site configuration * Remove unused import statement * Remove obsolete admin module * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- docs/configuration/miscellaneous.md | 8 -------- netbox/netbox/admin.py | 14 -------------- netbox/netbox/configuration_testing.py | 2 -- netbox/netbox/plugins/urls.py | 2 -- netbox/netbox/settings.py | 5 ----- netbox/netbox/tests/dummy_plugin/admin.py | 9 --------- netbox/netbox/tests/test_plugins.py | 6 ------ netbox/netbox/urls.py | 5 ----- netbox/templates/inc/user_menu.html | 5 ----- netbox/users/admin.py | 5 ----- 10 files changed, 61 deletions(-) delete mode 100644 netbox/netbox/admin.py delete mode 100644 netbox/netbox/tests/dummy_plugin/admin.py delete mode 100644 netbox/users/admin.py diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index 124de3037..576eb8739 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -96,14 +96,6 @@ The maximum size (in bytes) of an incoming HTTP request (i.e. `GET` or `POST` da --- -## DJANGO_ADMIN_ENABLED - -Default: False - -Setting this to True installs the `django.contrib.admin` app and enables the [Django admin UI](https://docs.djangoproject.com/en/5.0/ref/contrib/admin/). This may be necessary to support older plugins which do not integrate with the native NetBox interface. - ---- - ## ENFORCE_GLOBAL_UNIQUE !!! tip "Dynamic Configuration Parameter" diff --git a/netbox/netbox/admin.py b/netbox/netbox/admin.py deleted file mode 100644 index cdfacc141..000000000 --- a/netbox/netbox/admin.py +++ /dev/null @@ -1,14 +0,0 @@ -from django.conf import settings -from django.contrib.admin import site as admin_site -from taggit.models import Tag - - -# Override default AdminSite attributes so we can avoid creating and -# registering our own class -admin_site.site_header = 'NetBox Administration' -admin_site.site_title = 'NetBox' -admin_site.site_url = '/{}'.format(settings.BASE_PATH) -admin_site.index_template = 'admin/index.html' - -# Unregister the unused stock Tag model provided by django-taggit -admin_site.unregister(Tag) diff --git a/netbox/netbox/configuration_testing.py b/netbox/netbox/configuration_testing.py index 346cd89d2..cec05cabb 100644 --- a/netbox/netbox/configuration_testing.py +++ b/netbox/netbox/configuration_testing.py @@ -39,8 +39,6 @@ REDIS = { SECRET_KEY = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' -DJANGO_ADMIN_ENABLED = True - DEFAULT_PERMISSIONS = {} LOGGING = { diff --git a/netbox/netbox/plugins/urls.py b/netbox/netbox/plugins/urls.py index 075bda811..7a9f30c7e 100644 --- a/netbox/netbox/plugins/urls.py +++ b/netbox/netbox/plugins/urls.py @@ -3,13 +3,11 @@ from importlib import import_module from django.apps import apps from django.conf import settings from django.conf.urls import include -from django.contrib.admin.views.decorators import staff_member_required from django.urls import path from django.utils.module_loading import import_string, module_has_submodule from . import views -# Initialize URL base, API, and admin URL patterns for plugins plugin_patterns = [] plugin_api_patterns = [ path('', views.PluginsAPIRootView.as_view(), name='api-root'), diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 358f41ff8..206a58cff 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -110,7 +110,6 @@ DEFAULT_PERMISSIONS = getattr(configuration, 'DEFAULT_PERMISSIONS', { 'users.delete_token': ({'user': '$user'},), }) DEVELOPER = getattr(configuration, 'DEVELOPER', False) -DJANGO_ADMIN_ENABLED = getattr(configuration, 'DJANGO_ADMIN_ENABLED', False) DOCS_ROOT = getattr(configuration, 'DOCS_ROOT', os.path.join(os.path.dirname(BASE_DIR), 'docs')) EMAIL = getattr(configuration, 'EMAIL', {}) EVENTS_PIPELINE = getattr(configuration, 'EVENTS_PIPELINE', ( @@ -373,7 +372,6 @@ SERVER_EMAIL = EMAIL.get('FROM_EMAIL') # INSTALLED_APPS = [ - 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', @@ -411,8 +409,6 @@ INSTALLED_APPS = [ ] if not DEBUG: INSTALLED_APPS.remove('debug_toolbar') -if not DJANGO_ADMIN_ENABLED: - INSTALLED_APPS.remove('django.contrib.admin') # Middleware MIDDLEWARE = [ @@ -549,7 +545,6 @@ EXEMPT_EXCLUDE_MODELS = ( # All URLs starting with a string listed here are exempt from maintenance mode enforcement MAINTENANCE_EXEMPT_PATHS = ( - f'/{BASE_PATH}admin/', f'/{BASE_PATH}extras/config-revisions/', # Allow modifying the configuration LOGIN_URL, LOGIN_REDIRECT_URL, diff --git a/netbox/netbox/tests/dummy_plugin/admin.py b/netbox/netbox/tests/dummy_plugin/admin.py deleted file mode 100644 index 83bc22ad8..000000000 --- a/netbox/netbox/tests/dummy_plugin/admin.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.contrib import admin - -from netbox.admin import admin_site -from .models import DummyModel - - -@admin.register(DummyModel, site=admin_site) -class DummyModelAdmin(admin.ModelAdmin): - list_display = ('name', 'number') diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index 351fef9e2..ba44378c5 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -36,12 +36,6 @@ class PluginTest(TestCase): instance.delete() self.assertIsNone(instance.pk) - def test_admin(self): - - # Test admin view URL resolution - url = reverse('admin:dummy_plugin_dummymodel_add') - self.assertEqual(url, '/admin/dummy_plugin/dummymodel/add/') - @override_settings(LOGIN_REQUIRED=False) def test_views(self): diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index b0175ec04..08c9a46a8 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -77,11 +77,6 @@ _patterns = [ path('api/plugins/', include((plugin_api_patterns, 'plugins-api'))), ] -# Django admin UI -if settings.DJANGO_ADMIN_ENABLED: - from .admin import admin_site - _patterns.append(path('admin/', admin_site.urls)) - # django-debug-toolbar if settings.DEBUG: import debug_toolbar diff --git a/netbox/templates/inc/user_menu.html b/netbox/templates/inc/user_menu.html index 1b6757416..e27be3323 100644 --- a/netbox/templates/inc/user_menu.html +++ b/netbox/templates/inc/user_menu.html @@ -36,11 +36,6 @@ + {% if object.vlan_translation_policy %} +
+
+ {% include 'inc/panel_table.html' with table=vlan_translation_table heading="VLAN Translation" %} +
+
+ {% endif %} {% if object.is_bridge %}
diff --git a/netbox/templates/ipam/vlantranslationpolicy.html b/netbox/templates/ipam/vlantranslationpolicy.html new file mode 100644 index 000000000..5217db913 --- /dev/null +++ b/netbox/templates/ipam/vlantranslationpolicy.html @@ -0,0 +1,55 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block content %} +
+
+
+

{% trans "VLAN Translation Policy" %}

+ + + + + + + + + +
{% trans "Name" %}{{ object.name|placeholder }}
{% trans "Description" %}{{ object.description|placeholder }}
+
+ {% plugin_left_page object %} +
+
+ {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_right_page object %} +
+
+
+
+
+

+ {% trans "VLAN Translation Rules" %} + {% if perms.ipam.add_vlantranslationrule %} + + {% endif %} +

+ {% htmx_table 'ipam:vlantranslationrule_list' policy_id=object.pk %} +
+
+
+
+
+ {% plugin_full_width_page object %} +
+
+{% endblock %} diff --git a/netbox/templates/ipam/vlantranslationrule.html b/netbox/templates/ipam/vlantranslationrule.html new file mode 100644 index 000000000..7f3aad2ad --- /dev/null +++ b/netbox/templates/ipam/vlantranslationrule.html @@ -0,0 +1,45 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block content %} +
+
+
+

{% trans "VLAN Translation Rule" %}

+ + + + + + + + + + + + + + + + + +
{% trans "Policy" %}{{ object.policy|linkify }}
{% trans "Local VID" %}{{ object.local_vid }}
{% trans "Remote VID" %}{{ object.remote_vid }}
{% trans "Description" %}{{ object.description }}
+
+ {% plugin_left_page object %} +
+
+ {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_right_page object %} +
+
+
+
+ {% plugin_full_width_page object %} +
+
+{% endblock %} diff --git a/netbox/templates/virtualization/vminterface.html b/netbox/templates/virtualization/vminterface.html index 0d679680d..13cc8aa2f 100644 --- a/netbox/templates/virtualization/vminterface.html +++ b/netbox/templates/virtualization/vminterface.html @@ -67,6 +67,10 @@ {% trans "Tunnel" %} {{ object.tunnel_termination.tunnel|linkify|placeholder }} + + {% trans "VLAN Translation" %} + {{ object.vlan_translation_policy|linkify|placeholder }} +
{% include 'inc/panels/tags.html' %} @@ -100,6 +104,13 @@ {% include 'inc/panel_table.html' with table=vlan_table heading="VLANs" %}
+{% if object.vlan_translation_policy %} +
+
+ {% include 'inc/panel_table.html' with table=vlan_translation_table heading="VLAN Translation" %} +
+
+{% endif %}
{% include 'inc/panel_table.html' with table=child_interfaces_table heading="Child Interfaces" %} diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 1b224c16a..2c00cac96 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -8,7 +8,7 @@ from dcim.api.serializers_.sites import SiteSerializer from dcim.choices import InterfaceModeChoices from extras.api.serializers_.configtemplates import ConfigTemplateSerializer from ipam.api.serializers_.ip import IPAddressSerializer -from ipam.api.serializers_.vlans import VLANSerializer +from ipam.api.serializers_.vlans import VLANSerializer, VLANTranslationPolicySerializer from ipam.api.serializers_.vrfs import VRFSerializer from ipam.models import VLAN from netbox.api.fields import ChoiceField, SerializedPKRelatedField @@ -89,6 +89,7 @@ class VMInterfaceSerializer(NetBoxModelSerializer): required=False, many=True ) + vlan_translation_policy = VLANTranslationPolicySerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) count_ipaddresses = serializers.IntegerField(read_only=True) @@ -105,6 +106,7 @@ class VMInterfaceSerializer(NetBoxModelSerializer): 'id', 'url', 'display_url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', + 'vlan_translation_policy', ] brief_fields = ('id', 'url', 'display', 'virtual_machine', 'name', 'description') diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 9ffc914ab..5971fc894 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -6,7 +6,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.forms.common import InterfaceCommonForm from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate -from ipam.models import IPAddress, VLAN, VLANGroup, VRF +from ipam.models import IPAddress, VLAN, VLANGroup, VLANTranslationPolicy, VRF from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import ConfirmationForm @@ -343,20 +343,25 @@ class VMInterfaceForm(InterfaceCommonForm, VMComponentForm): required=False, label=_('VRF') ) + vlan_translation_policy = DynamicModelChoiceField( + queryset=VLANTranslationPolicy.objects.all(), + required=False, + label=_('VLAN Translation Policy') + ) fieldsets = ( FieldSet('virtual_machine', 'name', 'description', 'tags', name=_('Interface')), FieldSet('vrf', 'mac_address', name=_('Addressing')), FieldSet('mtu', 'enabled', name=_('Operation')), FieldSet('parent', 'bridge', name=_('Related Interfaces')), - FieldSet('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', name=_('802.1Q Switching')), + FieldSet('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vlan_translation_policy', name=_('802.1Q Switching')), ) class Meta: model = VMInterface fields = [ 'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode', - 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', + 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', 'vlan_translation_policy', ] labels = { 'mode': '802.1Q Mode', diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 2d872322b..bed65a3b3 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -100,6 +100,7 @@ class VMInterfaceType(IPAddressesMixin, ComponentType): bridge: Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')] | None untagged_vlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None + vlan_translation_policy: Annotated["VLANTranslationPolicyType", strawberry.lazy('ipam.graphql.types')] | None tagged_vlans: List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]] bridge_interfaces: List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]] diff --git a/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py b/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py new file mode 100644 index 000000000..e0992c9c8 --- /dev/null +++ b/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py @@ -0,0 +1,20 @@ +# Generated by Django 5.0.9 on 2024-10-11 19:45 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0074_vlantranslationpolicy_vlantranslationrule'), + ('virtualization', '0041_charfield_null_choices'), + ] + + operations = [ + migrations.AddField( + model_name='vminterface', + name='vlan_translation_policy', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ipam.vlantranslationpolicy'), + ), + ] diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index d2e6cc05f..cd598274f 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -1,7 +1,7 @@ from django.test import TestCase from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup -from ipam.models import IPAddress, VRF +from ipam.models import IPAddress, VLANTranslationPolicy, VRF from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.choices import * @@ -561,6 +561,13 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) VirtualMachine.objects.bulk_create(vms) + vlan_translation_policies = ( + VLANTranslationPolicy(name='Policy 1'), + VLANTranslationPolicy(name='Policy 2'), + VLANTranslationPolicy(name='Policy 3'), + ) + VLANTranslationPolicy.objects.bulk_create(vlan_translation_policies) + interfaces = ( VMInterface( virtual_machine=vms[0], @@ -569,7 +576,8 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): mtu=100, mac_address='00-00-00-00-00-01', vrf=vrfs[0], - description='foobar1' + description='foobar1', + vlan_translation_policy=vlan_translation_policies[0], ), VMInterface( virtual_machine=vms[1], @@ -578,7 +586,8 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): mtu=200, mac_address='00-00-00-00-00-02', vrf=vrfs[1], - description='foobar2' + description='foobar2', + vlan_translation_policy=vlan_translation_policies[0], ), VMInterface( virtual_machine=vms[2], @@ -658,6 +667,13 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_vlan_translation_policy(self): + vlan_translation_policies = VLANTranslationPolicy.objects.all()[:2] + params = {'vlan_translation_policy_id': [vlan_translation_policies[0].pk, vlan_translation_policies[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'vlan_translation_policy': [vlan_translation_policies[0].name, vlan_translation_policies[1].name]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class VirtualDiskTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VirtualDisk.objects.all() diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index d1d65b1ff..35f2f8f75 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -16,7 +16,7 @@ from dcim.models import Device from dcim.tables import DeviceTable from extras.views import ObjectConfigContextView from ipam.models import IPAddress -from ipam.tables import InterfaceVLANTable +from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic from tenancy.views import ObjectContactsView @@ -516,6 +516,14 @@ class VMInterfaceView(generic.ObjectView): orderable=False ) + # Get VLAN translation rules + vlan_translation_table = None + if instance.vlan_translation_policy: + vlan_translation_table = VLANTranslationRuleTable( + data=instance.vlan_translation_policy.rules.all(), + orderable=False + ) + # Get assigned VLANs and annotate whether each is tagged or untagged vlans = [] if instance.untagged_vlan is not None: @@ -533,6 +541,7 @@ class VMInterfaceView(generic.ObjectView): return { 'child_interfaces_table': child_interfaces_tables, 'vlan_table': vlan_table, + 'vlan_translation_table': vlan_translation_table, } From a8eb455f3e83cc79f38a51ae32266911aa4e2f16 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 31 Oct 2024 06:55:08 -0700 Subject: [PATCH 020/169] 9604 Add Termination to CircuitTermination (#17821) * 9604 add scope type to CircuitTermination * 9604 add scope type to CircuitTermination * 9604 add scope type to CircuitTermination * 9604 model_forms * 9604 form filtersets * 9604 form bulk_import * 9604 form bulk_edit * 9604 serializers * 9604 graphql * 9604 tests and detail template * 9604 fix migration merge * 9604 fix tests * 9604 fix tests * 9604 fix table * 9604 updates * fix tests * fix tests * fix tests * fix tests * fix tests * fix tests * fix tests * 9604 remove provider_network * 9604 fix tests * 9604 fix tests * 9604 fix forms * 9604 review changes * 9604 scope->termination * 9604 fix _circuit_terminations * 9604 fix _circuit_terminations * 9604 sitegroup -> site_group * 9604 update docs * 9604 fix form termination side reference * Misc cleanup * Fix terminations in circuits table * Fix missing imports * Clean up termination attrs display * Add termination & type to CircuitTerminationTable * Update cable tracing logic --------- Co-authored-by: Jeremy Stretch --- docs/models/circuits/circuittermination.md | 8 +- netbox/circuits/api/serializers_/circuits.py | 51 ++++++++-- netbox/circuits/constants.py | 4 + netbox/circuits/filtersets.py | 76 +++++++++++---- netbox/circuits/forms/bulk_edit.py | 54 +++++++---- netbox/circuits/forms/bulk_import.py | 30 +++--- netbox/circuits/forms/filtersets.py | 25 +++-- netbox/circuits/forms/model_forms.py | 63 ++++++++++--- netbox/circuits/graphql/types.py | 16 +++- .../0047_circuittermination__termination.py | 56 +++++++++++ ...48_circuitterminations_cached_relations.py | 90 ++++++++++++++++++ netbox/circuits/models/circuits.py | 94 ++++++++++++++++--- netbox/circuits/tables/circuits.py | 52 +++++++--- netbox/circuits/tests/test_api.py | 14 +-- netbox/circuits/tests/test_filtersets.py | 48 +++++----- netbox/circuits/tests/test_views.py | 46 +++++---- netbox/circuits/views.py | 11 +-- netbox/dcim/graphql/types.py | 17 +++- netbox/dcim/models/cables.py | 12 +-- netbox/dcim/tests/test_cablepaths.py | 30 +++--- netbox/dcim/tests/test_filtersets.py | 6 +- netbox/dcim/tests/test_models.py | 6 +- netbox/dcim/views.py | 26 ++++- .../inc/circuit_termination_fields.html | 25 ++--- 24 files changed, 649 insertions(+), 211 deletions(-) create mode 100644 netbox/circuits/constants.py create mode 100644 netbox/circuits/migrations/0047_circuittermination__termination.py create mode 100644 netbox/circuits/migrations/0048_circuitterminations_cached_relations.py diff --git a/docs/models/circuits/circuittermination.md b/docs/models/circuits/circuittermination.md index c6aa966d0..791863483 100644 --- a/docs/models/circuits/circuittermination.md +++ b/docs/models/circuits/circuittermination.md @@ -21,13 +21,9 @@ Designates the termination as forming either the A or Z end of the circuit. If selected, the circuit termination will be considered "connected" even if no cable has been connected to it in NetBox. -### Site +### Termination -The [site](../dcim/site.md) with which this circuit termination is associated. Once created, a cable can be connected between the circuit termination and a device interface (or similar component). - -### Provider Network - -Circuits which do not connect to a site modeled by NetBox can instead be terminated to a [provider network](./providernetwork.md) representing an unknown network operated by a [provider](./provider.md). +The [region](../dcim/region.md), [site group](../dcim/sitegroup.md), [site](../dcim/site.md), [location](../dcim/location.md) or [provider network](./providernetwork.md) with which this circuit termination is associated. Once created, a cable can be connected between the circuit termination and a device interface (or similar component). ### Port Speed diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 111fa6f87..96a686a65 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -1,11 +1,16 @@ +from django.contrib.contenttypes.models import ContentType +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers + from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices +from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES from circuits.models import Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType from dcim.api.serializers_.cables import CabledObjectSerializer -from dcim.api.serializers_.sites import SiteSerializer -from netbox.api.fields import ChoiceField, RelatedObjectCountField +from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer from netbox.choices import DistanceUnitChoices from tenancy.api.serializers_.tenants import TenantSerializer +from utilities.api import get_serializer_for_model from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer @@ -33,16 +38,33 @@ class CircuitTypeSerializer(NetBoxModelSerializer): class CircuitCircuitTerminationSerializer(WritableNestedSerializer): - site = SiteSerializer(nested=True, allow_null=True) + termination_type = ContentTypeField( + queryset=ContentType.objects.filter( + model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES + ), + allow_null=True, + required=False, + default=None + ) + termination_id = serializers.IntegerField(allow_null=True, required=False, default=None) + termination = serializers.SerializerMethodField(read_only=True) provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display_url', 'display', 'site', 'provider_network', 'port_speed', 'upstream_speed', + 'id', 'url', 'display_url', 'display', 'termination_type', 'termination_id', 'termination', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'description', ] + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_termination(self, obj): + if obj.termination_id is None: + return None + serializer = get_serializer_for_model(obj.termination) + context = {'request': self.context['request']} + return serializer(obj.termination, nested=True, context=context).data + class CircuitGroupSerializer(NetBoxModelSerializer): tenant = TenantSerializer(nested=True, required=False, allow_null=True) @@ -95,18 +117,35 @@ class CircuitSerializer(NetBoxModelSerializer): class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): circuit = CircuitSerializer(nested=True) - site = SiteSerializer(nested=True, required=False, allow_null=True) + termination_type = ContentTypeField( + queryset=ContentType.objects.filter( + model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES + ), + allow_null=True, + required=False, + default=None + ) + termination_id = serializers.IntegerField(allow_null=True, required=False, default=None) + termination = serializers.SerializerMethodField(read_only=True) provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', + 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'termination_type', 'termination_id', 'termination', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied') + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_termination(self, obj): + if obj.termination_id is None: + return None + serializer = get_serializer_for_model(obj.termination) + context = {'request': self.context['request']} + return serializer(obj.termination, nested=True, context=context).data + class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): circuit = CircuitSerializer(nested=True) diff --git a/netbox/circuits/constants.py b/netbox/circuits/constants.py new file mode 100644 index 000000000..8119bc286 --- /dev/null +++ b/netbox/circuits/constants.py @@ -0,0 +1,4 @@ +# models values for ContentTypes which may be CircuitTermination termination types +CIRCUIT_TERMINATION_TERMINATION_TYPES = ( + 'region', 'sitegroup', 'site', 'location', 'providernetwork', +) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index ebd1fe28d..4a2a972f3 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -3,11 +3,11 @@ from django.db.models import Q from django.utils.translation import gettext as _ from dcim.filtersets import CabledObjectFilterSet -from dcim.models import Region, Site, SiteGroup +from dcim.models import Location, Region, Site, SiteGroup from ipam.models import ASN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet -from utilities.filters import TreeNodeMultipleChoiceFilter +from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter from .choices import * from .models import * @@ -26,37 +26,37 @@ __all__ = ( class ProviderFilterSet(NetBoxModelFilterSet, ContactModelFilterSet): region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), - field_name='circuits__terminations__site__region', + field_name='circuits__terminations___region', lookup_expr='in', label=_('Region (ID)'), ) region = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), - field_name='circuits__terminations__site__region', + field_name='circuits__terminations___region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), ) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), - field_name='circuits__terminations__site__group', + field_name='circuits__terminations___site_group', lookup_expr='in', label=_('Site group (ID)'), ) site_group = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), - field_name='circuits__terminations__site__group', + field_name='circuits__terminations___site_group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), ) site_id = django_filters.ModelMultipleChoiceFilter( - field_name='circuits__terminations__site', + field_name='circuits__terminations___site', queryset=Site.objects.all(), label=_('Site'), ) site = django_filters.ModelMultipleChoiceFilter( - field_name='circuits__terminations__site__slug', + field_name='circuits__terminations___site__slug', queryset=Site.objects.all(), to_field_name='slug', label=_('Site (slug)'), @@ -173,7 +173,7 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte label=_('Provider account (account)'), ) provider_network_id = django_filters.ModelMultipleChoiceFilter( - field_name='terminations__provider_network', + field_name='terminations___provider_network', queryset=ProviderNetwork.objects.all(), label=_('Provider network (ID)'), ) @@ -193,37 +193,37 @@ class CircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte ) region_id = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), - field_name='terminations__site__region', + field_name='terminations___region', lookup_expr='in', label=_('Region (ID)'), ) region = TreeNodeMultipleChoiceFilter( queryset=Region.objects.all(), - field_name='terminations__site__region', + field_name='terminations___region', lookup_expr='in', to_field_name='slug', label=_('Region (slug)'), ) site_group_id = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), - field_name='terminations__site__group', + field_name='terminations___site_group', lookup_expr='in', label=_('Site group (ID)'), ) site_group = TreeNodeMultipleChoiceFilter( queryset=SiteGroup.objects.all(), - field_name='terminations__site__group', + field_name='terminations___site_group', lookup_expr='in', to_field_name='slug', label=_('Site group (slug)'), ) site_id = django_filters.ModelMultipleChoiceFilter( - field_name='terminations__site', + field_name='terminations___site', queryset=Site.objects.all(), label=_('Site (ID)'), ) site = django_filters.ModelMultipleChoiceFilter( - field_name='terminations__site__slug', + field_name='terminations___site__slug', queryset=Site.objects.all(), to_field_name='slug', label=_('Site (slug)'), @@ -263,18 +263,60 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet): queryset=Circuit.objects.all(), label=_('Circuit'), ) + termination_type = ContentTypeFilter() + region_id = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + label=_('Region (ID)'), + ) + region = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + to_field_name='slug', + label=_('Region (slug)'), + ) + site_group_id = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + label=_('Site group (ID)'), + ) + site_group = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + to_field_name='slug', + label=_('Site group (slug)'), + ) site_id = django_filters.ModelMultipleChoiceFilter( queryset=Site.objects.all(), + field_name='_site', label=_('Site (ID)'), ) site = django_filters.ModelMultipleChoiceFilter( - field_name='site__slug', + field_name='_site__slug', queryset=Site.objects.all(), to_field_name='slug', label=_('Site (slug)'), ) + location_id = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + label=_('Location (ID)'), + ) + location = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + to_field_name='slug', + label=_('Location (slug)'), + ) provider_network_id = django_filters.ModelMultipleChoiceFilter( queryset=ProviderNetwork.objects.all(), + field_name='_provider_network', label=_('ProviderNetwork (ID)'), ) provider_id = django_filters.ModelMultipleChoiceFilter( @@ -292,7 +334,7 @@ class CircuitTerminationFilterSet(NetBoxModelFilterSet, CabledObjectFilterSet): class Meta: model = CircuitTermination fields = ( - 'id', 'term_side', 'port_speed', 'upstream_speed', 'xconnect_id', 'description', 'mark_connected', + 'id', 'termination_id', 'term_side', 'port_speed', 'upstream_speed', 'xconnect_id', 'description', 'mark_connected', 'pp_info', 'cable_end', ) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 5cb7b5d30..e3f0b5d0c 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -1,17 +1,23 @@ from django import forms +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext_lazy as _ from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices +from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES from circuits.models import * from dcim.models import Site from ipam.models import ASN from netbox.choices import DistanceUnitChoices from netbox.forms import NetBoxModelBulkEditForm from tenancy.models import Tenant -from utilities.forms import add_blank_choice -from utilities.forms.fields import ColorField, CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField -from utilities.forms.rendering import FieldSet, TabbedGroups -from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, NumberWithOptions +from utilities.forms import add_blank_choice, get_field_value +from utilities.forms.fields import ( + ColorField, CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, +) +from utilities.forms.rendering import FieldSet +from utilities.forms.widgets import BulkEditNullBooleanSelect, DatePicker, HTMXSelect, NumberWithOptions +from utilities.templatetags.builtins.filters import bettertitle __all__ = ( 'CircuitBulkEditForm', @@ -197,15 +203,18 @@ class CircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): max_length=200, required=False ) - site = DynamicModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), - required=False + termination_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), + widget=HTMXSelect(method='post', attrs={'hx-select': '#form_fields'}), + required=False, + label=_('Termination type') ) - provider_network = DynamicModelChoiceField( - label=_('Provider Network'), - queryset=ProviderNetwork.objects.all(), - required=False + termination = DynamicModelChoiceField( + label=_('Termination'), + queryset=Site.objects.none(), # Initial queryset + required=False, + disabled=True, + selector=True ) port_speed = forms.IntegerField( required=False, @@ -225,15 +234,26 @@ class CircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): fieldsets = ( FieldSet( 'description', - TabbedGroups( - FieldSet('site', name=_('Site')), - FieldSet('provider_network', name=_('Provider Network')), - ), + 'termination_type', 'termination', 'mark_connected', name=_('Circuit Termination') ), FieldSet('port_speed', 'upstream_speed', name=_('Termination Details')), ) - nullable_fields = ('description') + nullable_fields = ('description', 'termination') + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if termination_type_id := get_field_value(self, 'termination_type'): + try: + termination_type = ContentType.objects.get(pk=termination_type_id) + model = termination_type.model_class() + self.fields['termination'].queryset = model.objects.all() + self.fields['termination'].widget.attrs['selector'] = model._meta.label_lower + self.fields['termination'].disabled = False + self.fields['termination'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index d5cdc00a7..eab87b1f5 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -1,13 +1,14 @@ from django import forms +from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from circuits.choices import * +from circuits.constants import * from circuits.models import * -from dcim.models import Site from netbox.choices import DistanceUnitChoices from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant -from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField +from utilities.forms.fields import CSVChoiceField, CSVContentTypeField, CSVModelChoiceField, SlugField __all__ = ( 'CircuitImportForm', @@ -127,17 +128,10 @@ class BaseCircuitTerminationImportForm(forms.ModelForm): label=_('Termination'), choices=CircuitTerminationSideChoices, ) - site = CSVModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), - to_field_name='name', - required=False - ) - provider_network = CSVModelChoiceField( - label=_('Provider network'), - queryset=ProviderNetwork.objects.all(), - to_field_name='name', - required=False + termination_type = CSVContentTypeField( + queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), + required=False, + label=_('Termination type (app & model)') ) @@ -145,9 +139,12 @@ class CircuitTerminationImportRelatedForm(BaseCircuitTerminationImportForm): class Meta: model = CircuitTermination fields = [ - 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', + 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description' ] + labels = { + 'termination_id': _('Termination ID'), + } class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTerminationImportForm): @@ -155,9 +152,12 @@ class CircuitTerminationImportForm(NetBoxModelImportForm, BaseCircuitTermination class Meta: model = CircuitTermination fields = [ - 'circuit', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', + 'circuit', 'term_side', 'termination_type', 'termination_id', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'tags' ] + labels = { + 'termination_id': _('Termination ID'), + } class CircuitGroupImportForm(NetBoxModelImportForm): diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 2e9b358e8..b585ce079 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext as _ from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, CircuitTerminationSideChoices from circuits.models import * -from dcim.models import Region, Site, SiteGroup +from dcim.models import Location, Region, Site, SiteGroup from ipam.models import ASN from netbox.choices import DistanceUnitChoices from netbox.forms import NetBoxModelFilterSetForm @@ -207,18 +207,29 @@ class CircuitTerminationFilterForm(NetBoxModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('circuit_id', 'term_side', name=_('Circuit')), - FieldSet('provider_id', 'provider_network_id', name=_('Provider')), - FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), + FieldSet('provider_id', name=_('Provider')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Termination')), + ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region') + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group') ) site_id = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), required=False, - query_params={ - 'region_id': '$region_id', - 'site_group_id': '$site_group_id', - }, label=_('Site') ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + label=_('Location') + ) circuit_id = DynamicModelMultipleChoiceField( queryset=Circuit.objects.all(), required=False, diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index e00034a10..10cd06563 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -1,14 +1,19 @@ +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext_lazy as _ from circuits.choices import CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices +from circuits.constants import * from circuits.models import * from dcim.models import Site from ipam.models import ASN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm -from utilities.forms.fields import CommentField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField -from utilities.forms.rendering import FieldSet, InlineFields, TabbedGroups -from utilities.forms.widgets import DatePicker, NumberWithOptions +from utilities.forms import get_field_value +from utilities.forms.fields import CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField +from utilities.forms.rendering import FieldSet, InlineFields +from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions +from utilities.templatetags.builtins.filters import bettertitle __all__ = ( 'CircuitForm', @@ -144,26 +149,24 @@ class CircuitTerminationForm(NetBoxModelForm): queryset=Circuit.objects.all(), selector=True ) - site = DynamicModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), + termination_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), + widget=HTMXSelect(), required=False, - selector=True + label=_('Termination type') ) - provider_network = DynamicModelChoiceField( - label=_('Provider network'), - queryset=ProviderNetwork.objects.all(), + termination = DynamicModelChoiceField( + label=_('Termination'), + queryset=Site.objects.none(), # Initial queryset required=False, + disabled=True, selector=True ) fieldsets = ( FieldSet( 'circuit', 'term_side', 'description', 'tags', - TabbedGroups( - FieldSet('site', name=_('Site')), - FieldSet('provider_network', name=_('Provider Network')), - ), + 'termination_type', 'termination', 'mark_connected', name=_('Circuit Termination') ), FieldSet('port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', name=_('Termination Details')), @@ -172,7 +175,7 @@ class CircuitTerminationForm(NetBoxModelForm): class Meta: model = CircuitTermination fields = [ - 'circuit', 'term_side', 'site', 'provider_network', 'mark_connected', 'port_speed', 'upstream_speed', + 'circuit', 'term_side', 'termination_type', 'mark_connected', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'tags', ] widgets = { @@ -184,6 +187,36 @@ class CircuitTerminationForm(NetBoxModelForm): ), } + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}) + + if instance is not None and instance.termination: + initial['termination'] = instance.termination + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + if termination_type_id := get_field_value(self, 'termination_type'): + try: + termination_type = ContentType.objects.get(pk=termination_type_id) + model = termination_type.model_class() + self.fields['termination'].queryset = model.objects.all() + self.fields['termination'].widget.attrs['selector'] = model._meta.label_lower + self.fields['termination'].disabled = False + self.fields['termination'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass + + if self.instance and termination_type_id != self.instance.termination_type_id: + self.initial['termination'] = None + + def clean(self): + super().clean() + + # Assign the selected termination (if any) + self.instance.termination = self.cleaned_data.get('termination') + class CircuitGroupForm(TenancyForm, NetBoxModelForm): slug = SlugField() diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index 45f0d065d..b52f9d18d 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -1,4 +1,4 @@ -from typing import Annotated, List +from typing import Annotated, List, Union import strawberry import strawberry_django @@ -59,13 +59,21 @@ class ProviderNetworkType(NetBoxObjectType): @strawberry_django.type( models.CircuitTermination, - fields='__all__', + exclude=('termination_type', 'termination_id', '_location', '_region', '_site', '_site_group', '_provider_network'), filters=CircuitTerminationFilter ) class CircuitTerminationType(CustomFieldsMixin, TagsMixin, CabledObjectMixin, ObjectType): circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] - provider_network: Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')] | None - site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] | None + + @strawberry_django.field + def termination(self) -> Annotated[Union[ + Annotated["LocationType", strawberry.lazy('dcim.graphql.types')], + Annotated["RegionType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteType", strawberry.lazy('dcim.graphql.types')], + Annotated["ProviderNetworkType", strawberry.lazy('circuits.graphql.types')], + ], strawberry.union("CircuitTerminationTerminationType")] | None: + return self.termination @strawberry_django.type( diff --git a/netbox/circuits/migrations/0047_circuittermination__termination.py b/netbox/circuits/migrations/0047_circuittermination__termination.py new file mode 100644 index 000000000..cb2c9ca07 --- /dev/null +++ b/netbox/circuits/migrations/0047_circuittermination__termination.py @@ -0,0 +1,56 @@ +import django.db.models.deletion +from django.db import migrations, models + + +def copy_site_assignments(apps, schema_editor): + """ + Copy site ForeignKey values to the Termination GFK. + """ + ContentType = apps.get_model('contenttypes', 'ContentType') + CircuitTermination = apps.get_model('circuits', 'CircuitTermination') + Site = apps.get_model('dcim', 'Site') + + CircuitTermination.objects.filter(site__isnull=False).update( + termination_type=ContentType.objects.get_for_model(Site), + termination_id=models.F('site_id') + ) + + ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork') + CircuitTermination.objects.filter(provider_network__isnull=False).update( + termination_type=ContentType.objects.get_for_model(ProviderNetwork), + termination_id=models.F('provider_network_id') + ) + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0046_charfield_null_choices'), + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0193_poweroutlet_color'), + ] + + operations = [ + migrations.AddField( + model_name='circuittermination', + name='termination_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='circuittermination', + name='termination_type', + field=models.ForeignKey( + blank=True, + limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location', 'providernetwork'))), + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='+', + to='contenttypes.contenttype', + ), + ), + + # Copy over existing site assignments + migrations.RunPython( + code=copy_site_assignments, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py new file mode 100644 index 000000000..628579228 --- /dev/null +++ b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py @@ -0,0 +1,90 @@ +# Generated by Django 5.0.9 on 2024-10-21 17:34 +import django.db.models.deletion +from django.db import migrations, models + + +def populate_denormalized_fields(apps, schema_editor): + """ + Copy site ForeignKey values to the Termination GFK. + """ + CircuitTermination = apps.get_model('circuits', 'CircuitTermination') + + terminations = CircuitTermination.objects.filter(site__isnull=False).prefetch_related('site') + for termination in terminations: + termination._region_id = termination.site.region_id + termination._site_group_id = termination.site.group_id + termination._site_id = termination.site_id + # Note: Location cannot be set prior to migration + + CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0047_circuittermination__termination'), + ] + + operations = [ + migrations.AddField( + model_name='circuittermination', + name='_location', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='circuit_terminations', + to='dcim.location', + ), + ), + migrations.AddField( + model_name='circuittermination', + name='_region', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='circuit_terminations', + to='dcim.region', + ), + ), + migrations.AddField( + model_name='circuittermination', + name='_site', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='circuit_terminations', + to='dcim.site', + ), + ), + migrations.AddField( + model_name='circuittermination', + name='_site_group', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='circuit_terminations', + to='dcim.sitegroup', + ), + ), + + # Populate denormalized FK values + migrations.RunPython( + code=populate_denormalized_fields, + reverse_code=migrations.RunPython.noop + ), + + # Delete the site ForeignKey + migrations.RemoveField( + model_name='circuittermination', + name='site', + ), + migrations.RenameField( + model_name='circuittermination', + old_name='provider_network', + new_name='_provider_network', + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 5f749550c..85b22eaa5 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -1,9 +1,13 @@ +from django.apps import apps +from django.contrib.contenttypes.fields import GenericForeignKey from django.core.exceptions import ValidationError from django.db import models +from django.db.models import Q from django.urls import reverse from django.utils.translation import gettext_lazy as _ from circuits.choices import * +from circuits.constants import * from dcim.models import CabledObjectModel from netbox.models import ChangeLoggedModel, OrganizationalModel, PrimaryModel from netbox.models.mixins import DistanceMixin @@ -230,22 +234,24 @@ class CircuitTermination( term_side = models.CharField( max_length=1, choices=CircuitTerminationSideChoices, - verbose_name=_('termination') + verbose_name=_('termination side') ) - site = models.ForeignKey( - to='dcim.Site', + termination_type = models.ForeignKey( + to='contenttypes.ContentType', on_delete=models.PROTECT, - related_name='circuit_terminations', + limit_choices_to=Q(model__in=CIRCUIT_TERMINATION_TERMINATION_TYPES), + related_name='+', blank=True, null=True ) - provider_network = models.ForeignKey( - to='circuits.ProviderNetwork', - on_delete=models.PROTECT, - related_name='circuit_terminations', + termination_id = models.PositiveBigIntegerField( blank=True, null=True ) + termination = GenericForeignKey( + ct_field='termination_type', + fk_field='termination_id' + ) port_speed = models.PositiveIntegerField( verbose_name=_('port speed (Kbps)'), blank=True, @@ -276,6 +282,43 @@ class CircuitTermination( blank=True ) + # Cached associations to enable efficient filtering + _provider_network = models.ForeignKey( + to='circuits.ProviderNetwork', + on_delete=models.PROTECT, + related_name='circuit_terminations', + blank=True, + null=True + ) + _location = models.ForeignKey( + to='dcim.Location', + on_delete=models.CASCADE, + related_name='circuit_terminations', + blank=True, + null=True + ) + _site = models.ForeignKey( + to='dcim.Site', + on_delete=models.CASCADE, + related_name='circuit_terminations', + blank=True, + null=True + ) + _region = models.ForeignKey( + to='dcim.Region', + on_delete=models.CASCADE, + related_name='circuit_terminations', + blank=True, + null=True + ) + _site_group = models.ForeignKey( + to='dcim.SiteGroup', + on_delete=models.CASCADE, + related_name='circuit_terminations', + blank=True, + null=True + ) + class Meta: ordering = ['circuit', 'term_side'] constraints = ( @@ -297,10 +340,35 @@ class CircuitTermination( super().clean() # Must define either site *or* provider network - if self.site is None and self.provider_network is None: - raise ValidationError(_("A circuit termination must attach to either a site or a provider network.")) - if self.site and self.provider_network: - raise ValidationError(_("A circuit termination cannot attach to both a site and a provider network.")) + if self.termination is None: + raise ValidationError(_("A circuit termination must attach to termination.")) + + def save(self, *args, **kwargs): + # Cache objects associated with the terminating object (for filtering) + self.cache_related_objects() + + super().save(*args, **kwargs) + + def cache_related_objects(self): + self._provider_network = self._region = self._site_group = self._site = self._location = None + if self.termination_type: + termination_type = self.termination_type.model_class() + if termination_type == apps.get_model('dcim', 'region'): + self._region = self.termination + elif termination_type == apps.get_model('dcim', 'sitegroup'): + self._site_group = self.termination + elif termination_type == apps.get_model('dcim', 'site'): + self._region = self.termination.region + self._site_group = self.termination.group + self._site = self.termination + elif termination_type == apps.get_model('dcim', 'location'): + self._region = self.termination.site.region + self._site_group = self.termination.site.group + self._site = self.termination.site + self._location = self.termination + elif termination_type == apps.get_model('circuits', 'providernetwork'): + self._provider_network = self.termination + cache_related_objects.alters_data = True def to_objectchange(self, action): objectchange = super().to_objectchange(action) @@ -314,7 +382,7 @@ class CircuitTermination( def get_peer_termination(self): peer_side = 'Z' if self.term_side == 'A' else 'A' try: - return CircuitTermination.objects.prefetch_related('site').get( + return CircuitTermination.objects.prefetch_related('termination').get( circuit=self.circuit, term_side=peer_side ) diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index e79212a14..ab9c661e6 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -18,10 +18,8 @@ __all__ = ( CIRCUITTERMINATION_LINK = """ -{% if value.site %} - {{ value.site }} -{% elif value.provider_network %} - {{ value.provider_network }} +{% if value.termination %} + {{ value.termination }} {% endif %} """ @@ -63,12 +61,12 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): verbose_name=_('Account') ) status = columns.ChoiceFieldColumn() - termination_a = tables.TemplateColumn( + termination_a = columns.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, orderable=False, verbose_name=_('Side A') ) - termination_z = tables.TemplateColumn( + termination_z = columns.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, orderable=False, verbose_name=_('Side Z') @@ -110,22 +108,54 @@ class CircuitTerminationTable(NetBoxTable): linkify=True, accessor='circuit.provider' ) + term_side = tables.Column( + verbose_name=_('Side') + ) + termination_type = columns.ContentTypeColumn( + verbose_name=_('Termination Type'), + ) + termination = tables.Column( + verbose_name=_('Termination Point'), + linkify=True + ) + + # Termination types site = tables.Column( verbose_name=_('Site'), - linkify=True + linkify=True, + accessor='_site' + ) + site_group = tables.Column( + verbose_name=_('Site Group'), + linkify=True, + accessor='_sitegroup' + ) + region = tables.Column( + verbose_name=_('Region'), + linkify=True, + accessor='_region' + ) + location = tables.Column( + verbose_name=_('Location'), + linkify=True, + accessor='_location' ) provider_network = tables.Column( verbose_name=_('Provider Network'), - linkify=True + linkify=True, + accessor='_provider_network' ) class Meta(NetBoxTable.Meta): model = CircuitTermination fields = ( - 'pk', 'id', 'circuit', 'provider', 'term_side', 'site', 'provider_network', 'port_speed', 'upstream_speed', - 'xconnect_id', 'pp_info', 'description', 'created', 'last_updated', 'actions', + 'pk', 'id', 'circuit', 'provider', 'term_side', 'termination_type', 'termination', 'site_group', 'region', + 'site', 'location', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', + 'description', 'created', 'last_updated', 'actions', + ) + default_columns = ( + 'pk', 'id', 'circuit', 'provider', 'term_side', 'termination_type', 'termination', 'description', ) - default_columns = ('pk', 'id', 'circuit', 'provider', 'term_side', 'description') class CircuitGroupTable(NetBoxTable): diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 1edcd531b..1b2e9f3f8 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -181,10 +181,10 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): Circuit.objects.bulk_create(circuits) circuit_terminations = ( - CircuitTermination(circuit=circuits[0], term_side=SIDE_A, site=sites[0]), - CircuitTermination(circuit=circuits[0], term_side=SIDE_Z, provider_network=provider_networks[0]), - CircuitTermination(circuit=circuits[1], term_side=SIDE_A, site=sites[1]), - CircuitTermination(circuit=circuits[1], term_side=SIDE_Z, provider_network=provider_networks[1]), + CircuitTermination(circuit=circuits[0], term_side=SIDE_A, termination=sites[0]), + CircuitTermination(circuit=circuits[0], term_side=SIDE_Z, termination=provider_networks[0]), + CircuitTermination(circuit=circuits[1], term_side=SIDE_A, termination=sites[1]), + CircuitTermination(circuit=circuits[1], term_side=SIDE_Z, termination=provider_networks[1]), ) CircuitTermination.objects.bulk_create(circuit_terminations) @@ -192,13 +192,15 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): { 'circuit': circuits[2].pk, 'term_side': SIDE_A, - 'site': sites[0].pk, + 'termination_type': 'dcim.site', + 'termination_id': sites[0].pk, 'port_speed': 200000, }, { 'circuit': circuits[2].pk, 'term_side': SIDE_Z, - 'provider_network': provider_networks[0].pk, + 'termination_type': 'circuits.providernetwork', + 'termination_id': provider_networks[0].pk, 'port_speed': 200000, }, ] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index 93958298c..0dbc7172b 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -70,10 +70,12 @@ class ProviderTestCase(TestCase, ChangeLoggedFilterSetTests): ) Circuit.objects.bulk_create(circuits) - CircuitTermination.objects.bulk_create(( - CircuitTermination(circuit=circuits[0], site=sites[0], term_side='A'), - CircuitTermination(circuit=circuits[1], site=sites[0], term_side='A'), - )) + circuit_terminations = ( + CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A'), + CircuitTermination(circuit=circuits[1], termination=sites[0], term_side='A'), + ) + for ct in circuit_terminations: + ct.save() def test_q(self): params = {'q': 'foobar1'} @@ -233,14 +235,15 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): Circuit.objects.bulk_create(circuits) circuit_terminations = (( - CircuitTermination(circuit=circuits[0], site=sites[0], term_side='A'), - CircuitTermination(circuit=circuits[1], site=sites[1], term_side='A'), - CircuitTermination(circuit=circuits[2], site=sites[2], term_side='A'), - CircuitTermination(circuit=circuits[3], provider_network=provider_networks[0], term_side='A'), - CircuitTermination(circuit=circuits[4], provider_network=provider_networks[1], term_side='A'), - CircuitTermination(circuit=circuits[5], provider_network=provider_networks[2], term_side='A'), + CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A'), + CircuitTermination(circuit=circuits[1], termination=sites[1], term_side='A'), + CircuitTermination(circuit=circuits[2], termination=sites[2], term_side='A'), + CircuitTermination(circuit=circuits[3], termination=provider_networks[0], term_side='A'), + CircuitTermination(circuit=circuits[4], termination=provider_networks[1], term_side='A'), + CircuitTermination(circuit=circuits[5], termination=provider_networks[2], term_side='A'), )) - CircuitTermination.objects.bulk_create(circuit_terminations) + for ct in circuit_terminations: + ct.save() def test_q(self): params = {'q': 'foobar1'} @@ -384,18 +387,19 @@ class CircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): Circuit.objects.bulk_create(circuits) circuit_terminations = (( - CircuitTermination(circuit=circuits[0], site=sites[0], term_side='A', port_speed=1000, upstream_speed=1000, xconnect_id='ABC', description='foobar1'), - CircuitTermination(circuit=circuits[0], site=sites[1], term_side='Z', port_speed=1000, upstream_speed=1000, xconnect_id='DEF', description='foobar2'), - CircuitTermination(circuit=circuits[1], site=sites[1], term_side='A', port_speed=2000, upstream_speed=2000, xconnect_id='GHI'), - CircuitTermination(circuit=circuits[1], site=sites[2], term_side='Z', port_speed=2000, upstream_speed=2000, xconnect_id='JKL'), - CircuitTermination(circuit=circuits[2], site=sites[2], term_side='A', port_speed=3000, upstream_speed=3000, xconnect_id='MNO'), - CircuitTermination(circuit=circuits[2], site=sites[0], term_side='Z', port_speed=3000, upstream_speed=3000, xconnect_id='PQR'), - CircuitTermination(circuit=circuits[3], provider_network=provider_networks[0], term_side='A'), - CircuitTermination(circuit=circuits[4], provider_network=provider_networks[1], term_side='A'), - CircuitTermination(circuit=circuits[5], provider_network=provider_networks[2], term_side='A'), - CircuitTermination(circuit=circuits[6], provider_network=provider_networks[0], term_side='A', mark_connected=True), + CircuitTermination(circuit=circuits[0], termination=sites[0], term_side='A', port_speed=1000, upstream_speed=1000, xconnect_id='ABC', description='foobar1'), + CircuitTermination(circuit=circuits[0], termination=sites[1], term_side='Z', port_speed=1000, upstream_speed=1000, xconnect_id='DEF', description='foobar2'), + CircuitTermination(circuit=circuits[1], termination=sites[1], term_side='A', port_speed=2000, upstream_speed=2000, xconnect_id='GHI'), + CircuitTermination(circuit=circuits[1], termination=sites[2], term_side='Z', port_speed=2000, upstream_speed=2000, xconnect_id='JKL'), + CircuitTermination(circuit=circuits[2], termination=sites[2], term_side='A', port_speed=3000, upstream_speed=3000, xconnect_id='MNO'), + CircuitTermination(circuit=circuits[2], termination=sites[0], term_side='Z', port_speed=3000, upstream_speed=3000, xconnect_id='PQR'), + CircuitTermination(circuit=circuits[3], termination=provider_networks[0], term_side='A'), + CircuitTermination(circuit=circuits[4], termination=provider_networks[1], term_side='A'), + CircuitTermination(circuit=circuits[5], termination=provider_networks[2], term_side='A'), + CircuitTermination(circuit=circuits[6], termination=provider_networks[0], term_side='A', mark_connected=True), )) - CircuitTermination.objects.bulk_create(circuit_terminations) + for ct in circuit_terminations: + ct.save() Cable(a_terminations=[circuit_terminations[0]], b_terminations=[circuit_terminations[1]]).save() diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index b06ade30b..a87e327af 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -1,5 +1,6 @@ import datetime +from django.contrib.contenttypes.models import ContentType from django.test import override_settings from django.urls import reverse @@ -190,27 +191,31 @@ class CircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) def test_bulk_import_objects_with_terminations(self): - json_data = """ + site = Site.objects.first() + json_data = f""" [ - { + {{ "cid": "Circuit 7", "provider": "Provider 1", "type": "Circuit Type 1", "status": "active", "description": "Testing Import", "terminations": [ - { + {{ "term_side": "A", - "site": "Site 1" - }, - { + "termination_type": "dcim.site", + "termination_id": "{site.pk}" + }}, + {{ "term_side": "Z", - "site": "Site 1" - } + "termination_type": "dcim.site", + "termination_id": "{site.pk}" + }} ] - } + }} ] """ + initial_count = self._get_queryset().count() data = { 'data': json_data, @@ -336,7 +341,7 @@ class ProviderNetworkTestCase(ViewTestCases.PrimaryObjectViewTestCase): } -class CircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): +class TestCase(ViewTestCases.PrimaryObjectViewTestCase): model = CircuitTermination @classmethod @@ -359,24 +364,27 @@ class CircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): Circuit.objects.bulk_create(circuits) circuit_terminations = ( - CircuitTermination(circuit=circuits[0], term_side='A', site=sites[0]), - CircuitTermination(circuit=circuits[0], term_side='Z', site=sites[1]), - CircuitTermination(circuit=circuits[1], term_side='A', site=sites[0]), - CircuitTermination(circuit=circuits[1], term_side='Z', site=sites[1]), + CircuitTermination(circuit=circuits[0], term_side='A', termination=sites[0]), + CircuitTermination(circuit=circuits[0], term_side='Z', termination=sites[1]), + CircuitTermination(circuit=circuits[1], term_side='A', termination=sites[0]), + CircuitTermination(circuit=circuits[1], term_side='Z', termination=sites[1]), ) - CircuitTermination.objects.bulk_create(circuit_terminations) + for ct in circuit_terminations: + ct.save() cls.form_data = { 'circuit': circuits[2].pk, 'term_side': 'A', - 'site': sites[2].pk, + 'termination_type': ContentType.objects.get_for_model(Site).pk, + 'termination': sites[2].pk, 'description': 'New description', } + site = sites[0].pk cls.csv_data = ( - "circuit,term_side,site,description", - "Circuit 3,A,Site 1,Foo", - "Circuit 3,Z,Site 1,Bar", + "circuit,term_side,termination_type,termination_id,description", + f"Circuit 3,A,dcim.site,{site},Foo", + f"Circuit 3,Z,dcim.site,{site},Bar", ) cls.csv_update_data = ( diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 8218960c9..4059065bf 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -158,7 +158,7 @@ class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView): instance, extra=( ( - Circuit.objects.restrict(request.user, 'view').filter(terminations__provider_network=instance), + Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance), 'provider_network_id', ), ), @@ -257,8 +257,7 @@ class CircuitTypeBulkDeleteView(generic.BulkDeleteView): class CircuitListView(generic.ObjectListView): queryset = Circuit.objects.prefetch_related( - 'tenant__group', 'termination_a__site', 'termination_z__site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'tenant__group', 'termination_a__termination', 'termination_z__termination', ) filterset = filtersets.CircuitFilterSet filterset_form = forms.CircuitFilterForm @@ -298,8 +297,7 @@ class CircuitBulkImportView(generic.BulkImportView): class CircuitBulkEditView(generic.BulkEditView): queryset = Circuit.objects.prefetch_related( - 'termination_a__site', 'termination_z__site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'tenant__group', 'termination_a__termination', 'termination_z__termination', ) filterset = filtersets.CircuitFilterSet table = tables.CircuitTable @@ -308,8 +306,7 @@ class CircuitBulkEditView(generic.BulkEditView): class CircuitBulkDeleteView(generic.BulkDeleteView): queryset = Circuit.objects.prefetch_related( - 'termination_a__site', 'termination_z__site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'tenant__group', 'termination_a__termination', 'termination_z__termination', ) filterset = filtersets.CircuitFilterSet table = tables.CircuitTable diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index db9f3899d..da7a0af25 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -462,6 +462,10 @@ class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, Organi devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] children: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]] + @strawberry_django.field + def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: + return self.circuit_terminations.all() + @strawberry_django.type( models.Manufacturer, @@ -705,6 +709,10 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): def parent(self) -> Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None: return self.parent + @strawberry_django.field + def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: + return self.circuit_terminations.all() + @strawberry_django.type( models.Site, @@ -726,10 +734,13 @@ class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] locations: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]] asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]] - circuit_terminations: List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]] clusters: List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]] vlans: List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]] + @strawberry_django.field + def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: + return self.circuit_terminations.all() + @strawberry_django.type( models.SiteGroup, @@ -746,6 +757,10 @@ class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): def parent(self) -> Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None: return self.parent + @strawberry_django.field + def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: + return self.circuit_terminations.all() + @strawberry_django.type( models.VirtualChassis, diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 9f47a63d3..744ec025c 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -344,7 +344,7 @@ class CableTermination(ChangeLoggedModel): ) # A CircuitTermination attached to a ProviderNetwork cannot have a Cable - if self.termination_type.model == 'circuittermination' and self.termination.provider_network is not None: + if self.termination_type.model == 'circuittermination' and self.termination._provider_network is not None: raise ValidationError(_("Circuit terminations attached to a provider network may not be cabled.")) def save(self, *args, **kwargs): @@ -690,19 +690,19 @@ class CablePath(models.Model): ).first() if circuit_termination is None: break - elif circuit_termination.provider_network: + elif circuit_termination._provider_network: # Circuit terminates to a ProviderNetwork path.extend([ [object_to_path_node(circuit_termination)], - [object_to_path_node(circuit_termination.provider_network)], + [object_to_path_node(circuit_termination._provider_network)], ]) is_complete = True break - elif circuit_termination.site and not circuit_termination.cable: - # Circuit terminates to a Site + elif circuit_termination.termination and not circuit_termination.cable: + # Circuit terminates to a Region/Site/etc. path.extend([ [object_to_path_node(circuit_termination)], - [object_to_path_node(circuit_termination.site)], + [object_to_path_node(circuit_termination.termination)], ]) break diff --git a/netbox/dcim/tests/test_cablepaths.py b/netbox/dcim/tests/test_cablepaths.py index f7c337bdf..b504d389a 100644 --- a/netbox/dcim/tests/test_cablepaths.py +++ b/netbox/dcim/tests/test_cablepaths.py @@ -1167,7 +1167,7 @@ class CablePathTestCase(TestCase): [IF1] --C1-- [CT1] """ interface1 = Interface.objects.create(device=self.device, name='Interface 1') - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') # Create cable 1 cable1 = Cable( @@ -1198,7 +1198,7 @@ class CablePathTestCase(TestCase): """ interface1 = Interface.objects.create(device=self.device, name='Interface 1') interface2 = Interface.objects.create(device=self.device, name='Interface 2') - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') # Create cable 1 cable1 = Cable( @@ -1214,7 +1214,7 @@ class CablePathTestCase(TestCase): ) # Create CT2 - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='Z') # Check for partial path to site self.assertPathExists( @@ -1266,7 +1266,7 @@ class CablePathTestCase(TestCase): interface2 = Interface.objects.create(device=self.device, name='Interface 2') interface3 = Interface.objects.create(device=self.device, name='Interface 3') interface4 = Interface.objects.create(device=self.device, name='Interface 4') - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') # Create cable 1 cable1 = Cable( @@ -1282,7 +1282,7 @@ class CablePathTestCase(TestCase): ) # Create CT2 - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='Z') # Check for partial path to site self.assertPathExists( @@ -1335,8 +1335,8 @@ class CablePathTestCase(TestCase): """ interface1 = Interface.objects.create(device=self.device, name='Interface 1') site2 = Site.objects.create(name='Site 2', slug='site-2') - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=site2, term_side='Z') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=site2, term_side='Z') # Create cable 1 cable1 = Cable( @@ -1365,8 +1365,8 @@ class CablePathTestCase(TestCase): """ interface1 = Interface.objects.create(device=self.device, name='Interface 1') providernetwork = ProviderNetwork.objects.create(name='Provider Network 1', provider=self.circuit.provider) - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, provider_network=providernetwork, term_side='Z') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=providernetwork, term_side='Z') # Create cable 1 cable1 = Cable( @@ -1413,8 +1413,8 @@ class CablePathTestCase(TestCase): frontport2_2 = FrontPort.objects.create( device=self.device, name='Front Port 2:2', rear_port=rearport2, rear_port_position=2 ) - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='Z') # Create cables cable1 = Cable( @@ -1499,10 +1499,10 @@ class CablePathTestCase(TestCase): interface1 = Interface.objects.create(device=self.device, name='Interface 1') interface2 = Interface.objects.create(device=self.device, name='Interface 2') circuit2 = Circuit.objects.create(provider=self.circuit.provider, type=self.circuit.type, cid='Circuit 2') - circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, site=self.site, term_side='Z') - circuittermination3 = CircuitTermination.objects.create(circuit=circuit2, site=self.site, term_side='A') - circuittermination4 = CircuitTermination.objects.create(circuit=circuit2, site=self.site, term_side='Z') + circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='A') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, termination=self.site, term_side='Z') + circuittermination3 = CircuitTermination.objects.create(circuit=circuit2, termination=self.site, term_side='A') + circuittermination4 = CircuitTermination.objects.create(circuit=circuit2, termination=self.site, term_side='Z') # Create cables cable1 = Cable( diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 0a6417022..c5ca01db2 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -5135,7 +5135,7 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): provider = Provider.objects.create(name='Provider 1', slug='provider-1') circuit_type = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') circuit = Circuit.objects.create(cid='Circuit 1', provider=provider, type=circuit_type) - circuit_termination = CircuitTermination.objects.create(circuit=circuit, term_side='A', site=sites[0]) + circuit_termination = CircuitTermination.objects.create(circuit=circuit, term_side='A', termination=sites[0]) # Cables cables = ( @@ -5308,9 +5308,9 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): def test_site(self): site = Site.objects.all()[:2] params = {'site_id': [site[0].pk, site[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 12) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) params = {'site': [site[0].slug, site[1].slug]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 12) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 11) def test_tenant(self): tenant = Tenant.objects.all()[:2] diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index c11badbdd..f0fe4da3b 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -762,9 +762,9 @@ class CableTestCase(TestCase): circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') circuit1 = Circuit.objects.create(provider=provider, type=circuittype, cid='1') circuit2 = Circuit.objects.create(provider=provider, type=circuittype, cid='2') - CircuitTermination.objects.create(circuit=circuit1, site=site, term_side='A') - CircuitTermination.objects.create(circuit=circuit1, site=site, term_side='Z') - CircuitTermination.objects.create(circuit=circuit2, provider_network=provider_network, term_side='A') + CircuitTermination.objects.create(circuit=circuit1, termination=site, term_side='A') + CircuitTermination.objects.create(circuit=circuit1, termination=site, term_side='Z') + CircuitTermination.objects.create(circuit=circuit2, termination=provider_network, term_side='A') def test_cable_creation(self): """ diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 38c3f68c3..9a821a384 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -242,6 +242,10 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView): extra=( (Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), + ( + Circuit.objects.restrict(request.user, 'view').filter(terminations___region=instance).distinct(), + 'region_id' + ), ), ), } @@ -324,6 +328,10 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView): extra=( (Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), + ( + Circuit.objects.restrict(request.user, 'view').filter(terminations___site_group=instance).distinct(), + 'site_group_id' + ), ), ), } @@ -404,8 +412,10 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): scope_id=instance.pk ), 'site'), (ASN.objects.restrict(request.user, 'view').filter(sites=instance), 'site_id'), - (Circuit.objects.restrict(request.user, 'view').filter(terminations__site=instance).distinct(), - 'site_id'), + ( + Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(), + 'site_id' + ), ), ), } @@ -475,7 +485,17 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView): def get_extra_context(self, request, instance): locations = instance.get_descendants(include_self=True) return { - 'related_models': self.get_related_models(request, locations, [CableTermination]), + 'related_models': self.get_related_models( + request, + locations, + [CableTermination], + ( + ( + Circuit.objects.restrict(request.user, 'view').filter(terminations___location=instance).distinct(), + 'location_id' + ), + ), + ), } diff --git a/netbox/templates/circuits/inc/circuit_termination_fields.html b/netbox/templates/circuits/inc/circuit_termination_fields.html index 97d194f24..94c4599b0 100644 --- a/netbox/templates/circuits/inc/circuit_termination_fields.html +++ b/netbox/templates/circuits/inc/circuit_termination_fields.html @@ -1,18 +1,19 @@ {% load helpers %} {% load i18n %} -{% if termination.site %} - {% trans "Site" %} - - {% if termination.site.region %} - {{ termination.site.region|linkify }} / - {% endif %} - {{ termination.site|linkify }} - + {% trans "Termination point" %} + {% if termination.termination %} + + {{ termination.termination|linkify }} +
{% trans termination.termination_type.name|bettertitle %}
+ + {% else %} + {{ ''|placeholder }} + {% endif %} - {% trans "Termination" %} + {% trans "Connection" %} {% if termination.mark_connected %} @@ -57,12 +58,6 @@ {% endif %} -{% else %} - - {% trans "Provider Network" %} - {{ termination.provider_network.provider|linkify }} / {{ termination.provider_network|linkify }} - -{% endif %} {% trans "Speed" %} From 8767fd818610bd5efc48ada5aec0760d26eae467 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 31 Oct 2024 14:17:06 -0400 Subject: [PATCH 021/169] Closes #13428: Q-in-Q VLANs (#17822) * Initial work on #13428 (QinQ) * Misc cleanup; add tests for Q-in-Q fields * Address PR feedback --- docs/models/dcim/interface.md | 4 ++ docs/models/ipam/vlan.md | 8 ++++ docs/models/virtualization/vminterface.md | 4 ++ .../api/serializers_/device_components.py | 9 ++-- netbox/dcim/choices.py | 2 + netbox/dcim/filtersets.py | 6 ++- netbox/dcim/forms/common.py | 2 + netbox/dcim/forms/model_forms.py | 18 ++++++- netbox/dcim/graphql/types.py | 1 + netbox/dcim/migrations/0196_qinq_svlan.py | 28 +++++++++++ netbox/dcim/models/device_components.py | 47 +++++++++++++------ netbox/dcim/tables/devices.py | 16 ++++--- netbox/dcim/tests/test_api.py | 6 +++ netbox/dcim/tests/test_filtersets.py | 29 ++++++++++-- netbox/ipam/api/serializers_/nested.py | 8 ++++ netbox/ipam/api/serializers_/vlans.py | 7 ++- netbox/ipam/choices.py | 11 +++++ netbox/ipam/filtersets.py | 11 +++++ netbox/ipam/forms/bulk_edit.py | 16 ++++++- netbox/ipam/forms/bulk_import.py | 18 ++++++- netbox/ipam/forms/filtersets.py | 12 +++++ netbox/ipam/forms/model_forms.py | 12 ++++- netbox/ipam/graphql/types.py | 6 ++- netbox/ipam/migrations/0075_vlan_qinq.py | 30 ++++++++++++ netbox/ipam/models/vlans.py | 40 +++++++++++++++- netbox/ipam/tables/vlans.py | 9 +++- netbox/ipam/tests/test_api.py | 7 +++ netbox/ipam/tests/test_filtersets.py | 24 ++++++++++ netbox/ipam/tests/test_models.py | 21 +++++++++ netbox/templates/ipam/vlan.html | 31 ++++++++++++ netbox/templates/ipam/vlan_edit.html | 8 ++++ .../api/serializers_/virtualmachines.py | 7 +-- netbox/virtualization/forms/model_forms.py | 20 ++++++-- netbox/virtualization/graphql/types.py | 1 + ...042_vminterface_vlan_translation_policy.py | 2 - .../migrations/0043_qinq_svlan.py | 28 +++++++++++ .../virtualization/models/virtualmachines.py | 14 ------ .../virtualization/tables/virtualmachines.py | 7 +-- netbox/virtualization/tests/test_api.py | 8 ++++ .../virtualization/tests/test_filtersets.py | 24 ++++++++-- 40 files changed, 492 insertions(+), 70 deletions(-) create mode 100644 netbox/dcim/migrations/0196_qinq_svlan.py create mode 100644 netbox/ipam/migrations/0075_vlan_qinq.py create mode 100644 netbox/virtualization/migrations/0043_qinq_svlan.py diff --git a/docs/models/dcim/interface.md b/docs/models/dcim/interface.md index 869cb8510..fb7198682 100644 --- a/docs/models/dcim/interface.md +++ b/docs/models/dcim/interface.md @@ -120,6 +120,10 @@ The "native" (untagged) VLAN for the interface. Valid only when one of the above The tagged VLANs which are configured to be carried by this interface. Valid only for the "tagged" 802.1Q mode above. +### Q-in-Q SVLAN + +The assigned service VLAN (for Q-in-Q/802.1ad interfaces). + ### Wireless Role Indicates the configured role for wireless interfaces (access point or station). diff --git a/docs/models/ipam/vlan.md b/docs/models/ipam/vlan.md index 2dd5ec2d3..dc547ddbc 100644 --- a/docs/models/ipam/vlan.md +++ b/docs/models/ipam/vlan.md @@ -26,3 +26,11 @@ The user-defined functional [role](./role.md) assigned to the VLAN. ### VLAN Group or Site The [VLAN group](./vlangroup.md) or [site](../dcim/site.md) to which the VLAN is assigned. + +### Q-in-Q Role + +For VLANs which comprise a Q-in-Q/IEEE 802.1ad topology, this field indicates whether the VLAN is treated as a service or customer VLAN. + +### Q-in-Q Service VLAN + +The designated parent service VLAN for a Q-in-Q customer VLAN. This may be set only for Q-in-Q custom VLANs. diff --git a/docs/models/virtualization/vminterface.md b/docs/models/virtualization/vminterface.md index 1e022b091..4a0c474f9 100644 --- a/docs/models/virtualization/vminterface.md +++ b/docs/models/virtualization/vminterface.md @@ -53,6 +53,10 @@ The "native" (untagged) VLAN for the interface. Valid only when one of the above The tagged VLANs which are configured to be carried by this interface. Valid only for the "tagged" 802.1Q mode above. +### Q-in-Q SVLAN + +The assigned service VLAN (for Q-in-Q/802.1ad interfaces). + ### VRF The [virtual routing and forwarding](../ipam/vrf.md) instance to which this interface is assigned. diff --git a/netbox/dcim/api/serializers_/device_components.py b/netbox/dcim/api/serializers_/device_components.py index 3be19bb58..57111c2af 100644 --- a/netbox/dcim/api/serializers_/device_components.py +++ b/netbox/dcim/api/serializers_/device_components.py @@ -196,6 +196,7 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect required=False, many=True ) + qinq_svlan = VLANSerializer(nested=True, required=False, allow_null=True) vlan_translation_policy = VLANTranslationPolicySerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) @@ -223,10 +224,10 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect 'id', 'url', 'display_url', 'display', 'device', 'vdcs', 'module', 'name', 'label', 'type', 'enabled', 'parent', 'bridge', 'lag', 'mtu', 'mac_address', 'speed', 'duplex', 'wwn', 'mgmt_only', 'description', 'mode', 'rf_role', 'rf_channel', 'poe_mode', 'poe_type', 'rf_channel_frequency', 'rf_channel_width', - 'tx_power', 'untagged_vlan', 'tagged_vlans', 'mark_connected', 'cable', 'cable_end', 'wireless_link', - 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', 'l2vpn_termination', 'connected_endpoints', - 'connected_endpoints_type', 'connected_endpoints_reachable', 'tags', 'custom_fields', 'created', - 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', 'vlan_translation_policy' + 'tx_power', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', 'mark_connected', + 'cable', 'cable_end', 'wireless_link', 'link_peers', 'link_peers_type', 'wireless_lans', 'vrf', + 'l2vpn_termination', 'connected_endpoints', 'connected_endpoints_type', 'connected_endpoints_reachable', + 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', '_occupied', ] brief_fields = ('id', 'url', 'display', 'device', 'name', 'description', 'cable', '_occupied') diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index fee587e6b..e1a99e0db 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -1258,11 +1258,13 @@ class InterfaceModeChoices(ChoiceSet): MODE_ACCESS = 'access' MODE_TAGGED = 'tagged' MODE_TAGGED_ALL = 'tagged-all' + MODE_Q_IN_Q = 'q-in-q' CHOICES = ( (MODE_ACCESS, _('Access')), (MODE_TAGGED, _('Tagged')), (MODE_TAGGED_ALL, _('Tagged (All)')), + (MODE_Q_IN_Q, _('Q-in-Q (802.1ad)')), ) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index c11a7ef00..0371f882b 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1647,7 +1647,8 @@ class CommonInterfaceFilterSet(django_filters.FilterSet): return queryset return queryset.filter( Q(untagged_vlan_id=value) | - Q(tagged_vlans=value) + Q(tagged_vlans=value) | + Q(qinq_svlan=value) ) def filter_vlan(self, queryset, name, value): @@ -1656,7 +1657,8 @@ class CommonInterfaceFilterSet(django_filters.FilterSet): return queryset return queryset.filter( Q(untagged_vlan_id__vid=value) | - Q(tagged_vlans__vid=value) + Q(tagged_vlans__vid=value) | + Q(qinq_svlan__vid=value) ) diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index 4341ec041..bae7fd222 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -37,6 +37,8 @@ class InterfaceCommonForm(forms.Form): del self.fields['vlan_group'] del self.fields['untagged_vlan'] del self.fields['tagged_vlans'] + if interface_mode != InterfaceModeChoices.MODE_Q_IN_Q: + del self.fields['qinq_svlan'] def clean(self): super().clean() diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 1ab9f138b..2fcdbe5fd 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -7,6 +7,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.models import ConfigTemplate +from ipam.choices import VLANQinQRoleChoices from ipam.models import ASN, IPAddress, VLAN, VLANGroup, VLANTranslationPolicy, VRF from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm @@ -1372,6 +1373,16 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): 'available_on_device': '$device', } ) + qinq_svlan = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False, + label=_('Q-in-Q Service VLAN'), + query_params={ + 'group_id': '$vlan_group', + 'available_on_device': '$device', + 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, + } + ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -1396,7 +1407,10 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): FieldSet('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected', name=_('Operation')), FieldSet('parent', 'bridge', 'lag', name=_('Related Interfaces')), FieldSet('poe_mode', 'poe_type', name=_('PoE')), - FieldSet('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vlan_translation_policy', name=_('802.1Q Switching')), + FieldSet( + 'mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', + name=_('802.1Q Switching') + ), FieldSet( 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'wireless_lan_group', 'wireless_lans', name=_('Wireless') @@ -1409,7 +1423,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): 'device', 'module', 'vdcs', 'name', 'label', 'type', 'speed', 'duplex', 'enabled', 'parent', 'bridge', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'mark_connected', 'description', 'poe_mode', 'poe_type', 'mode', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'wireless_lans', - 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', 'vlan_translation_policy', + 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', 'vrf', 'tags', ] widgets = { 'speed': NumberWithOptions( diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index da7a0af25..5965fdcec 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -385,6 +385,7 @@ class InterfaceType(IPAddressesMixin, ModularComponentType, CabledObjectMixin, P wireless_link: Annotated["WirelessLinkType", strawberry.lazy('wireless.graphql.types')] | None untagged_vlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None + qinq_svlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None vlan_translation_policy: Annotated["VLANTranslationPolicyType", strawberry.lazy('ipam.graphql.types')] | None vdcs: List[Annotated["VirtualDeviceContextType", strawberry.lazy('dcim.graphql.types')]] diff --git a/netbox/dcim/migrations/0196_qinq_svlan.py b/netbox/dcim/migrations/0196_qinq_svlan.py new file mode 100644 index 000000000..9012d74f3 --- /dev/null +++ b/netbox/dcim/migrations/0196_qinq_svlan.py @@ -0,0 +1,28 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0195_interface_vlan_translation_policy'), + ('ipam', '0075_vlan_qinq'), + ] + + operations = [ + migrations.AddField( + model_name='interface', + name='qinq_svlan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)ss_svlan', to='ipam.vlan'), + ), + migrations.AlterField( + model_name='interface', + name='tagged_vlans', + field=models.ManyToManyField(blank=True, related_name='%(class)ss_as_tagged', to='ipam.vlan'), + ), + migrations.AlterField( + model_name='interface', + name='untagged_vlan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)ss_as_untagged', to='ipam.vlan'), + ), + ] diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 14f4120b5..36fd02add 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -547,17 +547,48 @@ class BaseInterface(models.Model): blank=True, verbose_name=_('bridge interface') ) + untagged_vlan = models.ForeignKey( + to='ipam.VLAN', + on_delete=models.SET_NULL, + related_name='%(class)ss_as_untagged', + null=True, + blank=True, + verbose_name=_('untagged VLAN') + ) + tagged_vlans = models.ManyToManyField( + to='ipam.VLAN', + related_name='%(class)ss_as_tagged', + blank=True, + verbose_name=_('tagged VLANs') + ) + qinq_svlan = models.ForeignKey( + to='ipam.VLAN', + on_delete=models.SET_NULL, + related_name='%(class)ss_svlan', + null=True, + blank=True, + verbose_name=_('Q-in-Q SVLAN') + ) vlan_translation_policy = models.ForeignKey( to='ipam.VLANTranslationPolicy', on_delete=models.PROTECT, null=True, blank=True, - verbose_name=_('VLAN Translation Policy'), + verbose_name=_('VLAN Translation Policy') ) class Meta: abstract = True + def clean(self): + super().clean() + + # SVLAN can be defined only for Q-in-Q interfaces + if self.qinq_svlan and self.mode != InterfaceModeChoices.MODE_Q_IN_Q: + raise ValidationError({ + 'qinq_svlan': _("Only Q-in-Q interfaces may specify a service VLAN.") + }) + def save(self, *args, **kwargs): # Remove untagged VLAN assignment for non-802.1Q interfaces @@ -697,20 +728,6 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd blank=True, verbose_name=_('wireless LANs') ) - untagged_vlan = models.ForeignKey( - to='ipam.VLAN', - on_delete=models.SET_NULL, - related_name='interfaces_as_untagged', - null=True, - blank=True, - verbose_name=_('untagged VLAN') - ) - tagged_vlans = models.ManyToManyField( - to='ipam.VLAN', - related_name='interfaces_as_tagged', - blank=True, - verbose_name=_('tagged VLANs') - ) vrf = models.ForeignKey( to='ipam.VRF', on_delete=models.SET_NULL, diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index b39a2b87f..fed33401c 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -585,6 +585,10 @@ class BaseInterfaceTable(NetBoxTable): orderable=False, verbose_name=_('Tagged VLANs') ) + qinq_svlan = tables.Column( + verbose_name=_('Q-in-Q SVLAN'), + linkify=True + ) def value_ip_addresses(self, value): return ",".join([str(obj.address) for obj in value.all()]) @@ -635,11 +639,11 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi model = models.Interface fields = ( 'pk', 'id', 'name', 'device', 'module_bay', 'module', 'label', 'enabled', 'type', 'mgmt_only', 'mtu', - 'speed', 'speed_formatted', 'duplex', 'mode', 'mac_address', 'wwn', 'poe_mode', 'poe_type', 'rf_role', 'rf_channel', - 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', - 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', - 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'inventory_items', 'created', - 'last_updated', + 'speed', 'speed_formatted', 'duplex', 'mode', 'mac_address', 'wwn', 'poe_mode', 'poe_type', 'rf_role', + 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', + 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', + 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', + 'inventory_items', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'device', 'label', 'enabled', 'type', 'description') @@ -676,7 +680,7 @@ class DeviceInterfaceTable(InterfaceTable): 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', - 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', + 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index 1b460cd59..f78722b67 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -7,6 +7,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.models import ConfigTemplate +from ipam.choices import VLANQinQRoleChoices from ipam.models import ASN, RIR, VLAN, VRF from netbox.api.serializers import GenericObjectSerializer from tenancy.models import Tenant @@ -1618,6 +1619,7 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase VLAN(name='VLAN 1', vid=1), VLAN(name='VLAN 2', vid=2), VLAN(name='VLAN 3', vid=3), + VLAN(name='SVLAN 1', vid=1001, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), ) VLAN.objects.bulk_create(vlans) @@ -1676,18 +1678,22 @@ class InterfaceTest(Mixins.ComponentTraceMixin, APIViewTestCases.APIViewTestCase 'vdcs': [vdcs[1].pk], 'name': 'Interface 7', 'type': InterfaceTypeChoices.TYPE_80211A, + 'mode': InterfaceModeChoices.MODE_Q_IN_Q, 'tx_power': 10, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], 'rf_channel': WirelessChannelChoices.CHANNEL_5G_32, + 'qinq_svlan': vlans[3].pk, }, { 'device': device.pk, 'vdcs': [vdcs[1].pk], 'name': 'Interface 8', 'type': InterfaceTypeChoices.TYPE_80211A, + 'mode': InterfaceModeChoices.MODE_Q_IN_Q, 'tx_power': 10, 'wireless_lans': [wireless_lans[0].pk, wireless_lans[1].pk], 'rf_channel': "", + 'qinq_svlan': vlans[3].pk, }, ] diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index c5ca01db2..993c2fa4e 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -4,7 +4,8 @@ from circuits.models import Circuit, CircuitTermination, CircuitType, Provider from dcim.choices import * from dcim.filtersets import * from dcim.models import * -from ipam.models import ASN, IPAddress, RIR, VLANTranslationPolicy, VRF +from ipam.choices import VLANQinQRoleChoices +from ipam.models import ASN, IPAddress, RIR, VLAN, VLANTranslationPolicy, VRF from netbox.choices import ColorChoices, WeightUnitChoices from tenancy.models import Tenant, TenantGroup from users.models import User @@ -3520,7 +3521,7 @@ class PowerOutletTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedF class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFilterSetTests): queryset = Interface.objects.all() filterset = InterfaceFilterSet - ignore_fields = ('tagged_vlans', 'untagged_vlan', 'vdcs') + ignore_fields = ('tagged_vlans', 'untagged_vlan', 'qinq_svlan', 'vdcs') @classmethod def setUpTestData(cls): @@ -3669,6 +3670,13 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil ) VirtualDeviceContext.objects.bulk_create(vdcs) + vlans = ( + VLAN(name='SVLAN 1', vid=1001, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(name='SVLAN 2', vid=1002, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(name='SVLAN 3', vid=1003, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + ) + VLAN.objects.bulk_create(vlans) + vlan_translation_policies = ( VLANTranslationPolicy(name='Policy 1'), VLANTranslationPolicy(name='Policy 2'), @@ -3753,6 +3761,8 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil duplex='full', poe_mode=InterfacePoEModeChoices.MODE_PD, poe_type=InterfacePoETypeChoices.TYPE_2_8023AT, + mode=InterfaceModeChoices.MODE_Q_IN_Q, + qinq_svlan=vlans[0], vlan_translation_policy=vlan_translation_policies[1], ), Interface( @@ -3762,7 +3772,9 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil type=InterfaceTypeChoices.TYPE_OTHER, enabled=True, mgmt_only=True, - tx_power=40 + tx_power=40, + mode=InterfaceModeChoices.MODE_Q_IN_Q, + qinq_svlan=vlans[1] ), Interface( device=devices[4], @@ -3771,7 +3783,9 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil type=InterfaceTypeChoices.TYPE_OTHER, enabled=False, mgmt_only=False, - tx_power=40 + tx_power=40, + mode=InterfaceModeChoices.MODE_Q_IN_Q, + qinq_svlan=vlans[2] ), Interface( device=devices[4], @@ -4027,6 +4041,13 @@ class InterfaceTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil params = {'vdc_identifier': vdc.values_list('identifier', flat=True)} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 3) + def test_vlan(self): + vlan = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE).first() + params = {'vlan_id': vlan.pk} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'vlan': vlan.vid} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_vlan_translation_policy(self): vlan_translation_policies = VLANTranslationPolicy.objects.all()[:2] params = {'vlan_translation_policy_id': [vlan_translation_policies[0].pk, vlan_translation_policies[1].pk]} diff --git a/netbox/ipam/api/serializers_/nested.py b/netbox/ipam/api/serializers_/nested.py index 5297565bb..b56b15984 100644 --- a/netbox/ipam/api/serializers_/nested.py +++ b/netbox/ipam/api/serializers_/nested.py @@ -6,6 +6,7 @@ from ..field_serializers import IPAddressField __all__ = ( 'NestedIPAddressSerializer', + 'NestedVLANSerializer', ) @@ -16,3 +17,10 @@ class NestedIPAddressSerializer(WritableNestedSerializer): class Meta: model = models.IPAddress fields = ['id', 'url', 'display_url', 'display', 'family', 'address'] + + +class NestedVLANSerializer(WritableNestedSerializer): + + class Meta: + model = models.VLAN + fields = ['id', 'url', 'display', 'vid', 'name', 'description'] diff --git a/netbox/ipam/api/serializers_/vlans.py b/netbox/ipam/api/serializers_/vlans.py index ee06357a5..05fdd5813 100644 --- a/netbox/ipam/api/serializers_/vlans.py +++ b/netbox/ipam/api/serializers_/vlans.py @@ -11,6 +11,7 @@ from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model from vpn.api.serializers_.l2vpn import L2VPNTerminationSerializer +from .nested import NestedVLANSerializer from .roles import RoleSerializer __all__ = ( @@ -64,6 +65,8 @@ class VLANSerializer(NetBoxModelSerializer): tenant = TenantSerializer(nested=True, required=False, allow_null=True) status = ChoiceField(choices=VLANStatusChoices, required=False) role = RoleSerializer(nested=True, required=False, allow_null=True) + qinq_role = ChoiceField(choices=VLANQinQRoleChoices, required=False) + qinq_svlan = NestedVLANSerializer(required=False, allow_null=True, default=None) l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) # Related object counts @@ -73,8 +76,8 @@ class VLANSerializer(NetBoxModelSerializer): model = VLAN fields = [ 'id', 'url', 'display_url', 'display', 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', - 'description', 'comments', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', - 'prefix_count', + 'description', 'qinq_role', 'qinq_svlan', 'comments', 'l2vpn_termination', 'tags', 'custom_fields', + 'created', 'last_updated', 'prefix_count', ] brief_fields = ('id', 'url', 'display', 'vid', 'name', 'description') diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index 017fd0430..4d9c0bdd4 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -157,6 +157,17 @@ class VLANStatusChoices(ChoiceSet): ] +class VLANQinQRoleChoices(ChoiceSet): + + ROLE_SERVICE = 's-vlan' + ROLE_CUSTOMER = 'c-vlan' + + CHOICES = [ + (ROLE_SERVICE, _('Service'), 'blue'), + (ROLE_CUSTOMER, _('Customer'), 'orange'), + ] + + # # Services # diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 017a34ac4..88c869a50 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -1041,6 +1041,17 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): queryset=VirtualMachine.objects.all(), method='get_for_virtualmachine' ) + qinq_role = django_filters.MultipleChoiceFilter( + choices=VLANQinQRoleChoices + ) + qinq_svlan_id = django_filters.ModelMultipleChoiceFilter( + queryset=VLAN.objects.all(), + label=_('Q-in-Q SVLAN (ID)'), + ) + qinq_svlan_vid = MultiValueNumberFilter( + field_name='qinq_svlan__vid', + label=_('Q-in-Q SVLAN number (1-4094)'), + ) l2vpn_id = django_filters.ModelMultipleChoiceFilter( field_name='l2vpn_terminations__l2vpn', queryset=L2VPN.objects.all(), diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index 49a79623c..c323a41c1 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -527,15 +527,29 @@ class VLANBulkEditForm(NetBoxModelBulkEditForm): max_length=200, required=False ) + qinq_role = forms.ChoiceField( + label=_('Q-in-Q role'), + choices=add_blank_choice(VLANQinQRoleChoices), + required=False + ) + qinq_svlan = DynamicModelChoiceField( + label=_('Q-in-Q SVLAN'), + queryset=VLAN.objects.all(), + required=False, + query_params={ + 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, + } + ) comments = CommentField() model = VLAN fieldsets = ( FieldSet('status', 'role', 'tenant', 'description'), + FieldSet('qinq_role', 'qinq_svlan', name=_('Q-in-Q')), FieldSet('region', 'site_group', 'site', 'group', name=_('Site & Group')), ) nullable_fields = ( - 'site', 'group', 'tenant', 'role', 'description', 'comments', + 'site', 'group', 'tenant', 'role', 'description', 'qinq_role', 'qinq_svlan', 'comments', ) diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index cd34a6d84..3be4ccc59 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -461,10 +461,26 @@ class VLANImportForm(NetBoxModelImportForm): to_field_name='name', help_text=_('Functional role') ) + qinq_role = CSVChoiceField( + label=_('Q-in-Q role'), + choices=VLANStatusChoices, + required=False, + help_text=_('Operational status') + ) + qinq_svlan = CSVModelChoiceField( + label=_('Q-in-Q SVLAN'), + queryset=VLAN.objects.all(), + required=False, + to_field_name='vid', + help_text=_("Service VLAN (for Q-in-Q/802.1ad customer VLANs)") + ) class Meta: model = VLAN - fields = ('site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'comments', 'tags') + fields = ( + 'site', 'group', 'vid', 'name', 'tenant', 'status', 'role', 'description', 'qinq_role', 'qinq_svlan', + 'comments', 'tags', + ) class VLANTranslationPolicyImportForm(NetBoxModelImportForm): diff --git a/netbox/ipam/forms/filtersets.py b/netbox/ipam/forms/filtersets.py index b9bee6d97..3f951512b 100644 --- a/netbox/ipam/forms/filtersets.py +++ b/netbox/ipam/forms/filtersets.py @@ -506,6 +506,7 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): FieldSet('q', 'filter_id', 'tag'), FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), FieldSet('group_id', 'status', 'role_id', 'vid', 'l2vpn_id', name=_('Attributes')), + FieldSet('qinq_role', 'qinq_svlan_id', name=_('Q-in-Q/802.1ad')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), ) selector_fields = ('filter_id', 'q', 'site_id') @@ -552,6 +553,17 @@ class VLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): required=False, label=_('VLAN ID') ) + qinq_role = forms.MultipleChoiceField( + label=_('Q-in-Q role'), + choices=VLANQinQRoleChoices, + required=False + ) + qinq_svlan_id = DynamicModelMultipleChoiceField( + queryset=VLAN.objects.all(), + required=False, + null_option='None', + label=_('Q-in-Q SVLAN') + ) l2vpn_id = DynamicModelMultipleChoiceField( queryset=L2VPN.objects.all(), required=False, diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 629c1a481..3d0cd3dd1 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -683,13 +683,21 @@ class VLANForm(TenancyForm, NetBoxModelForm): queryset=Role.objects.all(), required=False ) + qinq_svlan = DynamicModelChoiceField( + label=_('Q-in-Q SVLAN'), + queryset=VLAN.objects.all(), + required=False, + query_params={ + 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, + } + ) comments = CommentField() class Meta: model = VLAN fields = [ - 'site', 'group', 'vid', 'name', 'status', 'role', 'tenant_group', 'tenant', 'description', 'comments', - 'tags', + 'site', 'group', 'vid', 'name', 'status', 'role', 'tenant_group', 'tenant', 'qinq_role', 'qinq_svlan', + 'description', 'comments', 'tags', ] diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index ef50138c2..2ef63cf0c 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -236,7 +236,7 @@ class ServiceTemplateType(NetBoxObjectType): @strawberry_django.type( models.VLAN, - fields='__all__', + exclude=('qinq_svlan',), filters=VLANFilter ) class VLANType(NetBoxObjectType): @@ -252,6 +252,10 @@ class VLANType(NetBoxObjectType): interfaces_as_tagged: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]] vminterfaces_as_tagged: List[Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')]] + @strawberry_django.field + def qinq_svlan(self) -> Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None: + return self.qinq_svlan + @strawberry_django.type( models.VLANGroup, diff --git a/netbox/ipam/migrations/0075_vlan_qinq.py b/netbox/ipam/migrations/0075_vlan_qinq.py new file mode 100644 index 000000000..8a3b8a39a --- /dev/null +++ b/netbox/ipam/migrations/0075_vlan_qinq.py @@ -0,0 +1,30 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0074_vlantranslationpolicy_vlantranslationrule'), + ] + + operations = [ + migrations.AddField( + model_name='vlan', + name='qinq_role', + field=models.CharField(blank=True, max_length=50, null=True), + ), + migrations.AddField( + model_name='vlan', + name='qinq_svlan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='qinq_cvlans', to='ipam.vlan'), + ), + migrations.AddConstraint( + model_name='vlan', + constraint=models.UniqueConstraint(fields=('qinq_svlan', 'vid'), name='ipam_vlan_unique_qinq_svlan_vid'), + ), + migrations.AddConstraint( + model_name='vlan', + constraint=models.UniqueConstraint(fields=('qinq_svlan', 'name'), name='ipam_vlan_unique_qinq_svlan_name'), + ), + ] diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index ff8394839..7832cfc67 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -204,6 +204,21 @@ class VLAN(PrimaryModel): null=True, help_text=_("The primary function of this VLAN") ) + qinq_svlan = models.ForeignKey( + to='self', + on_delete=models.PROTECT, + related_name='qinq_cvlans', + blank=True, + null=True + ) + qinq_role = models.CharField( + verbose_name=_('Q-in-Q role'), + max_length=50, + choices=VLANQinQRoleChoices, + blank=True, + null=True, + help_text=_("Customer/service VLAN designation (for Q-in-Q/IEEE 802.1ad)") + ) l2vpn_terminations = GenericRelation( to='vpn.L2VPNTermination', content_type_field='assigned_object_type', @@ -214,7 +229,7 @@ class VLAN(PrimaryModel): objects = VLANQuerySet.as_manager() clone_fields = [ - 'site', 'group', 'tenant', 'status', 'role', 'description', + 'site', 'group', 'tenant', 'status', 'role', 'description', 'qinq_role', 'qinq_svlan', ] class Meta: @@ -228,6 +243,14 @@ class VLAN(PrimaryModel): fields=('group', 'name'), name='%(app_label)s_%(class)s_unique_group_name' ), + models.UniqueConstraint( + fields=('qinq_svlan', 'vid'), + name='%(app_label)s_%(class)s_unique_qinq_svlan_vid' + ), + models.UniqueConstraint( + fields=('qinq_svlan', 'name'), + name='%(app_label)s_%(class)s_unique_qinq_svlan_name' + ), ) verbose_name = _('VLAN') verbose_name_plural = _('VLANs') @@ -255,9 +278,24 @@ class VLAN(PrimaryModel): ).format(ranges=ranges_to_string(self.group.vid_ranges), group=self.group) }) + # Only Q-in-Q customer VLANs may be assigned to a service VLAN + if self.qinq_svlan and self.qinq_role != VLANQinQRoleChoices.ROLE_CUSTOMER: + raise ValidationError({ + 'qinq_svlan': _("Only Q-in-Q customer VLANs maybe assigned to a service VLAN.") + }) + + # A Q-in-Q customer VLAN must be assigned to a service VLAN + if self.qinq_role == VLANQinQRoleChoices.ROLE_CUSTOMER and not self.qinq_svlan: + raise ValidationError({ + 'qinq_role': _("A Q-in-Q customer VLAN must be assigned to a service VLAN.") + }) + def get_status_color(self): return VLANStatusChoices.colors.get(self.status) + def get_qinq_role_color(self): + return VLANQinQRoleChoices.colors.get(self.qinq_role) + def get_interfaces(self): # Return all device interfaces assigned to this VLAN return Interface.objects.filter( diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py index 1a06bb700..d34ff5f45 100644 --- a/netbox/ipam/tables/vlans.py +++ b/netbox/ipam/tables/vlans.py @@ -132,6 +132,13 @@ class VLANTable(TenancyColumnsMixin, NetBoxTable): verbose_name=_('Role'), linkify=True ) + qinq_role = columns.ChoiceFieldColumn( + verbose_name=_('Q-in-Q role') + ) + qinq_svlan = tables.Column( + verbose_name=_('Q-in-Q SVLAN'), + linkify=True + ) l2vpn = tables.Column( accessor=tables.A('l2vpn_termination__l2vpn'), linkify=True, @@ -154,7 +161,7 @@ class VLANTable(TenancyColumnsMixin, NetBoxTable): model = VLAN fields = ( 'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'tenant_group', 'status', 'role', - 'description', 'comments', 'tags', 'l2vpn', 'created', 'last_updated', + 'qinq_role', 'qinq_svlan', 'description', 'comments', 'tags', 'l2vpn', 'created', 'last_updated', ) default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description') row_attrs = { diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index cd3e47342..4e8456e5a 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -980,6 +980,7 @@ class VLANTest(APIViewTestCases.APIViewTestCase): VLAN(name='VLAN 1', vid=1, group=vlan_groups[0]), VLAN(name='VLAN 2', vid=2, group=vlan_groups[0]), VLAN(name='VLAN 3', vid=3, group=vlan_groups[0]), + VLAN(name='SVLAN 1', vid=1001, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), ) VLAN.objects.bulk_create(vlans) @@ -999,6 +1000,12 @@ class VLANTest(APIViewTestCases.APIViewTestCase): 'name': 'VLAN 6', 'group': vlan_groups[1].pk, }, + { + 'vid': 2001, + 'name': 'CVLAN 1', + 'qinq_role': VLANQinQRoleChoices.ROLE_CUSTOMER, + 'qinq_svlan': vlans[3].pk, + }, ] def test_delete_vlan_with_prefix(self): diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index b402a8426..f651c970d 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1630,6 +1630,7 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): Site(name='Site 4', slug='site-4', region=regions[0], group=site_groups[0]), Site(name='Site 5', slug='site-5', region=regions[1], group=site_groups[1]), Site(name='Site 6', slug='site-6', region=regions[2], group=site_groups[2]), + Site(name='Site 7', slug='site-7'), ) Site.objects.bulk_create(sites) @@ -1784,9 +1785,21 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): # Create one globally available VLAN VLAN(vid=1000, name='Global VLAN'), + + # Create some Q-in-Q service VLANs + VLAN(vid=2001, name='SVLAN 1', site=sites[6], qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(vid=2002, name='SVLAN 2', site=sites[6], qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(vid=2003, name='SVLAN 3', site=sites[6], qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), ) VLAN.objects.bulk_create(vlans) + # Create Q-in-Q customer VLANs + VLAN.objects.bulk_create([ + VLAN(vid=3001, name='CVLAN 1', site=sites[6], qinq_svlan=vlans[29], qinq_role=VLANQinQRoleChoices.ROLE_CUSTOMER), + VLAN(vid=3002, name='CVLAN 2', site=sites[6], qinq_svlan=vlans[30], qinq_role=VLANQinQRoleChoices.ROLE_CUSTOMER), + VLAN(vid=3003, name='CVLAN 3', site=sites[6], qinq_svlan=vlans[31], qinq_role=VLANQinQRoleChoices.ROLE_CUSTOMER), + ]) + # Assign VLANs to device interfaces interfaces[0].untagged_vlan = vlans[0] interfaces[0].tagged_vlans.add(vlans[1]) @@ -1897,6 +1910,17 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'vminterface_id': vminterface_id} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_qinq_role(self): + params = {'qinq_role': [VLANQinQRoleChoices.ROLE_SERVICE, VLANQinQRoleChoices.ROLE_CUSTOMER]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 6) + + def test_qinq_svlan(self): + vlans = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE)[:2] + params = {'qinq_svlan_id': [vlans[0].pk, vlans[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'qinq_svlan_vid': [vlans[0].vid, vlans[1].vid]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class VLANTranslationPolicyTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VLANTranslationPolicy.objects.all() diff --git a/netbox/ipam/tests/test_models.py b/netbox/ipam/tests/test_models.py index d14fa0657..917b50f33 100644 --- a/netbox/ipam/tests/test_models.py +++ b/netbox/ipam/tests/test_models.py @@ -586,3 +586,24 @@ class TestVLANGroup(TestCase): vlangroup.vid_ranges = string_to_ranges('2-2') vlangroup.full_clean() vlangroup.save() + + +class TestVLAN(TestCase): + + @classmethod + def setUpTestData(cls): + VLAN.objects.bulk_create(( + VLAN(name='VLAN 1', vid=1, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + )) + + def test_qinq_role(self): + svlan = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE).first() + + vlan = VLAN( + name='VLAN X', + vid=999, + qinq_role=VLANQinQRoleChoices.ROLE_SERVICE, + qinq_svlan=svlan + ) + with self.assertRaises(ValidationError): + vlan.full_clean() diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html index 95a4f7856..a10a1439a 100644 --- a/netbox/templates/ipam/vlan.html +++ b/netbox/templates/ipam/vlan.html @@ -62,6 +62,22 @@ {% trans "Description" %} {{ object.description|placeholder }} + + {% trans "Q-in-Q Role" %} + + {% if object.qinq_role %} + {% badge object.get_qinq_role_display bg_color=object.get_qinq_role_color %} + {% else %} + {{ ''|placeholder }} + {% endif %} + + + {% if object.qinq_role == 'c-vlan' %} + + {% trans "Q-in-Q SVLAN" %} + {{ object.qinq_svlan|linkify|placeholder }} + + {% endif %} {% trans "L2VPN" %} {{ object.l2vpn_termination.l2vpn|linkify|placeholder }} @@ -92,6 +108,21 @@ {% htmx_table 'ipam:prefix_list' vlan_id=object.pk %}
+ {% if object.qinq_role == 's-vlan' %} +
+

+ {% trans "Customer VLANs" %} + {% if perms.ipam.add_vlan %} + + {% endif %} +

+ {% htmx_table 'ipam:vlan_list' qinq_svlan_id=object.pk %} +
+ {% endif %} {% plugin_full_width_page object %}
diff --git a/netbox/templates/ipam/vlan_edit.html b/netbox/templates/ipam/vlan_edit.html index 814fc6b78..885844580 100644 --- a/netbox/templates/ipam/vlan_edit.html +++ b/netbox/templates/ipam/vlan_edit.html @@ -17,6 +17,14 @@ {% render_field form.tags %} +
+
+

{% trans "Q-in-Q (802.1ad)" %}

+
+ {% render_field form.qinq_role %} + {% render_field form.qinq_svlan %} +
+

{% trans "Tenancy" %}

diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 2c00cac96..9b7000def 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -89,6 +89,7 @@ class VMInterfaceSerializer(NetBoxModelSerializer): required=False, many=True ) + qinq_svlan = VLANSerializer(nested=True, required=False, allow_null=True) vlan_translation_policy = VLANTranslationPolicySerializer(nested=True, required=False, allow_null=True) vrf = VRFSerializer(nested=True, required=False, allow_null=True) l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) @@ -104,9 +105,9 @@ class VMInterfaceSerializer(NetBoxModelSerializer): model = VMInterface fields = [ 'id', 'url', 'display_url', 'display', 'virtual_machine', 'name', 'enabled', 'parent', 'bridge', 'mtu', - 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'vrf', 'l2vpn_termination', - 'tags', 'custom_fields', 'created', 'last_updated', 'count_ipaddresses', 'count_fhrp_groups', - 'vlan_translation_policy', + 'mac_address', 'description', 'mode', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', + 'vlan_translation_policy', 'vrf', 'l2vpn_termination', 'tags', 'custom_fields', 'created', 'last_updated', + 'count_ipaddresses', 'count_fhrp_groups', ] brief_fields = ('id', 'url', 'display', 'virtual_machine', 'name', 'description') diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 5971fc894..4527e7f4c 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -6,6 +6,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.forms.common import InterfaceCommonForm from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate +from ipam.choices import VLANQinQRoleChoices from ipam.models import IPAddress, VLAN, VLANGroup, VLANTranslationPolicy, VRF from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm @@ -338,6 +339,16 @@ class VMInterfaceForm(InterfaceCommonForm, VMComponentForm): 'available_on_virtualmachine': '$virtual_machine', } ) + qinq_svlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + label=_('Q-in-Q Service VLAN'), + query_params={ + 'group_id': '$vlan_group', + 'available_on_virtualmachine': '$virtual_machine', + 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, + } + ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -354,17 +365,20 @@ class VMInterfaceForm(InterfaceCommonForm, VMComponentForm): FieldSet('vrf', 'mac_address', name=_('Addressing')), FieldSet('mtu', 'enabled', name=_('Operation')), FieldSet('parent', 'bridge', name=_('Related Interfaces')), - FieldSet('mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vlan_translation_policy', name=_('802.1Q Switching')), + FieldSet( + 'mode', 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', + name=_('802.1Q Switching') + ), ) class Meta: model = VMInterface fields = [ 'virtual_machine', 'name', 'parent', 'bridge', 'enabled', 'mac_address', 'mtu', 'description', 'mode', - 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'vrf', 'tags', 'vlan_translation_policy', + 'vlan_group', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vlan_translation_policy', 'vrf', 'tags', ] labels = { - 'mode': '802.1Q Mode', + 'mode': _('802.1Q Mode'), } widgets = { 'mode': HTMXSelect(), diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index bed65a3b3..79b5cb216 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -100,6 +100,7 @@ class VMInterfaceType(IPAddressesMixin, ComponentType): bridge: Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')] | None untagged_vlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None vrf: Annotated["VRFType", strawberry.lazy('ipam.graphql.types')] | None + qinq_svlan: Annotated["VLANType", strawberry.lazy('ipam.graphql.types')] | None vlan_translation_policy: Annotated["VLANTranslationPolicyType", strawberry.lazy('ipam.graphql.types')] | None tagged_vlans: List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]] diff --git a/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py b/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py index e0992c9c8..3a6d5e481 100644 --- a/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py +++ b/netbox/virtualization/migrations/0042_vminterface_vlan_translation_policy.py @@ -1,5 +1,3 @@ -# Generated by Django 5.0.9 on 2024-10-11 19:45 - import django.db.models.deletion from django.db import migrations, models diff --git a/netbox/virtualization/migrations/0043_qinq_svlan.py b/netbox/virtualization/migrations/0043_qinq_svlan.py new file mode 100644 index 000000000..422289fb7 --- /dev/null +++ b/netbox/virtualization/migrations/0043_qinq_svlan.py @@ -0,0 +1,28 @@ +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0075_vlan_qinq'), + ('virtualization', '0042_vminterface_vlan_translation_policy'), + ] + + operations = [ + migrations.AddField( + model_name='vminterface', + name='qinq_svlan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)ss_svlan', to='ipam.vlan'), + ), + migrations.AlterField( + model_name='vminterface', + name='tagged_vlans', + field=models.ManyToManyField(blank=True, related_name='%(class)ss_as_tagged', to='ipam.vlan'), + ), + migrations.AlterField( + model_name='vminterface', + name='untagged_vlan', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='%(class)ss_as_untagged', to='ipam.vlan'), + ), + ] diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 0767b2c13..da8419e88 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -322,20 +322,6 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): max_length=100, blank=True ) - untagged_vlan = models.ForeignKey( - to='ipam.VLAN', - on_delete=models.SET_NULL, - related_name='vminterfaces_as_untagged', - null=True, - blank=True, - verbose_name=_('untagged VLAN') - ) - tagged_vlans = models.ManyToManyField( - to='ipam.VLAN', - related_name='vminterfaces_as_tagged', - blank=True, - verbose_name=_('tagged VLANs') - ) ip_addresses = GenericRelation( to='ipam.IPAddress', content_type_field='assigned_object_type', diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 8a2a26bb9..4a3138711 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -151,8 +151,8 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'created', - 'last_updated', + 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', + 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') @@ -175,7 +175,8 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'actions', + 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', + 'actions', ) default_columns = ('pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses') row_attrs = { diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 69728f67c..521064fc6 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -4,6 +4,7 @@ from rest_framework import status from dcim.choices import InterfaceModeChoices from dcim.models import Site from extras.models import ConfigTemplate +from ipam.choices import VLANQinQRoleChoices from ipam.models import VLAN, VRF from utilities.testing import APITestCase, APIViewTestCases, create_test_device, create_test_virtualmachine from virtualization.choices import * @@ -270,6 +271,7 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): VLAN(name='VLAN 1', vid=1), VLAN(name='VLAN 2', vid=2), VLAN(name='VLAN 3', vid=3), + VLAN(name='SVLAN 1', vid=1001, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), ) VLAN.objects.bulk_create(vlans) @@ -307,6 +309,12 @@ class VMInterfaceTest(APIViewTestCases.APIViewTestCase): 'untagged_vlan': vlans[2].pk, 'vrf': vrfs[2].pk, }, + { + 'virtual_machine': virtualmachine.pk, + 'name': 'Interface 7', + 'mode': InterfaceModeChoices.MODE_Q_IN_Q, + 'qinq_svlan': vlans[3].pk, + }, ] def test_bulk_delete_child_interfaces(self): diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index cd598274f..0c7079bba 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -1,7 +1,9 @@ from django.test import TestCase +from dcim.choices import InterfaceModeChoices from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup -from ipam.models import IPAddress, VLANTranslationPolicy, VRF +from ipam.choices import VLANQinQRoleChoices +from ipam.models import IPAddress, VLAN, VLANTranslationPolicy, VRF from tenancy.models import Tenant, TenantGroup from utilities.testing import ChangeLoggedFilterSetTests, create_test_device from virtualization.choices import * @@ -528,7 +530,7 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VMInterface.objects.all() filterset = VMInterfaceFilterSet - ignore_fields = ('tagged_vlans', 'untagged_vlan',) + ignore_fields = ('tagged_vlans', 'untagged_vlan', 'qinq_svlan') @classmethod def setUpTestData(cls): @@ -554,6 +556,13 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) VRF.objects.bulk_create(vrfs) + vlans = ( + VLAN(name='SVLAN 1', vid=1001, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(name='SVLAN 2', vid=1002, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + VLAN(name='SVLAN 3', vid=1003, qinq_role=VLANQinQRoleChoices.ROLE_SERVICE), + ) + VLAN.objects.bulk_create(vlans) + vms = ( VirtualMachine(name='Virtual Machine 1', cluster=clusters[0]), VirtualMachine(name='Virtual Machine 2', cluster=clusters[1]), @@ -596,7 +605,9 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): mtu=300, mac_address='00-00-00-00-00-03', vrf=vrfs[2], - description='foobar3' + description='foobar3', + mode=InterfaceModeChoices.MODE_Q_IN_Q, + qinq_svlan=vlans[0] ), ) VMInterface.objects.bulk_create(interfaces) @@ -667,6 +678,13 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'description': ['foobar1', 'foobar2']} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_vlan(self): + vlan = VLAN.objects.filter(qinq_role=VLANQinQRoleChoices.ROLE_SERVICE).first() + params = {'vlan_id': vlan.pk} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'vlan': vlan.vid} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + def test_vlan_translation_policy(self): vlan_translation_policies = VLANTranslationPolicy.objects.all()[:2] params = {'vlan_translation_policy_id': [vlan_translation_policies[0].pk, vlan_translation_policies[1].pk]} From 6dc75d8db1e7750f37ba5f50d65e05c430352146 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 1 Nov 2024 11:18:23 -0700 Subject: [PATCH 022/169] 7699 Add Scope to Cluster (#17848) * 7699 Add Scope to Cluster * 7699 Serializer * 7699 filterset * 7699 bulk_edit * 7699 bulk_import * 7699 model_form * 7699 graphql, tables * 7699 fixes * 7699 fixes * 7699 fixes * 7699 fixes * 7699 fix tests * 7699 fix graphql tests for clusters reference * 7699 fix dcim tests * 7699 fix ipam tests * 7699 fix tests * 7699 use mixin for model * 7699 change mixin name * 7699 scope form * 7699 scope form * 7699 scoped form, fitlerset * 7699 review changes * 7699 move ScopedFilterset * 7699 move CachedScopeMixin * 7699 review changes * 7699 review changes * 7699 refactor mixins * 7699 _sitegroup -> _site_group * 7699 update docstring * Misc cleanup * Update migrations --------- Co-authored-by: Jeremy Stretch --- docs/models/virtualization/cluster.md | 4 +- netbox/dcim/constants.py | 5 + netbox/dcim/filtersets.py | 58 ++++++++++ netbox/dcim/forms/mixins.py | 105 ++++++++++++++++++ netbox/dcim/graphql/types.py | 17 +++ netbox/dcim/models/devices.py | 11 +- netbox/dcim/models/mixins.py | 85 ++++++++++++++ netbox/dcim/tests/test_models.py | 9 +- netbox/extras/tests/test_models.py | 4 +- netbox/ipam/querysets.py | 2 +- netbox/ipam/tests/test_filtersets.py | 9 +- netbox/templates/virtualization/cluster.html | 8 +- .../api/serializers_/clusters.py | 31 +++++- netbox/virtualization/apps.py | 2 +- netbox/virtualization/filtersets.py | 42 +------ netbox/virtualization/forms/bulk_edit.py | 28 +---- netbox/virtualization/forms/bulk_import.py | 8 +- netbox/virtualization/forms/filtersets.py | 19 ++-- netbox/virtualization/forms/model_forms.py | 14 +-- netbox/virtualization/graphql/types.py | 15 ++- .../migrations/0044_cluster_scope.py | 51 +++++++++ .../0045_clusters_cached_relations.py | 94 ++++++++++++++++ netbox/virtualization/models/clusters.py | 48 +++++--- .../virtualization/models/virtualmachines.py | 4 +- netbox/virtualization/tables/clusters.py | 11 +- netbox/virtualization/tests/test_api.py | 10 +- .../virtualization/tests/test_filtersets.py | 18 +-- netbox/virtualization/tests/test_models.py | 9 +- netbox/virtualization/tests/test_views.py | 23 ++-- 29 files changed, 588 insertions(+), 156 deletions(-) create mode 100644 netbox/dcim/forms/mixins.py create mode 100644 netbox/virtualization/migrations/0044_cluster_scope.py create mode 100644 netbox/virtualization/migrations/0045_clusters_cached_relations.py diff --git a/docs/models/virtualization/cluster.md b/docs/models/virtualization/cluster.md index 50b5dbd1d..9acdb2bc4 100644 --- a/docs/models/virtualization/cluster.md +++ b/docs/models/virtualization/cluster.md @@ -23,6 +23,6 @@ The cluster's operational status. !!! tip Additional statuses may be defined by setting `Cluster.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter. -### Site +### Scope -The [site](../dcim/site.md) with which the cluster is associated. +The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) with which this cluster is associated. diff --git a/netbox/dcim/constants.py b/netbox/dcim/constants.py index ba3e6464b..4927b0198 100644 --- a/netbox/dcim/constants.py +++ b/netbox/dcim/constants.py @@ -123,3 +123,8 @@ COMPATIBLE_TERMINATION_TYPES = { 'powerport': ['poweroutlet', 'powerfeed'], 'rearport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport', 'circuittermination'], } + +# Models which can serve to scope an object by location +LOCATION_SCOPE_TYPES = ( + 'region', 'sitegroup', 'site', 'location', +) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 0371f882b..df66ad77b 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -73,6 +73,7 @@ __all__ = ( 'RearPortFilterSet', 'RearPortTemplateFilterSet', 'RegionFilterSet', + 'ScopedFilterSet', 'SiteFilterSet', 'SiteGroupFilterSet', 'VirtualChassisFilterSet', @@ -2344,3 +2345,60 @@ class InterfaceConnectionFilterSet(ConnectionFilterSet): class Meta: model = Interface fields = tuple() + + +class ScopedFilterSet(BaseFilterSet): + """ + Provides additional filtering functionality for location, site, etc.. for Scoped models. + """ + scope_type = ContentTypeFilter() + region_id = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + label=_('Region (ID)'), + ) + region = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + to_field_name='slug', + label=_('Region (slug)'), + ) + site_group_id = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + label=_('Site group (ID)'), + ) + site_group = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + to_field_name='slug', + label=_('Site group (slug)'), + ) + site_id = django_filters.ModelMultipleChoiceFilter( + queryset=Site.objects.all(), + field_name='_site', + label=_('Site (ID)'), + ) + site = django_filters.ModelMultipleChoiceFilter( + field_name='_site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label=_('Site (slug)'), + ) + location_id = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + label=_('Location (ID)'), + ) + location = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + to_field_name='slug', + label=_('Location (slug)'), + ) diff --git a/netbox/dcim/forms/mixins.py b/netbox/dcim/forms/mixins.py new file mode 100644 index 000000000..98862af10 --- /dev/null +++ b/netbox/dcim/forms/mixins.py @@ -0,0 +1,105 @@ +from django import forms +from django.contrib.contenttypes.models import ContentType +from django.core.exceptions import ObjectDoesNotExist +from django.utils.translation import gettext_lazy as _ + +from dcim.constants import LOCATION_SCOPE_TYPES +from dcim.models import Site +from utilities.forms import get_field_value +from utilities.forms.fields import ( + ContentTypeChoiceField, CSVContentTypeField, DynamicModelChoiceField, +) +from utilities.templatetags.builtins.filters import bettertitle +from utilities.forms.widgets import HTMXSelect + +__all__ = ( + 'ScopedBulkEditForm', + 'ScopedForm', + 'ScopedImportForm', +) + + +class ScopedForm(forms.Form): + scope_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=LOCATION_SCOPE_TYPES), + widget=HTMXSelect(), + required=False, + label=_('Scope type') + ) + scope = DynamicModelChoiceField( + label=_('Scope'), + queryset=Site.objects.none(), # Initial queryset + required=False, + disabled=True, + selector=True + ) + + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}) + + if instance is not None and instance.scope: + initial['scope'] = instance.scope + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + self._set_scoped_values() + + def clean(self): + super().clean() + + # Assign the selected scope (if any) + self.instance.scope = self.cleaned_data.get('scope') + + def _set_scoped_values(self): + if scope_type_id := get_field_value(self, 'scope_type'): + try: + scope_type = ContentType.objects.get(pk=scope_type_id) + model = scope_type.model_class() + self.fields['scope'].queryset = model.objects.all() + self.fields['scope'].widget.attrs['selector'] = model._meta.label_lower + self.fields['scope'].disabled = False + self.fields['scope'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass + + if self.instance and scope_type_id != self.instance.scope_type_id: + self.initial['scope'] = None + + +class ScopedBulkEditForm(forms.Form): + scope_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(model__in=LOCATION_SCOPE_TYPES), + widget=HTMXSelect(method='post', attrs={'hx-select': '#form_fields'}), + required=False, + label=_('Scope type') + ) + scope = DynamicModelChoiceField( + label=_('Scope'), + queryset=Site.objects.none(), # Initial queryset + required=False, + disabled=True, + selector=True + ) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + if scope_type_id := get_field_value(self, 'scope_type'): + try: + scope_type = ContentType.objects.get(pk=scope_type_id) + model = scope_type.model_class() + self.fields['scope'].queryset = model.objects.all() + self.fields['scope'].widget.attrs['selector'] = model._meta.label_lower + self.fields['scope'].disabled = False + self.fields['scope'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass + + +class ScopedImportForm(forms.Form): + scope_type = CSVContentTypeField( + queryset=ContentType.objects.filter(model__in=LOCATION_SCOPE_TYPES), + required=False, + label=_('Scope type (app & model)') + ) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 5965fdcec..6493ec6b1 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -463,6 +463,10 @@ class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, Organi devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] children: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]] + @strawberry_django.field + def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: + return self._clusters.all() + @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: return self.circuit_terminations.all() @@ -710,6 +714,10 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): def parent(self) -> Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None: return self.parent + @strawberry_django.field + def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: + return self._clusters.all() + @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: return self.circuit_terminations.all() @@ -735,9 +743,14 @@ class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] locations: List[Annotated["LocationType", strawberry.lazy('dcim.graphql.types')]] asns: List[Annotated["ASNType", strawberry.lazy('ipam.graphql.types')]] + circuit_terminations: List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]] clusters: List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]] vlans: List[Annotated["VLANType", strawberry.lazy('ipam.graphql.types')]] + @strawberry_django.field + def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: + return self._clusters.all() + @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: return self.circuit_terminations.all() @@ -758,6 +771,10 @@ class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): def parent(self) -> Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None: return self.parent + @strawberry_django.field + def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: + return self._clusters.all() + @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: return self.circuit_terminations.all() diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index b9ba2bb64..47f4ee6c9 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -958,10 +958,17 @@ class Device( }) # A Device can only be assigned to a Cluster in the same Site (or no Site) - if self.cluster and self.cluster.site is not None and self.cluster.site != self.site: + if self.cluster and self.cluster._site is not None and self.cluster._site != self.site: raise ValidationError({ 'cluster': _("The assigned cluster belongs to a different site ({site})").format( - site=self.cluster.site + site=self.cluster._site + ) + }) + + if self.cluster and self.cluster._location is not None and self.cluster._location != self.location: + raise ValidationError({ + 'cluster': _("The assigned cluster belongs to a different location ({location})").format( + site=self.cluster._location ) }) diff --git a/netbox/dcim/models/mixins.py b/netbox/dcim/models/mixins.py index c9be451a0..1df3364c4 100644 --- a/netbox/dcim/models/mixins.py +++ b/netbox/dcim/models/mixins.py @@ -1,6 +1,10 @@ +from django.apps import apps +from django.contrib.contenttypes.fields import GenericForeignKey from django.db import models +from dcim.constants import LOCATION_SCOPE_TYPES __all__ = ( + 'CachedScopeMixin', 'RenderConfigMixin', ) @@ -27,3 +31,84 @@ class RenderConfigMixin(models.Model): return self.role.config_template if self.platform and self.platform.config_template: return self.platform.config_template + + +class CachedScopeMixin(models.Model): + """ + Mixin for adding a GenericForeignKey scope to a model that can point to a Region, SiteGroup, Site, or Location. + Includes cached fields for each to allow efficient filtering. Appropriate validation must be done in the clean() + method as this does not have any as validation is generally model-specific. + """ + scope_type = models.ForeignKey( + to='contenttypes.ContentType', + on_delete=models.PROTECT, + limit_choices_to=models.Q(model__in=LOCATION_SCOPE_TYPES), + related_name='+', + blank=True, + null=True + ) + scope_id = models.PositiveBigIntegerField( + blank=True, + null=True + ) + scope = GenericForeignKey( + ct_field='scope_type', + fk_field='scope_id' + ) + + _location = models.ForeignKey( + to='dcim.Location', + on_delete=models.CASCADE, + related_name='_%(class)ss', + blank=True, + null=True + ) + _site = models.ForeignKey( + to='dcim.Site', + on_delete=models.CASCADE, + related_name='_%(class)ss', + blank=True, + null=True + ) + _region = models.ForeignKey( + to='dcim.Region', + on_delete=models.CASCADE, + related_name='_%(class)ss', + blank=True, + null=True + ) + _site_group = models.ForeignKey( + to='dcim.SiteGroup', + on_delete=models.CASCADE, + related_name='_%(class)ss', + blank=True, + null=True + ) + + class Meta: + abstract = True + + def save(self, *args, **kwargs): + # Cache objects associated with the terminating object (for filtering) + self.cache_related_objects() + + super().save(*args, **kwargs) + + def cache_related_objects(self): + self._region = self._site_group = self._site = self._location = None + if self.scope_type: + scope_type = self.scope_type.model_class() + if scope_type == apps.get_model('dcim', 'region'): + self._region = self.scope + elif scope_type == apps.get_model('dcim', 'sitegroup'): + self._site_group = self.scope + elif scope_type == apps.get_model('dcim', 'site'): + self._region = self.scope.region + self._site_group = self.scope.group + self._site = self.scope + elif scope_type == apps.get_model('dcim', 'location'): + self._region = self.scope.site.region + self._site_group = self.scope.site.group + self._site = self.scope.site + self._location = self.scope + cache_related_objects.alters_data = True diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index f0fe4da3b..8d43d67ea 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -601,11 +601,12 @@ class DeviceTestCase(TestCase): Site.objects.bulk_create(sites) clusters = ( - Cluster(name='Cluster 1', type=cluster_type, site=sites[0]), - Cluster(name='Cluster 2', type=cluster_type, site=sites[1]), - Cluster(name='Cluster 3', type=cluster_type, site=None), + Cluster(name='Cluster 1', type=cluster_type, scope=sites[0]), + Cluster(name='Cluster 2', type=cluster_type, scope=sites[1]), + Cluster(name='Cluster 3', type=cluster_type, scope=None), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() device_type = DeviceType.objects.first() device_role = DeviceRole.objects.first() diff --git a/netbox/extras/tests/test_models.py b/netbox/extras/tests/test_models.py index 188a06a3f..c90390dd1 100644 --- a/netbox/extras/tests/test_models.py +++ b/netbox/extras/tests/test_models.py @@ -274,7 +274,7 @@ class ConfigContextTest(TestCase): name="Cluster", group=cluster_group, type=cluster_type, - site=site, + scope=site, ) region_context = ConfigContext.objects.create( @@ -366,7 +366,7 @@ class ConfigContextTest(TestCase): """ site = Site.objects.first() cluster_type = ClusterType.objects.create(name="Cluster Type") - cluster = Cluster.objects.create(name="Cluster", type=cluster_type, site=site) + cluster = Cluster.objects.create(name="Cluster", type=cluster_type, scope=site) vm_role = DeviceRole.objects.first() # Create a ConfigContext associated with the site diff --git a/netbox/ipam/querysets.py b/netbox/ipam/querysets.py index 771e9b3b9..77ab8194a 100644 --- a/netbox/ipam/querysets.py +++ b/netbox/ipam/querysets.py @@ -148,7 +148,7 @@ class VLANQuerySet(RestrictedQuerySet): # Find all relevant VLANGroups q = Q() - site = vm.site or vm.cluster.site + site = vm.site or vm.cluster._site if vm.cluster: # Add VLANGroups scoped to the assigned cluster (or its group) q |= Q( diff --git a/netbox/ipam/tests/test_filtersets.py b/netbox/ipam/tests/test_filtersets.py index f651c970d..28e8cda1e 100644 --- a/netbox/ipam/tests/test_filtersets.py +++ b/netbox/ipam/tests/test_filtersets.py @@ -1675,11 +1675,12 @@ class VLANTestCase(TestCase, ChangeLoggedFilterSetTests): cluster_type = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') clusters = ( - Cluster(name='Cluster 1', type=cluster_type, group=cluster_groups[0], site=sites[0]), - Cluster(name='Cluster 2', type=cluster_type, group=cluster_groups[1], site=sites[1]), - Cluster(name='Cluster 3', type=cluster_type, group=cluster_groups[2], site=sites[2]), + Cluster(name='Cluster 1', type=cluster_type, group=cluster_groups[0], scope=sites[0]), + Cluster(name='Cluster 2', type=cluster_type, group=cluster_groups[1], scope=sites[1]), + Cluster(name='Cluster 3', type=cluster_type, group=cluster_groups[2], scope=sites[2]), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() virtual_machines = ( VirtualMachine(name='Virtual Machine 1', cluster=clusters[0]), diff --git a/netbox/templates/virtualization/cluster.html b/netbox/templates/virtualization/cluster.html index d79d8075c..4155dacb2 100644 --- a/netbox/templates/virtualization/cluster.html +++ b/netbox/templates/virtualization/cluster.html @@ -39,8 +39,12 @@ - {% trans "Site" %} - {{ object.site|linkify|placeholder }} + {% trans "Scope" %} + {% if object.scope %} + {{ object.scope|linkify }} ({% trans object.scope_type.name %}) + {% else %} + {{ ''|placeholder }} + {% endif %}
diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index b64b6e7ba..101a5b5a3 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -1,9 +1,13 @@ -from dcim.api.serializers_.sites import SiteSerializer -from netbox.api.fields import ChoiceField, RelatedObjectCountField +from dcim.constants import LOCATION_SCOPE_TYPES +from django.contrib.contenttypes.models import ContentType +from drf_spectacular.utils import extend_schema_field +from rest_framework import serializers +from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.serializers import NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer from virtualization.choices import * from virtualization.models import Cluster, ClusterGroup, ClusterType +from utilities.api import get_serializer_for_model __all__ = ( 'ClusterGroupSerializer', @@ -45,7 +49,16 @@ class ClusterSerializer(NetBoxModelSerializer): group = ClusterGroupSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=ClusterStatusChoices, required=False) tenant = TenantSerializer(nested=True, required=False, allow_null=True) - site = SiteSerializer(nested=True, required=False, allow_null=True, default=None) + scope_type = ContentTypeField( + queryset=ContentType.objects.filter( + model__in=LOCATION_SCOPE_TYPES + ), + allow_null=True, + required=False, + default=None + ) + scope_id = serializers.IntegerField(allow_null=True, required=False, default=None) + scope = serializers.SerializerMethodField(read_only=True) # Related object counts device_count = RelatedObjectCountField('devices') @@ -54,8 +67,18 @@ class ClusterSerializer(NetBoxModelSerializer): class Meta: model = Cluster fields = [ - 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'site', + 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'scope_type', 'scope_id', 'scope', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', 'virtualmachine_count', ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'virtualmachine_count') + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_scope(self, obj): + if obj.scope_id is None: + return None + serializer = get_serializer_for_model(obj.scope) + context = {'request': self.context['request']} + return serializer(obj.scope, nested=True, context=context).data + + diff --git a/netbox/virtualization/apps.py b/netbox/virtualization/apps.py index ebcc591bf..65ce0f112 100644 --- a/netbox/virtualization/apps.py +++ b/netbox/virtualization/apps.py @@ -17,7 +17,7 @@ class VirtualizationConfig(AppConfig): # Register denormalized fields denormalized.register(VirtualMachine, 'cluster', { - 'site': 'site', + 'site': '_site', }) # Register counters diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index ec0831f9f..ac72bea12 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -2,7 +2,7 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ -from dcim.filtersets import CommonInterfaceFilterSet +from dcim.filtersets import CommonInterfaceFilterSet, ScopedFilterSet from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate @@ -37,43 +37,7 @@ class ClusterGroupFilterSet(OrganizationalModelFilterSet, ContactModelFilterSet) fields = ('id', 'name', 'slug', 'description') -class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilterSet): - region_id = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='site__region', - lookup_expr='in', - label=_('Region (ID)'), - ) - region = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='site__region', - lookup_expr='in', - to_field_name='slug', - label=_('Region (slug)'), - ) - site_group_id = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='site__group', - lookup_expr='in', - label=_('Site group (ID)'), - ) - site_group = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='site__group', - lookup_expr='in', - to_field_name='slug', - label=_('Site group (slug)'), - ) - site_id = django_filters.ModelMultipleChoiceFilter( - queryset=Site.objects.all(), - label=_('Site (ID)'), - ) - site = django_filters.ModelMultipleChoiceFilter( - field_name='site__slug', - queryset=Site.objects.all(), - to_field_name='slug', - label=_('Site (slug)'), - ) +class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ScopedFilterSet, ContactModelFilterSet): group_id = django_filters.ModelMultipleChoiceFilter( queryset=ClusterGroup.objects.all(), label=_('Parent group (ID)'), @@ -101,7 +65,7 @@ class ClusterFilterSet(NetBoxModelFilterSet, TenancyFilterSet, ContactModelFilte class Meta: model = Cluster - fields = ('id', 'name', 'description') + fields = ('id', 'name', 'description', 'scope_id') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 2bd3434ac..aaeb259b9 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -3,7 +3,8 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import InterfaceModeChoices from dcim.constants import INTERFACE_MTU_MAX, INTERFACE_MTU_MIN -from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup +from dcim.forms.mixins import ScopedBulkEditForm +from dcim.models import Device, DeviceRole, Platform, Site from extras.models import ConfigTemplate from ipam.models import VLAN, VLANGroup, VRF from netbox.forms import NetBoxModelBulkEditForm @@ -55,7 +56,7 @@ class ClusterGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class ClusterBulkEditForm(NetBoxModelBulkEditForm): +class ClusterBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): type = DynamicModelChoiceField( label=_('Type'), queryset=ClusterType.objects.all(), @@ -77,25 +78,6 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): queryset=Tenant.objects.all(), required=False ) - region = DynamicModelChoiceField( - label=_('Region'), - queryset=Region.objects.all(), - required=False, - ) - site_group = DynamicModelChoiceField( - label=_('Site group'), - queryset=SiteGroup.objects.all(), - required=False, - ) - site = DynamicModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), - required=False, - query_params={ - 'region_id': '$region', - 'group_id': '$site_group', - } - ) description = forms.CharField( label=_('Description'), max_length=200, @@ -106,10 +88,10 @@ class ClusterBulkEditForm(NetBoxModelBulkEditForm): model = Cluster fieldsets = ( FieldSet('type', 'group', 'status', 'tenant', 'description'), - FieldSet('region', 'site_group', 'site', name=_('Site')), + FieldSet('scope_type', 'scope', name=_('Scope')), ) nullable_fields = ( - 'group', 'site', 'tenant', 'description', 'comments', + 'group', 'scope', 'tenant', 'description', 'comments', ) diff --git a/netbox/virtualization/forms/bulk_import.py b/netbox/virtualization/forms/bulk_import.py index 17efc567a..9ccdd68f7 100644 --- a/netbox/virtualization/forms/bulk_import.py +++ b/netbox/virtualization/forms/bulk_import.py @@ -1,6 +1,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import InterfaceModeChoices +from dcim.forms.mixins import ScopedImportForm from dcim.models import Device, DeviceRole, Platform, Site from extras.models import ConfigTemplate from ipam.models import VRF @@ -36,7 +37,7 @@ class ClusterGroupImportForm(NetBoxModelImportForm): fields = ('name', 'slug', 'description', 'tags') -class ClusterImportForm(NetBoxModelImportForm): +class ClusterImportForm(ScopedImportForm, NetBoxModelImportForm): type = CSVModelChoiceField( label=_('Type'), queryset=ClusterType.objects.all(), @@ -72,7 +73,10 @@ class ClusterImportForm(NetBoxModelImportForm): class Meta: model = Cluster - fields = ('name', 'type', 'group', 'status', 'site', 'tenant', 'description', 'comments', 'tags') + fields = ('name', 'type', 'group', 'status', 'scope_type', 'scope_id', 'tenant', 'description', 'comments', 'tags') + labels = { + 'scope_id': _('Scope ID'), + } class VirtualMachineImportForm(NetBoxModelImportForm): diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 7c040d948..695641e4e 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -1,7 +1,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ -from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, Location, Platform, Region, Site, SiteGroup from extras.forms import LocalConfigContextFilterForm from extras.models import ConfigTemplate from ipam.models import VRF @@ -43,7 +43,7 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('group_id', 'type_id', 'status', name=_('Attributes')), - FieldSet('region_id', 'site_group_id', 'site_id', name=_('Location')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Scope')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('contact', 'contact_role', 'contact_group', name=_('Contacts')), ) @@ -58,11 +58,6 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi required=False, label=_('Region') ) - status = forms.MultipleChoiceField( - label=_('Status'), - choices=ClusterStatusChoices, - required=False - ) site_group_id = DynamicModelMultipleChoiceField( queryset=SiteGroup.objects.all(), required=False, @@ -78,6 +73,16 @@ class ClusterFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFi }, label=_('Site') ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + label=_('Location') + ) + status = forms.MultipleChoiceField( + label=_('Status'), + choices=ClusterStatusChoices, + required=False + ) group_id = DynamicModelMultipleChoiceField( queryset=ClusterGroup.objects.all(), required=False, diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 4527e7f4c..44c67d389 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -4,6 +4,7 @@ from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ from dcim.forms.common import InterfaceCommonForm +from dcim.forms.mixins import ScopedForm from dcim.models import Device, DeviceRole, Platform, Rack, Region, Site, SiteGroup from extras.models import ConfigTemplate from ipam.choices import VLANQinQRoleChoices @@ -58,7 +59,7 @@ class ClusterGroupForm(NetBoxModelForm): ) -class ClusterForm(TenancyForm, NetBoxModelForm): +class ClusterForm(TenancyForm, ScopedForm, NetBoxModelForm): type = DynamicModelChoiceField( label=_('Type'), queryset=ClusterType.objects.all() @@ -68,23 +69,18 @@ class ClusterForm(TenancyForm, NetBoxModelForm): queryset=ClusterGroup.objects.all(), required=False ) - site = DynamicModelChoiceField( - label=_('Site'), - queryset=Site.objects.all(), - required=False, - selector=True - ) comments = CommentField() fieldsets = ( - FieldSet('name', 'type', 'group', 'site', 'status', 'description', 'tags', name=_('Cluster')), + FieldSet('name', 'type', 'group', 'status', 'description', 'tags', name=_('Cluster')), + FieldSet('scope_type', 'scope', name=_('Scope')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), ) class Meta: model = Cluster fields = ( - 'name', 'type', 'group', 'status', 'tenant', 'site', 'description', 'comments', 'tags', + 'name', 'type', 'group', 'status', 'tenant', 'scope_type', 'description', 'comments', 'tags', ) diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 79b5cb216..f51e0e3f5 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -1,4 +1,4 @@ -from typing import Annotated, List +from typing import Annotated, List, Union import strawberry import strawberry_django @@ -31,18 +31,25 @@ class ComponentType(NetBoxObjectType): @strawberry_django.type( models.Cluster, - fields='__all__', + exclude=('scope_type', 'scope_id', '_location', '_region', '_site', '_site_group'), filters=ClusterFilter ) class ClusterType(VLANGroupsMixin, NetBoxObjectType): type: Annotated["ClusterTypeType", strawberry.lazy('virtualization.graphql.types')] | None group: Annotated["ClusterGroupType", strawberry.lazy('virtualization.graphql.types')] | None tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None - site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] | None - virtual_machines: List[Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')]] devices: List[Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')]] + @strawberry_django.field + def scope(self) -> Annotated[Union[ + Annotated["LocationType", strawberry.lazy('dcim.graphql.types')], + Annotated["RegionType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteType", strawberry.lazy('dcim.graphql.types')], + ], strawberry.union("ClusterScopeType")] | None: + return self.scope + @strawberry_django.type( models.ClusterGroup, diff --git a/netbox/virtualization/migrations/0044_cluster_scope.py b/netbox/virtualization/migrations/0044_cluster_scope.py new file mode 100644 index 000000000..63a888ac3 --- /dev/null +++ b/netbox/virtualization/migrations/0044_cluster_scope.py @@ -0,0 +1,51 @@ +import django.db.models.deletion +from django.db import migrations, models + + +def copy_site_assignments(apps, schema_editor): + """ + Copy site ForeignKey values to the scope GFK. + """ + ContentType = apps.get_model('contenttypes', 'ContentType') + Cluster = apps.get_model('virtualization', 'Cluster') + Site = apps.get_model('dcim', 'Site') + + Cluster.objects.filter(site__isnull=False).update( + scope_type=ContentType.objects.get_for_model(Site), + scope_id=models.F('site_id') + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('virtualization', '0043_qinq_svlan'), + ] + + operations = [ + migrations.AddField( + model_name='cluster', + name='scope_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='cluster', + name='scope_type', + field=models.ForeignKey( + blank=True, + limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location'))), + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='+', + to='contenttypes.contenttype', + ), + ), + + # Copy over existing site assignments + migrations.RunPython( + code=copy_site_assignments, + reverse_code=migrations.RunPython.noop + ), + + ] diff --git a/netbox/virtualization/migrations/0045_clusters_cached_relations.py b/netbox/virtualization/migrations/0045_clusters_cached_relations.py new file mode 100644 index 000000000..ff851aa7c --- /dev/null +++ b/netbox/virtualization/migrations/0045_clusters_cached_relations.py @@ -0,0 +1,94 @@ +import django.db.models.deletion +from django.db import migrations, models + + +def populate_denormalized_fields(apps, schema_editor): + """ + Copy the denormalized fields for _region, _site_group and _site from existing site field. + """ + Cluster = apps.get_model('virtualization', 'Cluster') + + clusters = Cluster.objects.filter(site__isnull=False).prefetch_related('site') + for cluster in clusters: + cluster._region_id = cluster.site.region_id + cluster._site_group_id = cluster.site.group_id + cluster._site_id = cluster.site_id + # Note: Location cannot be set prior to migration + + Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site']) + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0044_cluster_scope'), + ] + + operations = [ + migrations.AddField( + model_name='cluster', + name='_location', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.location', + ), + ), + migrations.AddField( + model_name='cluster', + name='_region', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.region', + ), + ), + migrations.AddField( + model_name='cluster', + name='_site', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.site', + ), + ), + migrations.AddField( + model_name='cluster', + name='_site_group', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.sitegroup', + ), + ), + + # Populate denormalized FK values + migrations.RunPython( + code=populate_denormalized_fields, + reverse_code=migrations.RunPython.noop + ), + + migrations.RemoveConstraint( + model_name='cluster', + name='virtualization_cluster_unique_site_name', + ), + # Delete the site ForeignKey + migrations.RemoveField( + model_name='cluster', + name='site', + ), + migrations.AddConstraint( + model_name='cluster', + constraint=models.UniqueConstraint( + fields=('_site', 'name'), name='virtualization_cluster_unique__site_name' + ), + ), + ] diff --git a/netbox/virtualization/models/clusters.py b/netbox/virtualization/models/clusters.py index b8921c603..601ee7f23 100644 --- a/netbox/virtualization/models/clusters.py +++ b/netbox/virtualization/models/clusters.py @@ -1,9 +1,11 @@ +from django.apps import apps from django.contrib.contenttypes.fields import GenericRelation from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import gettext_lazy as _ from dcim.models import Device +from dcim.models.mixins import CachedScopeMixin from netbox.models import OrganizationalModel, PrimaryModel from netbox.models.features import ContactsMixin from virtualization.choices import * @@ -42,7 +44,7 @@ class ClusterGroup(ContactsMixin, OrganizationalModel): verbose_name_plural = _('cluster groups') -class Cluster(ContactsMixin, PrimaryModel): +class Cluster(ContactsMixin, CachedScopeMixin, PrimaryModel): """ A cluster of VirtualMachines. Each Cluster may optionally be associated with one or more Devices. """ @@ -76,13 +78,6 @@ class Cluster(ContactsMixin, PrimaryModel): blank=True, null=True ) - site = models.ForeignKey( - to='dcim.Site', - on_delete=models.PROTECT, - related_name='clusters', - blank=True, - null=True - ) # Generic relations vlan_groups = GenericRelation( @@ -93,7 +88,7 @@ class Cluster(ContactsMixin, PrimaryModel): ) clone_fields = ( - 'type', 'group', 'status', 'tenant', 'site', + 'scope_type', 'scope_id', 'type', 'group', 'status', 'tenant', ) prerequisite_models = ( 'virtualization.ClusterType', @@ -107,8 +102,8 @@ class Cluster(ContactsMixin, PrimaryModel): name='%(app_label)s_%(class)s_unique_group_name' ), models.UniqueConstraint( - fields=('site', 'name'), - name='%(app_label)s_%(class)s_unique_site_name' + fields=('_site', 'name'), + name='%(app_label)s_%(class)s_unique__site_name' ), ) verbose_name = _('cluster') @@ -123,11 +118,28 @@ class Cluster(ContactsMixin, PrimaryModel): def clean(self): super().clean() + site = location = None + if self.scope_type: + scope_type = self.scope_type.model_class() + if scope_type == apps.get_model('dcim', 'site'): + site = self.scope + elif scope_type == apps.get_model('dcim', 'location'): + location = self.scope + site = location.site + # If the Cluster is assigned to a Site, verify that all host Devices belong to that Site. - if not self._state.adding and self.site: - if nonsite_devices := Device.objects.filter(cluster=self).exclude(site=self.site).count(): - raise ValidationError({ - 'site': _( - "{count} devices are assigned as hosts for this cluster but are not in site {site}" - ).format(count=nonsite_devices, site=self.site) - }) + if not self._state.adding: + if site: + if nonsite_devices := Device.objects.filter(cluster=self).exclude(site=site).count(): + raise ValidationError({ + 'scope': _( + "{count} devices are assigned as hosts for this cluster but are not in site {site}" + ).format(count=nonsite_devices, site=site) + }) + if location: + if nonlocation_devices := Device.objects.filter(cluster=self).exclude(location=location).count(): + raise ValidationError({ + 'scope': _( + "{count} devices are assigned as hosts for this cluster but are not in location {location}" + ).format(count=nonlocation_devices, location=location) + }) diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index da8419e88..4ee41e403 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -181,7 +181,7 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co }) # Validate site for cluster & VM - if self.cluster and self.site and self.cluster.site and self.cluster.site != self.site: + if self.cluster and self.site and self.cluster._site and self.cluster._site != self.site: raise ValidationError({ 'cluster': _( 'The selected cluster ({cluster}) is not assigned to this site ({site}).' @@ -238,7 +238,7 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co # Assign site from cluster if not set if self.cluster and not self.site: - self.site = self.cluster.site + self.site = self.cluster._site super().save(*args, **kwargs) diff --git a/netbox/virtualization/tables/clusters.py b/netbox/virtualization/tables/clusters.py index d3c799fb9..91807e35b 100644 --- a/netbox/virtualization/tables/clusters.py +++ b/netbox/virtualization/tables/clusters.py @@ -73,8 +73,11 @@ class ClusterTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): status = columns.ChoiceFieldColumn( verbose_name=_('Status'), ) - site = tables.Column( - verbose_name=_('Site'), + scope_type = columns.ContentTypeColumn( + verbose_name=_('Scope Type'), + ) + scope = tables.Column( + verbose_name=_('Scope'), linkify=True ) device_count = columns.LinkedCountColumn( @@ -97,7 +100,7 @@ class ClusterTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): class Meta(NetBoxTable.Meta): model = Cluster fields = ( - 'pk', 'id', 'name', 'type', 'group', 'status', 'tenant', 'tenant_group', 'site', 'description', 'comments', - 'device_count', 'vm_count', 'contacts', 'tags', 'created', 'last_updated', + 'pk', 'id', 'name', 'type', 'group', 'status', 'tenant', 'tenant_group', 'scope', 'scope_type', 'description', + 'comments', 'device_count', 'vm_count', 'contacts', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'type', 'group', 'status', 'tenant', 'site', 'device_count', 'vm_count') diff --git a/netbox/virtualization/tests/test_api.py b/netbox/virtualization/tests/test_api.py index 521064fc6..149b64684 100644 --- a/netbox/virtualization/tests/test_api.py +++ b/netbox/virtualization/tests/test_api.py @@ -113,7 +113,8 @@ class ClusterTest(APIViewTestCases.APIViewTestCase): Cluster(name='Cluster 2', type=cluster_types[0], group=cluster_groups[0], status=ClusterStatusChoices.STATUS_PLANNED), Cluster(name='Cluster 3', type=cluster_types[0], group=cluster_groups[0], status=ClusterStatusChoices.STATUS_PLANNED), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() cls.create_data = [ { @@ -157,11 +158,12 @@ class VirtualMachineTest(APIViewTestCases.APIViewTestCase): Site.objects.bulk_create(sites) clusters = ( - Cluster(name='Cluster 1', type=clustertype, site=sites[0], group=clustergroup), - Cluster(name='Cluster 2', type=clustertype, site=sites[1], group=clustergroup), + Cluster(name='Cluster 1', type=clustertype, scope=sites[0], group=clustergroup), + Cluster(name='Cluster 2', type=clustertype, scope=sites[1], group=clustergroup), Cluster(name='Cluster 3', type=clustertype), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() device1 = create_test_device('device1', site=sites[0], cluster=clusters[0]) device2 = create_test_device('device2', site=sites[1], cluster=clusters[1]) diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index 0c7079bba..5a5bf2325 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -138,7 +138,7 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests): type=cluster_types[0], group=cluster_groups[0], status=ClusterStatusChoices.STATUS_PLANNED, - site=sites[0], + scope=sites[0], tenant=tenants[0], description='foobar1' ), @@ -147,7 +147,7 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests): type=cluster_types[1], group=cluster_groups[1], status=ClusterStatusChoices.STATUS_STAGING, - site=sites[1], + scope=sites[1], tenant=tenants[1], description='foobar2' ), @@ -156,12 +156,13 @@ class ClusterTestCase(TestCase, ChangeLoggedFilterSetTests): type=cluster_types[2], group=cluster_groups[2], status=ClusterStatusChoices.STATUS_ACTIVE, - site=sites[2], + scope=sites[2], tenant=tenants[2], description='foobar3' ), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() def test_q(self): params = {'q': 'foobar1'} @@ -274,11 +275,12 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): Site.objects.bulk_create(sites) clusters = ( - Cluster(name='Cluster 1', type=cluster_types[0], group=cluster_groups[0], site=sites[0]), - Cluster(name='Cluster 2', type=cluster_types[1], group=cluster_groups[1], site=sites[1]), - Cluster(name='Cluster 3', type=cluster_types[2], group=cluster_groups[2], site=sites[2]), + Cluster(name='Cluster 1', type=cluster_types[0], group=cluster_groups[0], scope=sites[0]), + Cluster(name='Cluster 2', type=cluster_types[1], group=cluster_groups[1], scope=sites[1]), + Cluster(name='Cluster 3', type=cluster_types[2], group=cluster_groups[2], scope=sites[2]), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() platforms = ( Platform(name='Platform 1', slug='platform-1'), diff --git a/netbox/virtualization/tests/test_models.py b/netbox/virtualization/tests/test_models.py index a4e8d7947..7be423bf1 100644 --- a/netbox/virtualization/tests/test_models.py +++ b/netbox/virtualization/tests/test_models.py @@ -54,11 +54,12 @@ class VirtualMachineTestCase(TestCase): Site.objects.bulk_create(sites) clusters = ( - Cluster(name='Cluster 1', type=cluster_type, site=sites[0]), - Cluster(name='Cluster 2', type=cluster_type, site=sites[1]), - Cluster(name='Cluster 3', type=cluster_type, site=None), + Cluster(name='Cluster 1', type=cluster_type, scope=sites[0]), + Cluster(name='Cluster 2', type=cluster_type, scope=sites[1]), + Cluster(name='Cluster 3', type=cluster_type, scope=None), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() # VM with site only should pass VirtualMachine(name='vm1', site=sites[0]).full_clean() diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index 3c6a058c9..b9cb7b437 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -1,3 +1,4 @@ +from django.contrib.contenttypes.models import ContentType from django.test import override_settings from django.urls import reverse from netaddr import EUI @@ -117,11 +118,12 @@ class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase): ClusterType.objects.bulk_create(clustertypes) clusters = ( - Cluster(name='Cluster 1', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]), - Cluster(name='Cluster 2', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]), - Cluster(name='Cluster 3', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, site=sites[0]), + Cluster(name='Cluster 1', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, scope=sites[0]), + Cluster(name='Cluster 2', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, scope=sites[0]), + Cluster(name='Cluster 3', group=clustergroups[0], type=clustertypes[0], status=ClusterStatusChoices.STATUS_ACTIVE, scope=sites[0]), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() tags = create_tags('Alpha', 'Bravo', 'Charlie') @@ -131,7 +133,8 @@ class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'type': clustertypes[1].pk, 'status': ClusterStatusChoices.STATUS_OFFLINE, 'tenant': None, - 'site': sites[1].pk, + 'scope_type': ContentType.objects.get_for_model(Site).pk, + 'scope': sites[1].pk, 'comments': 'Some comments', 'tags': [t.pk for t in tags], } @@ -155,7 +158,6 @@ class ClusterTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'type': clustertypes[1].pk, 'status': ClusterStatusChoices.STATUS_OFFLINE, 'tenant': None, - 'site': sites[1].pk, 'comments': 'New comments', } @@ -201,10 +203,11 @@ class VirtualMachineTestCase(ViewTestCases.PrimaryObjectViewTestCase): clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') clusters = ( - Cluster(name='Cluster 1', type=clustertype, site=sites[0]), - Cluster(name='Cluster 2', type=clustertype, site=sites[1]), + Cluster(name='Cluster 1', type=clustertype, scope=sites[0]), + Cluster(name='Cluster 2', type=clustertype, scope=sites[1]), ) - Cluster.objects.bulk_create(clusters) + for cluster in clusters: + cluster.save() devices = ( create_test_device('device1', site=sites[0], cluster=clusters[0]), @@ -292,7 +295,7 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): site = Site.objects.create(name='Site 1', slug='site-1') role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') clustertype = ClusterType.objects.create(name='Cluster Type 1', slug='cluster-type-1') - cluster = Cluster.objects.create(name='Cluster 1', type=clustertype, site=site) + cluster = Cluster.objects.create(name='Cluster 1', type=clustertype, scope=site) virtualmachines = ( VirtualMachine(name='Virtual Machine 1', site=site, cluster=cluster, role=role), VirtualMachine(name='Virtual Machine 2', site=site, cluster=cluster, role=role), From 4bba92617d88f1eb63e9fc8894d54a928a34d9f2 Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Fri, 1 Nov 2024 19:56:08 +0100 Subject: [PATCH 023/169] Closes #16971: Add system jobs (#17716) * Fix check for existing jobs If a job is to be enqueued once and no specific scheduled time is specified, any scheduled time of existing jobs will be valid. Only if a specific scheduled time is specified for 'enqueue_once()' can it be evaluated. * Allow system jobs to be registered A new registry key allows background system jobs to be registered and automatically scheduled when rqworker starts. * Test scheduling of system jobs * Fix plugins scheduled job documentation The documentation reflected a non-production state of the JobRunner framework left over from development. Now a more practical example demonstrates the usage. * Allow plugins to register system jobs * Rename system job metadata To clarify which meta-attributes belong to system jobs, each of them is now prefixed with 'system_'. * Add predefined job interval choices * Remove 'system_enabled' JobRunner attribute Previously, the 'system_enabled' attribute was used to control whether a job should run or not. However, this can also be accomplished by evaluating the job's interval. * Fix test * Use a decorator to register system jobs * Specify interval when registering system job * Update documentation --------- Co-authored-by: Jeremy Stretch --- docs/plugins/development/background-jobs.md | 53 +++++++++++++++----- docs/plugins/development/data-backends.md | 2 +- netbox/core/choices.py | 14 ++++++ netbox/core/management/commands/rqworker.py | 11 ++++ netbox/netbox/jobs.py | 21 +++++++- netbox/netbox/registry.py | 1 + netbox/netbox/tests/dummy_plugin/__init__.py | 5 ++ netbox/netbox/tests/dummy_plugin/jobs.py | 9 ++++ netbox/netbox/tests/test_jobs.py | 36 +++++++++++++ netbox/netbox/tests/test_plugins.py | 9 ++++ 10 files changed, 147 insertions(+), 14 deletions(-) create mode 100644 netbox/netbox/tests/dummy_plugin/jobs.py diff --git a/docs/plugins/development/background-jobs.md b/docs/plugins/development/background-jobs.md index 873390a58..d51981b9e 100644 --- a/docs/plugins/development/background-jobs.md +++ b/docs/plugins/development/background-jobs.md @@ -29,6 +29,9 @@ class MyTestJob(JobRunner): You can schedule the background job from within your code (e.g. from a model's `save()` method or a view) by calling `MyTestJob.enqueue()`. This method passes through all arguments to `Job.enqueue()`. However, no `name` argument must be passed, as the background job name will be used instead. +!!! tip + A set of predefined intervals is available at `core.choices.JobIntervalChoices` for convenience. + ### Attributes `JobRunner` attributes are defined under a class named `Meta` within the job. These are optional, but encouraged. @@ -46,26 +49,52 @@ As described above, jobs can be scheduled for immediate execution or at any late #### Example +```python title="models.py" +from django.db import models +from core.choices import JobIntervalChoices +from netbox.models import NetBoxModel +from .jobs import MyTestJob + +class MyModel(NetBoxModel): + foo = models.CharField() + + def save(self, *args, **kwargs): + MyTestJob.enqueue_once(instance=self, interval=JobIntervalChoices.INTERVAL_HOURLY) + return super().save(*args, **kwargs) + + def sync(self): + MyTestJob.enqueue(instance=self) +``` + + +### System Jobs + +Some plugins may implement background jobs that are decoupled from the request/response cycle. Typical use cases would be housekeeping tasks or synchronization jobs. These can be registered as _system jobs_ using the `system_job()` decorator. The job interval must be passed as an integer (in minutes) when registering a system job. System jobs are scheduled automatically when the RQ worker (`manage.py rqworker`) is run. + +#### Example + ```python title="jobs.py" -from netbox.jobs import JobRunner - +from core.choices import JobIntervalChoices +from netbox.jobs import JobRunner, system_job +from .models import MyModel +# Specify a predefined choice or an integer indicating +# the number of minutes between job executions +@system_job(interval=JobIntervalChoices.INTERVAL_HOURLY) class MyHousekeepingJob(JobRunner): class Meta: - name = "Housekeeping" + name = "My Housekeeping Job" def run(self, *args, **kwargs): - # your logic goes here + MyModel.objects.filter(foo='bar').delete() + +system_jobs = ( + MyHousekeepingJob, +) ``` -```python title="__init__.py" -from netbox.plugins import PluginConfig - -class MyPluginConfig(PluginConfig): - def ready(self): - from .jobs import MyHousekeepingJob - MyHousekeepingJob.setup(interval=60) -``` +!!! note + Ensure that any system jobs are imported on initialization. Otherwise, they won't be registered. This can be achieved by extending the PluginConfig's `ready()` method. ## Task queues diff --git a/docs/plugins/development/data-backends.md b/docs/plugins/development/data-backends.md index 8b7226a41..0c6d44d95 100644 --- a/docs/plugins/development/data-backends.md +++ b/docs/plugins/development/data-backends.md @@ -18,6 +18,6 @@ backends = [MyDataBackend] ``` !!! tip - The path to the list of search indexes can be modified by setting `data_backends` in the PluginConfig instance. + The path to the list of data backends can be modified by setting `data_backends` in the PluginConfig instance. ::: netbox.data_backends.DataBackend diff --git a/netbox/core/choices.py b/netbox/core/choices.py index 01a072ce1..442acc26b 100644 --- a/netbox/core/choices.py +++ b/netbox/core/choices.py @@ -72,6 +72,20 @@ class JobStatusChoices(ChoiceSet): ) +class JobIntervalChoices(ChoiceSet): + INTERVAL_MINUTELY = 1 + INTERVAL_HOURLY = 60 + INTERVAL_DAILY = 60 * 24 + INTERVAL_WEEKLY = 60 * 24 * 7 + + CHOICES = ( + (INTERVAL_MINUTELY, _('Minutely')), + (INTERVAL_HOURLY, _('Hourly')), + (INTERVAL_DAILY, _('Daily')), + (INTERVAL_WEEKLY, _('Weekly')), + ) + + # # ObjectChanges # diff --git a/netbox/core/management/commands/rqworker.py b/netbox/core/management/commands/rqworker.py index e1fb6fd11..b2879c3d8 100644 --- a/netbox/core/management/commands/rqworker.py +++ b/netbox/core/management/commands/rqworker.py @@ -2,6 +2,8 @@ import logging from django_rq.management.commands.rqworker import Command as _Command +from netbox.registry import registry + DEFAULT_QUEUES = ('high', 'default', 'low') @@ -14,6 +16,15 @@ class Command(_Command): of only the 'default' queue). """ def handle(self, *args, **options): + # Setup system jobs. + for job, kwargs in registry['system_jobs'].items(): + try: + interval = kwargs['interval'] + except KeyError: + raise TypeError("System job must specify an interval (in minutes).") + logger.debug(f"Scheduling system job {job.name} (interval={interval})") + job.enqueue_once(**kwargs) + # Run the worker with scheduler functionality options['with_scheduler'] = True diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py index ae8f2f109..965ebc9e9 100644 --- a/netbox/netbox/jobs.py +++ b/netbox/netbox/jobs.py @@ -2,6 +2,7 @@ import logging from abc import ABC, abstractmethod from datetime import timedelta +from django.core.exceptions import ImproperlyConfigured from django.utils.functional import classproperty from django_pglocks import advisory_lock from rq.timeouts import JobTimeoutException @@ -9,12 +10,30 @@ from rq.timeouts import JobTimeoutException from core.choices import JobStatusChoices from core.models import Job, ObjectType from netbox.constants import ADVISORY_LOCK_KEYS +from netbox.registry import registry __all__ = ( 'JobRunner', + 'system_job', ) +def system_job(interval): + """ + Decorator for registering a `JobRunner` class as system background job. + """ + if type(interval) is not int: + raise ImproperlyConfigured("System job interval must be an integer (minutes).") + + def _wrapper(cls): + registry['system_jobs'][cls] = { + 'interval': interval + } + return cls + + return _wrapper + + class JobRunner(ABC): """ Background Job helper class. @@ -129,7 +148,7 @@ class JobRunner(ABC): if job: # If the job parameters haven't changed, don't schedule a new job and keep the current schedule. Otherwise, # delete the existing job and schedule a new job instead. - if (schedule_at and job.scheduled == schedule_at) and (job.interval == interval): + if (not schedule_at or job.scheduled == schedule_at) and (job.interval == interval): return job job.delete() diff --git a/netbox/netbox/registry.py b/netbox/netbox/registry.py index 0920cbccf..48d7921f2 100644 --- a/netbox/netbox/registry.py +++ b/netbox/netbox/registry.py @@ -30,6 +30,7 @@ registry = Registry({ 'models': collections.defaultdict(set), 'plugins': dict(), 'search': dict(), + 'system_jobs': dict(), 'tables': collections.defaultdict(dict), 'views': collections.defaultdict(dict), 'widgets': dict(), diff --git a/netbox/netbox/tests/dummy_plugin/__init__.py b/netbox/netbox/tests/dummy_plugin/__init__.py index 6ab62d638..2ca7c290c 100644 --- a/netbox/netbox/tests/dummy_plugin/__init__.py +++ b/netbox/netbox/tests/dummy_plugin/__init__.py @@ -21,5 +21,10 @@ class DummyPluginConfig(PluginConfig): 'netbox.tests.dummy_plugin.events.process_events_queue' ] + def ready(self): + super().ready() + + from . import jobs # noqa: F401 + config = DummyPluginConfig diff --git a/netbox/netbox/tests/dummy_plugin/jobs.py b/netbox/netbox/tests/dummy_plugin/jobs.py new file mode 100644 index 000000000..3b9dc7a5f --- /dev/null +++ b/netbox/netbox/tests/dummy_plugin/jobs.py @@ -0,0 +1,9 @@ +from core.choices import JobIntervalChoices +from netbox.jobs import JobRunner, system_job + + +@system_job(interval=JobIntervalChoices.INTERVAL_HOURLY) +class DummySystemJob(JobRunner): + + def run(self, *args, **kwargs): + pass diff --git a/netbox/netbox/tests/test_jobs.py b/netbox/netbox/tests/test_jobs.py index 52a7bd97a..e3e24a235 100644 --- a/netbox/netbox/tests/test_jobs.py +++ b/netbox/netbox/tests/test_jobs.py @@ -90,6 +90,15 @@ class EnqueueTest(JobRunnerTestCase): self.assertEqual(job1, job2) self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + def test_enqueue_once_twice_same_no_schedule_at(self): + instance = DataSource() + schedule_at = self.get_schedule_at() + job1 = TestJobRunner.enqueue_once(instance, schedule_at=schedule_at) + job2 = TestJobRunner.enqueue_once(instance) + + self.assertEqual(job1, job2) + self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + def test_enqueue_once_twice_different_schedule_at(self): instance = DataSource() job1 = TestJobRunner.enqueue_once(instance, schedule_at=self.get_schedule_at()) @@ -127,3 +136,30 @@ class EnqueueTest(JobRunnerTestCase): self.assertNotEqual(job1, job2) self.assertRaises(Job.DoesNotExist, job1.refresh_from_db) self.assertEqual(TestJobRunner.get_jobs(instance).count(), 1) + + +class SystemJobTest(JobRunnerTestCase): + """ + Test that system jobs can be scheduled. + + General functionality already tested by `JobRunnerTest` and `EnqueueTest`. + """ + + def test_scheduling(self): + # Can job be enqueued? + job = TestJobRunner.enqueue(schedule_at=self.get_schedule_at()) + self.assertIsInstance(job, Job) + self.assertEqual(TestJobRunner.get_jobs().count(), 1) + + # Can job be deleted again? + job.delete() + self.assertRaises(Job.DoesNotExist, job.refresh_from_db) + self.assertEqual(TestJobRunner.get_jobs().count(), 0) + + def test_enqueue_once(self): + schedule_at = self.get_schedule_at() + job1 = TestJobRunner.enqueue_once(schedule_at=schedule_at) + job2 = TestJobRunner.enqueue_once(schedule_at=schedule_at) + + self.assertEqual(job1, job2) + self.assertEqual(TestJobRunner.get_jobs().count(), 1) diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index 16778667d..db82d0a75 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -5,8 +5,10 @@ from django.core.exceptions import ImproperlyConfigured from django.test import Client, TestCase, override_settings from django.urls import reverse +from core.choices import JobIntervalChoices from netbox.tests.dummy_plugin import config as dummy_config from netbox.tests.dummy_plugin.data_backends import DummyBackend +from netbox.tests.dummy_plugin.jobs import DummySystemJob from netbox.plugins.navigation import PluginMenu from netbox.plugins.utils import get_plugin_config from netbox.graphql.schema import Query @@ -130,6 +132,13 @@ class PluginTest(TestCase): self.assertIn('dummy', registry['data_backends']) self.assertIs(registry['data_backends']['dummy'], DummyBackend) + def test_system_jobs(self): + """ + Check registered system jobs. + """ + self.assertIn(DummySystemJob, registry['system_jobs']) + self.assertEqual(registry['system_jobs'][DummySystemJob]['interval'], JobIntervalChoices.INTERVAL_HOURLY) + def test_queues(self): """ Check that plugin queues are registered with the accurate name. From 812ce8471a17656a82f6599e018e5b5319febfaf Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Thu, 7 Nov 2024 07:28:02 -0800 Subject: [PATCH 024/169] 10711 Add Scope to WirelessLAN (#17877) * 7699 Add Scope to Cluster * 7699 Serializer * 7699 filterset * 7699 bulk_edit * 7699 bulk_import * 7699 model_form * 7699 graphql, tables * 7699 fixes * 7699 fixes * 7699 fixes * 7699 fixes * 7699 fix tests * 7699 fix graphql tests for clusters reference * 7699 fix dcim tests * 7699 fix ipam tests * 7699 fix tests * 7699 use mixin for model * 7699 change mixin name * 7699 scope form * 7699 scope form * 7699 scoped form, fitlerset * 7699 review changes * 7699 move ScopedFilterset * 7699 move CachedScopeMixin * 7699 review changes * 10711 Add Scope to WirelessLAN * 10711 Add Scope to WirelessLAN * 10711 Add Scope to WirelessLAN * 10711 Add Scope to WirelessLAN * 10711 Add Scope to WirelessLAN * 7699 review changes * 7699 refactor mixins * 7699 _sitegroup -> _site_group * 7699 update docstring * fix model * remove old constants, update filtersets * 10711 fix GraphQL * 10711 fix API * 10711 add tests * 10711 review changes * 10711 add tests * 10711 add scope to detail template * 10711 add api test * Extend CSV test data --------- Co-authored-by: Jeremy Stretch --- docs/models/wireless/wirelesslan.md | 4 + netbox/templates/wireless/wirelesslan.html | 8 ++ .../wireless/api/serializers_/wirelesslans.py | 28 ++++++- netbox/wireless/filtersets.py | 5 +- netbox/wireless/forms/bulk_edit.py | 6 +- netbox/wireless/forms/bulk_import.py | 12 ++- netbox/wireless/forms/filtersets.py | 27 +++++++ netbox/wireless/forms/model_forms.py | 6 +- netbox/wireless/graphql/types.py | 13 +++- ...__location_wirelesslan__region_and_more.py | 77 ++++++++++++++++++ netbox/wireless/models.py | 5 +- netbox/wireless/tables/wirelesslan.py | 9 ++- netbox/wireless/tests/test_api.py | 10 ++- netbox/wireless/tests/test_filtersets.py | 78 +++++++++++++++++-- netbox/wireless/tests/test_views.py | 19 +++-- 15 files changed, 277 insertions(+), 30 deletions(-) create mode 100644 netbox/wireless/migrations/0011_wirelesslan__location_wirelesslan__region_and_more.py diff --git a/docs/models/wireless/wirelesslan.md b/docs/models/wireless/wirelesslan.md index 0f50fa75f..a448c42a2 100644 --- a/docs/models/wireless/wirelesslan.md +++ b/docs/models/wireless/wirelesslan.md @@ -43,3 +43,7 @@ The security cipher used to apply wireless authentication. Options include: ### Pre-Shared Key The security key configured on each client to grant access to the secured wireless LAN. This applies only to certain authentication types. + +### Scope + +The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) with which this wireless LAN is associated. diff --git a/netbox/templates/wireless/wirelesslan.html b/netbox/templates/wireless/wirelesslan.html index 493c36132..54473ea54 100644 --- a/netbox/templates/wireless/wirelesslan.html +++ b/netbox/templates/wireless/wirelesslan.html @@ -22,6 +22,14 @@ {% trans "Status" %} {% badge object.get_status_display bg_color=object.get_status_color %} + + {% trans "Scope" %} + {% if object.scope %} + {{ object.scope|linkify }} ({% trans object.scope_type.name %}) + {% else %} + {{ ''|placeholder }} + {% endif %} + {% trans "Description" %} {{ object.description|placeholder }} diff --git a/netbox/wireless/api/serializers_/wirelesslans.py b/netbox/wireless/api/serializers_/wirelesslans.py index 6c5deeb26..637089277 100644 --- a/netbox/wireless/api/serializers_/wirelesslans.py +++ b/netbox/wireless/api/serializers_/wirelesslans.py @@ -1,9 +1,13 @@ from rest_framework import serializers +from dcim.constants import LOCATION_SCOPE_TYPES +from django.contrib.contenttypes.models import ContentType +from drf_spectacular.utils import extend_schema_field from ipam.api.serializers_.vlans import VLANSerializer -from netbox.api.fields import ChoiceField +from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.serializers import NestedGroupModelSerializer, NetBoxModelSerializer from tenancy.api.serializers_.tenants import TenantSerializer +from utilities.api import get_serializer_for_model from wireless.choices import * from wireless.models import WirelessLAN, WirelessLANGroup from .nested import NestedWirelessLANGroupSerializer @@ -34,12 +38,30 @@ class WirelessLANSerializer(NetBoxModelSerializer): tenant = TenantSerializer(nested=True, required=False, allow_null=True) auth_type = ChoiceField(choices=WirelessAuthTypeChoices, required=False, allow_blank=True) auth_cipher = ChoiceField(choices=WirelessAuthCipherChoices, required=False, allow_blank=True) + scope_type = ContentTypeField( + queryset=ContentType.objects.filter( + model__in=LOCATION_SCOPE_TYPES + ), + allow_null=True, + required=False, + default=None + ) + scope_id = serializers.IntegerField(allow_null=True, required=False, default=None) + scope = serializers.SerializerMethodField(read_only=True) class Meta: model = WirelessLAN fields = [ - 'id', 'url', 'display_url', 'display', 'ssid', 'description', 'group', 'status', 'vlan', 'tenant', - 'auth_type', 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', + 'id', 'url', 'display_url', 'display', 'ssid', 'description', 'group', 'status', 'vlan', 'scope_type', 'scope_id', 'scope', + 'tenant', 'auth_type', 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'ssid', 'description') + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_scope(self, obj): + if obj.scope_id is None: + return None + serializer = get_serializer_for_model(obj.scope) + context = {'request': self.context['request']} + return serializer(obj.scope, nested=True, context=context).data diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 537b2ec5c..5a4195e6c 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -2,6 +2,7 @@ import django_filters from django.db.models import Q from dcim.choices import LinkStatusChoices +from dcim.filtersets import ScopedFilterSet from dcim.models import Interface from ipam.models import VLAN from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet @@ -43,7 +44,7 @@ class WirelessLANGroupFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'description') -class WirelessLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class WirelessLANFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet): group_id = TreeNodeMultipleChoiceFilter( queryset=WirelessLANGroup.objects.all(), field_name='group', @@ -74,7 +75,7 @@ class WirelessLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): class Meta: model = WirelessLAN - fields = ('id', 'ssid', 'auth_psk', 'description') + fields = ('id', 'ssid', 'auth_psk', 'scope_id', 'description') def search(self, queryset, name, value): if not value.strip(): diff --git a/netbox/wireless/forms/bulk_edit.py b/netbox/wireless/forms/bulk_edit.py index c8b378104..5cd3a157a 100644 --- a/netbox/wireless/forms/bulk_edit.py +++ b/netbox/wireless/forms/bulk_edit.py @@ -2,6 +2,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ from dcim.choices import LinkStatusChoices +from dcim.forms.mixins import ScopedBulkEditForm from ipam.models import VLAN from netbox.choices import * from netbox.forms import NetBoxModelBulkEditForm @@ -39,7 +40,7 @@ class WirelessLANGroupBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('parent', 'description') -class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): +class WirelessLANBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(WirelessLANStatusChoices), @@ -89,10 +90,11 @@ class WirelessLANBulkEditForm(NetBoxModelBulkEditForm): model = WirelessLAN fieldsets = ( FieldSet('group', 'ssid', 'status', 'vlan', 'tenant', 'description'), + FieldSet('scope_type', 'scope', name=_('Scope')), FieldSet('auth_type', 'auth_cipher', 'auth_psk', name=_('Authentication')), ) nullable_fields = ( - 'ssid', 'group', 'vlan', 'tenant', 'description', 'auth_type', 'auth_cipher', 'auth_psk', 'comments', + 'ssid', 'group', 'vlan', 'tenant', 'description', 'auth_type', 'auth_cipher', 'auth_psk', 'scope', 'comments', ) diff --git a/netbox/wireless/forms/bulk_import.py b/netbox/wireless/forms/bulk_import.py index cff3e49af..5bf2d7dcd 100644 --- a/netbox/wireless/forms/bulk_import.py +++ b/netbox/wireless/forms/bulk_import.py @@ -1,12 +1,13 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import LinkStatusChoices +from dcim.forms.mixins import ScopedImportForm from dcim.models import Interface from ipam.models import VLAN from netbox.choices import * from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant -from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField +from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField from wireless.choices import * from wireless.models import * @@ -32,7 +33,7 @@ class WirelessLANGroupImportForm(NetBoxModelImportForm): fields = ('name', 'slug', 'parent', 'description', 'tags') -class WirelessLANImportForm(NetBoxModelImportForm): +class WirelessLANImportForm(ScopedImportForm, NetBoxModelImportForm): group = CSVModelChoiceField( label=_('Group'), queryset=WirelessLANGroup.objects.all(), @@ -75,9 +76,12 @@ class WirelessLANImportForm(NetBoxModelImportForm): class Meta: model = WirelessLAN fields = ( - 'ssid', 'group', 'status', 'vlan', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk', 'description', - 'comments', 'tags', + 'ssid', 'group', 'status', 'vlan', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk', 'scope_type', 'scope_id', + 'description', 'comments', 'tags', ) + labels = { + 'scope_id': _('Scope ID'), + } class WirelessLinkImportForm(NetBoxModelImportForm): diff --git a/netbox/wireless/forms/filtersets.py b/netbox/wireless/forms/filtersets.py index 6439a2516..f62a3be06 100644 --- a/netbox/wireless/forms/filtersets.py +++ b/netbox/wireless/forms/filtersets.py @@ -2,6 +2,7 @@ from django import forms from django.utils.translation import gettext_lazy as _ from dcim.choices import LinkStatusChoices +from dcim.models import Location, Region, Site, SiteGroup from netbox.choices import * from netbox.forms import NetBoxModelFilterSetForm from tenancy.forms import TenancyFilterForm @@ -33,6 +34,7 @@ class WirelessLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('ssid', 'group_id', 'status', name=_('Attributes')), + FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', name=_('Scope')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), FieldSet('auth_type', 'auth_cipher', 'auth_psk', name=_('Authentication')), ) @@ -65,6 +67,31 @@ class WirelessLANFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm): label=_('Pre-shared key'), required=False ) + region_id = DynamicModelMultipleChoiceField( + queryset=Region.objects.all(), + required=False, + label=_('Region') + ) + site_group_id = DynamicModelMultipleChoiceField( + queryset=SiteGroup.objects.all(), + required=False, + label=_('Site group') + ) + site_id = DynamicModelMultipleChoiceField( + queryset=Site.objects.all(), + required=False, + null_option='None', + query_params={ + 'region_id': '$region_id', + 'site_group_id': '$site_group_id', + }, + label=_('Site') + ) + location_id = DynamicModelMultipleChoiceField( + queryset=Location.objects.all(), + required=False, + label=_('Location') + ) tag = TagFilterField(model) diff --git a/netbox/wireless/forms/model_forms.py b/netbox/wireless/forms/model_forms.py index 7c2594271..877324b8c 100644 --- a/netbox/wireless/forms/model_forms.py +++ b/netbox/wireless/forms/model_forms.py @@ -2,6 +2,7 @@ from django.forms import PasswordInput from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface, Location, Site +from dcim.forms.mixins import ScopedForm from ipam.models import VLAN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm @@ -35,7 +36,7 @@ class WirelessLANGroupForm(NetBoxModelForm): ] -class WirelessLANForm(TenancyForm, NetBoxModelForm): +class WirelessLANForm(ScopedForm, TenancyForm, NetBoxModelForm): group = DynamicModelChoiceField( label=_('Group'), queryset=WirelessLANGroup.objects.all(), @@ -51,6 +52,7 @@ class WirelessLANForm(TenancyForm, NetBoxModelForm): fieldsets = ( FieldSet('ssid', 'group', 'vlan', 'status', 'description', 'tags', name=_('Wireless LAN')), + FieldSet('scope_type', 'scope', name=_('Scope')), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), FieldSet('auth_type', 'auth_cipher', 'auth_psk', name=_('Authentication')), ) @@ -59,7 +61,7 @@ class WirelessLANForm(TenancyForm, NetBoxModelForm): model = WirelessLAN fields = [ 'ssid', 'group', 'status', 'vlan', 'tenant_group', 'tenant', 'auth_type', 'auth_cipher', 'auth_psk', - 'description', 'comments', 'tags', + 'scope_type', 'description', 'comments', 'tags', ] widgets = { 'auth_psk': PasswordInput( diff --git a/netbox/wireless/graphql/types.py b/netbox/wireless/graphql/types.py index b24525fbe..aa44e9b9f 100644 --- a/netbox/wireless/graphql/types.py +++ b/netbox/wireless/graphql/types.py @@ -1,4 +1,4 @@ -from typing import Annotated, List +from typing import Annotated, List, Union import strawberry import strawberry_django @@ -28,7 +28,7 @@ class WirelessLANGroupType(OrganizationalObjectType): @strawberry_django.type( models.WirelessLAN, - fields='__all__', + exclude=('scope_type', 'scope_id', '_location', '_region', '_site', '_site_group'), filters=WirelessLANFilter ) class WirelessLANType(NetBoxObjectType): @@ -38,6 +38,15 @@ class WirelessLANType(NetBoxObjectType): interfaces: List[Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')]] + @strawberry_django.field + def scope(self) -> Annotated[Union[ + Annotated["LocationType", strawberry.lazy('dcim.graphql.types')], + Annotated["RegionType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')], + Annotated["SiteType", strawberry.lazy('dcim.graphql.types')], + ], strawberry.union("WirelessLANScopeType")] | None: + return self.scope + @strawberry_django.type( models.WirelessLink, diff --git a/netbox/wireless/migrations/0011_wirelesslan__location_wirelesslan__region_and_more.py b/netbox/wireless/migrations/0011_wirelesslan__location_wirelesslan__region_and_more.py new file mode 100644 index 000000000..ea4470641 --- /dev/null +++ b/netbox/wireless/migrations/0011_wirelesslan__location_wirelesslan__region_and_more.py @@ -0,0 +1,77 @@ +# Generated by Django 5.0.9 on 2024-11-04 16:00 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('dcim', '0196_qinq_svlan'), + ('wireless', '0010_charfield_null_choices'), + ] + + operations = [ + migrations.AddField( + model_name='wirelesslan', + name='_location', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.location', + ), + ), + migrations.AddField( + model_name='wirelesslan', + name='_region', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.region', + ), + ), + migrations.AddField( + model_name='wirelesslan', + name='_site', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.site', + ), + ), + migrations.AddField( + model_name='wirelesslan', + name='_site_group', + field=models.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.CASCADE, + related_name='_%(class)ss', + to='dcim.sitegroup', + ), + ), + migrations.AddField( + model_name='wirelesslan', + name='scope_id', + field=models.PositiveBigIntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='wirelesslan', + name='scope_type', + field=models.ForeignKey( + blank=True, + limit_choices_to=models.Q(('model__in', ('region', 'sitegroup', 'site', 'location'))), + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name='+', + to='contenttypes.contenttype', + ), + ), + ] diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index 88c60d494..d78c893a6 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -4,6 +4,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import LinkStatusChoices from dcim.constants import WIRELESS_IFACE_TYPES +from dcim.models.mixins import CachedScopeMixin from netbox.models import NestedGroupModel, PrimaryModel from netbox.models.mixins import DistanceMixin from .choices import * @@ -71,7 +72,7 @@ class WirelessLANGroup(NestedGroupModel): verbose_name_plural = _('wireless LAN groups') -class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): +class WirelessLAN(WirelessAuthenticationBase, CachedScopeMixin, PrimaryModel): """ A wireless network formed among an arbitrary number of access point and clients. """ @@ -107,7 +108,7 @@ class WirelessLAN(WirelessAuthenticationBase, PrimaryModel): null=True ) - clone_fields = ('ssid', 'group', 'tenant', 'description') + clone_fields = ('ssid', 'group', 'scope_type', 'scope_id', 'tenant', 'description') class Meta: ordering = ('ssid', 'pk') diff --git a/netbox/wireless/tables/wirelesslan.py b/netbox/wireless/tables/wirelesslan.py index 87ad4ac51..40f52f8a5 100644 --- a/netbox/wireless/tables/wirelesslan.py +++ b/netbox/wireless/tables/wirelesslan.py @@ -51,6 +51,13 @@ class WirelessLANTable(TenancyColumnsMixin, NetBoxTable): status = columns.ChoiceFieldColumn( verbose_name=_('Status'), ) + scope_type = columns.ContentTypeColumn( + verbose_name=_('Scope Type'), + ) + scope = tables.Column( + verbose_name=_('Scope'), + linkify=True + ) interface_count = tables.Column( verbose_name=_('Interfaces') ) @@ -65,7 +72,7 @@ class WirelessLANTable(TenancyColumnsMixin, NetBoxTable): model = WirelessLAN fields = ( 'pk', 'ssid', 'group', 'status', 'tenant', 'tenant_group', 'vlan', 'interface_count', 'auth_type', - 'auth_cipher', 'auth_psk', 'description', 'comments', 'tags', 'created', 'last_updated', + 'auth_cipher', 'auth_psk', 'scope', 'scope_type', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ('pk', 'ssid', 'group', 'status', 'description', 'vlan', 'auth_type', 'interface_count') diff --git a/netbox/wireless/tests/test_api.py b/netbox/wireless/tests/test_api.py index 4b7545888..f768eafaf 100644 --- a/netbox/wireless/tests/test_api.py +++ b/netbox/wireless/tests/test_api.py @@ -1,7 +1,7 @@ from django.urls import reverse from dcim.choices import InterfaceTypeChoices -from dcim.models import Interface +from dcim.models import Interface, Site from tenancy.models import Tenant from utilities.testing import APITestCase, APIViewTestCases, create_test_device from wireless.choices import * @@ -53,6 +53,12 @@ class WirelessLANTest(APIViewTestCases.APIViewTestCase): @classmethod def setUpTestData(cls): + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + ) + Site.objects.bulk_create(sites) + tenants = ( Tenant(name='Tenant 1', slug='tenant-1'), Tenant(name='Tenant 2', slug='tenant-2'), @@ -94,6 +100,8 @@ class WirelessLANTest(APIViewTestCases.APIViewTestCase): 'status': WirelessLANStatusChoices.STATUS_DISABLED, 'tenant': tenants[0].pk, 'auth_type': WirelessAuthTypeChoices.TYPE_WPA_ENTERPRISE, + 'scope_type': 'dcim.site', + 'scope_id': sites[1].pk, }, ] diff --git a/netbox/wireless/tests/test_filtersets.py b/netbox/wireless/tests/test_filtersets.py index 5c932928c..76ef4e220 100644 --- a/netbox/wireless/tests/test_filtersets.py +++ b/netbox/wireless/tests/test_filtersets.py @@ -1,7 +1,7 @@ from django.test import TestCase from dcim.choices import InterfaceTypeChoices, LinkStatusChoices -from dcim.models import Interface +from dcim.models import Interface, Location, Region, Site, SiteGroup from ipam.models import VLAN from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant @@ -110,6 +110,36 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): ) VLAN.objects.bulk_create(vlans) + regions = ( + Region(name='Test Region 1', slug='test-region-1'), + Region(name='Test Region 2', slug='test-region-2'), + Region(name='Test Region 3', slug='test-region-3'), + ) + for r in regions: + r.save() + + site_groups = ( + SiteGroup(name='Site Group 1', slug='site-group-1'), + SiteGroup(name='Site Group 2', slug='site-group-2'), + SiteGroup(name='Site Group 3', slug='site-group-3'), + ) + for site_group in site_groups: + site_group.save() + + sites = ( + Site(name='Test Site 1', slug='test-site-1', region=regions[0], group=site_groups[0]), + Site(name='Test Site 2', slug='test-site-2', region=regions[1], group=site_groups[1]), + Site(name='Test Site 3', slug='test-site-3', region=regions[2], group=site_groups[2]), + ) + Site.objects.bulk_create(sites) + + locations = ( + Location(name='Location 1', slug='location-1', site=sites[0]), + Location(name='Location 2', slug='location-2', site=sites[2]), + ) + for location in locations: + location.save() + tenants = ( Tenant(name='Tenant 1', slug='tenant-1'), Tenant(name='Tenant 2', slug='tenant-2'), @@ -127,7 +157,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): auth_type=WirelessAuthTypeChoices.TYPE_OPEN, auth_cipher=WirelessAuthCipherChoices.CIPHER_AUTO, auth_psk='PSK1', - description='foobar1' + description='foobar1', + scope=sites[0] ), WirelessLAN( ssid='WLAN2', @@ -138,7 +169,8 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): auth_type=WirelessAuthTypeChoices.TYPE_WEP, auth_cipher=WirelessAuthCipherChoices.CIPHER_TKIP, auth_psk='PSK2', - description='foobar2' + description='foobar2', + scope=locations[0] ), WirelessLAN( ssid='WLAN3', @@ -149,12 +181,14 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): auth_type=WirelessAuthTypeChoices.TYPE_WPA_PERSONAL, auth_cipher=WirelessAuthCipherChoices.CIPHER_AES, auth_psk='PSK3', - description='foobar3' + description='foobar3', + scope=locations[1] ), ) - WirelessLAN.objects.bulk_create(wireless_lans) + for wireless_lan in wireless_lans: + wireless_lan.save() - device = create_test_device('Device 1') + device = create_test_device('Device 1', site=sites[0]) interfaces = ( Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_80211N), Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_80211N), @@ -217,6 +251,38 @@ class WirelessLANTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_region(self): + regions = Region.objects.all()[:2] + params = {'region_id': [regions[0].pk, regions[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'region': [regions[0].slug, regions[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site_group(self): + site_groups = SiteGroup.objects.all()[:2] + params = {'site_group_id': [site_groups[0].pk, site_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'site_group': [site_groups[0].slug, site_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_site(self): + sites = Site.objects.all()[:2] + params = {'site_id': [sites[0].pk, sites[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'site': [sites[0].slug, sites[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_location(self): + locations = Location.objects.all()[:1] + params = {'location_id': [locations[0].pk,]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + params = {'location': [locations[0].slug,]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_scope_type(self): + params = {'scope_type': 'dcim.location'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + class WirelessLinkTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = WirelessLink.objects.all() diff --git a/netbox/wireless/tests/test_views.py b/netbox/wireless/tests/test_views.py index d28d9fde3..713ba81d7 100644 --- a/netbox/wireless/tests/test_views.py +++ b/netbox/wireless/tests/test_views.py @@ -1,7 +1,8 @@ +from django.contrib.contenttypes.models import ContentType from wireless.choices import * from wireless.models import * from dcim.choices import InterfaceTypeChoices, LinkStatusChoices -from dcim.models import Interface +from dcim.models import Interface, Site from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant from utilities.testing import ViewTestCases, create_tags, create_test_device @@ -56,6 +57,12 @@ class WirelessLANTestCase(ViewTestCases.PrimaryObjectViewTestCase): @classmethod def setUpTestData(cls): + sites = ( + Site(name='Site 1', slug='site-1'), + Site(name='Site 2', slug='site-2'), + ) + Site.objects.bulk_create(sites) + tenants = ( Tenant(name='Tenant 1', slug='tenant-1'), Tenant(name='Tenant 2', slug='tenant-2'), @@ -98,15 +105,17 @@ class WirelessLANTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'ssid': 'WLAN2', 'group': groups[1].pk, 'status': WirelessLANStatusChoices.STATUS_DISABLED, + 'scope_type': ContentType.objects.get_for_model(Site).pk, + 'scope': sites[1].pk, 'tenant': tenants[1].pk, 'tags': [t.pk for t in tags], } cls.csv_data = ( - "group,ssid,status,tenant", - f"Wireless LAN Group 2,WLAN4,{WirelessLANStatusChoices.STATUS_ACTIVE},{tenants[0].name}", - f"Wireless LAN Group 2,WLAN5,{WirelessLANStatusChoices.STATUS_DISABLED},{tenants[1].name}", - f"Wireless LAN Group 2,WLAN6,{WirelessLANStatusChoices.STATUS_RESERVED},{tenants[2].name}", + "group,ssid,status,tenant,scope_type,scope_id", + f"Wireless LAN Group 2,WLAN4,{WirelessLANStatusChoices.STATUS_ACTIVE},{tenants[0].name},,", + f"Wireless LAN Group 2,WLAN5,{WirelessLANStatusChoices.STATUS_DISABLED},{tenants[1].name},dcim.site,{sites[0].pk}", + f"Wireless LAN Group 2,WLAN6,{WirelessLANStatusChoices.STATUS_RESERVED},{tenants[2].name},dcim.site,{sites[1].pk}", ) cls.csv_update_data = ( From a1830488910ff58c8fb05b43a7f3bccd685143ef Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Nov 2024 10:24:15 -0500 Subject: [PATCH 025/169] Closes #17951: Extend Ruff ruleset --- .../0047_circuittermination__termination.py | 1 + netbox/circuits/tests/test_views.py | 2 +- netbox/extras/forms/bulk_import.py | 2 +- .../extras/management/commands/runscript.py | 2 +- netbox/extras/migrations/0109_script_model.py | 4 ++-- netbox/ipam/lookups.py | 4 ++-- netbox/ipam/tests/test_ordering.py | 6 +++--- netbox/netbox/authentication/__init__.py | 2 +- netbox/netbox/tests/test_plugins.py | 1 - netbox/netbox/views/errors.py | 2 +- netbox/utilities/error_handlers.py | 2 +- netbox/utilities/tests/test_counters.py | 2 +- .../api/serializers_/clusters.py | 2 -- netbox/virtualization/graphql/types.py | 2 +- .../migrations/0044_cluster_scope.py | 20 +++++++++---------- ruff.toml | 2 ++ 16 files changed, 28 insertions(+), 28 deletions(-) diff --git a/netbox/circuits/migrations/0047_circuittermination__termination.py b/netbox/circuits/migrations/0047_circuittermination__termination.py index cb2c9ca07..0cf2b424f 100644 --- a/netbox/circuits/migrations/0047_circuittermination__termination.py +++ b/netbox/circuits/migrations/0047_circuittermination__termination.py @@ -21,6 +21,7 @@ def copy_site_assignments(apps, schema_editor): termination_id=models.F('provider_network_id') ) + class Migration(migrations.Migration): dependencies = [ diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index a87e327af..f6c626443 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -341,7 +341,7 @@ class ProviderNetworkTestCase(ViewTestCases.PrimaryObjectViewTestCase): } -class TestCase(ViewTestCases.PrimaryObjectViewTestCase): +class TestCase(ViewTestCases.PrimaryObjectViewTestCase): model = CircuitTermination @classmethod diff --git a/netbox/extras/forms/bulk_import.py b/netbox/extras/forms/bulk_import.py index 258df8264..655a5d6ca 100644 --- a/netbox/extras/forms/bulk_import.py +++ b/netbox/extras/forms/bulk_import.py @@ -223,7 +223,7 @@ class EventRuleImportForm(NetBoxModelImportForm): from extras.scripts import get_module_and_script module_name, script_name = action_object.split('.', 1) try: - module, script = get_module_and_script(module_name, script_name) + script = get_module_and_script(module_name, script_name)[1] except ObjectDoesNotExist: raise forms.ValidationError(_("Script {name} not found").format(name=action_object)) self.instance.action_object = script diff --git a/netbox/extras/management/commands/runscript.py b/netbox/extras/management/commands/runscript.py index d5fb435ad..847d89396 100644 --- a/netbox/extras/management/commands/runscript.py +++ b/netbox/extras/management/commands/runscript.py @@ -38,7 +38,7 @@ class Command(BaseCommand): data = {} module_name, script_name = script.split('.', 1) - module, script_obj = get_module_and_script(module_name, script_name) + script_obj = get_module_and_script(module_name, script_name)[1] script = script_obj.python_class # Take user from command line if provided and exists, other diff --git a/netbox/extras/migrations/0109_script_model.py b/netbox/extras/migrations/0109_script_model.py index 6bfd2c14c..2fa0bf8aa 100644 --- a/netbox/extras/migrations/0109_script_model.py +++ b/netbox/extras/migrations/0109_script_model.py @@ -30,7 +30,7 @@ def get_python_name(scriptmodule): """ Return the Python name of a ScriptModule's file on disk. """ - path, filename = os.path.split(scriptmodule.file_path) + filename = os.path.split(scriptmodule.file_path)[0] return os.path.splitext(filename)[0] @@ -128,7 +128,7 @@ def update_event_rules(apps, schema_editor): for eventrule in EventRule.objects.filter(action_object_type=scriptmodule_ct): name = eventrule.action_parameters.get('script_name') - obj, created = Script.objects.get_or_create( + obj, __ = Script.objects.get_or_create( module_id=eventrule.action_object_id, name=name, defaults={'is_executable': False} diff --git a/netbox/ipam/lookups.py b/netbox/ipam/lookups.py index c6abb5a26..c493b7876 100644 --- a/netbox/ipam/lookups.py +++ b/netbox/ipam/lookups.py @@ -108,8 +108,8 @@ class NetIn(Lookup): return self.rhs def as_sql(self, qn, connection): - lhs, lhs_params = self.process_lhs(qn, connection) - rhs, rhs_params = self.process_rhs(qn, connection) + lhs = self.process_lhs(qn, connection)[0] + rhs_params = self.process_rhs(qn, connection)[1] with_mask, without_mask = [], [] for address in rhs_params[0]: if '/' in address: diff --git a/netbox/ipam/tests/test_ordering.py b/netbox/ipam/tests/test_ordering.py index 8d69af847..fea6b55e2 100644 --- a/netbox/ipam/tests/test_ordering.py +++ b/netbox/ipam/tests/test_ordering.py @@ -42,7 +42,7 @@ class PrefixOrderingTestCase(OrderingTestBase): """ This is a very basic test, which tests both prefixes without VRFs and prefixes with VRFs """ - vrf1, vrf2, vrf3 = list(VRF.objects.all()) + vrf1, vrf2 = VRF.objects.all()[:2] prefixes = ( Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/16')), Prefix(status=PrefixStatusChoices.STATUS_ACTIVE, vrf=None, prefix=netaddr.IPNetwork('192.168.0.0/24')), @@ -106,7 +106,7 @@ class PrefixOrderingTestCase(OrderingTestBase): VRF A:10.1.1.0/24 None: 192.168.0.0/16 """ - vrf1, vrf2, vrf3 = list(VRF.objects.all()) + vrf1 = VRF.objects.first() prefixes = [ Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('10.0.0.0/8')), Prefix(status=PrefixStatusChoices.STATUS_CONTAINER, vrf=None, prefix=netaddr.IPNetwork('10.0.0.0/16')), @@ -130,7 +130,7 @@ class IPAddressOrderingTestCase(OrderingTestBase): """ This function tests ordering with the inclusion of vrfs """ - vrf1, vrf2, vrf3 = list(VRF.objects.all()) + vrf1, vrf2 = VRF.objects.all()[:2] addresses = ( IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.0.1/24')), IPAddress(status=IPAddressStatusChoices.STATUS_ACTIVE, vrf=vrf1, address=netaddr.IPNetwork('10.0.1.1/24')), diff --git a/netbox/netbox/authentication/__init__.py b/netbox/netbox/authentication/__init__.py index 7c2df4200..83f699e42 100644 --- a/netbox/netbox/authentication/__init__.py +++ b/netbox/netbox/authentication/__init__.py @@ -107,7 +107,7 @@ class ObjectPermissionMixin: return perms def has_perm(self, user_obj, perm, obj=None): - app_label, action, model_name = resolve_permission(perm) + app_label, __, model_name = resolve_permission(perm) # Superusers implicitly have all permissions if user_obj.is_active and user_obj.is_superuser: diff --git a/netbox/netbox/tests/test_plugins.py b/netbox/netbox/tests/test_plugins.py index db82d0a75..264c8e6f9 100644 --- a/netbox/netbox/tests/test_plugins.py +++ b/netbox/netbox/tests/test_plugins.py @@ -213,7 +213,6 @@ class PluginTest(TestCase): self.assertEqual(get_plugin_config(plugin, 'bar'), None) self.assertEqual(get_plugin_config(plugin, 'bar', default=456), 456) - def test_events_pipeline(self): """ Check that events pipeline is registered. diff --git a/netbox/netbox/views/errors.py b/netbox/netbox/views/errors.py index 9e8ed5a3a..5872a59cd 100644 --- a/netbox/netbox/views/errors.py +++ b/netbox/netbox/views/errors.py @@ -49,7 +49,7 @@ def handler_500(request, template_name=ERROR_500_TEMPLATE_NAME): template = loader.get_template(template_name) except TemplateDoesNotExist: return HttpResponseServerError('

Server Error (500)

', content_type='text/html') - type_, error, traceback = sys.exc_info() + type_, error = sys.exc_info()[:2] return HttpResponseServerError(template.render({ 'error': error, diff --git a/netbox/utilities/error_handlers.py b/netbox/utilities/error_handlers.py index 5d2a46424..397098ded 100644 --- a/netbox/utilities/error_handlers.py +++ b/netbox/utilities/error_handlers.py @@ -49,7 +49,7 @@ def handle_rest_api_exception(request, *args, **kwargs): """ Handle exceptions and return a useful error message for REST API requests. """ - type_, error, traceback = sys.exc_info() + type_, error = sys.exc_info()[:2] data = { 'error': str(error), 'exception': type_.__name__, diff --git a/netbox/utilities/tests/test_counters.py b/netbox/utilities/tests/test_counters.py index 45823065e..668965e8a 100644 --- a/netbox/utilities/tests/test_counters.py +++ b/netbox/utilities/tests/test_counters.py @@ -83,7 +83,7 @@ class CountersTest(TestCase): @override_settings(EXEMPT_VIEW_PERMISSIONS=['*']) def test_mptt_child_delete(self): - device1, device2 = Device.objects.all() + device1 = Device.objects.first() inventory_item1 = InventoryItem.objects.create(device=device1, name='Inventory Item 1') InventoryItem.objects.create(device=device1, name='Inventory Item 2', parent=inventory_item1) device1.refresh_from_db() diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index 101a5b5a3..c0b636e33 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -80,5 +80,3 @@ class ClusterSerializer(NetBoxModelSerializer): serializer = get_serializer_for_model(obj.scope) context = {'request': self.context['request']} return serializer(obj.scope, nested=True, context=context).data - - diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index f51e0e3f5..6052c8936 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -48,7 +48,7 @@ class ClusterType(VLANGroupsMixin, NetBoxObjectType): Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')], Annotated["SiteType", strawberry.lazy('dcim.graphql.types')], ], strawberry.union("ClusterScopeType")] | None: - return self.scope + return self.scope @strawberry_django.type( diff --git a/netbox/virtualization/migrations/0044_cluster_scope.py b/netbox/virtualization/migrations/0044_cluster_scope.py index 63a888ac3..b7af25f8b 100644 --- a/netbox/virtualization/migrations/0044_cluster_scope.py +++ b/netbox/virtualization/migrations/0044_cluster_scope.py @@ -3,17 +3,17 @@ from django.db import migrations, models def copy_site_assignments(apps, schema_editor): - """ - Copy site ForeignKey values to the scope GFK. - """ - ContentType = apps.get_model('contenttypes', 'ContentType') - Cluster = apps.get_model('virtualization', 'Cluster') - Site = apps.get_model('dcim', 'Site') + """ + Copy site ForeignKey values to the scope GFK. + """ + ContentType = apps.get_model('contenttypes', 'ContentType') + Cluster = apps.get_model('virtualization', 'Cluster') + Site = apps.get_model('dcim', 'Site') - Cluster.objects.filter(site__isnull=False).update( - scope_type=ContentType.objects.get_for_model(Site), - scope_id=models.F('site_id') - ) + Cluster.objects.filter(site__isnull=False).update( + scope_type=ContentType.objects.get_for_model(Site), + scope_id=models.F('site_id') + ) class Migration(migrations.Migration): diff --git a/ruff.toml b/ruff.toml index 854404469..94a0e1c61 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,2 +1,4 @@ [lint] +extend-select = ["E1", "E2", "E3", "W"] ignore = ["E501", "F403", "F405"] +preview = true From 03d413565f289f3f410ec4e76e938a1613e3cfe0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 7 Nov 2024 14:10:15 -0500 Subject: [PATCH 026/169] Fix linter error --- netbox/wireless/forms/bulk_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/wireless/forms/bulk_import.py b/netbox/wireless/forms/bulk_import.py index 5bf2d7dcd..f23ccf203 100644 --- a/netbox/wireless/forms/bulk_import.py +++ b/netbox/wireless/forms/bulk_import.py @@ -7,7 +7,7 @@ from ipam.models import VLAN from netbox.choices import * from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant -from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField +from utilities.forms.fields import CSVChoiceField, CSVModelChoiceField, SlugField from wireless.choices import * from wireless.models import * From 954e29aec3bfefeab1cebfffbe97a7520406ecd0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Nov 2024 12:19:37 -0500 Subject: [PATCH 027/169] Fixes #17972: Force evaluation of LOGIN_REQUIRED when requesting static media (#17990) --- netbox/netbox/tests/test_views.py | 20 +++++++++++++++++++- netbox/netbox/urls.py | 5 ++--- netbox/netbox/views/misc.py | 10 ++++++++++ 3 files changed, 31 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/tests/test_views.py b/netbox/netbox/tests/test_views.py index ccba73baa..50cfa5755 100644 --- a/netbox/netbox/tests/test_views.py +++ b/netbox/netbox/tests/test_views.py @@ -1,7 +1,7 @@ import urllib.parse from django.urls import reverse -from django.test import override_settings +from django.test import Client, override_settings from dcim.models import Site from netbox.constants import EMPTY_TABLE_TEXT @@ -74,3 +74,21 @@ class SearchViewTestCase(TestCase): self.assertHttpStatus(response, 200) content = str(response.content) self.assertIn(EMPTY_TABLE_TEXT, content) + + +class MediaViewTestCase(TestCase): + + def test_media_login_required(self): + url = reverse('media', kwargs={'path': 'foo.txt'}) + response = Client().get(url) + + # Unauthenticated request should redirect to login page + self.assertHttpStatus(response, 302) + + @override_settings(LOGIN_REQUIRED=False) + def test_media_login_not_required(self): + url = reverse('media', kwargs={'path': 'foo.txt'}) + response = Client().get(url) + + # Unauthenticated request should return a 404 (not found) + self.assertHttpStatus(response, 404) diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index b0175ec04..b91ee295d 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -2,7 +2,6 @@ from django.conf import settings from django.conf.urls import include from django.urls import path from django.views.decorators.cache import cache_page -from django.views.static import serve from drf_spectacular.views import SpectacularAPIView, SpectacularRedocView, SpectacularSwaggerView from account.views import LoginView, LogoutView @@ -10,7 +9,7 @@ from netbox.api.views import APIRootView, StatusView from netbox.graphql.schema import schema from netbox.graphql.views import NetBoxGraphQLView from netbox.plugins.urls import plugin_patterns, plugin_api_patterns -from netbox.views import HomeView, StaticMediaFailureView, SearchView, htmx +from netbox.views import HomeView, MediaView, StaticMediaFailureView, SearchView, htmx _patterns = [ @@ -69,7 +68,7 @@ _patterns = [ path('graphql/', NetBoxGraphQLView.as_view(schema=schema), name='graphql'), # Serving static media in Django to pipe it through LoginRequiredMiddleware - path('media/', serve, {'document_root': settings.MEDIA_ROOT}), + path('media/', MediaView.as_view(), name='media'), path('media-failure/', StaticMediaFailureView.as_view(), name='media_failure'), # Plugins diff --git a/netbox/netbox/views/misc.py b/netbox/netbox/views/misc.py index c584e99e4..f28b0f7b1 100644 --- a/netbox/netbox/views/misc.py +++ b/netbox/netbox/views/misc.py @@ -8,6 +8,7 @@ from django.core.cache import cache from django.shortcuts import redirect, render from django.utils.translation import gettext_lazy as _ from django.views.generic import View +from django.views.static import serve from django_tables2 import RequestConfig from packaging import version @@ -23,6 +24,7 @@ from utilities.views import ConditionalLoginRequiredMixin __all__ = ( 'HomeView', + 'MediaView', 'SearchView', ) @@ -115,3 +117,11 @@ class SearchView(ConditionalLoginRequiredMixin, View): 'form': form, 'table': table, }) + + +class MediaView(ConditionalLoginRequiredMixin, View): + """ + Wrap Django's serve() view to enforce LOGIN_REQUIRED for static media. + """ + def get(self, request, path): + return serve(request, path, document_root=settings.MEDIA_ROOT) From 2ed0534117af7247ca56ee43c6175f79a5ca6f41 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Nov 2024 13:58:48 -0500 Subject: [PATCH 028/169] Fixes #17963: Fix selection of all listed objects during bulk edit --- netbox/netbox/views/generic/bulk_views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 4b2f1ae28..7158f056a 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -698,7 +698,7 @@ class BulkEditView(GetReturnURLMixin, BaseMultiObjectView): logger.debug("Form validation failed") else: - form = self.form(request.POST, initial=initial_data) + form = self.form(initial=initial_data) restrict_form_fields(form, request.user) # Retrieve objects being edited From c34fea6c9bb89e543139b93ed75ff55567bdd553 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Nov 2024 12:11:44 -0500 Subject: [PATCH 029/169] Fixes #17969: Fix system info export when a config revision exists --- netbox/core/tests/test_views.py | 29 +++++++++++++++++++++++++++++ netbox/core/views.py | 6 +----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/netbox/core/tests/test_views.py b/netbox/core/tests/test_views.py index 01912b4d6..047b51ef6 100644 --- a/netbox/core/tests/test_views.py +++ b/netbox/core/tests/test_views.py @@ -346,3 +346,32 @@ class BackgroundTaskTestCase(TestCase): self.assertIn(str(worker1.name), str(response.content)) self.assertIn('Birth', str(response.content)) self.assertIn('Total working time', str(response.content)) + + +class SystemTestCase(TestCase): + + def setUp(self): + super().setUp() + + self.user.is_staff = True + self.user.save() + + def test_system_view_default(self): + # Test UI render + response = self.client.get(reverse('core:system')) + self.assertEqual(response.status_code, 200) + + # Test export + response = self.client.get(f"{reverse('core:system')}?export=true") + self.assertEqual(response.status_code, 200) + + def test_system_view_with_config_revision(self): + ConfigRevision.objects.create() + + # Test UI render + response = self.client.get(reverse('core:system')) + self.assertEqual(response.status_code, 200) + + # Test export + response = self.client.get(f"{reverse('core:system')}?export=true") + self.assertEqual(response.status_code, 200) diff --git a/netbox/core/views.py b/netbox/core/views.py index 3c5319626..ecbf11e32 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -626,11 +626,7 @@ class SystemView(UserPassesTestMixin, View): } # Configuration - try: - config = ConfigRevision.objects.get(pk=cache.get('config_version')) - except ConfigRevision.DoesNotExist: - # Fall back to using the active config data if no record is found - config = get_config() + config = get_config() # Raw data export if 'export' in request.GET: From 9c532c7d896e5c3ce248ffff74c9236025d00d86 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Nov 2024 14:53:57 -0500 Subject: [PATCH 030/169] Fixes #17986: Correct label for disk size when bulk editing virtual machines (#17992) * Fixes #17986: Correct label for disk size when bulk editing virtual machines * Correct label for VirtualDisk.size --- netbox/virtualization/forms/bulk_edit.py | 4 ++-- netbox/virtualization/forms/filtersets.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index 2bd3434ac..771edb09f 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -171,7 +171,7 @@ class VirtualMachineBulkEditForm(NetBoxModelBulkEditForm): ) disk = forms.IntegerField( required=False, - label=_('Disk (GB)') + label=_('Disk (MB)') ) description = forms.CharField( label=_('Description'), @@ -331,7 +331,7 @@ class VirtualDiskBulkEditForm(NetBoxModelBulkEditForm): ) size = forms.IntegerField( required=False, - label=_('Size (GB)') + label=_('Size (MB)') ) description = forms.CharField( label=_('Description'), diff --git a/netbox/virtualization/forms/filtersets.py b/netbox/virtualization/forms/filtersets.py index 7c040d948..9d5ca019a 100644 --- a/netbox/virtualization/forms/filtersets.py +++ b/netbox/virtualization/forms/filtersets.py @@ -248,7 +248,7 @@ class VirtualDiskFilterForm(NetBoxModelFilterSetForm): label=_('Virtual machine') ) size = forms.IntegerField( - label=_('Size (GB)'), + label=_('Size (MB)'), required=False, min_value=1 ) From 256d69d08bf97fc723d2798acbe22e199a7291a0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Nov 2024 15:56:29 -0500 Subject: [PATCH 031/169] Update changelog --- docs/release-notes/version-4.1.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index 7b4e18919..b94374721 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,5 +1,22 @@ # NetBox v4.1 +## v4.1.7 (FUTURE) + +### Enhancements + +* [#15239](https://github.com/netbox-community/netbox/issues/15239) - Enable adding/removing individual VLANs while bulk editing device interfaces +* [#17871](https://github.com/netbox-community/netbox/issues/17871) - Enable the assignment/removal of virtualization cluster via device bulk edit + +### Bug Fixes + +* [#17901](https://github.com/netbox-community/netbox/issues/17901) - Ensure GraphiQL UI resources are served locally +* [#17963](https://github.com/netbox-community/netbox/issues/17963) - Fix selection of all listed objects during bulk edit +* [#17969](https://github.com/netbox-community/netbox/issues/17969) - Fix system info export when a config revision exists +* [#17972](https://github.com/netbox-community/netbox/issues/17972) - Force evaluation of `LOGIN_REQUIRED` when requesting static media +* [#17986](https://github.com/netbox-community/netbox/issues/17986) - Correct labels for virtual machine & virtual disk size properties + +--- + ## v4.1.6 (2024-10-31) ### Bug Fixes From 05daa16aedab1142b56d1bbfc6d524199868aa86 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 05:02:11 +0000 Subject: [PATCH 032/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 01e151c84..1d35fb8b2 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-08 05:01+0000\n" +"POT-Creation-Date: 2024-11-13 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -2452,11 +2452,11 @@ msgstr "" msgid "Failed to stop job {id}" msgstr "" -#: netbox/core/views.py:678 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "" -#: netbox/core/views.py:712 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "" @@ -11141,7 +11141,7 @@ msgstr "" msgid "{class_name} must implement get_children()" msgstr "" -#: netbox/netbox/views/misc.py:44 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -14848,12 +14848,12 @@ msgid "Memory (MB)" msgstr "" #: netbox/virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" +msgid "Disk (MB)" msgstr "" #: netbox/virtualization/forms/bulk_edit.py:334 #: netbox/virtualization/forms/filtersets.py:251 -msgid "Size (GB)" +msgid "Size (MB)" msgstr "" #: netbox/virtualization/forms/bulk_import.py:44 From 0ff0edd4772fdd835b9cc63e2339d6ef48869b7a Mon Sep 17 00:00:00 2001 From: "Joel L. McGuire" Date: Wed, 13 Nov 2024 14:39:37 -0600 Subject: [PATCH 033/169] fix typo in #17970 --- docs/models/vpn/ikepolicy.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/models/vpn/ikepolicy.md b/docs/models/vpn/ikepolicy.md index d2da28d16..b78b0fe50 100644 --- a/docs/models/vpn/ikepolicy.md +++ b/docs/models/vpn/ikepolicy.md @@ -1,6 +1,6 @@ # IKE Policies -An [Internet Key Exhcnage (IKE)](https://en.wikipedia.org/wiki/Internet_Key_Exchange) policy defines an IKE version, mode, and set of [proposals](./ikeproposal.md) to be used in IKE negotiation. These policies are referenced by [IPSec profiles](./ipsecprofile.md). +An [Internet Key Exchange (IKE)](https://en.wikipedia.org/wiki/Internet_Key_Exchange) policy defines an IKE version, mode, and set of [proposals](./ikeproposal.md) to be used in IKE negotiation. These policies are referenced by [IPSec profiles](./ipsecprofile.md). ## Fields From 75aeaab8eebb3920ead490da242ec6d8a9e0009c Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 15 Nov 2024 04:55:32 -0800 Subject: [PATCH 034/169] 12596 Add Allocated Resources to Cluster API (#17956) * 12596 Add Allocated Resources to Cluster API * 12596 Add Allocated Resources to Cluster API * 12596 Add Allocated Resources to Cluster API * 12596 Add Allocated Resources to Cluster API * 12596 review changes * 12596 review changes --- netbox/virtualization/api/serializers_/clusters.py | 10 +++++++++- netbox/virtualization/api/views.py | 7 ++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/netbox/virtualization/api/serializers_/clusters.py b/netbox/virtualization/api/serializers_/clusters.py index c0b636e33..450924fef 100644 --- a/netbox/virtualization/api/serializers_/clusters.py +++ b/netbox/virtualization/api/serializers_/clusters.py @@ -59,6 +59,14 @@ class ClusterSerializer(NetBoxModelSerializer): ) scope_id = serializers.IntegerField(allow_null=True, required=False, default=None) scope = serializers.SerializerMethodField(read_only=True) + allocated_vcpus = serializers.DecimalField( + read_only=True, + max_digits=8, + decimal_places=2, + + ) + allocated_memory = serializers.IntegerField(read_only=True) + allocated_disk = serializers.IntegerField(read_only=True) # Related object counts device_count = RelatedObjectCountField('devices') @@ -69,7 +77,7 @@ class ClusterSerializer(NetBoxModelSerializer): fields = [ 'id', 'url', 'display_url', 'display', 'name', 'type', 'group', 'status', 'tenant', 'scope_type', 'scope_id', 'scope', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'device_count', - 'virtualmachine_count', + 'virtualmachine_count', 'allocated_vcpus', 'allocated_memory', 'allocated_disk' ] brief_fields = ('id', 'url', 'display', 'name', 'description', 'virtualmachine_count') diff --git a/netbox/virtualization/api/views.py b/netbox/virtualization/api/views.py index fdf1d71be..93980ce28 100644 --- a/netbox/virtualization/api/views.py +++ b/netbox/virtualization/api/views.py @@ -1,3 +1,4 @@ +from django.db.models import Sum from rest_framework.routers import APIRootView from extras.api.mixins import ConfigContextQuerySetMixin, RenderConfigMixin @@ -33,7 +34,11 @@ class ClusterGroupViewSet(NetBoxModelViewSet): class ClusterViewSet(NetBoxModelViewSet): - queryset = Cluster.objects.all() + queryset = Cluster.objects.prefetch_related('virtual_machines').annotate( + allocated_vcpus=Sum('virtual_machines__vcpus'), + allocated_memory=Sum('virtual_machines__memory'), + allocated_disk=Sum('virtual_machines__disk'), + ) serializer_class = serializers.ClusterSerializer filterset_class = filtersets.ClusterFilterSet From 6ab0792f02495903045fbc8bb8efb0618e88f631 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 15 Nov 2024 06:32:09 -0800 Subject: [PATCH 035/169] Closes #11279: Replace `_name` natural key sorting with collation (#18009) * 11279 add collation * 11279 add collation * 11279 add collation * 11279 add collation * 11279 fix tables /tests * 11279 fix tests * 11279 refactor VirtualDisk * Clean up migrations * Misc cleanup * Correct errant file inclusion --------- Co-authored-by: Jeremy Stretch --- .../migrations/0049_natural_ordering.py | 22 ++ netbox/circuits/models/providers.py | 6 +- netbox/core/tests/test_changelog.py | 28 -- netbox/dcim/graphql/types.py | 20 +- .../migrations/0197_natural_sort_collation.py | 17 + .../dcim/migrations/0198_natural_ordering.py | 318 ++++++++++++++++++ .../dcim/models/device_component_templates.py | 14 +- netbox/dcim/models/device_components.py | 12 +- netbox/dcim/models/devices.py | 19 +- netbox/dcim/models/power.py | 6 +- netbox/dcim/models/racks.py | 10 +- netbox/dcim/models/sites.py | 11 +- netbox/dcim/tables/devices.py | 18 +- netbox/dcim/tables/devicetypes.py | 8 +- netbox/dcim/tables/racks.py | 1 - netbox/dcim/views.py | 7 +- .../ipam/migrations/0076_natural_ordering.py | 32 ++ netbox/ipam/models/asns.py | 3 +- netbox/ipam/models/vlans.py | 3 +- netbox/ipam/models/vrfs.py | 6 +- .../migrations/0017_natural_ordering.py | 27 ++ netbox/tenancy/models/contacts.py | 3 +- netbox/tenancy/models/tenants.py | 6 +- netbox/utilities/fields.py | 3 +- netbox/virtualization/graphql/types.py | 3 +- .../migrations/0046_natural_ordering.py | 43 +++ netbox/virtualization/models/clusters.py | 3 +- .../virtualization/models/virtualmachines.py | 34 +- .../virtualization/tables/virtualmachines.py | 1 - .../vpn/migrations/0007_natural_ordering.py | 47 +++ netbox/vpn/models/crypto.py | 15 +- netbox/vpn/models/l2vpn.py | 3 +- netbox/vpn/models/tunnels.py | 3 +- .../migrations/0012_natural_ordering.py | 17 + netbox/wireless/models.py | 3 +- 35 files changed, 622 insertions(+), 150 deletions(-) create mode 100644 netbox/circuits/migrations/0049_natural_ordering.py create mode 100644 netbox/dcim/migrations/0197_natural_sort_collation.py create mode 100644 netbox/dcim/migrations/0198_natural_ordering.py create mode 100644 netbox/ipam/migrations/0076_natural_ordering.py create mode 100644 netbox/tenancy/migrations/0017_natural_ordering.py create mode 100644 netbox/virtualization/migrations/0046_natural_ordering.py create mode 100644 netbox/vpn/migrations/0007_natural_ordering.py create mode 100644 netbox/wireless/migrations/0012_natural_ordering.py diff --git a/netbox/circuits/migrations/0049_natural_ordering.py b/netbox/circuits/migrations/0049_natural_ordering.py new file mode 100644 index 000000000..1b4f565e8 --- /dev/null +++ b/netbox/circuits/migrations/0049_natural_ordering.py @@ -0,0 +1,22 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0048_circuitterminations_cached_relations'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='provider', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='providernetwork', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + ] diff --git a/netbox/circuits/models/providers.py b/netbox/circuits/models/providers.py index f0fe77b1a..be81caa54 100644 --- a/netbox/circuits/models/providers.py +++ b/netbox/circuits/models/providers.py @@ -21,7 +21,8 @@ class Provider(ContactsMixin, PrimaryModel): verbose_name=_('name'), max_length=100, unique=True, - help_text=_('Full name of the provider') + help_text=_('Full name of the provider'), + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), @@ -95,7 +96,8 @@ class ProviderNetwork(PrimaryModel): """ name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) provider = models.ForeignKey( to='circuits.Provider', diff --git a/netbox/core/tests/test_changelog.py b/netbox/core/tests/test_changelog.py index c58968ee8..4914dbaf3 100644 --- a/netbox/core/tests/test_changelog.py +++ b/netbox/core/tests/test_changelog.py @@ -76,10 +76,6 @@ class ChangeLogViewTest(ModelViewTestCase): self.assertEqual(oc.postchange_data['custom_fields']['cf2'], form_data['cf_cf2']) self.assertEqual(oc.postchange_data['tags'], ['Tag 1', 'Tag 2']) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.postchange_data) - self.assertNotIn('_name', oc.postchange_data_clean) - def test_update_object(self): site = Site(name='Site 1', slug='site-1') site.save() @@ -117,12 +113,6 @@ class ChangeLogViewTest(ModelViewTestCase): self.assertEqual(oc.postchange_data['custom_fields']['cf2'], form_data['cf_cf2']) self.assertEqual(oc.postchange_data['tags'], ['Tag 3']) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.prechange_data) - self.assertNotIn('_name', oc.prechange_data_clean) - self.assertIn('_name', oc.postchange_data) - self.assertNotIn('_name', oc.postchange_data_clean) - def test_delete_object(self): site = Site( name='Site 1', @@ -153,10 +143,6 @@ class ChangeLogViewTest(ModelViewTestCase): self.assertEqual(oc.prechange_data['tags'], ['Tag 1', 'Tag 2']) self.assertEqual(oc.postchange_data, None) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.prechange_data) - self.assertNotIn('_name', oc.prechange_data_clean) - def test_bulk_update_objects(self): sites = ( Site(name='Site 1', slug='site-1', status=SiteStatusChoices.STATUS_ACTIVE), @@ -353,10 +339,6 @@ class ChangeLogAPITest(APITestCase): self.assertEqual(oc.postchange_data['custom_fields'], data['custom_fields']) self.assertEqual(oc.postchange_data['tags'], ['Tag 1', 'Tag 2']) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.postchange_data) - self.assertNotIn('_name', oc.postchange_data_clean) - def test_update_object(self): site = Site(name='Site 1', slug='site-1') site.save() @@ -389,12 +371,6 @@ class ChangeLogAPITest(APITestCase): self.assertEqual(oc.postchange_data['custom_fields'], data['custom_fields']) self.assertEqual(oc.postchange_data['tags'], ['Tag 3']) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.prechange_data) - self.assertNotIn('_name', oc.prechange_data_clean) - self.assertIn('_name', oc.postchange_data) - self.assertNotIn('_name', oc.postchange_data_clean) - def test_delete_object(self): site = Site( name='Site 1', @@ -423,10 +399,6 @@ class ChangeLogAPITest(APITestCase): self.assertEqual(oc.prechange_data['tags'], ['Tag 1', 'Tag 2']) self.assertEqual(oc.postchange_data, None) - # Check that private attributes were included in raw data but not display data - self.assertIn('_name', oc.prechange_data) - self.assertNotIn('_name', oc.prechange_data_clean) - def test_bulk_create_objects(self): data = ( { diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index 6493ec6b1..fc5f35780 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -76,7 +76,6 @@ class ComponentType( """ Base type for device/VM components """ - _name: str device: Annotated["DeviceType", strawberry.lazy('dcim.graphql.types')] @@ -93,7 +92,6 @@ class ComponentTemplateType( """ Base type for device/VM components """ - _name: str device_type: Annotated["DeviceTypeType", strawberry.lazy('dcim.graphql.types')] @@ -181,7 +179,7 @@ class ConsolePortType(ModularComponentType, CabledObjectMixin, PathEndpointMixin filters=ConsolePortTemplateFilter ) class ConsolePortTemplateType(ModularComponentTemplateType): - _name: str + pass @strawberry_django.type( @@ -199,7 +197,7 @@ class ConsoleServerPortType(ModularComponentType, CabledObjectMixin, PathEndpoin filters=ConsoleServerPortTemplateFilter ) class ConsoleServerPortTemplateType(ModularComponentTemplateType): - _name: str + pass @strawberry_django.type( @@ -208,7 +206,6 @@ class ConsoleServerPortTemplateType(ModularComponentTemplateType): filters=DeviceFilter ) class DeviceType(ConfigContextMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): - _name: str console_port_count: BigInt console_server_port_count: BigInt power_port_count: BigInt @@ -273,7 +270,7 @@ class DeviceBayType(ComponentType): filters=DeviceBayTemplateFilter ) class DeviceBayTemplateType(ComponentTemplateType): - _name: str + pass @strawberry_django.type( @@ -282,7 +279,6 @@ class DeviceBayTemplateType(ComponentTemplateType): filters=InventoryItemTemplateFilter ) class InventoryItemTemplateType(ComponentTemplateType): - _name: str role: Annotated["InventoryItemRoleType", strawberry.lazy('dcim.graphql.types')] | None manufacturer: Annotated["ManufacturerType", strawberry.lazy('dcim.graphql.types')] @@ -366,7 +362,6 @@ class FrontPortType(ModularComponentType, CabledObjectMixin): filters=FrontPortTemplateFilter ) class FrontPortTemplateType(ModularComponentTemplateType): - _name: str color: str rear_port: Annotated["RearPortTemplateType", strawberry.lazy('dcim.graphql.types')] @@ -377,6 +372,7 @@ class FrontPortTemplateType(ModularComponentTemplateType): filters=InterfaceFilter ) class InterfaceType(IPAddressesMixin, ModularComponentType, CabledObjectMixin, PathEndpointMixin): + _name: str mac_address: str | None wwn: str | None parent: Annotated["InterfaceType", strawberry.lazy('dcim.graphql.types')] | None @@ -527,7 +523,7 @@ class ModuleBayType(ModularComponentType): filters=ModuleBayTemplateFilter ) class ModuleBayTemplateType(ModularComponentTemplateType): - _name: str + pass @strawberry_django.type( @@ -588,7 +584,6 @@ class PowerOutletType(ModularComponentType, CabledObjectMixin, PathEndpointMixin filters=PowerOutletTemplateFilter ) class PowerOutletTemplateType(ModularComponentTemplateType): - _name: str power_port: Annotated["PowerPortTemplateType", strawberry.lazy('dcim.graphql.types')] | None @@ -620,8 +615,6 @@ class PowerPortType(ModularComponentType, CabledObjectMixin, PathEndpointMixin): filters=PowerPortTemplateFilter ) class PowerPortTemplateType(ModularComponentTemplateType): - _name: str - poweroutlet_templates: List[Annotated["PowerOutletTemplateType", strawberry.lazy('dcim.graphql.types')]] @@ -640,7 +633,6 @@ class RackTypeType(NetBoxObjectType): filters=RackFilter ) class RackType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): - _name: str site: Annotated["SiteType", strawberry.lazy('dcim.graphql.types')] location: Annotated["LocationType", strawberry.lazy('dcim.graphql.types')] | None tenant: Annotated["TenantType", strawberry.lazy('tenancy.graphql.types')] | None @@ -693,7 +685,6 @@ class RearPortType(ModularComponentType, CabledObjectMixin): filters=RearPortTemplateFilter ) class RearPortTemplateType(ModularComponentTemplateType): - _name: str color: str frontport_templates: List[Annotated["FrontPortTemplateType", strawberry.lazy('dcim.graphql.types')]] @@ -729,7 +720,6 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): filters=SiteFilter ) class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObjectType): - _name: str time_zone: str | None region: Annotated["RegionType", strawberry.lazy('dcim.graphql.types')] | None group: Annotated["SiteGroupType", strawberry.lazy('dcim.graphql.types')] | None diff --git a/netbox/dcim/migrations/0197_natural_sort_collation.py b/netbox/dcim/migrations/0197_natural_sort_collation.py new file mode 100644 index 000000000..a77632b37 --- /dev/null +++ b/netbox/dcim/migrations/0197_natural_sort_collation.py @@ -0,0 +1,17 @@ +from django.contrib.postgres.operations import CreateCollation +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0196_qinq_svlan'), + ] + + operations = [ + CreateCollation( + "natural_sort", + provider="icu", + locale="und-u-kn-true", + ), + ] diff --git a/netbox/dcim/migrations/0198_natural_ordering.py b/netbox/dcim/migrations/0198_natural_ordering.py new file mode 100644 index 000000000..83e94a195 --- /dev/null +++ b/netbox/dcim/migrations/0198_natural_ordering.py @@ -0,0 +1,318 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterModelOptions( + name='site', + options={'ordering': ('name',)}, + ), + migrations.AlterField( + model_name='site', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterModelOptions( + name='consoleport', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='consoleporttemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='consoleserverport', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='consoleserverporttemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='device', + options={'ordering': ('name', 'pk')}, + ), + migrations.AlterModelOptions( + name='devicebay', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='devicebaytemplate', + options={'ordering': ('device_type', 'name')}, + ), + migrations.AlterModelOptions( + name='frontport', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='frontporttemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='interfacetemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='inventoryitem', + options={'ordering': ('device__id', 'parent__id', 'name')}, + ), + migrations.AlterModelOptions( + name='inventoryitemtemplate', + options={'ordering': ('device_type__id', 'parent__id', 'name')}, + ), + migrations.AlterModelOptions( + name='modulebay', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='modulebaytemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='poweroutlet', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='poweroutlettemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='powerport', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='powerporttemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.AlterModelOptions( + name='rack', + options={'ordering': ('site', 'location', 'name', 'pk')}, + ), + migrations.AlterModelOptions( + name='rearport', + options={'ordering': ('device', 'name')}, + ), + migrations.AlterModelOptions( + name='rearporttemplate', + options={'ordering': ('device_type', 'module_type', 'name')}, + ), + migrations.RemoveField( + model_name='consoleport', + name='_name', + ), + migrations.RemoveField( + model_name='consoleporttemplate', + name='_name', + ), + migrations.RemoveField( + model_name='consoleserverport', + name='_name', + ), + migrations.RemoveField( + model_name='consoleserverporttemplate', + name='_name', + ), + migrations.RemoveField( + model_name='device', + name='_name', + ), + migrations.RemoveField( + model_name='devicebay', + name='_name', + ), + migrations.RemoveField( + model_name='devicebaytemplate', + name='_name', + ), + migrations.RemoveField( + model_name='frontport', + name='_name', + ), + migrations.RemoveField( + model_name='frontporttemplate', + name='_name', + ), + migrations.RemoveField( + model_name='inventoryitem', + name='_name', + ), + migrations.RemoveField( + model_name='inventoryitemtemplate', + name='_name', + ), + migrations.RemoveField( + model_name='modulebay', + name='_name', + ), + migrations.RemoveField( + model_name='modulebaytemplate', + name='_name', + ), + migrations.RemoveField( + model_name='poweroutlet', + name='_name', + ), + migrations.RemoveField( + model_name='poweroutlettemplate', + name='_name', + ), + migrations.RemoveField( + model_name='powerport', + name='_name', + ), + migrations.RemoveField( + model_name='powerporttemplate', + name='_name', + ), + migrations.RemoveField( + model_name='rack', + name='_name', + ), + migrations.RemoveField( + model_name='rearport', + name='_name', + ), + migrations.RemoveField( + model_name='rearporttemplate', + name='_name', + ), + migrations.RemoveField( + model_name='site', + name='_name', + ), + migrations.AlterField( + model_name='consoleport', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleporttemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleserverport', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='consoleserverporttemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='device', + name='name', + field=models.CharField(blank=True, db_collation='natural_sort', max_length=64, null=True), + ), + migrations.AlterField( + model_name='devicebay', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='devicebaytemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='frontport', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='frontporttemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='interface', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='interfacetemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='inventoryitem', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='inventoryitemtemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='modulebay', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='modulebaytemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='poweroutlet', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='poweroutlettemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='powerport', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='powerporttemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='rack', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='rearport', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='rearporttemplate', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='powerfeed', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='powerpanel', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='virtualchassis', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='virtualdevicecontext', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + ] diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 00555d49e..ddd4d2426 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -44,12 +44,8 @@ class ComponentTemplateModel(ChangeLoggedModel, TrackingModelMixin): max_length=64, help_text=_( "{module} is accepted as a substitution for the module bay position when attached to a module type." - ) - ) - _name = NaturalOrderingField( - target_field='name', - max_length=100, - blank=True + ), + db_collation="natural_sort" ) label = models.CharField( verbose_name=_('label'), @@ -65,7 +61,7 @@ class ComponentTemplateModel(ChangeLoggedModel, TrackingModelMixin): class Meta: abstract = True - ordering = ('device_type', '_name') + ordering = ('device_type', 'name') constraints = ( models.UniqueConstraint( fields=('device_type', 'name'), @@ -125,7 +121,7 @@ class ModularComponentTemplateModel(ComponentTemplateModel): class Meta: abstract = True - ordering = ('device_type', 'module_type', '_name') + ordering = ('device_type', 'module_type', 'name') constraints = ( models.UniqueConstraint( fields=('device_type', 'name'), @@ -782,7 +778,7 @@ class InventoryItemTemplate(MPTTModel, ComponentTemplateModel): component_model = InventoryItem class Meta: - ordering = ('device_type__id', 'parent__id', '_name') + ordering = ('device_type__id', 'parent__id', 'name') indexes = ( models.Index(fields=('component_type', 'component_id')), ) diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 36fd02add..31278a13c 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -50,12 +50,8 @@ class ComponentModel(NetBoxModel): ) name = models.CharField( verbose_name=_('name'), - max_length=64 - ) - _name = NaturalOrderingField( - target_field='name', - max_length=100, - blank=True + max_length=64, + db_collation="natural_sort" ) label = models.CharField( verbose_name=_('label'), @@ -71,7 +67,7 @@ class ComponentModel(NetBoxModel): class Meta: abstract = True - ordering = ('device', '_name') + ordering = ('device', 'name') constraints = ( models.UniqueConstraint( fields=('device', 'name'), @@ -1301,7 +1297,7 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin): clone_fields = ('device', 'parent', 'role', 'manufacturer', 'status', 'part_id') class Meta: - ordering = ('device__id', 'parent__id', '_name') + ordering = ('device__id', 'parent__id', 'name') indexes = ( models.Index(fields=('component_type', 'component_id')), ) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 47f4ee6c9..a836c5d37 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -23,7 +23,7 @@ from netbox.config import ConfigItem from netbox.models import OrganizationalModel, PrimaryModel from netbox.models.mixins import WeightMixin from netbox.models.features import ContactsMixin, ImageAttachmentsMixin -from utilities.fields import ColorField, CounterCacheField, NaturalOrderingField +from utilities.fields import ColorField, CounterCacheField from utilities.tracking import TrackingModelMixin from .device_components import * from .mixins import RenderConfigMixin @@ -582,13 +582,8 @@ class Device( verbose_name=_('name'), max_length=64, blank=True, - null=True - ) - _name = NaturalOrderingField( - target_field='name', - max_length=100, - blank=True, - null=True + null=True, + db_collation="natural_sort" ) serial = models.CharField( max_length=50, @@ -775,7 +770,7 @@ class Device( ) class Meta: - ordering = ('_name', 'pk') # Name may be null + ordering = ('name', 'pk') # Name may be null constraints = ( models.UniqueConstraint( Lower('name'), 'site', 'tenant', @@ -1320,7 +1315,8 @@ class VirtualChassis(PrimaryModel): ) name = models.CharField( verbose_name=_('name'), - max_length=64 + max_length=64, + db_collation="natural_sort" ) domain = models.CharField( verbose_name=_('domain'), @@ -1382,7 +1378,8 @@ class VirtualDeviceContext(PrimaryModel): ) name = models.CharField( verbose_name=_('name'), - max_length=64 + max_length=64, + db_collation="natural_sort" ) status = models.CharField( verbose_name=_('status'), diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index d0c6b18b6..284cfe832 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -36,7 +36,8 @@ class PowerPanel(ContactsMixin, ImageAttachmentsMixin, PrimaryModel): ) name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) prerequisite_models = ( @@ -86,7 +87,8 @@ class PowerFeed(PrimaryModel, PathEndpoint, CabledObjectModel): ) name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) status = models.CharField( verbose_name=_('status'), diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 013dfb619..08b7f5a35 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -19,7 +19,7 @@ from netbox.models.mixins import WeightMixin from netbox.models.features import ContactsMixin, ImageAttachmentsMixin from utilities.conversion import to_grams from utilities.data import array_to_string, drange -from utilities.fields import ColorField, NaturalOrderingField +from utilities.fields import ColorField from .device_components import PowerPort from .devices import Device, Module from .power import PowerFeed @@ -255,12 +255,8 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase): ) name = models.CharField( verbose_name=_('name'), - max_length=100 - ) - _name = NaturalOrderingField( - target_field='name', max_length=100, - blank=True + db_collation="natural_sort" ) facility_id = models.CharField( max_length=50, @@ -340,7 +336,7 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase): ) class Meta: - ordering = ('site', 'location', '_name', 'pk') # (site, location, name) may be non-unique + ordering = ('site', 'location', 'name', 'pk') # (site, location, name) may be non-unique constraints = ( # Name and facility_id must be unique *only* within a Location models.UniqueConstraint( diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index a290f4119..0985a8d7a 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -8,7 +8,6 @@ from dcim.choices import * from dcim.constants import * from netbox.models import NestedGroupModel, PrimaryModel from netbox.models.features import ContactsMixin, ImageAttachmentsMixin -from utilities.fields import NaturalOrderingField __all__ = ( 'Location', @@ -143,12 +142,8 @@ class Site(ContactsMixin, ImageAttachmentsMixin, PrimaryModel): verbose_name=_('name'), max_length=100, unique=True, - help_text=_("Full name of the site") - ) - _name = NaturalOrderingField( - target_field='name', - max_length=100, - blank=True + help_text=_("Full name of the site"), + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), @@ -245,7 +240,7 @@ class Site(ContactsMixin, ImageAttachmentsMixin, PrimaryModel): ) class Meta: - ordering = ('_name',) + ordering = ('name',) verbose_name = _('site') verbose_name_plural = _('sites') diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index fed33401c..b7634626d 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -132,7 +132,6 @@ class PlatformTable(NetBoxTable): class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): name = tables.TemplateColumn( verbose_name=_('Name'), - order_by=('_name',), template_code=DEVICE_LINK, linkify=True ) @@ -288,7 +287,6 @@ class DeviceComponentTable(NetBoxTable): name = tables.Column( verbose_name=_('Name'), linkify=True, - order_by=('_name',) ) device_status = columns.ChoiceFieldColumn( accessor=tables.A('device__status'), @@ -391,7 +389,6 @@ class DeviceConsolePortTable(ConsolePortTable): name = tables.TemplateColumn( verbose_name=_('Name'), template_code=' {{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -433,7 +430,6 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable): verbose_name=_('Name'), template_code=' ' '{{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -482,7 +478,6 @@ class DevicePowerPortTable(PowerPortTable): verbose_name=_('Name'), template_code=' ' '{{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -531,7 +526,6 @@ class DevicePowerOutletTable(PowerOutletTable): name = tables.TemplateColumn( verbose_name=_('Name'), template_code=' {{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -550,6 +544,11 @@ class DevicePowerOutletTable(PowerOutletTable): class BaseInterfaceTable(NetBoxTable): + name = tables.Column( + verbose_name=_('Name'), + linkify=True, + order_by=('_name',) + ) enabled = columns.BooleanColumn( verbose_name=_('Enabled'), ) @@ -597,7 +596,7 @@ class BaseInterfaceTable(NetBoxTable): return ",".join([str(obj) for obj in value.all()]) -class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpointTable): +class InterfaceTable(BaseInterfaceTable, ModularDeviceComponentTable, PathEndpointTable): device = tables.Column( verbose_name=_('Device'), linkify={ @@ -736,7 +735,6 @@ class DeviceFrontPortTable(FrontPortTable): verbose_name=_('Name'), template_code=' ' '{{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -783,7 +781,6 @@ class DeviceRearPortTable(RearPortTable): verbose_name=_('Name'), template_code=' ' '{{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -846,7 +843,6 @@ class DeviceDeviceBayTable(DeviceBayTable): verbose_name=_('Name'), template_code=' {{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) actions = columns.ActionsColumn( @@ -915,7 +911,6 @@ class DeviceModuleBayTable(ModuleBayTable): name = columns.MPTTColumn( verbose_name=_('Name'), linkify=True, - order_by=Accessor('_name') ) actions = columns.ActionsColumn( extra_buttons=MODULEBAY_BUTTONS @@ -982,7 +977,6 @@ class DeviceInventoryItemTable(InventoryItemTable): verbose_name=_('Name'), template_code='' '{{ value }}', - order_by=Accessor('_name'), attrs={'td': {'class': 'text-nowrap'}} ) diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index e8a4e35f1..a7f8f08e8 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -163,9 +163,7 @@ class ComponentTemplateTable(NetBoxTable): id = tables.Column( verbose_name=_('ID') ) - name = tables.Column( - order_by=('_name',) - ) + name = tables.Column() class Meta(NetBoxTable.Meta): exclude = ('id', ) @@ -220,6 +218,10 @@ class PowerOutletTemplateTable(ComponentTemplateTable): class InterfaceTemplateTable(ComponentTemplateTable): + name = tables.Column( + verbose_name=_('Name'), + order_by=('_name',) + ) enabled = columns.BooleanColumn( verbose_name=_('Enabled'), ) diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index a6b704161..dbd99ca24 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -111,7 +111,6 @@ class RackTypeTable(NetBoxTable): class RackTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): name = tables.Column( verbose_name=_('Name'), - order_by=('_name',), linkify=True ) location = tables.Column( diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 9a821a384..7a5a771a9 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -688,8 +688,7 @@ class RackElevationListView(generic.ObjectListView): sort = request.GET.get('sort', 'name') if sort not in ORDERING_CHOICES: sort = 'name' - sort_field = sort.replace("name", "_name") # Use natural ordering - racks = racks.order_by(sort_field) + racks = racks.order_by(sort) # Pagination per_page = get_paginate_count(request) @@ -731,8 +730,8 @@ class RackView(GetRelatedModelsMixin, generic.ObjectView): peer_racks = peer_racks.filter(location=instance.location) else: peer_racks = peer_racks.filter(location__isnull=True) - next_rack = peer_racks.filter(_name__gt=instance._name).first() - prev_rack = peer_racks.filter(_name__lt=instance._name).reverse().first() + next_rack = peer_racks.filter(name__gt=instance.name).first() + prev_rack = peer_racks.filter(name__lt=instance.name).reverse().first() # Determine any additional parameters to pass when embedding the rack elevations svg_extra = '&'.join([ diff --git a/netbox/ipam/migrations/0076_natural_ordering.py b/netbox/ipam/migrations/0076_natural_ordering.py new file mode 100644 index 000000000..8c7bfaea1 --- /dev/null +++ b/netbox/ipam/migrations/0076_natural_ordering.py @@ -0,0 +1,32 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0075_vlan_qinq'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='asnrange', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='routetarget', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=21, unique=True), + ), + migrations.AlterField( + model_name='vlangroup', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='vrf', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + ] diff --git a/netbox/ipam/models/asns.py b/netbox/ipam/models/asns.py index eb47426b2..c1d251301 100644 --- a/netbox/ipam/models/asns.py +++ b/netbox/ipam/models/asns.py @@ -16,7 +16,8 @@ class ASNRange(OrganizationalModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 7832cfc67..fa31fd608 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -35,7 +35,8 @@ class VLANGroup(OrganizationalModel): """ name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), diff --git a/netbox/ipam/models/vrfs.py b/netbox/ipam/models/vrfs.py index 26afb7927..6a8b8d649 100644 --- a/netbox/ipam/models/vrfs.py +++ b/netbox/ipam/models/vrfs.py @@ -18,7 +18,8 @@ class VRF(PrimaryModel): """ name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) rd = models.CharField( max_length=VRF_RD_MAX_LENGTH, @@ -74,7 +75,8 @@ class RouteTarget(PrimaryModel): verbose_name=_('name'), max_length=VRF_RD_MAX_LENGTH, # Same format options as VRF RD (RFC 4360 section 4) unique=True, - help_text=_('Route target value (formatted in accordance with RFC 4360)') + help_text=_('Route target value (formatted in accordance with RFC 4360)'), + db_collation="natural_sort" ) tenant = models.ForeignKey( to='tenancy.Tenant', diff --git a/netbox/tenancy/migrations/0017_natural_ordering.py b/netbox/tenancy/migrations/0017_natural_ordering.py new file mode 100644 index 000000000..de1fb49aa --- /dev/null +++ b/netbox/tenancy/migrations/0017_natural_ordering.py @@ -0,0 +1,27 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tenancy', '0016_charfield_null_choices'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='contact', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='tenant', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.AlterField( + model_name='tenantgroup', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + ] diff --git a/netbox/tenancy/models/contacts.py b/netbox/tenancy/models/contacts.py index 24ffef0cf..3969c8317 100644 --- a/netbox/tenancy/models/contacts.py +++ b/netbox/tenancy/models/contacts.py @@ -56,7 +56,8 @@ class Contact(PrimaryModel): ) name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) title = models.CharField( verbose_name=_('title'), diff --git a/netbox/tenancy/models/tenants.py b/netbox/tenancy/models/tenants.py index 7a2d9c2f8..55f0c5933 100644 --- a/netbox/tenancy/models/tenants.py +++ b/netbox/tenancy/models/tenants.py @@ -18,7 +18,8 @@ class TenantGroup(NestedGroupModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), @@ -39,7 +40,8 @@ class Tenant(ContactsMixin, PrimaryModel): """ name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), diff --git a/netbox/utilities/fields.py b/netbox/utilities/fields.py index ee71223cb..1d16a1d3f 100644 --- a/netbox/utilities/fields.py +++ b/netbox/utilities/fields.py @@ -5,7 +5,6 @@ from django.db import models from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ -from utilities.ordering import naturalize from .forms.widgets import ColorSelect from .validators import ColorValidator @@ -40,7 +39,7 @@ class NaturalOrderingField(models.CharField): """ description = "Stores a representation of its target field suitable for natural ordering" - def __init__(self, target_field, naturalize_function=naturalize, *args, **kwargs): + def __init__(self, target_field, naturalize_function, *args, **kwargs): self.target_field = target_field self.naturalize_function = naturalize_function super().__init__(*args, **kwargs) diff --git a/netbox/virtualization/graphql/types.py b/netbox/virtualization/graphql/types.py index 6052c8936..8476eac7e 100644 --- a/netbox/virtualization/graphql/types.py +++ b/netbox/virtualization/graphql/types.py @@ -25,7 +25,6 @@ class ComponentType(NetBoxObjectType): """ Base type for device/VM components """ - _name: str virtual_machine: Annotated["VirtualMachineType", strawberry.lazy('virtualization.graphql.types')] @@ -77,7 +76,6 @@ class ClusterTypeType(OrganizationalObjectType): filters=VirtualMachineFilter ) class VirtualMachineType(ConfigContextMixin, ContactsMixin, NetBoxObjectType): - _name: str interface_count: BigInt virtual_disk_count: BigInt interface_count: BigInt @@ -102,6 +100,7 @@ class VirtualMachineType(ConfigContextMixin, ContactsMixin, NetBoxObjectType): filters=VMInterfaceFilter ) class VMInterfaceType(IPAddressesMixin, ComponentType): + _name: str mac_address: str | None parent: Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')] | None bridge: Annotated["VMInterfaceType", strawberry.lazy('virtualization.graphql.types')] | None diff --git a/netbox/virtualization/migrations/0046_natural_ordering.py b/netbox/virtualization/migrations/0046_natural_ordering.py new file mode 100644 index 000000000..9284b6331 --- /dev/null +++ b/netbox/virtualization/migrations/0046_natural_ordering.py @@ -0,0 +1,43 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('virtualization', '0045_clusters_cached_relations'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterModelOptions( + name='virtualmachine', + options={'ordering': ('name', 'pk')}, + ), + migrations.AlterModelOptions( + name='virtualdisk', + options={'ordering': ('virtual_machine', 'name')}, + ), + migrations.RemoveField( + model_name='virtualmachine', + name='_name', + ), + migrations.AlterField( + model_name='virtualdisk', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='virtualmachine', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=64), + ), + migrations.AlterField( + model_name='cluster', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100), + ), + migrations.RemoveField( + model_name='virtualdisk', + name='_name', + ), + ] diff --git a/netbox/virtualization/models/clusters.py b/netbox/virtualization/models/clusters.py index 601ee7f23..9f7b97e29 100644 --- a/netbox/virtualization/models/clusters.py +++ b/netbox/virtualization/models/clusters.py @@ -50,7 +50,8 @@ class Cluster(ContactsMixin, CachedScopeMixin, PrimaryModel): """ name = models.CharField( verbose_name=_('name'), - max_length=100 + max_length=100, + db_collation="natural_sort" ) type = models.ForeignKey( verbose_name=_('type'), diff --git a/netbox/virtualization/models/virtualmachines.py b/netbox/virtualization/models/virtualmachines.py index 4ee41e403..ebfb2d6c5 100644 --- a/netbox/virtualization/models/virtualmachines.py +++ b/netbox/virtualization/models/virtualmachines.py @@ -69,12 +69,8 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co ) name = models.CharField( verbose_name=_('name'), - max_length=64 - ) - _name = NaturalOrderingField( - target_field='name', - max_length=100, - blank=True + max_length=64, + db_collation="natural_sort" ) status = models.CharField( max_length=50, @@ -152,7 +148,7 @@ class VirtualMachine(ContactsMixin, ImageAttachmentsMixin, RenderConfigMixin, Co ) class Meta: - ordering = ('_name', 'pk') # Name may be non-unique + ordering = ('name', 'pk') # Name may be non-unique constraints = ( models.UniqueConstraint( Lower('name'), 'cluster', 'tenant', @@ -273,13 +269,8 @@ class ComponentModel(NetBoxModel): ) name = models.CharField( verbose_name=_('name'), - max_length=64 - ) - _name = NaturalOrderingField( - target_field='name', - naturalize_function=naturalize_interface, - max_length=100, - blank=True + max_length=64, + db_collation="natural_sort" ) description = models.CharField( verbose_name=_('description'), @@ -289,7 +280,6 @@ class ComponentModel(NetBoxModel): class Meta: abstract = True - ordering = ('virtual_machine', CollateAsChar('_name')) constraints = ( models.UniqueConstraint( fields=('virtual_machine', 'name'), @@ -311,10 +301,9 @@ class ComponentModel(NetBoxModel): class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): - virtual_machine = models.ForeignKey( - to='virtualization.VirtualMachine', - on_delete=models.CASCADE, - related_name='interfaces' # Override ComponentModel + name = models.CharField( + verbose_name=_('name'), + max_length=64, ) _name = NaturalOrderingField( target_field='name', @@ -322,6 +311,11 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): max_length=100, blank=True ) + virtual_machine = models.ForeignKey( + to='virtualization.VirtualMachine', + on_delete=models.CASCADE, + related_name='interfaces' # Override ComponentModel + ) ip_addresses = GenericRelation( to='ipam.IPAddress', content_type_field='assigned_object_type', @@ -358,6 +352,7 @@ class VMInterface(ComponentModel, BaseInterface, TrackingModelMixin): class Meta(ComponentModel.Meta): verbose_name = _('interface') verbose_name_plural = _('interfaces') + ordering = ('virtual_machine', CollateAsChar('_name')) def clean(self): super().clean() @@ -416,3 +411,4 @@ class VirtualDisk(ComponentModel, TrackingModelMixin): class Meta(ComponentModel.Meta): verbose_name = _('virtual disk') verbose_name_plural = _('virtual disks') + ordering = ('virtual_machine', 'name') diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 4a3138711..26d32f8cf 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -53,7 +53,6 @@ VMINTERFACE_BUTTONS = """ class VirtualMachineTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): name = tables.Column( verbose_name=_('Name'), - order_by=('_name',), linkify=True ) status = columns.ChoiceFieldColumn( diff --git a/netbox/vpn/migrations/0007_natural_ordering.py b/netbox/vpn/migrations/0007_natural_ordering.py new file mode 100644 index 000000000..01dd4620f --- /dev/null +++ b/netbox/vpn/migrations/0007_natural_ordering.py @@ -0,0 +1,47 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('vpn', '0006_charfield_null_choices'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='ikepolicy', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='ikeproposal', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='ipsecpolicy', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='ipsecprofile', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='ipsecproposal', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='l2vpn', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + migrations.AlterField( + model_name='tunnel', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + ] diff --git a/netbox/vpn/models/crypto.py b/netbox/vpn/models/crypto.py index 2b721ec29..8e991b578 100644 --- a/netbox/vpn/models/crypto.py +++ b/netbox/vpn/models/crypto.py @@ -22,7 +22,8 @@ class IKEProposal(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) authentication_method = models.CharField( verbose_name=('authentication method'), @@ -67,7 +68,8 @@ class IKEPolicy(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) version = models.PositiveSmallIntegerField( verbose_name=_('version'), @@ -125,7 +127,8 @@ class IPSecProposal(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) encryption_algorithm = models.CharField( verbose_name=_('encryption'), @@ -176,7 +179,8 @@ class IPSecPolicy(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) proposals = models.ManyToManyField( to='vpn.IPSecProposal', @@ -211,7 +215,8 @@ class IPSecProfile(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) mode = models.CharField( verbose_name=_('mode'), diff --git a/netbox/vpn/models/l2vpn.py b/netbox/vpn/models/l2vpn.py index b799ab32d..3e562531d 100644 --- a/netbox/vpn/models/l2vpn.py +++ b/netbox/vpn/models/l2vpn.py @@ -20,7 +20,8 @@ class L2VPN(ContactsMixin, PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), diff --git a/netbox/vpn/models/tunnels.py b/netbox/vpn/models/tunnels.py index 3a0f1dc14..714024a81 100644 --- a/netbox/vpn/models/tunnels.py +++ b/netbox/vpn/models/tunnels.py @@ -31,7 +31,8 @@ class Tunnel(PrimaryModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) status = models.CharField( verbose_name=_('status'), diff --git a/netbox/wireless/migrations/0012_natural_ordering.py b/netbox/wireless/migrations/0012_natural_ordering.py new file mode 100644 index 000000000..da818bdd9 --- /dev/null +++ b/netbox/wireless/migrations/0012_natural_ordering.py @@ -0,0 +1,17 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('wireless', '0011_wirelesslan__location_wirelesslan__region_and_more'), + ('dcim', '0197_natural_sort_collation'), + ] + + operations = [ + migrations.AlterField( + model_name='wirelesslangroup', + name='name', + field=models.CharField(db_collation='natural_sort', max_length=100, unique=True), + ), + ] diff --git a/netbox/wireless/models.py b/netbox/wireless/models.py index d78c893a6..61ff72bc1 100644 --- a/netbox/wireless/models.py +++ b/netbox/wireless/models.py @@ -52,7 +52,8 @@ class WirelessLANGroup(NestedGroupModel): name = models.CharField( verbose_name=_('name'), max_length=100, - unique=True + unique=True, + db_collation="natural_sort" ) slug = models.SlugField( verbose_name=_('slug'), From 9fe6685562d0b6918c7acb6a83678bc399a3fd8a Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Fri, 15 Nov 2024 11:55:46 -0800 Subject: [PATCH 036/169] 17929 Add Scope Mixins to Prefix (#17930) * 17929 Add Scope Mixins to Prefix * 17929 Add Scope Mixins to Prefix * 17929 fixes for tests * 17929 merge latest scope changes * 12596 review changes * 12596 review changes * 12596 review changes * 12596 review changes * 12596 review changes * 12596 review changes * 17929 fix migrations --- netbox/dcim/api/serializers_/sites.py | 8 +-- netbox/dcim/base_filtersets.py | 67 ++++++++++++++++++ netbox/dcim/filtersets.py | 58 ---------------- netbox/dcim/graphql/types.py | 8 +-- netbox/dcim/models/mixins.py | 4 -- netbox/ipam/api/serializers_/ip.py | 5 +- netbox/ipam/apps.py | 2 +- netbox/ipam/constants.py | 5 -- netbox/ipam/filtersets.py | 56 +-------------- netbox/ipam/forms/bulk_edit.py | 30 +------- netbox/ipam/forms/bulk_import.py | 10 +-- netbox/ipam/forms/model_forms.py | 46 +------------ netbox/ipam/graphql/types.py | 2 +- .../0072_prefix_cached_relations.py | 14 ++-- netbox/ipam/models/ip.py | 69 +------------------ netbox/utilities/api.py | 2 +- netbox/virtualization/filtersets.py | 3 +- ...location_alter_cluster__region_and_more.py | 41 +++++++++++ ...l_ordering.py => 0047_natural_ordering.py} | 2 +- netbox/wireless/filtersets.py | 2 +- ...12_alter_wirelesslan__location_and_more.py | 41 +++++++++++ ...l_ordering.py => 0013_natural_ordering.py} | 2 +- 22 files changed, 187 insertions(+), 290 deletions(-) create mode 100644 netbox/dcim/base_filtersets.py create mode 100644 netbox/virtualization/migrations/0046_alter_cluster__location_alter_cluster__region_and_more.py rename netbox/virtualization/migrations/{0046_natural_ordering.py => 0047_natural_ordering.py} (93%) create mode 100644 netbox/wireless/migrations/0012_alter_wirelesslan__location_and_more.py rename netbox/wireless/migrations/{0012_natural_ordering.py => 0013_natural_ordering.py} (82%) diff --git a/netbox/dcim/api/serializers_/sites.py b/netbox/dcim/api/serializers_/sites.py index 7cd89e38c..b818cd954 100644 --- a/netbox/dcim/api/serializers_/sites.py +++ b/netbox/dcim/api/serializers_/sites.py @@ -21,7 +21,7 @@ __all__ = ( class RegionSerializer(NestedGroupModelSerializer): parent = NestedRegionSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) - prefix_count = RelatedObjectCountField('_prefixes') + prefix_count = RelatedObjectCountField('prefix_set') class Meta: model = Region @@ -35,7 +35,7 @@ class RegionSerializer(NestedGroupModelSerializer): class SiteGroupSerializer(NestedGroupModelSerializer): parent = NestedSiteGroupSerializer(required=False, allow_null=True, default=None) site_count = serializers.IntegerField(read_only=True, default=0) - prefix_count = RelatedObjectCountField('_prefixes') + prefix_count = RelatedObjectCountField('prefix_set') class Meta: model = SiteGroup @@ -63,7 +63,7 @@ class SiteSerializer(NetBoxModelSerializer): # Related object counts circuit_count = RelatedObjectCountField('circuit_terminations') device_count = RelatedObjectCountField('devices') - prefix_count = RelatedObjectCountField('_prefixes') + prefix_count = RelatedObjectCountField('prefix_set') rack_count = RelatedObjectCountField('racks') vlan_count = RelatedObjectCountField('vlans') virtualmachine_count = RelatedObjectCountField('virtual_machines') @@ -86,7 +86,7 @@ class LocationSerializer(NestedGroupModelSerializer): tenant = TenantSerializer(nested=True, required=False, allow_null=True) rack_count = serializers.IntegerField(read_only=True, default=0) device_count = serializers.IntegerField(read_only=True, default=0) - prefix_count = RelatedObjectCountField('_prefixes') + prefix_count = RelatedObjectCountField('prefix_set') class Meta: model = Location diff --git a/netbox/dcim/base_filtersets.py b/netbox/dcim/base_filtersets.py new file mode 100644 index 000000000..c007c0120 --- /dev/null +++ b/netbox/dcim/base_filtersets.py @@ -0,0 +1,67 @@ +import django_filters + +from django.utils.translation import gettext as _ +from netbox.filtersets import BaseFilterSet +from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter +from .models import * + +__all__ = ( + 'ScopedFilterSet', +) + + +class ScopedFilterSet(BaseFilterSet): + """ + Provides additional filtering functionality for location, site, etc.. for Scoped models. + """ + scope_type = ContentTypeFilter() + region_id = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + label=_('Region (ID)'), + ) + region = TreeNodeMultipleChoiceFilter( + queryset=Region.objects.all(), + field_name='_region', + lookup_expr='in', + to_field_name='slug', + label=_('Region (slug)'), + ) + site_group_id = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + label=_('Site group (ID)'), + ) + site_group = TreeNodeMultipleChoiceFilter( + queryset=SiteGroup.objects.all(), + field_name='_site_group', + lookup_expr='in', + to_field_name='slug', + label=_('Site group (slug)'), + ) + site_id = django_filters.ModelMultipleChoiceFilter( + queryset=Site.objects.all(), + field_name='_site', + label=_('Site (ID)'), + ) + site = django_filters.ModelMultipleChoiceFilter( + field_name='_site__slug', + queryset=Site.objects.all(), + to_field_name='slug', + label=_('Site (slug)'), + ) + location_id = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + label=_('Location (ID)'), + ) + location = TreeNodeMultipleChoiceFilter( + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + to_field_name='slug', + label=_('Location (slug)'), + ) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index df66ad77b..0371f882b 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -73,7 +73,6 @@ __all__ = ( 'RearPortFilterSet', 'RearPortTemplateFilterSet', 'RegionFilterSet', - 'ScopedFilterSet', 'SiteFilterSet', 'SiteGroupFilterSet', 'VirtualChassisFilterSet', @@ -2345,60 +2344,3 @@ class InterfaceConnectionFilterSet(ConnectionFilterSet): class Meta: model = Interface fields = tuple() - - -class ScopedFilterSet(BaseFilterSet): - """ - Provides additional filtering functionality for location, site, etc.. for Scoped models. - """ - scope_type = ContentTypeFilter() - region_id = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='_region', - lookup_expr='in', - label=_('Region (ID)'), - ) - region = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='_region', - lookup_expr='in', - to_field_name='slug', - label=_('Region (slug)'), - ) - site_group_id = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='_site_group', - lookup_expr='in', - label=_('Site group (ID)'), - ) - site_group = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='_site_group', - lookup_expr='in', - to_field_name='slug', - label=_('Site group (slug)'), - ) - site_id = django_filters.ModelMultipleChoiceFilter( - queryset=Site.objects.all(), - field_name='_site', - label=_('Site (ID)'), - ) - site = django_filters.ModelMultipleChoiceFilter( - field_name='_site__slug', - queryset=Site.objects.all(), - to_field_name='slug', - label=_('Site (slug)'), - ) - location_id = TreeNodeMultipleChoiceFilter( - queryset=Location.objects.all(), - field_name='_location', - lookup_expr='in', - label=_('Location (ID)'), - ) - location = TreeNodeMultipleChoiceFilter( - queryset=Location.objects.all(), - field_name='_location', - lookup_expr='in', - to_field_name='slug', - label=_('Location (slug)'), - ) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index fc5f35780..cc1bcac0f 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -461,7 +461,7 @@ class LocationType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, Organi @strawberry_django.field def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: - return self._clusters.all() + return self.cluster_set.all() @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: @@ -707,7 +707,7 @@ class RegionType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): @strawberry_django.field def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: - return self._clusters.all() + return self.cluster_set.all() @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: @@ -739,7 +739,7 @@ class SiteType(VLANGroupsMixin, ImageAttachmentsMixin, ContactsMixin, NetBoxObje @strawberry_django.field def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: - return self._clusters.all() + return self.cluster_set.all() @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: @@ -763,7 +763,7 @@ class SiteGroupType(VLANGroupsMixin, ContactsMixin, OrganizationalObjectType): @strawberry_django.field def clusters(self) -> List[Annotated["ClusterType", strawberry.lazy('virtualization.graphql.types')]]: - return self._clusters.all() + return self.cluster_set.all() @strawberry_django.field def circuit_terminations(self) -> List[Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')]]: diff --git a/netbox/dcim/models/mixins.py b/netbox/dcim/models/mixins.py index 1df3364c4..ac4d7dab9 100644 --- a/netbox/dcim/models/mixins.py +++ b/netbox/dcim/models/mixins.py @@ -59,28 +59,24 @@ class CachedScopeMixin(models.Model): _location = models.ForeignKey( to='dcim.Location', on_delete=models.CASCADE, - related_name='_%(class)ss', blank=True, null=True ) _site = models.ForeignKey( to='dcim.Site', on_delete=models.CASCADE, - related_name='_%(class)ss', blank=True, null=True ) _region = models.ForeignKey( to='dcim.Region', on_delete=models.CASCADE, - related_name='_%(class)ss', blank=True, null=True ) _site_group = models.ForeignKey( to='dcim.SiteGroup', on_delete=models.CASCADE, - related_name='_%(class)ss', blank=True, null=True ) diff --git a/netbox/ipam/api/serializers_/ip.py b/netbox/ipam/api/serializers_/ip.py index 0c3c141af..bfc7ac546 100644 --- a/netbox/ipam/api/serializers_/ip.py +++ b/netbox/ipam/api/serializers_/ip.py @@ -2,8 +2,9 @@ from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema_field from rest_framework import serializers +from dcim.constants import LOCATION_SCOPE_TYPES from ipam.choices import * -from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS, PREFIX_SCOPE_TYPES +from ipam.constants import IPADDRESS_ASSIGNMENT_MODELS from ipam.models import Aggregate, IPAddress, IPRange, Prefix from netbox.api.fields import ChoiceField, ContentTypeField from netbox.api.serializers import NetBoxModelSerializer @@ -47,7 +48,7 @@ class PrefixSerializer(NetBoxModelSerializer): vrf = VRFSerializer(nested=True, required=False, allow_null=True) scope_type = ContentTypeField( queryset=ContentType.objects.filter( - model__in=PREFIX_SCOPE_TYPES + model__in=LOCATION_SCOPE_TYPES ), allow_null=True, required=False, diff --git a/netbox/ipam/apps.py b/netbox/ipam/apps.py index e0463dfce..ae88d69a9 100644 --- a/netbox/ipam/apps.py +++ b/netbox/ipam/apps.py @@ -18,7 +18,7 @@ class IPAMConfig(AppConfig): # Register denormalized fields denormalized.register(Prefix, '_site', { '_region': 'region', - '_sitegroup': 'group', + '_site_group': 'group', }) denormalized.register(Prefix, '_location', { '_site': 'site', diff --git a/netbox/ipam/constants.py b/netbox/ipam/constants.py index c07b8441f..6dffd3287 100644 --- a/netbox/ipam/constants.py +++ b/netbox/ipam/constants.py @@ -23,11 +23,6 @@ VRF_RD_MAX_LENGTH = 21 PREFIX_LENGTH_MIN = 1 PREFIX_LENGTH_MAX = 127 # IPv6 -# models values for ContentTypes which may be Prefix scope types -PREFIX_SCOPE_TYPES = ( - 'region', 'sitegroup', 'site', 'location', -) - # # IPAddresses diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 88c869a50..c762c15fe 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -1,5 +1,6 @@ import django_filters import netaddr +from dcim.base_filtersets import ScopedFilterSet from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.db.models import Q @@ -9,7 +10,7 @@ from drf_spectacular.utils import extend_schema_field from netaddr.core import AddrFormatError from circuits.models import Provider -from dcim.models import Device, Interface, Location, Region, Site, SiteGroup +from dcim.models import Device, Interface, Region, Site, SiteGroup from netbox.filtersets import ChangeLoggedModelFilterSet, OrganizationalModelFilterSet, NetBoxModelFilterSet from tenancy.filtersets import TenancyFilterSet from utilities.filters import ( @@ -273,7 +274,7 @@ class RoleFilterSet(OrganizationalModelFilterSet): fields = ('id', 'name', 'slug', 'description', 'weight') -class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet): +class PrefixFilterSet(NetBoxModelFilterSet, ScopedFilterSet, TenancyFilterSet): family = django_filters.NumberFilter( field_name='prefix', lookup_expr='family' @@ -334,57 +335,6 @@ class PrefixFilterSet(NetBoxModelFilterSet, TenancyFilterSet): to_field_name='rd', label=_('VRF (RD)'), ) - scope_type = ContentTypeFilter() - region_id = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='_region', - lookup_expr='in', - label=_('Region (ID)'), - ) - region = TreeNodeMultipleChoiceFilter( - queryset=Region.objects.all(), - field_name='_region', - lookup_expr='in', - to_field_name='slug', - label=_('Region (slug)'), - ) - site_group_id = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='_sitegroup', - lookup_expr='in', - label=_('Site group (ID)'), - ) - site_group = TreeNodeMultipleChoiceFilter( - queryset=SiteGroup.objects.all(), - field_name='_sitegroup', - lookup_expr='in', - to_field_name='slug', - label=_('Site group (slug)'), - ) - site_id = django_filters.ModelMultipleChoiceFilter( - queryset=Site.objects.all(), - field_name='_site', - label=_('Site (ID)'), - ) - site = django_filters.ModelMultipleChoiceFilter( - field_name='_site__slug', - queryset=Site.objects.all(), - to_field_name='slug', - label=_('Site (slug)'), - ) - location_id = TreeNodeMultipleChoiceFilter( - queryset=Location.objects.all(), - field_name='_location', - lookup_expr='in', - label=_('Location (ID)'), - ) - location = TreeNodeMultipleChoiceFilter( - queryset=Location.objects.all(), - field_name='_location', - lookup_expr='in', - to_field_name='slug', - label=_('Location (slug)'), - ) vlan_id = django_filters.ModelMultipleChoiceFilter( queryset=VLAN.objects.all(), label=_('VLAN (ID)'), diff --git a/netbox/ipam/forms/bulk_edit.py b/netbox/ipam/forms/bulk_edit.py index c323a41c1..7f3216cfd 100644 --- a/netbox/ipam/forms/bulk_edit.py +++ b/netbox/ipam/forms/bulk_edit.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext_lazy as _ +from dcim.forms.mixins import ScopedBulkEditForm from dcim.models import Region, Site, SiteGroup from ipam.choices import * from ipam.constants import * @@ -205,20 +206,7 @@ class RoleBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('description',) -class PrefixBulkEditForm(NetBoxModelBulkEditForm): - scope_type = ContentTypeChoiceField( - queryset=ContentType.objects.filter(model__in=VLANGROUP_SCOPE_TYPES), - widget=HTMXSelect(method='post', attrs={'hx-select': '#form_fields'}), - required=False, - label=_('Scope type') - ) - scope = DynamicModelChoiceField( - label=_('Scope'), - queryset=Site.objects.none(), # Initial queryset - required=False, - disabled=True, - selector=True - ) +class PrefixBulkEditForm(ScopedBulkEditForm, NetBoxModelBulkEditForm): vlan_group = DynamicModelChoiceField( queryset=VLANGroup.objects.all(), required=False, @@ -286,20 +274,6 @@ class PrefixBulkEditForm(NetBoxModelBulkEditForm): 'vlan', 'vrf', 'tenant', 'role', 'scope', 'description', 'comments', ) - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if scope_type_id := get_field_value(self, 'scope_type'): - try: - scope_type = ContentType.objects.get(pk=scope_type_id) - model = scope_type.model_class() - self.fields['scope'].queryset = model.objects.all() - self.fields['scope'].widget.attrs['selector'] = model._meta.label_lower - self.fields['scope'].disabled = False - self.fields['scope'].label = _(bettertitle(model._meta.verbose_name)) - except ObjectDoesNotExist: - pass - class IPRangeBulkEditForm(NetBoxModelBulkEditForm): vrf = DynamicModelChoiceField( diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index 3be4ccc59..7e1382be9 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface, Site +from dcim.forms.mixins import ScopedImportForm from ipam.choices import * from ipam.constants import * from ipam.models import * @@ -154,7 +155,7 @@ class RoleImportForm(NetBoxModelImportForm): fields = ('name', 'slug', 'weight', 'description', 'tags') -class PrefixImportForm(NetBoxModelImportForm): +class PrefixImportForm(ScopedImportForm, NetBoxModelImportForm): vrf = CSVModelChoiceField( label=_('VRF'), queryset=VRF.objects.all(), @@ -169,11 +170,6 @@ class PrefixImportForm(NetBoxModelImportForm): to_field_name='name', help_text=_('Assigned tenant') ) - scope_type = CSVContentTypeField( - queryset=ContentType.objects.filter(model__in=PREFIX_SCOPE_TYPES), - required=False, - label=_('Scope type (app & model)') - ) vlan_group = CSVModelChoiceField( label=_('VLAN group'), queryset=VLANGroup.objects.all(), @@ -208,7 +204,7 @@ class PrefixImportForm(NetBoxModelImportForm): 'mark_utilized', 'description', 'comments', 'tags', ) labels = { - 'scope_id': 'Scope ID', + 'scope_id': _('Scope ID'), } def __init__(self, data=None, *args, **kwargs): diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 3d0cd3dd1..56a6dc3d9 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -4,6 +4,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.utils.translation import gettext_lazy as _ from dcim.models import Device, Interface, Site +from dcim.forms.mixins import ScopedForm from ipam.choices import * from ipam.constants import * from ipam.formfields import IPNetworkFormField @@ -197,25 +198,12 @@ class RoleForm(NetBoxModelForm): ] -class PrefixForm(TenancyForm, NetBoxModelForm): +class PrefixForm(TenancyForm, ScopedForm, NetBoxModelForm): vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, label=_('VRF') ) - scope_type = ContentTypeChoiceField( - queryset=ContentType.objects.filter(model__in=PREFIX_SCOPE_TYPES), - widget=HTMXSelect(), - required=False, - label=_('Scope type') - ) - scope = DynamicModelChoiceField( - label=_('Scope'), - queryset=Site.objects.none(), # Initial queryset - required=False, - disabled=True, - selector=True - ) vlan = DynamicModelChoiceField( queryset=VLAN.objects.all(), required=False, @@ -248,36 +236,6 @@ class PrefixForm(TenancyForm, NetBoxModelForm): 'tenant', 'description', 'comments', 'tags', ] - def __init__(self, *args, **kwargs): - instance = kwargs.get('instance') - initial = kwargs.get('initial', {}) - - if instance is not None and instance.scope: - initial['scope'] = instance.scope - kwargs['initial'] = initial - - super().__init__(*args, **kwargs) - - if scope_type_id := get_field_value(self, 'scope_type'): - try: - scope_type = ContentType.objects.get(pk=scope_type_id) - model = scope_type.model_class() - self.fields['scope'].queryset = model.objects.all() - self.fields['scope'].widget.attrs['selector'] = model._meta.label_lower - self.fields['scope'].disabled = False - self.fields['scope'].label = _(bettertitle(model._meta.verbose_name)) - except ObjectDoesNotExist: - pass - - if self.instance and scope_type_id != self.instance.scope_type_id: - self.initial['scope'] = None - - def clean(self): - super().clean() - - # Assign the selected scope (if any) - self.instance.scope = self.cleaned_data.get('scope') - class IPRangeForm(TenancyForm, NetBoxModelForm): vrf = DynamicModelChoiceField( diff --git a/netbox/ipam/graphql/types.py b/netbox/ipam/graphql/types.py index 2ef63cf0c..5a4813e0c 100644 --- a/netbox/ipam/graphql/types.py +++ b/netbox/ipam/graphql/types.py @@ -154,7 +154,7 @@ class IPRangeType(NetBoxObjectType): @strawberry_django.type( models.Prefix, - exclude=('scope_type', 'scope_id', '_location', '_region', '_site', '_sitegroup'), + exclude=('scope_type', 'scope_id', '_location', '_region', '_site', '_site_group'), filters=PrefixFilter ) class PrefixType(NetBoxObjectType, BaseIPAddressFamilyType): diff --git a/netbox/ipam/migrations/0072_prefix_cached_relations.py b/netbox/ipam/migrations/0072_prefix_cached_relations.py index 2b457ebda..4b438f7d5 100644 --- a/netbox/ipam/migrations/0072_prefix_cached_relations.py +++ b/netbox/ipam/migrations/0072_prefix_cached_relations.py @@ -11,11 +11,11 @@ def populate_denormalized_fields(apps, schema_editor): prefixes = Prefix.objects.filter(site__isnull=False).prefetch_related('site') for prefix in prefixes: prefix._region_id = prefix.site.region_id - prefix._sitegroup_id = prefix.site.group_id + prefix._site_group_id = prefix.site.group_id prefix._site_id = prefix.site_id # Note: Location cannot be set prior to migration - Prefix.objects.bulk_update(prefixes, ['_region', '_sitegroup', '_site']) + Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site']) class Migration(migrations.Migration): @@ -29,22 +29,22 @@ class Migration(migrations.Migration): migrations.AddField( model_name='prefix', name='_location', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_prefixes', to='dcim.location'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.location'), ), migrations.AddField( model_name='prefix', name='_region', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_prefixes', to='dcim.region'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.region'), ), migrations.AddField( model_name='prefix', name='_site', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_prefixes', to='dcim.site'), + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.site'), ), migrations.AddField( model_name='prefix', - name='_sitegroup', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='_prefixes', to='dcim.sitegroup'), + name='_site_group', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.sitegroup'), ), # Populate denormalized FK values diff --git a/netbox/ipam/models/ip.py b/netbox/ipam/models/ip.py index b17e26169..dcecbcdea 100644 --- a/netbox/ipam/models/ip.py +++ b/netbox/ipam/models/ip.py @@ -1,5 +1,4 @@ import netaddr -from django.apps import apps from django.contrib.contenttypes.fields import GenericForeignKey from django.core.exceptions import ValidationError from django.db import models @@ -9,6 +8,7 @@ from django.utils.functional import cached_property from django.utils.translation import gettext_lazy as _ from core.models import ObjectType +from dcim.models.mixins import CachedScopeMixin from ipam.choices import * from ipam.constants import * from ipam.fields import IPNetworkField, IPAddressField @@ -198,7 +198,7 @@ class Role(OrganizationalModel): return self.name -class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): +class Prefix(ContactsMixin, GetAvailablePrefixesMixin, CachedScopeMixin, PrimaryModel): """ A Prefix represents an IPv4 or IPv6 network, including mask length. Prefixes can optionally be scoped to certain areas and/or assigned to VRFs. A Prefix must be assigned a status and may optionally be assigned a used-define Role. @@ -208,22 +208,6 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): verbose_name=_('prefix'), help_text=_('IPv4 or IPv6 network with mask') ) - scope_type = models.ForeignKey( - to='contenttypes.ContentType', - on_delete=models.PROTECT, - limit_choices_to=Q(model__in=PREFIX_SCOPE_TYPES), - related_name='+', - blank=True, - null=True - ) - scope_id = models.PositiveBigIntegerField( - blank=True, - null=True - ) - scope = GenericForeignKey( - ct_field='scope_type', - fk_field='scope_id' - ) vrf = models.ForeignKey( to='ipam.VRF', on_delete=models.PROTECT, @@ -272,36 +256,6 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): help_text=_("Treat as fully utilized") ) - # Cached associations to enable efficient filtering - _location = models.ForeignKey( - to='dcim.Location', - on_delete=models.CASCADE, - related_name='_prefixes', - blank=True, - null=True - ) - _site = models.ForeignKey( - to='dcim.Site', - on_delete=models.CASCADE, - related_name='_prefixes', - blank=True, - null=True - ) - _region = models.ForeignKey( - to='dcim.Region', - on_delete=models.CASCADE, - related_name='_prefixes', - blank=True, - null=True - ) - _sitegroup = models.ForeignKey( - to='dcim.SiteGroup', - on_delete=models.CASCADE, - related_name='_prefixes', - blank=True, - null=True - ) - # Cached depth & child counts _depth = models.PositiveSmallIntegerField( default=0, @@ -368,25 +322,6 @@ class Prefix(ContactsMixin, GetAvailablePrefixesMixin, PrimaryModel): super().save(*args, **kwargs) - def cache_related_objects(self): - self._region = self._sitegroup = self._site = self._location = None - if self.scope_type: - scope_type = self.scope_type.model_class() - if scope_type == apps.get_model('dcim', 'region'): - self._region = self.scope - elif scope_type == apps.get_model('dcim', 'sitegroup'): - self._sitegroup = self.scope - elif scope_type == apps.get_model('dcim', 'site'): - self._region = self.scope.region - self._sitegroup = self.scope.group - self._site = self.scope - elif scope_type == apps.get_model('dcim', 'location'): - self._region = self.scope.site.region - self._sitegroup = self.scope.site.group - self._site = self.scope.site - self._location = self.scope - cache_related_objects.alters_data = True - @property def family(self): return self.prefix.version if self.prefix else None diff --git a/netbox/utilities/api.py b/netbox/utilities/api.py index 11b914811..6793c0526 100644 --- a/netbox/utilities/api.py +++ b/netbox/utilities/api.py @@ -129,7 +129,7 @@ def get_annotations_for_serializer(serializer_class, fields_to_include=None): for field_name, field in serializer_class._declared_fields.items(): if field_name in fields_to_include and type(field) is RelatedObjectCountField: - related_field = model._meta.get_field(field.relation).field + related_field = getattr(model, field.relation).field annotations[field_name] = count_related(related_field.model, related_field.name) return annotations diff --git a/netbox/virtualization/filtersets.py b/netbox/virtualization/filtersets.py index ac72bea12..ab25492b5 100644 --- a/netbox/virtualization/filtersets.py +++ b/netbox/virtualization/filtersets.py @@ -2,7 +2,8 @@ import django_filters from django.db.models import Q from django.utils.translation import gettext as _ -from dcim.filtersets import CommonInterfaceFilterSet, ScopedFilterSet +from dcim.filtersets import CommonInterfaceFilterSet +from dcim.base_filtersets import ScopedFilterSet from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate diff --git a/netbox/virtualization/migrations/0046_alter_cluster__location_alter_cluster__region_and_more.py b/netbox/virtualization/migrations/0046_alter_cluster__location_alter_cluster__region_and_more.py new file mode 100644 index 000000000..7b1168da0 --- /dev/null +++ b/netbox/virtualization/migrations/0046_alter_cluster__location_alter_cluster__region_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 5.0.9 on 2024-11-14 19:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0196_qinq_svlan'), + ('virtualization', '0045_clusters_cached_relations'), + ] + + operations = [ + migrations.AlterField( + model_name='cluster', + name='_location', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.location' + ), + ), + migrations.AlterField( + model_name='cluster', + name='_region', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.region' + ), + ), + migrations.AlterField( + model_name='cluster', + name='_site', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.site'), + ), + migrations.AlterField( + model_name='cluster', + name='_site_group', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.sitegroup' + ), + ), + ] diff --git a/netbox/virtualization/migrations/0046_natural_ordering.py b/netbox/virtualization/migrations/0047_natural_ordering.py similarity index 93% rename from netbox/virtualization/migrations/0046_natural_ordering.py rename to netbox/virtualization/migrations/0047_natural_ordering.py index 9284b6331..4454cfe2d 100644 --- a/netbox/virtualization/migrations/0046_natural_ordering.py +++ b/netbox/virtualization/migrations/0047_natural_ordering.py @@ -4,7 +4,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('virtualization', '0045_clusters_cached_relations'), + ('virtualization', '0046_alter_cluster__location_alter_cluster__region_and_more'), ('dcim', '0197_natural_sort_collation'), ] diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py index 5a4195e6c..cc5aefbd8 100644 --- a/netbox/wireless/filtersets.py +++ b/netbox/wireless/filtersets.py @@ -2,7 +2,7 @@ import django_filters from django.db.models import Q from dcim.choices import LinkStatusChoices -from dcim.filtersets import ScopedFilterSet +from dcim.base_filtersets import ScopedFilterSet from dcim.models import Interface from ipam.models import VLAN from netbox.filtersets import OrganizationalModelFilterSet, NetBoxModelFilterSet diff --git a/netbox/wireless/migrations/0012_alter_wirelesslan__location_and_more.py b/netbox/wireless/migrations/0012_alter_wirelesslan__location_and_more.py new file mode 100644 index 000000000..7edaff92b --- /dev/null +++ b/netbox/wireless/migrations/0012_alter_wirelesslan__location_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 5.0.9 on 2024-11-14 19:04 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('dcim', '0196_qinq_svlan'), + ('wireless', '0011_wirelesslan__location_wirelesslan__region_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='wirelesslan', + name='_location', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.location' + ), + ), + migrations.AlterField( + model_name='wirelesslan', + name='_region', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.region' + ), + ), + migrations.AlterField( + model_name='wirelesslan', + name='_site', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.site'), + ), + migrations.AlterField( + model_name='wirelesslan', + name='_site_group', + field=models.ForeignKey( + blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='dcim.sitegroup' + ), + ), + ] diff --git a/netbox/wireless/migrations/0012_natural_ordering.py b/netbox/wireless/migrations/0013_natural_ordering.py similarity index 82% rename from netbox/wireless/migrations/0012_natural_ordering.py rename to netbox/wireless/migrations/0013_natural_ordering.py index da818bdd9..e33c87c60 100644 --- a/netbox/wireless/migrations/0012_natural_ordering.py +++ b/netbox/wireless/migrations/0013_natural_ordering.py @@ -4,7 +4,7 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('wireless', '0011_wirelesslan__location_wirelesslan__region_and_more'), + ('wireless', '0012_alter_wirelesslan__location_and_more'), ('dcim', '0197_natural_sort_collation'), ] From b4f15092dbb849ee85fd2dd8caf988ea4bd7eadb Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 18 Nov 2024 14:44:57 -0500 Subject: [PATCH 037/169] Closes #5858: Implement a quick-add UI widget for related objects (#18016) * WIP * Misc cleanup * Add warning re: nested quick-adds --- netbox/circuits/forms/model_forms.py | 14 +++-- netbox/dcim/forms/model_forms.py | 21 +++++--- netbox/ipam/forms/model_forms.py | 14 +++-- netbox/netbox/views/generic/object_views.py | 41 +++++++++++---- netbox/project-static/dist/netbox.js | Bin 390388 -> 390918 bytes netbox/project-static/dist/netbox.js.map | Bin 527142 -> 527957 bytes netbox/project-static/src/buttons/reslug.ts | 48 +++++++++--------- netbox/project-static/src/htmx.ts | 11 ++-- netbox/project-static/src/quickAdd.ts | 39 ++++++++++++++ netbox/templates/htmx/quick_add.html | 28 ++++++++++ netbox/templates/htmx/quick_add_created.html | 22 ++++++++ netbox/tenancy/forms/forms.py | 1 + netbox/utilities/forms/fields/dynamic.py | 12 ++++- .../templates/widgets/apiselect.html | 27 +++++++--- netbox/virtualization/forms/model_forms.py | 6 ++- netbox/vpn/forms/model_forms.py | 9 ++-- netbox/wireless/forms/model_forms.py | 3 +- 17 files changed, 228 insertions(+), 68 deletions(-) create mode 100644 netbox/project-static/src/quickAdd.ts create mode 100644 netbox/templates/htmx/quick_add.html create mode 100644 netbox/templates/htmx/quick_add_created.html diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 10cd06563..9eeb0f588 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -50,7 +50,9 @@ class ProviderForm(NetBoxModelForm): class ProviderAccountForm(NetBoxModelForm): provider = DynamicModelChoiceField( label=_('Provider'), - queryset=Provider.objects.all() + queryset=Provider.objects.all(), + selector=True, + quick_add=True ) comments = CommentField() @@ -64,7 +66,9 @@ class ProviderAccountForm(NetBoxModelForm): class ProviderNetworkForm(NetBoxModelForm): provider = DynamicModelChoiceField( label=_('Provider'), - queryset=Provider.objects.all() + queryset=Provider.objects.all(), + selector=True, + quick_add=True ) comments = CommentField() @@ -97,7 +101,8 @@ class CircuitForm(TenancyForm, NetBoxModelForm): provider = DynamicModelChoiceField( label=_('Provider'), queryset=Provider.objects.all(), - selector=True + selector=True, + quick_add=True ) provider_account = DynamicModelChoiceField( label=_('Provider account'), @@ -108,7 +113,8 @@ class CircuitForm(TenancyForm, NetBoxModelForm): } ) type = DynamicModelChoiceField( - queryset=CircuitType.objects.all() + queryset=CircuitType.objects.all(), + quick_add=True ) comments = CommentField() diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 2fcdbe5fd..b004798af 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -112,12 +112,14 @@ class SiteForm(TenancyForm, NetBoxModelForm): region = DynamicModelChoiceField( label=_('Region'), queryset=Region.objects.all(), - required=False + required=False, + quick_add=True ) group = DynamicModelChoiceField( label=_('Group'), queryset=SiteGroup.objects.all(), - required=False + required=False, + quick_add=True ) asns = DynamicModelMultipleChoiceField( queryset=ASN.objects.all(), @@ -206,7 +208,8 @@ class RackRoleForm(NetBoxModelForm): class RackTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), - queryset=Manufacturer.objects.all() + queryset=Manufacturer.objects.all(), + quick_add=True ) comments = CommentField() slug = SlugField( @@ -348,7 +351,8 @@ class ManufacturerForm(NetBoxModelForm): class DeviceTypeForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), - queryset=Manufacturer.objects.all() + queryset=Manufacturer.objects.all(), + quick_add=True ) default_platform = DynamicModelChoiceField( label=_('Default platform'), @@ -436,7 +440,8 @@ class PlatformForm(NetBoxModelForm): manufacturer = DynamicModelChoiceField( label=_('Manufacturer'), queryset=Manufacturer.objects.all(), - required=False + required=False, + quick_add=True ) config_template = DynamicModelChoiceField( label=_('Config template'), @@ -508,7 +513,8 @@ class DeviceForm(TenancyForm, NetBoxModelForm): ) role = DynamicModelChoiceField( label=_('Device role'), - queryset=DeviceRole.objects.all() + queryset=DeviceRole.objects.all(), + quick_add=True ) platform = DynamicModelChoiceField( label=_('Platform'), @@ -750,7 +756,8 @@ class PowerFeedForm(TenancyForm, NetBoxModelForm): power_panel = DynamicModelChoiceField( label=_('Power panel'), queryset=PowerPanel.objects.all(), - selector=True + selector=True, + quick_add=True ) rack = DynamicModelChoiceField( label=_('Rack'), diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index 56a6dc3d9..53ffe8f3f 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -109,7 +109,8 @@ class RIRForm(NetBoxModelForm): class AggregateForm(TenancyForm, NetBoxModelForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), - label=_('RIR') + label=_('RIR'), + quick_add=True ) comments = CommentField() @@ -132,6 +133,7 @@ class ASNRangeForm(TenancyForm, NetBoxModelForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), label=_('RIR'), + quick_add=True ) slug = SlugField() fieldsets = ( @@ -150,6 +152,7 @@ class ASNForm(TenancyForm, NetBoxModelForm): rir = DynamicModelChoiceField( queryset=RIR.objects.all(), label=_('RIR'), + quick_add=True ) sites = DynamicModelMultipleChoiceField( queryset=Site.objects.all(), @@ -216,7 +219,8 @@ class PrefixForm(TenancyForm, ScopedForm, NetBoxModelForm): role = DynamicModelChoiceField( label=_('Role'), queryset=Role.objects.all(), - required=False + required=False, + quick_add=True ) comments = CommentField() @@ -246,7 +250,8 @@ class IPRangeForm(TenancyForm, NetBoxModelForm): role = DynamicModelChoiceField( label=_('Role'), queryset=Role.objects.all(), - required=False + required=False, + quick_add=True ) comments = CommentField() @@ -639,7 +644,8 @@ class VLANForm(TenancyForm, NetBoxModelForm): role = DynamicModelChoiceField( label=_('Role'), queryset=Role.objects.all(), - required=False + required=False, + quick_add=True ) qinq_svlan = DynamicModelChoiceField( label=_('Q-in-Q SVLAN'), diff --git a/netbox/netbox/views/generic/object_views.py b/netbox/netbox/views/generic/object_views.py index 0686e52b7..fb554ca4f 100644 --- a/netbox/netbox/views/generic/object_views.py +++ b/netbox/netbox/views/generic/object_views.py @@ -233,18 +233,23 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): form = self.form(instance=obj, initial=initial_data) restrict_form_fields(form, request.user) - # If this is an HTMX request, return only the rendered form HTML - if htmx_partial(request): - return render(request, self.htmx_template_name, { - 'model': model, - 'object': obj, - 'form': form, - }) - - return render(request, self.template_name, { + context = { 'model': model, 'object': obj, 'form': form, + } + + # If the form is being displayed within a "quick add" widget, + # use the appropriate template + if request.GET.get('_quickadd'): + return render(request, 'htmx/quick_add.html', context) + + # If this is an HTMX request, return only the rendered form HTML + if htmx_partial(request): + return render(request, self.htmx_template_name, context) + + return render(request, self.template_name, { + **context, 'return_url': self.get_return_url(request, obj), 'prerequisite_model': get_prerequisite_model(self.queryset), **self.get_extra_context(request, obj), @@ -259,6 +264,7 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): """ logger = logging.getLogger('netbox.views.ObjectEditView') obj = self.get_object(**kwargs) + model = self.queryset.model # Take a snapshot for change logging (if editing an existing object) if obj.pk and hasattr(obj, 'snapshot'): @@ -292,6 +298,12 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): msg = f'{msg} {obj}' messages.success(request, msg) + # Object was created via "quick add" modal + if '_quickadd' in request.POST: + return render(request, 'htmx/quick_add_created.html', { + 'object': obj, + }) + # If adding another object, redirect back to the edit form if '_addanother' in request.POST: redirect_url = request.path @@ -324,12 +336,19 @@ class ObjectEditView(GetReturnURLMixin, BaseObjectView): else: logger.debug("Form validation failed") - return render(request, self.template_name, { + context = { + 'model': model, 'object': obj, 'form': form, 'return_url': self.get_return_url(request, obj), **self.get_extra_context(request, obj), - }) + } + + # Form was submitted via a "quick add" widget + if '_quickadd' in request.POST: + return render(request, 'htmx/quick_add.html', context) + + return render(request, self.template_name, context) class ObjectDeleteView(GetReturnURLMixin, BaseObjectView): diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 969d5c73a704424190120ac1a6c96af13085b025..5e24ee6250e4ad778886c374c7ca972faf2e3ce6 100644 GIT binary patch delta 9318 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 diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index 0f4ac63d3d6199f281667fc18788c7e456278a22..a05e8edb51d286b535fab2371e7b9ad18b49d4b0 100644 GIT binary patch delta 1286 zcmZWpJ#W)s5LSw*jTrb+DX0ulr3}zlR2@J9!Ek=#q-ij&6@_4glsd7Sx^E9>&(c>DM!yUQGD~Q@^N4T)TA&0no<-27IfhQ_`(1v3JLPHAxZ!y z=d1!%)I=G>Ivq=#v@rmtsDKRhNwJfsin3@Tv#0`8ky0))Pf1dl%di3AUZ!w0##Mz& z6?|iyL2S+C6sHAX88oL&H#!+%p34HA>&6^48W}md`4XXBycvx=i74PS@$sIrlqtj) zhRTe(N(FW$UKlFb%xe5-sNA?*q*#>S_gO?HPRmtf+Gu)s*0l9)Lb)Iwm3f&BzHvGbaV$bal? z^3JO9!J0C=!c+Oly0Ak(WxJEM?7t4he@4Rw@#7hFae!O5pt!9Ad1NJ9=2fF?B*$Qh zXyuB)x2z&b>r=D@=wu|j8ly08FJlxclnN8ecweZL3{5<9032djV&Ma{414(G@@7hl z&2O10sJcL;E@AqTSY?4RCYex1ps`M9TqPLRWOF;bxhSaOR}Lx;olApOwwx4V?W#|w@L2vG)GX?(ktaEW(*0i}eI8x8YZ#3<`c2XLDIHz47ebuza F)E}CVZ*>3w delta 593 zcmYjNO-lk%6h)nKC>NEq5DG+a_dp_|O%ZqAjFZYVO(tTrF@4C8jN+)ZF+nF>w{bQt zBeyMrS@#2?RkZ2{v})b1_ugc>xR=ZQIOp8+ejk4v$DeA+VJ|uAB?B~qG(ui4DZHEq zTJFI>c<5&UG>lY$63PSQ5dk26r2yW=d{mwr82|>NBTHsS85!jODoCSU%t}HN?qZ~a zl1Bg7#WY(kpfW(&PZS}ARiyUW^^BO}XflQ89H7uj+3|@udQD;+8p43DCB&t$3uI#e z8#7r=nQFmlx}m^~-;}a*0*U}dw%d|($bB0Mc=OPo8h|grFDb0SZw%c{IYK;;b&nlk zV~vX`@PDV{8%Ib4ad$Lv1R4w8#992j>u*cI|5BKWD~U-?amhvgi9s9i=Pvh{_)hcO zkftr_M2Sh=QjeIf9Q*5(CQawyIs-SS;M_)2;vM%g7G4jWd4pJZ|2djANxhmt@q}IP z)TB('button#reslug')) { + const form = slugButton.form; + if (form == null) continue; + const slugField = form.querySelector('#id_slug') as HTMLInputElement; + if (slugField == null) continue; + const sourceId = slugField.getAttribute('slug-source'); + const sourceField = form.querySelector(`#id_${sourceId}`) as HTMLInputElement; - if (sourceField === null) { - console.error('Unable to find field for slug field.'); - return; - } + const slugLengthAttr = slugField.getAttribute('maxlength'); + let slugLength = 50; - const slugLengthAttr = slugField.getAttribute('maxlength'); - let slugLength = 50; - - if (slugLengthAttr) { - slugLength = Number(slugLengthAttr); - } - sourceField.addEventListener('blur', () => { - if (!slugField.value) { - slugField.value = slugify(sourceField.value, slugLength); + if (slugLengthAttr) { + slugLength = Number(slugLengthAttr); } - }); - slugButton.addEventListener('click', () => { - slugField.value = slugify(sourceField.value, slugLength); - }); + sourceField.addEventListener('blur', () => { + if (!slugField.value) { + slugField.value = slugify(sourceField.value, slugLength); + } + }); + slugButton.addEventListener('click', () => { + slugField.value = slugify(sourceField.value, slugLength); + }); + } } diff --git a/netbox/project-static/src/htmx.ts b/netbox/project-static/src/htmx.ts index f4092036b..6a772011b 100644 --- a/netbox/project-static/src/htmx.ts +++ b/netbox/project-static/src/htmx.ts @@ -4,11 +4,16 @@ import { initSelects } from './select'; import { initObjectSelector } from './objectSelector'; import { initBootstrap } from './bs'; import { initMessages } from './messages'; +import { initQuickAdd } from './quickAdd'; function initDepedencies(): void { - for (const init of [initButtons, initClipboard, initSelects, initObjectSelector, initBootstrap, initMessages]) { - init(); - } + initButtons(); + initClipboard(); + initSelects(); + initObjectSelector(); + initQuickAdd(); + initBootstrap(); + initMessages(); } /** diff --git a/netbox/project-static/src/quickAdd.ts b/netbox/project-static/src/quickAdd.ts new file mode 100644 index 000000000..e038f5d19 --- /dev/null +++ b/netbox/project-static/src/quickAdd.ts @@ -0,0 +1,39 @@ +import { Modal } from 'bootstrap'; + +function handleQuickAddObject(): void { + const quick_add = document.getElementById('quick-add-object'); + if (quick_add == null) return; + + const object_id = quick_add.getAttribute('data-object-id'); + if (object_id == null) return; + const object_repr = quick_add.getAttribute('data-object-repr'); + if (object_repr == null) return; + + const target_id = quick_add.getAttribute('data-target-id'); + if (target_id == null) return; + const target = document.getElementById(target_id); + if (target == null) return; + + //@ts-expect-error tomselect added on init + target.tomselect.addOption({ + id: object_id, + display: object_repr, + }); + //@ts-expect-error tomselect added on init + target.tomselect.addItem(object_id); + + const modal_element = document.getElementById('htmx-modal'); + if (modal_element) { + const modal = Modal.getInstance(modal_element); + if (modal) { + modal.hide(); + } + } +} + +export function initQuickAdd(): void { + const quick_add_modal = document.getElementById('htmx-modal-content'); + if (quick_add_modal) { + quick_add_modal.addEventListener('htmx:afterSwap', () => handleQuickAddObject()); + } +} diff --git a/netbox/templates/htmx/quick_add.html b/netbox/templates/htmx/quick_add.html new file mode 100644 index 000000000..9473e14a1 --- /dev/null +++ b/netbox/templates/htmx/quick_add.html @@ -0,0 +1,28 @@ +{% load form_helpers %} +{% load helpers %} +{% load i18n %} + + + diff --git a/netbox/templates/htmx/quick_add_created.html b/netbox/templates/htmx/quick_add_created.html new file mode 100644 index 000000000..3b1a24c48 --- /dev/null +++ b/netbox/templates/htmx/quick_add_created.html @@ -0,0 +1,22 @@ +{% load form_helpers %} +{% load helpers %} +{% load i18n %} + + + diff --git a/netbox/tenancy/forms/forms.py b/netbox/tenancy/forms/forms.py index 114253e7a..0edb36348 100644 --- a/netbox/tenancy/forms/forms.py +++ b/netbox/tenancy/forms/forms.py @@ -25,6 +25,7 @@ class TenancyForm(forms.Form): label=_('Tenant'), queryset=Tenant.objects.all(), required=False, + quick_add=True, query_params={ 'group_id': '$tenant_group' } diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py index 6666c0e4d..13d5ffc70 100644 --- a/netbox/utilities/forms/fields/dynamic.py +++ b/netbox/utilities/forms/fields/dynamic.py @@ -2,7 +2,7 @@ import django_filters from django import forms from django.conf import settings from django.forms import BoundField -from django.urls import reverse +from django.urls import reverse, reverse_lazy from utilities.forms import widgets from utilities.views import get_viewname @@ -66,6 +66,8 @@ class DynamicModelChoiceMixin: choice (DEPRECATED: pass `context={'disabled': '$fieldname'}` instead) context: A mapping of
+ {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% plugin_left_page object %} + +
+ {% include 'inc/panels/comments.html' %} + {% plugin_right_page object %} +
+ +
+
+ {% plugin_full_width_page object %} +
+
+{% endblock %} diff --git a/netbox/templates/virtualization/vminterface.html b/netbox/templates/virtualization/vminterface.html index 13cc8aa2f..88c9379cf 100644 --- a/netbox/templates/virtualization/vminterface.html +++ b/netbox/templates/virtualization/vminterface.html @@ -14,73 +14,85 @@ {% block content %}
-
-

{% trans "Interface" %}

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
{% trans "Virtual Machine" %}{{ object.virtual_machine|linkify }}
{% trans "Name" %}{{ object.name }}
{% trans "Enabled" %} - {% if object.enabled %} - - {% else %} - - {% endif %} -
{% trans "Parent" %}{{ object.parent|linkify|placeholder }}
{% trans "Bridge" %}{{ object.bridge|linkify|placeholder }}
{% trans "VRF" %}{{ object.vrf|linkify|placeholder }}
{% trans "Description" %}{{ object.description|placeholder }}
{% trans "MTU" %}{{ object.mtu|placeholder }}
{% trans "MAC Address" %}{{ object.mac_address|placeholder }}
{% trans "802.1Q Mode" %}{{ object.get_mode_display|placeholder }}
{% trans "Tunnel" %}{{ object.tunnel_termination.tunnel|linkify|placeholder }}
{% trans "VLAN Translation" %}{{ object.vlan_translation_policy|linkify|placeholder }}
-
- {% include 'inc/panels/tags.html' %} - {% plugin_left_page object %} +
+

{% trans "Interface" %}

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
{% trans "Virtual Machine" %}{{ object.virtual_machine|linkify }}
{% trans "Name" %}{{ object.name }}
{% trans "Enabled" %} + {% if object.enabled %} + + {% else %} + + {% endif %} +
{% trans "Parent" %}{{ object.parent|linkify|placeholder }}
{% trans "Bridge" %}{{ object.bridge|linkify|placeholder }}
{% trans "Description" %}{{ object.description|placeholder }}
{% trans "MTU" %}{{ object.mtu|placeholder }}
{% trans "802.1Q Mode" %}{{ object.get_mode_display|placeholder }}
{% trans "Tunnel" %}{{ object.tunnel_termination.tunnel|linkify|placeholder }}
-
- {% include 'inc/panels/custom_fields.html' %} - {% include 'ipam/inc/panels/fhrp_groups.html' %} - {% plugin_right_page object %} + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
+
+ {% include 'inc/panels/custom_fields.html' %} +
+

{% trans "Addressing" %}

+ + + + + + + + + + + + + +
{% trans "MAC Address" %} + {% if object.mac_address %} + {{ object.mac_address }} + {% trans "Primary" %} + {% else %} + {{ ''|placeholder }} + {% endif %} +
{% trans "VRF" %}{{ object.vrf|linkify|placeholder }}
{% trans "VLAN Translation" %}{{ object.vlan_translation_policy|linkify|placeholder }}
+ {% include 'ipam/inc/panels/fhrp_groups.html' %} + {% plugin_right_page object %} +
@@ -99,6 +111,24 @@
+
+
+
+

+ {% trans "MAC Addresses" %} + {% if perms.ipam.add_macaddress %} + + {% endif %} +

+ {% htmx_table 'dcim:macaddress_list' vminterface_id=object.pk %} +
+
+
{% include 'inc/panel_table.html' with table=vlan_table heading="VLANs" %} diff --git a/netbox/utilities/tests/test_filters.py b/netbox/utilities/tests/test_filters.py index 53e6eb985..031f31a12 100644 --- a/netbox/utilities/tests/test_filters.py +++ b/netbox/utilities/tests/test_filters.py @@ -9,7 +9,7 @@ from dcim.choices import * from dcim.fields import MACAddressField from dcim.filtersets import DeviceFilterSet, SiteFilterSet, InterfaceFilterSet from dcim.models import ( - Device, DeviceRole, DeviceType, Interface, Manufacturer, Platform, Rack, Region, Site + Device, DeviceRole, DeviceType, Interface, MACAddress, Manufacturer, Platform, Rack, Region, Site ) from extras.filters import TagFilter from extras.models import TaggedItem @@ -433,16 +433,33 @@ class DynamicFilterLookupExpressionTest(TestCase): ) Device.objects.bulk_create(devices) + mac_addresses = ( + MACAddress(mac_address='00-00-00-00-00-01'), + MACAddress(mac_address='aa-00-00-00-00-01'), + MACAddress(mac_address='00-00-00-00-00-02'), + MACAddress(mac_address='bb-00-00-00-00-02'), + MACAddress(mac_address='00-00-00-00-00-03'), + MACAddress(mac_address='cc-00-00-00-00-03'), + ) + MACAddress.objects.bulk_create(mac_addresses) + interfaces = ( - Interface(device=devices[0], name='Interface 1', mac_address='00-00-00-00-00-01'), - Interface(device=devices[0], name='Interface 2', mac_address='aa-00-00-00-00-01'), - Interface(device=devices[1], name='Interface 3', mac_address='00-00-00-00-00-02'), - Interface(device=devices[1], name='Interface 4', mac_address='bb-00-00-00-00-02'), - Interface(device=devices[2], name='Interface 5', mac_address='00-00-00-00-00-03'), - Interface(device=devices[2], name='Interface 6', mac_address='cc-00-00-00-00-03', rf_role=WirelessRoleChoices.ROLE_AP), + Interface(device=devices[0], name='Interface 1'), + Interface(device=devices[0], name='Interface 2'), + Interface(device=devices[1], name='Interface 3'), + Interface(device=devices[1], name='Interface 4'), + Interface(device=devices[2], name='Interface 5'), + Interface(device=devices[2], name='Interface 6', rf_role=WirelessRoleChoices.ROLE_AP), ) Interface.objects.bulk_create(interfaces) + interfaces[0].mac_addresses.set([mac_addresses[0]]) + interfaces[1].mac_addresses.set([mac_addresses[1]]) + interfaces[2].mac_addresses.set([mac_addresses[2]]) + interfaces[3].mac_addresses.set([mac_addresses[3]]) + interfaces[4].mac_addresses.set([mac_addresses[4]]) + interfaces[5].mac_addresses.set([mac_addresses[5]]) + def test_site_name_negation(self): params = {'name__n': ['Site 1']} self.assertEqual(SiteFilterSet(params, Site.objects.all()).qs.count(), 2) diff --git a/netbox/virtualization/api/serializers_/virtualmachines.py b/netbox/virtualization/api/serializers_/virtualmachines.py index 9b7000def..dfc205b7c 100644 --- a/netbox/virtualization/api/serializers_/virtualmachines.py +++ b/netbox/virtualization/api/serializers_/virtualmachines.py @@ -2,6 +2,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from dcim.api.serializers_.devices import DeviceSerializer +from dcim.api.serializers_.device_components import MACAddressSerializer from dcim.api.serializers_.platforms import PlatformSerializer from dcim.api.serializers_.roles import DeviceRoleSerializer from dcim.api.serializers_.sites import SiteSerializer @@ -95,19 +96,18 @@ class VMInterfaceSerializer(NetBoxModelSerializer): l2vpn_termination = L2VPNTerminationSerializer(nested=True, read_only=True, allow_null=True) count_ipaddresses = serializers.IntegerField(read_only=True) count_fhrp_groups = serializers.IntegerField(read_only=True) - mac_address = serializers.CharField( - required=False, - default=None, - allow_null=True - ) + # Maintains backward compatibility with NetBox IP Address {% endif %} + {% if perms.dcim.add_macaddress %} +
  • MAC Address
  • + {% endif %} {% if perms.vpn.add_l2vpntermination %}
  • L2VPN Termination
  • {% endif %} @@ -150,8 +153,8 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', - 'created', 'last_updated', + 'vrf', 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', + 'tagged_vlans', 'qinq_svlan', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') diff --git a/netbox/virtualization/tests/test_filtersets.py b/netbox/virtualization/tests/test_filtersets.py index 5a5bf2325..eef5d6b52 100644 --- a/netbox/virtualization/tests/test_filtersets.py +++ b/netbox/virtualization/tests/test_filtersets.py @@ -1,7 +1,7 @@ from django.test import TestCase from dcim.choices import InterfaceModeChoices -from dcim.models import Device, DeviceRole, Platform, Region, Site, SiteGroup +from dcim.models import Device, DeviceRole, MACAddress, Platform, Region, Site, SiteGroup from ipam.choices import VLANQinQRoleChoices from ipam.models import IPAddress, VLAN, VLANTranslationPolicy, VRF from tenancy.models import Tenant, TenantGroup @@ -366,13 +366,24 @@ class VirtualMachineTestCase(TestCase, ChangeLoggedFilterSetTests): ) VirtualMachine.objects.bulk_create(vms) + mac_addresses = ( + MACAddress(mac_address='00-00-00-00-00-01'), + MACAddress(mac_address='00-00-00-00-00-02'), + MACAddress(mac_address='00-00-00-00-00-03'), + ) + MACAddress.objects.bulk_create(mac_addresses) + interfaces = ( - VMInterface(virtual_machine=vms[0], name='Interface 1', mac_address='00-00-00-00-00-01'), - VMInterface(virtual_machine=vms[1], name='Interface 2', mac_address='00-00-00-00-00-02'), - VMInterface(virtual_machine=vms[2], name='Interface 3', mac_address='00-00-00-00-00-03'), + VMInterface(virtual_machine=vms[0], name='Interface 1'), + VMInterface(virtual_machine=vms[1], name='Interface 2'), + VMInterface(virtual_machine=vms[2], name='Interface 3'), ) VMInterface.objects.bulk_create(interfaces) + interfaces[0].mac_addresses.set([mac_addresses[0]]) + interfaces[1].mac_addresses.set([mac_addresses[1]]) + interfaces[2].mac_addresses.set([mac_addresses[2]]) + # Assign primary IPs for filtering ipaddresses = ( IPAddress(address='192.0.2.1/24', assigned_object=interfaces[0]), @@ -579,13 +590,19 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) VLANTranslationPolicy.objects.bulk_create(vlan_translation_policies) + mac_addresses = ( + MACAddress(mac_address='00-00-00-00-00-01'), + MACAddress(mac_address='00-00-00-00-00-02'), + MACAddress(mac_address='00-00-00-00-00-03'), + ) + MACAddress.objects.bulk_create(mac_addresses) + interfaces = ( VMInterface( virtual_machine=vms[0], name='Interface 1', enabled=True, mtu=100, - mac_address='00-00-00-00-00-01', vrf=vrfs[0], description='foobar1', vlan_translation_policy=vlan_translation_policies[0], @@ -595,7 +612,6 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): name='Interface 2', enabled=True, mtu=200, - mac_address='00-00-00-00-00-02', vrf=vrfs[1], description='foobar2', vlan_translation_policy=vlan_translation_policies[0], @@ -605,7 +621,6 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): name='Interface 3', enabled=False, mtu=300, - mac_address='00-00-00-00-00-03', vrf=vrfs[2], description='foobar3', mode=InterfaceModeChoices.MODE_Q_IN_Q, @@ -614,6 +629,10 @@ class VMInterfaceTestCase(TestCase, ChangeLoggedFilterSetTests): ) VMInterface.objects.bulk_create(interfaces) + interfaces[0].mac_addresses.set([mac_addresses[0]]) + interfaces[1].mac_addresses.set([mac_addresses[1]]) + interfaces[2].mac_addresses.set([mac_addresses[2]]) + def test_q(self): params = {'q': 'foobar1'} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) diff --git a/netbox/virtualization/tests/test_views.py b/netbox/virtualization/tests/test_views.py index b9cb7b437..dfd7e041c 100644 --- a/netbox/virtualization/tests/test_views.py +++ b/netbox/virtualization/tests/test_views.py @@ -1,7 +1,6 @@ from django.contrib.contenttypes.models import ContentType from django.test import override_settings from django.urls import reverse -from netaddr import EUI from dcim.choices import InterfaceModeChoices from dcim.models import DeviceRole, Platform, Site @@ -331,7 +330,6 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'name': 'Interface X', 'enabled': False, 'bridge': interfaces[1].pk, - 'mac_address': EUI('01-02-03-04-05-06'), 'mtu': 65000, 'description': 'New description', 'mode': InterfaceModeChoices.MODE_TAGGED, @@ -346,7 +344,6 @@ class VMInterfaceTestCase(ViewTestCases.DeviceComponentViewTestCase): 'name': 'Interface [4-6]', 'enabled': False, 'bridge': interfaces[3].pk, - 'mac_address': EUI('01-02-03-04-05-06'), 'mtu': 2000, 'description': 'New description', 'mode': InterfaceModeChoices.MODE_TAGGED, From 737631482107817b715771666418bb874c303ed7 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 15 Nov 2024 12:37:10 -0500 Subject: [PATCH 039/169] Access _site of cluster instead of site --- netbox/virtualization/forms/bulk_edit.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/virtualization/forms/bulk_edit.py b/netbox/virtualization/forms/bulk_edit.py index aaeb259b9..5e7593a09 100644 --- a/netbox/virtualization/forms/bulk_edit.py +++ b/netbox/virtualization/forms/bulk_edit.py @@ -279,7 +279,7 @@ class VMInterfaceBulkEditForm(NetBoxModelBulkEditForm): # Check interface sites. First interface should set site, further interfaces will either continue the # loop or reset back to no site and break the loop. for interface in interfaces: - vm_site = interface.virtual_machine.site or interface.virtual_machine.cluster.site + vm_site = interface.virtual_machine.site or interface.virtual_machine.cluster._site if site is None: site = vm_site elif vm_site is not site: From d2168b107fdee8cd88cfc9329103ff5c7a38bf48 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 19 Nov 2024 10:58:39 -0500 Subject: [PATCH 040/169] Closes #13086: Virtual circuits (#17933) * WIP * Add API tests * Add remaining tests * Add model docs * Show virtual circuit connections on interfaces * Misc cleanup per PR feedback * Renumber migration * Support nested terminations for virtual circuit bulk import --- docs/models/circuits/virtualcircuit.md | 33 ++ .../circuits/virtualcircuittermination.md | 21 ++ mkdocs.yml | 2 + netbox/circuits/api/serializers_/circuits.py | 39 ++- netbox/circuits/api/urls.py | 4 + netbox/circuits/api/views.py | 20 ++ netbox/circuits/choices.py | 16 + netbox/circuits/filtersets.py | 109 +++++- netbox/circuits/forms/bulk_edit.py | 65 +++- netbox/circuits/forms/bulk_import.py | 74 ++++ netbox/circuits/forms/filtersets.py | 78 ++++- netbox/circuits/forms/model_forms.py | 76 ++++- netbox/circuits/graphql/filters.py | 16 +- netbox/circuits/graphql/schema.py | 6 + netbox/circuits/graphql/types.py | 31 ++ .../migrations/0050_virtual_circuits.py | 67 ++++ netbox/circuits/models/__init__.py | 1 + netbox/circuits/models/virtual_circuits.py | 164 +++++++++ netbox/circuits/search.py | 20 ++ netbox/circuits/tables/__init__.py | 1 + netbox/circuits/tables/virtual_circuits.py | 95 ++++++ netbox/circuits/tests/test_api.py | 240 ++++++++++++- netbox/circuits/tests/test_filtersets.py | 293 +++++++++++++++- netbox/circuits/tests/test_views.py | 321 +++++++++++++++++- netbox/circuits/urls.py | 16 + netbox/circuits/views.py | 106 ++++++ netbox/dcim/filtersets.py | 12 +- netbox/dcim/models/device_components.py | 8 + netbox/dcim/tables/devices.py | 8 + netbox/dcim/tables/template_code.py | 14 + netbox/extras/tests/test_filtersets.py | 2 + netbox/netbox/navigation/menu.py | 7 + .../templates/circuits/providernetwork.html | 13 + netbox/templates/circuits/virtualcircuit.html | 84 +++++ .../circuits/virtualcircuittermination.html | 81 +++++ netbox/templates/dcim/interface.html | 36 +- 36 files changed, 2164 insertions(+), 15 deletions(-) create mode 100644 docs/models/circuits/virtualcircuit.md create mode 100644 docs/models/circuits/virtualcircuittermination.md create mode 100644 netbox/circuits/migrations/0050_virtual_circuits.py create mode 100644 netbox/circuits/models/virtual_circuits.py create mode 100644 netbox/circuits/tables/virtual_circuits.py create mode 100644 netbox/templates/circuits/virtualcircuit.html create mode 100644 netbox/templates/circuits/virtualcircuittermination.html diff --git a/docs/models/circuits/virtualcircuit.md b/docs/models/circuits/virtualcircuit.md new file mode 100644 index 000000000..a379b6330 --- /dev/null +++ b/docs/models/circuits/virtualcircuit.md @@ -0,0 +1,33 @@ +# Virtual Circuits + +A virtual circuit can connect two or more interfaces atop a set of decoupled physical connections. For example, it's very common to form a virtual connection between two virtual interfaces, each of which is bound to a physical interface on its respective device and physically connected to a [provider network](./providernetwork.md) via an independent [physical circuit](./circuit.md). + +## Fields + +### Provider Network + +The [provider network](./providernetwork.md) across which the virtual circuit is formed. + +### Provider Account + +The [provider account](./provideraccount.md) with which the virtual circuit is associated (if any). + +### Circuit ID + +The unique identifier assigned to the virtual circuit by its [provider](./provider.md). + +### Status + +The operational status of the virtual circuit. By default, the following statuses are available: + +| Name | +|----------------| +| Planned | +| Provisioning | +| Active | +| Offline | +| Deprovisioning | +| Decommissioned | + +!!! tip "Custom circuit statuses" + Additional circuit statuses may be defined by setting `Circuit.status` under the [`FIELD_CHOICES`](../../configuration/data-validation.md#field_choices) configuration parameter. diff --git a/docs/models/circuits/virtualcircuittermination.md b/docs/models/circuits/virtualcircuittermination.md new file mode 100644 index 000000000..82ea43eef --- /dev/null +++ b/docs/models/circuits/virtualcircuittermination.md @@ -0,0 +1,21 @@ +# Virtual Circuit Terminations + +This model represents the connection of a virtual [interface](../dcim/interface.md) to a [virtual circuit](./virtualcircuit.md). + +## Fields + +### Virtual Circuit + +The [virtual circuit](./virtualcircuit.md) to which the interface is connected. + +### Interface + +The [interface](../dcim/interface.md) connected to the virtual circuit. + +### Role + +The functional role of the termination. This depends on the virtual circuit's topology, which is typically either peer-to-peer or hub-and-spoke (multipoint). Valid choices include: + +* Peer +* Hub +* Spoke diff --git a/mkdocs.yml b/mkdocs.yml index 00e03a4ce..a66baa286 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -174,6 +174,8 @@ nav: - Provider: 'models/circuits/provider.md' - Provider Account: 'models/circuits/provideraccount.md' - Provider Network: 'models/circuits/providernetwork.md' + - Virtual Circuit: 'models/circuits/virtualcircuit.md' + - Virtual Circuit Termination: 'models/circuits/virtualcircuittermination.md' - Core: - DataFile: 'models/core/datafile.md' - DataSource: 'models/core/datasource.md' diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 96a686a65..a68e49483 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -2,9 +2,13 @@ from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema_field from rest_framework import serializers -from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices +from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES -from circuits.models import Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType +from circuits.models import ( + Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType, VirtualCircuit, + VirtualCircuitTermination, +) +from dcim.api.serializers_.device_components import InterfaceSerializer from dcim.api.serializers_.cables import CabledObjectSerializer from netbox.api.fields import ChoiceField, ContentTypeField, RelatedObjectCountField from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializer @@ -20,6 +24,8 @@ __all__ = ( 'CircuitGroupSerializer', 'CircuitTerminationSerializer', 'CircuitTypeSerializer', + 'VirtualCircuitSerializer', + 'VirtualCircuitTerminationSerializer', ) @@ -156,3 +162,32 @@ class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): 'id', 'url', 'display_url', 'display', 'group', 'circuit', 'priority', 'tags', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'group', 'circuit', 'priority') + + +class VirtualCircuitSerializer(NetBoxModelSerializer): + provider_network = ProviderNetworkSerializer(nested=True) + provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) + status = ChoiceField(choices=CircuitStatusChoices, required=False) + tenant = TenantSerializer(nested=True, required=False, allow_null=True) + + class Meta: + model = VirtualCircuit + fields = [ + 'id', 'url', 'display_url', 'display', 'cid', 'provider_network', 'provider_account', 'status', 'tenant', + 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'provider_network', 'cid', 'description') + + +class VirtualCircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer): + virtual_circuit = VirtualCircuitSerializer(nested=True) + role = ChoiceField(choices=VirtualCircuitTerminationRoleChoices, required=False) + interface = InterfaceSerializer(nested=True) + + class Meta: + model = VirtualCircuitTermination + fields = [ + 'id', 'url', 'display_url', 'display', 'virtual_circuit', 'role', 'interface', 'description', 'tags', + 'custom_fields', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'virtual_circuit', 'role', 'interface', 'description') diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index 00af3dec6..6f257f694 100644 --- a/netbox/circuits/api/urls.py +++ b/netbox/circuits/api/urls.py @@ -17,5 +17,9 @@ router.register('circuit-terminations', views.CircuitTerminationViewSet) router.register('circuit-groups', views.CircuitGroupViewSet) router.register('circuit-group-assignments', views.CircuitGroupAssignmentViewSet) +# Virtual circuits +router.register('virtual-circuits', views.VirtualCircuitViewSet) +router.register('virtual-circuit-terminations', views.VirtualCircuitTerminationViewSet) + app_name = 'circuits-api' urlpatterns = router.urls diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index 8cce013d7..3b49075be 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -93,3 +93,23 @@ class ProviderNetworkViewSet(NetBoxModelViewSet): queryset = ProviderNetwork.objects.all() serializer_class = serializers.ProviderNetworkSerializer filterset_class = filtersets.ProviderNetworkFilterSet + + +# +# Virtual circuits +# + +class VirtualCircuitViewSet(NetBoxModelViewSet): + queryset = VirtualCircuit.objects.all() + serializer_class = serializers.VirtualCircuitSerializer + filterset_class = filtersets.VirtualCircuitFilterSet + + +# +# Virtual circuit terminations +# + +class VirtualCircuitTerminationViewSet(PassThroughPortMixin, NetBoxModelViewSet): + queryset = VirtualCircuitTermination.objects.all() + serializer_class = serializers.VirtualCircuitTerminationSerializer + filterset_class = filtersets.VirtualCircuitTerminationFilterSet diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index 8c25c7459..4d6132d7a 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -92,3 +92,19 @@ class CircuitPriorityChoices(ChoiceSet): (PRIORITY_TERTIARY, _('Tertiary')), (PRIORITY_INACTIVE, _('Inactive')), ] + + +# +# Virtual circuits +# + +class VirtualCircuitTerminationRoleChoices(ChoiceSet): + ROLE_PEER = 'peer' + ROLE_HUB = 'hub' + ROLE_SPOKE = 'spoke' + + CHOICES = [ + (ROLE_PEER, _('Peer'), 'green'), + (ROLE_HUB, _('Hub'), 'blue'), + (ROLE_SPOKE, _('Spoke'), 'orange'), + ] diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 4a2a972f3..be36d45ac 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -3,7 +3,7 @@ from django.db.models import Q from django.utils.translation import gettext as _ from dcim.filtersets import CabledObjectFilterSet -from dcim.models import Location, Region, Site, SiteGroup +from dcim.models import Interface, Location, Region, Site, SiteGroup from ipam.models import ASN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet @@ -20,6 +20,8 @@ __all__ = ( 'ProviderNetworkFilterSet', 'ProviderAccountFilterSet', 'ProviderFilterSet', + 'VirtualCircuitFilterSet', + 'VirtualCircuitTerminationFilterSet', ) @@ -404,3 +406,108 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): Q(circuit__cid__icontains=value) | Q(group__name__icontains=value) ) + + +class VirtualCircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet): + provider_id = django_filters.ModelMultipleChoiceFilter( + field_name='provider_network__provider', + queryset=Provider.objects.all(), + label=_('Provider (ID)'), + ) + provider = django_filters.ModelMultipleChoiceFilter( + field_name='provider_network__provider__slug', + queryset=Provider.objects.all(), + to_field_name='slug', + label=_('Provider (slug)'), + ) + provider_account_id = django_filters.ModelMultipleChoiceFilter( + field_name='provider_account', + queryset=ProviderAccount.objects.all(), + label=_('Provider account (ID)'), + ) + provider_account = django_filters.ModelMultipleChoiceFilter( + field_name='provider_account__account', + queryset=Provider.objects.all(), + to_field_name='account', + label=_('Provider account (account)'), + ) + provider_network_id = django_filters.ModelMultipleChoiceFilter( + queryset=ProviderNetwork.objects.all(), + label=_('Provider network (ID)'), + ) + status = django_filters.MultipleChoiceFilter( + choices=CircuitStatusChoices, + null_value=None + ) + + class Meta: + model = VirtualCircuit + fields = ('id', 'cid', 'description') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(cid__icontains=value) | + Q(description__icontains=value) | + Q(comments__icontains=value) + ).distinct() + + +class VirtualCircuitTerminationFilterSet(NetBoxModelFilterSet): + q = django_filters.CharFilter( + method='search', + label=_('Search'), + ) + virtual_circuit_id = django_filters.ModelMultipleChoiceFilter( + queryset=VirtualCircuit.objects.all(), + label=_('Virtual circuit'), + ) + role = django_filters.MultipleChoiceFilter( + choices=VirtualCircuitTerminationRoleChoices, + null_value=None + ) + provider_id = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit__provider_network__provider', + queryset=Provider.objects.all(), + label=_('Provider (ID)'), + ) + provider = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit__provider_network__provider__slug', + queryset=Provider.objects.all(), + to_field_name='slug', + label=_('Provider (slug)'), + ) + provider_account_id = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit__provider_account', + queryset=ProviderAccount.objects.all(), + label=_('Provider account (ID)'), + ) + provider_account = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit__provider_account__account', + queryset=ProviderAccount.objects.all(), + to_field_name='account', + label=_('Provider account (account)'), + ) + provider_network_id = django_filters.ModelMultipleChoiceFilter( + queryset=ProviderNetwork.objects.all(), + field_name='virtual_circuit__provider_network', + label=_('Provider network (ID)'), + ) + interface_id = django_filters.ModelMultipleChoiceFilter( + queryset=Interface.objects.all(), + field_name='interface', + label=_('Interface (ID)'), + ) + + class Meta: + model = VirtualCircuitTermination + fields = ('id', 'interface_id', 'description') + + def search(self, queryset, name, value): + if not value.strip(): + return queryset + return queryset.filter( + Q(virtual_circuit__cid__icontains=value) | + Q(description__icontains=value) + ).distinct() diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index e3f0b5d0c..021635a1a 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -3,7 +3,9 @@ from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext_lazy as _ -from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices +from circuits.choices import ( + CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices, +) from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES from circuits.models import * from dcim.models import Site @@ -28,6 +30,8 @@ __all__ = ( 'ProviderBulkEditForm', 'ProviderAccountBulkEditForm', 'ProviderNetworkBulkEditForm', + 'VirtualCircuitBulkEditForm', + 'VirtualCircuitTerminationBulkEditForm', ) @@ -291,3 +295,62 @@ class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): FieldSet('circuit', 'priority'), ) nullable_fields = ('priority',) + + +class VirtualCircuitBulkEditForm(NetBoxModelBulkEditForm): + provider_network = DynamicModelChoiceField( + label=_('Provider network'), + queryset=ProviderNetwork.objects.all(), + required=False + ) + provider_account = DynamicModelChoiceField( + label=_('Provider account'), + queryset=ProviderAccount.objects.all(), + required=False + ) + status = forms.ChoiceField( + label=_('Status'), + choices=add_blank_choice(CircuitStatusChoices), + required=False, + initial='' + ) + tenant = DynamicModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=100, + required=False + ) + comments = CommentField() + + model = VirtualCircuit + fieldsets = ( + FieldSet('provider_network', 'provider_account', 'status', 'description', name=_('Virtual circuit')), + FieldSet('tenant', name=_('Tenancy')), + ) + nullable_fields = ( + 'provider_account', 'tenant', 'description', 'comments', + ) + + +class VirtualCircuitTerminationBulkEditForm(NetBoxModelBulkEditForm): + role = forms.ChoiceField( + label=_('Role'), + choices=add_blank_choice(VirtualCircuitTerminationRoleChoices), + required=False, + initial='' + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + + model = VirtualCircuitTermination + fieldsets = ( + FieldSet('role', 'description'), + ) + nullable_fields = ('description',) diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index eab87b1f5..7f5ffde6e 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -5,6 +5,7 @@ from django.utils.translation import gettext_lazy as _ from circuits.choices import * from circuits.constants import * from circuits.models import * +from dcim.models import Interface from netbox.choices import DistanceUnitChoices from netbox.forms import NetBoxModelImportForm from tenancy.models import Tenant @@ -20,6 +21,9 @@ __all__ = ( 'ProviderImportForm', 'ProviderAccountImportForm', 'ProviderNetworkImportForm', + 'VirtualCircuitImportForm', + 'VirtualCircuitTerminationImportForm', + 'VirtualCircuitTerminationImportRelatedForm', ) @@ -179,3 +183,73 @@ class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): class Meta: model = CircuitGroupAssignment fields = ('circuit', 'group', 'priority') + + +class VirtualCircuitImportForm(NetBoxModelImportForm): + provider_network = CSVModelChoiceField( + label=_('Provider network'), + queryset=ProviderNetwork.objects.all(), + to_field_name='name', + help_text=_('The network to which this virtual circuit belongs') + ) + provider_account = CSVModelChoiceField( + label=_('Provider account'), + queryset=ProviderAccount.objects.all(), + to_field_name='account', + help_text=_('Assigned provider account (if any)'), + required=False + ) + status = CSVChoiceField( + label=_('Status'), + choices=CircuitStatusChoices, + help_text=_('Operational status') + ) + tenant = CSVModelChoiceField( + label=_('Tenant'), + queryset=Tenant.objects.all(), + required=False, + to_field_name='name', + help_text=_('Assigned tenant') + ) + + class Meta: + model = VirtualCircuit + fields = [ + 'cid', 'provider_network', 'provider_account', 'status', 'tenant', 'description', 'comments', 'tags', + ] + + +class BaseVirtualCircuitTerminationImportForm(forms.ModelForm): + virtual_circuit = CSVModelChoiceField( + label=_('Virtual circuit'), + queryset=VirtualCircuit.objects.all(), + to_field_name='cid', + ) + role = CSVChoiceField( + label=_('Role'), + choices=VirtualCircuitTerminationRoleChoices, + help_text=_('Operational role') + ) + interface = CSVModelChoiceField( + label=_('Interface'), + queryset=Interface.objects.all(), + to_field_name='pk', + ) + + +class VirtualCircuitTerminationImportRelatedForm(BaseVirtualCircuitTerminationImportForm): + + class Meta: + model = VirtualCircuitTermination + fields = [ + 'virtual_circuit', 'role', 'interface', 'description', + ] + + +class VirtualCircuitTerminationImportForm(NetBoxModelImportForm, BaseVirtualCircuitTerminationImportForm): + + class Meta: + model = VirtualCircuitTermination + fields = [ + 'virtual_circuit', 'role', 'interface', 'description', 'tags', + ] diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index b585ce079..00dc6bc5b 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -1,7 +1,10 @@ from django import forms from django.utils.translation import gettext as _ -from circuits.choices import CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, CircuitTerminationSideChoices +from circuits.choices import ( + CircuitCommitRateChoices, CircuitPriorityChoices, CircuitStatusChoices, CircuitTerminationSideChoices, + VirtualCircuitTerminationRoleChoices, +) from circuits.models import * from dcim.models import Location, Region, Site, SiteGroup from ipam.models import ASN @@ -22,6 +25,8 @@ __all__ = ( 'ProviderFilterForm', 'ProviderAccountFilterForm', 'ProviderNetworkFilterForm', + 'VirtualCircuitFilterForm', + 'VirtualCircuitTerminationFilterForm', ) @@ -292,3 +297,74 @@ class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): required=False ) tag = TagFilterField(model) + + +class VirtualCircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilterSetForm): + model = VirtualCircuit + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('provider_id', 'provider_account_id', 'provider_network_id', name=_('Provider')), + FieldSet('status', name=_('Attributes')), + FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), + ) + selector_fields = ('filter_id', 'q', 'provider_id', 'provider_network_id') + provider_id = DynamicModelMultipleChoiceField( + queryset=Provider.objects.all(), + required=False, + label=_('Provider') + ) + provider_account_id = DynamicModelMultipleChoiceField( + queryset=ProviderAccount.objects.all(), + required=False, + query_params={ + 'provider_id': '$provider_id' + }, + label=_('Provider account') + ) + provider_network_id = DynamicModelMultipleChoiceField( + queryset=ProviderNetwork.objects.all(), + required=False, + query_params={ + 'provider_id': '$provider_id' + }, + label=_('Provider network') + ) + status = forms.MultipleChoiceField( + label=_('Status'), + choices=CircuitStatusChoices, + required=False + ) + tag = TagFilterField(model) + + +class VirtualCircuitTerminationFilterForm(NetBoxModelFilterSetForm): + model = VirtualCircuitTermination + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('virtual_circuit_id', 'role', name=_('Virtual circuit')), + FieldSet('provider_id', 'provider_account_id', 'provider_network_id', name=_('Provider')), + ) + virtual_circuit_id = DynamicModelMultipleChoiceField( + queryset=VirtualCircuit.objects.all(), + required=False, + label=_('Virtual circuit') + ) + role = forms.MultipleChoiceField( + label=_('Role'), + choices=VirtualCircuitTerminationRoleChoices, + required=False + ) + provider_network_id = DynamicModelMultipleChoiceField( + queryset=ProviderNetwork.objects.all(), + required=False, + query_params={ + 'provider_id': '$provider_id' + }, + label=_('Provider network') + ) + provider_id = DynamicModelMultipleChoiceField( + queryset=Provider.objects.all(), + required=False, + label=_('Provider') + ) + tag = TagFilterField(model) diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 9eeb0f588..e43c37525 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -1,16 +1,21 @@ +from django import forms from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import gettext_lazy as _ -from circuits.choices import CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices +from circuits.choices import ( + CircuitCommitRateChoices, CircuitTerminationPortSpeedChoices, VirtualCircuitTerminationRoleChoices, +) from circuits.constants import * from circuits.models import * -from dcim.models import Site +from dcim.models import Interface, Site from ipam.models import ASN from netbox.forms import NetBoxModelForm from tenancy.forms import TenancyForm from utilities.forms import get_field_value -from utilities.forms.fields import CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField +from utilities.forms.fields import ( + CommentField, ContentTypeChoiceField, DynamicModelChoiceField, DynamicModelMultipleChoiceField, SlugField, +) from utilities.forms.rendering import FieldSet, InlineFields from utilities.forms.widgets import DatePicker, HTMXSelect, NumberWithOptions from utilities.templatetags.builtins.filters import bettertitle @@ -24,6 +29,8 @@ __all__ = ( 'ProviderForm', 'ProviderAccountForm', 'ProviderNetworkForm', + 'VirtualCircuitForm', + 'VirtualCircuitTerminationForm', ) @@ -255,3 +262,66 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): fields = [ 'group', 'circuit', 'priority', 'tags', ] + + +class VirtualCircuitForm(TenancyForm, NetBoxModelForm): + provider_network = DynamicModelChoiceField( + label=_('Provider network'), + queryset=ProviderNetwork.objects.all(), + selector=True + ) + provider_account = DynamicModelChoiceField( + label=_('Provider account'), + queryset=ProviderAccount.objects.all(), + required=False + ) + comments = CommentField() + + fieldsets = ( + FieldSet( + 'provider_network', 'provider_account', 'cid', 'status', 'description', 'tags', name=_('Virtual circuit'), + ), + FieldSet('tenant_group', 'tenant', name=_('Tenancy')), + ) + + class Meta: + model = VirtualCircuit + fields = [ + 'cid', 'provider_network', 'provider_account', 'status', 'description', 'tenant_group', 'tenant', + 'comments', 'tags', + ] + + +class VirtualCircuitTerminationForm(NetBoxModelForm): + virtual_circuit = DynamicModelChoiceField( + label=_('Virtual circuit'), + queryset=VirtualCircuit.objects.all(), + selector=True + ) + role = forms.ChoiceField( + choices=VirtualCircuitTerminationRoleChoices, + widget=HTMXSelect(), + label=_('Role') + ) + interface = DynamicModelChoiceField( + label=_('Interface'), + queryset=Interface.objects.all(), + selector=True, + query_params={ + 'kind': 'virtual', + 'virtual_circuit_termination_id': 'null', + }, + context={ + 'parent': 'device', + } + ) + + fieldsets = ( + FieldSet('virtual_circuit', 'role', 'interface', 'description', 'tags'), + ) + + class Meta: + model = VirtualCircuitTermination + fields = [ + 'virtual_circuit', 'role', 'interface', 'description', 'tags', + ] diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index b8398b2b9..36ddc25b2 100644 --- a/netbox/circuits/graphql/filters.py +++ b/netbox/circuits/graphql/filters.py @@ -4,14 +4,16 @@ from circuits import filtersets, models from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin __all__ = ( - 'CircuitTerminationFilter', 'CircuitFilter', 'CircuitGroupAssignmentFilter', 'CircuitGroupFilter', + 'CircuitTerminationFilter', 'CircuitTypeFilter', 'ProviderFilter', 'ProviderAccountFilter', 'ProviderNetworkFilter', + 'VirtualCircuitFilter', + 'VirtualCircuitTerminationFilter', ) @@ -61,3 +63,15 @@ class ProviderAccountFilter(BaseFilterMixin): @autotype_decorator(filtersets.ProviderNetworkFilterSet) class ProviderNetworkFilter(BaseFilterMixin): pass + + +@strawberry_django.filter(models.VirtualCircuit, lookups=True) +@autotype_decorator(filtersets.VirtualCircuitFilterSet) +class VirtualCircuitFilter(BaseFilterMixin): + pass + + +@strawberry_django.filter(models.VirtualCircuitTermination, lookups=True) +@autotype_decorator(filtersets.VirtualCircuitTerminationFilterSet) +class VirtualCircuitTerminationFilter(BaseFilterMixin): + pass diff --git a/netbox/circuits/graphql/schema.py b/netbox/circuits/graphql/schema.py index ac23421ce..9c683ce45 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -31,3 +31,9 @@ class CircuitsQuery: provider_network: ProviderNetworkType = strawberry_django.field() provider_network_list: List[ProviderNetworkType] = strawberry_django.field() + + virtual_circuit: VirtualCircuitType = strawberry_django.field() + virtual_circuit_list: List[VirtualCircuitType] = strawberry_django.field() + + virtual_circuit_termination: VirtualCircuitTerminationType = strawberry_django.field() + virtual_circuit_termination_list: List[VirtualCircuitTerminationType] = strawberry_django.field() diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index b52f9d18d..f2703b207 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -19,6 +19,8 @@ __all__ = ( 'ProviderType', 'ProviderAccountType', 'ProviderNetworkType', + 'VirtualCircuitTerminationType', + 'VirtualCircuitType', ) @@ -120,3 +122,32 @@ class CircuitGroupType(OrganizationalObjectType): class CircuitGroupAssignmentType(TagsMixin, BaseObjectType): group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')] circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] + + +@strawberry_django.type( + models.VirtualCircuitTermination, + fields='__all__', + filters=VirtualCircuitTerminationFilter +) +class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType): + virtual_circuit: Annotated[ + "VirtualCircuitType", + strawberry.lazy('circuits.graphql.types') + ] = strawberry_django.field(select_related=["virtual_circuit"]) + interface: Annotated[ + "InterfaceType", + strawberry.lazy('dcim.graphql.types') + ] = strawberry_django.field(select_related=["interface"]) + + +@strawberry_django.type( + models.VirtualCircuit, + fields='__all__', + filters=VirtualCircuitFilter +) +class VirtualCircuitType(NetBoxObjectType): + provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"]) + provider_account: ProviderAccountType | None + tenant: TenantType | None + + terminations: List[VirtualCircuitTerminationType] diff --git a/netbox/circuits/migrations/0050_virtual_circuits.py b/netbox/circuits/migrations/0050_virtual_circuits.py new file mode 100644 index 000000000..df719b517 --- /dev/null +++ b/netbox/circuits/migrations/0050_virtual_circuits.py @@ -0,0 +1,67 @@ +import django.db.models.deletion +import taggit.managers +from django.db import migrations, models + +import utilities.json + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0049_natural_ordering'), + ('dcim', '0196_qinq_svlan'), + ('extras', '0122_charfield_null_choices'), + ('tenancy', '0016_charfield_null_choices'), + ] + + operations = [ + migrations.CreateModel( + name='VirtualCircuit', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('cid', models.CharField(max_length=100)), + ('status', models.CharField(default='active', max_length=50)), + ('provider_account', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='virtual_circuits', to='circuits.provideraccount')), + ('provider_network', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='virtual_circuits', to='circuits.providernetwork')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='virtual_circuits', to='tenancy.tenant')), + ], + options={ + 'verbose_name': 'circuit', + 'verbose_name_plural': 'circuits', + 'ordering': ['provider_network', 'provider_account', 'cid'], + }, + ), + migrations.CreateModel( + name='VirtualCircuitTermination', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder)), + ('role', models.CharField(default='peer', max_length=50)), + ('description', models.CharField(blank=True, max_length=200)), + ('interface', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='virtual_circuit_termination', to='dcim.interface')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ('virtual_circuit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='terminations', to='circuits.virtualcircuit')), + ], + options={ + 'verbose_name': 'virtual circuit termination', + 'verbose_name_plural': 'virtual circuit terminations', + 'ordering': ['virtual_circuit', 'role', 'pk'], + }, + ), + migrations.AddConstraint( + model_name='virtualcircuit', + constraint=models.UniqueConstraint(fields=('provider_network', 'cid'), name='circuits_virtualcircuit_unique_provider_network_cid'), + ), + migrations.AddConstraint( + model_name='virtualcircuit', + constraint=models.UniqueConstraint(fields=('provider_account', 'cid'), name='circuits_virtualcircuit_unique_provideraccount_cid'), + ), + ] diff --git a/netbox/circuits/models/__init__.py b/netbox/circuits/models/__init__.py index 7bbaf75d3..77382358b 100644 --- a/netbox/circuits/models/__init__.py +++ b/netbox/circuits/models/__init__.py @@ -1,2 +1,3 @@ from .circuits import * from .providers import * +from .virtual_circuits import * diff --git a/netbox/circuits/models/virtual_circuits.py b/netbox/circuits/models/virtual_circuits.py new file mode 100644 index 000000000..ced68c105 --- /dev/null +++ b/netbox/circuits/models/virtual_circuits.py @@ -0,0 +1,164 @@ +from functools import cached_property + +from django.core.exceptions import ValidationError +from django.db import models +from django.urls import reverse +from django.utils.translation import gettext_lazy as _ + +from circuits.choices import * +from netbox.models import ChangeLoggedModel, PrimaryModel +from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin + +__all__ = ( + 'VirtualCircuit', + 'VirtualCircuitTermination', +) + + +class VirtualCircuit(PrimaryModel): + """ + A virtual connection between two or more endpoints, delivered across one or more physical circuits. + """ + cid = models.CharField( + max_length=100, + verbose_name=_('circuit ID'), + help_text=_('Unique circuit ID') + ) + provider_network = models.ForeignKey( + to='circuits.ProviderNetwork', + on_delete=models.PROTECT, + related_name='virtual_circuits' + ) + provider_account = models.ForeignKey( + to='circuits.ProviderAccount', + on_delete=models.PROTECT, + related_name='virtual_circuits', + blank=True, + null=True + ) + status = models.CharField( + verbose_name=_('status'), + max_length=50, + choices=CircuitStatusChoices, + default=CircuitStatusChoices.STATUS_ACTIVE + ) + tenant = models.ForeignKey( + to='tenancy.Tenant', + on_delete=models.PROTECT, + related_name='virtual_circuits', + blank=True, + null=True + ) + + clone_fields = ( + 'provider_network', 'provider_account', 'status', 'tenant', 'description', + ) + prerequisite_models = ( + 'circuits.ProviderNetwork', + ) + + class Meta: + ordering = ['provider_network', 'provider_account', 'cid'] + constraints = ( + models.UniqueConstraint( + fields=('provider_network', 'cid'), + name='%(app_label)s_%(class)s_unique_provider_network_cid' + ), + models.UniqueConstraint( + fields=('provider_account', 'cid'), + name='%(app_label)s_%(class)s_unique_provideraccount_cid' + ), + ) + verbose_name = _('virtual circuit') + verbose_name_plural = _('virtual circuits') + + def __str__(self): + return self.cid + + def get_status_color(self): + return CircuitStatusChoices.colors.get(self.status) + + def clean(self): + super().clean() + + if self.provider_account and self.provider_network.provider != self.provider_account.provider: + raise ValidationError({ + 'provider_account': "The assigned account must belong to the provider of the assigned network." + }) + + @property + def provider(self): + return self.provider_network.provider + + +class VirtualCircuitTermination( + CustomFieldsMixin, + CustomLinksMixin, + TagsMixin, + ChangeLoggedModel +): + virtual_circuit = models.ForeignKey( + to='circuits.VirtualCircuit', + on_delete=models.CASCADE, + related_name='terminations' + ) + role = models.CharField( + verbose_name=_('role'), + max_length=50, + choices=VirtualCircuitTerminationRoleChoices, + default=VirtualCircuitTerminationRoleChoices.ROLE_PEER + ) + interface = models.OneToOneField( + to='dcim.Interface', + on_delete=models.CASCADE, + related_name='virtual_circuit_termination' + ) + description = models.CharField( + verbose_name=_('description'), + max_length=200, + blank=True + ) + + class Meta: + ordering = ['virtual_circuit', 'role', 'pk'] + verbose_name = _('virtual circuit termination') + verbose_name_plural = _('virtual circuit terminations') + + def __str__(self): + return f'{self.virtual_circuit}: {self.get_role_display()} termination' + + def get_absolute_url(self): + return reverse('circuits:virtualcircuittermination', args=[self.pk]) + + def get_role_color(self): + return VirtualCircuitTerminationRoleChoices.colors.get(self.role) + + def to_objectchange(self, action): + objectchange = super().to_objectchange(action) + objectchange.related_object = self.virtual_circuit + return objectchange + + @property + def parent_object(self): + return self.virtual_circuit + + @cached_property + def peer_terminations(self): + if self.role == VirtualCircuitTerminationRoleChoices.ROLE_PEER: + return self.virtual_circuit.terminations.exclude(pk=self.pk).filter( + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER + ) + if self.role == VirtualCircuitTerminationRoleChoices.ROLE_HUB: + return self.virtual_circuit.terminations.filter( + role=VirtualCircuitTerminationRoleChoices.ROLE_SPOKE + ) + if self.role == VirtualCircuitTerminationRoleChoices.ROLE_SPOKE: + return self.virtual_circuit.terminations.filter( + role=VirtualCircuitTerminationRoleChoices.ROLE_HUB + ) + + def clean(self): + super().clean() + + if self.interface and not self.interface.is_virtual: + raise ValidationError("Virtual circuits may be terminated only to virtual interfaces.") diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index 7a5711f03..80725c1b8 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -80,3 +80,23 @@ class ProviderNetworkIndex(SearchIndex): ('comments', 5000), ) display_attrs = ('provider', 'service_id', 'description') + + +@register_search +class VirtualCircuitIndex(SearchIndex): + model = models.VirtualCircuit + fields = ( + ('cid', 100), + ('description', 500), + ('comments', 5000), + ) + display_attrs = ('provider', 'provider_network', 'provider_account', 'status', 'tenant', 'description') + + +@register_search +class VirtualCircuitTerminationIndex(SearchIndex): + model = models.VirtualCircuitTermination + fields = ( + ('description', 500), + ) + display_attrs = ('virtual_circuit', 'role', 'description') diff --git a/netbox/circuits/tables/__init__.py b/netbox/circuits/tables/__init__.py index b61c13cae..a436eb88d 100644 --- a/netbox/circuits/tables/__init__.py +++ b/netbox/circuits/tables/__init__.py @@ -1,3 +1,4 @@ from .circuits import * from .columns import * from .providers import * +from .virtual_circuits import * diff --git a/netbox/circuits/tables/virtual_circuits.py b/netbox/circuits/tables/virtual_circuits.py new file mode 100644 index 000000000..b7617f297 --- /dev/null +++ b/netbox/circuits/tables/virtual_circuits.py @@ -0,0 +1,95 @@ +import django_tables2 as tables +from django.utils.translation import gettext_lazy as _ + +from circuits.models import * +from netbox.tables import NetBoxTable, columns +from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin + +__all__ = ( + 'VirtualCircuitTable', + 'VirtualCircuitTerminationTable', +) + + +class VirtualCircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): + cid = tables.Column( + linkify=True, + verbose_name=_('Circuit ID') + ) + provider = tables.Column( + accessor=tables.A('provider_network__provider'), + verbose_name=_('Provider'), + linkify=True + ) + provider_network = tables.Column( + linkify=True, + verbose_name=_('Provider network') + ) + provider_account = tables.Column( + linkify=True, + verbose_name=_('Account') + ) + status = columns.ChoiceFieldColumn() + termination_count = columns.LinkedCountColumn( + viewname='circuits:virtualcircuittermination_list', + url_params={'virtual_circuit_id': 'pk'}, + verbose_name=_('Terminations') + ) + comments = columns.MarkdownColumn( + verbose_name=_('Comments') + ) + tags = columns.TagColumn( + url_name='circuits:virtualcircuit_list' + ) + + class Meta(NetBoxTable.Meta): + model = VirtualCircuit + fields = ( + 'pk', 'id', 'cid', 'provider', 'provider_account', 'provider_network', 'status', 'tenant', 'tenant_group', + 'description', 'comments', 'tags', 'created', 'last_updated', + ) + default_columns = ( + 'pk', 'cid', 'provider', 'provider_account', 'provider_network', 'status', 'tenant', 'termination_count', + 'description', + ) + + +class VirtualCircuitTerminationTable(NetBoxTable): + virtual_circuit = tables.Column( + verbose_name=_('Virtual circuit'), + linkify=True + ) + provider = tables.Column( + accessor=tables.A('virtual_circuit__provider_network__provider'), + verbose_name=_('Provider'), + linkify=True + ) + provider_network = tables.Column( + accessor=tables.A('virtual_circuit__provider_network'), + linkify=True, + verbose_name=_('Provider network') + ) + provider_account = tables.Column( + linkify=True, + verbose_name=_('Account') + ) + role = columns.ChoiceFieldColumn() + device = tables.Column( + accessor=tables.A('interface__device'), + linkify=True, + verbose_name=_('Device') + ) + interface = tables.Column( + verbose_name=_('Interface'), + linkify=True + ) + + class Meta(NetBoxTable.Meta): + model = VirtualCircuitTermination + fields = ( + 'pk', 'id', 'virtual_circuit', 'provider', 'provider_network', 'provider_account', 'role', 'interfaces', + 'description', 'created', 'last_updated', 'actions', + ) + default_columns = ( + 'pk', 'id', 'virtual_circuit', 'role', 'device', 'interface', 'description', + ) diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 1b2e9f3f8..12c6b2a93 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -2,7 +2,8 @@ from django.urls import reverse from circuits.choices import * from circuits.models import * -from dcim.models import Site +from dcim.choices import InterfaceTypeChoices +from dcim.models import Device, DeviceRole, DeviceType, Interface, Manufacturer, Site from ipam.models import ASN, RIR from utilities.testing import APITestCase, APIViewTestCases @@ -397,3 +398,240 @@ class ProviderNetworkTest(APIViewTestCases.APIViewTestCase): 'provider': providers[1].pk, 'description': 'New description', } + + +class VirtualCircuitTest(APIViewTestCases.APIViewTestCase): + model = VirtualCircuit + brief_fields = ['cid', 'description', 'display', 'id', 'provider_network', 'url'] + bulk_update_data = { + 'status': 'planned', + } + + @classmethod + def setUpTestData(cls): + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') + provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 3' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + + cls.create_data = [ + { + 'cid': 'Virtual Circuit 4', + 'provider_network': provider_network.pk, + 'provider_account': provider_account.pk, + 'status': CircuitStatusChoices.STATUS_PLANNED, + }, + { + 'cid': 'Virtual Circuit 5', + 'provider_network': provider_network.pk, + 'provider_account': provider_account.pk, + 'status': CircuitStatusChoices.STATUS_PLANNED, + }, + { + 'cid': 'Virtual Circuit 6', + 'provider_network': provider_network.pk, + 'provider_account': provider_account.pk, + 'status': CircuitStatusChoices.STATUS_PLANNED, + }, + ] + + +class VirtualCircuitTerminationTest(APIViewTestCases.APIViewTestCase): + model = VirtualCircuitTermination + brief_fields = ['description', 'display', 'id', 'interface', 'role', 'url', 'virtual_circuit'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1') + device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') + site = Site.objects.create(name='Site 1', slug='site-1') + + devices = ( + Device(site=site, name='hub', device_type=device_type, role=device_role), + Device(site=site, name='spoke1', device_type=device_type, role=device_role), + Device(site=site, name='spoke2', device_type=device_type, role=device_role), + Device(site=site, name='spoke3', device_type=device_type, role=device_role), + ) + Device.objects.bulk_create(devices) + + physical_interfaces = ( + Interface(device=devices[0], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[1], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[2], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[3], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + ) + Interface.objects.bulk_create(physical_interfaces) + + virtual_interfaces = ( + # Point-to-point VCs + Interface( + device=devices[0], + name='eth0.1', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[0], + name='eth0.2', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[0], + name='eth0.3', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[1], + name='eth0.1', + parent=physical_interfaces[1], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[2], + name='eth0.1', + parent=physical_interfaces[2], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[3], + name='eth0.1', + parent=physical_interfaces[3], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + + # Hub and spoke VCs + Interface( + device=devices[0], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[1], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[2], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[3], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + ) + Interface.objects.bulk_create(virtual_interfaces) + + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') + provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 3' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 4' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + + virtual_circuit_terminations = ( + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[0] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[3] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[1] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[4] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[2] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[5] + ), + ) + VirtualCircuitTermination.objects.bulk_create(virtual_circuit_terminations) + + cls.create_data = [ + { + 'virtual_circuit': virtual_circuits[3].pk, + 'role': VirtualCircuitTerminationRoleChoices.ROLE_HUB, + 'interface': virtual_interfaces[6].pk + }, + { + 'virtual_circuit': virtual_circuits[3].pk, + 'role': VirtualCircuitTerminationRoleChoices.ROLE_SPOKE, + 'interface': virtual_interfaces[7].pk + }, + { + 'virtual_circuit': virtual_circuits[3].pk, + 'role': VirtualCircuitTerminationRoleChoices.ROLE_SPOKE, + 'interface': virtual_interfaces[8].pk + }, + { + 'virtual_circuit': virtual_circuits[3].pk, + 'role': VirtualCircuitTerminationRoleChoices.ROLE_SPOKE, + 'interface': virtual_interfaces[9].pk + }, + ] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index 0dbc7172b..01b5e3105 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -3,7 +3,8 @@ from django.test import TestCase from circuits.choices import * from circuits.filtersets import * from circuits.models import * -from dcim.models import Cable, Region, Site, SiteGroup +from dcim.choices import InterfaceTypeChoices +from dcim.models import Cable, Device, DeviceRole, DeviceType, Interface, Manufacturer, Region, Site, SiteGroup from ipam.models import ASN, RIR from netbox.choices import DistanceUnitChoices from tenancy.models import Tenant, TenantGroup @@ -678,3 +679,293 @@ class ProviderAccountTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) params = {'provider': [providers[0].slug, providers[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualCircuit.objects.all() + filterset = VirtualCircuitFilterSet + + @classmethod + def setUpTestData(cls): + + tenant_groups = ( + TenantGroup(name='Tenant group 1', slug='tenant-group-1'), + TenantGroup(name='Tenant group 2', slug='tenant-group-2'), + TenantGroup(name='Tenant group 3', slug='tenant-group-3'), + ) + for tenantgroup in tenant_groups: + tenantgroup.save() + + tenants = ( + Tenant(name='Tenant 1', slug='tenant-1', group=tenant_groups[0]), + Tenant(name='Tenant 2', slug='tenant-2', group=tenant_groups[1]), + Tenant(name='Tenant 3', slug='tenant-3', group=tenant_groups[2]), + ) + Tenant.objects.bulk_create(tenants) + + providers = ( + Provider(name='Provider 1', slug='provider-1'), + Provider(name='Provider 2', slug='provider-2'), + Provider(name='Provider 3', slug='provider-3'), + ) + Provider.objects.bulk_create(providers) + + provider_accounts = ( + ProviderAccount(name='Provider Account 1', provider=providers[0], account='A'), + ProviderAccount(name='Provider Account 2', provider=providers[1], account='B'), + ProviderAccount(name='Provider Account 3', provider=providers[2], account='C'), + ) + ProviderAccount.objects.bulk_create(provider_accounts) + + provider_networks = ( + ProviderNetwork(name='Provider Network 1', provider=providers[0]), + ProviderNetwork(name='Provider Network 2', provider=providers[1]), + ProviderNetwork(name='Provider Network 3', provider=providers[2]), + ) + ProviderNetwork.objects.bulk_create(provider_networks) + + virutal_circuits = ( + VirtualCircuit( + provider_network=provider_networks[0], + provider_account=provider_accounts[0], + tenant=tenants[0], + cid='Virtual Circuit 1', + status=CircuitStatusChoices.STATUS_PLANNED, + description='virtualcircuit1', + ), + VirtualCircuit( + provider_network=provider_networks[1], + provider_account=provider_accounts[1], + tenant=tenants[1], + cid='Virtual Circuit 2', + status=CircuitStatusChoices.STATUS_ACTIVE, + description='virtualcircuit2', + ), + VirtualCircuit( + provider_network=provider_networks[2], + provider_account=provider_accounts[2], + tenant=tenants[2], + cid='Virtual Circuit 3', + status=CircuitStatusChoices.STATUS_DEPROVISIONING, + description='virtualcircuit3', + ), + ) + VirtualCircuit.objects.bulk_create(virutal_circuits) + + def test_q(self): + params = {'q': 'virtualcircuit1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_cid(self): + params = {'cid': ['Virtual Circuit 1', 'Virtual Circuit 2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_provider(self): + providers = Provider.objects.all()[:2] + params = {'provider_id': [providers[0].pk, providers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'provider': [providers[0].slug, providers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_provider_account(self): + provider_accounts = ProviderAccount.objects.all()[:2] + params = {'provider_account_id': [provider_accounts[0].pk, provider_accounts[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_provider_network(self): + provider_networks = ProviderNetwork.objects.all()[:2] + params = {'provider_network_id': [provider_networks[0].pk, provider_networks[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_status(self): + params = {'status': [CircuitStatusChoices.STATUS_ACTIVE, CircuitStatusChoices.STATUS_PLANNED]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_description(self): + params = {'description': ['virtualcircuit1', 'virtualcircuit2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tenant(self): + tenants = Tenant.objects.all()[:2] + params = {'tenant_id': [tenants[0].pk, tenants[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'tenant': [tenants[0].slug, tenants[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_tenant_group(self): + tenant_groups = TenantGroup.objects.all()[:2] + params = {'tenant_group_id': [tenant_groups[0].pk, tenant_groups[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'tenant_group': [tenant_groups[0].slug, tenant_groups[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + +class VirtualCircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualCircuitTermination.objects.all() + filterset = VirtualCircuitTerminationFilterSet + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1') + device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') + site = Site.objects.create(name='Site 1', slug='site-1') + + devices = ( + Device(site=site, name='Device 1', device_type=device_type, role=device_role), + Device(site=site, name='Device 2', device_type=device_type, role=device_role), + Device(site=site, name='Device 3', device_type=device_type, role=device_role), + ) + Device.objects.bulk_create(devices) + + virtual_interfaces = ( + # Device 1 + Interface( + device=devices[0], + name='eth0.1', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[0], + name='eth0.2', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + # Device 2 + Interface( + device=devices[1], + name='eth0.1', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[1], + name='eth0.2', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + # Device 3 + Interface( + device=devices[2], + name='eth0.1', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[2], + name='eth0.2', + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + ) + Interface.objects.bulk_create(virtual_interfaces) + + providers = ( + Provider(name='Provider 1', slug='provider-1'), + Provider(name='Provider 2', slug='provider-2'), + Provider(name='Provider 3', slug='provider-3'), + ) + Provider.objects.bulk_create(providers) + provider_networks = ( + ProviderNetwork(provider=providers[0], name='Provider Network 1'), + ProviderNetwork(provider=providers[1], name='Provider Network 2'), + ProviderNetwork(provider=providers[2], name='Provider Network 3'), + ) + ProviderNetwork.objects.bulk_create(provider_networks) + provider_accounts = ( + ProviderAccount(provider=providers[0], account='Provider Account 1'), + ProviderAccount(provider=providers[1], account='Provider Account 2'), + ProviderAccount(provider=providers[2], account='Provider Account 3'), + ) + ProviderAccount.objects.bulk_create(provider_accounts) + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_networks[0], + provider_account=provider_accounts[0], + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_networks[1], + provider_account=provider_accounts[1], + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_networks[2], + provider_account=provider_accounts[2], + cid='Virtual Circuit 3' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + + virtual_circuit_terminations = ( + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_HUB, + interface=virtual_interfaces[0], + description='termination1' + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_SPOKE, + interface=virtual_interfaces[3], + description='termination2' + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[1], + description='termination3' + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[4], + description='termination4' + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[2], + description='termination5' + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[5], + description='termination6' + ), + ) + VirtualCircuitTermination.objects.bulk_create(virtual_circuit_terminations) + + def test_q(self): + params = {'q': 'termination1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['termination1', 'termination2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + def test_virtual_circuit_id(self): + virtual_circuits = VirtualCircuit.objects.filter()[:2] + params = {'virtual_circuit_id': [virtual_circuits[0].pk, virtual_circuits[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_provider(self): + providers = Provider.objects.all()[:2] + params = {'provider_id': [providers[0].pk, providers[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'provider': [providers[0].slug, providers[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_provider_network(self): + provider_networks = ProviderNetwork.objects.all()[:2] + params = {'provider_network_id': [provider_networks[0].pk, provider_networks[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_provider_account(self): + provider_accounts = ProviderAccount.objects.all()[:2] + params = {'provider_account_id': [provider_accounts[0].pk, provider_accounts[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + params = {'provider_account': [provider_accounts[0].account, provider_accounts[1].account]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) + + def test_interface(self): + interfaces = Interface.objects.all()[:2] + params = {'interface_id': [interfaces[0].pk, interfaces[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index f6c626443..321c2daa7 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -7,7 +7,8 @@ from django.urls import reverse from circuits.choices import * from circuits.models import * from core.models import ObjectType -from dcim.models import Cable, Interface, Site +from dcim.choices import InterfaceTypeChoices +from dcim.models import Cable, Device, DeviceRole, DeviceType, Interface, Manufacturer, Site from ipam.models import ASN, RIR from netbox.choices import ImportFormatChoices from users.models import ObjectPermission @@ -341,7 +342,7 @@ class ProviderNetworkTestCase(ViewTestCases.PrimaryObjectViewTestCase): } -class TestCase(ViewTestCases.PrimaryObjectViewTestCase): +class CircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = CircuitTermination @classmethod @@ -518,3 +519,319 @@ class CircuitGroupAssignmentTestCase( cls.bulk_edit_data = { 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, } + + +class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = VirtualCircuit + + def setUp(self): + super().setUp() + + self.add_permissions( + 'circuits.add_virtualcircuittermination', + ) + + @classmethod + def setUpTestData(cls): + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + provider_networks = ( + ProviderNetwork(provider=provider, name='Provider Network 1'), + ProviderNetwork(provider=provider, name='Provider Network 2'), + ) + ProviderNetwork.objects.bulk_create(provider_networks) + provider_accounts = ( + ProviderAccount(provider=provider, account='Provider Account 1'), + ProviderAccount(provider=provider, account='Provider Account 2'), + ) + ProviderAccount.objects.bulk_create(provider_accounts) + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_networks[0], + provider_account=provider_accounts[0], + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_networks[0], + provider_account=provider_accounts[0], + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_networks[0], + provider_account=provider_accounts[0], + cid='Virtual Circuit 3' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + + device = create_test_device('Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 2', type=InterfaceTypeChoices.TYPE_VIRTUAL), + Interface(device=device, name='Interface 3', type=InterfaceTypeChoices.TYPE_VIRTUAL), + ) + Interface.objects.bulk_create(interfaces) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'cid': 'Virtual Circuit X', + 'provider_network': provider_networks[1].pk, + 'provider_account': provider_accounts[1].pk, + 'status': CircuitStatusChoices.STATUS_PLANNED, + 'description': 'A new virtual circuit', + 'comments': 'Some comments', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "cid,provider_network,provider_account,status", + f"Virtual Circuit 4,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", + f"Virtual Circuit 5,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", + f"Virtual Circuit 6,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", + ) + + cls.csv_update_data = ( + "id,cid,description,status", + f"{virtual_circuits[0].pk},Virtual Circuit A,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", + f"{virtual_circuits[1].pk},Virtual Circuit B,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", + f"{virtual_circuits[2].pk},Virtual Circuit C,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", + ) + + cls.bulk_edit_data = { + 'provider_network': provider_networks[1].pk, + 'provider_account': provider_accounts[1].pk, + 'status': CircuitStatusChoices.STATUS_DECOMMISSIONED, + 'description': 'New description', + 'comments': 'New comments', + } + + @override_settings(EXEMPT_VIEW_PERMISSIONS=['*'], EXEMPT_EXCLUDE_MODELS=[]) + def test_bulk_import_objects_with_terminations(self): + interfaces = Interface.objects.filter(type=InterfaceTypeChoices.TYPE_VIRTUAL) + json_data = f""" + [ + {{ + "cid": "Virtual Circuit 7", + "provider_network": "Provider Network 1", + "status": "active", + "terminations": [ + {{ + "role": "hub", + "interface": {interfaces[0].pk} + }}, + {{ + "role": "spoke", + "interface": {interfaces[1].pk} + }}, + {{ + "role": "spoke", + "interface": {interfaces[2].pk} + }} + ] + }} + ] + """ + + initial_count = self._get_queryset().count() + data = { + 'data': json_data, + 'format': ImportFormatChoices.JSON, + } + + # Assign model-level permission + obj_perm = ObjectPermission( + name='Test permission', + actions=['add'] + ) + obj_perm.save() + obj_perm.users.add(self.user) + obj_perm.object_types.add(ObjectType.objects.get_for_model(self.model)) + + # Try GET with model-level permission + self.assertHttpStatus(self.client.get(self._get_url('import')), 200) + + # Test POST with permission + self.assertHttpStatus(self.client.post(self._get_url('import'), data), 302) + self.assertEqual(self._get_queryset().count(), initial_count + 1) + + +class VirtualCircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = VirtualCircuitTermination + + @classmethod + def setUpTestData(cls): + manufacturer = Manufacturer.objects.create(name='Manufacturer 1', slug='manufacturer-1') + device_type = DeviceType.objects.create(manufacturer=manufacturer, model='Device Type 1') + device_role = DeviceRole.objects.create(name='Device Role 1', slug='device-role-1') + site = Site.objects.create(name='Site 1', slug='site-1') + + devices = ( + Device(site=site, name='hub', device_type=device_type, role=device_role), + Device(site=site, name='spoke1', device_type=device_type, role=device_role), + Device(site=site, name='spoke2', device_type=device_type, role=device_role), + Device(site=site, name='spoke3', device_type=device_type, role=device_role), + ) + Device.objects.bulk_create(devices) + + physical_interfaces = ( + Interface(device=devices[0], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[1], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[2], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + Interface(device=devices[3], name='eth0', type=InterfaceTypeChoices.TYPE_1GE_FIXED), + ) + Interface.objects.bulk_create(physical_interfaces) + + virtual_interfaces = ( + # Point-to-point VCs + Interface( + device=devices[0], + name='eth0.1', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[0], + name='eth0.2', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[0], + name='eth0.3', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[1], + name='eth0.1', + parent=physical_interfaces[1], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[2], + name='eth0.1', + parent=physical_interfaces[2], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[3], + name='eth0.1', + parent=physical_interfaces[3], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + + # Hub and spoke VCs + Interface( + device=devices[0], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[1], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[2], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + Interface( + device=devices[3], + name='eth0.9', + parent=physical_interfaces[0], + type=InterfaceTypeChoices.TYPE_VIRTUAL + ), + ) + Interface.objects.bulk_create(virtual_interfaces) + + provider = Provider.objects.create(name='Provider 1', slug='provider-1') + provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') + provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 3' + ), + VirtualCircuit( + provider_network=provider_network, + provider_account=provider_account, + cid='Virtual Circuit 4' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + + virtual_circuit_terminations = ( + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[0] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[0], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[3] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[1] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[1], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[4] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[2] + ), + VirtualCircuitTermination( + virtual_circuit=virtual_circuits[2], + role=VirtualCircuitTerminationRoleChoices.ROLE_PEER, + interface=virtual_interfaces[5] + ), + ) + VirtualCircuitTermination.objects.bulk_create(virtual_circuit_terminations) + + cls.form_data = { + 'virtual_circuit': virtual_circuits[3].pk, + 'role': VirtualCircuitTerminationRoleChoices.ROLE_HUB, + 'interface': virtual_interfaces[6].pk + } + + cls.csv_data = ( + "virtual_circuit,role,interface,description", + f"Virtual Circuit 4,{VirtualCircuitTerminationRoleChoices.ROLE_HUB},{virtual_interfaces[6].pk},Hub", + f"Virtual Circuit 4,{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},{virtual_interfaces[7].pk},Spoke 1", + f"Virtual Circuit 4,{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},{virtual_interfaces[8].pk},Spoke 2", + f"Virtual Circuit 4,{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},{virtual_interfaces[9].pk},Spoke 3", + ) + + cls.csv_update_data = ( + "id,role,description", + f"{virtual_circuit_terminations[0].pk},{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},New description", + f"{virtual_circuit_terminations[1].pk},{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},New description", + f"{virtual_circuit_terminations[2].pk},{VirtualCircuitTerminationRoleChoices.ROLE_SPOKE},New description", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + } diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 2171d49be..bd9ca6989 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -70,4 +70,20 @@ urlpatterns = [ path('circuit-group-assignments/edit/', views.CircuitGroupAssignmentBulkEditView.as_view(), name='circuitgroupassignment_bulk_edit'), path('circuit-group-assignments/delete/', views.CircuitGroupAssignmentBulkDeleteView.as_view(), name='circuitgroupassignment_bulk_delete'), path('circuit-group-assignments//', include(get_model_urls('circuits', 'circuitgroupassignment'))), + + # Virtual circuits + path('virtual-circuits/', views.VirtualCircuitListView.as_view(), name='virtualcircuit_list'), + path('virtual-circuits/add/', views.VirtualCircuitEditView.as_view(), name='virtualcircuit_add'), + path('virtual-circuits/import/', views.VirtualCircuitBulkImportView.as_view(), name='virtualcircuit_import'), + path('virtual-circuits/edit/', views.VirtualCircuitBulkEditView.as_view(), name='virtualcircuit_bulk_edit'), + path('virtual-circuits/delete/', views.VirtualCircuitBulkDeleteView.as_view(), name='virtualcircuit_bulk_delete'), + path('virtual-circuits//', include(get_model_urls('circuits', 'virtualcircuit'))), + + # Virtual circuit terminations + path('virtual-circuit-terminations/', views.VirtualCircuitTerminationListView.as_view(), name='virtualcircuittermination_list'), + path('virtual-circuit-terminations/add/', views.VirtualCircuitTerminationEditView.as_view(), name='virtualcircuittermination_add'), + path('virtual-circuit-terminations/import/', views.VirtualCircuitTerminationBulkImportView.as_view(), name='virtualcircuittermination_import'), + path('virtual-circuit-terminations/edit/', views.VirtualCircuitTerminationBulkEditView.as_view(), name='virtualcircuittermination_bulk_edit'), + path('virtual-circuit-terminations/delete/', views.VirtualCircuitTerminationBulkDeleteView.as_view(), name='virtualcircuittermination_bulk_delete'), + path('virtual-circuit-terminations//', include(get_model_urls('circuits', 'virtualcircuittermination'))), ] diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 4059065bf..34a1deb6a 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -537,3 +537,109 @@ class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView): queryset = CircuitGroupAssignment.objects.all() filterset = filtersets.CircuitGroupAssignmentFilterSet table = tables.CircuitGroupAssignmentTable + + +# +# Virtual circuits +# + +class VirtualCircuitListView(generic.ObjectListView): + queryset = VirtualCircuit.objects.annotate( + termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit') + ) + filterset = filtersets.VirtualCircuitFilterSet + filterset_form = forms.VirtualCircuitFilterForm + table = tables.VirtualCircuitTable + + +@register_model_view(VirtualCircuit) +class VirtualCircuitView(generic.ObjectView): + queryset = VirtualCircuit.objects.all() + + +@register_model_view(VirtualCircuit, 'edit') +class VirtualCircuitEditView(generic.ObjectEditView): + queryset = VirtualCircuit.objects.all() + form = forms.VirtualCircuitForm + + +@register_model_view(VirtualCircuit, 'delete') +class VirtualCircuitDeleteView(generic.ObjectDeleteView): + queryset = VirtualCircuit.objects.all() + + +class VirtualCircuitBulkImportView(generic.BulkImportView): + queryset = VirtualCircuit.objects.all() + model_form = forms.VirtualCircuitImportForm + additional_permissions = [ + 'circuits.add_virtualcircuittermination', + ] + related_object_forms = { + 'terminations': forms.VirtualCircuitTerminationImportRelatedForm, + } + + def prep_related_object_data(self, parent, data): + data.update({'virtual_circuit': parent}) + return data + + +class VirtualCircuitBulkEditView(generic.BulkEditView): + queryset = VirtualCircuit.objects.annotate( + termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit') + ) + filterset = filtersets.VirtualCircuitFilterSet + table = tables.VirtualCircuitTable + form = forms.VirtualCircuitBulkEditForm + + +class VirtualCircuitBulkDeleteView(generic.BulkDeleteView): + queryset = VirtualCircuit.objects.annotate( + termination_count=count_related(VirtualCircuitTermination, 'virtual_circuit') + ) + filterset = filtersets.VirtualCircuitFilterSet + table = tables.VirtualCircuitTable + + +# +# Virtual circuit terminations +# + +class VirtualCircuitTerminationListView(generic.ObjectListView): + queryset = VirtualCircuitTermination.objects.all() + filterset = filtersets.VirtualCircuitTerminationFilterSet + filterset_form = forms.VirtualCircuitTerminationFilterForm + table = tables.VirtualCircuitTerminationTable + + +@register_model_view(VirtualCircuitTermination) +class VirtualCircuitTerminationView(generic.ObjectView): + queryset = VirtualCircuitTermination.objects.all() + + +@register_model_view(VirtualCircuitTermination, 'edit') +class VirtualCircuitTerminationEditView(generic.ObjectEditView): + queryset = VirtualCircuitTermination.objects.all() + form = forms.VirtualCircuitTerminationForm + + +@register_model_view(VirtualCircuitTermination, 'delete') +class VirtualCircuitTerminationDeleteView(generic.ObjectDeleteView): + queryset = VirtualCircuitTermination.objects.all() + + +class VirtualCircuitTerminationBulkImportView(generic.BulkImportView): + queryset = VirtualCircuitTermination.objects.all() + model_form = forms.VirtualCircuitTerminationImportForm + + +class VirtualCircuitTerminationBulkEditView(generic.BulkEditView): + queryset = VirtualCircuitTermination.objects.all() + filterset = filtersets.VirtualCircuitTerminationFilterSet + table = tables.VirtualCircuitTerminationTable + form = forms.VirtualCircuitTerminationBulkEditForm + + +class VirtualCircuitTerminationBulkDeleteView(generic.BulkDeleteView): + queryset = VirtualCircuitTermination.objects.all() + filterset = filtersets.VirtualCircuitTerminationFilterSet + table = tables.VirtualCircuitTerminationTable diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index cb8d91c89..f4d65d4bc 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -4,7 +4,7 @@ from django.utils.translation import gettext as _ from drf_spectacular.types import OpenApiTypes from drf_spectacular.utils import extend_schema_field -from circuits.models import CircuitTermination +from circuits.models import CircuitTermination, VirtualCircuit, VirtualCircuitTermination from extras.filtersets import LocalConfigContextFilterSet from extras.models import ConfigTemplate from ipam.filtersets import PrimaryIPFilterSet @@ -1842,6 +1842,16 @@ class InterfaceFilterSet( queryset=WirelessLink.objects.all(), label=_('Wireless link') ) + virtual_circuit_id = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit_termination__virtual_circuit', + queryset=VirtualCircuit.objects.all(), + label=_('Virtual circuit (ID)'), + ) + virtual_circuit_termination_id = django_filters.ModelMultipleChoiceFilter( + field_name='virtual_circuit_termination', + queryset=VirtualCircuitTermination.objects.all(), + label=_('Virtual circuit termination (ID)'), + ) class Meta: model = Interface diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 9b108bcca..ce9e5607f 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -998,6 +998,14 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd def l2vpn_termination(self): return self.l2vpn_terminations.first() + @cached_property + def connected_endpoints(self): + # If this is a virtual interface, return the remote endpoint of the connected + # virtual circuit, if any. + if self.is_virtual and hasattr(self, 'virtual_circuit_termination'): + return self.virtual_circuit_termination.peer_terminations + return super().connected_endpoints + # # Pass-through ports diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index d226c7335..494d83114 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -649,6 +649,14 @@ class InterfaceTable(BaseInterfaceTable, ModularDeviceComponentTable, PathEndpoi url_name='dcim:interface_list' ) + # Override PathEndpointTable.connection to accommodate virtual circuits + connection = columns.TemplateColumn( + accessor='_path__destinations', + template_code=INTERFACE_LINKTERMINATION, + verbose_name=_('Connection'), + orderable=False + ) + class Meta(DeviceComponentTable.Meta): model = models.Interface fields = ( diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index dc9724e3c..e6f2c8817 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -10,6 +10,20 @@ LINKTERMINATION = """ {% endfor %} """ +INTERFACE_LINKTERMINATION = """ +{% load i18n %} +{% if record.is_virtual and record.virtual_circuit_termination %} + {% for termination in record.connected_endpoints %} + {{ termination.interface.parent_object }} + + {{ termination.interface }} + {% trans "via" %} + {{ termination.parent_object }} + {% if not forloop.last %}
    {% endif %} + {% endfor %} +{% else %}""" + LINKTERMINATION + """{% endif %} +""" + CABLE_LENGTH = """ {% load helpers %} {% if record.length %}{{ record.length|floatformat:"-2" }} {{ record.length_unit }}{% endif %} diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index b3d576cb9..c94e36e4b 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1168,6 +1168,8 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'tunnelgroup', 'tunneltermination', 'virtualchassis', + 'virtualcircuit', + 'virtualcircuittermination', 'virtualdevicecontext', 'virtualdisk', 'virtualmachine', diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 1c4f9bf88..ba20e5f98 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -284,6 +284,13 @@ CIRCUITS_MENU = Menu( get_model_item('circuits', 'circuittermination', _('Circuit Terminations')), ), ), + MenuGroup( + label=_('Virtual Circuits'), + items=( + get_model_item('circuits', 'virtualcircuit', _('Virtual Circuits')), + get_model_item('circuits', 'virtualcircuittermination', _('Virtual Circuit Terminations')), + ), + ), MenuGroup( label=_('Providers'), items=( diff --git a/netbox/templates/circuits/providernetwork.html b/netbox/templates/circuits/providernetwork.html index 000548734..5fd92615d 100644 --- a/netbox/templates/circuits/providernetwork.html +++ b/netbox/templates/circuits/providernetwork.html @@ -50,6 +50,19 @@

    {% trans "Circuits" %}

    {% htmx_table 'circuits:circuit_list' provider_network_id=object.pk %}
    +
    +

    + {% trans "Virtual Circuits" %} + {% if perms.circuits.add_virtualcircuit %} + + {% endif %} +

    + {% htmx_table 'circuits:virtualcircuit_list' provider_network_id=object.pk %} +
    {% plugin_full_width_page object %}
    diff --git a/netbox/templates/circuits/virtualcircuit.html b/netbox/templates/circuits/virtualcircuit.html new file mode 100644 index 000000000..400f90524 --- /dev/null +++ b/netbox/templates/circuits/virtualcircuit.html @@ -0,0 +1,84 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block breadcrumbs %} + {{ block.super }} + + +{% endblock %} + +{% block content %} +
    +
    +
    +

    {% trans "Virtual circuit" %}

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Provider" %}{{ object.provider|linkify }}
    {% trans "Provider Network" %}{{ object.provider_network|linkify }}
    {% trans "Provider account" %}{{ object.provider_account|linkify|placeholder }}
    {% trans "Circuit ID" %}{{ object.cid }}
    {% trans "Status" %}{% badge object.get_status_display bg_color=object.get_status_color %}
    {% trans "Tenant" %} + {% if object.tenant.group %} + {{ object.tenant.group|linkify }} / + {% endif %} + {{ object.tenant|linkify|placeholder }} +
    {% trans "Description" %}{{ object.description|placeholder }}
    +
    + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/custom_fields.html' %} + {% include 'inc/panels/comments.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    +
    +

    + {% trans "Terminations" %} + {% if perms.circuits.add_virtualcircuittermination %} + + {% endif %} +

    + {% htmx_table 'circuits:virtualcircuittermination_list' virtual_circuit_id=object.pk %} +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/circuits/virtualcircuittermination.html b/netbox/templates/circuits/virtualcircuittermination.html new file mode 100644 index 000000000..c08e3c604 --- /dev/null +++ b/netbox/templates/circuits/virtualcircuittermination.html @@ -0,0 +1,81 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load i18n %} + +{% block breadcrumbs %} + {{ block.super }} + + + +{% endblock %} + +{% block content %} +
    +
    +
    +

    {% trans "Virtual Circuit Termination" %}

    + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Provider" %}{{ object.virtual_circuit.provider|linkify }}
    {% trans "Provider Network" %}{{ object.virtual_circuit.provider_network|linkify }}
    {% trans "Provider account" %}{{ object.virtual_circuit.provider_account|linkify|placeholder }}
    {% trans "Virtual circuit" %}{{ object.virtual_circuit|linkify }}
    {% trans "Role" %}{% badge object.get_role_display bg_color=object.get_role_color %}
    +
    + {% include 'inc/panels/tags.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% plugin_left_page object %} +
    +
    +
    +

    {% trans "Interface" %}

    + + + + + + + + + + + + + + + + + +
    {% trans "Device" %}{{ object.interface.device|linkify }}
    {% trans "Interface" %}{{ object.interface|linkify }}
    {% trans "Type" %}{{ object.interface.get_type_display }}
    {% trans "Description" %}{{ object.interface.description|placeholder }}
    +
    + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index f364b12bc..b0d307bee 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -152,7 +152,41 @@ - {% if not object.is_virtual %} + {% if object.is_virtual and object.virtual_circuit_termination %} +
    +

    {% trans "Virtual Circuit" %}

    + + + + + + + + + + + + + + + + + + + + + +
    {% trans "Provider" %}{{ object.virtual_circuit_termination.virtual_circuit.provider|linkify }}
    {% trans "Provider Network" %}{{ object.virtual_circuit_termination.virtual_circuit.provider_network|linkify }}
    {% trans "Circuit ID" %}{{ object.virtual_circuit_termination.virtual_circuit|linkify }}
    {% trans "Role" %}{{ object.virtual_circuit_termination.get_role_display }}
    {% trans "Connections" %} + {% for termination in object.virtual_circuit_termination.peer_terminations %} + {{ termination.interface.parent_object }} + + {{ termination.interface }} + ({{ termination.get_role_display }}) + {% if not forloop.last %}
    {% endif %} + {% endfor %} +
    +
    + {% elif not object.is_virtual %}

    {% trans "Connection" %}

    {% if object.mark_connected %} From 13bd2ed7670dd83bea5e3a1ac5a695a5ab7287ff Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Tue, 19 Nov 2024 13:38:11 -0600 Subject: [PATCH 041/169] Closes: #17795 - Add concurrency to CI (#18042) * Closes: #17795 - Add concurrency to CI * Add comment to demonstrate functionality --- .github/workflows/ci.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3b4876c3..622c8ad7d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -15,6 +15,11 @@ on: permissions: contents: read +# Add concurrency group to control job running +concurrency: + group: ${{ github.event_name }}-${{ github.ref }}-${{ github.actor }} + cancel-in-progress: true + jobs: build: runs-on: ubuntu-latest From e36f23ed03623546f9c5bb4afb4c59bd36f942a9 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Wed, 20 Nov 2024 14:33:50 -0500 Subject: [PATCH 042/169] Fixes: #18038 - Ensure DeviceType._abs_weight is stored as an integer (#18039) * Coerce _abs_weight to int to prevent disagreement with PositiveBigIntegerField deserialization * Perform coercion in to_grams --- netbox/utilities/conversion.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/netbox/utilities/conversion.py b/netbox/utilities/conversion.py index cd75c3c17..07e57d96e 100644 --- a/netbox/utilities/conversion.py +++ b/netbox/utilities/conversion.py @@ -10,9 +10,9 @@ __all__ = ( ) -def to_grams(weight, unit): +def to_grams(weight, unit) -> int: """ - Convert the given weight to kilograms. + Convert the given weight to integer grams. """ try: if weight < 0: @@ -21,13 +21,13 @@ def to_grams(weight, unit): raise TypeError(_("Invalid value '{weight}' for weight (must be a number)").format(weight=weight)) if unit == WeightUnitChoices.UNIT_KILOGRAM: - return weight * 1000 + return int(weight * 1000) if unit == WeightUnitChoices.UNIT_GRAM: - return weight + return int(weight) if unit == WeightUnitChoices.UNIT_POUND: - return weight * Decimal(453.592) + return int(weight * Decimal(453.592)) if unit == WeightUnitChoices.UNIT_OUNCE: - return weight * Decimal(28.3495) + return int(weight * Decimal(28.3495)) raise ValueError( _("Unknown unit {unit}. Must be one of the following: {valid_units}").format( unit=unit, From eb645ee900a4d5dfbfb4fd09a6e09424323d3b1c Mon Sep 17 00:00:00 2001 From: Matt Skalecki Date: Fri, 15 Nov 2024 12:24:22 -0500 Subject: [PATCH 043/169] Hide `sensitive_parameters` from datasource view even for high privilege users --- netbox/templates/core/datasource.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/core/datasource.html b/netbox/templates/core/datasource.html index 1ce14451b..a5afedec6 100644 --- a/netbox/templates/core/datasource.html +++ b/netbox/templates/core/datasource.html @@ -87,7 +87,7 @@ {% for name, field in backend.parameters.items %} {{ field.label }} - {% if name in backend.sensitive_parameters and not perms.core.change_datasource %} + {% if name in backend.sensitive_parameters %} ******** {% else %} {{ object.parameters|get_key:name|placeholder }} From a0b4b0afe01ef2da913148208bcfaff6ede9463f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 20 Nov 2024 15:54:37 -0500 Subject: [PATCH 044/169] Closes #18023: Employ `register_model_view()` for list views (#18029) * Extend register_model_view() to enable registering list views * Register circuits list views with register_model_view() * Register core list views with register_model_view() * Fix bulk_edit & bulk_delete URL paths * Register dcim list views with register_model_view() (WIP) * Register dcim list views with register_model_view() * Register extras list views with register_model_view() * Register ipam list views with register_model_view() * Register tenancy list views with register_model_view() * Register users list views with register_model_view() * Register virtualization list views with register_model_view() * Register vpn list views with register_model_view() * Register wireless list views with register_model_view() * Add change note for register_model_view() --- docs/plugins/development/views.md | 3 + netbox/circuits/urls.py | 63 ++---- netbox/circuits/views.py | 40 ++++ netbox/core/urls.py | 29 +-- netbox/core/views.py | 16 ++ netbox/dcim/urls.py | 340 ++++++------------------------ netbox/dcim/views.py | 325 +++++++++++++++++++++++----- netbox/extras/urls.py | 112 +++------- netbox/extras/views.py | 93 ++++++-- netbox/ipam/urls.py | 126 ++--------- netbox/ipam/views.py | 88 ++++++++ netbox/tenancy/urls.py | 44 +--- netbox/tenancy/views.py | 44 +++- netbox/users/urls.py | 29 +-- netbox/users/views.py | 29 ++- netbox/utilities/urls.py | 11 +- netbox/utilities/views.py | 6 +- netbox/virtualization/urls.py | 56 ++--- netbox/virtualization/views.py | 32 +++ netbox/vpn/urls.py | 72 +------ netbox/vpn/views.py | 52 +++++ netbox/wireless/urls.py | 23 +- netbox/wireless/views.py | 15 ++ 23 files changed, 845 insertions(+), 803 deletions(-) diff --git a/docs/plugins/development/views.md b/docs/plugins/development/views.md index 1f5f164fd..3b6213917 100644 --- a/docs/plugins/development/views.md +++ b/docs/plugins/development/views.md @@ -185,6 +185,9 @@ class MyView(generic.ObjectView): ) ``` +!!! note "Changed in NetBox v4.2" + The `register_model_view()` function was extended in NetBox v4.2 to support registration of list views by passing `detail=False`. + ::: utilities.views.register_model_view ::: utilities.views.ViewTab diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index bd9ca6989..b4746038d 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -5,70 +5,33 @@ from . import views app_name = 'circuits' urlpatterns = [ - - # Providers - path('providers/', views.ProviderListView.as_view(), name='provider_list'), - path('providers/add/', views.ProviderEditView.as_view(), name='provider_add'), - path('providers/import/', views.ProviderBulkImportView.as_view(), name='provider_import'), - path('providers/edit/', views.ProviderBulkEditView.as_view(), name='provider_bulk_edit'), - path('providers/delete/', views.ProviderBulkDeleteView.as_view(), name='provider_bulk_delete'), + path('providers/', include(get_model_urls('circuits', 'provider', detail=False))), path('providers//', include(get_model_urls('circuits', 'provider'))), - # Provider accounts - path('provider-accounts/', views.ProviderAccountListView.as_view(), name='provideraccount_list'), - path('provider-accounts/add/', views.ProviderAccountEditView.as_view(), name='provideraccount_add'), - path('provider-accounts/import/', views.ProviderAccountBulkImportView.as_view(), name='provideraccount_import'), - path('provider-accounts/edit/', views.ProviderAccountBulkEditView.as_view(), name='provideraccount_bulk_edit'), - path('provider-accounts/delete/', views.ProviderAccountBulkDeleteView.as_view(), name='provideraccount_bulk_delete'), + path('provider-accounts/', include(get_model_urls('circuits', 'provideraccount', detail=False))), path('provider-accounts//', include(get_model_urls('circuits', 'provideraccount'))), - # Provider networks - path('provider-networks/', views.ProviderNetworkListView.as_view(), name='providernetwork_list'), - path('provider-networks/add/', views.ProviderNetworkEditView.as_view(), name='providernetwork_add'), - path('provider-networks/import/', views.ProviderNetworkBulkImportView.as_view(), name='providernetwork_import'), - path('provider-networks/edit/', views.ProviderNetworkBulkEditView.as_view(), name='providernetwork_bulk_edit'), - path('provider-networks/delete/', views.ProviderNetworkBulkDeleteView.as_view(), name='providernetwork_bulk_delete'), + path('provider-networks/', include(get_model_urls('circuits', 'providernetwork', detail=False))), path('provider-networks//', include(get_model_urls('circuits', 'providernetwork'))), - # Circuit types - path('circuit-types/', views.CircuitTypeListView.as_view(), name='circuittype_list'), - path('circuit-types/add/', views.CircuitTypeEditView.as_view(), name='circuittype_add'), - path('circuit-types/import/', views.CircuitTypeBulkImportView.as_view(), name='circuittype_import'), - path('circuit-types/edit/', views.CircuitTypeBulkEditView.as_view(), name='circuittype_bulk_edit'), - path('circuit-types/delete/', views.CircuitTypeBulkDeleteView.as_view(), name='circuittype_bulk_delete'), + path('circuit-types/', include(get_model_urls('circuits', 'circuittype', detail=False))), path('circuit-types//', include(get_model_urls('circuits', 'circuittype'))), - # Circuits - path('circuits/', views.CircuitListView.as_view(), name='circuit_list'), - path('circuits/add/', views.CircuitEditView.as_view(), name='circuit_add'), - path('circuits/import/', views.CircuitBulkImportView.as_view(), name='circuit_import'), - path('circuits/edit/', views.CircuitBulkEditView.as_view(), name='circuit_bulk_edit'), - path('circuits/delete/', views.CircuitBulkDeleteView.as_view(), name='circuit_bulk_delete'), - path('circuits//terminations/swap/', views.CircuitSwapTerminations.as_view(), name='circuit_terminations_swap'), + path('circuits/', include(get_model_urls('circuits', 'circuit', detail=False))), + path( + 'circuits//terminations/swap/', + views.CircuitSwapTerminations.as_view(), + name='circuit_terminations_swap' + ), path('circuits//', include(get_model_urls('circuits', 'circuit'))), - # Circuit terminations - path('circuit-terminations/', views.CircuitTerminationListView.as_view(), name='circuittermination_list'), - path('circuit-terminations/add/', views.CircuitTerminationEditView.as_view(), name='circuittermination_add'), - path('circuit-terminations/import/', views.CircuitTerminationBulkImportView.as_view(), name='circuittermination_import'), - path('circuit-terminations/edit/', views.CircuitTerminationBulkEditView.as_view(), name='circuittermination_bulk_edit'), - path('circuit-terminations/delete/', views.CircuitTerminationBulkDeleteView.as_view(), name='circuittermination_bulk_delete'), + path('circuit-terminations/', include(get_model_urls('circuits', 'circuittermination', detail=False))), path('circuit-terminations//', include(get_model_urls('circuits', 'circuittermination'))), - # Circuit Groups - path('circuit-groups/', views.CircuitGroupListView.as_view(), name='circuitgroup_list'), - path('circuit-groups/add/', views.CircuitGroupEditView.as_view(), name='circuitgroup_add'), - path('circuit-groups/import/', views.CircuitGroupBulkImportView.as_view(), name='circuitgroup_import'), - path('circuit-groups/edit/', views.CircuitGroupBulkEditView.as_view(), name='circuitgroup_bulk_edit'), - path('circuit-groups/delete/', views.CircuitGroupBulkDeleteView.as_view(), name='circuitgroup_bulk_delete'), + path('circuit-groups/', include(get_model_urls('circuits', 'circuitgroup', detail=False))), path('circuit-groups//', include(get_model_urls('circuits', 'circuitgroup'))), - # Circuit Group Assignments - path('circuit-group-assignments/', views.CircuitGroupAssignmentListView.as_view(), name='circuitgroupassignment_list'), - path('circuit-group-assignments/add/', views.CircuitGroupAssignmentEditView.as_view(), name='circuitgroupassignment_add'), - path('circuit-group-assignments/import/', views.CircuitGroupAssignmentBulkImportView.as_view(), name='circuitgroupassignment_import'), - path('circuit-group-assignments/edit/', views.CircuitGroupAssignmentBulkEditView.as_view(), name='circuitgroupassignment_bulk_edit'), - path('circuit-group-assignments/delete/', views.CircuitGroupAssignmentBulkDeleteView.as_view(), name='circuitgroupassignment_bulk_delete'), + path('circuit-group-assignments/', include(get_model_urls('circuits', 'circuitgroupassignment', detail=False))), path('circuit-group-assignments//', include(get_model_urls('circuits', 'circuitgroupassignment'))), # Virtual circuits diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 34a1deb6a..7410d0a8f 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -17,6 +17,7 @@ from .models import * # Providers # +@register_model_view(Provider, 'list', path='', detail=False) class ProviderListView(generic.ObjectListView): queryset = Provider.objects.annotate( count_circuits=count_related(Circuit, 'provider') @@ -36,6 +37,7 @@ class ProviderView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Provider, 'add', detail=False) @register_model_view(Provider, 'edit') class ProviderEditView(generic.ObjectEditView): queryset = Provider.objects.all() @@ -47,11 +49,13 @@ class ProviderDeleteView(generic.ObjectDeleteView): queryset = Provider.objects.all() +@register_model_view(Provider, 'import', detail=False) class ProviderBulkImportView(generic.BulkImportView): queryset = Provider.objects.all() model_form = forms.ProviderImportForm +@register_model_view(Provider, 'bulk_edit', path='edit', detail=False) class ProviderBulkEditView(generic.BulkEditView): queryset = Provider.objects.annotate( count_circuits=count_related(Circuit, 'provider') @@ -61,6 +65,7 @@ class ProviderBulkEditView(generic.BulkEditView): form = forms.ProviderBulkEditForm +@register_model_view(Provider, 'bulk_delete', path='delete', detail=False) class ProviderBulkDeleteView(generic.BulkDeleteView): queryset = Provider.objects.annotate( count_circuits=count_related(Circuit, 'provider') @@ -78,6 +83,7 @@ class ProviderContactsView(ObjectContactsView): # ProviderAccounts # +@register_model_view(ProviderAccount, 'list', path='', detail=False) class ProviderAccountListView(generic.ObjectListView): queryset = ProviderAccount.objects.annotate( count_circuits=count_related(Circuit, 'provider_account') @@ -97,6 +103,7 @@ class ProviderAccountView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ProviderAccount, 'add', detail=False) @register_model_view(ProviderAccount, 'edit') class ProviderAccountEditView(generic.ObjectEditView): queryset = ProviderAccount.objects.all() @@ -108,12 +115,14 @@ class ProviderAccountDeleteView(generic.ObjectDeleteView): queryset = ProviderAccount.objects.all() +@register_model_view(ProviderAccount, 'import', detail=False) class ProviderAccountBulkImportView(generic.BulkImportView): queryset = ProviderAccount.objects.all() model_form = forms.ProviderAccountImportForm table = tables.ProviderAccountTable +@register_model_view(ProviderAccount, 'bulk_edit', path='edit', detail=False) class ProviderAccountBulkEditView(generic.BulkEditView): queryset = ProviderAccount.objects.annotate( count_circuits=count_related(Circuit, 'provider_account') @@ -123,6 +132,7 @@ class ProviderAccountBulkEditView(generic.BulkEditView): form = forms.ProviderAccountBulkEditForm +@register_model_view(ProviderAccount, 'bulk_delete', path='delete', detail=False) class ProviderAccountBulkDeleteView(generic.BulkDeleteView): queryset = ProviderAccount.objects.annotate( count_circuits=count_related(Circuit, 'provider_account') @@ -140,6 +150,7 @@ class ProviderAccountContactsView(ObjectContactsView): # Provider networks # +@register_model_view(ProviderNetwork, 'list', path='', detail=False) class ProviderNetworkListView(generic.ObjectListView): queryset = ProviderNetwork.objects.all() filterset = filtersets.ProviderNetworkFilterSet @@ -166,6 +177,7 @@ class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ProviderNetwork, 'add', detail=False) @register_model_view(ProviderNetwork, 'edit') class ProviderNetworkEditView(generic.ObjectEditView): queryset = ProviderNetwork.objects.all() @@ -177,11 +189,13 @@ class ProviderNetworkDeleteView(generic.ObjectDeleteView): queryset = ProviderNetwork.objects.all() +@register_model_view(ProviderNetwork, 'import', detail=False) class ProviderNetworkBulkImportView(generic.BulkImportView): queryset = ProviderNetwork.objects.all() model_form = forms.ProviderNetworkImportForm +@register_model_view(ProviderNetwork, 'bulk_edit', path='edit', detail=False) class ProviderNetworkBulkEditView(generic.BulkEditView): queryset = ProviderNetwork.objects.all() filterset = filtersets.ProviderNetworkFilterSet @@ -189,6 +203,7 @@ class ProviderNetworkBulkEditView(generic.BulkEditView): form = forms.ProviderNetworkBulkEditForm +@register_model_view(ProviderNetwork, 'bulk_delete', path='delete', detail=False) class ProviderNetworkBulkDeleteView(generic.BulkDeleteView): queryset = ProviderNetwork.objects.all() filterset = filtersets.ProviderNetworkFilterSet @@ -199,6 +214,7 @@ class ProviderNetworkBulkDeleteView(generic.BulkDeleteView): # Circuit Types # +@register_model_view(CircuitType, 'list', path='', detail=False) class CircuitTypeListView(generic.ObjectListView): queryset = CircuitType.objects.annotate( circuit_count=count_related(Circuit, 'type') @@ -218,6 +234,7 @@ class CircuitTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(CircuitType, 'add', detail=False) @register_model_view(CircuitType, 'edit') class CircuitTypeEditView(generic.ObjectEditView): queryset = CircuitType.objects.all() @@ -229,11 +246,13 @@ class CircuitTypeDeleteView(generic.ObjectDeleteView): queryset = CircuitType.objects.all() +@register_model_view(CircuitType, 'import', detail=False) class CircuitTypeBulkImportView(generic.BulkImportView): queryset = CircuitType.objects.all() model_form = forms.CircuitTypeImportForm +@register_model_view(CircuitType, 'bulk_edit', path='edit', detail=False) class CircuitTypeBulkEditView(generic.BulkEditView): queryset = CircuitType.objects.annotate( circuit_count=count_related(Circuit, 'type') @@ -243,6 +262,7 @@ class CircuitTypeBulkEditView(generic.BulkEditView): form = forms.CircuitTypeBulkEditForm +@register_model_view(CircuitType, 'bulk_delete', path='delete', detail=False) class CircuitTypeBulkDeleteView(generic.BulkDeleteView): queryset = CircuitType.objects.annotate( circuit_count=count_related(Circuit, 'type') @@ -255,6 +275,7 @@ class CircuitTypeBulkDeleteView(generic.BulkDeleteView): # Circuits # +@register_model_view(Circuit, 'list', path='', detail=False) class CircuitListView(generic.ObjectListView): queryset = Circuit.objects.prefetch_related( 'tenant__group', 'termination_a__termination', 'termination_z__termination', @@ -269,6 +290,7 @@ class CircuitView(generic.ObjectView): queryset = Circuit.objects.all() +@register_model_view(Circuit, 'add', detail=False) @register_model_view(Circuit, 'edit') class CircuitEditView(generic.ObjectEditView): queryset = Circuit.objects.all() @@ -280,6 +302,7 @@ class CircuitDeleteView(generic.ObjectDeleteView): queryset = Circuit.objects.all() +@register_model_view(Circuit, 'import', detail=False) class CircuitBulkImportView(generic.BulkImportView): queryset = Circuit.objects.all() model_form = forms.CircuitImportForm @@ -295,6 +318,7 @@ class CircuitBulkImportView(generic.BulkImportView): return data +@register_model_view(Circuit, 'bulk_edit', path='edit', detail=False) class CircuitBulkEditView(generic.BulkEditView): queryset = Circuit.objects.prefetch_related( 'tenant__group', 'termination_a__termination', 'termination_z__termination', @@ -304,6 +328,7 @@ class CircuitBulkEditView(generic.BulkEditView): form = forms.CircuitBulkEditForm +@register_model_view(Circuit, 'bulk_delete', path='delete', detail=False) class CircuitBulkDeleteView(generic.BulkDeleteView): queryset = Circuit.objects.prefetch_related( 'tenant__group', 'termination_a__termination', 'termination_z__termination', @@ -397,6 +422,7 @@ class CircuitContactsView(ObjectContactsView): # Circuit terminations # +@register_model_view(CircuitTermination, 'list', path='', detail=False) class CircuitTerminationListView(generic.ObjectListView): queryset = CircuitTermination.objects.all() filterset = filtersets.CircuitTerminationFilterSet @@ -409,6 +435,7 @@ class CircuitTerminationView(generic.ObjectView): queryset = CircuitTermination.objects.all() +@register_model_view(CircuitTermination, 'add', detail=False) @register_model_view(CircuitTermination, 'edit') class CircuitTerminationEditView(generic.ObjectEditView): queryset = CircuitTermination.objects.all() @@ -420,11 +447,13 @@ class CircuitTerminationDeleteView(generic.ObjectDeleteView): queryset = CircuitTermination.objects.all() +@register_model_view(CircuitTermination, 'import', detail=False) class CircuitTerminationBulkImportView(generic.BulkImportView): queryset = CircuitTermination.objects.all() model_form = forms.CircuitTerminationImportForm +@register_model_view(CircuitTermination, 'bulk_edit', path='edit', detail=False) class CircuitTerminationBulkEditView(generic.BulkEditView): queryset = CircuitTermination.objects.all() filterset = filtersets.CircuitTerminationFilterSet @@ -432,6 +461,7 @@ class CircuitTerminationBulkEditView(generic.BulkEditView): form = forms.CircuitTerminationBulkEditForm +@register_model_view(CircuitTermination, 'bulk_delete', path='delete', detail=False) class CircuitTerminationBulkDeleteView(generic.BulkDeleteView): queryset = CircuitTermination.objects.all() filterset = filtersets.CircuitTerminationFilterSet @@ -446,6 +476,7 @@ register_model_view(CircuitTermination, 'trace', kwargs={'model': CircuitTermina # Circuit Groups # +@register_model_view(CircuitGroup, 'list', path='', detail=False) class CircuitGroupListView(generic.ObjectListView): queryset = CircuitGroup.objects.annotate( circuit_group_assignment_count=count_related(CircuitGroupAssignment, 'group') @@ -465,6 +496,7 @@ class CircuitGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(CircuitGroup, 'add', detail=False) @register_model_view(CircuitGroup, 'edit') class CircuitGroupEditView(generic.ObjectEditView): queryset = CircuitGroup.objects.all() @@ -476,11 +508,13 @@ class CircuitGroupDeleteView(generic.ObjectDeleteView): queryset = CircuitGroup.objects.all() +@register_model_view(CircuitGroup, 'import', detail=False) class CircuitGroupBulkImportView(generic.BulkImportView): queryset = CircuitGroup.objects.all() model_form = forms.CircuitGroupImportForm +@register_model_view(CircuitGroup, 'bulk_edit', path='edit', detail=False) class CircuitGroupBulkEditView(generic.BulkEditView): queryset = CircuitGroup.objects.all() filterset = filtersets.CircuitGroupFilterSet @@ -488,6 +522,7 @@ class CircuitGroupBulkEditView(generic.BulkEditView): form = forms.CircuitGroupBulkEditForm +@register_model_view(CircuitGroup, 'bulk_delete', path='delete', detail=False) class CircuitGroupBulkDeleteView(generic.BulkDeleteView): queryset = CircuitGroup.objects.all() filterset = filtersets.CircuitGroupFilterSet @@ -498,6 +533,7 @@ class CircuitGroupBulkDeleteView(generic.BulkDeleteView): # Circuit Groups # +@register_model_view(CircuitGroupAssignment, 'list', path='', detail=False) class CircuitGroupAssignmentListView(generic.ObjectListView): queryset = CircuitGroupAssignment.objects.all() filterset = filtersets.CircuitGroupAssignmentFilterSet @@ -510,6 +546,7 @@ class CircuitGroupAssignmentView(generic.ObjectView): queryset = CircuitGroupAssignment.objects.all() +@register_model_view(CircuitGroupAssignment, 'add', detail=False) @register_model_view(CircuitGroupAssignment, 'edit') class CircuitGroupAssignmentEditView(generic.ObjectEditView): queryset = CircuitGroupAssignment.objects.all() @@ -521,11 +558,13 @@ class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView): queryset = CircuitGroupAssignment.objects.all() +@register_model_view(CircuitGroupAssignment, 'import', detail=False) class CircuitGroupAssignmentBulkImportView(generic.BulkImportView): queryset = CircuitGroupAssignment.objects.all() model_form = forms.CircuitGroupAssignmentImportForm +@register_model_view(CircuitGroupAssignment, 'bulk_edit', path='edit', detail=False) class CircuitGroupAssignmentBulkEditView(generic.BulkEditView): queryset = CircuitGroupAssignment.objects.all() filterset = filtersets.CircuitGroupAssignmentFilterSet @@ -533,6 +572,7 @@ class CircuitGroupAssignmentBulkEditView(generic.BulkEditView): form = forms.CircuitGroupAssignmentBulkEditForm +@register_model_view(CircuitGroupAssignment, 'bulk_delete', path='delete', detail=False) class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView): queryset = CircuitGroupAssignment.objects.all() filterset = filtersets.CircuitGroupAssignmentFilterSet diff --git a/netbox/core/urls.py b/netbox/core/urls.py index fd6ec8996..5db165a8b 100644 --- a/netbox/core/urls.py +++ b/netbox/core/urls.py @@ -6,27 +6,16 @@ from . import views app_name = 'core' urlpatterns = ( - # Data sources - path('data-sources/', views.DataSourceListView.as_view(), name='datasource_list'), - path('data-sources/add/', views.DataSourceEditView.as_view(), name='datasource_add'), - path('data-sources/import/', views.DataSourceBulkImportView.as_view(), name='datasource_import'), - path('data-sources/edit/', views.DataSourceBulkEditView.as_view(), name='datasource_bulk_edit'), - path('data-sources/delete/', views.DataSourceBulkDeleteView.as_view(), name='datasource_bulk_delete'), + path('data-sources/', include(get_model_urls('core', 'datasource', detail=False))), path('data-sources//', include(get_model_urls('core', 'datasource'))), - # Data files - path('data-files/', views.DataFileListView.as_view(), name='datafile_list'), - path('data-files/delete/', views.DataFileBulkDeleteView.as_view(), name='datafile_bulk_delete'), + path('data-files/', include(get_model_urls('core', 'datafile', detail=False))), path('data-files//', include(get_model_urls('core', 'datafile'))), - # Job results - path('jobs/', views.JobListView.as_view(), name='job_list'), - path('jobs/delete/', views.JobBulkDeleteView.as_view(), name='job_bulk_delete'), - path('jobs//', views.JobView.as_view(), name='job'), - path('jobs//delete/', views.JobDeleteView.as_view(), name='job_delete'), + path('jobs/', include(get_model_urls('core', 'job', detail=False))), + path('jobs//', include(get_model_urls('core', 'job'))), - # Change logging - path('changelog/', views.ObjectChangeListView.as_view(), name='objectchange_list'), + path('changelog/', include(get_model_urls('core', 'objectchange', detail=False))), path('changelog//', include(get_model_urls('core', 'objectchange'))), # Background Tasks @@ -40,17 +29,11 @@ urlpatterns = ( path('background-workers//', views.WorkerListView.as_view(), name='worker_list'), path('background-workers//', views.WorkerView.as_view(), name='worker'), - # Config revisions - path('config-revisions/', views.ConfigRevisionListView.as_view(), name='configrevision_list'), - path('config-revisions/add/', views.ConfigRevisionEditView.as_view(), name='configrevision_add'), - path('config-revisions/delete/', views.ConfigRevisionBulkDeleteView.as_view(), name='configrevision_bulk_delete'), - path('config-revisions//restore/', views.ConfigRevisionRestoreView.as_view(), name='configrevision_restore'), + path('config-revisions/', include(get_model_urls('core', 'configrevision', detail=False))), path('config-revisions//', include(get_model_urls('core', 'configrevision'))), - # System path('system/', views.SystemView.as_view(), name='system'), - # Plugins path('plugins/', views.PluginListView.as_view(), name='plugin_list'), path('plugins//', views.PluginView.as_view(), name='plugin'), ) diff --git a/netbox/core/views.py b/netbox/core/views.py index 3c5319626..96e57f97f 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -46,6 +46,7 @@ from .tables import CatalogPluginTable, PluginVersionTable # Data sources # +@register_model_view(DataSource, 'list', path='', detail=False) class DataSourceListView(generic.ObjectListView): queryset = DataSource.objects.annotate( file_count=count_related(DataFile, 'source') @@ -92,6 +93,7 @@ class DataSourceSyncView(BaseObjectView): return redirect(datasource.get_absolute_url()) +@register_model_view(DataSource, 'add', detail=False) @register_model_view(DataSource, 'edit') class DataSourceEditView(generic.ObjectEditView): queryset = DataSource.objects.all() @@ -103,11 +105,13 @@ class DataSourceDeleteView(generic.ObjectDeleteView): queryset = DataSource.objects.all() +@register_model_view(DataSource, 'import', detail=False) class DataSourceBulkImportView(generic.BulkImportView): queryset = DataSource.objects.all() model_form = forms.DataSourceImportForm +@register_model_view(DataSource, 'bulk_edit', path='edit', detail=False) class DataSourceBulkEditView(generic.BulkEditView): queryset = DataSource.objects.annotate( count_files=count_related(DataFile, 'source') @@ -117,6 +121,7 @@ class DataSourceBulkEditView(generic.BulkEditView): form = forms.DataSourceBulkEditForm +@register_model_view(DataSource, 'bulk_delete', path='delete', detail=False) class DataSourceBulkDeleteView(generic.BulkDeleteView): queryset = DataSource.objects.annotate( count_files=count_related(DataFile, 'source') @@ -129,6 +134,7 @@ class DataSourceBulkDeleteView(generic.BulkDeleteView): # Data files # +@register_model_view(DataFile, 'list', path='', detail=False) class DataFileListView(generic.ObjectListView): queryset = DataFile.objects.defer('data') filterset = filtersets.DataFileFilterSet @@ -149,6 +155,7 @@ class DataFileDeleteView(generic.ObjectDeleteView): queryset = DataFile.objects.all() +@register_model_view(DataFile, 'bulk_delete', path='delete', detail=False) class DataFileBulkDeleteView(generic.BulkDeleteView): queryset = DataFile.objects.defer('data') filterset = filtersets.DataFileFilterSet @@ -159,6 +166,7 @@ class DataFileBulkDeleteView(generic.BulkDeleteView): # Jobs # +@register_model_view(Job, 'list', path='', detail=False) class JobListView(generic.ObjectListView): queryset = Job.objects.all() filterset = filtersets.JobFilterSet @@ -170,14 +178,17 @@ class JobListView(generic.ObjectListView): } +@register_model_view(Job) class JobView(generic.ObjectView): queryset = Job.objects.all() +@register_model_view(Job, 'delete') class JobDeleteView(generic.ObjectDeleteView): queryset = Job.objects.all() +@register_model_view(Job, 'bulk_delete', path='delete', detail=False) class JobBulkDeleteView(generic.BulkDeleteView): queryset = Job.objects.all() filterset = filtersets.JobFilterSet @@ -188,6 +199,7 @@ class JobBulkDeleteView(generic.BulkDeleteView): # Change logging # +@register_model_view(ObjectChange, 'list', path='', detail=False) class ObjectChangeListView(generic.ObjectListView): queryset = ObjectChange.objects.valid_models() filterset = filtersets.ObjectChangeFilterSet @@ -257,6 +269,7 @@ class ObjectChangeView(generic.ObjectView): # Config Revisions # +@register_model_view(ConfigRevision, 'list', path='', detail=False) class ConfigRevisionListView(generic.ObjectListView): queryset = ConfigRevision.objects.all() filterset = filtersets.ConfigRevisionFilterSet @@ -269,6 +282,7 @@ class ConfigRevisionView(generic.ObjectView): queryset = ConfigRevision.objects.all() +@register_model_view(ConfigRevision, 'add', detail=False) class ConfigRevisionEditView(generic.ObjectEditView): queryset = ConfigRevision.objects.all() form = forms.ConfigRevisionForm @@ -279,12 +293,14 @@ class ConfigRevisionDeleteView(generic.ObjectDeleteView): queryset = ConfigRevision.objects.all() +@register_model_view(ConfigRevision, 'bulk_delete', path='delete', detail=False) class ConfigRevisionBulkDeleteView(generic.BulkDeleteView): queryset = ConfigRevision.objects.all() filterset = filtersets.ConfigRevisionFilterSet table = tables.ConfigRevisionTable +@register_model_view(ConfigRevision, 'restore') class ConfigRevisionRestoreView(ContentTypePermissionRequiredMixin, View): def get_required_permission(self): diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index 1a6a2f77d..bcfd32707 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -6,335 +6,144 @@ from . import views app_name = 'dcim' urlpatterns = [ - # Regions - path('regions/', views.RegionListView.as_view(), name='region_list'), - path('regions/add/', views.RegionEditView.as_view(), name='region_add'), - path('regions/import/', views.RegionBulkImportView.as_view(), name='region_import'), - path('regions/edit/', views.RegionBulkEditView.as_view(), name='region_bulk_edit'), - path('regions/delete/', views.RegionBulkDeleteView.as_view(), name='region_bulk_delete'), + path('regions/', include(get_model_urls('dcim', 'region', detail=False))), path('regions//', include(get_model_urls('dcim', 'region'))), - # Site groups - path('site-groups/', views.SiteGroupListView.as_view(), name='sitegroup_list'), - path('site-groups/add/', views.SiteGroupEditView.as_view(), name='sitegroup_add'), - path('site-groups/import/', views.SiteGroupBulkImportView.as_view(), name='sitegroup_import'), - path('site-groups/edit/', views.SiteGroupBulkEditView.as_view(), name='sitegroup_bulk_edit'), - path('site-groups/delete/', views.SiteGroupBulkDeleteView.as_view(), name='sitegroup_bulk_delete'), + path('site-groups/', include(get_model_urls('dcim', 'sitegroup', detail=False))), path('site-groups//', include(get_model_urls('dcim', 'sitegroup'))), - # Sites - path('sites/', views.SiteListView.as_view(), name='site_list'), - path('sites/add/', views.SiteEditView.as_view(), name='site_add'), - path('sites/import/', views.SiteBulkImportView.as_view(), name='site_import'), - path('sites/edit/', views.SiteBulkEditView.as_view(), name='site_bulk_edit'), - path('sites/delete/', views.SiteBulkDeleteView.as_view(), name='site_bulk_delete'), + path('sites/', include(get_model_urls('dcim', 'site', detail=False))), path('sites//', include(get_model_urls('dcim', 'site'))), - # Locations - path('locations/', views.LocationListView.as_view(), name='location_list'), - path('locations/add/', views.LocationEditView.as_view(), name='location_add'), - path('locations/import/', views.LocationBulkImportView.as_view(), name='location_import'), - path('locations/edit/', views.LocationBulkEditView.as_view(), name='location_bulk_edit'), - path('locations/delete/', views.LocationBulkDeleteView.as_view(), name='location_bulk_delete'), + path('locations/', include(get_model_urls('dcim', 'location', detail=False))), path('locations//', include(get_model_urls('dcim', 'location'))), - # Rack roles - path('rack-roles/', views.RackRoleListView.as_view(), name='rackrole_list'), - path('rack-roles/add/', views.RackRoleEditView.as_view(), name='rackrole_add'), - path('rack-roles/import/', views.RackRoleBulkImportView.as_view(), name='rackrole_import'), - path('rack-roles/edit/', views.RackRoleBulkEditView.as_view(), name='rackrole_bulk_edit'), - path('rack-roles/delete/', views.RackRoleBulkDeleteView.as_view(), name='rackrole_bulk_delete'), + path('rack-roles/', include(get_model_urls('dcim', 'rackrole', detail=False))), path('rack-roles//', include(get_model_urls('dcim', 'rackrole'))), - # Rack reservations - path('rack-reservations/', views.RackReservationListView.as_view(), name='rackreservation_list'), - path('rack-reservations/add/', views.RackReservationEditView.as_view(), name='rackreservation_add'), - path('rack-reservations/import/', views.RackReservationImportView.as_view(), name='rackreservation_import'), - path('rack-reservations/edit/', views.RackReservationBulkEditView.as_view(), name='rackreservation_bulk_edit'), - path('rack-reservations/delete/', views.RackReservationBulkDeleteView.as_view(), name='rackreservation_bulk_delete'), + path('rack-reservations/', include(get_model_urls('dcim', 'rackreservation', detail=False))), path('rack-reservations//', include(get_model_urls('dcim', 'rackreservation'))), - # Racks - path('racks/', views.RackListView.as_view(), name='rack_list'), - path('rack-elevations/', views.RackElevationListView.as_view(), name='rack_elevation_list'), - path('racks/add/', views.RackEditView.as_view(), name='rack_add'), - path('racks/import/', views.RackBulkImportView.as_view(), name='rack_import'), - path('racks/edit/', views.RackBulkEditView.as_view(), name='rack_bulk_edit'), - path('racks/delete/', views.RackBulkDeleteView.as_view(), name='rack_bulk_delete'), + path('racks/', include(get_model_urls('dcim', 'rack', detail=False))), path('racks//', include(get_model_urls('dcim', 'rack'))), + path('rack-elevations/', views.RackElevationListView.as_view(), name='rack_elevation_list'), - # Rack Types - path('rack-types/', views.RackTypeListView.as_view(), name='racktype_list'), - path('rack-types/add/', views.RackTypeEditView.as_view(), name='racktype_add'), - path('rack-types/import/', views.RackTypeBulkImportView.as_view(), name='racktype_import'), - path('rack-types/edit/', views.RackTypeBulkEditView.as_view(), name='racktype_bulk_edit'), - path('rack-types/delete/', views.RackTypeBulkDeleteView.as_view(), name='racktype_bulk_delete'), + path('rack-types/', include(get_model_urls('dcim', 'racktype', detail=False))), path('rack-types//', include(get_model_urls('dcim', 'racktype'))), - # Manufacturers - path('manufacturers/', views.ManufacturerListView.as_view(), name='manufacturer_list'), - path('manufacturers/add/', views.ManufacturerEditView.as_view(), name='manufacturer_add'), - path('manufacturers/import/', views.ManufacturerBulkImportView.as_view(), name='manufacturer_import'), - path('manufacturers/edit/', views.ManufacturerBulkEditView.as_view(), name='manufacturer_bulk_edit'), - path('manufacturers/delete/', views.ManufacturerBulkDeleteView.as_view(), name='manufacturer_bulk_delete'), + path('manufacturers/', include(get_model_urls('dcim', 'manufacturer', detail=False))), path('manufacturers//', include(get_model_urls('dcim', 'manufacturer'))), - # Device types - path('device-types/', views.DeviceTypeListView.as_view(), name='devicetype_list'), - path('device-types/add/', views.DeviceTypeEditView.as_view(), name='devicetype_add'), - path('device-types/import/', views.DeviceTypeImportView.as_view(), name='devicetype_import'), - path('device-types/edit/', views.DeviceTypeBulkEditView.as_view(), name='devicetype_bulk_edit'), - path('device-types/delete/', views.DeviceTypeBulkDeleteView.as_view(), name='devicetype_bulk_delete'), + path('device-types/', include(get_model_urls('dcim', 'devicetype', detail=False))), path('device-types//', include(get_model_urls('dcim', 'devicetype'))), - # Module types - path('module-types/', views.ModuleTypeListView.as_view(), name='moduletype_list'), - path('module-types/add/', views.ModuleTypeEditView.as_view(), name='moduletype_add'), - path('module-types/import/', views.ModuleTypeImportView.as_view(), name='moduletype_import'), - path('module-types/edit/', views.ModuleTypeBulkEditView.as_view(), name='moduletype_bulk_edit'), - path('module-types/delete/', views.ModuleTypeBulkDeleteView.as_view(), name='moduletype_bulk_delete'), + path('module-types/', include(get_model_urls('dcim', 'moduletype', detail=False))), path('module-types//', include(get_model_urls('dcim', 'moduletype'))), - # Console port templates - path('console-port-templates/add/', views.ConsolePortTemplateCreateView.as_view(), name='consoleporttemplate_add'), - path('console-port-templates/edit/', views.ConsolePortTemplateBulkEditView.as_view(), name='consoleporttemplate_bulk_edit'), - path('console-port-templates/rename/', views.ConsolePortTemplateBulkRenameView.as_view(), name='consoleporttemplate_bulk_rename'), - path('console-port-templates/delete/', views.ConsolePortTemplateBulkDeleteView.as_view(), name='consoleporttemplate_bulk_delete'), + path('console-port-templates/', include(get_model_urls('dcim', 'consoleporttemplate', detail=False))), path('console-port-templates//', include(get_model_urls('dcim', 'consoleporttemplate'))), - # Console server port templates - path('console-server-port-templates/add/', views.ConsoleServerPortTemplateCreateView.as_view(), name='consoleserverporttemplate_add'), - path('console-server-port-templates/edit/', views.ConsoleServerPortTemplateBulkEditView.as_view(), name='consoleserverporttemplate_bulk_edit'), - path('console-server-port-templates/rename/', views.ConsoleServerPortTemplateBulkRenameView.as_view(), name='consoleserverporttemplate_bulk_rename'), - path('console-server-port-templates/delete/', views.ConsoleServerPortTemplateBulkDeleteView.as_view(), name='consoleserverporttemplate_bulk_delete'), + path('console-server-port-templates/', include(get_model_urls('dcim', 'consoleserverporttemplate', detail=False))), path('console-server-port-templates//', include(get_model_urls('dcim', 'consoleserverporttemplate'))), - # Power port templates - path('power-port-templates/add/', views.PowerPortTemplateCreateView.as_view(), name='powerporttemplate_add'), - path('power-port-templates/edit/', views.PowerPortTemplateBulkEditView.as_view(), name='powerporttemplate_bulk_edit'), - path('power-port-templates/rename/', views.PowerPortTemplateBulkRenameView.as_view(), name='powerporttemplate_bulk_rename'), - path('power-port-templates/delete/', views.PowerPortTemplateBulkDeleteView.as_view(), name='powerporttemplate_bulk_delete'), + path('power-port-templates/', include(get_model_urls('dcim', 'powerporttemplate', detail=False))), path('power-port-templates//', include(get_model_urls('dcim', 'powerporttemplate'))), - # Power outlet templates - path('power-outlet-templates/add/', views.PowerOutletTemplateCreateView.as_view(), name='poweroutlettemplate_add'), - path('power-outlet-templates/edit/', views.PowerOutletTemplateBulkEditView.as_view(), name='poweroutlettemplate_bulk_edit'), - path('power-outlet-templates/rename/', views.PowerOutletTemplateBulkRenameView.as_view(), name='poweroutlettemplate_bulk_rename'), - path('power-outlet-templates/delete/', views.PowerOutletTemplateBulkDeleteView.as_view(), name='poweroutlettemplate_bulk_delete'), + path('power-outlet-templates/', include(get_model_urls('dcim', 'poweroutlettemplate', detail=False))), path('power-outlet-templates//', include(get_model_urls('dcim', 'poweroutlettemplate'))), - # Interface templates - path('interface-templates/add/', views.InterfaceTemplateCreateView.as_view(), name='interfacetemplate_add'), - path('interface-templates/edit/', views.InterfaceTemplateBulkEditView.as_view(), name='interfacetemplate_bulk_edit'), - path('interface-templates/rename/', views.InterfaceTemplateBulkRenameView.as_view(), name='interfacetemplate_bulk_rename'), - path('interface-templates/delete/', views.InterfaceTemplateBulkDeleteView.as_view(), name='interfacetemplate_bulk_delete'), + path('interface-templates/', include(get_model_urls('dcim', 'interfacetemplate', detail=False))), path('interface-templates//', include(get_model_urls('dcim', 'interfacetemplate'))), - # Front port templates - path('front-port-templates/add/', views.FrontPortTemplateCreateView.as_view(), name='frontporttemplate_add'), - path('front-port-templates/edit/', views.FrontPortTemplateBulkEditView.as_view(), name='frontporttemplate_bulk_edit'), - path('front-port-templates/rename/', views.FrontPortTemplateBulkRenameView.as_view(), name='frontporttemplate_bulk_rename'), - path('front-port-templates/delete/', views.FrontPortTemplateBulkDeleteView.as_view(), name='frontporttemplate_bulk_delete'), + path('front-port-templates/', include(get_model_urls('dcim', 'frontporttemplate', detail=False))), path('front-port-templates//', include(get_model_urls('dcim', 'frontporttemplate'))), - # Rear port templates - path('rear-port-templates/add/', views.RearPortTemplateCreateView.as_view(), name='rearporttemplate_add'), - path('rear-port-templates/edit/', views.RearPortTemplateBulkEditView.as_view(), name='rearporttemplate_bulk_edit'), - path('rear-port-templates/rename/', views.RearPortTemplateBulkRenameView.as_view(), name='rearporttemplate_bulk_rename'), - path('rear-port-templates/delete/', views.RearPortTemplateBulkDeleteView.as_view(), name='rearporttemplate_bulk_delete'), + path('rear-port-templates/', include(get_model_urls('dcim', 'rearporttemplate', detail=False))), path('rear-port-templates//', include(get_model_urls('dcim', 'rearporttemplate'))), - # Device bay templates - path('device-bay-templates/add/', views.DeviceBayTemplateCreateView.as_view(), name='devicebaytemplate_add'), - path('device-bay-templates/edit/', views.DeviceBayTemplateBulkEditView.as_view(), name='devicebaytemplate_bulk_edit'), - path('device-bay-templates/rename/', views.DeviceBayTemplateBulkRenameView.as_view(), name='devicebaytemplate_bulk_rename'), - path('device-bay-templates/delete/', views.DeviceBayTemplateBulkDeleteView.as_view(), name='devicebaytemplate_bulk_delete'), + path('device-bay-templates/', include(get_model_urls('dcim', 'devicebaytemplate', detail=False))), path('device-bay-templates//', include(get_model_urls('dcim', 'devicebaytemplate'))), - # Module bay templates - path('module-bay-templates/add/', views.ModuleBayTemplateCreateView.as_view(), name='modulebaytemplate_add'), - path('module-bay-templates/edit/', views.ModuleBayTemplateBulkEditView.as_view(), name='modulebaytemplate_bulk_edit'), - path('module-bay-templates/rename/', views.ModuleBayTemplateBulkRenameView.as_view(), name='modulebaytemplate_bulk_rename'), - path('module-bay-templates/delete/', views.ModuleBayTemplateBulkDeleteView.as_view(), name='modulebaytemplate_bulk_delete'), + path('module-bay-templates/', include(get_model_urls('dcim', 'modulebaytemplate', detail=False))), path('module-bay-templates//', include(get_model_urls('dcim', 'modulebaytemplate'))), - # Inventory item templates - path('inventory-item-templates/add/', views.InventoryItemTemplateCreateView.as_view(), name='inventoryitemtemplate_add'), - path('inventory-item-templates/edit/', views.InventoryItemTemplateBulkEditView.as_view(), name='inventoryitemtemplate_bulk_edit'), - path('inventory-item-templates/rename/', views.InventoryItemTemplateBulkRenameView.as_view(), name='inventoryitemtemplate_bulk_rename'), - path('inventory-item-templates/delete/', views.InventoryItemTemplateBulkDeleteView.as_view(), name='inventoryitemtemplate_bulk_delete'), + path('inventory-item-templates/', include(get_model_urls('dcim', 'inventoryitemtemplate', detail=False))), path('inventory-item-templates//', include(get_model_urls('dcim', 'inventoryitemtemplate'))), - # Device roles - path('device-roles/', views.DeviceRoleListView.as_view(), name='devicerole_list'), - path('device-roles/add/', views.DeviceRoleEditView.as_view(), name='devicerole_add'), - path('device-roles/import/', views.DeviceRoleBulkImportView.as_view(), name='devicerole_import'), - path('device-roles/edit/', views.DeviceRoleBulkEditView.as_view(), name='devicerole_bulk_edit'), - path('device-roles/delete/', views.DeviceRoleBulkDeleteView.as_view(), name='devicerole_bulk_delete'), + path('device-roles/', include(get_model_urls('dcim', 'devicerole', detail=False))), path('device-roles//', include(get_model_urls('dcim', 'devicerole'))), - # Platforms - path('platforms/', views.PlatformListView.as_view(), name='platform_list'), - path('platforms/add/', views.PlatformEditView.as_view(), name='platform_add'), - path('platforms/import/', views.PlatformBulkImportView.as_view(), name='platform_import'), - path('platforms/edit/', views.PlatformBulkEditView.as_view(), name='platform_bulk_edit'), - path('platforms/delete/', views.PlatformBulkDeleteView.as_view(), name='platform_bulk_delete'), + path('platforms/', include(get_model_urls('dcim', 'platform', detail=False))), path('platforms//', include(get_model_urls('dcim', 'platform'))), - # Devices - path('devices/', views.DeviceListView.as_view(), name='device_list'), - path('devices/add/', views.DeviceEditView.as_view(), name='device_add'), - path('devices/import/', views.DeviceBulkImportView.as_view(), name='device_import'), - path('devices/edit/', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'), - path('devices/rename/', views.DeviceBulkRenameView.as_view(), name='device_bulk_rename'), - path('devices/delete/', views.DeviceBulkDeleteView.as_view(), name='device_bulk_delete'), + path('devices/', include(get_model_urls('dcim', 'device', detail=False))), path('devices//', include(get_model_urls('dcim', 'device'))), - # Virtual Device Context - path('virtual-device-contexts/', views.VirtualDeviceContextListView.as_view(), name='virtualdevicecontext_list'), - path('virtual-device-contexts/add/', views.VirtualDeviceContextEditView.as_view(), name='virtualdevicecontext_add'), - path('virtual-device-contexts/import/', views.VirtualDeviceContextBulkImportView.as_view(), name='virtualdevicecontext_import'), - path('virtual-device-contexts/edit/', views.VirtualDeviceContextBulkEditView.as_view(), name='virtualdevicecontext_bulk_edit'), - path('virtual-device-contexts/delete/', views.VirtualDeviceContextBulkDeleteView.as_view(), name='virtualdevicecontext_bulk_delete'), + path('virtual-device-contexts/', include(get_model_urls('dcim', 'virtualdevicecontext', detail=False))), path('virtual-device-contexts//', include(get_model_urls('dcim', 'virtualdevicecontext'))), - # Modules - path('modules/', views.ModuleListView.as_view(), name='module_list'), - path('modules/add/', views.ModuleEditView.as_view(), name='module_add'), - path('modules/import/', views.ModuleBulkImportView.as_view(), name='module_import'), - path('modules/edit/', views.ModuleBulkEditView.as_view(), name='module_bulk_edit'), - path('modules/delete/', views.ModuleBulkDeleteView.as_view(), name='module_bulk_delete'), + path('modules/', include(get_model_urls('dcim', 'module', detail=False))), path('modules//', include(get_model_urls('dcim', 'module'))), - # Console ports - path('console-ports/', views.ConsolePortListView.as_view(), name='consoleport_list'), - path('console-ports/add/', views.ConsolePortCreateView.as_view(), name='consoleport_add'), - path('console-ports/import/', views.ConsolePortBulkImportView.as_view(), name='consoleport_import'), - path('console-ports/edit/', views.ConsolePortBulkEditView.as_view(), name='consoleport_bulk_edit'), - path('console-ports/rename/', views.ConsolePortBulkRenameView.as_view(), name='consoleport_bulk_rename'), - path('console-ports/disconnect/', views.ConsolePortBulkDisconnectView.as_view(), name='consoleport_bulk_disconnect'), - path('console-ports/delete/', views.ConsolePortBulkDeleteView.as_view(), name='consoleport_bulk_delete'), + path('console-ports/', include(get_model_urls('dcim', 'consoleport', detail=False))), path('console-ports//', include(get_model_urls('dcim', 'consoleport'))), - path('devices/console-ports/add/', views.DeviceBulkAddConsolePortView.as_view(), name='device_bulk_add_consoleport'), + path( + 'devices/console-ports/add/', + views.DeviceBulkAddConsolePortView.as_view(), + name='device_bulk_add_consoleport' + ), - # Console server ports - path('console-server-ports/', views.ConsoleServerPortListView.as_view(), name='consoleserverport_list'), - path('console-server-ports/add/', views.ConsoleServerPortCreateView.as_view(), name='consoleserverport_add'), - path('console-server-ports/import/', views.ConsoleServerPortBulkImportView.as_view(), name='consoleserverport_import'), - path('console-server-ports/edit/', views.ConsoleServerPortBulkEditView.as_view(), name='consoleserverport_bulk_edit'), - path('console-server-ports/rename/', views.ConsoleServerPortBulkRenameView.as_view(), name='consoleserverport_bulk_rename'), - path('console-server-ports/disconnect/', views.ConsoleServerPortBulkDisconnectView.as_view(), name='consoleserverport_bulk_disconnect'), - path('console-server-ports/delete/', views.ConsoleServerPortBulkDeleteView.as_view(), name='consoleserverport_bulk_delete'), + path('console-server-ports/', include(get_model_urls('dcim', 'consoleserverport', detail=False))), path('console-server-ports//', include(get_model_urls('dcim', 'consoleserverport'))), - path('devices/console-server-ports/add/', views.DeviceBulkAddConsoleServerPortView.as_view(), name='device_bulk_add_consoleserverport'), + path( + 'devices/console-server-ports/add/', + views.DeviceBulkAddConsoleServerPortView.as_view(), + name='device_bulk_add_consoleserverport' + ), - # Power ports - path('power-ports/', views.PowerPortListView.as_view(), name='powerport_list'), - path('power-ports/add/', views.PowerPortCreateView.as_view(), name='powerport_add'), - path('power-ports/import/', views.PowerPortBulkImportView.as_view(), name='powerport_import'), - path('power-ports/edit/', views.PowerPortBulkEditView.as_view(), name='powerport_bulk_edit'), - path('power-ports/rename/', views.PowerPortBulkRenameView.as_view(), name='powerport_bulk_rename'), - path('power-ports/disconnect/', views.PowerPortBulkDisconnectView.as_view(), name='powerport_bulk_disconnect'), - path('power-ports/delete/', views.PowerPortBulkDeleteView.as_view(), name='powerport_bulk_delete'), + path('power-ports/', include(get_model_urls('dcim', 'powerport', detail=False))), path('power-ports//', include(get_model_urls('dcim', 'powerport'))), path('devices/power-ports/add/', views.DeviceBulkAddPowerPortView.as_view(), name='device_bulk_add_powerport'), - # Power outlets - path('power-outlets/', views.PowerOutletListView.as_view(), name='poweroutlet_list'), - path('power-outlets/add/', views.PowerOutletCreateView.as_view(), name='poweroutlet_add'), - path('power-outlets/import/', views.PowerOutletBulkImportView.as_view(), name='poweroutlet_import'), - path('power-outlets/edit/', views.PowerOutletBulkEditView.as_view(), name='poweroutlet_bulk_edit'), - path('power-outlets/rename/', views.PowerOutletBulkRenameView.as_view(), name='poweroutlet_bulk_rename'), - path('power-outlets/disconnect/', views.PowerOutletBulkDisconnectView.as_view(), name='poweroutlet_bulk_disconnect'), - path('power-outlets/delete/', views.PowerOutletBulkDeleteView.as_view(), name='poweroutlet_bulk_delete'), + path('power-outlets/', include(get_model_urls('dcim', 'poweroutlet', detail=False))), path('power-outlets//', include(get_model_urls('dcim', 'poweroutlet'))), - path('devices/power-outlets/add/', views.DeviceBulkAddPowerOutletView.as_view(), name='device_bulk_add_poweroutlet'), + path( + 'devices/power-outlets/add/', + views.DeviceBulkAddPowerOutletView.as_view(), + name='device_bulk_add_poweroutlet' + ), - # MAC addresses - path('mac-addresses/', views.MACAddressListView.as_view(), name='macaddress_list'), - path('mac-addresses/add/', views.MACAddressEditView.as_view(), name='macaddress_add'), - path('mac-addresses/import/', views.MACAddressBulkImportView.as_view(), name='macaddress_import'), - path('mac-addresses/edit/', views.MACAddressBulkEditView.as_view(), name='macaddress_bulk_edit'), - path('mac-addresses/delete/', views.MACAddressBulkDeleteView.as_view(), name='macaddress_bulk_delete'), - path('mac-addresses//', include(get_model_urls('dcim', 'macaddress'))), - - # Interfaces - path('interfaces/', views.InterfaceListView.as_view(), name='interface_list'), - path('interfaces/add/', views.InterfaceCreateView.as_view(), name='interface_add'), - path('interfaces/import/', views.InterfaceBulkImportView.as_view(), name='interface_import'), - path('interfaces/edit/', views.InterfaceBulkEditView.as_view(), name='interface_bulk_edit'), - path('interfaces/rename/', views.InterfaceBulkRenameView.as_view(), name='interface_bulk_rename'), - path('interfaces/disconnect/', views.InterfaceBulkDisconnectView.as_view(), name='interface_bulk_disconnect'), - path('interfaces/delete/', views.InterfaceBulkDeleteView.as_view(), name='interface_bulk_delete'), + path('interfaces/', include(get_model_urls('dcim', 'interface', detail=False))), path('interfaces//', include(get_model_urls('dcim', 'interface'))), path('devices/interfaces/add/', views.DeviceBulkAddInterfaceView.as_view(), name='device_bulk_add_interface'), - # Front ports - path('front-ports/', views.FrontPortListView.as_view(), name='frontport_list'), - path('front-ports/add/', views.FrontPortCreateView.as_view(), name='frontport_add'), - path('front-ports/import/', views.FrontPortBulkImportView.as_view(), name='frontport_import'), - path('front-ports/edit/', views.FrontPortBulkEditView.as_view(), name='frontport_bulk_edit'), - path('front-ports/rename/', views.FrontPortBulkRenameView.as_view(), name='frontport_bulk_rename'), - path('front-ports/disconnect/', views.FrontPortBulkDisconnectView.as_view(), name='frontport_bulk_disconnect'), - path('front-ports/delete/', views.FrontPortBulkDeleteView.as_view(), name='frontport_bulk_delete'), + path('front-ports/', include(get_model_urls('dcim', 'frontport', detail=False))), path('front-ports//', include(get_model_urls('dcim', 'frontport'))), - # path('devices/front-ports/add/', views.DeviceBulkAddFrontPortView.as_view(), name='device_bulk_add_frontport'), - # Rear ports - path('rear-ports/', views.RearPortListView.as_view(), name='rearport_list'), - path('rear-ports/add/', views.RearPortCreateView.as_view(), name='rearport_add'), - path('rear-ports/import/', views.RearPortBulkImportView.as_view(), name='rearport_import'), - path('rear-ports/edit/', views.RearPortBulkEditView.as_view(), name='rearport_bulk_edit'), - path('rear-ports/rename/', views.RearPortBulkRenameView.as_view(), name='rearport_bulk_rename'), - path('rear-ports/disconnect/', views.RearPortBulkDisconnectView.as_view(), name='rearport_bulk_disconnect'), - path('rear-ports/delete/', views.RearPortBulkDeleteView.as_view(), name='rearport_bulk_delete'), + path('rear-ports/', include(get_model_urls('dcim', 'rearport', detail=False))), path('rear-ports//', include(get_model_urls('dcim', 'rearport'))), path('devices/rear-ports/add/', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'), - # Module bays - path('module-bays/', views.ModuleBayListView.as_view(), name='modulebay_list'), - path('module-bays/add/', views.ModuleBayCreateView.as_view(), name='modulebay_add'), - path('module-bays/import/', views.ModuleBayBulkImportView.as_view(), name='modulebay_import'), - path('module-bays/edit/', views.ModuleBayBulkEditView.as_view(), name='modulebay_bulk_edit'), - path('module-bays/rename/', views.ModuleBayBulkRenameView.as_view(), name='modulebay_bulk_rename'), - path('module-bays/delete/', views.ModuleBayBulkDeleteView.as_view(), name='modulebay_bulk_delete'), + path('module-bays/', include(get_model_urls('dcim', 'modulebay', detail=False))), path('module-bays//', include(get_model_urls('dcim', 'modulebay'))), path('devices/module-bays/add/', views.DeviceBulkAddModuleBayView.as_view(), name='device_bulk_add_modulebay'), - # Device bays - path('device-bays/', views.DeviceBayListView.as_view(), name='devicebay_list'), - path('device-bays/add/', views.DeviceBayCreateView.as_view(), name='devicebay_add'), - path('device-bays/import/', views.DeviceBayBulkImportView.as_view(), name='devicebay_import'), - path('device-bays/edit/', views.DeviceBayBulkEditView.as_view(), name='devicebay_bulk_edit'), - path('device-bays/rename/', views.DeviceBayBulkRenameView.as_view(), name='devicebay_bulk_rename'), - path('device-bays/delete/', views.DeviceBayBulkDeleteView.as_view(), name='devicebay_bulk_delete'), + path('device-bays/', include(get_model_urls('dcim', 'devicebay', detail=False))), path('device-bays//', include(get_model_urls('dcim', 'devicebay'))), path('devices/device-bays/add/', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'), - # Inventory items - path('inventory-items/', views.InventoryItemListView.as_view(), name='inventoryitem_list'), - path('inventory-items/add/', views.InventoryItemCreateView.as_view(), name='inventoryitem_add'), - path('inventory-items/import/', views.InventoryItemBulkImportView.as_view(), name='inventoryitem_import'), - path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'), - path('inventory-items/rename/', views.InventoryItemBulkRenameView.as_view(), name='inventoryitem_bulk_rename'), - path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'), + path('inventory-items/', include(get_model_urls('dcim', 'inventoryitem', detail=False))), path('inventory-items//', include(get_model_urls('dcim', 'inventoryitem'))), - path('devices/inventory-items/add/', views.DeviceBulkAddInventoryItemView.as_view(), name='device_bulk_add_inventoryitem'), + path( + 'devices/inventory-items/add/', + views.DeviceBulkAddInventoryItemView.as_view(), + name='device_bulk_add_inventoryitem' + ), - # Inventory item roles - path('inventory-item-roles/', views.InventoryItemRoleListView.as_view(), name='inventoryitemrole_list'), - path('inventory-item-roles/add/', views.InventoryItemRoleEditView.as_view(), name='inventoryitemrole_add'), - path('inventory-item-roles/import/', views.InventoryItemRoleBulkImportView.as_view(), name='inventoryitemrole_import'), - path('inventory-item-roles/edit/', views.InventoryItemRoleBulkEditView.as_view(), name='inventoryitemrole_bulk_edit'), - path('inventory-item-roles/delete/', views.InventoryItemRoleBulkDeleteView.as_view(), name='inventoryitemrole_bulk_delete'), + path('inventory-item-roles/', include(get_model_urls('dcim', 'inventoryitemrole', detail=False))), path('inventory-item-roles//', include(get_model_urls('dcim', 'inventoryitemrole'))), - # Cables - path('cables/', views.CableListView.as_view(), name='cable_list'), - path('cables/add/', views.CableEditView.as_view(), name='cable_add'), - path('cables/import/', views.CableBulkImportView.as_view(), name='cable_import'), - path('cables/edit/', views.CableBulkEditView.as_view(), name='cable_bulk_edit'), - path('cables/delete/', views.CableBulkDeleteView.as_view(), name='cable_bulk_delete'), + path('cables/', include(get_model_urls('dcim', 'cable', detail=False))), path('cables//', include(get_model_urls('dcim', 'cable'))), # Console/power/interface connections (read-only) @@ -342,30 +151,21 @@ urlpatterns = [ path('power-connections/', views.PowerConnectionsListView.as_view(), name='power_connections_list'), path('interface-connections/', views.InterfaceConnectionsListView.as_view(), name='interface_connections_list'), - # Virtual chassis - path('virtual-chassis/', views.VirtualChassisListView.as_view(), name='virtualchassis_list'), - path('virtual-chassis/add/', views.VirtualChassisCreateView.as_view(), name='virtualchassis_add'), - path('virtual-chassis/import/', views.VirtualChassisBulkImportView.as_view(), name='virtualchassis_import'), - path('virtual-chassis/edit/', views.VirtualChassisBulkEditView.as_view(), name='virtualchassis_bulk_edit'), - path('virtual-chassis/delete/', views.VirtualChassisBulkDeleteView.as_view(), name='virtualchassis_bulk_delete'), + path('virtual-chassis/', include(get_model_urls('dcim', 'virtualchassis', detail=False))), path('virtual-chassis//', include(get_model_urls('dcim', 'virtualchassis'))), - path('virtual-chassis-members//delete/', views.VirtualChassisRemoveMemberView.as_view(), name='virtualchassis_remove_member'), + path( + 'virtual-chassis-members//delete/', + views.VirtualChassisRemoveMemberView.as_view(), + name='virtualchassis_remove_member' + ), - # Power panels - path('power-panels/', views.PowerPanelListView.as_view(), name='powerpanel_list'), - path('power-panels/add/', views.PowerPanelEditView.as_view(), name='powerpanel_add'), - path('power-panels/import/', views.PowerPanelBulkImportView.as_view(), name='powerpanel_import'), - path('power-panels/edit/', views.PowerPanelBulkEditView.as_view(), name='powerpanel_bulk_edit'), - path('power-panels/delete/', views.PowerPanelBulkDeleteView.as_view(), name='powerpanel_bulk_delete'), + path('power-panels/', include(get_model_urls('dcim', 'powerpanel', detail=False))), path('power-panels//', include(get_model_urls('dcim', 'powerpanel'))), - # Power feeds - path('power-feeds/', views.PowerFeedListView.as_view(), name='powerfeed_list'), - path('power-feeds/add/', views.PowerFeedEditView.as_view(), name='powerfeed_add'), - path('power-feeds/import/', views.PowerFeedBulkImportView.as_view(), name='powerfeed_import'), - path('power-feeds/edit/', views.PowerFeedBulkEditView.as_view(), name='powerfeed_bulk_edit'), - path('power-feeds/disconnect/', views.PowerFeedBulkDisconnectView.as_view(), name='powerfeed_bulk_disconnect'), - path('power-feeds/delete/', views.PowerFeedBulkDeleteView.as_view(), name='powerfeed_bulk_delete'), + path('power-feeds/', include(get_model_urls('dcim', 'powerfeed', detail=False))), path('power-feeds//', include(get_model_urls('dcim', 'powerfeed'))), + path('mac-addresses/', include(get_model_urls('dcim', 'macaddress', detail=False))), + path('mac-addresses//', include(get_model_urls('dcim', 'macaddress'))), + ] diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 4bd0ea877..fa9fb667f 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -215,6 +215,7 @@ class PathTraceView(generic.ObjectView): # Regions # +@register_model_view(Region, 'list', path='', detail=False) class RegionListView(generic.ObjectListView): queryset = Region.objects.add_related_count( Region.objects.all(), @@ -251,6 +252,7 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Region, 'add', detail=False) @register_model_view(Region, 'edit') class RegionEditView(generic.ObjectEditView): queryset = Region.objects.all() @@ -262,11 +264,13 @@ class RegionDeleteView(generic.ObjectDeleteView): queryset = Region.objects.all() +@register_model_view(Region, 'import', detail=False) class RegionBulkImportView(generic.BulkImportView): queryset = Region.objects.all() model_form = forms.RegionImportForm +@register_model_view(Region, 'bulk_edit', path='edit', detail=False) class RegionBulkEditView(generic.BulkEditView): queryset = Region.objects.add_related_count( Region.objects.all(), @@ -280,6 +284,7 @@ class RegionBulkEditView(generic.BulkEditView): form = forms.RegionBulkEditForm +@register_model_view(Region, 'bulk_delete', path='delete', detail=False) class RegionBulkDeleteView(generic.BulkDeleteView): queryset = Region.objects.add_related_count( Region.objects.all(), @@ -301,6 +306,7 @@ class RegionContactsView(ObjectContactsView): # Site groups # +@register_model_view(SiteGroup, 'list', path='', detail=False) class SiteGroupListView(generic.ObjectListView): queryset = SiteGroup.objects.add_related_count( SiteGroup.objects.all(), @@ -337,6 +343,7 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(SiteGroup, 'add', detail=False) @register_model_view(SiteGroup, 'edit') class SiteGroupEditView(generic.ObjectEditView): queryset = SiteGroup.objects.all() @@ -348,11 +355,13 @@ class SiteGroupDeleteView(generic.ObjectDeleteView): queryset = SiteGroup.objects.all() +@register_model_view(SiteGroup, 'import', detail=False) class SiteGroupBulkImportView(generic.BulkImportView): queryset = SiteGroup.objects.all() model_form = forms.SiteGroupImportForm +@register_model_view(SiteGroup, 'bulk_edit', path='edit', detail=False) class SiteGroupBulkEditView(generic.BulkEditView): queryset = SiteGroup.objects.add_related_count( SiteGroup.objects.all(), @@ -366,6 +375,7 @@ class SiteGroupBulkEditView(generic.BulkEditView): form = forms.SiteGroupBulkEditForm +@register_model_view(SiteGroup, 'bulk_delete', path='delete', detail=False) class SiteGroupBulkDeleteView(generic.BulkDeleteView): queryset = SiteGroup.objects.add_related_count( SiteGroup.objects.all(), @@ -387,6 +397,7 @@ class SiteGroupContactsView(ObjectContactsView): # Sites # +@register_model_view(Site, 'list', path='', detail=False) class SiteListView(generic.ObjectListView): queryset = Site.objects.annotate( device_count=count_related(Device, 'site') @@ -421,6 +432,7 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Site, 'add', detail=False) @register_model_view(Site, 'edit') class SiteEditView(generic.ObjectEditView): queryset = Site.objects.all() @@ -432,11 +444,13 @@ class SiteDeleteView(generic.ObjectDeleteView): queryset = Site.objects.all() +@register_model_view(Site, 'import', detail=False) class SiteBulkImportView(generic.BulkImportView): queryset = Site.objects.all() model_form = forms.SiteImportForm +@register_model_view(Site, 'bulk_edit', path='edit', detail=False) class SiteBulkEditView(generic.BulkEditView): queryset = Site.objects.all() filterset = filtersets.SiteFilterSet @@ -444,6 +458,7 @@ class SiteBulkEditView(generic.BulkEditView): form = forms.SiteBulkEditForm +@register_model_view(Site, 'bulk_delete', path='delete', detail=False) class SiteBulkDeleteView(generic.BulkDeleteView): queryset = Site.objects.all() filterset = filtersets.SiteFilterSet @@ -459,6 +474,7 @@ class SiteContactsView(ObjectContactsView): # Locations # +@register_model_view(Location, 'list', path='', detail=False) class LocationListView(generic.ObjectListView): queryset = Location.objects.add_related_count( Location.objects.add_related_count( @@ -499,6 +515,7 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Location, 'add', detail=False) @register_model_view(Location, 'edit') class LocationEditView(generic.ObjectEditView): queryset = Location.objects.all() @@ -510,11 +527,13 @@ class LocationDeleteView(generic.ObjectDeleteView): queryset = Location.objects.all() +@register_model_view(Location, 'import', detail=False) class LocationBulkImportView(generic.BulkImportView): queryset = Location.objects.all() model_form = forms.LocationImportForm +@register_model_view(Location, 'bulk_edit', path='edit', detail=False) class LocationBulkEditView(generic.BulkEditView): queryset = Location.objects.add_related_count( Location.objects.all(), @@ -528,6 +547,7 @@ class LocationBulkEditView(generic.BulkEditView): form = forms.LocationBulkEditForm +@register_model_view(Location, 'bulk_delete', path='delete', detail=False) class LocationBulkDeleteView(generic.BulkDeleteView): queryset = Location.objects.add_related_count( Location.objects.all(), @@ -549,6 +569,7 @@ class LocationContactsView(ObjectContactsView): # Rack roles # +@register_model_view(RackRole, 'list', path='', detail=False) class RackRoleListView(generic.ObjectListView): queryset = RackRole.objects.annotate( rack_count=count_related(Rack, 'role') @@ -568,6 +589,7 @@ class RackRoleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(RackRole, 'add', detail=False) @register_model_view(RackRole, 'edit') class RackRoleEditView(generic.ObjectEditView): queryset = RackRole.objects.all() @@ -579,11 +601,13 @@ class RackRoleDeleteView(generic.ObjectDeleteView): queryset = RackRole.objects.all() +@register_model_view(RackRole, 'import', detail=False) class RackRoleBulkImportView(generic.BulkImportView): queryset = RackRole.objects.all() model_form = forms.RackRoleImportForm +@register_model_view(RackRole, 'bulk_edit', path='edit', detail=False) class RackRoleBulkEditView(generic.BulkEditView): queryset = RackRole.objects.annotate( rack_count=count_related(Rack, 'role') @@ -593,6 +617,7 @@ class RackRoleBulkEditView(generic.BulkEditView): form = forms.RackRoleBulkEditForm +@register_model_view(RackRole, 'bulk_delete', path='delete', detail=False) class RackRoleBulkDeleteView(generic.BulkDeleteView): queryset = RackRole.objects.annotate( rack_count=count_related(Rack, 'role') @@ -605,6 +630,7 @@ class RackRoleBulkDeleteView(generic.BulkDeleteView): # RackTypes # +@register_model_view(RackType, 'list', path='', detail=False) class RackTypeListView(generic.ObjectListView): queryset = RackType.objects.annotate( instance_count=count_related(Rack, 'rack_type') @@ -624,6 +650,7 @@ class RackTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(RackType, 'add', detail=False) @register_model_view(RackType, 'edit') class RackTypeEditView(generic.ObjectEditView): queryset = RackType.objects.all() @@ -635,11 +662,13 @@ class RackTypeDeleteView(generic.ObjectDeleteView): queryset = RackType.objects.all() +@register_model_view(RackType, 'import', detail=False) class RackTypeBulkImportView(generic.BulkImportView): queryset = RackType.objects.all() model_form = forms.RackTypeImportForm +@register_model_view(RackType, 'bulk_edit', path='edit', detail=False) class RackTypeBulkEditView(generic.BulkEditView): queryset = RackType.objects.all() filterset = filtersets.RackTypeFilterSet @@ -647,6 +676,7 @@ class RackTypeBulkEditView(generic.BulkEditView): form = forms.RackTypeBulkEditForm +@register_model_view(RackType, 'bulk_delete', path='delete', detail=False) class RackTypeBulkDeleteView(generic.BulkDeleteView): queryset = RackType.objects.all() filterset = filtersets.RackTypeFilterSet @@ -657,6 +687,7 @@ class RackTypeBulkDeleteView(generic.BulkDeleteView): # Racks # +@register_model_view(Rack, 'list', path='', detail=False) class RackListView(generic.ObjectListView): queryset = Rack.objects.annotate( device_count=count_related(Device, 'rack') @@ -787,6 +818,7 @@ class RackNonRackedView(generic.ObjectChildrenView): ) +@register_model_view(Rack, 'add', detail=False) @register_model_view(Rack, 'edit') class RackEditView(generic.ObjectEditView): queryset = Rack.objects.all() @@ -798,11 +830,13 @@ class RackDeleteView(generic.ObjectDeleteView): queryset = Rack.objects.all() +@register_model_view(Rack, 'import', detail=False) class RackBulkImportView(generic.BulkImportView): queryset = Rack.objects.all() model_form = forms.RackImportForm +@register_model_view(Rack, 'bulk_edit', path='edit', detail=False) class RackBulkEditView(generic.BulkEditView): queryset = Rack.objects.all() filterset = filtersets.RackFilterSet @@ -810,6 +844,7 @@ class RackBulkEditView(generic.BulkEditView): form = forms.RackBulkEditForm +@register_model_view(Rack, 'bulk_delete', path='delete', detail=False) class RackBulkDeleteView(generic.BulkDeleteView): queryset = Rack.objects.all() filterset = filtersets.RackFilterSet @@ -825,6 +860,7 @@ class RackContactsView(ObjectContactsView): # Rack reservations # +@register_model_view(RackReservation, 'list', path='', detail=False) class RackReservationListView(generic.ObjectListView): queryset = RackReservation.objects.all() filterset = filtersets.RackReservationFilterSet @@ -837,6 +873,7 @@ class RackReservationView(generic.ObjectView): queryset = RackReservation.objects.all() +@register_model_view(RackReservation, 'add', detail=False) @register_model_view(RackReservation, 'edit') class RackReservationEditView(generic.ObjectEditView): queryset = RackReservation.objects.all() @@ -855,6 +892,7 @@ class RackReservationDeleteView(generic.ObjectDeleteView): queryset = RackReservation.objects.all() +@register_model_view(RackReservation, 'import', detail=False) class RackReservationImportView(generic.BulkImportView): queryset = RackReservation.objects.all() model_form = forms.RackReservationImportForm @@ -870,6 +908,7 @@ class RackReservationImportView(generic.BulkImportView): return instance +@register_model_view(RackReservation, 'bulk_edit', path='edit', detail=False) class RackReservationBulkEditView(generic.BulkEditView): queryset = RackReservation.objects.all() filterset = filtersets.RackReservationFilterSet @@ -877,6 +916,7 @@ class RackReservationBulkEditView(generic.BulkEditView): form = forms.RackReservationBulkEditForm +@register_model_view(RackReservation, 'bulk_delete', path='delete', detail=False) class RackReservationBulkDeleteView(generic.BulkDeleteView): queryset = RackReservation.objects.all() filterset = filtersets.RackReservationFilterSet @@ -887,6 +927,7 @@ class RackReservationBulkDeleteView(generic.BulkDeleteView): # Manufacturers # +@register_model_view(Manufacturer, 'list', path='', detail=False) class ManufacturerListView(generic.ObjectListView): queryset = Manufacturer.objects.annotate( devicetype_count=count_related(DeviceType, 'manufacturer'), @@ -909,6 +950,7 @@ class ManufacturerView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Manufacturer, 'add', detail=False) @register_model_view(Manufacturer, 'edit') class ManufacturerEditView(generic.ObjectEditView): queryset = Manufacturer.objects.all() @@ -920,11 +962,13 @@ class ManufacturerDeleteView(generic.ObjectDeleteView): queryset = Manufacturer.objects.all() +@register_model_view(Manufacturer, 'import', detail=False) class ManufacturerBulkImportView(generic.BulkImportView): queryset = Manufacturer.objects.all() model_form = forms.ManufacturerImportForm +@register_model_view(Manufacturer, 'bulk_edit', path='edit', detail=False) class ManufacturerBulkEditView(generic.BulkEditView): queryset = Manufacturer.objects.annotate( devicetype_count=count_related(DeviceType, 'manufacturer'), @@ -937,6 +981,7 @@ class ManufacturerBulkEditView(generic.BulkEditView): form = forms.ManufacturerBulkEditForm +@register_model_view(Manufacturer, 'bulk_delete', path='delete', detail=False) class ManufacturerBulkDeleteView(generic.BulkDeleteView): queryset = Manufacturer.objects.annotate( devicetype_count=count_related(DeviceType, 'manufacturer'), @@ -957,6 +1002,7 @@ class ManufacturerContactsView(ObjectContactsView): # Device types # +@register_model_view(DeviceType, 'list', path='', detail=False) class DeviceTypeListView(generic.ObjectListView): queryset = DeviceType.objects.annotate( instance_count=count_related(Device, 'device_type') @@ -980,6 +1026,7 @@ class DeviceTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(DeviceType, 'add', detail=False) @register_model_view(DeviceType, 'edit') class DeviceTypeEditView(generic.ObjectEditView): queryset = DeviceType.objects.all() @@ -1141,6 +1188,7 @@ class DeviceTypeInventoryItemsView(DeviceTypeComponentsView): ) +@register_model_view(DeviceType, 'import', detail=False) class DeviceTypeImportView(generic.BulkImportView): additional_permissions = [ 'dcim.add_devicetype', @@ -1175,6 +1223,7 @@ class DeviceTypeImportView(generic.BulkImportView): return data +@register_model_view(DeviceType, 'bulk_edit', path='edit', detail=False) class DeviceTypeBulkEditView(generic.BulkEditView): queryset = DeviceType.objects.annotate( instance_count=count_related(Device, 'device_type') @@ -1184,6 +1233,7 @@ class DeviceTypeBulkEditView(generic.BulkEditView): form = forms.DeviceTypeBulkEditForm +@register_model_view(DeviceType, 'bulk_delete', path='delete', detail=False) class DeviceTypeBulkDeleteView(generic.BulkDeleteView): queryset = DeviceType.objects.annotate( instance_count=count_related(Device, 'device_type') @@ -1196,6 +1246,7 @@ class DeviceTypeBulkDeleteView(generic.BulkDeleteView): # Module types # +@register_model_view(ModuleType, 'list', path='', detail=False) class ModuleTypeListView(generic.ObjectListView): queryset = ModuleType.objects.annotate( instance_count=count_related(Module, 'module_type') @@ -1219,6 +1270,7 @@ class ModuleTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ModuleType, 'add', detail=False) @register_model_view(ModuleType, 'edit') class ModuleTypeEditView(generic.ObjectEditView): queryset = ModuleType.objects.all() @@ -1350,6 +1402,7 @@ class ModuleTypeModuleBaysView(ModuleTypeComponentsView): ) +@register_model_view(ModuleType, 'import', detail=False) class ModuleTypeImportView(generic.BulkImportView): additional_permissions = [ 'dcim.add_moduletype', @@ -1378,6 +1431,7 @@ class ModuleTypeImportView(generic.BulkImportView): return data +@register_model_view(ModuleType, 'bulk_edit', path='edit', detail=False) class ModuleTypeBulkEditView(generic.BulkEditView): queryset = ModuleType.objects.annotate( instance_count=count_related(Module, 'module_type') @@ -1387,6 +1441,7 @@ class ModuleTypeBulkEditView(generic.BulkEditView): form = forms.ModuleTypeBulkEditForm +@register_model_view(ModuleType, 'bulk_delete', path='delete', detail=False) class ModuleTypeBulkDeleteView(generic.BulkDeleteView): queryset = ModuleType.objects.annotate( instance_count=count_related(Module, 'module_type') @@ -1399,6 +1454,7 @@ class ModuleTypeBulkDeleteView(generic.BulkDeleteView): # Console port templates # +@register_model_view(ConsolePortTemplate, 'add', detail=False) class ConsolePortTemplateCreateView(generic.ComponentCreateView): queryset = ConsolePortTemplate.objects.all() form = forms.ConsolePortTemplateCreateForm @@ -1416,16 +1472,19 @@ class ConsolePortTemplateDeleteView(generic.ObjectDeleteView): queryset = ConsolePortTemplate.objects.all() +@register_model_view(ConsolePortTemplate, 'bulk_edit', path='edit', detail=False) class ConsolePortTemplateBulkEditView(generic.BulkEditView): queryset = ConsolePortTemplate.objects.all() table = tables.ConsolePortTemplateTable form = forms.ConsolePortTemplateBulkEditForm +@register_model_view(ConsolePortTemplate, 'bulk_rename', path='rename', detail=False) class ConsolePortTemplateBulkRenameView(generic.BulkRenameView): queryset = ConsolePortTemplate.objects.all() +@register_model_view(ConsolePortTemplate, 'bulk_delete', path='delete', detail=False) class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ConsolePortTemplate.objects.all() table = tables.ConsolePortTemplateTable @@ -1435,6 +1494,7 @@ class ConsolePortTemplateBulkDeleteView(generic.BulkDeleteView): # Console server port templates # +@register_model_view(ConsoleServerPortTemplate, 'add', detail=False) class ConsoleServerPortTemplateCreateView(generic.ComponentCreateView): queryset = ConsoleServerPortTemplate.objects.all() form = forms.ConsoleServerPortTemplateCreateForm @@ -1452,16 +1512,19 @@ class ConsoleServerPortTemplateDeleteView(generic.ObjectDeleteView): queryset = ConsoleServerPortTemplate.objects.all() +@register_model_view(ConsoleServerPortTemplate, 'bulk_edit', path='edit', detail=False) class ConsoleServerPortTemplateBulkEditView(generic.BulkEditView): queryset = ConsoleServerPortTemplate.objects.all() table = tables.ConsoleServerPortTemplateTable form = forms.ConsoleServerPortTemplateBulkEditForm +@register_model_view(ConsoleServerPortTemplate, 'bulk_rename', detail=False) class ConsoleServerPortTemplateBulkRenameView(generic.BulkRenameView): queryset = ConsoleServerPortTemplate.objects.all() +@register_model_view(ConsoleServerPortTemplate, 'bulk_delete', path='delete', detail=False) class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ConsoleServerPortTemplate.objects.all() table = tables.ConsoleServerPortTemplateTable @@ -1471,6 +1534,7 @@ class ConsoleServerPortTemplateBulkDeleteView(generic.BulkDeleteView): # Power port templates # +@register_model_view(PowerPortTemplate, 'add', detail=False) class PowerPortTemplateCreateView(generic.ComponentCreateView): queryset = PowerPortTemplate.objects.all() form = forms.PowerPortTemplateCreateForm @@ -1488,16 +1552,19 @@ class PowerPortTemplateDeleteView(generic.ObjectDeleteView): queryset = PowerPortTemplate.objects.all() +@register_model_view(PowerPortTemplate, 'bulk_edit', path='edit', detail=False) class PowerPortTemplateBulkEditView(generic.BulkEditView): queryset = PowerPortTemplate.objects.all() table = tables.PowerPortTemplateTable form = forms.PowerPortTemplateBulkEditForm +@register_model_view(PowerPortTemplate, 'bulk_rename', path='rename', detail=False) class PowerPortTemplateBulkRenameView(generic.BulkRenameView): queryset = PowerPortTemplate.objects.all() +@register_model_view(PowerPortTemplate, 'bulk_delete', path='delete', detail=False) class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView): queryset = PowerPortTemplate.objects.all() table = tables.PowerPortTemplateTable @@ -1507,6 +1574,7 @@ class PowerPortTemplateBulkDeleteView(generic.BulkDeleteView): # Power outlet templates # +@register_model_view(PowerOutletTemplate, 'add', detail=False) class PowerOutletTemplateCreateView(generic.ComponentCreateView): queryset = PowerOutletTemplate.objects.all() form = forms.PowerOutletTemplateCreateForm @@ -1524,16 +1592,19 @@ class PowerOutletTemplateDeleteView(generic.ObjectDeleteView): queryset = PowerOutletTemplate.objects.all() +@register_model_view(PowerOutletTemplate, 'bulk_edit', path='edit', detail=False) class PowerOutletTemplateBulkEditView(generic.BulkEditView): queryset = PowerOutletTemplate.objects.all() table = tables.PowerOutletTemplateTable form = forms.PowerOutletTemplateBulkEditForm +@register_model_view(PowerOutletTemplate, 'bulk_rename', path='rename', detail=False) class PowerOutletTemplateBulkRenameView(generic.BulkRenameView): queryset = PowerOutletTemplate.objects.all() +@register_model_view(PowerOutletTemplate, 'bulk_delete', path='delete', detail=False) class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView): queryset = PowerOutletTemplate.objects.all() table = tables.PowerOutletTemplateTable @@ -1543,6 +1614,7 @@ class PowerOutletTemplateBulkDeleteView(generic.BulkDeleteView): # Interface templates # +@register_model_view(InterfaceTemplate, 'add', detail=False) class InterfaceTemplateCreateView(generic.ComponentCreateView): queryset = InterfaceTemplate.objects.all() form = forms.InterfaceTemplateCreateForm @@ -1560,16 +1632,19 @@ class InterfaceTemplateDeleteView(generic.ObjectDeleteView): queryset = InterfaceTemplate.objects.all() +@register_model_view(InterfaceTemplate, 'bulk_edit', path='edit', detail=False) class InterfaceTemplateBulkEditView(generic.BulkEditView): queryset = InterfaceTemplate.objects.all() table = tables.InterfaceTemplateTable form = forms.InterfaceTemplateBulkEditForm +@register_model_view(InterfaceTemplate, 'bulk_rename', path='rename', detail=False) class InterfaceTemplateBulkRenameView(generic.BulkRenameView): queryset = InterfaceTemplate.objects.all() +@register_model_view(InterfaceTemplate, 'bulk_delete', path='delete', detail=False) class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView): queryset = InterfaceTemplate.objects.all() table = tables.InterfaceTemplateTable @@ -1579,6 +1654,7 @@ class InterfaceTemplateBulkDeleteView(generic.BulkDeleteView): # Front port templates # +@register_model_view(FrontPortTemplate, 'add', detail=False) class FrontPortTemplateCreateView(generic.ComponentCreateView): queryset = FrontPortTemplate.objects.all() form = forms.FrontPortTemplateCreateForm @@ -1596,16 +1672,19 @@ class FrontPortTemplateDeleteView(generic.ObjectDeleteView): queryset = FrontPortTemplate.objects.all() +@register_model_view(FrontPortTemplate, 'bulk_edit', path='edit', detail=False) class FrontPortTemplateBulkEditView(generic.BulkEditView): queryset = FrontPortTemplate.objects.all() table = tables.FrontPortTemplateTable form = forms.FrontPortTemplateBulkEditForm +@register_model_view(FrontPortTemplate, 'bulk_rename', path='rename', detail=False) class FrontPortTemplateBulkRenameView(generic.BulkRenameView): queryset = FrontPortTemplate.objects.all() +@register_model_view(FrontPortTemplate, 'bulk_delete', path='delete', detail=False) class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView): queryset = FrontPortTemplate.objects.all() table = tables.FrontPortTemplateTable @@ -1615,6 +1694,7 @@ class FrontPortTemplateBulkDeleteView(generic.BulkDeleteView): # Rear port templates # +@register_model_view(RearPortTemplate, 'add', detail=False) class RearPortTemplateCreateView(generic.ComponentCreateView): queryset = RearPortTemplate.objects.all() form = forms.RearPortTemplateCreateForm @@ -1632,16 +1712,19 @@ class RearPortTemplateDeleteView(generic.ObjectDeleteView): queryset = RearPortTemplate.objects.all() +@register_model_view(RearPortTemplate, 'bulk_edit', path='edit', detail=False) class RearPortTemplateBulkEditView(generic.BulkEditView): queryset = RearPortTemplate.objects.all() table = tables.RearPortTemplateTable form = forms.RearPortTemplateBulkEditForm +@register_model_view(RearPortTemplate, 'bulk_rename', path='rename', detail=False) class RearPortTemplateBulkRenameView(generic.BulkRenameView): queryset = RearPortTemplate.objects.all() +@register_model_view(RearPortTemplate, 'bulk_delete', path='delete', detail=False) class RearPortTemplateBulkDeleteView(generic.BulkDeleteView): queryset = RearPortTemplate.objects.all() table = tables.RearPortTemplateTable @@ -1651,6 +1734,7 @@ class RearPortTemplateBulkDeleteView(generic.BulkDeleteView): # Module bay templates # +@register_model_view(ModuleBayTemplate, 'add', detail=False) class ModuleBayTemplateCreateView(generic.ComponentCreateView): queryset = ModuleBayTemplate.objects.all() form = forms.ModuleBayTemplateCreateForm @@ -1668,16 +1752,19 @@ class ModuleBayTemplateDeleteView(generic.ObjectDeleteView): queryset = ModuleBayTemplate.objects.all() +@register_model_view(ModuleBayTemplate, 'bulk_edit', path='edit', detail=False) class ModuleBayTemplateBulkEditView(generic.BulkEditView): queryset = ModuleBayTemplate.objects.all() table = tables.ModuleBayTemplateTable form = forms.ModuleBayTemplateBulkEditForm +@register_model_view(ModuleBayTemplate, 'bulk_rename', path='rename', detail=False) class ModuleBayTemplateBulkRenameView(generic.BulkRenameView): queryset = ModuleBayTemplate.objects.all() +@register_model_view(ModuleBayTemplate, 'bulk_delete', path='delete', detail=False) class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ModuleBayTemplate.objects.all() table = tables.ModuleBayTemplateTable @@ -1687,6 +1774,7 @@ class ModuleBayTemplateBulkDeleteView(generic.BulkDeleteView): # Device bay templates # +@register_model_view(DeviceBayTemplate, 'add', detail=False) class DeviceBayTemplateCreateView(generic.ComponentCreateView): queryset = DeviceBayTemplate.objects.all() form = forms.DeviceBayTemplateCreateForm @@ -1704,16 +1792,19 @@ class DeviceBayTemplateDeleteView(generic.ObjectDeleteView): queryset = DeviceBayTemplate.objects.all() +@register_model_view(DeviceBayTemplate, 'bulk_edit', path='edit', detail=False) class DeviceBayTemplateBulkEditView(generic.BulkEditView): queryset = DeviceBayTemplate.objects.all() table = tables.DeviceBayTemplateTable form = forms.DeviceBayTemplateBulkEditForm +@register_model_view(DeviceBayTemplate, 'bulk_rename', path='rename', detail=False) class DeviceBayTemplateBulkRenameView(generic.BulkRenameView): queryset = DeviceBayTemplate.objects.all() +@register_model_view(DeviceBayTemplate, 'bulk_delete', path='delete', detail=False) class DeviceBayTemplateBulkDeleteView(generic.BulkDeleteView): queryset = DeviceBayTemplate.objects.all() table = tables.DeviceBayTemplateTable @@ -1723,6 +1814,7 @@ class DeviceBayTemplateBulkDeleteView(generic.BulkDeleteView): # Inventory item templates # +@register_model_view(InventoryItemTemplate, 'add', detail=False) class InventoryItemTemplateCreateView(generic.ComponentCreateView): queryset = InventoryItemTemplate.objects.all() form = forms.InventoryItemTemplateCreateForm @@ -1751,16 +1843,19 @@ class InventoryItemTemplateDeleteView(generic.ObjectDeleteView): queryset = InventoryItemTemplate.objects.all() +@register_model_view(InventoryItemTemplate, 'bulk_edit', path='edit', detail=False) class InventoryItemTemplateBulkEditView(generic.BulkEditView): queryset = InventoryItemTemplate.objects.all() table = tables.InventoryItemTemplateTable form = forms.InventoryItemTemplateBulkEditForm +@register_model_view(InventoryItemTemplate, 'bulk_rename', path='rename', detail=False) class InventoryItemTemplateBulkRenameView(generic.BulkRenameView): queryset = InventoryItemTemplate.objects.all() +@register_model_view(InventoryItemTemplate, 'bulk_delete', path='delete', detail=False) class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView): queryset = InventoryItemTemplate.objects.all() table = tables.InventoryItemTemplateTable @@ -1770,6 +1865,7 @@ class InventoryItemTemplateBulkDeleteView(generic.BulkDeleteView): # Device roles # +@register_model_view(DeviceRole, 'list', path='', detail=False) class DeviceRoleListView(generic.ObjectListView): queryset = DeviceRole.objects.annotate( device_count=count_related(Device, 'role'), @@ -1790,6 +1886,7 @@ class DeviceRoleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(DeviceRole, 'add', detail=False) @register_model_view(DeviceRole, 'edit') class DeviceRoleEditView(generic.ObjectEditView): queryset = DeviceRole.objects.all() @@ -1801,11 +1898,13 @@ class DeviceRoleDeleteView(generic.ObjectDeleteView): queryset = DeviceRole.objects.all() +@register_model_view(DeviceRole, 'import', detail=False) class DeviceRoleBulkImportView(generic.BulkImportView): queryset = DeviceRole.objects.all() model_form = forms.DeviceRoleImportForm +@register_model_view(DeviceRole, 'bulk_edit', path='edit', detail=False) class DeviceRoleBulkEditView(generic.BulkEditView): queryset = DeviceRole.objects.annotate( device_count=count_related(Device, 'role'), @@ -1816,6 +1915,7 @@ class DeviceRoleBulkEditView(generic.BulkEditView): form = forms.DeviceRoleBulkEditForm +@register_model_view(DeviceRole, 'bulk_delete', path='delete', detail=False) class DeviceRoleBulkDeleteView(generic.BulkDeleteView): queryset = DeviceRole.objects.annotate( device_count=count_related(Device, 'role'), @@ -1829,6 +1929,7 @@ class DeviceRoleBulkDeleteView(generic.BulkDeleteView): # Platforms # +@register_model_view(Platform, 'list', path='', detail=False) class PlatformListView(generic.ObjectListView): queryset = Platform.objects.annotate( device_count=count_related(Device, 'platform'), @@ -1849,6 +1950,7 @@ class PlatformView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Platform, 'add', detail=False) @register_model_view(Platform, 'edit') class PlatformEditView(generic.ObjectEditView): queryset = Platform.objects.all() @@ -1860,11 +1962,13 @@ class PlatformDeleteView(generic.ObjectDeleteView): queryset = Platform.objects.all() +@register_model_view(Platform, 'import', detail=False) class PlatformBulkImportView(generic.BulkImportView): queryset = Platform.objects.all() model_form = forms.PlatformImportForm +@register_model_view(Platform, 'bulk_edit', path='edit', detail=False) class PlatformBulkEditView(generic.BulkEditView): queryset = Platform.objects.all() filterset = filtersets.PlatformFilterSet @@ -1872,6 +1976,7 @@ class PlatformBulkEditView(generic.BulkEditView): form = forms.PlatformBulkEditForm +@register_model_view(Platform, 'bulk_delete', path='delete', detail=False) class PlatformBulkDeleteView(generic.BulkDeleteView): queryset = Platform.objects.all() filterset = filtersets.PlatformFilterSet @@ -1882,6 +1987,7 @@ class PlatformBulkDeleteView(generic.BulkDeleteView): # Devices # +@register_model_view(Device, 'list', path='', detail=False) class DeviceListView(generic.ObjectListView): queryset = Device.objects.all() filterset = filtersets.DeviceFilterSet @@ -1909,6 +2015,7 @@ class DeviceView(generic.ObjectView): } +@register_model_view(Device, 'add', detail=False) @register_model_view(Device, 'edit') class DeviceEditView(generic.ObjectEditView): queryset = Device.objects.all() @@ -2176,6 +2283,7 @@ class DeviceVirtualMachinesView(generic.ObjectChildrenView): return self.child_model.objects.restrict(request.user, 'view').filter(cluster=parent.cluster, device=parent) +@register_model_view(Device, 'import', detail=False) class DeviceBulkImportView(generic.BulkImportView): queryset = Device.objects.all() model_form = forms.DeviceImportForm @@ -2192,6 +2300,7 @@ class DeviceBulkImportView(generic.BulkImportView): return obj +@register_model_view(Device, 'bulk_edit', path='edit', detail=False) class DeviceBulkEditView(generic.BulkEditView): queryset = Device.objects.prefetch_related('device_type__manufacturer') filterset = filtersets.DeviceFilterSet @@ -2199,12 +2308,14 @@ class DeviceBulkEditView(generic.BulkEditView): form = forms.DeviceBulkEditForm +@register_model_view(Device, 'bulk_delete', path='delete', detail=False) class DeviceBulkDeleteView(generic.BulkDeleteView): queryset = Device.objects.prefetch_related('device_type__manufacturer') filterset = filtersets.DeviceFilterSet table = tables.DeviceTable +@register_model_view(Device, 'bulk_rename', path='rename', detail=False) class DeviceBulkRenameView(generic.BulkRenameView): queryset = Device.objects.all() filterset = filtersets.DeviceFilterSet @@ -2220,6 +2331,7 @@ class DeviceContactsView(ObjectContactsView): # Modules # +@register_model_view(Module, 'list', path='', detail=False) class ModuleListView(generic.ObjectListView): queryset = Module.objects.prefetch_related('module_type__manufacturer') filterset = filtersets.ModuleFilterSet @@ -2237,6 +2349,7 @@ class ModuleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Module, 'add', detail=False) @register_model_view(Module, 'edit') class ModuleEditView(generic.ObjectEditView): queryset = Module.objects.all() @@ -2248,11 +2361,13 @@ class ModuleDeleteView(generic.ObjectDeleteView): queryset = Module.objects.all() +@register_model_view(Module, 'import', detail=False) class ModuleBulkImportView(generic.BulkImportView): queryset = Module.objects.all() model_form = forms.ModuleImportForm +@register_model_view(Module, 'bulk_edit', path='edit', detail=False) class ModuleBulkEditView(generic.BulkEditView): queryset = Module.objects.prefetch_related('module_type__manufacturer') filterset = filtersets.ModuleFilterSet @@ -2260,6 +2375,7 @@ class ModuleBulkEditView(generic.BulkEditView): form = forms.ModuleBulkEditForm +@register_model_view(Module, 'bulk_delete', path='delete', detail=False) class ModuleBulkDeleteView(generic.BulkDeleteView): queryset = Module.objects.prefetch_related('module_type__manufacturer') filterset = filtersets.ModuleFilterSet @@ -2270,6 +2386,7 @@ class ModuleBulkDeleteView(generic.BulkDeleteView): # Console ports # +@register_model_view(ConsolePort, 'list', path='', detail=False) class ConsolePortListView(generic.ObjectListView): queryset = ConsolePort.objects.all() filterset = filtersets.ConsolePortFilterSet @@ -2287,6 +2404,7 @@ class ConsolePortView(generic.ObjectView): queryset = ConsolePort.objects.all() +@register_model_view(ConsolePort, 'add', detail=False) class ConsolePortCreateView(generic.ComponentCreateView): queryset = ConsolePort.objects.all() form = forms.ConsolePortCreateForm @@ -2304,11 +2422,13 @@ class ConsolePortDeleteView(generic.ObjectDeleteView): queryset = ConsolePort.objects.all() +@register_model_view(ConsolePort, 'import', detail=False) class ConsolePortBulkImportView(generic.BulkImportView): queryset = ConsolePort.objects.all() model_form = forms.ConsolePortImportForm +@register_model_view(ConsolePort, 'bulk_edit', path='edit', detail=False) class ConsolePortBulkEditView(generic.BulkEditView): queryset = ConsolePort.objects.all() filterset = filtersets.ConsolePortFilterSet @@ -2316,14 +2436,17 @@ class ConsolePortBulkEditView(generic.BulkEditView): form = forms.ConsolePortBulkEditForm +@register_model_view(ConsolePort, 'bulk_rename', path='rename', detail=False) class ConsolePortBulkRenameView(generic.BulkRenameView): queryset = ConsolePort.objects.all() +@register_model_view(ConsolePort, 'bulk_disconnect', path='disconnect', detail=False) class ConsolePortBulkDisconnectView(BulkDisconnectView): queryset = ConsolePort.objects.all() +@register_model_view(ConsolePort, 'bulk_delete', path='delete', detail=False) class ConsolePortBulkDeleteView(generic.BulkDeleteView): queryset = ConsolePort.objects.all() filterset = filtersets.ConsolePortFilterSet @@ -2338,6 +2461,7 @@ register_model_view(ConsolePort, 'trace', kwargs={'model': ConsolePort})(PathTra # Console server ports # +@register_model_view(ConsoleServerPort, 'list', path='', detail=False) class ConsoleServerPortListView(generic.ObjectListView): queryset = ConsoleServerPort.objects.all() filterset = filtersets.ConsoleServerPortFilterSet @@ -2355,6 +2479,7 @@ class ConsoleServerPortView(generic.ObjectView): queryset = ConsoleServerPort.objects.all() +@register_model_view(ConsoleServerPort, 'add', detail=False) class ConsoleServerPortCreateView(generic.ComponentCreateView): queryset = ConsoleServerPort.objects.all() form = forms.ConsoleServerPortCreateForm @@ -2372,11 +2497,13 @@ class ConsoleServerPortDeleteView(generic.ObjectDeleteView): queryset = ConsoleServerPort.objects.all() +@register_model_view(ConsoleServerPort, 'import', detail=False) class ConsoleServerPortBulkImportView(generic.BulkImportView): queryset = ConsoleServerPort.objects.all() model_form = forms.ConsoleServerPortImportForm +@register_model_view(ConsoleServerPort, 'bulk_edit', path='edit', detail=False) class ConsoleServerPortBulkEditView(generic.BulkEditView): queryset = ConsoleServerPort.objects.all() filterset = filtersets.ConsoleServerPortFilterSet @@ -2384,14 +2511,17 @@ class ConsoleServerPortBulkEditView(generic.BulkEditView): form = forms.ConsoleServerPortBulkEditForm +@register_model_view(ConsoleServerPort, 'bulk_rename', path='rename', detail=False) class ConsoleServerPortBulkRenameView(generic.BulkRenameView): queryset = ConsoleServerPort.objects.all() +@register_model_view(ConsoleServerPort, 'bulk_disconnect', path='disconnect', detail=False) class ConsoleServerPortBulkDisconnectView(BulkDisconnectView): queryset = ConsoleServerPort.objects.all() +@register_model_view(ConsoleServerPort, 'bulk_delete', path='delete', detail=False) class ConsoleServerPortBulkDeleteView(generic.BulkDeleteView): queryset = ConsoleServerPort.objects.all() filterset = filtersets.ConsoleServerPortFilterSet @@ -2406,6 +2536,7 @@ register_model_view(ConsoleServerPort, 'trace', kwargs={'model': ConsoleServerPo # Power ports # +@register_model_view(PowerPort, 'list', path='', detail=False) class PowerPortListView(generic.ObjectListView): queryset = PowerPort.objects.all() filterset = filtersets.PowerPortFilterSet @@ -2423,6 +2554,7 @@ class PowerPortView(generic.ObjectView): queryset = PowerPort.objects.all() +@register_model_view(PowerPort, 'add', detail=False) class PowerPortCreateView(generic.ComponentCreateView): queryset = PowerPort.objects.all() form = forms.PowerPortCreateForm @@ -2440,11 +2572,13 @@ class PowerPortDeleteView(generic.ObjectDeleteView): queryset = PowerPort.objects.all() +@register_model_view(PowerPort, 'import', detail=False) class PowerPortBulkImportView(generic.BulkImportView): queryset = PowerPort.objects.all() model_form = forms.PowerPortImportForm +@register_model_view(PowerPort, 'bulk_edit', path='edit', detail=False) class PowerPortBulkEditView(generic.BulkEditView): queryset = PowerPort.objects.all() filterset = filtersets.PowerPortFilterSet @@ -2452,14 +2586,17 @@ class PowerPortBulkEditView(generic.BulkEditView): form = forms.PowerPortBulkEditForm +@register_model_view(PowerPort, 'bulk_rename', path='rename', detail=False) class PowerPortBulkRenameView(generic.BulkRenameView): queryset = PowerPort.objects.all() +@register_model_view(PowerPort, 'bulk_disconnect', path='disconnect', detail=False) class PowerPortBulkDisconnectView(BulkDisconnectView): queryset = PowerPort.objects.all() +@register_model_view(PowerPort, 'bulk_delete', path='delete', detail=False) class PowerPortBulkDeleteView(generic.BulkDeleteView): queryset = PowerPort.objects.all() filterset = filtersets.PowerPortFilterSet @@ -2474,6 +2611,7 @@ register_model_view(PowerPort, 'trace', kwargs={'model': PowerPort})(PathTraceVi # Power outlets # +@register_model_view(PowerOutlet, 'list', path='', detail=False) class PowerOutletListView(generic.ObjectListView): queryset = PowerOutlet.objects.all() filterset = filtersets.PowerOutletFilterSet @@ -2491,6 +2629,7 @@ class PowerOutletView(generic.ObjectView): queryset = PowerOutlet.objects.all() +@register_model_view(PowerOutlet, 'add', detail=False) class PowerOutletCreateView(generic.ComponentCreateView): queryset = PowerOutlet.objects.all() form = forms.PowerOutletCreateForm @@ -2508,11 +2647,13 @@ class PowerOutletDeleteView(generic.ObjectDeleteView): queryset = PowerOutlet.objects.all() +@register_model_view(PowerOutlet, 'import', detail=False) class PowerOutletBulkImportView(generic.BulkImportView): queryset = PowerOutlet.objects.all() model_form = forms.PowerOutletImportForm +@register_model_view(PowerOutlet, 'bulk_edit', path='edit', detail=False) class PowerOutletBulkEditView(generic.BulkEditView): queryset = PowerOutlet.objects.all() filterset = filtersets.PowerOutletFilterSet @@ -2520,14 +2661,17 @@ class PowerOutletBulkEditView(generic.BulkEditView): form = forms.PowerOutletBulkEditForm +@register_model_view(PowerOutlet, 'bulk_rename', path='rename', detail=False) class PowerOutletBulkRenameView(generic.BulkRenameView): queryset = PowerOutlet.objects.all() +@register_model_view(PowerOutlet, 'bulk_disconnect', path='disconnect', detail=False) class PowerOutletBulkDisconnectView(BulkDisconnectView): queryset = PowerOutlet.objects.all() +@register_model_view(PowerOutlet, 'bulk_delete', path='delete', detail=False) class PowerOutletBulkDeleteView(generic.BulkDeleteView): queryset = PowerOutlet.objects.all() filterset = filtersets.PowerOutletFilterSet @@ -2538,55 +2682,11 @@ class PowerOutletBulkDeleteView(generic.BulkDeleteView): register_model_view(PowerOutlet, 'trace', kwargs={'model': PowerOutlet})(PathTraceView) -# -# MAC addresses -# - -class MACAddressListView(generic.ObjectListView): - queryset = MACAddress.objects.all() - filterset = filtersets.MACAddressFilterSet - filterset_form = forms.MACAddressFilterForm - table = tables.MACAddressTable - - -@register_model_view(MACAddress) -class MACAddressView(generic.ObjectView): - queryset = MACAddress.objects.all() - - -@register_model_view(MACAddress, 'edit') -class MACAddressEditView(generic.ObjectEditView): - queryset = MACAddress.objects.all() - form = forms.MACAddressForm - - -@register_model_view(MACAddress, 'delete') -class MACAddressDeleteView(generic.ObjectDeleteView): - queryset = MACAddress.objects.all() - - -class MACAddressBulkImportView(generic.BulkImportView): - queryset = MACAddress.objects.all() - model_form = forms.MACAddressImportForm - - -class MACAddressBulkEditView(generic.BulkEditView): - queryset = MACAddress.objects.all() - filterset = filtersets.MACAddressFilterSet - table = tables.MACAddressTable - form = forms.MACAddressBulkEditForm - - -class MACAddressBulkDeleteView(generic.BulkDeleteView): - queryset = MACAddress.objects.all() - filterset = filtersets.MACAddressFilterSet - table = tables.MACAddressTable - - # # Interfaces # +@register_model_view(Interface, 'list', path='', detail=False) class InterfaceListView(generic.ObjectListView): queryset = Interface.objects.all() filterset = filtersets.InterfaceFilterSet @@ -2661,6 +2761,7 @@ class InterfaceView(generic.ObjectView): } +@register_model_view(Interface, 'add', detail=False) class InterfaceCreateView(generic.ComponentCreateView): queryset = Interface.objects.all() form = forms.InterfaceCreateForm @@ -2678,11 +2779,13 @@ class InterfaceDeleteView(generic.ObjectDeleteView): queryset = Interface.objects.all() +@register_model_view(Interface, 'import', detail=False) class InterfaceBulkImportView(generic.BulkImportView): queryset = Interface.objects.all() model_form = forms.InterfaceImportForm +@register_model_view(Interface, 'bulk_edit', path='edit', detail=False) class InterfaceBulkEditView(generic.BulkEditView): queryset = Interface.objects.all() filterset = filtersets.InterfaceFilterSet @@ -2690,14 +2793,17 @@ class InterfaceBulkEditView(generic.BulkEditView): form = forms.InterfaceBulkEditForm +@register_model_view(Interface, 'bulk_rename', path='rename', detail=False) class InterfaceBulkRenameView(generic.BulkRenameView): queryset = Interface.objects.all() +@register_model_view(Interface, 'bulk_disconnect', path='disconnect', detail=False) class InterfaceBulkDisconnectView(BulkDisconnectView): queryset = Interface.objects.all() +@register_model_view(Interface, 'bulk_delete', path='delete', detail=False) class InterfaceBulkDeleteView(generic.BulkDeleteView): # Ensure child interfaces are deleted prior to their parents queryset = Interface.objects.order_by('device', 'parent', CollateAsChar('_name')) @@ -2713,6 +2819,7 @@ register_model_view(Interface, 'trace', kwargs={'model': Interface})(PathTraceVi # Front ports # +@register_model_view(FrontPort, 'list', path='', detail=False) class FrontPortListView(generic.ObjectListView): queryset = FrontPort.objects.all() filterset = filtersets.FrontPortFilterSet @@ -2730,6 +2837,7 @@ class FrontPortView(generic.ObjectView): queryset = FrontPort.objects.all() +@register_model_view(FrontPort, 'add', detail=False) class FrontPortCreateView(generic.ComponentCreateView): queryset = FrontPort.objects.all() form = forms.FrontPortCreateForm @@ -2747,11 +2855,13 @@ class FrontPortDeleteView(generic.ObjectDeleteView): queryset = FrontPort.objects.all() +@register_model_view(FrontPort, 'import', detail=False) class FrontPortBulkImportView(generic.BulkImportView): queryset = FrontPort.objects.all() model_form = forms.FrontPortImportForm +@register_model_view(FrontPort, 'bulk_edit', path='edit', detail=False) class FrontPortBulkEditView(generic.BulkEditView): queryset = FrontPort.objects.all() filterset = filtersets.FrontPortFilterSet @@ -2759,14 +2869,17 @@ class FrontPortBulkEditView(generic.BulkEditView): form = forms.FrontPortBulkEditForm +@register_model_view(FrontPort, 'bulk_rename', path='rename', detail=False) class FrontPortBulkRenameView(generic.BulkRenameView): queryset = FrontPort.objects.all() +@register_model_view(FrontPort, 'bulk_disconnect', path='disconnect', detail=False) class FrontPortBulkDisconnectView(BulkDisconnectView): queryset = FrontPort.objects.all() +@register_model_view(FrontPort, 'bulk_delete', path='delete', detail=False) class FrontPortBulkDeleteView(generic.BulkDeleteView): queryset = FrontPort.objects.all() filterset = filtersets.FrontPortFilterSet @@ -2781,6 +2894,7 @@ register_model_view(FrontPort, 'trace', kwargs={'model': FrontPort})(PathTraceVi # Rear ports # +@register_model_view(RearPort, 'list', path='', detail=False) class RearPortListView(generic.ObjectListView): queryset = RearPort.objects.all() filterset = filtersets.RearPortFilterSet @@ -2798,6 +2912,7 @@ class RearPortView(generic.ObjectView): queryset = RearPort.objects.all() +@register_model_view(RearPort, 'add', detail=False) class RearPortCreateView(generic.ComponentCreateView): queryset = RearPort.objects.all() form = forms.RearPortCreateForm @@ -2815,11 +2930,13 @@ class RearPortDeleteView(generic.ObjectDeleteView): queryset = RearPort.objects.all() +@register_model_view(RearPort, 'import', detail=False) class RearPortBulkImportView(generic.BulkImportView): queryset = RearPort.objects.all() model_form = forms.RearPortImportForm +@register_model_view(RearPort, 'bulk_edit', path='edit', detail=False) class RearPortBulkEditView(generic.BulkEditView): queryset = RearPort.objects.all() filterset = filtersets.RearPortFilterSet @@ -2827,14 +2944,17 @@ class RearPortBulkEditView(generic.BulkEditView): form = forms.RearPortBulkEditForm +@register_model_view(RearPort, 'bulk_rename', path='rename', detail=False) class RearPortBulkRenameView(generic.BulkRenameView): queryset = RearPort.objects.all() +@register_model_view(RearPort, 'bulk_disconnect', path='disconnect', detail=False) class RearPortBulkDisconnectView(BulkDisconnectView): queryset = RearPort.objects.all() +@register_model_view(RearPort, 'bulk_delete', path='delete', detail=False) class RearPortBulkDeleteView(generic.BulkDeleteView): queryset = RearPort.objects.all() filterset = filtersets.RearPortFilterSet @@ -2849,6 +2969,7 @@ register_model_view(RearPort, 'trace', kwargs={'model': RearPort})(PathTraceView # Module bays # +@register_model_view(ModuleBay, 'list', path='', detail=False) class ModuleBayListView(generic.ObjectListView): queryset = ModuleBay.objects.select_related('installed_module__module_type') filterset = filtersets.ModuleBayFilterSet @@ -2866,6 +2987,7 @@ class ModuleBayView(generic.ObjectView): queryset = ModuleBay.objects.all() +@register_model_view(ModuleBay, 'add', detail=False) class ModuleBayCreateView(generic.ComponentCreateView): queryset = ModuleBay.objects.all() form = forms.ModuleBayCreateForm @@ -2883,11 +3005,13 @@ class ModuleBayDeleteView(generic.ObjectDeleteView): queryset = ModuleBay.objects.all() +@register_model_view(ModuleBay, 'import', detail=False) class ModuleBayBulkImportView(generic.BulkImportView): queryset = ModuleBay.objects.all() model_form = forms.ModuleBayImportForm +@register_model_view(ModuleBay, 'bulk_edit', path='edit', detail=False) class ModuleBayBulkEditView(generic.BulkEditView): queryset = ModuleBay.objects.all() filterset = filtersets.ModuleBayFilterSet @@ -2895,10 +3019,12 @@ class ModuleBayBulkEditView(generic.BulkEditView): form = forms.ModuleBayBulkEditForm +@register_model_view(ModuleBay, 'bulk_rename', path='rename', detail=False) class ModuleBayBulkRenameView(generic.BulkRenameView): queryset = ModuleBay.objects.all() +@register_model_view(ModuleBay, 'bulk_delete', path='delete', detail=False) class ModuleBayBulkDeleteView(generic.BulkDeleteView): queryset = ModuleBay.objects.all() filterset = filtersets.ModuleBayFilterSet @@ -2909,6 +3035,7 @@ class ModuleBayBulkDeleteView(generic.BulkDeleteView): # Device bays # +@register_model_view(DeviceBay, 'list', path='', detail=False) class DeviceBayListView(generic.ObjectListView): queryset = DeviceBay.objects.all() filterset = filtersets.DeviceBayFilterSet @@ -2926,6 +3053,7 @@ class DeviceBayView(generic.ObjectView): queryset = DeviceBay.objects.all() +@register_model_view(DeviceBay, 'add', detail=False) class DeviceBayCreateView(generic.ComponentCreateView): queryset = DeviceBay.objects.all() form = forms.DeviceBayCreateForm @@ -3024,11 +3152,13 @@ class DeviceBayDepopulateView(generic.ObjectEditView): }) +@register_model_view(DeviceBay, 'import', detail=False) class DeviceBayBulkImportView(generic.BulkImportView): queryset = DeviceBay.objects.all() model_form = forms.DeviceBayImportForm +@register_model_view(DeviceBay, 'bulk_edit', path='edit', detail=False) class DeviceBayBulkEditView(generic.BulkEditView): queryset = DeviceBay.objects.all() filterset = filtersets.DeviceBayFilterSet @@ -3036,10 +3166,12 @@ class DeviceBayBulkEditView(generic.BulkEditView): form = forms.DeviceBayBulkEditForm +@register_model_view(DeviceBay, 'bulk_rename', path='rename', detail=False) class DeviceBayBulkRenameView(generic.BulkRenameView): queryset = DeviceBay.objects.all() +@register_model_view(DeviceBay, 'bulk_delete', path='delete', detail=False) class DeviceBayBulkDeleteView(generic.BulkDeleteView): queryset = DeviceBay.objects.all() filterset = filtersets.DeviceBayFilterSet @@ -3050,6 +3182,7 @@ class DeviceBayBulkDeleteView(generic.BulkDeleteView): # Inventory items # +@register_model_view(InventoryItem, 'list', path='', detail=False) class InventoryItemListView(generic.ObjectListView): queryset = InventoryItem.objects.all() filterset = filtersets.InventoryItemFilterSet @@ -3073,6 +3206,7 @@ class InventoryItemEditView(generic.ObjectEditView): form = forms.InventoryItemForm +@register_model_view(InventoryItem, 'add', detail=False) class InventoryItemCreateView(generic.ComponentCreateView): queryset = InventoryItem.objects.all() form = forms.InventoryItemCreateForm @@ -3084,11 +3218,13 @@ class InventoryItemDeleteView(generic.ObjectDeleteView): queryset = InventoryItem.objects.all() +@register_model_view(InventoryItem, 'import', detail=False) class InventoryItemBulkImportView(generic.BulkImportView): queryset = InventoryItem.objects.all() model_form = forms.InventoryItemImportForm +@register_model_view(InventoryItem, 'bulk_edit', path='edit', detail=False) class InventoryItemBulkEditView(generic.BulkEditView): queryset = InventoryItem.objects.all() filterset = filtersets.InventoryItemFilterSet @@ -3096,10 +3232,12 @@ class InventoryItemBulkEditView(generic.BulkEditView): form = forms.InventoryItemBulkEditForm +@register_model_view(InventoryItem, 'bulk_rename', path='rename', detail=False) class InventoryItemBulkRenameView(generic.BulkRenameView): queryset = InventoryItem.objects.all() +@register_model_view(InventoryItem, 'bulk_delete', path='delete', detail=False) class InventoryItemBulkDeleteView(generic.BulkDeleteView): queryset = InventoryItem.objects.all() filterset = filtersets.InventoryItemFilterSet @@ -3129,6 +3267,7 @@ class InventoryItemChildrenView(generic.ObjectChildrenView): # Inventory item roles # +@register_model_view(InventoryItemRole, 'list', path='', detail=False) class InventoryItemRoleListView(generic.ObjectListView): queryset = InventoryItemRole.objects.annotate( inventoryitem_count=count_related(InventoryItem, 'role'), @@ -3148,6 +3287,7 @@ class InventoryItemRoleView(generic.ObjectView): } +@register_model_view(InventoryItemRole, 'add', detail=False) @register_model_view(InventoryItemRole, 'edit') class InventoryItemRoleEditView(generic.ObjectEditView): queryset = InventoryItemRole.objects.all() @@ -3159,11 +3299,13 @@ class InventoryItemRoleDeleteView(generic.ObjectDeleteView): queryset = InventoryItemRole.objects.all() +@register_model_view(InventoryItemRole, 'import', detail=False) class InventoryItemRoleBulkImportView(generic.BulkImportView): queryset = InventoryItemRole.objects.all() model_form = forms.InventoryItemRoleImportForm +@register_model_view(InventoryItemRole, 'bulk_edit', path='edit', detail=False) class InventoryItemRoleBulkEditView(generic.BulkEditView): queryset = InventoryItemRole.objects.annotate( inventoryitem_count=count_related(InventoryItem, 'role'), @@ -3173,6 +3315,7 @@ class InventoryItemRoleBulkEditView(generic.BulkEditView): form = forms.InventoryItemRoleBulkEditForm +@register_model_view(InventoryItemRole, 'bulk_delete', path='delete', detail=False) class InventoryItemRoleBulkDeleteView(generic.BulkDeleteView): queryset = InventoryItemRole.objects.annotate( inventoryitem_count=count_related(InventoryItem, 'role'), @@ -3240,17 +3383,6 @@ class DeviceBulkAddInterfaceView(generic.BulkComponentCreateView): default_return_url = 'dcim:device_list' -# class DeviceBulkAddFrontPortView(generic.BulkComponentCreateView): -# parent_model = Device -# parent_field = 'device' -# form = forms.FrontPortBulkCreateForm -# queryset = FrontPort.objects.all() -# model_form = forms.FrontPortForm -# filterset = filtersets.DeviceFilterSet -# table = tables.DeviceTable -# default_return_url = 'dcim:device_list' - - class DeviceBulkAddRearPortView(generic.BulkComponentCreateView): parent_model = Device parent_field = 'device' @@ -3299,6 +3431,7 @@ class DeviceBulkAddInventoryItemView(generic.BulkComponentCreateView): # Cables # +@register_model_view(Cable, 'list', path='', detail=False) class CableListView(generic.ObjectListView): queryset = Cable.objects.prefetch_related( 'terminations__termination', 'terminations___device', 'terminations___rack', 'terminations___location', @@ -3314,6 +3447,7 @@ class CableView(generic.ObjectView): queryset = Cable.objects.all() +@register_model_view(Cable, 'add', detail=False) @register_model_view(Cable, 'edit') class CableEditView(generic.ObjectEditView): queryset = Cable.objects.all() @@ -3361,11 +3495,13 @@ class CableDeleteView(generic.ObjectDeleteView): queryset = Cable.objects.all() +@register_model_view(Cable, 'import', detail=False) class CableBulkImportView(generic.BulkImportView): queryset = Cable.objects.all() model_form = forms.CableImportForm +@register_model_view(Cable, 'bulk_edit', path='edit', detail=False) class CableBulkEditView(generic.BulkEditView): queryset = Cable.objects.prefetch_related( 'terminations__termination', 'terminations___device', 'terminations___rack', 'terminations___location', @@ -3376,6 +3512,7 @@ class CableBulkEditView(generic.BulkEditView): form = forms.CableBulkEditForm +@register_model_view(Cable, 'bulk_delete', path='delete', detail=False) class CableBulkDeleteView(generic.BulkDeleteView): queryset = Cable.objects.prefetch_related( 'terminations__termination', 'terminations___device', 'terminations___rack', 'terminations___location', @@ -3441,6 +3578,7 @@ class InterfaceConnectionsListView(generic.ObjectListView): # Virtual chassis # +@register_model_view(VirtualChassis, 'list', path='', detail=False) class VirtualChassisListView(generic.ObjectListView): queryset = VirtualChassis.objects.all() table = tables.VirtualChassisTable @@ -3460,6 +3598,7 @@ class VirtualChassisView(generic.ObjectView): } +@register_model_view(VirtualChassis, 'add', detail=False) class VirtualChassisCreateView(generic.ObjectEditView): queryset = VirtualChassis.objects.all() form = forms.VirtualChassisCreateForm @@ -3655,11 +3794,13 @@ class VirtualChassisRemoveMemberView(ObjectPermissionRequiredMixin, GetReturnURL }) +@register_model_view(VirtualChassis, 'import', detail=False) class VirtualChassisBulkImportView(generic.BulkImportView): queryset = VirtualChassis.objects.all() model_form = forms.VirtualChassisImportForm +@register_model_view(VirtualChassis, 'bulk_edit', path='edit', detail=False) class VirtualChassisBulkEditView(generic.BulkEditView): queryset = VirtualChassis.objects.all() filterset = filtersets.VirtualChassisFilterSet @@ -3667,6 +3808,7 @@ class VirtualChassisBulkEditView(generic.BulkEditView): form = forms.VirtualChassisBulkEditForm +@register_model_view(VirtualChassis, 'bulk_delete', path='delete', detail=False) class VirtualChassisBulkDeleteView(generic.BulkDeleteView): queryset = VirtualChassis.objects.all() filterset = filtersets.VirtualChassisFilterSet @@ -3677,6 +3819,7 @@ class VirtualChassisBulkDeleteView(generic.BulkDeleteView): # Power panels # +@register_model_view(PowerPanel, 'list', path='', detail=False) class PowerPanelListView(generic.ObjectListView): queryset = PowerPanel.objects.annotate( powerfeed_count=count_related(PowerFeed, 'power_panel') @@ -3696,6 +3839,7 @@ class PowerPanelView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(PowerPanel, 'add', detail=False) @register_model_view(PowerPanel, 'edit') class PowerPanelEditView(generic.ObjectEditView): queryset = PowerPanel.objects.all() @@ -3707,11 +3851,13 @@ class PowerPanelDeleteView(generic.ObjectDeleteView): queryset = PowerPanel.objects.all() +@register_model_view(PowerPanel, 'import', detail=False) class PowerPanelBulkImportView(generic.BulkImportView): queryset = PowerPanel.objects.all() model_form = forms.PowerPanelImportForm +@register_model_view(PowerPanel, 'bulk_edit', path='edit', detail=False) class PowerPanelBulkEditView(generic.BulkEditView): queryset = PowerPanel.objects.all() filterset = filtersets.PowerPanelFilterSet @@ -3719,6 +3865,7 @@ class PowerPanelBulkEditView(generic.BulkEditView): form = forms.PowerPanelBulkEditForm +@register_model_view(PowerPanel, 'bulk_delete', path='delete', detail=False) class PowerPanelBulkDeleteView(generic.BulkDeleteView): queryset = PowerPanel.objects.annotate( powerfeed_count=count_related(PowerFeed, 'power_panel') @@ -3736,6 +3883,7 @@ class PowerPanelContactsView(ObjectContactsView): # Power feeds # +@register_model_view(PowerFeed, 'list', path='', detail=False) class PowerFeedListView(generic.ObjectListView): queryset = PowerFeed.objects.all() filterset = filtersets.PowerFeedFilterSet @@ -3748,6 +3896,7 @@ class PowerFeedView(generic.ObjectView): queryset = PowerFeed.objects.all() +@register_model_view(PowerFeed, 'add', detail=False) @register_model_view(PowerFeed, 'edit') class PowerFeedEditView(generic.ObjectEditView): queryset = PowerFeed.objects.all() @@ -3759,11 +3908,13 @@ class PowerFeedDeleteView(generic.ObjectDeleteView): queryset = PowerFeed.objects.all() +@register_model_view(PowerFeed, 'import', detail=False) class PowerFeedBulkImportView(generic.BulkImportView): queryset = PowerFeed.objects.all() model_form = forms.PowerFeedImportForm +@register_model_view(PowerFeed, 'bulk_edit', path='edit', detail=False) class PowerFeedBulkEditView(generic.BulkEditView): queryset = PowerFeed.objects.all() filterset = filtersets.PowerFeedFilterSet @@ -3771,10 +3922,12 @@ class PowerFeedBulkEditView(generic.BulkEditView): form = forms.PowerFeedBulkEditForm +@register_model_view(PowerFeed, 'bulk_disconnect', path='disconnect', detail=False) class PowerFeedBulkDisconnectView(BulkDisconnectView): queryset = PowerFeed.objects.all() +@register_model_view(PowerFeed, 'bulk_delete', path='delete', detail=False) class PowerFeedBulkDeleteView(generic.BulkDeleteView): queryset = PowerFeed.objects.all() filterset = filtersets.PowerFeedFilterSet @@ -3785,7 +3938,11 @@ class PowerFeedBulkDeleteView(generic.BulkDeleteView): register_model_view(PowerFeed, 'trace', kwargs={'model': PowerFeed})(PathTraceView) -# VDC +# +# Virtual device contexts +# + +@register_model_view(VirtualDeviceContext, 'list', path='', detail=False) class VirtualDeviceContextListView(generic.ObjectListView): queryset = VirtualDeviceContext.objects.annotate( interface_count=count_related(Interface, 'vdcs'), @@ -3811,6 +3968,7 @@ class VirtualDeviceContextView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(VirtualDeviceContext, 'add', detail=False) @register_model_view(VirtualDeviceContext, 'edit') class VirtualDeviceContextEditView(generic.ObjectEditView): queryset = VirtualDeviceContext.objects.all() @@ -3822,11 +3980,13 @@ class VirtualDeviceContextDeleteView(generic.ObjectDeleteView): queryset = VirtualDeviceContext.objects.all() +@register_model_view(VirtualDeviceContext, 'import', detail=False) class VirtualDeviceContextBulkImportView(generic.BulkImportView): queryset = VirtualDeviceContext.objects.all() model_form = forms.VirtualDeviceContextImportForm +@register_model_view(VirtualDeviceContext, 'bulk_edit', path='edit', detail=False) class VirtualDeviceContextBulkEditView(generic.BulkEditView): queryset = VirtualDeviceContext.objects.all() filterset = filtersets.VirtualDeviceContextFilterSet @@ -3834,7 +3994,58 @@ class VirtualDeviceContextBulkEditView(generic.BulkEditView): form = forms.VirtualDeviceContextBulkEditForm +@register_model_view(VirtualDeviceContext, 'bulk_delete', path='delete', detail=False) class VirtualDeviceContextBulkDeleteView(generic.BulkDeleteView): queryset = VirtualDeviceContext.objects.all() filterset = filtersets.VirtualDeviceContextFilterSet table = tables.VirtualDeviceContextTable + + +# +# MAC addresses +# + +@register_model_view(MACAddress, 'list', path='', detail=False) +class MACAddressListView(generic.ObjectListView): + queryset = MACAddress.objects.all() + filterset = filtersets.MACAddressFilterSet + filterset_form = forms.MACAddressFilterForm + table = tables.MACAddressTable + + +@register_model_view(MACAddress) +class MACAddressView(generic.ObjectView): + queryset = MACAddress.objects.all() + + +@register_model_view(MACAddress, 'add', detail=False) +@register_model_view(MACAddress, 'edit') +class MACAddressEditView(generic.ObjectEditView): + queryset = MACAddress.objects.all() + form = forms.MACAddressForm + + +@register_model_view(MACAddress, 'delete') +class MACAddressDeleteView(generic.ObjectDeleteView): + queryset = MACAddress.objects.all() + + +@register_model_view(MACAddress, 'import', detail=False) +class MACAddressBulkImportView(generic.BulkImportView): + queryset = MACAddress.objects.all() + model_form = forms.MACAddressImportForm + + +@register_model_view(MACAddress, 'bulk_edit', path='edit', detail=False) +class MACAddressBulkEditView(generic.BulkEditView): + queryset = MACAddress.objects.all() + filterset = filtersets.MACAddressFilterSet + table = tables.MACAddressTable + form = forms.MACAddressBulkEditForm + + +@register_model_view(MACAddress, 'bulk_delete', path='delete', detail=False) +class MACAddressBulkDeleteView(generic.BulkDeleteView): + queryset = MACAddress.objects.all() + filterset = filtersets.MACAddressFilterSet + table = tables.MACAddressTable diff --git a/netbox/extras/urls.py b/netbox/extras/urls.py index b13af1db9..32633493f 100644 --- a/netbox/extras/urls.py +++ b/netbox/extras/urls.py @@ -7,128 +7,68 @@ from utilities.urls import get_model_urls app_name = 'extras' urlpatterns = [ - # Custom fields - path('custom-fields/', views.CustomFieldListView.as_view(), name='customfield_list'), - path('custom-fields/add/', views.CustomFieldEditView.as_view(), name='customfield_add'), - path('custom-fields/import/', views.CustomFieldBulkImportView.as_view(), name='customfield_import'), - path('custom-fields/edit/', views.CustomFieldBulkEditView.as_view(), name='customfield_bulk_edit'), - path('custom-fields/delete/', views.CustomFieldBulkDeleteView.as_view(), name='customfield_bulk_delete'), + path('custom-fields/', include(get_model_urls('extras', 'customfield', detail=False))), path('custom-fields//', include(get_model_urls('extras', 'customfield'))), - # Custom field choices - path('custom-field-choices/', views.CustomFieldChoiceSetListView.as_view(), name='customfieldchoiceset_list'), - path('custom-field-choices/add/', views.CustomFieldChoiceSetEditView.as_view(), name='customfieldchoiceset_add'), - path('custom-field-choices/import/', views.CustomFieldChoiceSetBulkImportView.as_view(), name='customfieldchoiceset_import'), - path('custom-field-choices/edit/', views.CustomFieldChoiceSetBulkEditView.as_view(), name='customfieldchoiceset_bulk_edit'), - path('custom-field-choices/delete/', views.CustomFieldChoiceSetBulkDeleteView.as_view(), name='customfieldchoiceset_bulk_delete'), + path('custom-field-choices/', include(get_model_urls('extras', 'customfieldchoiceset', detail=False))), path('custom-field-choices//', include(get_model_urls('extras', 'customfieldchoiceset'))), - # Custom links - path('custom-links/', views.CustomLinkListView.as_view(), name='customlink_list'), - path('custom-links/add/', views.CustomLinkEditView.as_view(), name='customlink_add'), - path('custom-links/import/', views.CustomLinkBulkImportView.as_view(), name='customlink_import'), - path('custom-links/edit/', views.CustomLinkBulkEditView.as_view(), name='customlink_bulk_edit'), - path('custom-links/delete/', views.CustomLinkBulkDeleteView.as_view(), name='customlink_bulk_delete'), + path('custom-links/', include(get_model_urls('extras', 'customlink', detail=False))), path('custom-links//', include(get_model_urls('extras', 'customlink'))), - # Export templates - path('export-templates/', views.ExportTemplateListView.as_view(), name='exporttemplate_list'), - path('export-templates/add/', views.ExportTemplateEditView.as_view(), name='exporttemplate_add'), - path('export-templates/import/', views.ExportTemplateBulkImportView.as_view(), name='exporttemplate_import'), - path('export-templates/edit/', views.ExportTemplateBulkEditView.as_view(), name='exporttemplate_bulk_edit'), - path('export-templates/delete/', views.ExportTemplateBulkDeleteView.as_view(), name='exporttemplate_bulk_delete'), - path('export-templates/sync/', views.ExportTemplateBulkSyncDataView.as_view(), name='exporttemplate_bulk_sync'), + path('export-templates/', include(get_model_urls('extras', 'exporttemplate', detail=False))), path('export-templates//', include(get_model_urls('extras', 'exporttemplate'))), - # Saved filters - path('saved-filters/', views.SavedFilterListView.as_view(), name='savedfilter_list'), - path('saved-filters/add/', views.SavedFilterEditView.as_view(), name='savedfilter_add'), - path('saved-filters/import/', views.SavedFilterBulkImportView.as_view(), name='savedfilter_import'), - path('saved-filters/edit/', views.SavedFilterBulkEditView.as_view(), name='savedfilter_bulk_edit'), - path('saved-filters/delete/', views.SavedFilterBulkDeleteView.as_view(), name='savedfilter_bulk_delete'), + path('saved-filters/', include(get_model_urls('extras', 'savedfilter', detail=False))), path('saved-filters//', include(get_model_urls('extras', 'savedfilter'))), - # Bookmarks - path('bookmarks/add/', views.BookmarkCreateView.as_view(), name='bookmark_add'), - path('bookmarks/delete/', views.BookmarkBulkDeleteView.as_view(), name='bookmark_bulk_delete'), + path('bookmarks/', include(get_model_urls('extras', 'bookmark', detail=False))), path('bookmarks//', include(get_model_urls('extras', 'bookmark'))), - # Notification groups - path('notification-groups/', views.NotificationGroupListView.as_view(), name='notificationgroup_list'), - path('notification-groups/add/', views.NotificationGroupEditView.as_view(), name='notificationgroup_add'), - path('notification-groups/import/', views.NotificationGroupBulkImportView.as_view(), name='notificationgroup_import'), - path('notification-groups/edit/', views.NotificationGroupBulkEditView.as_view(), name='notificationgroup_bulk_edit'), - path('notification-groups/delete/', views.NotificationGroupBulkDeleteView.as_view(), name='notificationgroup_bulk_delete'), + path('notification-groups/', include(get_model_urls('extras', 'notificationgroup', detail=False))), path('notification-groups//', include(get_model_urls('extras', 'notificationgroup'))), - # Notifications path('notifications/', views.NotificationsView.as_view(), name='notifications'), - path('notifications/delete/', views.NotificationBulkDeleteView.as_view(), name='notification_bulk_delete'), + path('notifications/', include(get_model_urls('extras', 'notification', detail=False))), path('notifications//', include(get_model_urls('extras', 'notification'))), - # Subscriptions - path('subscriptions/add/', views.SubscriptionCreateView.as_view(), name='subscription_add'), - path('subscriptions/delete/', views.SubscriptionBulkDeleteView.as_view(), name='subscription_bulk_delete'), + path('subscriptions/', include(get_model_urls('extras', 'subscription', detail=False))), path('subscriptions//', include(get_model_urls('extras', 'subscription'))), - # Webhooks - path('webhooks/', views.WebhookListView.as_view(), name='webhook_list'), - path('webhooks/add/', views.WebhookEditView.as_view(), name='webhook_add'), - path('webhooks/import/', views.WebhookBulkImportView.as_view(), name='webhook_import'), - path('webhooks/edit/', views.WebhookBulkEditView.as_view(), name='webhook_bulk_edit'), - path('webhooks/delete/', views.WebhookBulkDeleteView.as_view(), name='webhook_bulk_delete'), + path('webhooks/', include(get_model_urls('extras', 'webhook', detail=False))), path('webhooks//', include(get_model_urls('extras', 'webhook'))), - # Event rules - path('event-rules/', views.EventRuleListView.as_view(), name='eventrule_list'), - path('event-rules/add/', views.EventRuleEditView.as_view(), name='eventrule_add'), - path('event-rules/import/', views.EventRuleBulkImportView.as_view(), name='eventrule_import'), - path('event-rules/edit/', views.EventRuleBulkEditView.as_view(), name='eventrule_bulk_edit'), - path('event-rules/delete/', views.EventRuleBulkDeleteView.as_view(), name='eventrule_bulk_delete'), + path('event-rules/', include(get_model_urls('extras', 'eventrule', detail=False))), path('event-rules//', include(get_model_urls('extras', 'eventrule'))), - # Tags - path('tags/', views.TagListView.as_view(), name='tag_list'), - path('tags/add/', views.TagEditView.as_view(), name='tag_add'), - path('tags/import/', views.TagBulkImportView.as_view(), name='tag_import'), - path('tags/edit/', views.TagBulkEditView.as_view(), name='tag_bulk_edit'), - path('tags/delete/', views.TagBulkDeleteView.as_view(), name='tag_bulk_delete'), + path('tags/', include(get_model_urls('extras', 'tag', detail=False))), path('tags//', include(get_model_urls('extras', 'tag'))), - # Config contexts - path('config-contexts/', views.ConfigContextListView.as_view(), name='configcontext_list'), - path('config-contexts/add/', views.ConfigContextEditView.as_view(), name='configcontext_add'), - path('config-contexts/edit/', views.ConfigContextBulkEditView.as_view(), name='configcontext_bulk_edit'), - path('config-contexts/delete/', views.ConfigContextBulkDeleteView.as_view(), name='configcontext_bulk_delete'), - path('config-contexts/sync/', views.ConfigContextBulkSyncDataView.as_view(), name='configcontext_bulk_sync'), + path('config-contexts/', include(get_model_urls('extras', 'configcontext', detail=False))), path('config-contexts//', include(get_model_urls('extras', 'configcontext'))), - # Config templates - path('config-templates/', views.ConfigTemplateListView.as_view(), name='configtemplate_list'), - path('config-templates/add/', views.ConfigTemplateEditView.as_view(), name='configtemplate_add'), - path('config-templates/edit/', views.ConfigTemplateBulkEditView.as_view(), name='configtemplate_bulk_edit'), - path('config-templates/delete/', views.ConfigTemplateBulkDeleteView.as_view(), name='configtemplate_bulk_delete'), - path('config-templates/sync/', views.ConfigTemplateBulkSyncDataView.as_view(), name='configtemplate_bulk_sync'), + path('config-templates/', include(get_model_urls('extras', 'configtemplate', detail=False))), path('config-templates//', include(get_model_urls('extras', 'configtemplate'))), - # Image attachments - path('image-attachments/', views.ImageAttachmentListView.as_view(), name='imageattachment_list'), - path('image-attachments/add/', views.ImageAttachmentEditView.as_view(), name='imageattachment_add'), + path('image-attachments/', include(get_model_urls('extras', 'imageattachment', detail=False))), path('image-attachments//', include(get_model_urls('extras', 'imageattachment'))), - # Journal entries - path('journal-entries/', views.JournalEntryListView.as_view(), name='journalentry_list'), - path('journal-entries/add/', views.JournalEntryEditView.as_view(), name='journalentry_add'), - path('journal-entries/edit/', views.JournalEntryBulkEditView.as_view(), name='journalentry_bulk_edit'), - path('journal-entries/delete/', views.JournalEntryBulkDeleteView.as_view(), name='journalentry_bulk_delete'), - path('journal-entries/import/', views.JournalEntryBulkImportView.as_view(), name='journalentry_import'), + path('journal-entries/', include(get_model_urls('extras', 'journalentry', detail=False))), path('journal-entries//', include(get_model_urls('extras', 'journalentry'))), # User dashboard path('dashboard/reset/', views.DashboardResetView.as_view(), name='dashboard_reset'), path('dashboard/widgets/add/', views.DashboardWidgetAddView.as_view(), name='dashboardwidget_add'), - path('dashboard/widgets//configure/', views.DashboardWidgetConfigView.as_view(), name='dashboardwidget_config'), - path('dashboard/widgets//delete/', views.DashboardWidgetDeleteView.as_view(), name='dashboardwidget_delete'), + path( + 'dashboard/widgets//configure/', + views.DashboardWidgetConfigView.as_view(), + name='dashboardwidget_config' + ), + path( + 'dashboard/widgets//delete/', + views.DashboardWidgetDeleteView.as_view(), + name='dashboardwidget_delete' + ), # Scripts path('scripts/', views.ScriptListView.as_view(), name='script_list'), diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0d98b1324..286f3bab9 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -42,6 +42,7 @@ from .tables import ReportResultsTable, ScriptResultsTable # Custom fields # +@register_model_view(CustomField, 'list', path='', detail=False) class CustomFieldListView(generic.ObjectListView): queryset = CustomField.objects.select_related('choice_set') filterset = filtersets.CustomFieldFilterSet @@ -69,6 +70,7 @@ class CustomFieldView(generic.ObjectView): } +@register_model_view(CustomField, 'add', detail=False) @register_model_view(CustomField, 'edit') class CustomFieldEditView(generic.ObjectEditView): queryset = CustomField.objects.select_related('choice_set') @@ -80,11 +82,13 @@ class CustomFieldDeleteView(generic.ObjectDeleteView): queryset = CustomField.objects.select_related('choice_set') +@register_model_view(CustomField, 'import', detail=False) class CustomFieldBulkImportView(generic.BulkImportView): queryset = CustomField.objects.select_related('choice_set') model_form = forms.CustomFieldImportForm +@register_model_view(CustomField, 'bulk_edit', path='edit', detail=False) class CustomFieldBulkEditView(generic.BulkEditView): queryset = CustomField.objects.select_related('choice_set') filterset = filtersets.CustomFieldFilterSet @@ -92,6 +96,7 @@ class CustomFieldBulkEditView(generic.BulkEditView): form = forms.CustomFieldBulkEditForm +@register_model_view(CustomField, 'bulk_delete', path='delete', detail=False) class CustomFieldBulkDeleteView(generic.BulkDeleteView): queryset = CustomField.objects.select_related('choice_set') filterset = filtersets.CustomFieldFilterSet @@ -102,6 +107,7 @@ class CustomFieldBulkDeleteView(generic.BulkDeleteView): # Custom field choices # +@register_model_view(CustomFieldChoiceSet, 'list', path='', detail=False) class CustomFieldChoiceSetListView(generic.ObjectListView): queryset = CustomFieldChoiceSet.objects.all() filterset = filtersets.CustomFieldChoiceSetFilterSet @@ -133,6 +139,7 @@ class CustomFieldChoiceSetView(generic.ObjectView): } +@register_model_view(CustomFieldChoiceSet, 'add', detail=False) @register_model_view(CustomFieldChoiceSet, 'edit') class CustomFieldChoiceSetEditView(generic.ObjectEditView): queryset = CustomFieldChoiceSet.objects.all() @@ -144,11 +151,13 @@ class CustomFieldChoiceSetDeleteView(generic.ObjectDeleteView): queryset = CustomFieldChoiceSet.objects.all() +@register_model_view(CustomFieldChoiceSet, 'import', detail=False) class CustomFieldChoiceSetBulkImportView(generic.BulkImportView): queryset = CustomFieldChoiceSet.objects.all() model_form = forms.CustomFieldChoiceSetImportForm +@register_model_view(CustomFieldChoiceSet, 'bulk_edit', path='edit', detail=False) class CustomFieldChoiceSetBulkEditView(generic.BulkEditView): queryset = CustomFieldChoiceSet.objects.all() filterset = filtersets.CustomFieldChoiceSetFilterSet @@ -156,6 +165,7 @@ class CustomFieldChoiceSetBulkEditView(generic.BulkEditView): form = forms.CustomFieldChoiceSetBulkEditForm +@register_model_view(CustomFieldChoiceSet, 'bulk_delete', path='delete', detail=False) class CustomFieldChoiceSetBulkDeleteView(generic.BulkDeleteView): queryset = CustomFieldChoiceSet.objects.all() filterset = filtersets.CustomFieldChoiceSetFilterSet @@ -166,6 +176,7 @@ class CustomFieldChoiceSetBulkDeleteView(generic.BulkDeleteView): # Custom links # +@register_model_view(CustomLink, 'list', path='', detail=False) class CustomLinkListView(generic.ObjectListView): queryset = CustomLink.objects.all() filterset = filtersets.CustomLinkFilterSet @@ -178,6 +189,7 @@ class CustomLinkView(generic.ObjectView): queryset = CustomLink.objects.all() +@register_model_view(CustomLink, 'add', detail=False) @register_model_view(CustomLink, 'edit') class CustomLinkEditView(generic.ObjectEditView): queryset = CustomLink.objects.all() @@ -189,11 +201,13 @@ class CustomLinkDeleteView(generic.ObjectDeleteView): queryset = CustomLink.objects.all() +@register_model_view(CustomLink, 'import', detail=False) class CustomLinkBulkImportView(generic.BulkImportView): queryset = CustomLink.objects.all() model_form = forms.CustomLinkImportForm +@register_model_view(CustomLink, 'bulk_edit', path='edit', detail=False) class CustomLinkBulkEditView(generic.BulkEditView): queryset = CustomLink.objects.all() filterset = filtersets.CustomLinkFilterSet @@ -201,6 +215,7 @@ class CustomLinkBulkEditView(generic.BulkEditView): form = forms.CustomLinkBulkEditForm +@register_model_view(CustomLink, 'bulk_delete', path='delete', detail=False) class CustomLinkBulkDeleteView(generic.BulkDeleteView): queryset = CustomLink.objects.all() filterset = filtersets.CustomLinkFilterSet @@ -211,6 +226,7 @@ class CustomLinkBulkDeleteView(generic.BulkDeleteView): # Export templates # +@register_model_view(ExportTemplate, 'list', path='', detail=False) class ExportTemplateListView(generic.ObjectListView): queryset = ExportTemplate.objects.all() filterset = filtersets.ExportTemplateFilterSet @@ -228,6 +244,7 @@ class ExportTemplateView(generic.ObjectView): queryset = ExportTemplate.objects.all() +@register_model_view(ExportTemplate, 'add', detail=False) @register_model_view(ExportTemplate, 'edit') class ExportTemplateEditView(generic.ObjectEditView): queryset = ExportTemplate.objects.all() @@ -239,11 +256,13 @@ class ExportTemplateDeleteView(generic.ObjectDeleteView): queryset = ExportTemplate.objects.all() +@register_model_view(ExportTemplate, 'import', detail=False) class ExportTemplateBulkImportView(generic.BulkImportView): queryset = ExportTemplate.objects.all() model_form = forms.ExportTemplateImportForm +@register_model_view(ExportTemplate, 'bulk_edit', path='edit', detail=False) class ExportTemplateBulkEditView(generic.BulkEditView): queryset = ExportTemplate.objects.all() filterset = filtersets.ExportTemplateFilterSet @@ -251,12 +270,14 @@ class ExportTemplateBulkEditView(generic.BulkEditView): form = forms.ExportTemplateBulkEditForm +@register_model_view(ExportTemplate, 'bulk_delete', path='delete', detail=False) class ExportTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ExportTemplate.objects.all() filterset = filtersets.ExportTemplateFilterSet table = tables.ExportTemplateTable +@register_model_view(ExportTemplate, 'bulk_sync', path='sync', detail=False) class ExportTemplateBulkSyncDataView(generic.BulkSyncDataView): queryset = ExportTemplate.objects.all() @@ -283,6 +304,7 @@ class SavedFilterMixin: ) +@register_model_view(SavedFilter, 'list', path='', detail=False) class SavedFilterListView(SavedFilterMixin, generic.ObjectListView): filterset = filtersets.SavedFilterFilterSet filterset_form = forms.SavedFilterFilterForm @@ -294,6 +316,7 @@ class SavedFilterView(SavedFilterMixin, generic.ObjectView): queryset = SavedFilter.objects.all() +@register_model_view(SavedFilter, 'add', detail=False) @register_model_view(SavedFilter, 'edit') class SavedFilterEditView(SavedFilterMixin, generic.ObjectEditView): queryset = SavedFilter.objects.all() @@ -310,11 +333,13 @@ class SavedFilterDeleteView(SavedFilterMixin, generic.ObjectDeleteView): queryset = SavedFilter.objects.all() +@register_model_view(SavedFilter, 'import', detail=False) class SavedFilterBulkImportView(SavedFilterMixin, generic.BulkImportView): queryset = SavedFilter.objects.all() model_form = forms.SavedFilterImportForm +@register_model_view(SavedFilter, 'bulk_edit', path='edit', detail=False) class SavedFilterBulkEditView(SavedFilterMixin, generic.BulkEditView): queryset = SavedFilter.objects.all() filterset = filtersets.SavedFilterFilterSet @@ -322,6 +347,7 @@ class SavedFilterBulkEditView(SavedFilterMixin, generic.BulkEditView): form = forms.SavedFilterBulkEditForm +@register_model_view(SavedFilter, 'bulk_delete', path='delete', detail=False) class SavedFilterBulkDeleteView(SavedFilterMixin, generic.BulkDeleteView): queryset = SavedFilter.objects.all() filterset = filtersets.SavedFilterFilterSet @@ -332,6 +358,7 @@ class SavedFilterBulkDeleteView(SavedFilterMixin, generic.BulkDeleteView): # Bookmarks # +@register_model_view(Bookmark, 'add', detail=False) class BookmarkCreateView(generic.ObjectEditView): form = forms.BookmarkForm @@ -350,6 +377,7 @@ class BookmarkDeleteView(generic.ObjectDeleteView): return Bookmark.objects.filter(user=request.user) +@register_model_view(Bookmark, 'bulk_delete', path='delete', detail=False) class BookmarkBulkDeleteView(generic.BulkDeleteView): table = tables.BookmarkTable @@ -361,6 +389,7 @@ class BookmarkBulkDeleteView(generic.BulkDeleteView): # Notification groups # +@register_model_view(NotificationGroup, 'list', path='', detail=False) class NotificationGroupListView(generic.ObjectListView): queryset = NotificationGroup.objects.all() filterset = filtersets.NotificationGroupFilterSet @@ -373,6 +402,7 @@ class NotificationGroupView(generic.ObjectView): queryset = NotificationGroup.objects.all() +@register_model_view(NotificationGroup, 'add', detail=False) @register_model_view(NotificationGroup, 'edit') class NotificationGroupEditView(generic.ObjectEditView): queryset = NotificationGroup.objects.all() @@ -384,11 +414,13 @@ class NotificationGroupDeleteView(generic.ObjectDeleteView): queryset = NotificationGroup.objects.all() +@register_model_view(NotificationGroup, 'import', detail=False) class NotificationGroupBulkImportView(generic.BulkImportView): queryset = NotificationGroup.objects.all() model_form = forms.NotificationGroupImportForm +@register_model_view(NotificationGroup, 'bulk_edit', path='edit', detail=False) class NotificationGroupBulkEditView(generic.BulkEditView): queryset = NotificationGroup.objects.all() filterset = filtersets.NotificationGroupFilterSet @@ -396,6 +428,7 @@ class NotificationGroupBulkEditView(generic.BulkEditView): form = forms.NotificationGroupBulkEditForm +@register_model_view(NotificationGroup, 'bulk_delete', path='delete', detail=False) class NotificationGroupBulkDeleteView(generic.BulkDeleteView): queryset = NotificationGroup.objects.all() filterset = filtersets.NotificationGroupFilterSet @@ -459,6 +492,7 @@ class NotificationDeleteView(generic.ObjectDeleteView): return Notification.objects.filter(user=request.user) +@register_model_view(Notification, 'bulk_delete', path='delete', detail=False) class NotificationBulkDeleteView(generic.BulkDeleteView): table = tables.NotificationTable @@ -470,6 +504,7 @@ class NotificationBulkDeleteView(generic.BulkDeleteView): # Subscriptions # +@register_model_view(Subscription, 'add', detail=False) class SubscriptionCreateView(generic.ObjectEditView): form = forms.SubscriptionForm @@ -488,6 +523,7 @@ class SubscriptionDeleteView(generic.ObjectDeleteView): return Subscription.objects.filter(user=request.user) +@register_model_view(Subscription, 'bulk_delete', path='delete', detail=False) class SubscriptionBulkDeleteView(generic.BulkDeleteView): table = tables.SubscriptionTable @@ -499,6 +535,7 @@ class SubscriptionBulkDeleteView(generic.BulkDeleteView): # Webhooks # +@register_model_view(Webhook, 'list', path='', detail=False) class WebhookListView(generic.ObjectListView): queryset = Webhook.objects.all() filterset = filtersets.WebhookFilterSet @@ -511,6 +548,7 @@ class WebhookView(generic.ObjectView): queryset = Webhook.objects.all() +@register_model_view(Webhook, 'add', detail=False) @register_model_view(Webhook, 'edit') class WebhookEditView(generic.ObjectEditView): queryset = Webhook.objects.all() @@ -522,11 +560,13 @@ class WebhookDeleteView(generic.ObjectDeleteView): queryset = Webhook.objects.all() +@register_model_view(Webhook, 'import', detail=False) class WebhookBulkImportView(generic.BulkImportView): queryset = Webhook.objects.all() model_form = forms.WebhookImportForm +@register_model_view(Webhook, 'bulk_edit', path='edit', detail=False) class WebhookBulkEditView(generic.BulkEditView): queryset = Webhook.objects.all() filterset = filtersets.WebhookFilterSet @@ -534,6 +574,7 @@ class WebhookBulkEditView(generic.BulkEditView): form = forms.WebhookBulkEditForm +@register_model_view(Webhook, 'bulk_delete', path='delete', detail=False) class WebhookBulkDeleteView(generic.BulkDeleteView): queryset = Webhook.objects.all() filterset = filtersets.WebhookFilterSet @@ -544,6 +585,7 @@ class WebhookBulkDeleteView(generic.BulkDeleteView): # Event Rules # +@register_model_view(EventRule, 'list', path='', detail=False) class EventRuleListView(generic.ObjectListView): queryset = EventRule.objects.all() filterset = filtersets.EventRuleFilterSet @@ -556,6 +598,7 @@ class EventRuleView(generic.ObjectView): queryset = EventRule.objects.all() +@register_model_view(EventRule, 'add', detail=False) @register_model_view(EventRule, 'edit') class EventRuleEditView(generic.ObjectEditView): queryset = EventRule.objects.all() @@ -567,11 +610,13 @@ class EventRuleDeleteView(generic.ObjectDeleteView): queryset = EventRule.objects.all() +@register_model_view(EventRule, 'import', detail=False) class EventRuleBulkImportView(generic.BulkImportView): queryset = EventRule.objects.all() model_form = forms.EventRuleImportForm +@register_model_view(EventRule, 'bulk_edit', path='edit', detail=False) class EventRuleBulkEditView(generic.BulkEditView): queryset = EventRule.objects.all() filterset = filtersets.EventRuleFilterSet @@ -579,6 +624,7 @@ class EventRuleBulkEditView(generic.BulkEditView): form = forms.EventRuleBulkEditForm +@register_model_view(EventRule, 'bulk_delete', path='delete', detail=False) class EventRuleBulkDeleteView(generic.BulkDeleteView): queryset = EventRule.objects.all() filterset = filtersets.EventRuleFilterSet @@ -589,6 +635,7 @@ class EventRuleBulkDeleteView(generic.BulkDeleteView): # Tags # +@register_model_view(Tag, 'list', path='', detail=False) class TagListView(generic.ObjectListView): queryset = Tag.objects.annotate( items=count_related(TaggedItem, 'tag') @@ -624,6 +671,7 @@ class TagView(generic.ObjectView): } +@register_model_view(Tag, 'add', detail=False) @register_model_view(Tag, 'edit') class TagEditView(generic.ObjectEditView): queryset = Tag.objects.all() @@ -635,11 +683,13 @@ class TagDeleteView(generic.ObjectDeleteView): queryset = Tag.objects.all() +@register_model_view(Tag, 'import', detail=False) class TagBulkImportView(generic.BulkImportView): queryset = Tag.objects.all() model_form = forms.TagImportForm +@register_model_view(Tag, 'bulk_edit', path='edit', detail=False) class TagBulkEditView(generic.BulkEditView): queryset = Tag.objects.annotate( items=count_related(TaggedItem, 'tag') @@ -648,6 +698,7 @@ class TagBulkEditView(generic.BulkEditView): form = forms.TagBulkEditForm +@register_model_view(Tag, 'bulk_delete', path='delete', detail=False) class TagBulkDeleteView(generic.BulkDeleteView): queryset = Tag.objects.annotate( items=count_related(TaggedItem, 'tag') @@ -659,6 +710,7 @@ class TagBulkDeleteView(generic.BulkDeleteView): # Config contexts # +@register_model_view(ConfigContext, 'list', path='', detail=False) class ConfigContextListView(generic.ObjectListView): queryset = ConfigContext.objects.all() filterset = filtersets.ConfigContextFilterSet @@ -711,30 +763,34 @@ class ConfigContextView(generic.ObjectView): } +@register_model_view(ConfigContext, 'add', detail=False) @register_model_view(ConfigContext, 'edit') class ConfigContextEditView(generic.ObjectEditView): queryset = ConfigContext.objects.all() form = forms.ConfigContextForm -class ConfigContextBulkEditView(generic.BulkEditView): - queryset = ConfigContext.objects.all() - filterset = filtersets.ConfigContextFilterSet - table = tables.ConfigContextTable - form = forms.ConfigContextBulkEditForm - - @register_model_view(ConfigContext, 'delete') class ConfigContextDeleteView(generic.ObjectDeleteView): queryset = ConfigContext.objects.all() +@register_model_view(ConfigContext, 'bulk_edit', path='edit', detail=False) +class ConfigContextBulkEditView(generic.BulkEditView): + queryset = ConfigContext.objects.all() + filterset = filtersets.ConfigContextFilterSet + table = tables.ConfigContextTable + form = forms.ConfigContextBulkEditForm + + +@register_model_view(ConfigContext, 'bulk_delete', path='delete', detail=False) class ConfigContextBulkDeleteView(generic.BulkDeleteView): queryset = ConfigContext.objects.all() filterset = filtersets.ConfigContextFilterSet table = tables.ConfigContextTable +@register_model_view(ConfigContext, 'bulk_sync', path='sync', detail=False) class ConfigContextBulkSyncDataView(generic.BulkSyncDataView): queryset = ConfigContext.objects.all() @@ -768,6 +824,7 @@ class ObjectConfigContextView(generic.ObjectView): # Config templates # +@register_model_view(ConfigTemplate, 'list', path='', detail=False) class ConfigTemplateListView(generic.ObjectListView): queryset = ConfigTemplate.objects.annotate( device_count=count_related(Device, 'config_template'), @@ -790,6 +847,7 @@ class ConfigTemplateView(generic.ObjectView): queryset = ConfigTemplate.objects.all() +@register_model_view(ConfigTemplate, 'add', detail=False) @register_model_view(ConfigTemplate, 'edit') class ConfigTemplateEditView(generic.ObjectEditView): queryset = ConfigTemplate.objects.all() @@ -801,11 +859,13 @@ class ConfigTemplateDeleteView(generic.ObjectDeleteView): queryset = ConfigTemplate.objects.all() +@register_model_view(ConfigTemplate, 'import', detail=False) class ConfigTemplateBulkImportView(generic.BulkImportView): queryset = ConfigTemplate.objects.all() model_form = forms.ConfigTemplateImportForm +@register_model_view(ConfigTemplate, 'bulk_edit', path='edit', detail=False) class ConfigTemplateBulkEditView(generic.BulkEditView): queryset = ConfigTemplate.objects.all() filterset = filtersets.ConfigTemplateFilterSet @@ -813,12 +873,14 @@ class ConfigTemplateBulkEditView(generic.BulkEditView): form = forms.ConfigTemplateBulkEditForm +@register_model_view(ConfigTemplate, 'bulk_delete', path='delete', detail=False) class ConfigTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ConfigTemplate.objects.all() filterset = filtersets.ConfigTemplateFilterSet table = tables.ConfigTemplateTable +@register_model_view(ConfigTemplate, 'bulk_sync', path='sync', detail=False) class ConfigTemplateBulkSyncDataView(generic.BulkSyncDataView): queryset = ConfigTemplate.objects.all() @@ -827,6 +889,7 @@ class ConfigTemplateBulkSyncDataView(generic.BulkSyncDataView): # Image attachments # +@register_model_view(ImageAttachment, 'list', path='', detail=False) class ImageAttachmentListView(generic.ObjectListView): queryset = ImageAttachment.objects.all() filterset = filtersets.ImageAttachmentFilterSet @@ -837,6 +900,7 @@ class ImageAttachmentListView(generic.ObjectListView): } +@register_model_view(ImageAttachment, 'add', detail=False) @register_model_view(ImageAttachment, 'edit') class ImageAttachmentEditView(generic.ObjectEditView): queryset = ImageAttachment.objects.all() @@ -871,6 +935,7 @@ class ImageAttachmentDeleteView(generic.ObjectDeleteView): # Journal entries # +@register_model_view(JournalEntry, 'list', path='', detail=False) class JournalEntryListView(generic.ObjectListView): queryset = JournalEntry.objects.all() filterset = filtersets.JournalEntryFilterSet @@ -889,6 +954,7 @@ class JournalEntryView(generic.ObjectView): queryset = JournalEntry.objects.all() +@register_model_view(JournalEntry, 'add', detail=False) @register_model_view(JournalEntry, 'edit') class JournalEntryEditView(generic.ObjectEditView): queryset = JournalEntry.objects.all() @@ -917,6 +983,13 @@ class JournalEntryDeleteView(generic.ObjectDeleteView): return reverse(viewname, kwargs={'pk': obj.pk}) +@register_model_view(JournalEntry, 'import', detail=False) +class JournalEntryBulkImportView(generic.BulkImportView): + queryset = JournalEntry.objects.all() + model_form = forms.JournalEntryImportForm + + +@register_model_view(JournalEntry, 'bulk_edit', path='edit', detail=False) class JournalEntryBulkEditView(generic.BulkEditView): queryset = JournalEntry.objects.all() filterset = filtersets.JournalEntryFilterSet @@ -924,17 +997,13 @@ class JournalEntryBulkEditView(generic.BulkEditView): form = forms.JournalEntryBulkEditForm +@register_model_view(JournalEntry, 'bulk_delete', path='delete', detail=False) class JournalEntryBulkDeleteView(generic.BulkDeleteView): queryset = JournalEntry.objects.all() filterset = filtersets.JournalEntryFilterSet table = tables.JournalEntryTable -class JournalEntryBulkImportView(generic.BulkImportView): - queryset = JournalEntry.objects.all() - model_form = forms.JournalEntryImportForm - - # # Dashboard & widgets # diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index d40f9c5dc..c55e874a1 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -1,150 +1,62 @@ from django.urls import include, path from utilities.urls import get_model_urls -from . import views +from . import views # noqa F401 app_name = 'ipam' urlpatterns = [ - # ASN ranges - path('asn-ranges/', views.ASNRangeListView.as_view(), name='asnrange_list'), - path('asn-ranges/add/', views.ASNRangeEditView.as_view(), name='asnrange_add'), - path('asn-ranges/import/', views.ASNRangeBulkImportView.as_view(), name='asnrange_import'), - path('asn-ranges/edit/', views.ASNRangeBulkEditView.as_view(), name='asnrange_bulk_edit'), - path('asn-ranges/delete/', views.ASNRangeBulkDeleteView.as_view(), name='asnrange_bulk_delete'), + path('asn-ranges/', include(get_model_urls('ipam', 'asnrange', detail=False))), path('asn-ranges//', include(get_model_urls('ipam', 'asnrange'))), - # ASNs - path('asns/', views.ASNListView.as_view(), name='asn_list'), - path('asns/add/', views.ASNEditView.as_view(), name='asn_add'), - path('asns/import/', views.ASNBulkImportView.as_view(), name='asn_import'), - path('asns/edit/', views.ASNBulkEditView.as_view(), name='asn_bulk_edit'), - path('asns/delete/', views.ASNBulkDeleteView.as_view(), name='asn_bulk_delete'), + path('asns/', include(get_model_urls('ipam', 'asn', detail=False))), path('asns//', include(get_model_urls('ipam', 'asn'))), - # VRFs - path('vrfs/', views.VRFListView.as_view(), name='vrf_list'), - path('vrfs/add/', views.VRFEditView.as_view(), name='vrf_add'), - path('vrfs/import/', views.VRFBulkImportView.as_view(), name='vrf_import'), - path('vrfs/edit/', views.VRFBulkEditView.as_view(), name='vrf_bulk_edit'), - path('vrfs/delete/', views.VRFBulkDeleteView.as_view(), name='vrf_bulk_delete'), + path('vrfs/', include(get_model_urls('ipam', 'vrf', detail=False))), path('vrfs//', include(get_model_urls('ipam', 'vrf'))), - # Route targets - path('route-targets/', views.RouteTargetListView.as_view(), name='routetarget_list'), - path('route-targets/add/', views.RouteTargetEditView.as_view(), name='routetarget_add'), - path('route-targets/import/', views.RouteTargetBulkImportView.as_view(), name='routetarget_import'), - path('route-targets/edit/', views.RouteTargetBulkEditView.as_view(), name='routetarget_bulk_edit'), - path('route-targets/delete/', views.RouteTargetBulkDeleteView.as_view(), name='routetarget_bulk_delete'), + path('route-targets/', include(get_model_urls('ipam', 'routetarget', detail=False))), path('route-targets//', include(get_model_urls('ipam', 'routetarget'))), - # RIRs - path('rirs/', views.RIRListView.as_view(), name='rir_list'), - path('rirs/add/', views.RIREditView.as_view(), name='rir_add'), - path('rirs/import/', views.RIRBulkImportView.as_view(), name='rir_import'), - path('rirs/edit/', views.RIRBulkEditView.as_view(), name='rir_bulk_edit'), - path('rirs/delete/', views.RIRBulkDeleteView.as_view(), name='rir_bulk_delete'), + path('rirs/', include(get_model_urls('ipam', 'rir', detail=False))), path('rirs//', include(get_model_urls('ipam', 'rir'))), - # Aggregates - path('aggregates/', views.AggregateListView.as_view(), name='aggregate_list'), - path('aggregates/add/', views.AggregateEditView.as_view(), name='aggregate_add'), - path('aggregates/import/', views.AggregateBulkImportView.as_view(), name='aggregate_import'), - path('aggregates/edit/', views.AggregateBulkEditView.as_view(), name='aggregate_bulk_edit'), - path('aggregates/delete/', views.AggregateBulkDeleteView.as_view(), name='aggregate_bulk_delete'), + path('aggregates/', include(get_model_urls('ipam', 'aggregate', detail=False))), path('aggregates//', include(get_model_urls('ipam', 'aggregate'))), - # Roles - path('roles/', views.RoleListView.as_view(), name='role_list'), - path('roles/add/', views.RoleEditView.as_view(), name='role_add'), - path('roles/import/', views.RoleBulkImportView.as_view(), name='role_import'), - path('roles/edit/', views.RoleBulkEditView.as_view(), name='role_bulk_edit'), - path('roles/delete/', views.RoleBulkDeleteView.as_view(), name='role_bulk_delete'), + path('roles/', include(get_model_urls('ipam', 'role', detail=False))), path('roles//', include(get_model_urls('ipam', 'role'))), - # Prefixes - path('prefixes/', views.PrefixListView.as_view(), name='prefix_list'), - path('prefixes/add/', views.PrefixEditView.as_view(), name='prefix_add'), - path('prefixes/import/', views.PrefixBulkImportView.as_view(), name='prefix_import'), - path('prefixes/edit/', views.PrefixBulkEditView.as_view(), name='prefix_bulk_edit'), - path('prefixes/delete/', views.PrefixBulkDeleteView.as_view(), name='prefix_bulk_delete'), + path('prefixes/', include(get_model_urls('ipam', 'prefix', detail=False))), path('prefixes//', include(get_model_urls('ipam', 'prefix'))), - # IP ranges - path('ip-ranges/', views.IPRangeListView.as_view(), name='iprange_list'), - path('ip-ranges/add/', views.IPRangeEditView.as_view(), name='iprange_add'), - path('ip-ranges/import/', views.IPRangeBulkImportView.as_view(), name='iprange_import'), - path('ip-ranges/edit/', views.IPRangeBulkEditView.as_view(), name='iprange_bulk_edit'), - path('ip-ranges/delete/', views.IPRangeBulkDeleteView.as_view(), name='iprange_bulk_delete'), + path('ip-ranges/', include(get_model_urls('ipam', 'iprange', detail=False))), path('ip-ranges//', include(get_model_urls('ipam', 'iprange'))), - # IP addresses - path('ip-addresses/', views.IPAddressListView.as_view(), name='ipaddress_list'), - path('ip-addresses/add/', views.IPAddressEditView.as_view(), name='ipaddress_add'), - path('ip-addresses/bulk-add/', views.IPAddressBulkCreateView.as_view(), name='ipaddress_bulk_add'), - path('ip-addresses/import/', views.IPAddressBulkImportView.as_view(), name='ipaddress_import'), - path('ip-addresses/edit/', views.IPAddressBulkEditView.as_view(), name='ipaddress_bulk_edit'), - path('ip-addresses/delete/', views.IPAddressBulkDeleteView.as_view(), name='ipaddress_bulk_delete'), - path('ip-addresses/assign/', views.IPAddressAssignView.as_view(), name='ipaddress_assign'), + path('ip-addresses/', include(get_model_urls('ipam', 'ipaddress', detail=False))), path('ip-addresses//', include(get_model_urls('ipam', 'ipaddress'))), - # FHRP groups - path('fhrp-groups/', views.FHRPGroupListView.as_view(), name='fhrpgroup_list'), - path('fhrp-groups/add/', views.FHRPGroupEditView.as_view(), name='fhrpgroup_add'), - path('fhrp-groups/import/', views.FHRPGroupBulkImportView.as_view(), name='fhrpgroup_import'), - path('fhrp-groups/edit/', views.FHRPGroupBulkEditView.as_view(), name='fhrpgroup_bulk_edit'), - path('fhrp-groups/delete/', views.FHRPGroupBulkDeleteView.as_view(), name='fhrpgroup_bulk_delete'), + path('fhrp-groups/', include(get_model_urls('ipam', 'fhrpgroup', detail=False))), path('fhrp-groups//', include(get_model_urls('ipam', 'fhrpgroup'))), - # FHRP group assignments - path('fhrp-group-assignments/add/', views.FHRPGroupAssignmentEditView.as_view(), name='fhrpgroupassignment_add'), + path('fhrp-group-assignments/', include(get_model_urls('ipam', 'fhrpgroupassignment', detail=False))), path('fhrp-group-assignments//', include(get_model_urls('ipam', 'fhrpgroupassignment'))), - # VLAN groups - path('vlan-groups/', views.VLANGroupListView.as_view(), name='vlangroup_list'), - path('vlan-groups/add/', views.VLANGroupEditView.as_view(), name='vlangroup_add'), - path('vlan-groups/import/', views.VLANGroupBulkImportView.as_view(), name='vlangroup_import'), - path('vlan-groups/edit/', views.VLANGroupBulkEditView.as_view(), name='vlangroup_bulk_edit'), - path('vlan-groups/delete/', views.VLANGroupBulkDeleteView.as_view(), name='vlangroup_bulk_delete'), + path('vlan-groups/', include(get_model_urls('ipam', 'vlangroup', detail=False))), path('vlan-groups//', include(get_model_urls('ipam', 'vlangroup'))), - # VLANs - path('vlans/', views.VLANListView.as_view(), name='vlan_list'), - path('vlans/add/', views.VLANEditView.as_view(), name='vlan_add'), - path('vlans/import/', views.VLANBulkImportView.as_view(), name='vlan_import'), - path('vlans/edit/', views.VLANBulkEditView.as_view(), name='vlan_bulk_edit'), - path('vlans/delete/', views.VLANBulkDeleteView.as_view(), name='vlan_bulk_delete'), + path('vlans/', include(get_model_urls('ipam', 'vlan', detail=False))), path('vlans//', include(get_model_urls('ipam', 'vlan'))), - # VLAN Translation Policies - path('vlan-translation-policies/', views.VLANTranslationPolicyListView.as_view(), name='vlantranslationpolicy_list'), - path('vlan-translation-policies/add/', views.VLANTranslationPolicyEditView.as_view(), name='vlantranslationpolicy_add'), - path('vlan-translation-policies/import/', views.VLANTranslationPolicyBulkImportView.as_view(), name='vlantranslationpolicy_import'), - path('vlan-translation-policies/edit/', views.VLANTranslationPolicyBulkEditView.as_view(), name='vlantranslationpolicy_bulk_edit'), - path('vlan-translation-policies/delete/', views.VLANTranslationPolicyBulkDeleteView.as_view(), name='vlantranslationpolicy_bulk_delete'), + path('vlan-translation-policies/', include(get_model_urls('ipam', 'vlantranslationpolicy', detail=False))), path('vlan-translation-policies//', include(get_model_urls('ipam', 'vlantranslationpolicy'))), - # VLAN Translation Rules - path('vlan-translation-rules/', views.VLANTranslationRuleListView.as_view(), name='vlantranslationrule_list'), - path('vlan-translation-rules/add/', views.VLANTranslationRuleEditView.as_view(), name='vlantranslationrule_add'), - path('vlan-translation-rules/import/', views.VLANTranslationRuleBulkImportView.as_view(), name='vlantranslationrule_import'), - path('vlan-translation-rules/edit/', views.VLANTranslationRuleBulkEditView.as_view(), name='vlantranslationrule_bulk_edit'), - path('vlan-translation-rules/delete/', views.VLANTranslationRuleBulkDeleteView.as_view(), name='vlantranslationrule_bulk_delete'), + path('vlan-translation-rules/', include(get_model_urls('ipam', 'vlantranslationrule', detail=False))), path('vlan-translation-rules//', include(get_model_urls('ipam', 'vlantranslationrule'))), - # Service templates - path('service-templates/', views.ServiceTemplateListView.as_view(), name='servicetemplate_list'), - path('service-templates/add/', views.ServiceTemplateEditView.as_view(), name='servicetemplate_add'), - path('service-templates/import/', views.ServiceTemplateBulkImportView.as_view(), name='servicetemplate_import'), - path('service-templates/edit/', views.ServiceTemplateBulkEditView.as_view(), name='servicetemplate_bulk_edit'), - path('service-templates/delete/', views.ServiceTemplateBulkDeleteView.as_view(), name='servicetemplate_bulk_delete'), + path('service-templates/', include(get_model_urls('ipam', 'servicetemplate', detail=False))), path('service-templates//', include(get_model_urls('ipam', 'servicetemplate'))), - # Services - path('services/', views.ServiceListView.as_view(), name='service_list'), - path('services/add/', views.ServiceCreateView.as_view(), name='service_add'), - path('services/import/', views.ServiceBulkImportView.as_view(), name='service_import'), - path('services/edit/', views.ServiceBulkEditView.as_view(), name='service_bulk_edit'), - path('services/delete/', views.ServiceBulkDeleteView.as_view(), name='service_bulk_delete'), + path('services/', include(get_model_urls('ipam', 'service', detail=False))), path('services//', include(get_model_urls('ipam', 'service'))), ] diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index bbd19c433..327c05f3d 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -29,6 +29,7 @@ from .utils import add_requested_prefixes, add_available_ipaddresses, add_availa # VRFs # +@register_model_view(VRF, 'list', path='', detail=False) class VRFListView(generic.ObjectListView): queryset = VRF.objects.all() filterset = filtersets.VRFFilterSet @@ -57,6 +58,7 @@ class VRFView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(VRF, 'add', detail=False) @register_model_view(VRF, 'edit') class VRFEditView(generic.ObjectEditView): queryset = VRF.objects.all() @@ -68,11 +70,13 @@ class VRFDeleteView(generic.ObjectDeleteView): queryset = VRF.objects.all() +@register_model_view(VRF, 'import', detail=False) class VRFBulkImportView(generic.BulkImportView): queryset = VRF.objects.all() model_form = forms.VRFImportForm +@register_model_view(VRF, 'bulk_edit', path='edit', detail=False) class VRFBulkEditView(generic.BulkEditView): queryset = VRF.objects.all() filterset = filtersets.VRFFilterSet @@ -80,6 +84,7 @@ class VRFBulkEditView(generic.BulkEditView): form = forms.VRFBulkEditForm +@register_model_view(VRF, 'bulk_delete', path='delete', detail=False) class VRFBulkDeleteView(generic.BulkDeleteView): queryset = VRF.objects.all() filterset = filtersets.VRFFilterSet @@ -90,6 +95,7 @@ class VRFBulkDeleteView(generic.BulkDeleteView): # Route targets # +@register_model_view(RouteTarget, 'list', path='', detail=False) class RouteTargetListView(generic.ObjectListView): queryset = RouteTarget.objects.all() filterset = filtersets.RouteTargetFilterSet @@ -102,6 +108,7 @@ class RouteTargetView(generic.ObjectView): queryset = RouteTarget.objects.all() +@register_model_view(RouteTarget, 'add', detail=False) @register_model_view(RouteTarget, 'edit') class RouteTargetEditView(generic.ObjectEditView): queryset = RouteTarget.objects.all() @@ -113,11 +120,13 @@ class RouteTargetDeleteView(generic.ObjectDeleteView): queryset = RouteTarget.objects.all() +@register_model_view(RouteTarget, 'import', detail=False) class RouteTargetBulkImportView(generic.BulkImportView): queryset = RouteTarget.objects.all() model_form = forms.RouteTargetImportForm +@register_model_view(RouteTarget, 'bulk_edit', path='edit', detail=False) class RouteTargetBulkEditView(generic.BulkEditView): queryset = RouteTarget.objects.all() filterset = filtersets.RouteTargetFilterSet @@ -125,6 +134,7 @@ class RouteTargetBulkEditView(generic.BulkEditView): form = forms.RouteTargetBulkEditForm +@register_model_view(RouteTarget, 'bulk_delete', path='delete', detail=False) class RouteTargetBulkDeleteView(generic.BulkDeleteView): queryset = RouteTarget.objects.all() filterset = filtersets.RouteTargetFilterSet @@ -135,6 +145,7 @@ class RouteTargetBulkDeleteView(generic.BulkDeleteView): # RIRs # +@register_model_view(RIR, 'list', path='', detail=False) class RIRListView(generic.ObjectListView): queryset = RIR.objects.annotate( aggregate_count=count_related(Aggregate, 'rir') @@ -154,6 +165,7 @@ class RIRView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(RIR, 'add', detail=False) @register_model_view(RIR, 'edit') class RIREditView(generic.ObjectEditView): queryset = RIR.objects.all() @@ -165,11 +177,13 @@ class RIRDeleteView(generic.ObjectDeleteView): queryset = RIR.objects.all() +@register_model_view(RIR, 'import', detail=False) class RIRBulkImportView(generic.BulkImportView): queryset = RIR.objects.all() model_form = forms.RIRImportForm +@register_model_view(RIR, 'bulk_edit', path='edit', detail=False) class RIRBulkEditView(generic.BulkEditView): queryset = RIR.objects.annotate( aggregate_count=count_related(Aggregate, 'rir') @@ -179,6 +193,7 @@ class RIRBulkEditView(generic.BulkEditView): form = forms.RIRBulkEditForm +@register_model_view(RIR, 'bulk_delete', path='delete', detail=False) class RIRBulkDeleteView(generic.BulkDeleteView): queryset = RIR.objects.annotate( aggregate_count=count_related(Aggregate, 'rir') @@ -191,6 +206,7 @@ class RIRBulkDeleteView(generic.BulkDeleteView): # ASN ranges # +@register_model_view(ASNRange, 'list', path='', detail=False) class ASNRangeListView(generic.ObjectListView): queryset = ASNRange.objects.annotate_asn_counts() filterset = filtersets.ASNRangeFilterSet @@ -224,6 +240,7 @@ class ASNRangeASNsView(generic.ObjectChildrenView): ) +@register_model_view(ASNRange, 'add', detail=False) @register_model_view(ASNRange, 'edit') class ASNRangeEditView(generic.ObjectEditView): queryset = ASNRange.objects.all() @@ -235,11 +252,13 @@ class ASNRangeDeleteView(generic.ObjectDeleteView): queryset = ASNRange.objects.all() +@register_model_view(ASNRange, 'import', detail=False) class ASNRangeBulkImportView(generic.BulkImportView): queryset = ASNRange.objects.all() model_form = forms.ASNRangeImportForm +@register_model_view(ASNRange, 'bulk_edit', path='edit', detail=False) class ASNRangeBulkEditView(generic.BulkEditView): queryset = ASNRange.objects.annotate_asn_counts() filterset = filtersets.ASNRangeFilterSet @@ -247,6 +266,7 @@ class ASNRangeBulkEditView(generic.BulkEditView): form = forms.ASNRangeBulkEditForm +@register_model_view(ASNRange, 'bulk_delete', path='delete', detail=False) class ASNRangeBulkDeleteView(generic.BulkDeleteView): queryset = ASNRange.objects.annotate_asn_counts() filterset = filtersets.ASNRangeFilterSet @@ -257,6 +277,7 @@ class ASNRangeBulkDeleteView(generic.BulkDeleteView): # ASNs # +@register_model_view(ASN, 'list', path='', detail=False) class ASNListView(generic.ObjectListView): queryset = ASN.objects.annotate( site_count=count_related(Site, 'asns'), @@ -284,6 +305,7 @@ class ASNView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ASN, 'add', detail=False) @register_model_view(ASN, 'edit') class ASNEditView(generic.ObjectEditView): queryset = ASN.objects.all() @@ -295,11 +317,13 @@ class ASNDeleteView(generic.ObjectDeleteView): queryset = ASN.objects.all() +@register_model_view(ASN, 'import', detail=False) class ASNBulkImportView(generic.BulkImportView): queryset = ASN.objects.all() model_form = forms.ASNImportForm +@register_model_view(ASN, 'bulk_edit', path='edit', detail=False) class ASNBulkEditView(generic.BulkEditView): queryset = ASN.objects.annotate( site_count=count_related(Site, 'asns') @@ -309,6 +333,7 @@ class ASNBulkEditView(generic.BulkEditView): form = forms.ASNBulkEditForm +@register_model_view(ASN, 'bulk_delete', path='delete', detail=False) class ASNBulkDeleteView(generic.BulkDeleteView): queryset = ASN.objects.annotate( site_count=count_related(Site, 'asns') @@ -321,6 +346,7 @@ class ASNBulkDeleteView(generic.BulkDeleteView): # Aggregates # +@register_model_view(Aggregate, 'list', path='', detail=False) class AggregateListView(generic.ObjectListView): queryset = Aggregate.objects.annotate( child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ()) @@ -371,6 +397,7 @@ class AggregatePrefixesView(generic.ObjectChildrenView): } +@register_model_view(Aggregate, 'add', detail=False) @register_model_view(Aggregate, 'edit') class AggregateEditView(generic.ObjectEditView): queryset = Aggregate.objects.all() @@ -382,11 +409,13 @@ class AggregateDeleteView(generic.ObjectDeleteView): queryset = Aggregate.objects.all() +@register_model_view(Aggregate, 'import', detail=False) class AggregateBulkImportView(generic.BulkImportView): queryset = Aggregate.objects.all() model_form = forms.AggregateImportForm +@register_model_view(Aggregate, 'bulk_edit', path='edit', detail=False) class AggregateBulkEditView(generic.BulkEditView): queryset = Aggregate.objects.annotate( child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ()) @@ -396,6 +425,7 @@ class AggregateBulkEditView(generic.BulkEditView): form = forms.AggregateBulkEditForm +@register_model_view(Aggregate, 'bulk_delete', path='delete', detail=False) class AggregateBulkDeleteView(generic.BulkDeleteView): queryset = Aggregate.objects.annotate( child_count=RawSQL('SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', ()) @@ -413,6 +443,7 @@ class AggregateContactsView(ObjectContactsView): # Prefix/VLAN roles # +@register_model_view(Role, 'list', path='', detail=False) class RoleListView(generic.ObjectListView): queryset = Role.objects.annotate( prefix_count=count_related(Prefix, 'role'), @@ -434,6 +465,7 @@ class RoleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Role, 'add', detail=False) @register_model_view(Role, 'edit') class RoleEditView(generic.ObjectEditView): queryset = Role.objects.all() @@ -445,11 +477,13 @@ class RoleDeleteView(generic.ObjectDeleteView): queryset = Role.objects.all() +@register_model_view(Role, 'import', detail=False) class RoleBulkImportView(generic.BulkImportView): queryset = Role.objects.all() model_form = forms.RoleImportForm +@register_model_view(Role, 'bulk_edit', path='edit', detail=False) class RoleBulkEditView(generic.BulkEditView): queryset = Role.objects.all() filterset = filtersets.RoleFilterSet @@ -457,6 +491,7 @@ class RoleBulkEditView(generic.BulkEditView): form = forms.RoleBulkEditForm +@register_model_view(Role, 'bulk_delete', path='delete', detail=False) class RoleBulkDeleteView(generic.BulkDeleteView): queryset = Role.objects.all() filterset = filtersets.RoleFilterSet @@ -467,6 +502,7 @@ class RoleBulkDeleteView(generic.BulkDeleteView): # Prefixes # +@register_model_view(Prefix, 'list', path='', detail=False) class PrefixListView(generic.ObjectListView): queryset = Prefix.objects.all() filterset = filtersets.PrefixFilterSet @@ -615,6 +651,7 @@ class PrefixIPAddressesView(generic.ObjectChildrenView): } +@register_model_view(Prefix, 'add', detail=False) @register_model_view(Prefix, 'edit') class PrefixEditView(generic.ObjectEditView): queryset = Prefix.objects.all() @@ -626,11 +663,13 @@ class PrefixDeleteView(generic.ObjectDeleteView): queryset = Prefix.objects.all() +@register_model_view(Prefix, 'import', detail=False) class PrefixBulkImportView(generic.BulkImportView): queryset = Prefix.objects.all() model_form = forms.PrefixImportForm +@register_model_view(Prefix, 'bulk_edit', path='edit', detail=False) class PrefixBulkEditView(generic.BulkEditView): queryset = Prefix.objects.prefetch_related('vrf__tenant') filterset = filtersets.PrefixFilterSet @@ -638,6 +677,7 @@ class PrefixBulkEditView(generic.BulkEditView): form = forms.PrefixBulkEditForm +@register_model_view(Prefix, 'bulk_delete', path='delete', detail=False) class PrefixBulkDeleteView(generic.BulkDeleteView): queryset = Prefix.objects.prefetch_related('vrf__tenant') filterset = filtersets.PrefixFilterSet @@ -653,6 +693,7 @@ class PrefixContactsView(ObjectContactsView): # IP Ranges # +@register_model_view(IPRange, 'list', path='', detail=False) class IPRangeListView(generic.ObjectListView): queryset = IPRange.objects.all() filterset = filtersets.IPRangeFilterSet @@ -704,6 +745,7 @@ class IPRangeIPAddressesView(generic.ObjectChildrenView): return parent.get_child_ips().restrict(request.user, 'view') +@register_model_view(IPRange, 'add', detail=False) @register_model_view(IPRange, 'edit') class IPRangeEditView(generic.ObjectEditView): queryset = IPRange.objects.all() @@ -715,11 +757,13 @@ class IPRangeDeleteView(generic.ObjectDeleteView): queryset = IPRange.objects.all() +@register_model_view(IPRange, 'import', detail=False) class IPRangeBulkImportView(generic.BulkImportView): queryset = IPRange.objects.all() model_form = forms.IPRangeImportForm +@register_model_view(IPRange, 'bulk_edit', path='edit', detail=False) class IPRangeBulkEditView(generic.BulkEditView): queryset = IPRange.objects.all() filterset = filtersets.IPRangeFilterSet @@ -727,6 +771,7 @@ class IPRangeBulkEditView(generic.BulkEditView): form = forms.IPRangeBulkEditForm +@register_model_view(IPRange, 'bulk_delete', path='delete', detail=False) class IPRangeBulkDeleteView(generic.BulkDeleteView): queryset = IPRange.objects.all() filterset = filtersets.IPRangeFilterSet @@ -742,6 +787,7 @@ class IPRangeContactsView(ObjectContactsView): # IP addresses # +@register_model_view(IPAddress, 'list', path='', detail=False) class IPAddressListView(generic.ObjectListView): queryset = IPAddress.objects.all() filterset = filtersets.IPAddressFilterSet @@ -788,6 +834,7 @@ class IPAddressView(generic.ObjectView): } +@register_model_view(IPAddress, 'add', detail=False) @register_model_view(IPAddress, 'edit') class IPAddressEditView(generic.ObjectEditView): queryset = IPAddress.objects.all() @@ -818,6 +865,7 @@ class IPAddressEditView(generic.ObjectEditView): # TODO: Standardize or remove this view +@register_model_view(IPAddress, 'assign', path='assign', detail=False) class IPAddressAssignView(generic.ObjectView): """ Search for IPAddresses to be assigned to an Interface. @@ -862,6 +910,7 @@ class IPAddressDeleteView(generic.ObjectDeleteView): queryset = IPAddress.objects.all() +@register_model_view(IPAddress, 'bulk_add', path='bulk-add', detail=False) class IPAddressBulkCreateView(generic.BulkCreateView): queryset = IPAddress.objects.all() form = forms.IPAddressBulkCreateForm @@ -870,11 +919,13 @@ class IPAddressBulkCreateView(generic.BulkCreateView): template_name = 'ipam/ipaddress_bulk_add.html' +@register_model_view(IPAddress, 'import', detail=False) class IPAddressBulkImportView(generic.BulkImportView): queryset = IPAddress.objects.all() model_form = forms.IPAddressImportForm +@register_model_view(IPAddress, 'bulk_edit', path='edit', detail=False) class IPAddressBulkEditView(generic.BulkEditView): queryset = IPAddress.objects.prefetch_related('vrf__tenant') filterset = filtersets.IPAddressFilterSet @@ -882,6 +933,7 @@ class IPAddressBulkEditView(generic.BulkEditView): form = forms.IPAddressBulkEditForm +@register_model_view(IPAddress, 'bulk_delete', path='delete', detail=False) class IPAddressBulkDeleteView(generic.BulkDeleteView): queryset = IPAddress.objects.prefetch_related('vrf__tenant') filterset = filtersets.IPAddressFilterSet @@ -915,6 +967,7 @@ class IPAddressContactsView(ObjectContactsView): # VLAN groups # +@register_model_view(VLANGroup, 'list', path='', detail=False) class VLANGroupListView(generic.ObjectListView): queryset = VLANGroup.objects.annotate_utilization() filterset = filtersets.VLANGroupFilterSet @@ -932,6 +985,7 @@ class VLANGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(VLANGroup, 'add', detail=False) @register_model_view(VLANGroup, 'edit') class VLANGroupEditView(generic.ObjectEditView): queryset = VLANGroup.objects.all() @@ -943,11 +997,13 @@ class VLANGroupDeleteView(generic.ObjectDeleteView): queryset = VLANGroup.objects.all() +@register_model_view(VLANGroup, 'import', detail=False) class VLANGroupBulkImportView(generic.BulkImportView): queryset = VLANGroup.objects.all() model_form = forms.VLANGroupImportForm +@register_model_view(VLANGroup, 'bulk_edit', path='edit', detail=False) class VLANGroupBulkEditView(generic.BulkEditView): queryset = VLANGroup.objects.annotate_utilization().prefetch_related('tags') filterset = filtersets.VLANGroupFilterSet @@ -955,6 +1011,7 @@ class VLANGroupBulkEditView(generic.BulkEditView): form = forms.VLANGroupBulkEditForm +@register_model_view(VLANGroup, 'bulk_delete', path='delete', detail=False) class VLANGroupBulkDeleteView(generic.BulkDeleteView): queryset = VLANGroup.objects.annotate_utilization().prefetch_related('tags') filterset = filtersets.VLANGroupFilterSet @@ -991,6 +1048,7 @@ class VLANGroupVLANsView(generic.ObjectChildrenView): # VLAN Translation Policies # +@register_model_view(VLANTranslationPolicy, 'list', path='', detail=False) class VLANTranslationPolicyListView(generic.ObjectListView): queryset = VLANTranslationPolicy.objects.all() filterset = filtersets.VLANTranslationPolicyFilterSet @@ -1012,6 +1070,7 @@ class VLANTranslationPolicyView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(VLANTranslationPolicy, 'add', detail=False) @register_model_view(VLANTranslationPolicy, 'edit') class VLANTranslationPolicyEditView(generic.ObjectEditView): queryset = VLANTranslationPolicy.objects.all() @@ -1023,11 +1082,13 @@ class VLANTranslationPolicyDeleteView(generic.ObjectDeleteView): queryset = VLANTranslationPolicy.objects.all() +@register_model_view(VLANTranslationPolicy, 'import', detail=False) class VLANTranslationPolicyBulkImportView(generic.BulkImportView): queryset = VLANTranslationPolicy.objects.all() model_form = forms.VLANTranslationPolicyImportForm +@register_model_view(VLANTranslationPolicy, 'bulk_edit', path='edit', detail=False) class VLANTranslationPolicyBulkEditView(generic.BulkEditView): queryset = VLANTranslationPolicy.objects.all() filterset = filtersets.VLANTranslationPolicyFilterSet @@ -1035,6 +1096,7 @@ class VLANTranslationPolicyBulkEditView(generic.BulkEditView): form = forms.VLANTranslationPolicyBulkEditForm +@register_model_view(VLANTranslationPolicy, 'bulk_delete', path='delete', detail=False) class VLANTranslationPolicyBulkDeleteView(generic.BulkDeleteView): queryset = VLANTranslationPolicy.objects.all() filterset = filtersets.VLANTranslationPolicyFilterSet @@ -1045,6 +1107,7 @@ class VLANTranslationPolicyBulkDeleteView(generic.BulkDeleteView): # VLAN Translation Rules # +@register_model_view(VLANTranslationRule, 'list', path='', detail=False) class VLANTranslationRuleListView(generic.ObjectListView): queryset = VLANTranslationRule.objects.all() filterset = filtersets.VLANTranslationRuleFilterSet @@ -1062,6 +1125,7 @@ class VLANTranslationRuleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(VLANTranslationRule, 'add', detail=False) @register_model_view(VLANTranslationRule, 'edit') class VLANTranslationRuleEditView(generic.ObjectEditView): queryset = VLANTranslationRule.objects.all() @@ -1073,11 +1137,13 @@ class VLANTranslationRuleDeleteView(generic.ObjectDeleteView): queryset = VLANTranslationRule.objects.all() +@register_model_view(VLANTranslationRule, 'import', detail=False) class VLANTranslationRuleBulkImportView(generic.BulkImportView): queryset = VLANTranslationRule.objects.all() model_form = forms.VLANTranslationRuleImportForm +@register_model_view(VLANTranslationRule, 'bulk_edit', path='edit', detail=False) class VLANTranslationRuleBulkEditView(generic.BulkEditView): queryset = VLANTranslationRule.objects.all() filterset = filtersets.VLANTranslationRuleFilterSet @@ -1085,6 +1151,7 @@ class VLANTranslationRuleBulkEditView(generic.BulkEditView): form = forms.VLANTranslationRuleBulkEditForm +@register_model_view(VLANTranslationRule, 'bulk_delete', path='delete', detail=False) class VLANTranslationRuleBulkDeleteView(generic.BulkDeleteView): queryset = VLANTranslationRule.objects.all() filterset = filtersets.VLANTranslationRuleFilterSet @@ -1095,6 +1162,7 @@ class VLANTranslationRuleBulkDeleteView(generic.BulkDeleteView): # FHRP groups # +@register_model_view(FHRPGroup, 'list', path='', detail=False) class FHRPGroupListView(generic.ObjectListView): queryset = FHRPGroup.objects.annotate( member_count=count_related(FHRPGroupAssignment, 'group') @@ -1122,6 +1190,7 @@ class FHRPGroupView(generic.ObjectView): } +@register_model_view(FHRPGroup, 'add', detail=False) @register_model_view(FHRPGroup, 'edit') class FHRPGroupEditView(generic.ObjectEditView): queryset = FHRPGroup.objects.all() @@ -1149,11 +1218,13 @@ class FHRPGroupDeleteView(generic.ObjectDeleteView): queryset = FHRPGroup.objects.all() +@register_model_view(FHRPGroup, 'import', detail=False) class FHRPGroupBulkImportView(generic.BulkImportView): queryset = FHRPGroup.objects.all() model_form = forms.FHRPGroupImportForm +@register_model_view(FHRPGroup, 'bulk_edit', path='edit', detail=False) class FHRPGroupBulkEditView(generic.BulkEditView): queryset = FHRPGroup.objects.all() filterset = filtersets.FHRPGroupFilterSet @@ -1161,6 +1232,7 @@ class FHRPGroupBulkEditView(generic.BulkEditView): form = forms.FHRPGroupBulkEditForm +@register_model_view(FHRPGroup, 'bulk_delete', path='delete', detail=False) class FHRPGroupBulkDeleteView(generic.BulkDeleteView): queryset = FHRPGroup.objects.all() filterset = filtersets.FHRPGroupFilterSet @@ -1171,6 +1243,7 @@ class FHRPGroupBulkDeleteView(generic.BulkDeleteView): # FHRP group assignments # +@register_model_view(FHRPGroupAssignment, 'add', detail=False) @register_model_view(FHRPGroupAssignment, 'edit') class FHRPGroupAssignmentEditView(generic.ObjectEditView): queryset = FHRPGroupAssignment.objects.all() @@ -1199,6 +1272,7 @@ class FHRPGroupAssignmentDeleteView(generic.ObjectDeleteView): # VLANs # +@register_model_view(VLAN, 'list', path='', detail=False) class VLANListView(generic.ObjectListView): queryset = VLAN.objects.all() filterset = filtersets.VLANFilterSet @@ -1257,6 +1331,7 @@ class VLANVMInterfacesView(generic.ObjectChildrenView): return parent.get_vminterfaces().restrict(request.user, 'view') +@register_model_view(VLAN, 'add', detail=False) @register_model_view(VLAN, 'edit') class VLANEditView(generic.ObjectEditView): queryset = VLAN.objects.all() @@ -1269,11 +1344,13 @@ class VLANDeleteView(generic.ObjectDeleteView): queryset = VLAN.objects.all() +@register_model_view(VLAN, 'import', detail=False) class VLANBulkImportView(generic.BulkImportView): queryset = VLAN.objects.all() model_form = forms.VLANImportForm +@register_model_view(VLAN, 'bulk_edit', path='edit', detail=False) class VLANBulkEditView(generic.BulkEditView): queryset = VLAN.objects.all() filterset = filtersets.VLANFilterSet @@ -1281,6 +1358,7 @@ class VLANBulkEditView(generic.BulkEditView): form = forms.VLANBulkEditForm +@register_model_view(VLAN, 'bulk_delete', path='delete', detail=False) class VLANBulkDeleteView(generic.BulkDeleteView): queryset = VLAN.objects.all() filterset = filtersets.VLANFilterSet @@ -1291,6 +1369,7 @@ class VLANBulkDeleteView(generic.BulkDeleteView): # Service templates # +@register_model_view(ServiceTemplate, 'list', path='', detail=False) class ServiceTemplateListView(generic.ObjectListView): queryset = ServiceTemplate.objects.all() filterset = filtersets.ServiceTemplateFilterSet @@ -1303,6 +1382,7 @@ class ServiceTemplateView(generic.ObjectView): queryset = ServiceTemplate.objects.all() +@register_model_view(ServiceTemplate, 'add', detail=False) @register_model_view(ServiceTemplate, 'edit') class ServiceTemplateEditView(generic.ObjectEditView): queryset = ServiceTemplate.objects.all() @@ -1314,11 +1394,13 @@ class ServiceTemplateDeleteView(generic.ObjectDeleteView): queryset = ServiceTemplate.objects.all() +@register_model_view(ServiceTemplate, 'import', detail=False) class ServiceTemplateBulkImportView(generic.BulkImportView): queryset = ServiceTemplate.objects.all() model_form = forms.ServiceTemplateImportForm +@register_model_view(ServiceTemplate, 'bulk_edit', path='edit', detail=False) class ServiceTemplateBulkEditView(generic.BulkEditView): queryset = ServiceTemplate.objects.all() filterset = filtersets.ServiceTemplateFilterSet @@ -1326,6 +1408,7 @@ class ServiceTemplateBulkEditView(generic.BulkEditView): form = forms.ServiceTemplateBulkEditForm +@register_model_view(ServiceTemplate, 'bulk_delete', path='delete', detail=False) class ServiceTemplateBulkDeleteView(generic.BulkDeleteView): queryset = ServiceTemplate.objects.all() filterset = filtersets.ServiceTemplateFilterSet @@ -1336,6 +1419,7 @@ class ServiceTemplateBulkDeleteView(generic.BulkDeleteView): # Services # +@register_model_view(Service, 'list', path='', detail=False) class ServiceListView(generic.ObjectListView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filtersets.ServiceFilterSet @@ -1348,6 +1432,7 @@ class ServiceView(generic.ObjectView): queryset = Service.objects.all() +@register_model_view(Service, 'add', detail=False) class ServiceCreateView(generic.ObjectEditView): queryset = Service.objects.all() form = forms.ServiceCreateForm @@ -1364,11 +1449,13 @@ class ServiceDeleteView(generic.ObjectDeleteView): queryset = Service.objects.all() +@register_model_view(Service, 'import', detail=False) class ServiceBulkImportView(generic.BulkImportView): queryset = Service.objects.all() model_form = forms.ServiceImportForm +@register_model_view(Service, 'bulk_edit', path='edit', detail=False) class ServiceBulkEditView(generic.BulkEditView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filtersets.ServiceFilterSet @@ -1376,6 +1463,7 @@ class ServiceBulkEditView(generic.BulkEditView): form = forms.ServiceBulkEditForm +@register_model_view(Service, 'bulk_delete', path='delete', detail=False) class ServiceBulkDeleteView(generic.BulkDeleteView): queryset = Service.objects.prefetch_related('device', 'virtual_machine') filterset = filtersets.ServiceFilterSet diff --git a/netbox/tenancy/urls.py b/netbox/tenancy/urls.py index ad9908c62..cd0caabdc 100644 --- a/netbox/tenancy/urls.py +++ b/netbox/tenancy/urls.py @@ -1,57 +1,27 @@ from django.urls import include, path from utilities.urls import get_model_urls -from . import views +from . import views # noqa F401 app_name = 'tenancy' urlpatterns = [ - # Tenant groups - path('tenant-groups/', views.TenantGroupListView.as_view(), name='tenantgroup_list'), - path('tenant-groups/add/', views.TenantGroupEditView.as_view(), name='tenantgroup_add'), - path('tenant-groups/import/', views.TenantGroupBulkImportView.as_view(), name='tenantgroup_import'), - path('tenant-groups/edit/', views.TenantGroupBulkEditView.as_view(), name='tenantgroup_bulk_edit'), - path('tenant-groups/delete/', views.TenantGroupBulkDeleteView.as_view(), name='tenantgroup_bulk_delete'), + path('tenant-groups/', include(get_model_urls('tenancy', 'tenantgroup', detail=False))), path('tenant-groups//', include(get_model_urls('tenancy', 'tenantgroup'))), - # Tenants - path('tenants/', views.TenantListView.as_view(), name='tenant_list'), - path('tenants/add/', views.TenantEditView.as_view(), name='tenant_add'), - path('tenants/import/', views.TenantBulkImportView.as_view(), name='tenant_import'), - path('tenants/edit/', views.TenantBulkEditView.as_view(), name='tenant_bulk_edit'), - path('tenants/delete/', views.TenantBulkDeleteView.as_view(), name='tenant_bulk_delete'), + path('tenants/', include(get_model_urls('tenancy', 'tenant', detail=False))), path('tenants//', include(get_model_urls('tenancy', 'tenant'))), - # Contact groups - path('contact-groups/', views.ContactGroupListView.as_view(), name='contactgroup_list'), - path('contact-groups/add/', views.ContactGroupEditView.as_view(), name='contactgroup_add'), - path('contact-groups/import/', views.ContactGroupBulkImportView.as_view(), name='contactgroup_import'), - path('contact-groups/edit/', views.ContactGroupBulkEditView.as_view(), name='contactgroup_bulk_edit'), - path('contact-groups/delete/', views.ContactGroupBulkDeleteView.as_view(), name='contactgroup_bulk_delete'), + path('contact-groups/', include(get_model_urls('tenancy', 'contactgroup', detail=False))), path('contact-groups//', include(get_model_urls('tenancy', 'contactgroup'))), - # Contact roles - path('contact-roles/', views.ContactRoleListView.as_view(), name='contactrole_list'), - path('contact-roles/add/', views.ContactRoleEditView.as_view(), name='contactrole_add'), - path('contact-roles/import/', views.ContactRoleBulkImportView.as_view(), name='contactrole_import'), - path('contact-roles/edit/', views.ContactRoleBulkEditView.as_view(), name='contactrole_bulk_edit'), - path('contact-roles/delete/', views.ContactRoleBulkDeleteView.as_view(), name='contactrole_bulk_delete'), + path('contact-roles/', include(get_model_urls('tenancy', 'contactrole', detail=False))), path('contact-roles//', include(get_model_urls('tenancy', 'contactrole'))), - # Contacts - path('contacts/', views.ContactListView.as_view(), name='contact_list'), - path('contacts/add/', views.ContactEditView.as_view(), name='contact_add'), - path('contacts/import/', views.ContactBulkImportView.as_view(), name='contact_import'), - path('contacts/edit/', views.ContactBulkEditView.as_view(), name='contact_bulk_edit'), - path('contacts/delete/', views.ContactBulkDeleteView.as_view(), name='contact_bulk_delete'), + path('contacts/', include(get_model_urls('tenancy', 'contact', detail=False))), path('contacts//', include(get_model_urls('tenancy', 'contact'))), - # Contact assignments - path('contact-assignments/', views.ContactAssignmentListView.as_view(), name='contactassignment_list'), - path('contact-assignments/add/', views.ContactAssignmentEditView.as_view(), name='contactassignment_add'), - path('contact-assignments/import/', views.ContactAssignmentBulkImportView.as_view(), name='contactassignment_import'), - path('contact-assignments/edit/', views.ContactAssignmentBulkEditView.as_view(), name='contactassignment_bulk_edit'), - path('contact-assignments/delete/', views.ContactAssignmentBulkDeleteView.as_view(), name='contactassignment_bulk_delete'), + path('contact-assignments/', include(get_model_urls('tenancy', 'contactassignment', detail=False))), path('contact-assignments//', include(get_model_urls('tenancy', 'contactassignment'))), ] diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 96b2cb071..6f16842f6 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -37,11 +37,12 @@ class ObjectContactsView(generic.ObjectChildrenView): return table + # # Tenant groups # - +@register_model_view(TenantGroup, 'list', path='', detail=False) class TenantGroupListView(generic.ObjectListView): queryset = TenantGroup.objects.add_related_count( TenantGroup.objects.all(), @@ -67,6 +68,7 @@ class TenantGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(TenantGroup, 'add', detail=False) @register_model_view(TenantGroup, 'edit') class TenantGroupEditView(generic.ObjectEditView): queryset = TenantGroup.objects.all() @@ -78,11 +80,13 @@ class TenantGroupDeleteView(generic.ObjectDeleteView): queryset = TenantGroup.objects.all() +@register_model_view(TenantGroup, 'import', detail=False) class TenantGroupBulkImportView(generic.BulkImportView): queryset = TenantGroup.objects.all() model_form = forms.TenantGroupImportForm +@register_model_view(TenantGroup, 'bulk_edit', path='edit', detail=False) class TenantGroupBulkEditView(generic.BulkEditView): queryset = TenantGroup.objects.add_related_count( TenantGroup.objects.all(), @@ -96,6 +100,7 @@ class TenantGroupBulkEditView(generic.BulkEditView): form = forms.TenantGroupBulkEditForm +@register_model_view(TenantGroup, 'bulk_delete', path='delete', detail=False) class TenantGroupBulkDeleteView(generic.BulkDeleteView): queryset = TenantGroup.objects.add_related_count( TenantGroup.objects.all(), @@ -112,6 +117,7 @@ class TenantGroupBulkDeleteView(generic.BulkDeleteView): # Tenants # +@register_model_view(Tenant, 'list', path='', detail=False) class TenantListView(generic.ObjectListView): queryset = Tenant.objects.all() filterset = filtersets.TenantFilterSet @@ -129,6 +135,7 @@ class TenantView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(Tenant, 'add', detail=False) @register_model_view(Tenant, 'edit') class TenantEditView(generic.ObjectEditView): queryset = Tenant.objects.all() @@ -140,11 +147,13 @@ class TenantDeleteView(generic.ObjectDeleteView): queryset = Tenant.objects.all() +@register_model_view(Tenant, 'import', detail=False) class TenantBulkImportView(generic.BulkImportView): queryset = Tenant.objects.all() model_form = forms.TenantImportForm +@register_model_view(Tenant, 'bulk_edit', path='edit', detail=False) class TenantBulkEditView(generic.BulkEditView): queryset = Tenant.objects.all() filterset = filtersets.TenantFilterSet @@ -152,6 +161,7 @@ class TenantBulkEditView(generic.BulkEditView): form = forms.TenantBulkEditForm +@register_model_view(Tenant, 'bulk_delete', path='delete', detail=False) class TenantBulkDeleteView(generic.BulkDeleteView): queryset = Tenant.objects.all() filterset = filtersets.TenantFilterSet @@ -167,6 +177,7 @@ class TenantContactsView(ObjectContactsView): # Contact groups # +@register_model_view(ContactGroup, 'list', path='', detail=False) class ContactGroupListView(generic.ObjectListView): queryset = ContactGroup.objects.add_related_count( ContactGroup.objects.all(), @@ -192,6 +203,7 @@ class ContactGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ContactGroup, 'add', detail=False) @register_model_view(ContactGroup, 'edit') class ContactGroupEditView(generic.ObjectEditView): queryset = ContactGroup.objects.all() @@ -203,11 +215,13 @@ class ContactGroupDeleteView(generic.ObjectDeleteView): queryset = ContactGroup.objects.all() +@register_model_view(ContactGroup, 'import', detail=False) class ContactGroupBulkImportView(generic.BulkImportView): queryset = ContactGroup.objects.all() model_form = forms.ContactGroupImportForm +@register_model_view(ContactGroup, 'bulk_edit', path='edit', detail=False) class ContactGroupBulkEditView(generic.BulkEditView): queryset = ContactGroup.objects.add_related_count( ContactGroup.objects.all(), @@ -221,6 +235,7 @@ class ContactGroupBulkEditView(generic.BulkEditView): form = forms.ContactGroupBulkEditForm +@register_model_view(ContactGroup, 'bulk_delete', path='delete', detail=False) class ContactGroupBulkDeleteView(generic.BulkDeleteView): queryset = ContactGroup.objects.add_related_count( ContactGroup.objects.all(), @@ -237,6 +252,7 @@ class ContactGroupBulkDeleteView(generic.BulkDeleteView): # Contact roles # +@register_model_view(ContactRole, 'list', path='', detail=False) class ContactRoleListView(generic.ObjectListView): queryset = ContactRole.objects.all() filterset = filtersets.ContactRoleFilterSet @@ -254,6 +270,7 @@ class ContactRoleView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ContactRole, 'add', detail=False) @register_model_view(ContactRole, 'edit') class ContactRoleEditView(generic.ObjectEditView): queryset = ContactRole.objects.all() @@ -265,11 +282,13 @@ class ContactRoleDeleteView(generic.ObjectDeleteView): queryset = ContactRole.objects.all() +@register_model_view(ContactRole, 'import', detail=False) class ContactRoleBulkImportView(generic.BulkImportView): queryset = ContactRole.objects.all() model_form = forms.ContactRoleImportForm +@register_model_view(ContactRole, 'bulk_edit', path='edit', detail=False) class ContactRoleBulkEditView(generic.BulkEditView): queryset = ContactRole.objects.all() filterset = filtersets.ContactRoleFilterSet @@ -277,6 +296,7 @@ class ContactRoleBulkEditView(generic.BulkEditView): form = forms.ContactRoleBulkEditForm +@register_model_view(ContactRole, 'bulk_delete', path='delete', detail=False) class ContactRoleBulkDeleteView(generic.BulkDeleteView): queryset = ContactRole.objects.all() filterset = filtersets.ContactRoleFilterSet @@ -287,6 +307,7 @@ class ContactRoleBulkDeleteView(generic.BulkDeleteView): # Contacts # +@register_model_view(Contact, 'list', path='', detail=False) class ContactListView(generic.ObjectListView): queryset = Contact.objects.annotate( assignment_count=count_related(ContactAssignment, 'contact') @@ -301,6 +322,7 @@ class ContactView(generic.ObjectView): queryset = Contact.objects.all() +@register_model_view(Contact, 'add', detail=False) @register_model_view(Contact, 'edit') class ContactEditView(generic.ObjectEditView): queryset = Contact.objects.all() @@ -312,11 +334,13 @@ class ContactDeleteView(generic.ObjectDeleteView): queryset = Contact.objects.all() +@register_model_view(Contact, 'import', detail=False) class ContactBulkImportView(generic.BulkImportView): queryset = Contact.objects.all() model_form = forms.ContactImportForm +@register_model_view(Contact, 'bulk_edit', path='edit', detail=False) class ContactBulkEditView(generic.BulkEditView): queryset = Contact.objects.annotate( assignment_count=count_related(ContactAssignment, 'contact') @@ -326,6 +350,7 @@ class ContactBulkEditView(generic.BulkEditView): form = forms.ContactBulkEditForm +@register_model_view(Contact, 'bulk_delete', path='delete', detail=False) class ContactBulkDeleteView(generic.BulkDeleteView): queryset = Contact.objects.annotate( assignment_count=count_related(ContactAssignment, 'contact') @@ -333,11 +358,12 @@ class ContactBulkDeleteView(generic.BulkDeleteView): filterset = filtersets.ContactFilterSet table = tables.ContactTable + # # Contact assignments # - +@register_model_view(ContactAssignment, 'list', path='', detail=False) class ContactAssignmentListView(generic.ObjectListView): queryset = ContactAssignment.objects.all() filterset = filtersets.ContactAssignmentFilterSet @@ -351,6 +377,7 @@ class ContactAssignmentListView(generic.ObjectListView): } +@register_model_view(ContactAssignment, 'add', detail=False) @register_model_view(ContactAssignment, 'edit') class ContactAssignmentEditView(generic.ObjectEditView): queryset = ContactAssignment.objects.all() @@ -370,6 +397,13 @@ class ContactAssignmentEditView(generic.ObjectEditView): } +@register_model_view(ContactAssignment, 'import', detail=False) +class ContactAssignmentBulkImportView(generic.BulkImportView): + queryset = ContactAssignment.objects.all() + model_form = forms.ContactAssignmentImportForm + + +@register_model_view(ContactAssignment, 'bulk_edit', path='edit', detail=False) class ContactAssignmentBulkEditView(generic.BulkEditView): queryset = ContactAssignment.objects.all() filterset = filtersets.ContactAssignmentFilterSet @@ -377,11 +411,7 @@ class ContactAssignmentBulkEditView(generic.BulkEditView): form = forms.ContactAssignmentBulkEditForm -class ContactAssignmentBulkImportView(generic.BulkImportView): - queryset = ContactAssignment.objects.all() - model_form = forms.ContactAssignmentImportForm - - +@register_model_view(ContactAssignment, 'bulk_delete', path='delete', detail=False) class ContactAssignmentBulkDeleteView(generic.BulkDeleteView): queryset = ContactAssignment.objects.all() filterset = filtersets.ContactAssignmentFilterSet diff --git a/netbox/users/urls.py b/netbox/users/urls.py index 0540eae1f..83f120702 100644 --- a/netbox/users/urls.py +++ b/netbox/users/urls.py @@ -1,40 +1,21 @@ from django.urls import include, path from utilities.urls import get_model_urls -from . import views +from . import views # noqa F401 app_name = 'users' urlpatterns = [ - # Tokens - path('tokens/', views.TokenListView.as_view(), name='token_list'), - path('tokens/add/', views.TokenEditView.as_view(), name='token_add'), - path('tokens/import/', views.TokenBulkImportView.as_view(), name='token_import'), - path('tokens/edit/', views.TokenBulkEditView.as_view(), name='token_bulk_edit'), - path('tokens/delete/', views.TokenBulkDeleteView.as_view(), name='token_bulk_delete'), + path('tokens/', include(get_model_urls('users', 'token', detail=False))), path('tokens//', include(get_model_urls('users', 'token'))), - # Users - path('users/', views.UserListView.as_view(), name='user_list'), - path('users/add/', views.UserEditView.as_view(), name='user_add'), - path('users/edit/', views.UserBulkEditView.as_view(), name='user_bulk_edit'), - path('users/import/', views.UserBulkImportView.as_view(), name='user_import'), - path('users/delete/', views.UserBulkDeleteView.as_view(), name='user_bulk_delete'), + path('users/', include(get_model_urls('users', 'user', detail=False))), path('users//', include(get_model_urls('users', 'user'))), - # Groups - path('groups/', views.GroupListView.as_view(), name='group_list'), - path('groups/add/', views.GroupEditView.as_view(), name='group_add'), - path('groups/edit/', views.GroupBulkEditView.as_view(), name='group_bulk_edit'), - path('groups/import/', views.GroupBulkImportView.as_view(), name='group_import'), - path('groups/delete/', views.GroupBulkDeleteView.as_view(), name='group_bulk_delete'), + path('groups/', include(get_model_urls('users', 'group', detail=False))), path('groups//', include(get_model_urls('users', 'group'))), - # Permissions - path('permissions/', views.ObjectPermissionListView.as_view(), name='objectpermission_list'), - path('permissions/add/', views.ObjectPermissionEditView.as_view(), name='objectpermission_add'), - path('permissions/edit/', views.ObjectPermissionBulkEditView.as_view(), name='objectpermission_bulk_edit'), - path('permissions/delete/', views.ObjectPermissionBulkDeleteView.as_view(), name='objectpermission_bulk_delete'), + path('permissions/', include(get_model_urls('users', 'objectpermission', detail=False))), path('permissions//', include(get_model_urls('users', 'objectpermission'))), ] diff --git a/netbox/users/views.py b/netbox/users/views.py index b2f9a8d04..904a44674 100644 --- a/netbox/users/views.py +++ b/netbox/users/views.py @@ -12,6 +12,7 @@ from .models import Group, User, ObjectPermission, Token # Tokens # +@register_model_view(Token, 'list', path='', detail=False) class TokenListView(generic.ObjectListView): queryset = Token.objects.all() filterset = filtersets.TokenFilterSet @@ -24,6 +25,7 @@ class TokenView(generic.ObjectView): queryset = Token.objects.all() +@register_model_view(Token, 'add', detail=False) @register_model_view(Token, 'edit') class TokenEditView(generic.ObjectEditView): queryset = Token.objects.all() @@ -36,17 +38,20 @@ class TokenDeleteView(generic.ObjectDeleteView): queryset = Token.objects.all() +@register_model_view(Token, 'import', detail=False) class TokenBulkImportView(generic.BulkImportView): queryset = Token.objects.all() model_form = forms.TokenImportForm +@register_model_view(Token, 'bulk_edit', path='edit', detail=False) class TokenBulkEditView(generic.BulkEditView): queryset = Token.objects.all() table = tables.TokenTable form = forms.TokenBulkEditForm +@register_model_view(Token, 'bulk_delete', path='delete', detail=False) class TokenBulkDeleteView(generic.BulkDeleteView): queryset = Token.objects.all() table = tables.TokenTable @@ -56,6 +61,7 @@ class TokenBulkDeleteView(generic.BulkDeleteView): # Users # +@register_model_view(User, 'list', path='', detail=False) class UserListView(generic.ObjectListView): queryset = User.objects.all() filterset = filtersets.UserFilterSet @@ -77,6 +83,7 @@ class UserView(generic.ObjectView): } +@register_model_view(User, 'add', detail=False) @register_model_view(User, 'edit') class UserEditView(generic.ObjectEditView): queryset = User.objects.all() @@ -88,6 +95,13 @@ class UserDeleteView(generic.ObjectDeleteView): queryset = User.objects.all() +@register_model_view(User, 'import', detail=False) +class UserBulkImportView(generic.BulkImportView): + queryset = User.objects.all() + model_form = forms.UserImportForm + + +@register_model_view(User, 'bulk_edit', path='edit', detail=False) class UserBulkEditView(generic.BulkEditView): queryset = User.objects.all() filterset = filtersets.UserFilterSet @@ -95,11 +109,7 @@ class UserBulkEditView(generic.BulkEditView): form = forms.UserBulkEditForm -class UserBulkImportView(generic.BulkImportView): - queryset = User.objects.all() - model_form = forms.UserImportForm - - +@register_model_view(User, 'bulk_delete', path='delete', detail=False) class UserBulkDeleteView(generic.BulkDeleteView): queryset = User.objects.all() filterset = filtersets.UserFilterSet @@ -110,6 +120,7 @@ class UserBulkDeleteView(generic.BulkDeleteView): # Groups # +@register_model_view(Group, 'list', path='', detail=False) class GroupListView(generic.ObjectListView): queryset = Group.objects.annotate(users_count=Count('user')).order_by('name') filterset = filtersets.GroupFilterSet @@ -123,6 +134,7 @@ class GroupView(generic.ObjectView): template_name = 'users/group.html' +@register_model_view(Group, 'add', detail=False) @register_model_view(Group, 'edit') class GroupEditView(generic.ObjectEditView): queryset = Group.objects.all() @@ -134,11 +146,13 @@ class GroupDeleteView(generic.ObjectDeleteView): queryset = Group.objects.all() +@register_model_view(Group, 'import', detail=False) class GroupBulkImportView(generic.BulkImportView): queryset = Group.objects.all() model_form = forms.GroupImportForm +@register_model_view(Group, 'bulk_edit', path='edit', detail=False) class GroupBulkEditView(generic.BulkEditView): queryset = Group.objects.all() filterset = filtersets.GroupFilterSet @@ -146,6 +160,7 @@ class GroupBulkEditView(generic.BulkEditView): form = forms.GroupBulkEditForm +@register_model_view(Group, 'bulk_delete', path='delete', detail=False) class GroupBulkDeleteView(generic.BulkDeleteView): queryset = Group.objects.annotate(users_count=Count('user')).order_by('name') filterset = filtersets.GroupFilterSet @@ -156,6 +171,7 @@ class GroupBulkDeleteView(generic.BulkDeleteView): # ObjectPermissions # +@register_model_view(ObjectPermission, 'list', path='', detail=False) class ObjectPermissionListView(generic.ObjectListView): queryset = ObjectPermission.objects.all() filterset = filtersets.ObjectPermissionFilterSet @@ -169,6 +185,7 @@ class ObjectPermissionView(generic.ObjectView): template_name = 'users/objectpermission.html' +@register_model_view(ObjectPermission, 'add', detail=False) @register_model_view(ObjectPermission, 'edit') class ObjectPermissionEditView(generic.ObjectEditView): queryset = ObjectPermission.objects.all() @@ -180,6 +197,7 @@ class ObjectPermissionDeleteView(generic.ObjectDeleteView): queryset = ObjectPermission.objects.all() +@register_model_view(ObjectPermission, 'bulk_edit', path='edit', detail=False) class ObjectPermissionBulkEditView(generic.BulkEditView): queryset = ObjectPermission.objects.all() filterset = filtersets.ObjectPermissionFilterSet @@ -187,6 +205,7 @@ class ObjectPermissionBulkEditView(generic.BulkEditView): form = forms.ObjectPermissionBulkEditForm +@register_model_view(ObjectPermission, 'bulk_delete', path='delete', detail=False) class ObjectPermissionBulkDeleteView(generic.BulkDeleteView): queryset = ObjectPermission.objects.all() filterset = filtersets.ObjectPermissionFilterSet diff --git a/netbox/utilities/urls.py b/netbox/utilities/urls.py index a1132d81c..77968eb87 100644 --- a/netbox/utilities/urls.py +++ b/netbox/utilities/urls.py @@ -9,22 +9,27 @@ __all__ = ( ) -def get_model_urls(app_label, model_name): +def get_model_urls(app_label, model_name, detail=True): """ Return a list of URL paths for detail views registered to the given model. Args: app_label: App/plugin name model_name: Model name + detail: If True (default), return only URL views for an individual object. + Otherwise, return only list views. """ paths = [] # Retrieve registered views for this model try: - views = registry['views'][app_label][model_name] + views = [ + view for view in registry['views'][app_label][model_name] + if view['detail'] == detail + ] except KeyError: # No views have been registered for this model - views = [] + return [] for config in views: # Import the view class or function diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index f7181ea92..b3334ca87 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -272,7 +272,7 @@ def get_viewname(model, action=None, rest_api=False): return viewname -def register_model_view(model, name='', path=None, kwargs=None): +def register_model_view(model, name='', path=None, detail=True, kwargs=None): """ This decorator can be used to "attach" a view to any model in NetBox. This is typically used to inject additional tabs within a model's detail view. For example, to add a custom tab to NetBox's dcim.Site model: @@ -289,6 +289,7 @@ def register_model_view(model, name='', path=None, kwargs=None): name: The string used to form the view's name for URL resolution (e.g. via `reverse()`). This will be appended to the name of the base view for the model using an underscore. If blank, the model name will be used. path: The URL path by which the view can be reached (optional). If not provided, `name` will be used. + detail: True if the path applied to an individual object; False if it attaches to the base (list) path. kwargs: A dictionary of keyword arguments for the view to include when registering its URL path (optional). """ def _wrapper(cls): @@ -301,7 +302,8 @@ def register_model_view(model, name='', path=None, kwargs=None): registry['views'][app_label][model_name].append({ 'name': name, 'view': cls, - 'path': path or name, + 'path': path if path is not None else name, + 'detail': detail, 'kwargs': kwargs or {}, }) diff --git a/netbox/virtualization/urls.py b/netbox/virtualization/urls.py index 6d90645a3..2aeeead77 100644 --- a/netbox/virtualization/urls.py +++ b/netbox/virtualization/urls.py @@ -6,57 +6,33 @@ from . import views app_name = 'virtualization' urlpatterns = [ - # Cluster types - path('cluster-types/', views.ClusterTypeListView.as_view(), name='clustertype_list'), - path('cluster-types/add/', views.ClusterTypeEditView.as_view(), name='clustertype_add'), - path('cluster-types/import/', views.ClusterTypeBulkImportView.as_view(), name='clustertype_import'), - path('cluster-types/edit/', views.ClusterTypeBulkEditView.as_view(), name='clustertype_bulk_edit'), - path('cluster-types/delete/', views.ClusterTypeBulkDeleteView.as_view(), name='clustertype_bulk_delete'), + path('cluster-types/', include(get_model_urls('virtualization', 'clustertype', detail=False))), path('cluster-types//', include(get_model_urls('virtualization', 'clustertype'))), - # Cluster groups - path('cluster-groups/', views.ClusterGroupListView.as_view(), name='clustergroup_list'), - path('cluster-groups/add/', views.ClusterGroupEditView.as_view(), name='clustergroup_add'), - path('cluster-groups/import/', views.ClusterGroupBulkImportView.as_view(), name='clustergroup_import'), - path('cluster-groups/edit/', views.ClusterGroupBulkEditView.as_view(), name='clustergroup_bulk_edit'), - path('cluster-groups/delete/', views.ClusterGroupBulkDeleteView.as_view(), name='clustergroup_bulk_delete'), + path('cluster-groups/', include(get_model_urls('virtualization', 'clustergroup', detail=False))), path('cluster-groups//', include(get_model_urls('virtualization', 'clustergroup'))), - # Clusters - path('clusters/', views.ClusterListView.as_view(), name='cluster_list'), - path('clusters/add/', views.ClusterEditView.as_view(), name='cluster_add'), - path('clusters/import/', views.ClusterBulkImportView.as_view(), name='cluster_import'), - path('clusters/edit/', views.ClusterBulkEditView.as_view(), name='cluster_bulk_edit'), - path('clusters/delete/', views.ClusterBulkDeleteView.as_view(), name='cluster_bulk_delete'), + path('clusters/', include(get_model_urls('virtualization', 'cluster', detail=False))), path('clusters//', include(get_model_urls('virtualization', 'cluster'))), - # Virtual machines - path('virtual-machines/', views.VirtualMachineListView.as_view(), name='virtualmachine_list'), - path('virtual-machines/add/', views.VirtualMachineEditView.as_view(), name='virtualmachine_add'), - path('virtual-machines/import/', views.VirtualMachineBulkImportView.as_view(), name='virtualmachine_import'), - path('virtual-machines/edit/', views.VirtualMachineBulkEditView.as_view(), name='virtualmachine_bulk_edit'), - path('virtual-machines/delete/', views.VirtualMachineBulkDeleteView.as_view(), name='virtualmachine_bulk_delete'), + path('virtual-machines/', include(get_model_urls('virtualization', 'virtualmachine', detail=False))), path('virtual-machines//', include(get_model_urls('virtualization', 'virtualmachine'))), - # VM interfaces - path('interfaces/', views.VMInterfaceListView.as_view(), name='vminterface_list'), - path('interfaces/add/', views.VMInterfaceCreateView.as_view(), name='vminterface_add'), - path('interfaces/import/', views.VMInterfaceBulkImportView.as_view(), name='vminterface_import'), - path('interfaces/edit/', views.VMInterfaceBulkEditView.as_view(), name='vminterface_bulk_edit'), - path('interfaces/rename/', views.VMInterfaceBulkRenameView.as_view(), name='vminterface_bulk_rename'), - path('interfaces/delete/', views.VMInterfaceBulkDeleteView.as_view(), name='vminterface_bulk_delete'), + path('interfaces/', include(get_model_urls('virtualization', 'vminterface', detail=False))), path('interfaces//', include(get_model_urls('virtualization', 'vminterface'))), - path('virtual-machines/interfaces/add/', views.VirtualMachineBulkAddInterfaceView.as_view(), name='virtualmachine_bulk_add_vminterface'), + path( + 'virtual-machines/interfaces/add/', + views.VirtualMachineBulkAddInterfaceView.as_view(), + name='virtualmachine_bulk_add_vminterface' + ), - # Virtual disks - path('virtual-disks/', views.VirtualDiskListView.as_view(), name='virtualdisk_list'), - path('virtual-disks/add/', views.VirtualDiskCreateView.as_view(), name='virtualdisk_add'), - path('virtual-disks/import/', views.VirtualDiskBulkImportView.as_view(), name='virtualdisk_import'), - path('virtual-disks/edit/', views.VirtualDiskBulkEditView.as_view(), name='virtualdisk_bulk_edit'), - path('virtual-disks/rename/', views.VirtualDiskBulkRenameView.as_view(), name='virtualdisk_bulk_rename'), - path('virtual-disks/delete/', views.VirtualDiskBulkDeleteView.as_view(), name='virtualdisk_bulk_delete'), + path('virtual-disks/', include(get_model_urls('virtualization', 'virtualdisk', detail=False))), path('virtual-disks//', include(get_model_urls('virtualization', 'virtualdisk'))), - path('virtual-machines/disks/add/', views.VirtualMachineBulkAddVirtualDiskView.as_view(), name='virtualmachine_bulk_add_virtualdisk'), + path( + 'virtual-machines/disks/add/', + views.VirtualMachineBulkAddVirtualDiskView.as_view(), + name='virtualmachine_bulk_add_virtualdisk' + ), # TODO: Remove in v4.2 # Redirect old (pre-v4.1) URLs for VirtualDisk views diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 35f2f8f75..605de0911 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -31,6 +31,7 @@ from .models import * # Cluster types # +@register_model_view(ClusterType, 'list', path='', detail=False) class ClusterTypeListView(generic.ObjectListView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -50,6 +51,7 @@ class ClusterTypeView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ClusterType, 'add', detail=False) @register_model_view(ClusterType, 'edit') class ClusterTypeEditView(generic.ObjectEditView): queryset = ClusterType.objects.all() @@ -61,11 +63,13 @@ class ClusterTypeDeleteView(generic.ObjectDeleteView): queryset = ClusterType.objects.all() +@register_model_view(ClusterType, 'import', detail=False) class ClusterTypeBulkImportView(generic.BulkImportView): queryset = ClusterType.objects.all() model_form = forms.ClusterTypeImportForm +@register_model_view(ClusterType, 'bulk_edit', path='edit', detail=False) class ClusterTypeBulkEditView(generic.BulkEditView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -75,6 +79,7 @@ class ClusterTypeBulkEditView(generic.BulkEditView): form = forms.ClusterTypeBulkEditForm +@register_model_view(ClusterType, 'bulk_delete', path='delete', detail=False) class ClusterTypeBulkDeleteView(generic.BulkDeleteView): queryset = ClusterType.objects.annotate( cluster_count=count_related(Cluster, 'type') @@ -87,6 +92,7 @@ class ClusterTypeBulkDeleteView(generic.BulkDeleteView): # Cluster groups # +@register_model_view(ClusterGroup, 'list', path='', detail=False) class ClusterGroupListView(generic.ObjectListView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -106,6 +112,7 @@ class ClusterGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(ClusterGroup, 'add', detail=False) @register_model_view(ClusterGroup, 'edit') class ClusterGroupEditView(generic.ObjectEditView): queryset = ClusterGroup.objects.all() @@ -117,6 +124,7 @@ class ClusterGroupDeleteView(generic.ObjectDeleteView): queryset = ClusterGroup.objects.all() +@register_model_view(ClusterGroup, 'import', detail=False) class ClusterGroupBulkImportView(generic.BulkImportView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -124,6 +132,7 @@ class ClusterGroupBulkImportView(generic.BulkImportView): model_form = forms.ClusterGroupImportForm +@register_model_view(ClusterGroup, 'bulk_edit', path='edit', detail=False) class ClusterGroupBulkEditView(generic.BulkEditView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -133,6 +142,7 @@ class ClusterGroupBulkEditView(generic.BulkEditView): form = forms.ClusterGroupBulkEditForm +@register_model_view(ClusterGroup, 'bulk_delete', path='delete', detail=False) class ClusterGroupBulkDeleteView(generic.BulkDeleteView): queryset = ClusterGroup.objects.annotate( cluster_count=count_related(Cluster, 'group') @@ -150,6 +160,7 @@ class ClusterGroupContactsView(ObjectContactsView): # Clusters # +@register_model_view(Cluster, 'list', path='', detail=False) class ClusterListView(generic.ObjectListView): permission_required = 'virtualization.view_cluster' queryset = Cluster.objects.annotate( @@ -213,6 +224,7 @@ class ClusterDevicesView(generic.ObjectChildrenView): return Device.objects.restrict(request.user, 'view').filter(cluster=parent) +@register_model_view(Cluster, 'add', detail=False) @register_model_view(Cluster, 'edit') class ClusterEditView(generic.ObjectEditView): queryset = Cluster.objects.all() @@ -224,11 +236,13 @@ class ClusterDeleteView(generic.ObjectDeleteView): queryset = Cluster.objects.all() +@register_model_view(Cluster, 'import', detail=False) class ClusterBulkImportView(generic.BulkImportView): queryset = Cluster.objects.all() model_form = forms.ClusterImportForm +@register_model_view(Cluster, 'bulk_edit', path='edit', detail=False) class ClusterBulkEditView(generic.BulkEditView): queryset = Cluster.objects.all() filterset = filtersets.ClusterFilterSet @@ -236,6 +250,7 @@ class ClusterBulkEditView(generic.BulkEditView): form = forms.ClusterBulkEditForm +@register_model_view(Cluster, 'bulk_delete', path='delete', detail=False) class ClusterBulkDeleteView(generic.BulkDeleteView): queryset = Cluster.objects.all() filterset = filtersets.ClusterFilterSet @@ -337,6 +352,7 @@ class ClusterContactsView(ObjectContactsView): # Virtual machines # +@register_model_view(VirtualMachine, 'list', path='', detail=False) class VirtualMachineListView(generic.ObjectListView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -457,6 +473,7 @@ class VirtualMachineRenderConfigView(generic.ObjectView): } +@register_model_view(VirtualMachine, 'add', detail=False) @register_model_view(VirtualMachine, 'edit') class VirtualMachineEditView(generic.ObjectEditView): queryset = VirtualMachine.objects.all() @@ -468,11 +485,13 @@ class VirtualMachineDeleteView(generic.ObjectDeleteView): queryset = VirtualMachine.objects.all() +@register_model_view(VirtualMachine, 'import', detail=False) class VirtualMachineBulkImportView(generic.BulkImportView): queryset = VirtualMachine.objects.all() model_form = forms.VirtualMachineImportForm +@register_model_view(VirtualMachine, 'bulk_edit', path='edit', detail=False) class VirtualMachineBulkEditView(generic.BulkEditView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -480,6 +499,7 @@ class VirtualMachineBulkEditView(generic.BulkEditView): form = forms.VirtualMachineBulkEditForm +@register_model_view(VirtualMachine, 'bulk_delete', path='delete', detail=False) class VirtualMachineBulkDeleteView(generic.BulkDeleteView): queryset = VirtualMachine.objects.prefetch_related('primary_ip4', 'primary_ip6') filterset = filtersets.VirtualMachineFilterSet @@ -495,6 +515,7 @@ class VirtualMachineContactsView(ObjectContactsView): # VM interfaces # +@register_model_view(VMInterface, 'list', path='', detail=False) class VMInterfaceListView(generic.ObjectListView): queryset = VMInterface.objects.all() filterset = filtersets.VMInterfaceFilterSet @@ -545,6 +566,7 @@ class VMInterfaceView(generic.ObjectView): } +@register_model_view(VMInterface, 'add', detail=False) class VMInterfaceCreateView(generic.ComponentCreateView): queryset = VMInterface.objects.all() form = forms.VMInterfaceCreateForm @@ -562,11 +584,13 @@ class VMInterfaceDeleteView(generic.ObjectDeleteView): queryset = VMInterface.objects.all() +@register_model_view(VMInterface, 'import', detail=False) class VMInterfaceBulkImportView(generic.BulkImportView): queryset = VMInterface.objects.all() model_form = forms.VMInterfaceImportForm +@register_model_view(VMInterface, 'bulk_edit', path='edit', detail=False) class VMInterfaceBulkEditView(generic.BulkEditView): queryset = VMInterface.objects.all() filterset = filtersets.VMInterfaceFilterSet @@ -574,11 +598,13 @@ class VMInterfaceBulkEditView(generic.BulkEditView): form = forms.VMInterfaceBulkEditForm +@register_model_view(VMInterface, 'bulk_rename', path='rename', detail=False) class VMInterfaceBulkRenameView(generic.BulkRenameView): queryset = VMInterface.objects.all() form = forms.VMInterfaceBulkRenameForm +@register_model_view(VMInterface, 'bulk_delete', path='delete', detail=False) class VMInterfaceBulkDeleteView(generic.BulkDeleteView): # Ensure child interfaces are deleted prior to their parents queryset = VMInterface.objects.order_by('virtual_machine', 'parent', CollateAsChar('_name')) @@ -590,6 +616,7 @@ class VMInterfaceBulkDeleteView(generic.BulkDeleteView): # Virtual disks # +@register_model_view(VirtualDisk, 'list', path='', detail=False) class VirtualDiskListView(generic.ObjectListView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet @@ -602,6 +629,7 @@ class VirtualDiskView(generic.ObjectView): queryset = VirtualDisk.objects.all() +@register_model_view(VirtualDisk, 'add', detail=False) class VirtualDiskCreateView(generic.ComponentCreateView): queryset = VirtualDisk.objects.all() form = forms.VirtualDiskCreateForm @@ -619,11 +647,13 @@ class VirtualDiskDeleteView(generic.ObjectDeleteView): queryset = VirtualDisk.objects.all() +@register_model_view(VirtualDisk, 'import', detail=False) class VirtualDiskBulkImportView(generic.BulkImportView): queryset = VirtualDisk.objects.all() model_form = forms.VirtualDiskImportForm +@register_model_view(VirtualDisk, 'bulk_edit', path='edit', detail=False) class VirtualDiskBulkEditView(generic.BulkEditView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet @@ -631,11 +661,13 @@ class VirtualDiskBulkEditView(generic.BulkEditView): form = forms.VirtualDiskBulkEditForm +@register_model_view(VirtualDisk, 'bulk_rename', path='rename', detail=False) class VirtualDiskBulkRenameView(generic.BulkRenameView): queryset = VirtualDisk.objects.all() form = forms.VirtualDiskBulkRenameForm +@register_model_view(VirtualDisk, 'bulk_delete', path='delete', detail=False) class VirtualDiskBulkDeleteView(generic.BulkDeleteView): queryset = VirtualDisk.objects.all() filterset = filtersets.VirtualDiskFilterSet diff --git a/netbox/vpn/urls.py b/netbox/vpn/urls.py index 552f0e185..1169dcd15 100644 --- a/netbox/vpn/urls.py +++ b/netbox/vpn/urls.py @@ -1,89 +1,39 @@ from django.urls import include, path from utilities.urls import get_model_urls -from . import views +from . import views # noqa F401 app_name = 'vpn' urlpatterns = [ - # Tunnel groups - path('tunnel-groups/', views.TunnelGroupListView.as_view(), name='tunnelgroup_list'), - path('tunnel-groups/add/', views.TunnelGroupEditView.as_view(), name='tunnelgroup_add'), - path('tunnel-groups/import/', views.TunnelGroupBulkImportView.as_view(), name='tunnelgroup_import'), - path('tunnel-groups/edit/', views.TunnelGroupBulkEditView.as_view(), name='tunnelgroup_bulk_edit'), - path('tunnel-groups/delete/', views.TunnelGroupBulkDeleteView.as_view(), name='tunnelgroup_bulk_delete'), + path('tunnel-groups/', include(get_model_urls('vpn', 'tunnelgroup', detail=False))), path('tunnel-groups//', include(get_model_urls('vpn', 'tunnelgroup'))), - # Tunnels - path('tunnels/', views.TunnelListView.as_view(), name='tunnel_list'), - path('tunnels/add/', views.TunnelEditView.as_view(), name='tunnel_add'), - path('tunnels/import/', views.TunnelBulkImportView.as_view(), name='tunnel_import'), - path('tunnels/edit/', views.TunnelBulkEditView.as_view(), name='tunnel_bulk_edit'), - path('tunnels/delete/', views.TunnelBulkDeleteView.as_view(), name='tunnel_bulk_delete'), + path('tunnels/', include(get_model_urls('vpn', 'tunnel', detail=False))), path('tunnels//', include(get_model_urls('vpn', 'tunnel'))), - # Tunnel terminations - path('tunnel-terminations/', views.TunnelTerminationListView.as_view(), name='tunneltermination_list'), - path('tunnel-terminations/add/', views.TunnelTerminationEditView.as_view(), name='tunneltermination_add'), - path('tunnel-terminations/import/', views.TunnelTerminationBulkImportView.as_view(), name='tunneltermination_import'), - path('tunnel-terminations/edit/', views.TunnelTerminationBulkEditView.as_view(), name='tunneltermination_bulk_edit'), - path('tunnel-terminations/delete/', views.TunnelTerminationBulkDeleteView.as_view(), name='tunneltermination_bulk_delete'), + path('tunnel-terminations/', include(get_model_urls('vpn', 'tunneltermination', detail=False))), path('tunnel-terminations//', include(get_model_urls('vpn', 'tunneltermination'))), - # IKE proposals - path('ike-proposals/', views.IKEProposalListView.as_view(), name='ikeproposal_list'), - path('ike-proposals/add/', views.IKEProposalEditView.as_view(), name='ikeproposal_add'), - path('ike-proposals/import/', views.IKEProposalBulkImportView.as_view(), name='ikeproposal_import'), - path('ike-proposals/edit/', views.IKEProposalBulkEditView.as_view(), name='ikeproposal_bulk_edit'), - path('ike-proposals/delete/', views.IKEProposalBulkDeleteView.as_view(), name='ikeproposal_bulk_delete'), + path('ike-proposals/', include(get_model_urls('vpn', 'ikeproposal', detail=False))), path('ike-proposals//', include(get_model_urls('vpn', 'ikeproposal'))), - # IKE policies - path('ike-policies/', views.IKEPolicyListView.as_view(), name='ikepolicy_list'), - path('ike-policies/add/', views.IKEPolicyEditView.as_view(), name='ikepolicy_add'), - path('ike-policies/import/', views.IKEPolicyBulkImportView.as_view(), name='ikepolicy_import'), - path('ike-policies/edit/', views.IKEPolicyBulkEditView.as_view(), name='ikepolicy_bulk_edit'), - path('ike-policies/delete/', views.IKEPolicyBulkDeleteView.as_view(), name='ikepolicy_bulk_delete'), + path('ike-policies/', include(get_model_urls('vpn', 'ikepolicy', detail=False))), path('ike-policies//', include(get_model_urls('vpn', 'ikepolicy'))), - # IPSec proposals - path('ipsec-proposals/', views.IPSecProposalListView.as_view(), name='ipsecproposal_list'), - path('ipsec-proposals/add/', views.IPSecProposalEditView.as_view(), name='ipsecproposal_add'), - path('ipsec-proposals/import/', views.IPSecProposalBulkImportView.as_view(), name='ipsecproposal_import'), - path('ipsec-proposals/edit/', views.IPSecProposalBulkEditView.as_view(), name='ipsecproposal_bulk_edit'), - path('ipsec-proposals/delete/', views.IPSecProposalBulkDeleteView.as_view(), name='ipsecproposal_bulk_delete'), + path('ipsec-proposals/', include(get_model_urls('vpn', 'ipsecproposal', detail=False))), path('ipsec-proposals//', include(get_model_urls('vpn', 'ipsecproposal'))), - # IPSec policies - path('ipsec-policies/', views.IPSecPolicyListView.as_view(), name='ipsecpolicy_list'), - path('ipsec-policies/add/', views.IPSecPolicyEditView.as_view(), name='ipsecpolicy_add'), - path('ipsec-policies/import/', views.IPSecPolicyBulkImportView.as_view(), name='ipsecpolicy_import'), - path('ipsec-policies/edit/', views.IPSecPolicyBulkEditView.as_view(), name='ipsecpolicy_bulk_edit'), - path('ipsec-policies/delete/', views.IPSecPolicyBulkDeleteView.as_view(), name='ipsecpolicy_bulk_delete'), + path('ipsec-policies/', include(get_model_urls('vpn', 'ipsecpolicy', detail=False))), path('ipsec-policies//', include(get_model_urls('vpn', 'ipsecpolicy'))), - # IPSec profiles - path('ipsec-profiles/', views.IPSecProfileListView.as_view(), name='ipsecprofile_list'), - path('ipsec-profiles/add/', views.IPSecProfileEditView.as_view(), name='ipsecprofile_add'), - path('ipsec-profiles/import/', views.IPSecProfileBulkImportView.as_view(), name='ipsecprofile_import'), - path('ipsec-profiles/edit/', views.IPSecProfileBulkEditView.as_view(), name='ipsecprofile_bulk_edit'), - path('ipsec-profiles/delete/', views.IPSecProfileBulkDeleteView.as_view(), name='ipsecprofile_bulk_delete'), + path('ipsec-profiles/', include(get_model_urls('vpn', 'ipsecprofile', detail=False))), path('ipsec-profiles//', include(get_model_urls('vpn', 'ipsecprofile'))), - # L2VPN - path('l2vpns/', views.L2VPNListView.as_view(), name='l2vpn_list'), - path('l2vpns/add/', views.L2VPNEditView.as_view(), name='l2vpn_add'), - path('l2vpns/import/', views.L2VPNBulkImportView.as_view(), name='l2vpn_import'), - path('l2vpns/edit/', views.L2VPNBulkEditView.as_view(), name='l2vpn_bulk_edit'), - path('l2vpns/delete/', views.L2VPNBulkDeleteView.as_view(), name='l2vpn_bulk_delete'), + path('l2vpns/', include(get_model_urls('vpn', 'l2vpn', detail=False))), path('l2vpns//', include(get_model_urls('vpn', 'l2vpn'))), - # L2VPN terminations - path('l2vpn-terminations/', views.L2VPNTerminationListView.as_view(), name='l2vpntermination_list'), - path('l2vpn-terminations/add/', views.L2VPNTerminationEditView.as_view(), name='l2vpntermination_add'), - path('l2vpn-terminations/import/', views.L2VPNTerminationBulkImportView.as_view(), name='l2vpntermination_import'), - path('l2vpn-terminations/edit/', views.L2VPNTerminationBulkEditView.as_view(), name='l2vpntermination_bulk_edit'), - path('l2vpn-terminations/delete/', views.L2VPNTerminationBulkDeleteView.as_view(), name='l2vpntermination_bulk_delete'), + path('l2vpn-terminations/', include(get_model_urls('vpn', 'l2vpntermination', detail=False))), path('l2vpn-terminations//', include(get_model_urls('vpn', 'l2vpntermination'))), ] diff --git a/netbox/vpn/views.py b/netbox/vpn/views.py index ac8ce3667..f1546bfbe 100644 --- a/netbox/vpn/views.py +++ b/netbox/vpn/views.py @@ -11,6 +11,7 @@ from .models import * # Tunnel groups # +@register_model_view(TunnelGroup, 'list', path='', detail=False) class TunnelGroupListView(generic.ObjectListView): queryset = TunnelGroup.objects.annotate( tunnel_count=count_related(Tunnel, 'group') @@ -30,6 +31,7 @@ class TunnelGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(TunnelGroup, 'add', detail=False) @register_model_view(TunnelGroup, 'edit') class TunnelGroupEditView(generic.ObjectEditView): queryset = TunnelGroup.objects.all() @@ -41,11 +43,13 @@ class TunnelGroupDeleteView(generic.ObjectDeleteView): queryset = TunnelGroup.objects.all() +@register_model_view(TunnelGroup, 'import', detail=False) class TunnelGroupBulkImportView(generic.BulkImportView): queryset = TunnelGroup.objects.all() model_form = forms.TunnelGroupImportForm +@register_model_view(TunnelGroup, 'bulk_edit', path='edit', detail=False) class TunnelGroupBulkEditView(generic.BulkEditView): queryset = TunnelGroup.objects.annotate( tunnel_count=count_related(Tunnel, 'group') @@ -55,6 +59,7 @@ class TunnelGroupBulkEditView(generic.BulkEditView): form = forms.TunnelGroupBulkEditForm +@register_model_view(TunnelGroup, 'bulk_delete', path='delete', detail=False) class TunnelGroupBulkDeleteView(generic.BulkDeleteView): queryset = TunnelGroup.objects.annotate( tunnel_count=count_related(Tunnel, 'group') @@ -67,6 +72,7 @@ class TunnelGroupBulkDeleteView(generic.BulkDeleteView): # Tunnels # +@register_model_view(Tunnel, 'list', path='', detail=False) class TunnelListView(generic.ObjectListView): queryset = Tunnel.objects.annotate( count_terminations=count_related(TunnelTermination, 'tunnel') @@ -81,6 +87,7 @@ class TunnelView(generic.ObjectView): queryset = Tunnel.objects.all() +@register_model_view(Tunnel, 'add', detail=False) @register_model_view(Tunnel, 'edit') class TunnelEditView(generic.ObjectEditView): queryset = Tunnel.objects.all() @@ -100,11 +107,13 @@ class TunnelDeleteView(generic.ObjectDeleteView): queryset = Tunnel.objects.all() +@register_model_view(Tunnel, 'import', detail=False) class TunnelBulkImportView(generic.BulkImportView): queryset = Tunnel.objects.all() model_form = forms.TunnelImportForm +@register_model_view(Tunnel, 'bulk_edit', path='edit', detail=False) class TunnelBulkEditView(generic.BulkEditView): queryset = Tunnel.objects.annotate( count_terminations=count_related(TunnelTermination, 'tunnel') @@ -114,6 +123,7 @@ class TunnelBulkEditView(generic.BulkEditView): form = forms.TunnelBulkEditForm +@register_model_view(Tunnel, 'bulk_delete', path='delete', detail=False) class TunnelBulkDeleteView(generic.BulkDeleteView): queryset = Tunnel.objects.annotate( count_terminations=count_related(TunnelTermination, 'tunnel') @@ -126,6 +136,7 @@ class TunnelBulkDeleteView(generic.BulkDeleteView): # Tunnel terminations # +@register_model_view(TunnelTermination, 'list', path='', detail=False) class TunnelTerminationListView(generic.ObjectListView): queryset = TunnelTermination.objects.all() filterset = filtersets.TunnelTerminationFilterSet @@ -138,6 +149,7 @@ class TunnelTerminationView(generic.ObjectView): queryset = TunnelTermination.objects.all() +@register_model_view(TunnelTermination, 'add', detail=False) @register_model_view(TunnelTermination, 'edit') class TunnelTerminationEditView(generic.ObjectEditView): queryset = TunnelTermination.objects.all() @@ -149,11 +161,13 @@ class TunnelTerminationDeleteView(generic.ObjectDeleteView): queryset = TunnelTermination.objects.all() +@register_model_view(TunnelTermination, 'import', detail=False) class TunnelTerminationBulkImportView(generic.BulkImportView): queryset = TunnelTermination.objects.all() model_form = forms.TunnelTerminationImportForm +@register_model_view(TunnelTermination, 'bulk_edit', path='edit', detail=False) class TunnelTerminationBulkEditView(generic.BulkEditView): queryset = TunnelTermination.objects.all() filterset = filtersets.TunnelTerminationFilterSet @@ -161,6 +175,7 @@ class TunnelTerminationBulkEditView(generic.BulkEditView): form = forms.TunnelTerminationBulkEditForm +@register_model_view(TunnelTermination, 'bulk_delete', path='delete', detail=False) class TunnelTerminationBulkDeleteView(generic.BulkDeleteView): queryset = TunnelTermination.objects.all() filterset = filtersets.TunnelTerminationFilterSet @@ -171,6 +186,7 @@ class TunnelTerminationBulkDeleteView(generic.BulkDeleteView): # IKE proposals # +@register_model_view(IKEProposal, 'list', path='', detail=False) class IKEProposalListView(generic.ObjectListView): queryset = IKEProposal.objects.all() filterset = filtersets.IKEProposalFilterSet @@ -183,6 +199,7 @@ class IKEProposalView(generic.ObjectView): queryset = IKEProposal.objects.all() +@register_model_view(IKEProposal, 'add', detail=False) @register_model_view(IKEProposal, 'edit') class IKEProposalEditView(generic.ObjectEditView): queryset = IKEProposal.objects.all() @@ -194,11 +211,13 @@ class IKEProposalDeleteView(generic.ObjectDeleteView): queryset = IKEProposal.objects.all() +@register_model_view(IKEProposal, 'import', detail=False) class IKEProposalBulkImportView(generic.BulkImportView): queryset = IKEProposal.objects.all() model_form = forms.IKEProposalImportForm +@register_model_view(IKEProposal, 'bulk_edit', path='edit', detail=False) class IKEProposalBulkEditView(generic.BulkEditView): queryset = IKEProposal.objects.all() filterset = filtersets.IKEProposalFilterSet @@ -206,6 +225,7 @@ class IKEProposalBulkEditView(generic.BulkEditView): form = forms.IKEProposalBulkEditForm +@register_model_view(IKEProposal, 'bulk_delete', path='delete', detail=False) class IKEProposalBulkDeleteView(generic.BulkDeleteView): queryset = IKEProposal.objects.all() filterset = filtersets.IKEProposalFilterSet @@ -216,6 +236,7 @@ class IKEProposalBulkDeleteView(generic.BulkDeleteView): # IKE policies # +@register_model_view(IKEPolicy, 'list', path='', detail=False) class IKEPolicyListView(generic.ObjectListView): queryset = IKEPolicy.objects.all() filterset = filtersets.IKEPolicyFilterSet @@ -228,6 +249,7 @@ class IKEPolicyView(generic.ObjectView): queryset = IKEPolicy.objects.all() +@register_model_view(IKEPolicy, 'add', detail=False) @register_model_view(IKEPolicy, 'edit') class IKEPolicyEditView(generic.ObjectEditView): queryset = IKEPolicy.objects.all() @@ -239,11 +261,13 @@ class IKEPolicyDeleteView(generic.ObjectDeleteView): queryset = IKEPolicy.objects.all() +@register_model_view(IKEPolicy, 'import', detail=False) class IKEPolicyBulkImportView(generic.BulkImportView): queryset = IKEPolicy.objects.all() model_form = forms.IKEPolicyImportForm +@register_model_view(IKEPolicy, 'bulk_edit', path='edit', detail=False) class IKEPolicyBulkEditView(generic.BulkEditView): queryset = IKEPolicy.objects.all() filterset = filtersets.IKEPolicyFilterSet @@ -251,6 +275,7 @@ class IKEPolicyBulkEditView(generic.BulkEditView): form = forms.IKEPolicyBulkEditForm +@register_model_view(IKEPolicy, 'bulk_delete', path='delete', detail=False) class IKEPolicyBulkDeleteView(generic.BulkDeleteView): queryset = IKEPolicy.objects.all() filterset = filtersets.IKEPolicyFilterSet @@ -261,6 +286,7 @@ class IKEPolicyBulkDeleteView(generic.BulkDeleteView): # IPSec proposals # +@register_model_view(IPSecProposal, 'list', path='', detail=False) class IPSecProposalListView(generic.ObjectListView): queryset = IPSecProposal.objects.all() filterset = filtersets.IPSecProposalFilterSet @@ -273,6 +299,7 @@ class IPSecProposalView(generic.ObjectView): queryset = IPSecProposal.objects.all() +@register_model_view(IPSecProposal, 'add', detail=False) @register_model_view(IPSecProposal, 'edit') class IPSecProposalEditView(generic.ObjectEditView): queryset = IPSecProposal.objects.all() @@ -284,11 +311,13 @@ class IPSecProposalDeleteView(generic.ObjectDeleteView): queryset = IPSecProposal.objects.all() +@register_model_view(IPSecProposal, 'import', detail=False) class IPSecProposalBulkImportView(generic.BulkImportView): queryset = IPSecProposal.objects.all() model_form = forms.IPSecProposalImportForm +@register_model_view(IPSecProposal, 'bulk_edit', path='edit', detail=False) class IPSecProposalBulkEditView(generic.BulkEditView): queryset = IPSecProposal.objects.all() filterset = filtersets.IPSecProposalFilterSet @@ -296,6 +325,7 @@ class IPSecProposalBulkEditView(generic.BulkEditView): form = forms.IPSecProposalBulkEditForm +@register_model_view(IPSecProposal, 'bulk_delete', path='delete', detail=False) class IPSecProposalBulkDeleteView(generic.BulkDeleteView): queryset = IPSecProposal.objects.all() filterset = filtersets.IPSecProposalFilterSet @@ -306,6 +336,7 @@ class IPSecProposalBulkDeleteView(generic.BulkDeleteView): # IPSec policies # +@register_model_view(IPSecPolicy, 'list', path='', detail=False) class IPSecPolicyListView(generic.ObjectListView): queryset = IPSecPolicy.objects.all() filterset = filtersets.IPSecPolicyFilterSet @@ -318,6 +349,7 @@ class IPSecPolicyView(generic.ObjectView): queryset = IPSecPolicy.objects.all() +@register_model_view(IPSecPolicy, 'add', detail=False) @register_model_view(IPSecPolicy, 'edit') class IPSecPolicyEditView(generic.ObjectEditView): queryset = IPSecPolicy.objects.all() @@ -329,11 +361,13 @@ class IPSecPolicyDeleteView(generic.ObjectDeleteView): queryset = IPSecPolicy.objects.all() +@register_model_view(IPSecPolicy, 'import', detail=False) class IPSecPolicyBulkImportView(generic.BulkImportView): queryset = IPSecPolicy.objects.all() model_form = forms.IPSecPolicyImportForm +@register_model_view(IPSecPolicy, 'bulk_edit', path='edit', detail=False) class IPSecPolicyBulkEditView(generic.BulkEditView): queryset = IPSecPolicy.objects.all() filterset = filtersets.IPSecPolicyFilterSet @@ -341,6 +375,7 @@ class IPSecPolicyBulkEditView(generic.BulkEditView): form = forms.IPSecPolicyBulkEditForm +@register_model_view(IPSecPolicy, 'bulk_delete', path='delete', detail=False) class IPSecPolicyBulkDeleteView(generic.BulkDeleteView): queryset = IPSecPolicy.objects.all() filterset = filtersets.IPSecPolicyFilterSet @@ -351,6 +386,7 @@ class IPSecPolicyBulkDeleteView(generic.BulkDeleteView): # IPSec profiles # +@register_model_view(IPSecProfile, 'list', path='', detail=False) class IPSecProfileListView(generic.ObjectListView): queryset = IPSecProfile.objects.all() filterset = filtersets.IPSecProfileFilterSet @@ -363,6 +399,7 @@ class IPSecProfileView(generic.ObjectView): queryset = IPSecProfile.objects.all() +@register_model_view(IPSecProfile, 'add', detail=False) @register_model_view(IPSecProfile, 'edit') class IPSecProfileEditView(generic.ObjectEditView): queryset = IPSecProfile.objects.all() @@ -374,11 +411,13 @@ class IPSecProfileDeleteView(generic.ObjectDeleteView): queryset = IPSecProfile.objects.all() +@register_model_view(IPSecProfile, 'import', detail=False) class IPSecProfileBulkImportView(generic.BulkImportView): queryset = IPSecProfile.objects.all() model_form = forms.IPSecProfileImportForm +@register_model_view(IPSecProfile, 'bulk_edit', path='edit', detail=False) class IPSecProfileBulkEditView(generic.BulkEditView): queryset = IPSecProfile.objects.all() filterset = filtersets.IPSecProfileFilterSet @@ -386,14 +425,18 @@ class IPSecProfileBulkEditView(generic.BulkEditView): form = forms.IPSecProfileBulkEditForm +@register_model_view(IPSecProfile, 'bulk_delete', path='delete', detail=False) class IPSecProfileBulkDeleteView(generic.BulkDeleteView): queryset = IPSecProfile.objects.all() filterset = filtersets.IPSecProfileFilterSet table = tables.IPSecProfileTable +# # L2VPN +# +@register_model_view(L2VPN, 'list', path='', detail=False) class L2VPNListView(generic.ObjectListView): queryset = L2VPN.objects.all() table = tables.L2VPNTable @@ -421,6 +464,7 @@ class L2VPNView(generic.ObjectView): } +@register_model_view(L2VPN, 'add', detail=False) @register_model_view(L2VPN, 'edit') class L2VPNEditView(generic.ObjectEditView): queryset = L2VPN.objects.all() @@ -432,11 +476,13 @@ class L2VPNDeleteView(generic.ObjectDeleteView): queryset = L2VPN.objects.all() +@register_model_view(L2VPN, 'import', detail=False) class L2VPNBulkImportView(generic.BulkImportView): queryset = L2VPN.objects.all() model_form = forms.L2VPNImportForm +@register_model_view(L2VPN, 'bulk_edit', path='edit', detail=False) class L2VPNBulkEditView(generic.BulkEditView): queryset = L2VPN.objects.all() filterset = filtersets.L2VPNFilterSet @@ -444,6 +490,7 @@ class L2VPNBulkEditView(generic.BulkEditView): form = forms.L2VPNBulkEditForm +@register_model_view(L2VPN, 'bulk_delete', path='delete', detail=False) class L2VPNBulkDeleteView(generic.BulkDeleteView): queryset = L2VPN.objects.all() filterset = filtersets.L2VPNFilterSet @@ -459,6 +506,7 @@ class L2VPNContactsView(ObjectContactsView): # L2VPN terminations # +@register_model_view(L2VPNTermination, 'list', path='', detail=False) class L2VPNTerminationListView(generic.ObjectListView): queryset = L2VPNTermination.objects.all() table = tables.L2VPNTerminationTable @@ -471,6 +519,7 @@ class L2VPNTerminationView(generic.ObjectView): queryset = L2VPNTermination.objects.all() +@register_model_view(L2VPNTermination, 'add', detail=False) @register_model_view(L2VPNTermination, 'edit') class L2VPNTerminationEditView(generic.ObjectEditView): queryset = L2VPNTermination.objects.all() @@ -482,11 +531,13 @@ class L2VPNTerminationDeleteView(generic.ObjectDeleteView): queryset = L2VPNTermination.objects.all() +@register_model_view(L2VPNTermination, 'import', detail=False) class L2VPNTerminationBulkImportView(generic.BulkImportView): queryset = L2VPNTermination.objects.all() model_form = forms.L2VPNTerminationImportForm +@register_model_view(L2VPNTermination, 'bulk_edit', path='edit', detail=False) class L2VPNTerminationBulkEditView(generic.BulkEditView): queryset = L2VPNTermination.objects.all() filterset = filtersets.L2VPNTerminationFilterSet @@ -494,6 +545,7 @@ class L2VPNTerminationBulkEditView(generic.BulkEditView): form = forms.L2VPNTerminationBulkEditForm +@register_model_view(L2VPNTermination, 'bulk_delete', path='delete', detail=False) class L2VPNTerminationBulkDeleteView(generic.BulkDeleteView): queryset = L2VPNTermination.objects.all() filterset = filtersets.L2VPNTerminationFilterSet diff --git a/netbox/wireless/urls.py b/netbox/wireless/urls.py index cf8ea5716..ee69c46de 100644 --- a/netbox/wireless/urls.py +++ b/netbox/wireless/urls.py @@ -1,33 +1,18 @@ from django.urls import include, path from utilities.urls import get_model_urls -from . import views +from . import views # noqa F401 app_name = 'wireless' urlpatterns = ( - # Wireless LAN groups - path('wireless-lan-groups/', views.WirelessLANGroupListView.as_view(), name='wirelesslangroup_list'), - path('wireless-lan-groups/add/', views.WirelessLANGroupEditView.as_view(), name='wirelesslangroup_add'), - path('wireless-lan-groups/import/', views.WirelessLANGroupBulkImportView.as_view(), name='wirelesslangroup_import'), - path('wireless-lan-groups/edit/', views.WirelessLANGroupBulkEditView.as_view(), name='wirelesslangroup_bulk_edit'), - path('wireless-lan-groups/delete/', views.WirelessLANGroupBulkDeleteView.as_view(), name='wirelesslangroup_bulk_delete'), + path('wireless-lan-groups/', include(get_model_urls('wireless', 'wirelesslangroup', detail=False))), path('wireless-lan-groups//', include(get_model_urls('wireless', 'wirelesslangroup'))), - # Wireless LANs - path('wireless-lans/', views.WirelessLANListView.as_view(), name='wirelesslan_list'), - path('wireless-lans/add/', views.WirelessLANEditView.as_view(), name='wirelesslan_add'), - path('wireless-lans/import/', views.WirelessLANBulkImportView.as_view(), name='wirelesslan_import'), - path('wireless-lans/edit/', views.WirelessLANBulkEditView.as_view(), name='wirelesslan_bulk_edit'), - path('wireless-lans/delete/', views.WirelessLANBulkDeleteView.as_view(), name='wirelesslan_bulk_delete'), + path('wireless-lans/', include(get_model_urls('wireless', 'wirelesslan', detail=False))), path('wireless-lans//', include(get_model_urls('wireless', 'wirelesslan'))), - # Wireless links - path('wireless-links/', views.WirelessLinkListView.as_view(), name='wirelesslink_list'), - path('wireless-links/add/', views.WirelessLinkEditView.as_view(), name='wirelesslink_add'), - path('wireless-links/import/', views.WirelessLinkBulkImportView.as_view(), name='wirelesslink_import'), - path('wireless-links/edit/', views.WirelessLinkBulkEditView.as_view(), name='wirelesslink_bulk_edit'), - path('wireless-links/delete/', views.WirelessLinkBulkDeleteView.as_view(), name='wirelesslink_bulk_delete'), + path('wireless-links/', include(get_model_urls('wireless', 'wirelesslink', detail=False))), path('wireless-links//', include(get_model_urls('wireless', 'wirelesslink'))), ) diff --git a/netbox/wireless/views.py b/netbox/wireless/views.py index 5063f0fee..6c5ae6f94 100644 --- a/netbox/wireless/views.py +++ b/netbox/wireless/views.py @@ -10,6 +10,7 @@ from .models import * # Wireless LAN groups # +@register_model_view(WirelessLANGroup, 'list', path='', detail=False) class WirelessLANGroupListView(generic.ObjectListView): queryset = WirelessLANGroup.objects.add_related_count( WirelessLANGroup.objects.all(), @@ -35,6 +36,7 @@ class WirelessLANGroupView(GetRelatedModelsMixin, generic.ObjectView): } +@register_model_view(WirelessLANGroup, 'add', detail=False) @register_model_view(WirelessLANGroup, 'edit') class WirelessLANGroupEditView(generic.ObjectEditView): queryset = WirelessLANGroup.objects.all() @@ -46,11 +48,13 @@ class WirelessLANGroupDeleteView(generic.ObjectDeleteView): queryset = WirelessLANGroup.objects.all() +@register_model_view(WirelessLANGroup, 'import', detail=False) class WirelessLANGroupBulkImportView(generic.BulkImportView): queryset = WirelessLANGroup.objects.all() model_form = forms.WirelessLANGroupImportForm +@register_model_view(WirelessLANGroup, 'bulk_edit', path='edit', detail=False) class WirelessLANGroupBulkEditView(generic.BulkEditView): queryset = WirelessLANGroup.objects.add_related_count( WirelessLANGroup.objects.all(), @@ -64,6 +68,7 @@ class WirelessLANGroupBulkEditView(generic.BulkEditView): form = forms.WirelessLANGroupBulkEditForm +@register_model_view(WirelessLANGroup, 'bulk_delete', path='delete', detail=False) class WirelessLANGroupBulkDeleteView(generic.BulkDeleteView): queryset = WirelessLANGroup.objects.add_related_count( WirelessLANGroup.objects.all(), @@ -80,6 +85,7 @@ class WirelessLANGroupBulkDeleteView(generic.BulkDeleteView): # Wireless LANs # +@register_model_view(WirelessLAN, 'list', path='', detail=False) class WirelessLANListView(generic.ObjectListView): queryset = WirelessLAN.objects.annotate( interface_count=count_related(Interface, 'wireless_lans') @@ -105,6 +111,7 @@ class WirelessLANView(generic.ObjectView): } +@register_model_view(WirelessLAN, 'add', detail=False) @register_model_view(WirelessLAN, 'edit') class WirelessLANEditView(generic.ObjectEditView): queryset = WirelessLAN.objects.all() @@ -116,11 +123,13 @@ class WirelessLANDeleteView(generic.ObjectDeleteView): queryset = WirelessLAN.objects.all() +@register_model_view(WirelessLAN, 'import', detail=False) class WirelessLANBulkImportView(generic.BulkImportView): queryset = WirelessLAN.objects.all() model_form = forms.WirelessLANImportForm +@register_model_view(WirelessLAN, 'bulk_edit', path='edit', detail=False) class WirelessLANBulkEditView(generic.BulkEditView): queryset = WirelessLAN.objects.all() filterset = filtersets.WirelessLANFilterSet @@ -128,6 +137,7 @@ class WirelessLANBulkEditView(generic.BulkEditView): form = forms.WirelessLANBulkEditForm +@register_model_view(WirelessLAN, 'bulk_delete', path='delete', detail=False) class WirelessLANBulkDeleteView(generic.BulkDeleteView): queryset = WirelessLAN.objects.all() filterset = filtersets.WirelessLANFilterSet @@ -138,6 +148,7 @@ class WirelessLANBulkDeleteView(generic.BulkDeleteView): # Wireless Links # +@register_model_view(WirelessLink, 'list', path='', detail=False) class WirelessLinkListView(generic.ObjectListView): queryset = WirelessLink.objects.all() filterset = filtersets.WirelessLinkFilterSet @@ -150,6 +161,7 @@ class WirelessLinkView(generic.ObjectView): queryset = WirelessLink.objects.all() +@register_model_view(WirelessLink, 'add', detail=False) @register_model_view(WirelessLink, 'edit') class WirelessLinkEditView(generic.ObjectEditView): queryset = WirelessLink.objects.all() @@ -161,11 +173,13 @@ class WirelessLinkDeleteView(generic.ObjectDeleteView): queryset = WirelessLink.objects.all() +@register_model_view(WirelessLink, 'import', detail=False) class WirelessLinkBulkImportView(generic.BulkImportView): queryset = WirelessLink.objects.all() model_form = forms.WirelessLinkImportForm +@register_model_view(WirelessLink, 'bulk_edit', path='edit', detail=False) class WirelessLinkBulkEditView(generic.BulkEditView): queryset = WirelessLink.objects.all() filterset = filtersets.WirelessLinkFilterSet @@ -173,6 +187,7 @@ class WirelessLinkBulkEditView(generic.BulkEditView): form = forms.WirelessLinkBulkEditForm +@register_model_view(WirelessLink, 'bulk_delete', path='delete', detail=False) class WirelessLinkBulkDeleteView(generic.BulkDeleteView): queryset = WirelessLink.objects.all() filterset = filtersets.WirelessLinkFilterSet From 9ccbb08e2930efe333771c5bf6430f5eb11d4e0e Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 20 Nov 2024 15:03:56 -0600 Subject: [PATCH 045/169] Fixes: #18037 - Bound VLANGroup VLAN ID max by `VLAN_VID_MAX` (#18041) * Fixes: #18037 - Bound VLANGroup VLAN ID max by `VLAN_VID_MAX` * Correct exception string * Validate min & max VID values * Fix min/max VID validation --------- Co-authored-by: Jeremy Stretch --- netbox/ipam/models/vlans.py | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 998bc9e2c..ea26bd3b5 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -97,16 +97,32 @@ class VLANGroup(OrganizationalModel): raise ValidationError(_("Cannot set scope_id without scope_type.")) # Validate VID ranges - if self.vid_ranges and check_ranges_overlap(self.vid_ranges): - raise ValidationError({'vid_ranges': _("Ranges cannot overlap.")}) for vid_range in self.vid_ranges: - if vid_range.lower > vid_range.upper: + lower_vid = vid_range.lower if vid_range.lower_inc else vid_range.lower + 1 + upper_vid = vid_range.upper if vid_range.upper_inc else vid_range.upper - 1 + if lower_vid < VLAN_VID_MIN: + raise ValidationError({ + 'vid_ranges': _("Starting VLAN ID in range ({value}) cannot be less than {minimum}").format( + value=lower_vid, minimum=VLAN_VID_MIN + ) + }) + if upper_vid > VLAN_VID_MAX: + raise ValidationError({ + 'vid_ranges': _("Ending VLAN ID in range ({value}) cannot exceed {maximum}").format( + value=upper_vid, maximum=VLAN_VID_MAX + ) + }) + if lower_vid > upper_vid: raise ValidationError({ 'vid_ranges': _( - "Maximum child VID must be greater than or equal to minimum child VID ({value})" - ).format(value=vid_range) + "Ending VLAN ID in range must be greater than or equal to the starting VLAN ID ({range})" + ).format(range=f'{lower_vid}-{upper_vid}') }) + # Check for overlapping VID ranges + if self.vid_ranges and check_ranges_overlap(self.vid_ranges): + raise ValidationError({'vid_ranges': _("Ranges cannot overlap.")}) + def save(self, *args, **kwargs): self._total_vlan_ids = 0 for vid_range in self.vid_ranges: From 09a0e579faa6d549dcf1f82ebbc9454ddc8e1c61 Mon Sep 17 00:00:00 2001 From: Alexander Haase Date: Thu, 21 Nov 2024 14:43:59 +0100 Subject: [PATCH 046/169] Fixes: #17923, #17921 - Fix non-null constraint for script execution (#17932) * Fix non-null constraint for script execution With c34a0e2, validation of job object fields is enabled, so ScriptJob must not set required fields to empty strings. This commit reverts b18f193 and (hopefully) fixes this issue not only for UI views, but for all interactions with scripts. Fixes: #17923 * Fix name of recurring jobs For recurring jobs, the name must be passed to the next job object when the job is rescheduled. --- netbox/extras/jobs.py | 4 +--- netbox/extras/views.py | 1 - netbox/netbox/jobs.py | 1 + 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/netbox/extras/jobs.py b/netbox/extras/jobs.py index a913fe456..190166b5b 100644 --- a/netbox/extras/jobs.py +++ b/netbox/extras/jobs.py @@ -22,9 +22,7 @@ class ScriptJob(JobRunner): """ class Meta: - # An explicit job name is not set because it doesn't make sense in this context. Currently, there's no scenario - # where jobs other than this one are used. Therefore, it is hidden, resulting in a cleaner job table overview. - name = '' + name = 'Run Script' def run_script(self, script, request, data, commit): """ diff --git a/netbox/extras/views.py b/netbox/extras/views.py index 0d98b1324..a87758adc 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -1181,7 +1181,6 @@ class ScriptView(BaseScriptView): request=copy_safe_request(request), job_timeout=script.python_class.job_timeout, commit=form.cleaned_data.pop('_commit'), - name=script.name ) return redirect('extras:script_result', job_pk=job.pk) diff --git a/netbox/netbox/jobs.py b/netbox/netbox/jobs.py index ae8f2f109..8c3e23730 100644 --- a/netbox/netbox/jobs.py +++ b/netbox/netbox/jobs.py @@ -72,6 +72,7 @@ class JobRunner(ABC): kwargs["job_timeout"] = job.object.python_class.job_timeout cls.enqueue( instance=job.object, + name=job.name, user=job.user, schedule_at=new_scheduled_time, interval=job.interval, From 1e5d19927aa3b7547a647f0df524e0146cad9443 Mon Sep 17 00:00:00 2001 From: Joel McGuire Date: Thu, 21 Nov 2024 09:47:55 -0600 Subject: [PATCH 047/169] Interface type change fixing #17934 (#18025) * fix #17934 adding 1000base-LX * add extra space --------- Co-authored-by: Joel L. McGuire --- netbox/dcim/choices.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index 11d192732..776846e44 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -871,6 +871,7 @@ class InterfaceTypeChoices(ChoiceSet): TYPE_100ME_T1 = '100base-t1' TYPE_100ME_SFP = '100base-x-sfp' TYPE_1GE_FIXED = '1000base-t' + TYPE_1GE_LX_FIXED = '1000base-lx' TYPE_1GE_TX_FIXED = '1000base-tx' TYPE_1GE_GBIC = '1000base-x-gbic' TYPE_1GE_SFP = '1000base-x-sfp' @@ -1033,6 +1034,7 @@ class InterfaceTypeChoices(ChoiceSet): (TYPE_100ME_FIXED, '100BASE-TX (10/100ME)'), (TYPE_100ME_T1, '100BASE-T1 (10/100ME Single Pair)'), (TYPE_1GE_FIXED, '1000BASE-T (1GE)'), + (TYPE_1GE_LX_FIXED, '1000BASE-LX (1GE)'), (TYPE_1GE_TX_FIXED, '1000BASE-TX (1GE)'), (TYPE_2GE_FIXED, '2.5GBASE-T (2.5GE)'), (TYPE_5GE_FIXED, '5GBASE-T (5GE)'), From b40ffcccb9ab4e988c5834bc13991afdf89fc372 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Nov 2024 10:51:26 -0500 Subject: [PATCH 048/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 10853 ++++++++--------- 1 file changed, 5082 insertions(+), 5771 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 1d35fb8b2..7944e0a33 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-13 05:01+0000\n" +"POT-Creation-Date: 2024-11-21 15:50+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,8074 +18,7554 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 -#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 -#: netbox/users/forms/model_forms.py:112 +#: account/tables.py:27 templates/account/token.html:22 +#: templates/users/token.html:17 users/forms/bulk_import.py:39 +#: users/forms/model_forms.py:112 msgid "Key" msgstr "" -#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 +#: account/tables.py:31 users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "" -#: netbox/account/tables.py:35 netbox/core/choices.py:86 -#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 -#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 -#: netbox/templates/account/token.html:43 -#: netbox/templates/core/configrevision.html:26 -#: netbox/templates/core/configrevision_restore.html:12 -#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 -#: netbox/templates/core/rq_task.html:73 -#: netbox/templates/core/rq_worker.html:14 -#: netbox/templates/extras/htmx/script_result.html:12 -#: netbox/templates/extras/journalentry.html:22 -#: netbox/templates/generic/object.html:58 netbox/templates/users/token.html:35 +#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 +#: core/tables/tasks.py:79 extras/tables/tables.py:335 +#: extras/tables/tables.py:566 templates/account/token.html:43 +#: templates/core/configrevision.html:26 +#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 +#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 +#: templates/core/rq_worker.html:14 templates/extras/htmx/script_result.html:12 +#: templates/extras/journalentry.html:22 templates/generic/object.html:58 +#: templates/users/token.html:35 msgid "Created" msgstr "" -#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 -#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 -#: netbox/users/forms/filtersets.py:136 +#: account/tables.py:39 templates/account/token.html:47 +#: templates/users/token.html:39 users/forms/bulk_edit.py:117 +#: users/forms/filtersets.py:136 msgid "Expires" msgstr "" -#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 +#: account/tables.py:42 users/forms/filtersets.py:141 msgid "Last Used" msgstr "" -#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 -#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 -#: netbox/users/forms/model_forms.py:124 +#: account/tables.py:45 templates/account/token.html:55 +#: templates/users/token.html:47 users/forms/bulk_edit.py:122 +#: users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "" -#: netbox/account/views.py:114 +#: account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "" -#: netbox/account/views.py:164 +#: account/views.py:164 msgid "You have logged out." msgstr "" -#: netbox/account/views.py:216 +#: account/views.py:216 msgid "Your preferences have been updated." msgstr "" -#: netbox/account/views.py:239 +#: account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" -#: netbox/account/views.py:254 +#: account/views.py:254 msgid "Your password has been changed successfully." msgstr "" -#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 -#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 -#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1530 -#: netbox/dcim/choices.py:1606 netbox/dcim/choices.py:1656 -#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 -#: netbox/vpn/choices.py:18 +#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 +#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 +#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 +#: virtualization/choices.py:45 vpn/choices.py:18 msgid "Planned" msgstr "" -#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 +#: circuits/choices.py:22 netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "" -#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 -#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 -#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 -#: netbox/dcim/choices.py:1605 netbox/dcim/choices.py:1655 -#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 -#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 -#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 -#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 -#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 -#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 +#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 +#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 +#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 +#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 ipam/choices.py:154 +#: templates/extras/configcontext.html:25 templates/users/user.html:37 +#: users/forms/bulk_edit.py:38 virtualization/choices.py:22 +#: virtualization/choices.py:44 vpn/choices.py:19 wireless/choices.py:25 msgid "Active" msgstr "" -#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 -#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1604 -#: netbox/dcim/choices.py:1657 netbox/virtualization/choices.py:24 -#: netbox/virtualization/choices.py:43 +#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 +#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 +#: virtualization/choices.py:43 msgid "Offline" msgstr "" -#: netbox/circuits/choices.py:25 +#: circuits/choices.py:25 msgid "Deprovisioning" msgstr "" -#: netbox/circuits/choices.py:26 +#: circuits/choices.py:26 msgid "Decommissioned" msgstr "" -#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1617 -#: netbox/tenancy/choices.py:17 +#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 msgid "Primary" msgstr "" -#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 -#: netbox/tenancy/choices.py:18 +#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 msgid "Secondary" msgstr "" -#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 +#: circuits/choices.py:92 tenancy/choices.py:19 msgid "Tertiary" msgstr "" -#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 +#: circuits/choices.py:93 tenancy/choices.py:20 msgid "Inactive" msgstr "" -#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 -#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 -#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 -#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 -#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 -#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 -#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 -#: netbox/virtualization/filtersets.py:45 -#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 +#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 +#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 +#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 +#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 +#: ipam/filtersets.py:339 ipam/filtersets.py:959 +#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 +#: vpn/filtersets.py:358 msgid "Region (ID)" msgstr "" -#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 -#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 -#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 -#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 -#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 -#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 -#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 -#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 -#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 +#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 +#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 +#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 +#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 +#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 +#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 +#: vpn/filtersets.py:353 msgid "Region (slug)" msgstr "" -#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 -#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 -#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 -#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 -#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 -#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 -#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 -#: netbox/virtualization/filtersets.py:186 +#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 +#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 +#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 +#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 +#: ipam/filtersets.py:972 virtualization/filtersets.py:58 +#: virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "" -#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 -#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 -#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 -#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 -#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 -#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 -#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 -#: netbox/virtualization/filtersets.py:65 -#: netbox/virtualization/filtersets.py:193 +#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 +#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 +#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 +#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 +#: ipam/filtersets.py:359 ipam/filtersets.py:979 +#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "" -#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 -#: netbox/circuits/forms/bulk_edit.py:216 -#: netbox/circuits/forms/bulk_import.py:124 -#: netbox/circuits/forms/filtersets.py:51 -#: netbox/circuits/forms/filtersets.py:171 -#: netbox/circuits/forms/filtersets.py:209 -#: netbox/circuits/forms/model_forms.py:138 -#: netbox/circuits/forms/model_forms.py:154 -#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 -#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:678 -#: netbox/dcim/forms/bulk_edit.py:883 netbox/dcim/forms/bulk_import.py:131 -#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:309 -#: netbox/dcim/forms/bulk_import.py:540 netbox/dcim/forms/bulk_import.py:1311 -#: netbox/dcim/forms/bulk_import.py:1339 netbox/dcim/forms/filtersets.py:87 -#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 -#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 -#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 -#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 -#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 -#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 -#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 -#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 -#: netbox/dcim/forms/object_create.py:391 netbox/dcim/tables/devices.py:153 -#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 -#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 -#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 -#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 -#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 -#: netbox/ipam/forms/bulk_import.py:429 netbox/ipam/forms/filtersets.py:153 -#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 -#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 -#: netbox/ipam/forms/model_forms.py:636 netbox/ipam/tables/ip.py:245 -#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 -#: netbox/templates/dcim/device.html:22 -#: netbox/templates/dcim/inc/cable_termination.html:8 -#: netbox/templates/dcim/inc/cable_termination.html:33 -#: netbox/templates/dcim/location.html:37 -#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 -#: netbox/templates/dcim/rackreservation.html:28 -#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 -#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 -#: netbox/templates/virtualization/cluster.html:42 -#: netbox/templates/virtualization/virtualmachine.html:95 -#: netbox/virtualization/forms/bulk_edit.py:91 -#: netbox/virtualization/forms/bulk_edit.py:109 -#: netbox/virtualization/forms/bulk_edit.py:124 -#: netbox/virtualization/forms/bulk_import.py:59 -#: netbox/virtualization/forms/bulk_import.py:85 -#: netbox/virtualization/forms/filtersets.py:79 -#: netbox/virtualization/forms/filtersets.py:148 -#: netbox/virtualization/forms/model_forms.py:71 -#: netbox/virtualization/forms/model_forms.py:104 -#: netbox/virtualization/forms/model_forms.py:171 -#: netbox/virtualization/tables/clusters.py:77 -#: netbox/virtualization/tables/virtualmachines.py:63 -#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 -#: netbox/wireless/forms/model_forms.py:118 +#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 +#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 +#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 +#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 +#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 +#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 +#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 +#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 +#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 +#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 +#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 +#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 +#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 +#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 +#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 +#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 +#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 +#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 +#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 +#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 +#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 +#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 +#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 +#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 +#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 +#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 +#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 +#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 +#: templates/circuits/inc/circuit_termination_fields.html:6 +#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 +#: templates/dcim/inc/cable_termination.html:33 templates/dcim/location.html:37 +#: templates/dcim/powerpanel.html:22 templates/dcim/rack.html:20 +#: templates/dcim/rackreservation.html:28 templates/dcim/site.html:28 +#: templates/ipam/prefix.html:56 templates/ipam/vlan.html:23 +#: templates/ipam/vlan_edit.html:40 templates/virtualization/cluster.html:42 +#: templates/virtualization/virtualmachine.html:95 +#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 +#: virtualization/forms/bulk_edit.py:124 virtualization/forms/bulk_import.py:59 +#: virtualization/forms/bulk_import.py:85 virtualization/forms/filtersets.py:79 +#: virtualization/forms/filtersets.py:148 +#: virtualization/forms/model_forms.py:71 +#: virtualization/forms/model_forms.py:104 +#: virtualization/forms/model_forms.py:171 virtualization/tables/clusters.py:77 +#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 +#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 msgid "Site" msgstr "" -#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 -#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 -#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 -#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 -#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 -#: netbox/virtualization/filtersets.py:75 -#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 +#: circuits/filtersets.py:62 circuits/filtersets.py:229 +#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 +#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 +#: ipam/filtersets.py:369 ipam/filtersets.py:989 +#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 +#: vpn/filtersets.py:363 msgid "Site (slug)" msgstr "" -#: netbox/circuits/filtersets.py:67 +#: circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "" -#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 -#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 -#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 -#: netbox/templates/ipam/asn.html:20 +#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 +#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 +#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 msgid "ASN" msgstr "" -#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 -#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 -#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 +#: circuits/filtersets.py:95 circuits/filtersets.py:122 +#: circuits/filtersets.py:156 circuits/filtersets.py:283 +#: circuits/filtersets.py:325 ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "" -#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 -#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 -#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 +#: circuits/filtersets.py:101 circuits/filtersets.py:128 +#: circuits/filtersets.py:162 circuits/filtersets.py:289 +#: circuits/filtersets.py:331 ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "" -#: netbox/circuits/filtersets.py:167 +#: circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "" -#: netbox/circuits/filtersets.py:173 +#: circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "" -#: netbox/circuits/filtersets.py:178 +#: circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "" -#: netbox/circuits/filtersets.py:182 +#: circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "" -#: netbox/circuits/filtersets.py:188 +#: circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "" -#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 -#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 -#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 -#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 -#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 -#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 -#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 -#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 +#: circuits/filtersets.py:223 circuits/filtersets.py:268 dcim/filtersets.py:236 +#: dcim/filtersets.py:357 dcim/filtersets.py:452 dcim/filtersets.py:1045 +#: dcim/filtersets.py:1393 dcim/filtersets.py:1928 dcim/filtersets.py:2170 +#: dcim/filtersets.py:2229 ipam/filtersets.py:232 ipam/filtersets.py:363 +#: ipam/filtersets.py:983 virtualization/filtersets.py:69 +#: virtualization/filtersets.py:197 vpn/filtersets.py:368 msgid "Site (ID)" msgstr "" -#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 +#: circuits/filtersets.py:233 circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "" -#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 -#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 -#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 -#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 -#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 -#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 -#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 -#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 -#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 -#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 -#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 -#: netbox/ipam/forms/model_forms.py:449 netbox/netbox/filtersets.py:282 -#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 -#: netbox/templates/htmx/object_selector.html:28 -#: netbox/templates/inc/filter_list.html:46 -#: netbox/templates/ipam/ipaddress_assign.html:29 -#: netbox/templates/search.html:7 netbox/templates/search.html:26 -#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 -#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 -#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 -#: netbox/utilities/templates/navigation/menu.html:16 +#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 +#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 +#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 +#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 +#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 +#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 +#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 +#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 +#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 +#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 +#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 +#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 +#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 +#: users/filtersets.py:150 utilities/forms/forms.py:104 +#: utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "" -#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 -#: netbox/circuits/forms/bulk_edit.py:246 -#: netbox/circuits/forms/bulk_import.py:115 -#: netbox/circuits/forms/filtersets.py:198 -#: netbox/circuits/forms/filtersets.py:214 -#: netbox/circuits/forms/filtersets.py:260 -#: netbox/circuits/forms/model_forms.py:111 -#: netbox/circuits/forms/model_forms.py:133 -#: netbox/circuits/forms/model_forms.py:199 -#: netbox/circuits/tables/circuits.py:104 -#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 -#: netbox/templates/circuits/circuit.html:15 -#: netbox/templates/circuits/circuitgroupassignment.html:26 -#: netbox/templates/circuits/circuittermination.html:19 -#: netbox/templates/dcim/inc/cable_termination.html:55 -#: netbox/templates/dcim/trace/circuit.html:4 +#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 +#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 +#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 +#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 +#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 +#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 +#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 +#: templates/circuits/circuitgroupassignment.html:26 +#: templates/circuits/circuittermination.html:19 +#: templates/dcim/inc/cable_termination.html:55 +#: templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "" -#: netbox/circuits/filtersets.py:278 +#: circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "" -#: netbox/circuits/filtersets.py:335 +#: circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "" -#: netbox/circuits/filtersets.py:341 +#: circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "" -#: netbox/circuits/filtersets.py:345 +#: circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "" -#: netbox/circuits/filtersets.py:351 +#: circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:30 netbox/circuits/forms/filtersets.py:56 -#: netbox/circuits/forms/model_forms.py:29 -#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 -#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 -#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 -#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 -#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 -#: netbox/templates/circuits/provider.html:23 +#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 +#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 +#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 +#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 +#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 +#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 +#: templates/circuits/provider.html:23 msgid "ASNs" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 -#: netbox/circuits/forms/bulk_edit.py:83 netbox/circuits/forms/bulk_edit.py:104 -#: netbox/circuits/forms/bulk_edit.py:164 -#: netbox/circuits/forms/bulk_edit.py:183 -#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 -#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 -#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 -#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 -#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:433 -#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:482 -#: netbox/dcim/forms/bulk_edit.py:541 netbox/dcim/forms/bulk_edit.py:585 -#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 -#: netbox/dcim/forms/bulk_edit.py:716 netbox/dcim/forms/bulk_edit.py:777 -#: netbox/dcim/forms/bulk_edit.py:829 netbox/dcim/forms/bulk_edit.py:852 -#: netbox/dcim/forms/bulk_edit.py:900 netbox/dcim/forms/bulk_edit.py:970 -#: netbox/dcim/forms/bulk_edit.py:1023 netbox/dcim/forms/bulk_edit.py:1058 -#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_edit.py:1142 -#: netbox/dcim/forms/bulk_edit.py:1187 netbox/dcim/forms/bulk_edit.py:1214 -#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 -#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/bulk_edit.py:1720 -#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 -#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 -#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 -#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 -#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 -#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 -#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 -#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 -#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 -#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 -#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 -#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 -#: netbox/templates/account/token.html:35 -#: netbox/templates/circuits/circuit.html:59 -#: netbox/templates/circuits/circuitgroup.html:32 -#: netbox/templates/circuits/circuittype.html:26 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 -#: netbox/templates/circuits/provider.html:33 -#: netbox/templates/circuits/providernetwork.html:32 -#: netbox/templates/core/datasource.html:54 -#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 -#: netbox/templates/dcim/consoleport.html:44 -#: netbox/templates/dcim/consoleserverport.html:44 -#: netbox/templates/dcim/device.html:94 netbox/templates/dcim/devicebay.html:32 -#: netbox/templates/dcim/devicerole.html:30 -#: netbox/templates/dcim/devicetype.html:33 -#: netbox/templates/dcim/frontport.html:58 -#: netbox/templates/dcim/interface.html:69 -#: netbox/templates/dcim/inventoryitem.html:60 -#: netbox/templates/dcim/inventoryitemrole.html:22 -#: netbox/templates/dcim/location.html:33 -#: netbox/templates/dcim/manufacturer.html:40 -#: netbox/templates/dcim/module.html:73 netbox/templates/dcim/modulebay.html:42 -#: netbox/templates/dcim/moduletype.html:37 -#: netbox/templates/dcim/platform.html:33 -#: netbox/templates/dcim/powerfeed.html:40 -#: netbox/templates/dcim/poweroutlet.html:40 -#: netbox/templates/dcim/powerpanel.html:30 -#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 -#: netbox/templates/dcim/rackreservation.html:62 -#: netbox/templates/dcim/rackrole.html:26 -#: netbox/templates/dcim/racktype.html:24 -#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 -#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 -#: netbox/templates/dcim/virtualchassis.html:31 -#: netbox/templates/extras/configcontext.html:21 -#: netbox/templates/extras/configtemplate.html:17 -#: netbox/templates/extras/customfield.html:34 -#: netbox/templates/extras/dashboard/widget_add.html:14 -#: netbox/templates/extras/eventrule.html:21 -#: netbox/templates/extras/exporttemplate.html:19 -#: netbox/templates/extras/notificationgroup.html:20 -#: netbox/templates/extras/savedfilter.html:17 -#: netbox/templates/extras/script_list.html:46 -#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 -#: netbox/templates/generic/bulk_import.html:120 -#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 -#: netbox/templates/ipam/asnrange.html:38 -#: netbox/templates/ipam/fhrpgroup.html:34 -#: netbox/templates/ipam/ipaddress.html:55 -#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 -#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 -#: netbox/templates/ipam/routetarget.html:21 -#: netbox/templates/ipam/service.html:50 -#: netbox/templates/ipam/servicetemplate.html:27 -#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 -#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 -#: netbox/templates/tenancy/contactgroup.html:25 -#: netbox/templates/tenancy/contactrole.html:22 -#: netbox/templates/tenancy/tenant.html:24 -#: netbox/templates/tenancy/tenantgroup.html:33 -#: netbox/templates/users/group.html:21 -#: netbox/templates/users/objectpermission.html:21 -#: netbox/templates/users/token.html:27 -#: netbox/templates/virtualization/cluster.html:25 -#: netbox/templates/virtualization/clustergroup.html:26 -#: netbox/templates/virtualization/clustertype.html:26 -#: netbox/templates/virtualization/virtualdisk.html:39 -#: netbox/templates/virtualization/virtualmachine.html:31 -#: netbox/templates/virtualization/vminterface.html:51 -#: netbox/templates/vpn/ikepolicy.html:17 -#: netbox/templates/vpn/ikeproposal.html:17 -#: netbox/templates/vpn/ipsecpolicy.html:17 -#: netbox/templates/vpn/ipsecprofile.html:17 -#: netbox/templates/vpn/ipsecprofile.html:40 -#: netbox/templates/vpn/ipsecprofile.html:73 -#: netbox/templates/vpn/ipsecproposal.html:17 -#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 -#: netbox/templates/vpn/tunnelgroup.html:30 -#: netbox/templates/wireless/wirelesslan.html:26 -#: netbox/templates/wireless/wirelesslangroup.html:33 -#: netbox/templates/wireless/wirelesslink.html:34 -#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 -#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 -#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 -#: netbox/virtualization/forms/bulk_edit.py:32 -#: netbox/virtualization/forms/bulk_edit.py:46 -#: netbox/virtualization/forms/bulk_edit.py:100 -#: netbox/virtualization/forms/bulk_edit.py:177 -#: netbox/virtualization/forms/bulk_edit.py:228 -#: netbox/virtualization/forms/bulk_edit.py:337 -#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 -#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 -#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 -#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 -#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 -#: netbox/wireless/forms/bulk_edit.py:140 +#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 +#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 +#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 +#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 +#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 +#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 +#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 +#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 +#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 +#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 +#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 +#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 +#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 +#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 +#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 +#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 +#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 +#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 +#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 +#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 +#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 +#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 +#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 +#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 +#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 +#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 +#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 +#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 +#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 +#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 +#: templates/account/token.html:35 templates/circuits/circuit.html:59 +#: templates/circuits/circuitgroup.html:32 +#: templates/circuits/circuittype.html:26 +#: templates/circuits/inc/circuit_termination_fields.html:88 +#: templates/circuits/provider.html:33 +#: templates/circuits/providernetwork.html:32 templates/core/datasource.html:54 +#: templates/core/plugin.html:80 templates/dcim/cable.html:36 +#: templates/dcim/consoleport.html:44 templates/dcim/consoleserverport.html:44 +#: templates/dcim/device.html:94 templates/dcim/devicebay.html:32 +#: templates/dcim/devicerole.html:30 templates/dcim/devicetype.html:33 +#: templates/dcim/frontport.html:58 templates/dcim/interface.html:69 +#: templates/dcim/inventoryitem.html:60 +#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 +#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 +#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 +#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 +#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 +#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 +#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 +#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 +#: templates/dcim/region.html:33 templates/dcim/site.html:60 +#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 +#: templates/extras/configcontext.html:21 +#: templates/extras/configtemplate.html:17 templates/extras/customfield.html:34 +#: templates/extras/dashboard/widget_add.html:14 +#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 +#: templates/extras/notificationgroup.html:20 +#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 +#: templates/extras/tag.html:20 templates/extras/webhook.html:17 +#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 +#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 +#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 +#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 +#: templates/ipam/rir.html:26 templates/ipam/role.html:26 +#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 +#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 +#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 +#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 +#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 +#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 +#: templates/users/objectpermission.html:21 templates/users/token.html:27 +#: templates/virtualization/cluster.html:25 +#: templates/virtualization/clustergroup.html:26 +#: templates/virtualization/clustertype.html:26 +#: templates/virtualization/virtualdisk.html:39 +#: templates/virtualization/virtualmachine.html:31 +#: templates/virtualization/vminterface.html:51 templates/vpn/ikepolicy.html:17 +#: templates/vpn/ikeproposal.html:17 templates/vpn/ipsecpolicy.html:17 +#: templates/vpn/ipsecprofile.html:17 templates/vpn/ipsecprofile.html:40 +#: templates/vpn/ipsecprofile.html:73 templates/vpn/ipsecproposal.html:17 +#: templates/vpn/l2vpn.html:26 templates/vpn/tunnel.html:33 +#: templates/vpn/tunnelgroup.html:30 templates/wireless/wirelesslan.html:26 +#: templates/wireless/wirelesslangroup.html:33 +#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 +#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 +#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 +#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 +#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 +#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 +#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 +#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 +#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 +#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 +#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 +#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 -#: netbox/circuits/forms/bulk_edit.py:123 -#: netbox/circuits/forms/bulk_import.py:36 -#: netbox/circuits/forms/bulk_import.py:51 -#: netbox/circuits/forms/bulk_import.py:74 -#: netbox/circuits/forms/filtersets.py:70 -#: netbox/circuits/forms/filtersets.py:88 -#: netbox/circuits/forms/filtersets.py:116 -#: netbox/circuits/forms/filtersets.py:131 -#: netbox/circuits/forms/filtersets.py:199 -#: netbox/circuits/forms/filtersets.py:232 -#: netbox/circuits/forms/filtersets.py:255 -#: netbox/circuits/forms/model_forms.py:47 -#: netbox/circuits/forms/model_forms.py:61 -#: netbox/circuits/forms/model_forms.py:93 -#: netbox/circuits/tables/circuits.py:58 netbox/circuits/tables/circuits.py:108 -#: netbox/circuits/tables/circuits.py:160 -#: netbox/circuits/tables/providers.py:72 -#: netbox/circuits/tables/providers.py:103 -#: netbox/templates/circuits/circuit.html:18 -#: netbox/templates/circuits/circuittermination.html:25 -#: netbox/templates/circuits/provider.html:20 -#: netbox/templates/circuits/provideraccount.html:20 -#: netbox/templates/circuits/providernetwork.html:20 -#: netbox/templates/dcim/inc/cable_termination.html:51 +#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 +#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 +#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 +#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 +#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 +#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 +#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 +#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 +#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 +#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 +#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 +#: templates/circuits/circuittermination.html:25 +#: templates/circuits/provider.html:20 +#: templates/circuits/provideraccount.html:20 +#: templates/circuits/providernetwork.html:20 +#: templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:80 netbox/circuits/forms/filtersets.py:91 -#: netbox/templates/circuits/providernetwork.html:28 +#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 +#: templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:100 -#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 -#: netbox/dcim/forms/bulk_edit.py:605 netbox/dcim/forms/bulk_edit.py:814 -#: netbox/dcim/forms/bulk_edit.py:1183 netbox/dcim/forms/bulk_edit.py:1210 -#: netbox/dcim/forms/bulk_edit.py:1716 netbox/dcim/forms/filtersets.py:1064 -#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 -#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 -#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 -#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 -#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 -#: netbox/templates/circuits/circuittype.html:30 -#: netbox/templates/dcim/cable.html:40 netbox/templates/dcim/devicerole.html:34 -#: netbox/templates/dcim/frontport.html:40 -#: netbox/templates/dcim/inventoryitemrole.html:26 -#: netbox/templates/dcim/rackrole.html:30 -#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 +#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 +#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 +#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 +#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 +#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 +#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 +#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 +#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 +#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 +#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 +#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 +#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 +#: templates/extras/tag.html:26 msgid "Color" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:118 -#: netbox/circuits/forms/bulk_import.py:87 -#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 -#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 -#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 -#: netbox/dcim/forms/bulk_edit.py:792 netbox/dcim/forms/bulk_edit.py:931 -#: netbox/dcim/forms/bulk_edit.py:999 netbox/dcim/forms/bulk_edit.py:1018 -#: netbox/dcim/forms/bulk_edit.py:1041 netbox/dcim/forms/bulk_edit.py:1083 -#: netbox/dcim/forms/bulk_edit.py:1127 netbox/dcim/forms/bulk_edit.py:1178 -#: netbox/dcim/forms/bulk_edit.py:1205 netbox/dcim/forms/bulk_import.py:188 -#: netbox/dcim/forms/bulk_import.py:260 netbox/dcim/forms/bulk_import.py:708 -#: netbox/dcim/forms/bulk_import.py:734 netbox/dcim/forms/bulk_import.py:760 -#: netbox/dcim/forms/bulk_import.py:780 netbox/dcim/forms/bulk_import.py:863 -#: netbox/dcim/forms/bulk_import.py:957 netbox/dcim/forms/bulk_import.py:999 -#: netbox/dcim/forms/bulk_import.py:1213 netbox/dcim/forms/bulk_import.py:1376 -#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 -#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 -#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 -#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 -#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 -#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 -#: netbox/dcim/forms/object_import.py:84 netbox/dcim/forms/object_import.py:113 -#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 -#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 -#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 -#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 -#: netbox/netbox/tables/tables.py:240 netbox/templates/circuits/circuit.html:30 -#: netbox/templates/core/datasource.html:38 netbox/templates/dcim/cable.html:15 -#: netbox/templates/dcim/consoleport.html:36 -#: netbox/templates/dcim/consoleserverport.html:36 -#: netbox/templates/dcim/frontport.html:36 -#: netbox/templates/dcim/interface.html:46 -#: netbox/templates/dcim/interface.html:169 -#: netbox/templates/dcim/interface.html:311 -#: netbox/templates/dcim/powerfeed.html:32 -#: netbox/templates/dcim/poweroutlet.html:36 -#: netbox/templates/dcim/powerport.html:36 -#: netbox/templates/dcim/rearport.html:36 -#: netbox/templates/extras/eventrule.html:74 -#: netbox/templates/virtualization/cluster.html:17 -#: netbox/templates/vpn/l2vpn.html:22 -#: netbox/templates/wireless/inc/authentication_attrs.html:8 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 -#: netbox/virtualization/forms/bulk_edit.py:60 -#: netbox/virtualization/forms/bulk_import.py:41 -#: netbox/virtualization/forms/filtersets.py:54 -#: netbox/virtualization/forms/model_forms.py:62 -#: netbox/virtualization/tables/clusters.py:66 -#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 -#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 -#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 +#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 +#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 +#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 +#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 +#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 +#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 +#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 +#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 +#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 +#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 +#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 +#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 +#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 +#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 +#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 +#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 +#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 +#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 +#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 +#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 +#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 +#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 +#: dcim/tables/power.py:77 dcim/tables/racks.py:138 +#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 +#: extras/tables/tables.py:465 netbox/tables/tables.py:240 +#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 +#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 +#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 +#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 +#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 +#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 +#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 +#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 +#: templates/wireless/inc/authentication_attrs.html:8 +#: templates/wireless/inc/wirelesslink_interface.html:14 +#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 +#: virtualization/forms/filtersets.py:54 virtualization/forms/model_forms.py:62 +#: virtualization/tables/clusters.py:66 vpn/forms/bulk_edit.py:264 +#: vpn/forms/bulk_import.py:264 vpn/forms/filtersets.py:217 +#: vpn/forms/model_forms.py:84 vpn/forms/model_forms.py:119 +#: vpn/forms/model_forms.py:231 msgid "Type" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:128 -#: netbox/circuits/forms/bulk_import.py:80 -#: netbox/circuits/forms/filtersets.py:139 -#: netbox/circuits/forms/model_forms.py:98 +#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 +#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:136 -#: netbox/circuits/forms/bulk_import.py:93 -#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 -#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 -#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 -#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 -#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:701 -#: netbox/dcim/forms/bulk_edit.py:766 netbox/dcim/forms/bulk_edit.py:798 -#: netbox/dcim/forms/bulk_edit.py:925 netbox/dcim/forms/bulk_edit.py:1739 -#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 -#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:505 -#: netbox/dcim/forms/bulk_import.py:659 netbox/dcim/forms/bulk_import.py:1207 -#: netbox/dcim/forms/bulk_import.py:1371 netbox/dcim/forms/bulk_import.py:1435 -#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 -#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 -#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 -#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 -#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 -#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 -#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 -#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 -#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 -#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 -#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 -#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:450 -#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 -#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 -#: netbox/ipam/forms/model_forms.py:468 netbox/ipam/tables/ip.py:237 -#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 -#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 -#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 -#: netbox/templates/circuits/circuit.html:34 -#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 -#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 -#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 -#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 -#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 -#: netbox/templates/dcim/site.html:43 -#: netbox/templates/extras/script_list.html:48 -#: netbox/templates/ipam/ipaddress.html:37 -#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 -#: netbox/templates/ipam/vlan.html:48 -#: netbox/templates/virtualization/cluster.html:21 -#: netbox/templates/virtualization/virtualmachine.html:19 -#: netbox/templates/vpn/tunnel.html:25 -#: netbox/templates/wireless/wirelesslan.html:22 -#: netbox/templates/wireless/wirelesslink.html:17 -#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 -#: netbox/virtualization/forms/bulk_edit.py:70 -#: netbox/virtualization/forms/bulk_edit.py:118 -#: netbox/virtualization/forms/bulk_import.py:54 -#: netbox/virtualization/forms/bulk_import.py:80 -#: netbox/virtualization/forms/filtersets.py:62 -#: netbox/virtualization/forms/filtersets.py:160 -#: netbox/virtualization/tables/clusters.py:74 -#: netbox/virtualization/tables/virtualmachines.py:60 -#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 -#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 -#: netbox/wireless/forms/bulk_edit.py:43 netbox/wireless/forms/bulk_edit.py:105 -#: netbox/wireless/forms/bulk_import.py:43 -#: netbox/wireless/forms/bulk_import.py:84 -#: netbox/wireless/forms/filtersets.py:49 -#: netbox/wireless/forms/filtersets.py:83 -#: netbox/wireless/tables/wirelesslan.py:52 -#: netbox/wireless/tables/wirelesslink.py:20 +#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 +#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 +#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 +#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 +#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 +#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 +#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 +#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 +#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 +#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 +#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 +#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 +#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 +#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 +#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 +#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 +#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 +#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 +#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 ipam/forms/bulk_edit.py:256 +#: ipam/forms/bulk_edit.py:306 ipam/forms/bulk_edit.py:354 +#: ipam/forms/bulk_edit.py:506 ipam/forms/bulk_import.py:192 +#: ipam/forms/bulk_import.py:257 ipam/forms/bulk_import.py:293 +#: ipam/forms/bulk_import.py:450 ipam/forms/filtersets.py:210 +#: ipam/forms/filtersets.py:281 ipam/forms/filtersets.py:355 +#: ipam/forms/filtersets.py:501 ipam/forms/model_forms.py:468 +#: ipam/tables/ip.py:237 ipam/tables/ip.py:312 ipam/tables/ip.py:363 +#: ipam/tables/ip.py:426 ipam/tables/ip.py:453 ipam/tables/vlans.py:126 +#: ipam/tables/vlans.py:232 templates/circuits/circuit.html:34 +#: templates/core/datasource.html:46 templates/core/job.html:48 +#: templates/core/rq_task.html:81 templates/core/system.html:18 +#: templates/dcim/cable.html:19 templates/dcim/device.html:178 +#: templates/dcim/location.html:45 templates/dcim/module.html:69 +#: templates/dcim/powerfeed.html:36 templates/dcim/rack.html:41 +#: templates/dcim/site.html:43 templates/extras/script_list.html:48 +#: templates/ipam/ipaddress.html:37 templates/ipam/iprange.html:54 +#: templates/ipam/prefix.html:73 templates/ipam/vlan.html:48 +#: templates/virtualization/cluster.html:21 +#: templates/virtualization/virtualmachine.html:19 templates/vpn/tunnel.html:25 +#: templates/wireless/wirelesslan.html:22 +#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 +#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 +#: virtualization/forms/bulk_edit.py:118 virtualization/forms/bulk_import.py:54 +#: virtualization/forms/bulk_import.py:80 virtualization/forms/filtersets.py:62 +#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 +#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 +#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 +#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 +#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 +#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 +#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 +#: wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:142 -#: netbox/circuits/forms/bulk_edit.py:233 -#: netbox/circuits/forms/bulk_import.py:98 -#: netbox/circuits/forms/bulk_import.py:158 -#: netbox/circuits/forms/filtersets.py:119 -#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 -#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 -#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/bulk_edit.py:691 -#: netbox/dcim/forms/bulk_edit.py:804 netbox/dcim/forms/bulk_edit.py:1744 -#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 -#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:334 -#: netbox/dcim/forms/bulk_import.py:479 netbox/dcim/forms/bulk_import.py:1219 -#: netbox/dcim/forms/bulk_import.py:1428 netbox/dcim/forms/filtersets.py:173 -#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 -#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 -#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 -#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 -#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 -#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 -#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 -#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 -#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 -#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 -#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 -#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 -#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 -#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 -#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 -#: netbox/ipam/forms/bulk_import.py:443 netbox/ipam/forms/filtersets.py:48 -#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 -#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 -#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 -#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 -#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 -#: netbox/templates/circuits/circuit.html:38 -#: netbox/templates/circuits/circuitgroup.html:36 -#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 -#: netbox/templates/dcim/location.html:49 -#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 -#: netbox/templates/dcim/rackreservation.html:49 -#: netbox/templates/dcim/site.html:47 -#: netbox/templates/dcim/virtualdevicecontext.html:52 -#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 -#: netbox/templates/ipam/asnrange.html:29 -#: netbox/templates/ipam/ipaddress.html:28 -#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 -#: netbox/templates/ipam/routetarget.html:17 netbox/templates/ipam/vlan.html:39 -#: netbox/templates/ipam/vrf.html:20 netbox/templates/tenancy/tenant.html:17 -#: netbox/templates/virtualization/cluster.html:33 -#: netbox/templates/virtualization/virtualmachine.html:39 -#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 -#: netbox/templates/wireless/wirelesslan.html:34 -#: netbox/templates/wireless/wirelesslink.html:25 -#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 -#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 -#: netbox/virtualization/forms/bulk_edit.py:76 -#: netbox/virtualization/forms/bulk_edit.py:155 -#: netbox/virtualization/forms/bulk_import.py:66 -#: netbox/virtualization/forms/bulk_import.py:115 -#: netbox/virtualization/forms/filtersets.py:47 -#: netbox/virtualization/forms/filtersets.py:105 -#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 -#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 -#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 -#: netbox/wireless/forms/bulk_edit.py:110 -#: netbox/wireless/forms/bulk_import.py:55 -#: netbox/wireless/forms/bulk_import.py:97 -#: netbox/wireless/forms/filtersets.py:35 -#: netbox/wireless/forms/filtersets.py:75 +#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 +#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 +#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 +#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 +#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 +#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 +#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 +#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 +#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 +#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 +#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 +#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 +#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 +#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 +#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 +#: dcim/tables/power.py:88 extras/filtersets.py:612 +#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 +#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 +#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 +#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 +#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 +#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 +#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 +#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 +#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 +#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 +#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 +#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 +#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 +#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 +#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 +#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 +#: templates/dcim/cable.html:23 templates/dcim/device.html:79 +#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 +#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 +#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 +#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 +#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 +#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 +#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 +#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 +#: templates/virtualization/cluster.html:33 +#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 +#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 +#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 +#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 +#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 +#: virtualization/forms/bulk_edit.py:155 virtualization/forms/bulk_import.py:66 +#: virtualization/forms/bulk_import.py:115 +#: virtualization/forms/filtersets.py:47 virtualization/forms/filtersets.py:105 +#: vpn/forms/bulk_edit.py:59 vpn/forms/bulk_edit.py:269 +#: vpn/forms/bulk_import.py:59 vpn/forms/bulk_import.py:258 +#: vpn/forms/filtersets.py:214 wireless/forms/bulk_edit.py:63 +#: wireless/forms/bulk_edit.py:110 wireless/forms/bulk_import.py:55 +#: wireless/forms/bulk_import.py:97 wireless/forms/filtersets.py:35 +#: wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:147 -#: netbox/circuits/forms/filtersets.py:174 +#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 msgid "Install date" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:152 -#: netbox/circuits/forms/filtersets.py:179 +#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:158 -#: netbox/circuits/forms/filtersets.py:186 +#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:173 -#: netbox/circuits/forms/model_forms.py:112 +#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:174 -#: netbox/circuits/forms/model_forms.py:113 -#: netbox/circuits/forms/model_forms.py:183 -#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 -#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 -#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1692 -#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 -#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 -#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 -#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:316 -#: netbox/netbox/navigation/menu.py:24 -#: netbox/templates/dcim/device_edit.html:85 -#: netbox/templates/dcim/htmx/cable_edit.html:72 -#: netbox/templates/ipam/ipaddress_bulk_add.html:27 -#: netbox/templates/ipam/vlan_edit.html:22 -#: netbox/virtualization/forms/model_forms.py:80 -#: netbox/virtualization/forms/model_forms.py:222 -#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 -#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 -#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 -#: netbox/wireless/forms/model_forms.py:170 +#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 +#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 +#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 +#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 +#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 +#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 +#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 +#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 +#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 +#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 +#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 +#: virtualization/forms/model_forms.py:80 +#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 +#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 +#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 +#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:193 -#: netbox/circuits/forms/bulk_edit.py:217 -#: netbox/circuits/forms/model_forms.py:155 -#: netbox/circuits/tables/circuits.py:117 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 -#: netbox/templates/circuits/providernetwork.html:17 +#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 +#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 +#: templates/circuits/inc/circuit_termination_fields.html:62 +#: templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:199 +#: circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:203 +#: circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:961 -#: netbox/dcim/forms/bulk_edit.py:1325 netbox/dcim/forms/bulk_edit.py:1342 -#: netbox/dcim/forms/bulk_edit.py:1359 netbox/dcim/forms/bulk_edit.py:1377 -#: netbox/dcim/forms/bulk_edit.py:1472 netbox/dcim/forms/bulk_edit.py:1632 -#: netbox/dcim/forms/bulk_edit.py:1649 +#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 +#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 +#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 +#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 +#: dcim/forms/bulk_edit.py:1649 msgid "Mark connected" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:219 -#: netbox/circuits/forms/model_forms.py:157 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 -#: netbox/templates/dcim/frontport.html:121 -#: netbox/templates/dcim/interface.html:193 -#: netbox/templates/dcim/rearport.html:111 +#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 +#: templates/circuits/inc/circuit_termination_fields.html:54 +#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 +#: templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:221 -#: netbox/circuits/forms/model_forms.py:159 +#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:251 -#: netbox/circuits/forms/filtersets.py:268 -#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 -#: netbox/templates/circuits/circuitgroupassignment.html:30 -#: netbox/templates/dcim/device.html:133 -#: netbox/templates/dcim/virtualchassis.html:68 -#: netbox/templates/dcim/virtualchassis_edit.html:56 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 -#: netbox/tenancy/forms/bulk_edit.py:147 netbox/tenancy/forms/filtersets.py:110 +#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 +#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 +#: templates/circuits/circuitgroupassignment.html:30 +#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 +#: templates/dcim/virtualchassis_edit.html:56 +#: templates/ipam/inc/panels/fhrp_groups.html:26 tenancy/forms/bulk_edit.py:147 +#: tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "" -#: netbox/circuits/forms/bulk_import.py:39 -#: netbox/circuits/forms/bulk_import.py:54 -#: netbox/circuits/forms/bulk_import.py:77 +#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 +#: circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "" -#: netbox/circuits/forms/bulk_import.py:83 +#: circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "" -#: netbox/circuits/forms/bulk_import.py:90 +#: circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "" -#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 -#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 -#: netbox/dcim/forms/bulk_import.py:507 netbox/dcim/forms/bulk_import.py:661 -#: netbox/dcim/forms/bulk_import.py:1373 netbox/ipam/forms/bulk_import.py:194 -#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 -#: netbox/ipam/forms/bulk_import.py:452 -#: netbox/virtualization/forms/bulk_import.py:56 -#: netbox/virtualization/forms/bulk_import.py:82 -#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 +#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 +#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 +#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 +#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 +#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 +#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 +#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 +#: wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "" -#: netbox/circuits/forms/bulk_import.py:102 -#: netbox/circuits/forms/bulk_import.py:162 -#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 -#: netbox/dcim/forms/bulk_import.py:338 netbox/dcim/forms/bulk_import.py:483 -#: netbox/dcim/forms/bulk_import.py:1223 netbox/dcim/forms/bulk_import.py:1368 -#: netbox/dcim/forms/bulk_import.py:1432 netbox/ipam/forms/bulk_import.py:42 -#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 -#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 -#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 -#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:447 -#: netbox/virtualization/forms/bulk_import.py:70 -#: netbox/virtualization/forms/bulk_import.py:119 -#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 -#: netbox/wireless/forms/bulk_import.py:101 +#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 +#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 +#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 +#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 +#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 +#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 +#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 +#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 +#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 +#: virtualization/forms/bulk_import.py:70 +#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 +#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "" -#: netbox/circuits/forms/bulk_import.py:120 -#: netbox/templates/circuits/inc/circuit_termination.html:6 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 -#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 -#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 +#: circuits/forms/bulk_import.py:120 +#: templates/circuits/inc/circuit_termination.html:6 +#: templates/circuits/inc/circuit_termination_fields.html:15 +#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 +#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 msgid "Termination" msgstr "" -#: netbox/circuits/forms/bulk_import.py:130 -#: netbox/circuits/forms/filtersets.py:147 -#: netbox/circuits/forms/filtersets.py:227 -#: netbox/circuits/forms/model_forms.py:144 +#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 +#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "" -#: netbox/circuits/forms/filtersets.py:30 -#: netbox/circuits/forms/filtersets.py:118 -#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 -#: netbox/dcim/forms/bulk_edit.py:442 netbox/dcim/forms/bulk_edit.py:683 -#: netbox/dcim/forms/bulk_edit.py:738 netbox/dcim/forms/bulk_edit.py:892 -#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:315 -#: netbox/dcim/forms/bulk_import.py:546 netbox/dcim/forms/bulk_import.py:1317 -#: netbox/dcim/forms/bulk_import.py:1351 netbox/dcim/forms/filtersets.py:95 -#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 -#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 -#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 -#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 -#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 -#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 -#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 -#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 -#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 -#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 -#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 -#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 -#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 -#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 -#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 -#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 -#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 -#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 -#: netbox/templates/dcim/device.html:26 -#: netbox/templates/dcim/device_edit.html:30 -#: netbox/templates/dcim/inc/cable_termination.html:12 -#: netbox/templates/dcim/location.html:26 -#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 -#: netbox/templates/dcim/rackreservation.html:32 -#: netbox/virtualization/forms/filtersets.py:46 -#: netbox/virtualization/forms/filtersets.py:100 -#: netbox/wireless/forms/model_forms.py:87 -#: netbox/wireless/forms/model_forms.py:129 +#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 +#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 +#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 +#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 +#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 +#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 +#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 +#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 +#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 +#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 +#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 +#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 +#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 +#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 +#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 +#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 +#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 +#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 +#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 +#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 +#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 +#: dcim/tables/racks.py:212 extras/filtersets.py:536 +#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 +#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 +#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 +#: templates/dcim/device_edit.html:30 +#: templates/dcim/inc/cable_termination.html:12 templates/dcim/location.html:26 +#: templates/dcim/powerpanel.html:26 templates/dcim/rack.html:24 +#: templates/dcim/rackreservation.html:32 virtualization/forms/filtersets.py:46 +#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 +#: wireless/forms/model_forms.py:129 msgid "Location" msgstr "" -#: netbox/circuits/forms/filtersets.py:32 -#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 -#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 -#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 -#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 -#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 -#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 -#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 -#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 -#: netbox/virtualization/forms/filtersets.py:37 -#: netbox/virtualization/forms/filtersets.py:48 -#: netbox/virtualization/forms/filtersets.py:106 +#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 +#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 +#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 +#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 +#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 +#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 +#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 +#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 +#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 +#: virtualization/forms/filtersets.py:48 virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "" -#: netbox/circuits/forms/filtersets.py:37 -#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 -#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:867 -#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 -#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 -#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 -#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 -#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 -#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 -#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 -#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:375 -#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 -#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 -#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 -#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 -#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 -#: netbox/templates/dcim/rackreservation.html:22 -#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 -#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 -#: netbox/virtualization/forms/bulk_edit.py:81 -#: netbox/virtualization/forms/filtersets.py:59 -#: netbox/virtualization/forms/filtersets.py:133 -#: netbox/virtualization/forms/model_forms.py:92 -#: netbox/vpn/forms/filtersets.py:257 +#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 +#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 +#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 +#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 +#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 +#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 +#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 +#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 +#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 +#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 +#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 +#: dcim/tables/sites.py:85 extras/filtersets.py:503 ipam/forms/bulk_edit.py:208 +#: ipam/forms/bulk_edit.py:474 ipam/forms/filtersets.py:217 +#: ipam/forms/filtersets.py:422 ipam/forms/filtersets.py:475 +#: templates/dcim/device.html:18 templates/dcim/rack.html:16 +#: templates/dcim/rackreservation.html:22 templates/dcim/region.html:26 +#: templates/dcim/site.html:31 templates/ipam/prefix.html:49 +#: templates/ipam/vlan.html:16 virtualization/forms/bulk_edit.py:81 +#: virtualization/forms/filtersets.py:59 virtualization/forms/filtersets.py:133 +#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 msgid "Region" msgstr "" -#: netbox/circuits/forms/filtersets.py:42 -#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 -#: netbox/dcim/forms/bulk_edit.py:875 netbox/dcim/forms/filtersets.py:78 -#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 -#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 -#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 -#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 -#: netbox/dcim/forms/object_create.py:383 netbox/extras/filtersets.py:520 -#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 -#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 -#: netbox/ipam/forms/filtersets.py:480 -#: netbox/virtualization/forms/bulk_edit.py:86 -#: netbox/virtualization/forms/filtersets.py:69 -#: netbox/virtualization/forms/filtersets.py:138 -#: netbox/virtualization/forms/model_forms.py:98 +#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 +#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 +#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 +#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 +#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 +#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 +#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 +#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 +#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 +#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 +#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 +#: virtualization/forms/filtersets.py:138 +#: virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "" -#: netbox/circuits/forms/filtersets.py:65 -#: netbox/circuits/forms/filtersets.py:83 -#: netbox/circuits/forms/filtersets.py:102 -#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 -#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:838 -#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 -#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 -#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 -#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 -#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 -#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 -#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 -#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 -#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 -#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 -#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 -#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 -#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 -#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 -#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 -#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 -#: netbox/virtualization/forms/filtersets.py:45 -#: netbox/virtualization/forms/filtersets.py:103 -#: netbox/virtualization/forms/filtersets.py:198 -#: netbox/virtualization/forms/filtersets.py:243 -#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 -#: netbox/wireless/forms/filtersets.py:34 -#: netbox/wireless/forms/filtersets.py:74 +#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 +#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 +#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 +#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 +#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 +#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 +#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 +#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 +#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 +#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 +#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 +#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 +#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 +#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 +#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 +#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 +#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 +#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 +#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 +#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 +#: virtualization/forms/filtersets.py:103 +#: virtualization/forms/filtersets.py:198 +#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 +#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 +#: wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "" -#: netbox/circuits/forms/filtersets.py:73 netbox/circuits/tables/circuits.py:63 -#: netbox/circuits/tables/providers.py:66 -#: netbox/templates/circuits/circuit.html:22 -#: netbox/templates/circuits/provideraccount.html:24 +#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 +#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 +#: templates/circuits/provideraccount.html:24 msgid "Account" msgstr "" -#: netbox/circuits/forms/filtersets.py:217 +#: circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "" -#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1552 -#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 -#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:323 -#: netbox/templates/extras/configcontext.html:60 -#: netbox/templates/ipam/ipaddress.html:59 -#: netbox/templates/ipam/vlan_edit.html:30 -#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 +#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 +#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 +#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 +#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 +#: users/forms/model_forms.py:314 msgid "Assignment" msgstr "" -#: netbox/circuits/forms/filtersets.py:265 -#: netbox/circuits/forms/model_forms.py:195 -#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 -#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 -#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 -#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 -#: netbox/ipam/forms/bulk_import.py:436 netbox/ipam/forms/model_forms.py:528 -#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 -#: netbox/ipam/tables/vlans.py:226 -#: netbox/templates/circuits/circuitgroupassignment.html:22 -#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 -#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 -#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 -#: netbox/templates/users/group.html:14 -#: netbox/templates/virtualization/cluster.html:29 -#: netbox/templates/vpn/tunnel.html:29 -#: netbox/templates/wireless/wirelesslan.html:18 -#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 -#: netbox/tenancy/forms/bulk_import.py:40 -#: netbox/tenancy/forms/bulk_import.py:81 netbox/tenancy/forms/filtersets.py:48 -#: netbox/tenancy/forms/filtersets.py:78 netbox/tenancy/forms/filtersets.py:97 -#: netbox/tenancy/forms/model_forms.py:45 -#: netbox/tenancy/forms/model_forms.py:97 -#: netbox/tenancy/forms/model_forms.py:122 netbox/tenancy/tables/contacts.py:60 -#: netbox/tenancy/tables/contacts.py:107 netbox/tenancy/tables/tenants.py:42 -#: netbox/users/filtersets.py:62 netbox/users/filtersets.py:185 -#: netbox/users/forms/filtersets.py:31 netbox/users/forms/filtersets.py:37 -#: netbox/users/forms/filtersets.py:79 -#: netbox/virtualization/forms/bulk_edit.py:65 -#: netbox/virtualization/forms/bulk_import.py:47 -#: netbox/virtualization/forms/filtersets.py:85 -#: netbox/virtualization/forms/model_forms.py:66 -#: netbox/virtualization/tables/clusters.py:70 -#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 -#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 -#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 -#: netbox/wireless/forms/bulk_import.py:36 -#: netbox/wireless/forms/filtersets.py:46 -#: netbox/wireless/forms/model_forms.py:40 -#: netbox/wireless/tables/wirelesslan.py:48 +#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 +#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 +#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 +#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 +#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 +#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 +#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 +#: templates/circuits/circuitgroupassignment.html:22 +#: templates/dcim/interface.html:284 templates/dcim/site.html:37 +#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 +#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 +#: templates/users/group.html:6 templates/users/group.html:14 +#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 +#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 +#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 +#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 +#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 +#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 +#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 +#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 +#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 +#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 +#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 +#: virtualization/forms/filtersets.py:85 virtualization/forms/model_forms.py:66 +#: virtualization/tables/clusters.py:70 vpn/forms/bulk_edit.py:112 +#: vpn/forms/bulk_import.py:158 vpn/forms/filtersets.py:116 +#: vpn/tables/crypto.py:31 vpn/tables/tunnels.py:44 +#: wireless/forms/bulk_edit.py:48 wireless/forms/bulk_import.py:36 +#: wireless/forms/filtersets.py:46 wireless/forms/model_forms.py:40 +#: wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "" -#: netbox/circuits/forms/model_forms.py:182 -#: netbox/templates/circuits/circuitgroup.html:25 +#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "" -#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 -#: netbox/dcim/models/device_component_templates.py:517 -#: netbox/dcim/models/device_component_templates.py:617 -#: netbox/dcim/models/device_components.py:975 -#: netbox/dcim/models/device_components.py:1049 -#: netbox/dcim/models/device_components.py:1204 -#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 -#: netbox/extras/models/tags.py:28 +#: circuits/models/circuits.py:27 dcim/models/cables.py:67 +#: dcim/models/device_component_templates.py:517 +#: dcim/models/device_component_templates.py:617 +#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 +#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 +#: dcim/models/racks.py:224 extras/models/tags.py:28 msgid "color" msgstr "" -#: netbox/circuits/models/circuits.py:36 +#: circuits/models/circuits.py:36 msgid "circuit type" msgstr "" -#: netbox/circuits/models/circuits.py:37 +#: circuits/models/circuits.py:37 msgid "circuit types" msgstr "" -#: netbox/circuits/models/circuits.py:48 +#: circuits/models/circuits.py:48 msgid "circuit ID" msgstr "" -#: netbox/circuits/models/circuits.py:49 +#: circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "" -#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 -#: netbox/core/models/jobs.py:84 netbox/dcim/models/cables.py:49 -#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 -#: netbox/dcim/models/devices.py:1399 netbox/dcim/models/power.py:96 -#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 -#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 -#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 -#: netbox/ipam/models/vlans.py:195 netbox/virtualization/models/clusters.py:74 -#: netbox/virtualization/models/virtualmachines.py:84 -#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 -#: netbox/wireless/models.py:159 +#: circuits/models/circuits.py:69 core/models/data.py:52 core/models/jobs.py:84 +#: dcim/models/cables.py:49 dcim/models/devices.py:653 +#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 +#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 +#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 +#: ipam/models/ip.py:730 ipam/models/vlans.py:211 +#: virtualization/models/clusters.py:74 +#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 +#: wireless/models.py:95 wireless/models.py:159 msgid "status" msgstr "" -#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 +#: circuits/models/circuits.py:84 templates/core/plugin.html:20 msgid "installed" msgstr "" -#: netbox/circuits/models/circuits.py:89 +#: circuits/models/circuits.py:89 msgid "terminates" msgstr "" -#: netbox/circuits/models/circuits.py:94 +#: circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "" -#: netbox/circuits/models/circuits.py:95 +#: circuits/models/circuits.py:95 msgid "Committed rate" msgstr "" -#: netbox/circuits/models/circuits.py:137 +#: circuits/models/circuits.py:137 msgid "circuit" msgstr "" -#: netbox/circuits/models/circuits.py:138 +#: circuits/models/circuits.py:138 msgid "circuits" msgstr "" -#: netbox/circuits/models/circuits.py:170 +#: circuits/models/circuits.py:170 msgid "circuit group" msgstr "" -#: netbox/circuits/models/circuits.py:171 +#: circuits/models/circuits.py:171 msgid "circuit groups" msgstr "" -#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 -#: netbox/tenancy/models/contacts.py:134 +#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 +#: tenancy/models/contacts.py:134 msgid "priority" msgstr "" -#: netbox/circuits/models/circuits.py:213 +#: circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "" -#: netbox/circuits/models/circuits.py:214 +#: circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "" -#: netbox/circuits/models/circuits.py:240 +#: circuits/models/circuits.py:240 msgid "termination" msgstr "" -#: netbox/circuits/models/circuits.py:257 +#: circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "" -#: netbox/circuits/models/circuits.py:260 +#: circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "" -#: netbox/circuits/models/circuits.py:265 +#: circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "" -#: netbox/circuits/models/circuits.py:266 +#: circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "" -#: netbox/circuits/models/circuits.py:271 +#: circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "" -#: netbox/circuits/models/circuits.py:272 +#: circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "" -#: netbox/circuits/models/circuits.py:277 +#: circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "" -#: netbox/circuits/models/circuits.py:278 +#: circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "" -#: netbox/circuits/models/circuits.py:281 -#: netbox/dcim/models/device_component_templates.py:61 -#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 -#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 -#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 -#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 -#: netbox/extras/models/models.py:511 netbox/extras/models/notifications.py:131 -#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 -#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 -#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 -#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 -#: netbox/virtualization/models/virtualmachines.py:289 +#: circuits/models/circuits.py:281 dcim/models/device_component_templates.py:61 +#: dcim/models/device_components.py:68 dcim/models/racks.py:685 +#: extras/models/configs.py:45 extras/models/configs.py:219 +#: extras/models/customfields.py:125 extras/models/models.py:61 +#: extras/models/models.py:158 extras/models/models.py:396 +#: extras/models/models.py:511 extras/models/notifications.py:131 +#: extras/models/staging.py:31 extras/models/tags.py:32 +#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 +#: netbox/models/__init__.py:191 users/models/permissions.py:24 +#: users/models/tokens.py:57 users/models/users.py:33 +#: virtualization/models/virtualmachines.py:289 msgid "description" msgstr "" -#: netbox/circuits/models/circuits.py:294 +#: circuits/models/circuits.py:294 msgid "circuit termination" msgstr "" -#: netbox/circuits/models/circuits.py:295 +#: circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "" -#: netbox/circuits/models/circuits.py:308 +#: circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" -#: netbox/circuits/models/circuits.py:310 +#: circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" -#: netbox/circuits/models/providers.py:22 -#: netbox/circuits/models/providers.py:66 -#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 -#: netbox/core/models/jobs.py:45 -#: netbox/dcim/models/device_component_templates.py:43 -#: netbox/dcim/models/device_components.py:53 netbox/dcim/models/devices.py:593 -#: netbox/dcim/models/devices.py:1330 netbox/dcim/models/devices.py:1395 -#: netbox/dcim/models/power.py:39 netbox/dcim/models/power.py:92 -#: netbox/dcim/models/racks.py:262 netbox/dcim/models/sites.py:138 -#: netbox/extras/models/configs.py:36 netbox/extras/models/configs.py:215 -#: netbox/extras/models/customfields.py:92 netbox/extras/models/models.py:56 -#: netbox/extras/models/models.py:153 netbox/extras/models/models.py:296 -#: netbox/extras/models/models.py:392 netbox/extras/models/models.py:501 -#: netbox/extras/models/models.py:596 netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 -#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 -#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 -#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:184 -#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 -#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 -#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 -#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 -#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 -#: netbox/virtualization/models/virtualmachines.py:72 -#: netbox/virtualization/models/virtualmachines.py:279 -#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 -#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 -#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 -#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 +#: circuits/models/providers.py:22 circuits/models/providers.py:66 +#: circuits/models/providers.py:104 core/models/data.py:39 +#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 +#: dcim/models/device_components.py:53 dcim/models/devices.py:593 +#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 +#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 +#: dcim/models/sites.py:138 extras/models/configs.py:36 +#: extras/models/configs.py:215 extras/models/customfields.py:92 +#: extras/models/models.py:56 extras/models/models.py:153 +#: extras/models/models.py:296 extras/models/models.py:392 +#: extras/models/models.py:501 extras/models/models.py:596 +#: extras/models/notifications.py:126 extras/models/scripts.py:30 +#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 +#: ipam/models/services.py:52 ipam/models/services.py:88 +#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 +#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 +#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 +#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 +#: users/models/permissions.py:20 users/models/users.py:28 +#: virtualization/models/clusters.py:57 +#: virtualization/models/virtualmachines.py:72 +#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 +#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 +#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 +#: wireless/models.py:51 msgid "name" msgstr "" -#: netbox/circuits/models/providers.py:25 +#: circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "" -#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 -#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 -#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 -#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 -#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 -#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 -#: netbox/wireless/models.py:56 +#: circuits/models/providers.py:28 dcim/models/devices.py:86 +#: dcim/models/racks.py:137 dcim/models/sites.py:149 +#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 +#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 +#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 +#: vpn/models/l2vpn.py:27 wireless/models.py:56 msgid "slug" msgstr "" -#: netbox/circuits/models/providers.py:42 +#: circuits/models/providers.py:42 msgid "provider" msgstr "" -#: netbox/circuits/models/providers.py:43 +#: circuits/models/providers.py:43 msgid "providers" msgstr "" -#: netbox/circuits/models/providers.py:63 +#: circuits/models/providers.py:63 msgid "account ID" msgstr "" -#: netbox/circuits/models/providers.py:86 +#: circuits/models/providers.py:86 msgid "provider account" msgstr "" -#: netbox/circuits/models/providers.py:87 +#: circuits/models/providers.py:87 msgid "provider accounts" msgstr "" -#: netbox/circuits/models/providers.py:115 +#: circuits/models/providers.py:115 msgid "service ID" msgstr "" -#: netbox/circuits/models/providers.py:126 +#: circuits/models/providers.py:126 msgid "provider network" msgstr "" -#: netbox/circuits/models/providers.py:127 +#: circuits/models/providers.py:127 msgid "provider networks" msgstr "" -#: netbox/circuits/tables/circuits.py:32 netbox/circuits/tables/circuits.py:132 -#: netbox/circuits/tables/providers.py:18 -#: netbox/circuits/tables/providers.py:69 -#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 -#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 -#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 -#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 -#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 -#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 -#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 -#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 -#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 -#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 -#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 -#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 -#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 -#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 -#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 -#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 -#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 -#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 -#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 -#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 -#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 -#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 -#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 -#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 -#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 -#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 -#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 -#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 -#: netbox/ipam/tables/vrfs.py:68 netbox/templates/circuits/circuitgroup.html:28 -#: netbox/templates/circuits/circuittype.html:22 -#: netbox/templates/circuits/provideraccount.html:28 -#: netbox/templates/circuits/providernetwork.html:24 -#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 -#: netbox/templates/core/plugin.html:54 netbox/templates/core/rq_worker.html:43 -#: netbox/templates/dcim/consoleport.html:28 -#: netbox/templates/dcim/consoleserverport.html:28 -#: netbox/templates/dcim/devicebay.html:24 -#: netbox/templates/dcim/devicerole.html:26 -#: netbox/templates/dcim/frontport.html:28 -#: netbox/templates/dcim/inc/interface_vlans_table.html:5 -#: netbox/templates/dcim/inc/panels/inventory_items.html:18 -#: netbox/templates/dcim/interface.html:38 -#: netbox/templates/dcim/interface.html:165 -#: netbox/templates/dcim/inventoryitem.html:28 -#: netbox/templates/dcim/inventoryitemrole.html:18 -#: netbox/templates/dcim/location.html:29 -#: netbox/templates/dcim/manufacturer.html:36 -#: netbox/templates/dcim/modulebay.html:30 -#: netbox/templates/dcim/platform.html:29 -#: netbox/templates/dcim/poweroutlet.html:28 -#: netbox/templates/dcim/powerport.html:28 -#: netbox/templates/dcim/rackrole.html:22 -#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 -#: netbox/templates/dcim/sitegroup.html:29 -#: netbox/templates/dcim/virtualdevicecontext.html:18 -#: netbox/templates/extras/configcontext.html:13 -#: netbox/templates/extras/configtemplate.html:13 -#: netbox/templates/extras/customfield.html:13 -#: netbox/templates/extras/customlink.html:13 -#: netbox/templates/extras/eventrule.html:13 -#: netbox/templates/extras/exporttemplate.html:15 -#: netbox/templates/extras/notificationgroup.html:14 -#: netbox/templates/extras/savedfilter.html:13 -#: netbox/templates/extras/script_list.html:45 -#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 -#: netbox/templates/ipam/asnrange.html:15 -#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 -#: netbox/templates/ipam/role.html:22 netbox/templates/ipam/routetarget.html:13 -#: netbox/templates/ipam/service.html:24 -#: netbox/templates/ipam/servicetemplate.html:15 -#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 -#: netbox/templates/tenancy/contact.html:25 -#: netbox/templates/tenancy/contactgroup.html:21 -#: netbox/templates/tenancy/contactrole.html:18 -#: netbox/templates/tenancy/tenantgroup.html:29 -#: netbox/templates/users/group.html:17 -#: netbox/templates/users/objectpermission.html:17 -#: netbox/templates/virtualization/cluster.html:13 -#: netbox/templates/virtualization/clustergroup.html:22 -#: netbox/templates/virtualization/clustertype.html:22 -#: netbox/templates/virtualization/virtualdisk.html:25 -#: netbox/templates/virtualization/virtualmachine.html:15 -#: netbox/templates/virtualization/vminterface.html:25 -#: netbox/templates/vpn/ikepolicy.html:13 -#: netbox/templates/vpn/ikeproposal.html:13 -#: netbox/templates/vpn/ipsecpolicy.html:13 -#: netbox/templates/vpn/ipsecprofile.html:13 -#: netbox/templates/vpn/ipsecprofile.html:36 -#: netbox/templates/vpn/ipsecprofile.html:69 -#: netbox/templates/vpn/ipsecproposal.html:13 -#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 -#: netbox/templates/vpn/tunnelgroup.html:26 -#: netbox/templates/wireless/wirelesslangroup.html:29 -#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 -#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 -#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 -#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 -#: netbox/virtualization/forms/object_create.py:13 -#: netbox/virtualization/forms/object_create.py:23 -#: netbox/virtualization/tables/clusters.py:17 -#: netbox/virtualization/tables/clusters.py:39 -#: netbox/virtualization/tables/clusters.py:62 -#: netbox/virtualization/tables/virtualmachines.py:55 -#: netbox/virtualization/tables/virtualmachines.py:139 -#: netbox/virtualization/tables/virtualmachines.py:194 -#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 -#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 -#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 -#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 -#: netbox/wireless/tables/wirelesslan.py:18 -#: netbox/wireless/tables/wirelesslan.py:79 +#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 +#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 +#: circuits/tables/providers.py:99 core/tables/data.py:16 +#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 +#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 +#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 +#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 +#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 +#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 +#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 +#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 +#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 +#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 +#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 +#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 +#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 +#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 +#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 +#: extras/tables/tables.py:58 extras/tables/tables.py:122 +#: extras/tables/tables.py:155 extras/tables/tables.py:180 +#: extras/tables/tables.py:246 extras/tables/tables.py:361 +#: extras/tables/tables.py:378 extras/tables/tables.py:401 +#: extras/tables/tables.py:439 extras/tables/tables.py:491 +#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 +#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 +#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 +#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 +#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 +#: templates/circuits/circuittype.html:22 +#: templates/circuits/provideraccount.html:28 +#: templates/circuits/providernetwork.html:24 templates/core/datasource.html:34 +#: templates/core/job.html:44 templates/core/plugin.html:54 +#: templates/core/rq_worker.html:43 templates/dcim/consoleport.html:28 +#: templates/dcim/consoleserverport.html:28 templates/dcim/devicebay.html:24 +#: templates/dcim/devicerole.html:26 templates/dcim/frontport.html:28 +#: templates/dcim/inc/interface_vlans_table.html:5 +#: templates/dcim/inc/panels/inventory_items.html:18 +#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 +#: templates/dcim/inventoryitem.html:28 +#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 +#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 +#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 +#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 +#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 +#: templates/dcim/sitegroup.html:29 templates/dcim/virtualdevicecontext.html:18 +#: templates/extras/configcontext.html:13 +#: templates/extras/configtemplate.html:13 templates/extras/customfield.html:13 +#: templates/extras/customlink.html:13 templates/extras/eventrule.html:13 +#: templates/extras/exporttemplate.html:15 +#: templates/extras/notificationgroup.html:14 +#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 +#: templates/extras/tag.html:14 templates/extras/webhook.html:13 +#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 +#: templates/ipam/rir.html:22 templates/ipam/role.html:22 +#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 +#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 +#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 +#: templates/tenancy/contactgroup.html:21 templates/tenancy/contactrole.html:18 +#: templates/tenancy/tenantgroup.html:29 templates/users/group.html:17 +#: templates/users/objectpermission.html:17 +#: templates/virtualization/cluster.html:13 +#: templates/virtualization/clustergroup.html:22 +#: templates/virtualization/clustertype.html:22 +#: templates/virtualization/virtualdisk.html:25 +#: templates/virtualization/virtualmachine.html:15 +#: templates/virtualization/vminterface.html:25 templates/vpn/ikepolicy.html:13 +#: templates/vpn/ikeproposal.html:13 templates/vpn/ipsecpolicy.html:13 +#: templates/vpn/ipsecprofile.html:13 templates/vpn/ipsecprofile.html:36 +#: templates/vpn/ipsecprofile.html:69 templates/vpn/ipsecproposal.html:13 +#: templates/vpn/l2vpn.html:14 templates/vpn/tunnel.html:21 +#: templates/vpn/tunnelgroup.html:26 +#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 +#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 +#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 users/tables.py:62 +#: users/tables.py:76 virtualization/forms/bulk_create.py:20 +#: virtualization/forms/object_create.py:13 +#: virtualization/forms/object_create.py:23 +#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 +#: virtualization/tables/clusters.py:62 +#: virtualization/tables/virtualmachines.py:55 +#: virtualization/tables/virtualmachines.py:139 +#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 +#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 +#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 +#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 +#: wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "" -#: netbox/circuits/tables/circuits.py:41 netbox/circuits/tables/circuits.py:138 -#: netbox/circuits/tables/providers.py:45 -#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 -#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 -#: netbox/templates/circuits/provider.html:57 -#: netbox/templates/circuits/provideraccount.html:44 -#: netbox/templates/circuits/providernetwork.html:50 +#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 +#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 +#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 +#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 +#: templates/circuits/provideraccount.html:44 +#: templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "" -#: netbox/circuits/tables/circuits.py:55 -#: netbox/templates/circuits/circuit.html:26 +#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "" -#: netbox/circuits/tables/circuits.py:69 -#: netbox/wireless/forms/model_forms.py:160 +#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 msgid "Side A" msgstr "" -#: netbox/circuits/tables/circuits.py:74 +#: circuits/tables/circuits.py:74 msgid "Side Z" msgstr "" -#: netbox/circuits/tables/circuits.py:77 -#: netbox/templates/circuits/circuit.html:55 +#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "" -#: netbox/circuits/tables/circuits.py:80 netbox/circuits/tables/providers.py:48 -#: netbox/circuits/tables/providers.py:82 -#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 -#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 -#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 -#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 -#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 -#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 -#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 -#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 -#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 -#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 -#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 -#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 -#: netbox/templates/generic/bulk_edit.html:86 -#: netbox/templates/inc/panels/comments.html:5 -#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 -#: netbox/utilities/forms/fields/fields.py:29 -#: netbox/virtualization/tables/clusters.py:91 -#: netbox/virtualization/tables/virtualmachines.py:82 -#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 -#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 -#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 -#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 -#: netbox/wireless/tables/wirelesslan.py:58 +#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 +#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 +#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 +#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 +#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 +#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 +#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 +#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 +#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 +#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 +#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 +#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 +#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 +#: virtualization/tables/clusters.py:91 +#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 +#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 +#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 +#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "" -#: netbox/circuits/tables/circuits.py:86 -#: netbox/templates/tenancy/contact.html:84 -#: netbox/tenancy/tables/contacts.py:73 +#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 +#: tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "" -#: netbox/circuits/tables/providers.py:23 +#: circuits/tables/providers.py:23 msgid "Accounts" msgstr "" -#: netbox/circuits/tables/providers.py:29 +#: circuits/tables/providers.py:29 msgid "Account Count" msgstr "" -#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 +#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 msgid "ASN Count" msgstr "" -#: netbox/circuits/views.py:331 +#: circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "" -#: netbox/circuits/views.py:380 +#: circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "" -#: netbox/core/api/views.py:39 +#: core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "" -#: netbox/core/choices.py:18 +#: core/choices.py:18 msgid "New" msgstr "" -#: netbox/core/choices.py:19 netbox/core/constants.py:18 -#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 +#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 +#: templates/core/rq_task.html:77 msgid "Queued" msgstr "" -#: netbox/core/choices.py:20 +#: core/choices.py:20 msgid "Syncing" msgstr "" -#: netbox/core/choices.py:21 netbox/core/choices.py:57 -#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 +#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 +#: templates/core/job.html:86 msgid "Completed" msgstr "" -#: netbox/core/choices.py:22 netbox/core/choices.py:59 -#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 -#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 -#: netbox/dcim/choices.py:1607 netbox/virtualization/choices.py:47 +#: core/choices.py:22 core/choices.py:59 core/constants.py:20 +#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 +#: dcim/choices.py:1609 virtualization/choices.py:47 msgid "Failed" msgstr "" -#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 -#: netbox/netbox/navigation/menu.py:339 -#: netbox/templates/extras/script/base.html:14 -#: netbox/templates/extras/script_list.html:7 -#: netbox/templates/extras/script_list.html:12 -#: netbox/templates/extras/script_result.html:17 +#: core/choices.py:35 netbox/navigation/menu.py:335 +#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 +#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 +#: templates/extras/script_result.html:17 msgid "Scripts" msgstr "" -#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 +#: core/choices.py:36 templates/extras/report/base.html:13 msgid "Reports" msgstr "" -#: netbox/core/choices.py:54 +#: core/choices.py:54 msgid "Pending" msgstr "" -#: netbox/core/choices.py:55 netbox/core/constants.py:23 -#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 -#: netbox/templates/core/job.html:73 +#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 +#: core/tables/tasks.py:38 templates/core/job.html:73 msgid "Scheduled" msgstr "" -#: netbox/core/choices.py:56 +#: core/choices.py:56 msgid "Running" msgstr "" -#: netbox/core/choices.py:58 +#: core/choices.py:58 msgid "Errored" msgstr "" -#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 -#: netbox/templates/generic/object.html:61 +#: core/choices.py:87 core/tables/plugins.py:63 +#: templates/generic/object.html:61 msgid "Updated" msgstr "" -#: netbox/core/choices.py:88 +#: core/choices.py:88 msgid "Deleted" msgstr "" -#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 +#: core/constants.py:19 core/tables/tasks.py:30 msgid "Finished" msgstr "" -#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 -#: netbox/templates/core/job.html:82 -#: netbox/templates/extras/htmx/script_result.html:8 +#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 +#: templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "" -#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 +#: core/constants.py:22 core/tables/tasks.py:26 msgid "Deferred" msgstr "" -#: netbox/core/constants.py:24 +#: core/constants.py:24 msgid "Stopped" msgstr "" -#: netbox/core/constants.py:25 +#: core/constants.py:25 msgid "Cancelled" msgstr "" -#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 -#: netbox/templates/core/plugin.html:88 -#: netbox/templates/dcim/interface.html:216 +#: core/data_backends.py:32 core/tables/plugins.py:51 +#: templates/core/plugin.html:88 templates/dcim/interface.html:216 msgid "Local" msgstr "" -#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 -#: netbox/templates/account/profile.html:15 netbox/templates/users/user.html:17 -#: netbox/users/tables.py:31 +#: core/data_backends.py:50 core/tables/change_logging.py:20 +#: templates/account/profile.html:15 templates/users/user.html:17 +#: users/tables.py:31 msgid "Username" msgstr "" -#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 +#: core/data_backends.py:52 core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "" -#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 -#: netbox/templates/account/password.html:12 -#: netbox/users/forms/model_forms.py:170 +#: core/data_backends.py:56 templates/account/base.html:23 +#: templates/account/password.html:12 users/forms/model_forms.py:170 msgid "Password" msgstr "" -#: netbox/core/data_backends.py:62 +#: core/data_backends.py:62 msgid "Branch" msgstr "" -#: netbox/core/data_backends.py:120 +#: core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "" -#: netbox/core/data_backends.py:133 +#: core/data_backends.py:133 msgid "AWS access key ID" msgstr "" -#: netbox/core/data_backends.py:137 +#: core/data_backends.py:137 msgid "AWS secret access key" msgstr "" -#: netbox/core/events.py:27 +#: core/events.py:27 msgid "Object created" msgstr "" -#: netbox/core/events.py:28 +#: core/events.py:28 msgid "Object updated" msgstr "" -#: netbox/core/events.py:29 +#: core/events.py:29 msgid "Object deleted" msgstr "" -#: netbox/core/events.py:30 +#: core/events.py:30 msgid "Job started" msgstr "" -#: netbox/core/events.py:31 +#: core/events.py:31 msgid "Job completed" msgstr "" -#: netbox/core/events.py:32 +#: core/events.py:32 msgid "Job failed" msgstr "" -#: netbox/core/events.py:33 +#: core/events.py:33 msgid "Job errored" msgstr "" -#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 -#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 +#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 +#: extras/filtersets.py:661 msgid "Data source (ID)" msgstr "" -#: netbox/core/filtersets.py:59 +#: core/filtersets.py:59 msgid "Data source (name)" msgstr "" -#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 -#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 -#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 -#: netbox/users/filtersets.py:28 +#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 +#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 +#: users/filtersets.py:28 msgid "User (ID)" msgstr "" -#: netbox/core/filtersets.py:151 +#: core/filtersets.py:151 msgid "User name" msgstr "" -#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 -#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1132 -#: netbox/dcim/forms/bulk_edit.py:1410 netbox/dcim/forms/filtersets.py:1370 -#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 -#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 -#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 -#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 -#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 -#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 -#: netbox/templates/core/datasource.html:42 -#: netbox/templates/dcim/interface.html:61 -#: netbox/templates/extras/customlink.html:17 -#: netbox/templates/extras/eventrule.html:17 -#: netbox/templates/extras/savedfilter.html:25 -#: netbox/templates/users/objectpermission.html:25 -#: netbox/templates/virtualization/vminterface.html:29 -#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 -#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 -#: netbox/virtualization/forms/filtersets.py:215 +#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 +#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 +#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 +#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 +#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 +#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 +#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 +#: extras/tables/tables.py:162 extras/tables/tables.py:253 +#: extras/tables/tables.py:415 netbox/preferences.py:22 +#: templates/core/datasource.html:42 templates/dcim/interface.html:61 +#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 +#: templates/extras/savedfilter.html:25 +#: templates/users/objectpermission.html:25 +#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 +#: users/forms/filtersets.py:70 users/tables.py:83 +#: virtualization/forms/bulk_edit.py:217 virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "" -#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 -#: netbox/templates/extras/savedfilter.html:52 -#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 -#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 -#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 -#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 -#: netbox/vpn/forms/model_forms.py:380 +#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 +#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 +#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 +#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 +#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 +#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "" -#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 +#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 msgid "Ignore rules" msgstr "" -#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 -#: netbox/extras/forms/model_forms.py:248 -#: netbox/extras/forms/model_forms.py:578 -#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 -#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 -#: netbox/templates/core/datasource.html:31 -#: netbox/templates/dcim/device/render_config.html:18 -#: netbox/templates/extras/configcontext.html:29 -#: netbox/templates/extras/configtemplate.html:21 -#: netbox/templates/extras/exporttemplate.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:18 +#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 +#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 +#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 +#: extras/tables/tables.py:483 extras/tables/tables.py:518 +#: templates/core/datasource.html:31 +#: templates/dcim/device/render_config.html:18 +#: templates/extras/configcontext.html:29 +#: templates/extras/configtemplate.html:21 +#: templates/extras/exporttemplate.html:35 +#: templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "" -#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 +#: core/forms/filtersets.py:55 core/forms/mixins.py:21 msgid "File" msgstr "" -#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 -#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 -#: netbox/extras/forms/filtersets.py:413 +#: core/forms/filtersets.py:60 core/forms/mixins.py:16 +#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 +#: extras/forms/filtersets.py:413 msgid "Data source" msgstr "" -#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 +#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 msgid "Creation" msgstr "" -#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 -#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 -#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 -#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 -#: netbox/templates/core/objectchange.html:52 -#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 +#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 +#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 +#: extras/tables/tables.py:294 extras/tables/tables.py:326 +#: extras/tables/tables.py:571 templates/core/job.html:38 +#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 +#: vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "" -#: netbox/core/forms/filtersets.py:84 +#: core/forms/filtersets.py:84 msgid "Created after" msgstr "" -#: netbox/core/forms/filtersets.py:89 +#: core/forms/filtersets.py:89 msgid "Created before" msgstr "" -#: netbox/core/forms/filtersets.py:94 +#: core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "" -#: netbox/core/forms/filtersets.py:99 +#: core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "" -#: netbox/core/forms/filtersets.py:104 +#: core/forms/filtersets.py:104 msgid "Started after" msgstr "" -#: netbox/core/forms/filtersets.py:109 +#: core/forms/filtersets.py:109 msgid "Started before" msgstr "" -#: netbox/core/forms/filtersets.py:114 +#: core/forms/filtersets.py:114 msgid "Completed after" msgstr "" -#: netbox/core/forms/filtersets.py:119 +#: core/forms/filtersets.py:119 msgid "Completed before" msgstr "" -#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 -#: netbox/dcim/forms/bulk_edit.py:457 netbox/dcim/forms/filtersets.py:418 -#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 -#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 -#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 -#: netbox/templates/core/objectchange.html:36 -#: netbox/templates/dcim/rackreservation.html:58 -#: netbox/templates/extras/savedfilter.html:21 -#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 -#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 -#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 -#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 -#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 -#: netbox/users/tables.py:19 +#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 +#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 +#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 +#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 +#: extras/tables/tables.py:302 extras/tables/tables.py:342 +#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 +#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 +#: templates/users/token.html:21 templates/users/user.html:6 +#: templates/users/user.html:14 users/filtersets.py:107 users/filtersets.py:174 +#: users/forms/filtersets.py:84 users/forms/filtersets.py:125 +#: users/forms/model_forms.py:155 users/forms/model_forms.py:192 +#: users/tables.py:19 msgid "User" msgstr "" -#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 -#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 -#: netbox/templates/core/objectchange.html:32 +#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 +#: extras/tables/tables.py:609 extras/tables/tables.py:646 +#: templates/core/objectchange.html:32 msgid "Time" msgstr "" -#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 +#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 msgid "After" msgstr "" -#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 +#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 msgid "Before" msgstr "" -#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 -#: netbox/extras/forms/model_forms.py:396 -#: netbox/templates/core/objectchange.html:46 -#: netbox/templates/extras/eventrule.html:71 +#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 +#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 +#: templates/extras/eventrule.html:71 msgid "Action" msgstr "" -#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 -#: netbox/templates/core/datafile.html:27 -#: netbox/templates/extras/report/base.html:33 -#: netbox/templates/extras/script/base.html:32 +#: core/forms/model_forms.py:54 core/tables/data.py:46 +#: templates/core/datafile.html:27 templates/extras/report/base.html:33 +#: templates/extras/script/base.html:32 msgid "Source" msgstr "" -#: netbox/core/forms/model_forms.py:58 +#: core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "" -#: netbox/core/forms/model_forms.py:96 +#: core/forms/model_forms.py:96 msgid "File Upload" msgstr "" -#: netbox/core/forms/model_forms.py:108 +#: core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "" -#: netbox/core/forms/model_forms.py:110 +#: core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" -#: netbox/core/forms/model_forms.py:153 -#: netbox/templates/dcim/rack_elevation_list.html:6 +#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "" -#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1518 -#: netbox/dcim/forms/bulk_edit.py:979 netbox/dcim/forms/bulk_edit.py:1367 -#: netbox/dcim/forms/bulk_edit.py:1385 netbox/dcim/tables/racks.py:158 -#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 +#: core/forms/model_forms.py:157 dcim/choices.py:1520 +#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 +#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 +#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 msgid "Power" msgstr "" -#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 -#: netbox/templates/core/inc/config_data.html:37 +#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 +#: templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "" -#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 -#: netbox/templates/core/inc/config_data.html:50 -#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 -#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 +#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 +#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 +#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 +#: vpn/forms/model_forms.py:146 msgid "Security" msgstr "" -#: netbox/core/forms/model_forms.py:161 -#: netbox/templates/core/inc/config_data.html:59 +#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 msgid "Banners" msgstr "" -#: netbox/core/forms/model_forms.py:162 -#: netbox/templates/core/inc/config_data.html:80 +#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "" -#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 -#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 -#: netbox/extras/forms/model_forms.py:129 -#: netbox/templates/core/inc/config_data.html:93 +#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 +#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 +#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 msgid "Validation" msgstr "" -#: netbox/core/forms/model_forms.py:164 -#: netbox/templates/account/preferences.html:6 +#: core/forms/model_forms.py:164 templates/account/preferences.html:6 msgid "User Preferences" msgstr "" -#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 -#: netbox/templates/core/inc/config_data.html:127 -#: netbox/users/forms/model_forms.py:64 +#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 +#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "" -#: netbox/core/forms/model_forms.py:169 +#: core/forms/model_forms.py:169 msgid "Config Revision" msgstr "" -#: netbox/core/forms/model_forms.py:208 +#: core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "" -#: netbox/core/forms/model_forms.py:216 +#: core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "" -#: netbox/core/forms/model_forms.py:218 +#: core/forms/model_forms.py:218 msgid " (default)" msgstr "" -#: netbox/core/models/change_logging.py:29 +#: core/models/change_logging.py:29 msgid "time" msgstr "" -#: netbox/core/models/change_logging.py:42 +#: core/models/change_logging.py:42 msgid "user name" msgstr "" -#: netbox/core/models/change_logging.py:47 +#: core/models/change_logging.py:47 msgid "request ID" msgstr "" -#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 +#: core/models/change_logging.py:52 extras/models/staging.py:69 msgid "action" msgstr "" -#: netbox/core/models/change_logging.py:86 +#: core/models/change_logging.py:86 msgid "pre-change data" msgstr "" -#: netbox/core/models/change_logging.py:92 +#: core/models/change_logging.py:92 msgid "post-change data" msgstr "" -#: netbox/core/models/change_logging.py:106 +#: core/models/change_logging.py:106 msgid "object change" msgstr "" -#: netbox/core/models/change_logging.py:107 +#: core/models/change_logging.py:107 msgid "object changes" msgstr "" -#: netbox/core/models/change_logging.py:123 +#: core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" -#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 -#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:49 -#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 -#: netbox/extras/models/notifications.py:186 -#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 +#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 +#: core/models/jobs.py:49 extras/models/models.py:730 +#: extras/models/notifications.py:39 extras/models/notifications.py:186 +#: netbox/models/features.py:53 users/models/tokens.py:32 msgid "created" msgstr "" -#: netbox/core/models/config.py:22 +#: core/models/config.py:22 msgid "comment" msgstr "" -#: netbox/core/models/config.py:29 +#: core/models/config.py:29 msgid "configuration data" msgstr "" -#: netbox/core/models/config.py:36 +#: core/models/config.py:36 msgid "config revision" msgstr "" -#: netbox/core/models/config.py:37 +#: core/models/config.py:37 msgid "config revisions" msgstr "" -#: netbox/core/models/config.py:41 +#: core/models/config.py:41 msgid "Default configuration" msgstr "" -#: netbox/core/models/config.py:43 +#: core/models/config.py:43 msgid "Current configuration" msgstr "" -#: netbox/core/models/config.py:44 +#: core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "" -#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 -#: netbox/dcim/models/device_component_templates.py:203 -#: netbox/dcim/models/device_component_templates.py:237 -#: netbox/dcim/models/device_component_templates.py:272 -#: netbox/dcim/models/device_component_templates.py:334 -#: netbox/dcim/models/device_component_templates.py:413 -#: netbox/dcim/models/device_component_templates.py:512 -#: netbox/dcim/models/device_component_templates.py:612 -#: netbox/dcim/models/device_components.py:283 -#: netbox/dcim/models/device_components.py:312 -#: netbox/dcim/models/device_components.py:345 -#: netbox/dcim/models/device_components.py:463 -#: netbox/dcim/models/device_components.py:605 -#: netbox/dcim/models/device_components.py:970 -#: netbox/dcim/models/device_components.py:1044 netbox/dcim/models/power.py:102 -#: netbox/extras/models/customfields.py:78 netbox/extras/models/search.py:41 -#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 +#: core/models/data.py:44 dcim/models/cables.py:43 +#: dcim/models/device_component_templates.py:203 +#: dcim/models/device_component_templates.py:237 +#: dcim/models/device_component_templates.py:272 +#: dcim/models/device_component_templates.py:334 +#: dcim/models/device_component_templates.py:413 +#: dcim/models/device_component_templates.py:512 +#: dcim/models/device_component_templates.py:612 +#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 +#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 +#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 +#: dcim/models/device_components.py:1044 dcim/models/power.py:102 +#: extras/models/customfields.py:78 extras/models/search.py:41 +#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 msgid "type" msgstr "" -#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 -#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 -#: netbox/templates/core/datasource.html:58 -#: netbox/templates/core/plugin.html:66 +#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 +#: extras/tables/tables.py:656 templates/core/datasource.html:58 +#: templates/core/plugin.html:66 msgid "URL" msgstr "" -#: netbox/core/models/data.py:59 -#: netbox/dcim/models/device_component_templates.py:418 -#: netbox/dcim/models/device_components.py:512 -#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 -#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 +#: core/models/data.py:59 dcim/models/device_component_templates.py:418 +#: dcim/models/device_components.py:512 extras/models/models.py:70 +#: extras/models/models.py:301 extras/models/models.py:526 +#: users/models/permissions.py:29 msgid "enabled" msgstr "" -#: netbox/core/models/data.py:63 +#: core/models/data.py:63 msgid "ignore rules" msgstr "" -#: netbox/core/models/data.py:65 +#: core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" -#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 +#: core/models/data.py:68 extras/models/models.py:534 msgid "parameters" msgstr "" -#: netbox/core/models/data.py:73 +#: core/models/data.py:73 msgid "last synced" msgstr "" -#: netbox/core/models/data.py:81 +#: core/models/data.py:81 msgid "data source" msgstr "" -#: netbox/core/models/data.py:82 +#: core/models/data.py:82 msgid "data sources" msgstr "" -#: netbox/core/models/data.py:122 +#: core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "" -#: netbox/core/models/data.py:164 +#: core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "" -#: netbox/core/models/data.py:177 +#: core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "" -#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 -#: netbox/netbox/models/features.py:59 +#: core/models/data.py:270 core/models/files.py:31 netbox/models/features.py:59 msgid "last updated" msgstr "" -#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 +#: core/models/data.py:280 dcim/models/cables.py:444 msgid "path" msgstr "" -#: netbox/core/models/data.py:283 +#: core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "" -#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 +#: core/models/data.py:287 ipam/models/ip.py:503 msgid "size" msgstr "" -#: netbox/core/models/data.py:290 +#: core/models/data.py:290 msgid "hash" msgstr "" -#: netbox/core/models/data.py:294 +#: core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "" -#: netbox/core/models/data.py:296 +#: core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "" -#: netbox/core/models/data.py:313 +#: core/models/data.py:313 msgid "data file" msgstr "" -#: netbox/core/models/data.py:314 +#: core/models/data.py:314 msgid "data files" msgstr "" -#: netbox/core/models/data.py:401 +#: core/models/data.py:401 msgid "auto sync record" msgstr "" -#: netbox/core/models/data.py:402 +#: core/models/data.py:402 msgid "auto sync records" msgstr "" -#: netbox/core/models/files.py:37 +#: core/models/files.py:37 msgid "file root" msgstr "" -#: netbox/core/models/files.py:42 +#: core/models/files.py:42 msgid "file path" msgstr "" -#: netbox/core/models/files.py:44 +#: core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "" -#: netbox/core/models/files.py:61 +#: core/models/files.py:61 msgid "managed file" msgstr "" -#: netbox/core/models/files.py:62 +#: core/models/files.py:62 msgid "managed files" msgstr "" -#: netbox/core/models/jobs.py:53 +#: core/models/jobs.py:53 msgid "scheduled" msgstr "" -#: netbox/core/models/jobs.py:58 +#: core/models/jobs.py:58 msgid "interval" msgstr "" -#: netbox/core/models/jobs.py:64 +#: core/models/jobs.py:64 msgid "Recurrence interval (in minutes)" msgstr "" -#: netbox/core/models/jobs.py:67 +#: core/models/jobs.py:67 msgid "started" msgstr "" -#: netbox/core/models/jobs.py:72 +#: core/models/jobs.py:72 msgid "completed" msgstr "" -#: netbox/core/models/jobs.py:90 netbox/extras/models/models.py:101 -#: netbox/extras/models/staging.py:87 +#: core/models/jobs.py:90 extras/models/models.py:101 +#: extras/models/staging.py:87 msgid "data" msgstr "" -#: netbox/core/models/jobs.py:95 +#: core/models/jobs.py:95 msgid "error" msgstr "" -#: netbox/core/models/jobs.py:100 +#: core/models/jobs.py:100 msgid "job ID" msgstr "" -#: netbox/core/models/jobs.py:111 +#: core/models/jobs.py:111 msgid "job" msgstr "" -#: netbox/core/models/jobs.py:112 +#: core/models/jobs.py:112 msgid "jobs" msgstr "" -#: netbox/core/models/jobs.py:135 +#: core/models/jobs.py:135 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "" -#: netbox/core/models/jobs.py:185 +#: core/models/jobs.py:185 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" -#: netbox/core/models/jobs.py:216 +#: core/models/jobs.py:216 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" -#: netbox/core/signals.py:126 +#: core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "" -#: netbox/core/tables/change_logging.py:25 -#: netbox/templates/account/profile.html:19 netbox/templates/users/user.html:21 +#: core/tables/change_logging.py:25 templates/account/profile.html:19 +#: templates/users/user.html:21 msgid "Full Name" msgstr "" -#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 -#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 -#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 -#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 -#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 -#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 -#: netbox/templates/core/objectchange.html:58 -#: netbox/templates/extras/eventrule.html:78 -#: netbox/templates/extras/journalentry.html:18 -#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 +#: core/tables/change_logging.py:37 core/tables/jobs.py:21 extras/choices.py:41 +#: extras/tables/tables.py:279 extras/tables/tables.py:297 +#: extras/tables/tables.py:329 extras/tables/tables.py:409 +#: extras/tables/tables.py:470 extras/tables/tables.py:576 +#: extras/tables/tables.py:616 extras/tables/tables.py:653 +#: netbox/tables/tables.py:244 templates/core/objectchange.html:58 +#: templates/extras/eventrule.html:78 templates/extras/journalentry.html:18 +#: tenancy/tables/contacts.py:93 vpn/tables/l2vpn.py:64 msgid "Object" msgstr "" -#: netbox/core/tables/change_logging.py:42 -#: netbox/templates/core/objectchange.html:68 +#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 msgid "Request ID" msgstr "" -#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 -#: netbox/users/tables.py:39 +#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 msgid "Is Active" msgstr "" -#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 +#: core/tables/data.py:50 templates/core/datafile.html:31 msgid "Path" msgstr "" -#: netbox/core/tables/data.py:54 -#: netbox/templates/extras/inc/result_pending.html:7 +#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "" -#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 -#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 -#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 -#: netbox/templates/dcim/virtualchassis_edit.html:52 -#: netbox/utilities/forms/forms.py:73 netbox/wireless/tables/wirelesslink.py:17 +#: core/tables/jobs.py:10 core/tables/tasks.py:76 +#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 +#: extras/tables/tables.py:460 netbox/tables/tables.py:189 +#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 +#: wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "" -#: netbox/core/tables/jobs.py:35 +#: core/tables/jobs.py:35 msgid "Interval" msgstr "" -#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 -#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 -#: netbox/vpn/tables/crypto.py:61 +#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 +#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 +#: vpn/tables/crypto.py:61 msgid "Version" msgstr "" -#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 +#: core/tables/plugins.py:19 templates/core/datafile.html:38 msgid "Last Updated" msgstr "" -#: netbox/core/tables/plugins.py:23 +#: core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "" -#: netbox/core/tables/plugins.py:27 +#: core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "" -#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 +#: core/tables/plugins.py:31 core/tables/plugins.py:74 msgid "No plugin data found" msgstr "" -#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 +#: core/tables/plugins.py:48 templates/core/plugin.html:62 msgid "Author" msgstr "" -#: netbox/core/tables/plugins.py:54 +#: core/tables/plugins.py:54 msgid "Installed" msgstr "" -#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 +#: core/tables/plugins.py:57 templates/core/plugin.html:84 msgid "Certified" msgstr "" -#: netbox/core/tables/plugins.py:60 +#: core/tables/plugins.py:60 msgid "Published" msgstr "" -#: netbox/core/tables/plugins.py:66 +#: core/tables/plugins.py:66 msgid "Installed Version" msgstr "" -#: netbox/core/tables/plugins.py:70 +#: core/tables/plugins.py:70 msgid "Latest Version" msgstr "" -#: netbox/core/tables/tasks.py:18 +#: core/tables/tasks.py:18 msgid "Oldest Task" msgstr "" -#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 +#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "" -#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 +#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 msgid "Host" msgstr "" -#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 +#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 msgid "Port" msgstr "" -#: netbox/core/tables/tasks.py:54 +#: core/tables/tasks.py:54 msgid "DB" msgstr "" -#: netbox/core/tables/tasks.py:58 +#: core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "" -#: netbox/core/tables/tasks.py:62 +#: core/tables/tasks.py:62 msgid "No queues found" msgstr "" -#: netbox/core/tables/tasks.py:82 +#: core/tables/tasks.py:82 msgid "Enqueued" msgstr "" -#: netbox/core/tables/tasks.py:85 +#: core/tables/tasks.py:85 msgid "Ended" msgstr "" -#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 +#: core/tables/tasks.py:93 templates/core/rq_task.html:85 msgid "Callable" msgstr "" -#: netbox/core/tables/tasks.py:97 +#: core/tables/tasks.py:97 msgid "No tasks found" msgstr "" -#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 +#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 msgid "State" msgstr "" -#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 +#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 msgid "Birth" msgstr "" -#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 +#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 msgid "PID" msgstr "" -#: netbox/core/tables/tasks.py:128 +#: core/tables/tasks.py:128 msgid "No workers found" msgstr "" -#: netbox/core/views.py:90 +#: core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "" -#: netbox/core/views.py:319 +#: core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "" -#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 +#: core/views.py:412 core/views.py:455 core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "" -#: netbox/core/views.py:463 +#: core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "" -#: netbox/core/views.py:465 +#: core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "" -#: netbox/core/views.py:478 netbox/core/views.py:496 +#: core/views.py:478 core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "" -#: netbox/core/views.py:484 +#: core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "" -#: netbox/core/views.py:519 +#: core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "" -#: netbox/core/views.py:538 +#: core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "" -#: netbox/core/views.py:540 +#: core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "" -#: netbox/core/views.py:674 +#: core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "" -#: netbox/core/views.py:708 +#: core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "" -#: netbox/dcim/api/serializers_/devices.py:49 -#: netbox/dcim/api/serializers_/devicetypes.py:25 +#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "" -#: netbox/dcim/api/serializers_/racks.py:112 netbox/templates/dcim/rack.html:28 +#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 msgid "Facility ID" msgstr "" -#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 +#: dcim/choices.py:21 virtualization/choices.py:21 msgid "Staging" msgstr "" -#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 -#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1531 -#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 +#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 +#: dcim/choices.py:1533 virtualization/choices.py:23 +#: virtualization/choices.py:48 msgid "Decommissioning" msgstr "" -#: netbox/dcim/choices.py:24 +#: dcim/choices.py:24 msgid "Retired" msgstr "" -#: netbox/dcim/choices.py:65 +#: dcim/choices.py:65 msgid "2-post frame" msgstr "" -#: netbox/dcim/choices.py:66 +#: dcim/choices.py:66 msgid "4-post frame" msgstr "" -#: netbox/dcim/choices.py:67 +#: dcim/choices.py:67 msgid "4-post cabinet" msgstr "" -#: netbox/dcim/choices.py:68 +#: dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "" -#: netbox/dcim/choices.py:69 +#: dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "" -#: netbox/dcim/choices.py:70 +#: dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "" -#: netbox/dcim/choices.py:71 +#: dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "" -#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 -#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 +#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "" -#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 -#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 -#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 +#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 ipam/choices.py:70 +#: ipam/choices.py:155 wireless/choices.py:26 msgid "Reserved" msgstr "" -#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 +#: dcim/choices.py:101 templates/dcim/device.html:259 msgid "Available" msgstr "" -#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 -#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 -#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 +#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 ipam/choices.py:71 +#: ipam/choices.py:156 wireless/choices.py:28 msgid "Deprecated" msgstr "" -#: netbox/dcim/choices.py:114 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 +#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "" -#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1553 +#: dcim/choices.py:115 dcim/choices.py:1555 msgid "Inches" msgstr "" -#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 -#: netbox/dcim/choices.py:254 +#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 msgid "Front to rear" msgstr "" -#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 -#: netbox/dcim/choices.py:255 +#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 msgid "Rear to front" msgstr "" -#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 -#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 -#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/bulk_import.py:60 -#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 -#: netbox/dcim/forms/bulk_import.py:566 netbox/dcim/forms/bulk_import.py:833 -#: netbox/dcim/forms/bulk_import.py:1088 netbox/dcim/forms/filtersets.py:234 -#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 -#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1062 -#: netbox/dcim/forms/model_forms.py:1502 netbox/dcim/forms/object_import.py:176 -#: netbox/dcim/tables/devices.py:656 netbox/dcim/tables/devices.py:869 -#: netbox/dcim/tables/devices.py:954 netbox/extras/tables/tables.py:223 -#: netbox/ipam/tables/fhrp.py:59 netbox/ipam/tables/ip.py:378 -#: netbox/ipam/tables/services.py:44 netbox/templates/dcim/interface.html:102 -#: netbox/templates/dcim/interface.html:309 -#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 -#: netbox/templates/dcim/sitegroup.html:37 -#: netbox/templates/ipam/service.html:28 -#: netbox/templates/tenancy/contactgroup.html:29 -#: netbox/templates/tenancy/tenantgroup.html:37 -#: netbox/templates/virtualization/vminterface.html:39 -#: netbox/templates/wireless/wirelesslangroup.html:37 -#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 -#: netbox/tenancy/forms/bulk_import.py:24 -#: netbox/tenancy/forms/bulk_import.py:58 -#: netbox/tenancy/forms/model_forms.py:25 -#: netbox/tenancy/forms/model_forms.py:68 -#: netbox/virtualization/forms/bulk_edit.py:207 -#: netbox/virtualization/forms/bulk_import.py:151 -#: netbox/virtualization/tables/virtualmachines.py:162 -#: netbox/wireless/forms/bulk_edit.py:24 -#: netbox/wireless/forms/bulk_import.py:21 -#: netbox/wireless/forms/model_forms.py:21 +#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 +#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 +#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 +#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 +#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 +#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 +#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 +#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 +#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 +#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 +#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 +#: ipam/tables/services.py:44 templates/dcim/interface.html:102 +#: templates/dcim/interface.html:309 templates/dcim/location.html:41 +#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 +#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 +#: templates/tenancy/tenantgroup.html:37 +#: templates/virtualization/vminterface.html:39 +#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 +#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 +#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 +#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 +#: virtualization/forms/bulk_import.py:151 +#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 +#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 msgid "Parent" msgstr "" -#: netbox/dcim/choices.py:152 +#: dcim/choices.py:152 msgid "Child" msgstr "" -#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 -#: netbox/templates/dcim/rack.html:133 -#: netbox/templates/dcim/rack_elevation_list.html:20 -#: netbox/templates/dcim/rackreservation.html:76 +#: dcim/choices.py:166 templates/dcim/device.html:340 +#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 +#: templates/dcim/rackreservation.html:76 msgid "Front" msgstr "" -#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 -#: netbox/templates/dcim/rack.html:139 -#: netbox/templates/dcim/rack_elevation_list.html:21 -#: netbox/templates/dcim/rackreservation.html:82 +#: dcim/choices.py:167 templates/dcim/device.html:346 +#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 +#: templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "" -#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 -#: netbox/virtualization/choices.py:46 +#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 msgid "Staged" msgstr "" -#: netbox/dcim/choices.py:188 +#: dcim/choices.py:188 msgid "Inventory" msgstr "" -#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 +#: dcim/choices.py:209 dcim/choices.py:256 msgid "Left to right" msgstr "" -#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 +#: dcim/choices.py:210 dcim/choices.py:257 msgid "Right to left" msgstr "" -#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 +#: dcim/choices.py:211 dcim/choices.py:258 msgid "Side to rear" msgstr "" -#: netbox/dcim/choices.py:212 +#: dcim/choices.py:212 msgid "Rear to side" msgstr "" -#: netbox/dcim/choices.py:213 +#: dcim/choices.py:213 msgid "Bottom to top" msgstr "" -#: netbox/dcim/choices.py:214 +#: dcim/choices.py:214 msgid "Top to bottom" msgstr "" -#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 -#: netbox/dcim/choices.py:1303 +#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 msgid "Passive" msgstr "" -#: netbox/dcim/choices.py:216 +#: dcim/choices.py:216 msgid "Mixed" msgstr "" -#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 +#: dcim/choices.py:484 dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "" -#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 +#: dcim/choices.py:506 dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "" -#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 +#: dcim/choices.py:530 dcim/choices.py:779 msgid "California Style" msgstr "" -#: netbox/dcim/choices.py:538 +#: dcim/choices.py:538 msgid "International/ITA" msgstr "" -#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 +#: dcim/choices.py:573 dcim/choices.py:814 msgid "Proprietary" msgstr "" -#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 -#: netbox/dcim/choices.py:1219 netbox/dcim/choices.py:1221 -#: netbox/dcim/choices.py:1447 netbox/dcim/choices.py:1449 -#: netbox/netbox/navigation/menu.py:200 +#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 +#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 +#: netbox/navigation/menu.py:200 msgid "Other" msgstr "" -#: netbox/dcim/choices.py:787 +#: dcim/choices.py:787 msgid "ITA/International" msgstr "" -#: netbox/dcim/choices.py:854 +#: dcim/choices.py:854 msgid "Physical" msgstr "" -#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1023 +#: dcim/choices.py:855 dcim/choices.py:1024 msgid "Virtual" msgstr "" -#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1097 -#: netbox/dcim/forms/bulk_edit.py:1558 netbox/dcim/forms/filtersets.py:1330 -#: netbox/dcim/forms/model_forms.py:988 netbox/dcim/forms/model_forms.py:1397 -#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 -#: netbox/templates/dcim/interface.html:210 +#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 +#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 +#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 +#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 msgid "Wireless" msgstr "" -#: netbox/dcim/choices.py:1021 +#: dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "" -#: netbox/dcim/choices.py:1024 netbox/dcim/forms/bulk_edit.py:1423 -#: netbox/dcim/forms/bulk_import.py:840 netbox/dcim/forms/model_forms.py:974 -#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 -#: netbox/templates/virtualization/vminterface.html:43 -#: netbox/virtualization/forms/bulk_edit.py:212 -#: netbox/virtualization/forms/bulk_import.py:158 -#: netbox/virtualization/tables/virtualmachines.py:166 +#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 +#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 +#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 +#: templates/virtualization/vminterface.html:43 +#: virtualization/forms/bulk_edit.py:212 +#: virtualization/forms/bulk_import.py:158 +#: virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "" -#: netbox/dcim/choices.py:1025 +#: dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "" -#: netbox/dcim/choices.py:1029 +#: dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "" -#: netbox/dcim/choices.py:1044 +#: dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "" -#: netbox/dcim/choices.py:1081 +#: dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "" -#: netbox/dcim/choices.py:1113 +#: dcim/choices.py:1115 msgid "Cellular" msgstr "" -#: netbox/dcim/choices.py:1165 netbox/dcim/forms/filtersets.py:383 -#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 -#: netbox/dcim/forms/filtersets.py:1542 -#: netbox/templates/dcim/inventoryitem.html:52 -#: netbox/templates/dcim/virtualchassis_edit.html:54 +#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 +#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 +#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 +#: templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "" -#: netbox/dcim/choices.py:1180 +#: dcim/choices.py:1182 msgid "Coaxial" msgstr "" -#: netbox/dcim/choices.py:1200 +#: dcim/choices.py:1202 msgid "Stacking" msgstr "" -#: netbox/dcim/choices.py:1250 +#: dcim/choices.py:1252 msgid "Half" msgstr "" -#: netbox/dcim/choices.py:1251 +#: dcim/choices.py:1253 msgid "Full" msgstr "" -#: netbox/dcim/choices.py:1252 netbox/netbox/preferences.py:31 -#: netbox/wireless/choices.py:480 +#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 msgid "Auto" msgstr "" -#: netbox/dcim/choices.py:1263 +#: dcim/choices.py:1265 msgid "Access" msgstr "" -#: netbox/dcim/choices.py:1264 netbox/ipam/tables/vlans.py:172 -#: netbox/ipam/tables/vlans.py:217 -#: netbox/templates/dcim/inc/interface_vlans_table.html:7 +#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 +#: templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "" -#: netbox/dcim/choices.py:1265 +#: dcim/choices.py:1267 msgid "Tagged (All)" msgstr "" -#: netbox/dcim/choices.py:1294 +#: dcim/choices.py:1296 msgid "IEEE Standard" msgstr "" -#: netbox/dcim/choices.py:1305 +#: dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "" -#: netbox/dcim/choices.py:1306 +#: dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "" -#: netbox/dcim/choices.py:1307 +#: dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "" -#: netbox/dcim/choices.py:1308 +#: dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "" -#: netbox/dcim/choices.py:1378 netbox/dcim/choices.py:1488 +#: dcim/choices.py:1380 dcim/choices.py:1490 msgid "Copper" msgstr "" -#: netbox/dcim/choices.py:1401 +#: dcim/choices.py:1403 msgid "Fiber Optic" msgstr "" -#: netbox/dcim/choices.py:1434 netbox/dcim/choices.py:1517 +#: dcim/choices.py:1436 dcim/choices.py:1519 msgid "USB" msgstr "" -#: netbox/dcim/choices.py:1504 +#: dcim/choices.py:1506 msgid "Fiber" msgstr "" -#: netbox/dcim/choices.py:1529 netbox/dcim/forms/filtersets.py:1227 +#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "" -#: netbox/dcim/choices.py:1548 netbox/wireless/choices.py:497 +#: dcim/choices.py:1550 wireless/choices.py:497 msgid "Kilometers" msgstr "" -#: netbox/dcim/choices.py:1549 netbox/templates/dcim/cable_trace.html:65 -#: netbox/wireless/choices.py:498 +#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 +#: wireless/choices.py:498 msgid "Meters" msgstr "" -#: netbox/dcim/choices.py:1550 +#: dcim/choices.py:1552 msgid "Centimeters" msgstr "" -#: netbox/dcim/choices.py:1551 netbox/wireless/choices.py:499 +#: dcim/choices.py:1553 wireless/choices.py:499 msgid "Miles" msgstr "" -#: netbox/dcim/choices.py:1552 netbox/templates/dcim/cable_trace.html:66 -#: netbox/wireless/choices.py:500 +#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 +#: wireless/choices.py:500 msgid "Feet" msgstr "" -#: netbox/dcim/choices.py:1568 netbox/templates/dcim/device.html:327 -#: netbox/templates/dcim/rack.html:107 +#: dcim/choices.py:1570 templates/dcim/device.html:327 +#: templates/dcim/rack.html:107 msgid "Kilograms" msgstr "" -#: netbox/dcim/choices.py:1569 +#: dcim/choices.py:1571 msgid "Grams" msgstr "" -#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:328 -#: netbox/templates/dcim/rack.html:108 +#: dcim/choices.py:1572 templates/dcim/device.html:328 +#: templates/dcim/rack.html:108 msgid "Pounds" msgstr "" -#: netbox/dcim/choices.py:1571 +#: dcim/choices.py:1573 msgid "Ounces" msgstr "" -#: netbox/dcim/choices.py:1618 +#: dcim/choices.py:1620 msgid "Redundant" msgstr "" -#: netbox/dcim/choices.py:1639 +#: dcim/choices.py:1641 msgid "Single phase" msgstr "" -#: netbox/dcim/choices.py:1640 +#: dcim/choices.py:1642 msgid "Three-phase" msgstr "" -#: netbox/dcim/fields.py:45 +#: dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "" -#: netbox/dcim/fields.py:71 +#: dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "" -#: netbox/dcim/filtersets.py:86 +#: dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "" -#: netbox/dcim/filtersets.py:92 +#: dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "" -#: netbox/dcim/filtersets.py:116 +#: dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:122 +#: dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 -#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 +#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 +#: ipam/filtersets.py:993 msgid "Group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:170 +#: dcim/filtersets.py:170 msgid "Group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 +#: dcim/filtersets.py:176 dcim/filtersets.py:181 msgid "AS (ID)" msgstr "" -#: netbox/dcim/filtersets.py:246 +#: dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "" -#: netbox/dcim/filtersets.py:252 +#: dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "" -#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 -#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 -#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 +#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 +#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "" -#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 -#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 -#: netbox/extras/filtersets.py:542 +#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 +#: dcim/filtersets.py:1410 extras/filtersets.py:542 msgid "Location (slug)" msgstr "" -#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 -#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 -#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 -#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 -#: netbox/dcim/filtersets.py:1840 +#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 +#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 +#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "" -#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 -#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 -#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 -#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 -#: netbox/dcim/filtersets.py:1846 +#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 +#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 +#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "" -#: netbox/dcim/filtersets.py:393 +#: dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "" -#: netbox/dcim/filtersets.py:397 +#: dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 -#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 -#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 -#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 +#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 +#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 +#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "" -#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 -#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 -#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 -#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 -#: netbox/virtualization/filtersets.py:216 +#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 +#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 +#: ipam/filtersets.py:499 ipam/filtersets.py:1009 +#: virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "" -#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 -#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 +#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 +#: dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "" -#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 -#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 -#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 -#: netbox/users/filtersets.py:180 +#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 +#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 +#: users/filtersets.py:180 msgid "User (name)" msgstr "" -#: netbox/dcim/filtersets.py:549 +#: dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "" -#: netbox/dcim/filtersets.py:555 +#: dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "" -#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 +#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "" -#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 +#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "" -#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 -#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 -#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 +#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 +#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 +#: dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "" -#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 -#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 -#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 +#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 +#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 +#: dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "" -#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 -#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 -#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 +#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 +#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 +#: dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "" -#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 -#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 -#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 +#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 +#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 +#: dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "" -#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 -#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 -#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 +#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 +#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 +#: dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "" -#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 -#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 -#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 +#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 +#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 +#: dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "" -#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 -#: netbox/dcim/forms/filtersets.py:580 +#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "" -#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 -#: netbox/dcim/forms/filtersets.py:573 +#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "" -#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 +#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "" -#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 -#: netbox/dcim/filtersets.py:1436 +#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 +#: dcim/filtersets.py:772 dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 +#: dcim/filtersets.py:804 dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "" -#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 +#: dcim/filtersets.py:878 dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "" -#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 -#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 +#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 +#: virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "" -#: netbox/dcim/filtersets.py:985 +#: dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1005 +#: dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 +#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 -#: netbox/virtualization/filtersets.py:226 +#: dcim/filtersets.py:1015 extras/filtersets.py:569 +#: virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 -#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 -#: netbox/dcim/filtersets.py:2235 +#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 +#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1067 +#: dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1071 +#: dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 -#: netbox/virtualization/filtersets.py:136 +#: dcim/filtersets.py:1077 extras/filtersets.py:591 +#: virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 +#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1088 +#: dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:517 +#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 msgid "Is full depth" msgstr "" -#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 -#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 -#: netbox/dcim/models/device_components.py:518 -#: netbox/virtualization/filtersets.py:230 -#: netbox/virtualization/filtersets.py:301 -#: netbox/virtualization/forms/filtersets.py:172 -#: netbox/virtualization/forms/filtersets.py:223 +#: dcim/filtersets.py:1103 dcim/forms/common.py:18 dcim/forms/filtersets.py:818 +#: dcim/forms/filtersets.py:1385 dcim/models/device_components.py:518 +#: virtualization/filtersets.py:230 virtualization/filtersets.py:301 +#: virtualization/forms/filtersets.py:172 +#: virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "" -#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 -#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 -#: netbox/virtualization/filtersets.py:234 -#: netbox/virtualization/forms/filtersets.py:176 +#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 dcim/forms/filtersets.py:827 +#: dcim/forms/filtersets.py:930 virtualization/filtersets.py:234 +#: virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "" -#: netbox/dcim/filtersets.py:1114 +#: dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "" -#: netbox/dcim/filtersets.py:1119 +#: dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1123 +#: dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "" -#: netbox/dcim/filtersets.py:1164 +#: dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1168 +#: dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "" -#: netbox/dcim/filtersets.py:1257 +#: dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1262 +#: dcim/filtersets.py:1262 msgid "Device model" msgstr "" -#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 -#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 +#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 +#: vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1323 +#: dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "" -#: netbox/dcim/filtersets.py:1329 +#: dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 -#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 -#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 -#: netbox/vpn/filtersets.py:379 +#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 +#: ipam/filtersets.py:851 ipam/filtersets.py:1115 +#: virtualization/filtersets.py:161 vpn/filtersets.py:379 msgid "Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1421 +#: dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "" -#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 -#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 -#: netbox/vpn/filtersets.py:374 +#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 +#: ipam/filtersets.py:1121 vpn/filtersets.py:374 msgid "Device (name)" msgstr "" -#: netbox/dcim/filtersets.py:1442 +#: dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "" -#: netbox/dcim/filtersets.py:1447 +#: dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1453 +#: dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1458 +#: dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 -#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 -#: netbox/templates/dcim/device.html:120 -#: netbox/templates/dcim/device_edit.html:93 -#: netbox/templates/dcim/virtualchassis.html:20 -#: netbox/templates/dcim/virtualchassis_add.html:8 -#: netbox/templates/dcim/virtualchassis_edit.html:24 +#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 +#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 +#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 +#: templates/dcim/virtualchassis.html:20 +#: templates/dcim/virtualchassis_add.html:8 +#: templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "" -#: netbox/dcim/filtersets.py:1488 +#: dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1495 +#: dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 -#: netbox/vpn/forms/bulk_import.py:308 +#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 +#: vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "" -#: netbox/dcim/filtersets.py:1608 +#: dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "" -#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1526 -#: netbox/dcim/forms/bulk_import.py:891 netbox/dcim/forms/filtersets.py:1428 -#: netbox/dcim/forms/model_forms.py:1378 -#: netbox/dcim/models/device_components.py:711 -#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 -#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 -#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 -#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 -#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 -#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 -#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 -#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 -#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 -#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:431 -#: netbox/ipam/forms/model_forms.py:445 netbox/ipam/forms/model_forms.py:459 -#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 -#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 -#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 -#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 -#: netbox/templates/dcim/interface.html:133 -#: netbox/templates/ipam/ipaddress.html:18 -#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 -#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 -#: netbox/templates/virtualization/vminterface.html:47 -#: netbox/virtualization/forms/bulk_edit.py:261 -#: netbox/virtualization/forms/bulk_import.py:171 -#: netbox/virtualization/forms/filtersets.py:228 -#: netbox/virtualization/forms/model_forms.py:344 -#: netbox/virtualization/models/virtualmachines.py:355 -#: netbox/virtualization/tables/virtualmachines.py:143 +#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 +#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 +#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 +#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 +#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 +#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 +#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 +#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 +#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 +#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 +#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 +#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 +#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 +#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 +#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 +#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 +#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 +#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 +#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 +#: templates/virtualization/vminterface.html:47 +#: virtualization/forms/bulk_edit.py:261 +#: virtualization/forms/bulk_import.py:171 +#: virtualization/forms/filtersets.py:228 +#: virtualization/forms/model_forms.py:344 +#: virtualization/models/virtualmachines.py:355 +#: virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "" -#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 -#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 -#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 +#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 +#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "" -#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 -#: netbox/vpn/filtersets.py:342 +#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 -#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 -#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 -#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 -#: netbox/templates/vpn/l2vpntermination.html:12 -#: netbox/virtualization/forms/filtersets.py:233 -#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 -#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 -#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 +#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 +#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 +#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 +#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 +#: templates/vpn/l2vpntermination.html:12 +#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 +#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 +#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "" -#: netbox/dcim/filtersets.py:1662 +#: dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "" -#: netbox/dcim/filtersets.py:1667 +#: dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1671 +#: dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "" -#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 +#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 +#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1686 +#: dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 -#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1690 -#: netbox/templates/dcim/virtualdevicecontext.html:15 +#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 +#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 +#: templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "" -#: netbox/dcim/filtersets.py:1719 +#: dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "" -#: netbox/dcim/filtersets.py:1730 netbox/templates/wireless/wirelesslan.html:11 -#: netbox/wireless/forms/model_forms.py:53 +#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 +#: wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "" -#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 +#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 msgid "Wireless link" msgstr "" -#: netbox/dcim/filtersets.py:1803 +#: dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1808 +#: dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1819 +#: dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1825 +#: dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "" -#: netbox/dcim/filtersets.py:1891 +#: dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1897 +#: dcim/filtersets.py:1897 msgid "Master (name)" msgstr "" -#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 +#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 -#: netbox/tenancy/filtersets.py:251 +#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 +#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "" -#: netbox/dcim/filtersets.py:2239 +#: dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "" -#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 -#: netbox/extras/forms/model_forms.py:567 -#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 -#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 -#: netbox/templates/circuits/inc/circuit_termination.html:32 -#: netbox/templates/generic/bulk_edit.html:65 -#: netbox/templates/inc/panels/tags.html:5 -#: netbox/utilities/forms/fields/fields.py:81 +#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 +#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 +#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 +#: netbox/tables/columns.py:478 +#: templates/circuits/inc/circuit_termination.html:32 +#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 +#: utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "" -#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 -#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 -#: netbox/dcim/forms/object_create.py:197 -#: netbox/dcim/forms/object_create.py:353 netbox/dcim/tables/devices.py:165 -#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 -#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 -#: netbox/templates/dcim/modulebay.html:38 -#: netbox/templates/dcim/virtualchassis.html:66 -#: netbox/templates/dcim/virtualchassis_edit.html:55 +#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 +#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 +#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 +#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 +#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 +#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 +#: templates/dcim/virtualchassis.html:66 +#: templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "" -#: netbox/dcim/forms/bulk_create.py:114 +#: dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:133 +#: dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:138 +#: dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:144 +#: dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 -#: netbox/dcim/forms/model_forms.py:128 +#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 +#: dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:496 -#: netbox/dcim/forms/bulk_edit.py:560 netbox/dcim/forms/bulk_edit.py:633 -#: netbox/dcim/forms/bulk_edit.py:657 netbox/dcim/forms/bulk_edit.py:750 -#: netbox/dcim/forms/bulk_edit.py:1277 netbox/dcim/forms/bulk_edit.py:1698 -#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:371 -#: netbox/dcim/forms/bulk_import.py:405 netbox/dcim/forms/bulk_import.py:450 -#: netbox/dcim/forms/bulk_import.py:486 netbox/dcim/forms/bulk_import.py:1082 -#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 -#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 -#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 -#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 -#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 -#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 -#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1075 -#: netbox/dcim/forms/model_forms.py:1515 netbox/dcim/forms/object_import.py:187 -#: netbox/dcim/tables/devices.py:96 netbox/dcim/tables/devices.py:172 -#: netbox/dcim/tables/devices.py:940 netbox/dcim/tables/devicetypes.py:80 -#: netbox/dcim/tables/devicetypes.py:308 netbox/dcim/tables/modules.py:20 -#: netbox/dcim/tables/modules.py:60 netbox/dcim/tables/racks.py:58 -#: netbox/dcim/tables/racks.py:132 netbox/templates/dcim/devicetype.html:14 -#: netbox/templates/dcim/inventoryitem.html:44 -#: netbox/templates/dcim/manufacturer.html:33 -#: netbox/templates/dcim/modulebay.html:62 -#: netbox/templates/dcim/moduletype.html:25 -#: netbox/templates/dcim/platform.html:37 -#: netbox/templates/dcim/racktype.html:16 +#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 +#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 +#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 +#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 +#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 +#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 +#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 +#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 +#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 +#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 +#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 +#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 +#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 +#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 +#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 +#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 +#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 +#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 +#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 +#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 +#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 +#: templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:373 -#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:263 -#: netbox/dcim/forms/filtersets.py:255 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 +#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 +#: dcim/forms/filtersets.py:255 +#: templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:378 -#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:266 -#: netbox/dcim/forms/filtersets.py:260 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 +#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 +#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 +#: dcim/forms/filtersets.py:260 +#: templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:384 -#: netbox/templates/dcim/devicetype.html:37 +#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 +#: templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:389 -#: netbox/dcim/forms/filtersets.py:274 +#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 +#: dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:392 +#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 msgid "Outer width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:397 +#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 msgid "Outer depth" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:402 -#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:271 +#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 +#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 msgid "Outer unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:407 +#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 msgid "Mounting depth" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 -#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:447 -#: netbox/dcim/forms/bulk_edit.py:530 netbox/dcim/forms/bulk_edit.py:553 -#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:596 -#: netbox/dcim/forms/bulk_import.py:384 netbox/dcim/forms/bulk_import.py:416 -#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 -#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 -#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 -#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 -#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 -#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 -#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 -#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 -#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 -#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 -#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 -#: netbox/templates/dcim/device.html:324 -#: netbox/templates/dcim/devicetype.html:49 -#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 -#: netbox/templates/dcim/racktype.html:41 -#: netbox/templates/extras/configcontext.html:17 -#: netbox/templates/extras/customlink.html:25 -#: netbox/templates/extras/savedfilter.html:33 -#: netbox/templates/ipam/role.html:30 +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 +#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 +#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 +#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 +#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 +#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 +#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 +#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 +#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 +#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 +#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 +#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 +#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 +#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 +#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 +#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 +#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 +#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 +#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 +#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 +#: templates/ipam/role.html:30 msgid "Weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:422 -#: netbox/dcim/forms/filtersets.py:290 +#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 +#: dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:427 -#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:579 -#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:283 -#: netbox/dcim/forms/bulk_import.py:389 netbox/dcim/forms/bulk_import.py:421 -#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 -#: netbox/dcim/forms/filtersets.py:678 +#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 +#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 +#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 +#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 +#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 +#: dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 -#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 -#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 +#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 +#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 +#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 -#: netbox/dcim/forms/model_forms.py:297 +#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 +#: dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 -#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 +#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 +#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 +#: templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 -#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 -#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 +#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 +#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 +#: templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1272 -#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_import.py:253 -#: netbox/dcim/forms/bulk_import.py:1076 netbox/dcim/forms/filtersets.py:367 -#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 -#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1070 -#: netbox/dcim/forms/model_forms.py:1510 netbox/dcim/forms/object_import.py:181 -#: netbox/dcim/tables/devices.py:169 netbox/dcim/tables/devices.py:809 -#: netbox/dcim/tables/devices.py:937 netbox/dcim/tables/devicetypes.py:304 -#: netbox/dcim/tables/racks.py:129 netbox/extras/filtersets.py:552 -#: netbox/ipam/forms/bulk_edit.py:261 netbox/ipam/forms/bulk_edit.py:311 -#: netbox/ipam/forms/bulk_edit.py:359 netbox/ipam/forms/bulk_edit.py:511 -#: netbox/ipam/forms/bulk_import.py:197 netbox/ipam/forms/bulk_import.py:262 -#: netbox/ipam/forms/bulk_import.py:298 netbox/ipam/forms/bulk_import.py:455 -#: netbox/ipam/forms/filtersets.py:237 netbox/ipam/forms/filtersets.py:289 -#: netbox/ipam/forms/filtersets.py:360 netbox/ipam/forms/filtersets.py:509 -#: netbox/ipam/forms/model_forms.py:188 netbox/ipam/forms/model_forms.py:221 -#: netbox/ipam/forms/model_forms.py:250 netbox/ipam/forms/model_forms.py:643 -#: netbox/ipam/tables/ip.py:258 netbox/ipam/tables/ip.py:316 -#: netbox/ipam/tables/ip.py:367 netbox/ipam/tables/vlans.py:130 -#: netbox/ipam/tables/vlans.py:235 netbox/templates/dcim/device.html:182 -#: netbox/templates/dcim/inc/panels/inventory_items.html:20 -#: netbox/templates/dcim/interface.html:223 -#: netbox/templates/dcim/inventoryitem.html:36 -#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 -#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 -#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 -#: netbox/templates/virtualization/virtualmachine.html:23 -#: netbox/templates/vpn/tunneltermination.html:17 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 -#: netbox/tenancy/forms/bulk_edit.py:142 netbox/tenancy/forms/filtersets.py:107 -#: netbox/tenancy/forms/model_forms.py:137 -#: netbox/tenancy/tables/contacts.py:102 -#: netbox/virtualization/forms/bulk_edit.py:145 -#: netbox/virtualization/forms/bulk_import.py:106 -#: netbox/virtualization/forms/filtersets.py:157 -#: netbox/virtualization/forms/model_forms.py:195 -#: netbox/virtualization/tables/virtualmachines.py:75 -#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 -#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 -#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 +#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 +#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 +#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 +#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 +#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 +#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 +#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 +#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 +#: dcim/tables/racks.py:129 extras/filtersets.py:552 +#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 +#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 +#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 +#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 +#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 +#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 +#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 +#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 +#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 +#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 +#: templates/dcim/device.html:182 +#: templates/dcim/inc/panels/inventory_items.html:20 +#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 +#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 +#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 +#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 +#: templates/virtualization/virtualmachine.html:23 +#: templates/vpn/tunneltermination.html:17 +#: templates/wireless/inc/wirelesslink_interface.html:20 +#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 +#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 +#: virtualization/forms/bulk_edit.py:145 +#: virtualization/forms/bulk_import.py:106 +#: virtualization/forms/filtersets.py:157 +#: virtualization/forms/model_forms.py:195 +#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 +#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 +#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 +#: vpn/tables/tunnels.py:82 msgid "Role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:365 netbox/dcim/forms/bulk_edit.py:713 -#: netbox/dcim/forms/bulk_edit.py:774 netbox/templates/dcim/device.html:104 -#: netbox/templates/dcim/module.html:77 netbox/templates/dcim/modulebay.html:70 -#: netbox/templates/dcim/rack.html:57 -#: netbox/templates/virtualization/virtualmachine.html:35 +#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 +#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 +#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 +#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:368 netbox/dcim/forms/filtersets.py:387 -#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 -#: netbox/dcim/forms/filtersets.py:1546 +#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 +#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 +#: dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:412 netbox/dcim/forms/bulk_edit.py:525 -#: netbox/dcim/forms/bulk_edit.py:569 netbox/dcim/forms/bulk_edit.py:706 -#: netbox/dcim/forms/bulk_import.py:277 netbox/dcim/forms/bulk_import.py:410 -#: netbox/dcim/forms/bulk_import.py:580 netbox/dcim/forms/filtersets.py:280 -#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 -#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 -#: netbox/templates/dcim/devicetype.html:65 -#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 -#: netbox/templates/dcim/racktype.html:28 +#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 +#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 +#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 +#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 +#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 +#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 +#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 +#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 msgid "Airflow" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:441 netbox/dcim/forms/bulk_edit.py:920 -#: netbox/dcim/forms/bulk_import.py:322 netbox/dcim/forms/bulk_import.py:325 -#: netbox/dcim/forms/bulk_import.py:553 netbox/dcim/forms/bulk_import.py:1358 -#: netbox/dcim/forms/bulk_import.py:1362 netbox/dcim/forms/filtersets.py:104 -#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 -#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 -#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 -#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 -#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 -#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:400 -#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 -#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 -#: netbox/templates/dcim/device.html:30 -#: netbox/templates/dcim/inc/cable_termination.html:16 -#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 -#: netbox/templates/dcim/rack/base.html:4 -#: netbox/templates/dcim/rackreservation.html:19 -#: netbox/templates/dcim/rackreservation.html:36 -#: netbox/virtualization/forms/model_forms.py:113 +#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 +#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 +#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 +#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 +#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 +#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 +#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 +#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 +#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 +#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 +#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 +#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 +#: templates/dcim/inc/cable_termination.html:16 +#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 +#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 +#: templates/dcim/rackreservation.html:36 +#: virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:445 netbox/dcim/forms/bulk_edit.py:739 -#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 -#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 -#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 -#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1580 -#: netbox/templates/dcim/device_edit.html:20 +#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 +#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 +#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 +#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 +#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 +#: templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:501 netbox/dcim/forms/bulk_import.py:377 -#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 +#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 +#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_edit.py:565 -#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 +#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 +#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 msgid "Part number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:510 +#: dcim/forms/bulk_edit.py:510 msgid "U height" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:522 netbox/dcim/tables/devicetypes.py:102 +#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:551 netbox/dcim/forms/model_forms.py:368 -#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 -#: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61 +#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 +#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 +#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 msgid "Device Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:593 netbox/dcim/forms/model_forms.py:401 -#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 -#: netbox/templates/dcim/module.html:65 netbox/templates/dcim/modulebay.html:66 -#: netbox/templates/dcim/moduletype.html:22 +#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 +#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 +#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 +#: templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:597 netbox/dcim/forms/model_forms.py:371 -#: netbox/dcim/forms/model_forms.py:402 -#: netbox/templates/dcim/devicetype.html:11 +#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 +#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:611 netbox/dcim/models/devices.py:484 -#: netbox/dcim/tables/devices.py:67 +#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 +#: dcim/tables/devices.py:67 msgid "VM role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:614 netbox/dcim/forms/bulk_edit.py:638 -#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_import.py:434 -#: netbox/dcim/forms/bulk_import.py:438 netbox/dcim/forms/bulk_import.py:457 -#: netbox/dcim/forms/bulk_import.py:461 netbox/dcim/forms/bulk_import.py:586 -#: netbox/dcim/forms/bulk_import.py:590 netbox/dcim/forms/filtersets.py:689 -#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 -#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 -#: netbox/dcim/forms/model_forms.py:555 -#: netbox/virtualization/forms/bulk_import.py:132 -#: netbox/virtualization/forms/bulk_import.py:133 -#: netbox/virtualization/forms/filtersets.py:188 -#: netbox/virtualization/forms/model_forms.py:215 +#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 +#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 +#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 +#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 +#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 +#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 +#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 +#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 +#: virtualization/forms/bulk_import.py:133 +#: virtualization/forms/filtersets.py:188 +#: virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:1071 -#: netbox/dcim/forms/bulk_import.py:492 netbox/dcim/forms/filtersets.py:114 -#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 -#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 +#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 +#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 +#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 +#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 msgid "Device type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:673 netbox/dcim/forms/bulk_import.py:473 -#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 +#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 +#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 msgid "Device role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:696 netbox/dcim/forms/bulk_import.py:498 -#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 -#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 -#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 -#: netbox/templates/dcim/platform.html:26 -#: netbox/templates/virtualization/virtualmachine.html:27 -#: netbox/virtualization/forms/bulk_edit.py:160 -#: netbox/virtualization/forms/bulk_import.py:122 -#: netbox/virtualization/forms/filtersets.py:168 -#: netbox/virtualization/forms/model_forms.py:203 -#: netbox/virtualization/tables/virtualmachines.py:79 +#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 +#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 +#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 +#: extras/filtersets.py:563 templates/dcim/device.html:186 +#: templates/dcim/platform.html:26 +#: templates/virtualization/virtualmachine.html:27 +#: virtualization/forms/bulk_edit.py:160 +#: virtualization/forms/bulk_import.py:122 +#: virtualization/forms/filtersets.py:168 +#: virtualization/forms/model_forms.py:203 +#: virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:517 -#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 -#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 -#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 -#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 -#: netbox/templates/dcim/device.html:239 -#: netbox/templates/virtualization/cluster.html:10 -#: netbox/templates/virtualization/virtualmachine.html:92 -#: netbox/templates/virtualization/virtualmachine.html:101 -#: netbox/virtualization/filtersets.py:157 -#: netbox/virtualization/filtersets.py:277 -#: netbox/virtualization/forms/bulk_edit.py:129 -#: netbox/virtualization/forms/bulk_import.py:92 -#: netbox/virtualization/forms/filtersets.py:99 -#: netbox/virtualization/forms/filtersets.py:123 -#: netbox/virtualization/forms/filtersets.py:204 -#: netbox/virtualization/forms/model_forms.py:79 -#: netbox/virtualization/forms/model_forms.py:176 -#: netbox/virtualization/tables/virtualmachines.py:67 +#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 +#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 +#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 +#: extras/filtersets.py:596 extras/forms/filtersets.py:322 +#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 +#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:101 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 +#: virtualization/forms/bulk_edit.py:129 virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:99 virtualization/forms/filtersets.py:123 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/model_forms.py:79 +#: virtualization/forms/model_forms.py:176 +#: virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:737 netbox/dcim/forms/bulk_edit.py:1291 -#: netbox/dcim/forms/bulk_edit.py:1688 netbox/dcim/forms/bulk_edit.py:1734 -#: netbox/dcim/forms/bulk_import.py:641 netbox/dcim/forms/bulk_import.py:703 -#: netbox/dcim/forms/bulk_import.py:729 netbox/dcim/forms/bulk_import.py:755 -#: netbox/dcim/forms/bulk_import.py:775 netbox/dcim/forms/bulk_import.py:828 -#: netbox/dcim/forms/bulk_import.py:946 netbox/dcim/forms/bulk_import.py:994 -#: netbox/dcim/forms/bulk_import.py:1011 netbox/dcim/forms/bulk_import.py:1023 -#: netbox/dcim/forms/bulk_import.py:1071 netbox/dcim/forms/bulk_import.py:1422 -#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 -#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 -#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 -#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 -#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 -#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 -#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 -#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 -#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 -#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1208 -#: netbox/dcim/forms/model_forms.py:1664 netbox/dcim/forms/object_create.py:257 -#: netbox/dcim/tables/connections.py:22 netbox/dcim/tables/connections.py:41 -#: netbox/dcim/tables/connections.py:60 netbox/dcim/tables/devices.py:285 -#: netbox/dcim/tables/devices.py:371 netbox/dcim/tables/devices.py:412 -#: netbox/dcim/tables/devices.py:454 netbox/dcim/tables/devices.py:505 -#: netbox/dcim/tables/devices.py:597 netbox/dcim/tables/devices.py:697 -#: netbox/dcim/tables/devices.py:754 netbox/dcim/tables/devices.py:801 -#: netbox/dcim/tables/devices.py:861 netbox/dcim/tables/devices.py:930 -#: netbox/dcim/tables/devices.py:1057 netbox/dcim/tables/modules.py:52 -#: netbox/extras/forms/filtersets.py:321 netbox/ipam/forms/bulk_import.py:304 -#: netbox/ipam/forms/bulk_import.py:481 netbox/ipam/forms/filtersets.py:551 -#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/forms/model_forms.py:679 -#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:738 -#: netbox/ipam/tables/vlans.py:180 netbox/templates/dcim/consoleport.html:20 -#: netbox/templates/dcim/consoleserverport.html:20 -#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 -#: netbox/templates/dcim/device_edit.html:10 -#: netbox/templates/dcim/devicebay.html:20 -#: netbox/templates/dcim/devicebay.html:48 -#: netbox/templates/dcim/frontport.html:20 -#: netbox/templates/dcim/interface.html:30 -#: netbox/templates/dcim/interface.html:161 -#: netbox/templates/dcim/inventoryitem.html:20 -#: netbox/templates/dcim/module.html:57 netbox/templates/dcim/modulebay.html:20 -#: netbox/templates/dcim/poweroutlet.html:20 -#: netbox/templates/dcim/powerport.html:20 -#: netbox/templates/dcim/rearport.html:20 -#: netbox/templates/dcim/virtualchassis.html:65 -#: netbox/templates/dcim/virtualchassis_edit.html:51 -#: netbox/templates/dcim/virtualdevicecontext.html:22 -#: netbox/templates/virtualization/virtualmachine.html:114 -#: netbox/templates/vpn/tunneltermination.html:23 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 -#: netbox/virtualization/filtersets.py:167 -#: netbox/virtualization/forms/bulk_edit.py:137 -#: netbox/virtualization/forms/bulk_import.py:99 -#: netbox/virtualization/forms/filtersets.py:128 -#: netbox/virtualization/forms/model_forms.py:185 -#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:44 -#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 -#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 -#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 -#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 -#: netbox/wireless/forms/model_forms.py:141 -#: netbox/wireless/tables/wirelesslan.py:75 +#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 +#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 +#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 +#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 +#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 +#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 +#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 +#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 +#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 +#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 +#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 +#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 +#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 +#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 +#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 +#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 +#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 +#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 +#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 +#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 +#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 +#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 +#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 +#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 +#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 +#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 +#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 +#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 +#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 +#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 +#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 +#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 +#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 +#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 +#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 +#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 +#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 +#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 +#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 +#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 +#: templates/dcim/virtualchassis_edit.html:51 +#: templates/dcim/virtualdevicecontext.html:22 +#: templates/virtualization/virtualmachine.html:114 +#: templates/vpn/tunneltermination.html:23 +#: templates/wireless/inc/wirelesslink_interface.html:6 +#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 +#: virtualization/forms/bulk_import.py:99 +#: virtualization/forms/filtersets.py:128 +#: virtualization/forms/model_forms.py:185 +#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 +#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 +#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 +#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 +#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 +#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:740 -#: netbox/templates/extras/dashboard/widget_config.html:7 -#: netbox/virtualization/forms/bulk_edit.py:191 +#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 +#: virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:741 netbox/netbox/navigation/menu.py:243 -#: netbox/templates/dcim/device_edit.html:78 +#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 +#: templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:755 netbox/dcim/forms/bulk_import.py:653 -#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 +#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 +#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 msgid "Module type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:994 -#: netbox/dcim/forms/bulk_edit.py:1013 netbox/dcim/forms/bulk_edit.py:1036 -#: netbox/dcim/forms/bulk_edit.py:1078 netbox/dcim/forms/bulk_edit.py:1122 -#: netbox/dcim/forms/bulk_edit.py:1173 netbox/dcim/forms/bulk_edit.py:1200 -#: netbox/dcim/forms/bulk_edit.py:1227 netbox/dcim/forms/bulk_edit.py:1245 -#: netbox/dcim/forms/bulk_edit.py:1263 netbox/dcim/forms/filtersets.py:67 -#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 -#: netbox/templates/dcim/consoleport.html:32 -#: netbox/templates/dcim/consoleserverport.html:32 -#: netbox/templates/dcim/devicebay.html:28 -#: netbox/templates/dcim/frontport.html:32 -#: netbox/templates/dcim/inc/panels/inventory_items.html:19 -#: netbox/templates/dcim/interface.html:42 -#: netbox/templates/dcim/inventoryitem.html:32 -#: netbox/templates/dcim/modulebay.html:34 -#: netbox/templates/dcim/poweroutlet.html:32 -#: netbox/templates/dcim/powerport.html:32 -#: netbox/templates/dcim/rearport.html:32 -#: netbox/templates/extras/customfield.html:26 -#: netbox/templates/generic/bulk_import.html:162 +#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 +#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 +#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 +#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 +#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 +#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 +#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 +#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 +#: templates/dcim/inc/panels/inventory_items.html:19 +#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 +#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 +#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 +#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 msgid "Label" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:818 netbox/dcim/forms/filtersets.py:1068 -#: netbox/templates/dcim/cable.html:50 +#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 +#: templates/dcim/cable.html:50 msgid "Length" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/bulk_import.py:1226 -#: netbox/dcim/forms/bulk_import.py:1229 netbox/dcim/forms/filtersets.py:1072 +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 +#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:847 -#: netbox/templates/dcim/virtualchassis.html:23 +#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:915 netbox/dcim/forms/bulk_import.py:1345 -#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 +#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 +#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:937 netbox/dcim/forms/bulk_import.py:1381 -#: netbox/dcim/forms/filtersets.py:1180 netbox/templates/dcim/powerfeed.html:83 +#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 +#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:943 netbox/dcim/forms/bulk_import.py:1386 -#: netbox/dcim/forms/filtersets.py:1185 netbox/templates/dcim/powerfeed.html:95 +#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 +#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:949 netbox/dcim/forms/filtersets.py:1190 -#: netbox/templates/dcim/powerfeed.html:87 +#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 +#: templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:953 netbox/dcim/forms/filtersets.py:1194 -#: netbox/templates/dcim/powerfeed.html:91 +#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 +#: templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:957 netbox/dcim/forms/filtersets.py:1198 +#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1046 +#: dcim/forms/bulk_edit.py:1046 msgid "Maximum draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1049 -#: netbox/dcim/models/device_component_templates.py:282 -#: netbox/dcim/models/device_components.py:356 +#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 +#: dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1052 +#: dcim/forms/bulk_edit.py:1052 msgid "Allocated draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1055 -#: netbox/dcim/models/device_component_templates.py:289 -#: netbox/dcim/models/device_components.py:363 +#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 +#: dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1088 netbox/dcim/forms/bulk_import.py:786 -#: netbox/dcim/forms/model_forms.py:953 netbox/dcim/forms/model_forms.py:1278 -#: netbox/dcim/forms/model_forms.py:1567 netbox/dcim/forms/object_import.py:55 +#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 +#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 +#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 msgid "Power port" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:793 +#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 msgid "Feed leg" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1139 netbox/dcim/forms/bulk_edit.py:1457 +#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 msgid "Management only" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1149 netbox/dcim/forms/bulk_edit.py:1463 -#: netbox/dcim/forms/bulk_import.py:876 netbox/dcim/forms/filtersets.py:1394 -#: netbox/dcim/forms/object_import.py:90 -#: netbox/dcim/models/device_component_templates.py:437 -#: netbox/dcim/models/device_components.py:670 +#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 +#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 +#: dcim/forms/object_import.py:90 dcim/models/device_component_templates.py:437 +#: dcim/models/device_components.py:670 msgid "PoE mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1155 netbox/dcim/forms/bulk_edit.py:1469 -#: netbox/dcim/forms/bulk_import.py:882 netbox/dcim/forms/filtersets.py:1399 -#: netbox/dcim/forms/object_import.py:95 -#: netbox/dcim/models/device_component_templates.py:443 -#: netbox/dcim/models/device_components.py:676 +#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 +#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 +#: dcim/forms/object_import.py:95 dcim/models/device_component_templates.py:443 +#: dcim/models/device_components.py:676 msgid "PoE type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1161 netbox/dcim/forms/filtersets.py:1404 -#: netbox/dcim/forms/object_import.py:100 +#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 +#: dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1298 netbox/dcim/forms/model_forms.py:669 -#: netbox/dcim/forms/model_forms.py:1223 netbox/dcim/tables/devices.py:313 -#: netbox/templates/dcim/consoleport.html:24 -#: netbox/templates/dcim/consoleserverport.html:24 -#: netbox/templates/dcim/frontport.html:24 -#: netbox/templates/dcim/interface.html:34 netbox/templates/dcim/module.html:54 -#: netbox/templates/dcim/modulebay.html:26 -#: netbox/templates/dcim/modulebay.html:58 -#: netbox/templates/dcim/poweroutlet.html:24 -#: netbox/templates/dcim/powerport.html:24 -#: netbox/templates/dcim/rearport.html:24 +#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 +#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 +#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 +#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 +#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 +#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 +#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 msgid "Module" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1437 netbox/dcim/tables/devices.py:665 -#: netbox/templates/dcim/interface.html:110 +#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 +#: templates/dcim/interface.html:110 msgid "LAG" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/forms/model_forms.py:1305 +#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 msgid "Virtual device contexts" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1448 netbox/dcim/forms/bulk_import.py:714 -#: netbox/dcim/forms/bulk_import.py:740 netbox/dcim/forms/filtersets.py:1252 -#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 -#: netbox/dcim/tables/devices.py:610 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 -#: netbox/templates/dcim/consoleport.html:40 -#: netbox/templates/dcim/consoleserverport.html:40 +#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 +#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 +#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 +#: dcim/tables/devices.py:610 +#: templates/circuits/inc/circuit_termination_fields.html:67 +#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_import.py:885 -#: netbox/templates/vpn/ikepolicy.html:25 -#: netbox/templates/vpn/ipsecprofile.html:21 -#: netbox/templates/vpn/ipsecprofile.html:48 -#: netbox/virtualization/forms/bulk_edit.py:233 -#: netbox/virtualization/forms/bulk_import.py:165 -#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 -#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 -#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 -#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 -#: netbox/vpn/tables/crypto.py:162 +#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 +#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 +#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 +#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 +#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 +#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 +#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 +#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 msgid "Mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1485 netbox/dcim/forms/model_forms.py:1354 -#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 -#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 -#: netbox/virtualization/forms/model_forms.py:321 +#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 +#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 +#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 +#: virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1494 netbox/dcim/forms/model_forms.py:1360 -#: netbox/dcim/tables/devices.py:579 -#: netbox/virtualization/forms/bulk_edit.py:248 -#: netbox/virtualization/forms/model_forms.py:326 +#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 +#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 +#: virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1503 netbox/dcim/forms/model_forms.py:1369 -#: netbox/dcim/tables/devices.py:585 -#: netbox/virtualization/forms/bulk_edit.py:256 -#: netbox/virtualization/forms/model_forms.py:335 +#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 +#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 +#: virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1506 +#: dcim/forms/bulk_edit.py:1506 msgid "Add tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1515 +#: dcim/forms/bulk_edit.py:1515 msgid "Remove tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1531 netbox/dcim/forms/model_forms.py:1341 +#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 msgid "Wireless LAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1346 -#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 -#: netbox/templates/dcim/interface.html:280 -#: netbox/wireless/tables/wirelesslan.py:24 +#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 +#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 +#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1545 netbox/dcim/forms/filtersets.py:1328 -#: netbox/dcim/forms/model_forms.py:1390 netbox/ipam/forms/bulk_edit.py:286 -#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 -#: netbox/templates/dcim/interface.html:122 -#: netbox/templates/ipam/prefix.html:95 -#: netbox/virtualization/forms/model_forms.py:349 +#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 +#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 +#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 +#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 +#: virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1546 netbox/dcim/forms/filtersets.py:720 -#: netbox/dcim/forms/model_forms.py:1391 -#: netbox/virtualization/forms/model_forms.py:350 +#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 +#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1547 netbox/dcim/forms/filtersets.py:1329 -#: netbox/dcim/forms/model_forms.py:987 netbox/dcim/forms/model_forms.py:1393 +#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 +#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 msgid "PoE" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1548 netbox/dcim/forms/model_forms.py:1392 -#: netbox/templates/dcim/interface.html:99 -#: netbox/virtualization/forms/bulk_edit.py:267 -#: netbox/virtualization/forms/model_forms.py:351 +#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 +#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 +#: virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1549 netbox/dcim/forms/model_forms.py:1394 -#: netbox/virtualization/forms/bulk_edit.py:268 -#: netbox/virtualization/forms/model_forms.py:352 +#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 +#: virtualization/forms/bulk_edit.py:268 +#: virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1553 +#: dcim/forms/bulk_edit.py:1553 msgid "Add/Remove" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1612 netbox/dcim/forms/bulk_edit.py:1614 +#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 msgid "Interface mode must be specified to assign VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1619 netbox/dcim/forms/common.py:50 +#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" -#: netbox/dcim/forms/bulk_import.py:64 +#: dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "" -#: netbox/dcim/forms/bulk_import.py:78 +#: dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "" -#: netbox/dcim/forms/bulk_import.py:97 +#: dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "" -#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 -#: netbox/tenancy/forms/bulk_import.py:85 -#: netbox/wireless/forms/bulk_import.py:40 +#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 +#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "" -#: netbox/dcim/forms/bulk_import.py:123 +#: dcim/forms/bulk_import.py:123 msgid "available options" msgstr "" -#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:543 -#: netbox/dcim/forms/bulk_import.py:1342 netbox/ipam/forms/bulk_import.py:175 -#: netbox/ipam/forms/bulk_import.py:433 -#: netbox/virtualization/forms/bulk_import.py:63 -#: netbox/virtualization/forms/bulk_import.py:89 +#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 +#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 +#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 +#: virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:141 +#: dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "" -#: netbox/dcim/forms/bulk_import.py:143 +#: dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "" -#: netbox/dcim/forms/bulk_import.py:185 +#: dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:196 +#: dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "" -#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:268 +#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 msgid "Rail-to-rail width (in inches)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:274 +#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 msgid "Unit for outer dimensions" msgstr "" -#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:286 +#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 msgid "Unit for rack weights" msgstr "" -#: netbox/dcim/forms/bulk_import.py:245 +#: dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "" -#: netbox/dcim/forms/bulk_import.py:257 +#: dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:280 netbox/dcim/forms/bulk_import.py:413 -#: netbox/dcim/forms/bulk_import.py:583 +#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 +#: dcim/forms/bulk_import.py:583 msgid "Airflow direction" msgstr "" -#: netbox/dcim/forms/bulk_import.py:312 +#: dcim/forms/bulk_import.py:312 msgid "Parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:319 netbox/dcim/forms/bulk_import.py:1355 +#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 msgid "Rack's location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:328 netbox/dcim/forms/model_forms.py:311 -#: netbox/dcim/tables/racks.py:222 -#: netbox/templates/dcim/rackreservation.html:12 -#: netbox/templates/dcim/rackreservation.html:45 +#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 +#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 +#: templates/dcim/rackreservation.html:45 msgid "Units" msgstr "" -#: netbox/dcim/forms/bulk_import.py:331 +#: dcim/forms/bulk_import.py:331 msgid "Comma-separated list of individual unit numbers" msgstr "" -#: netbox/dcim/forms/bulk_import.py:374 +#: dcim/forms/bulk_import.py:374 msgid "The manufacturer which produces this device type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:381 +#: dcim/forms/bulk_import.py:381 msgid "The default platform for devices of this type (optional)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:386 +#: dcim/forms/bulk_import.py:386 msgid "Device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:392 +#: dcim/forms/bulk_import.py:392 msgid "Unit for device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:418 +#: dcim/forms/bulk_import.py:418 msgid "Module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:424 +#: dcim/forms/bulk_import.py:424 msgid "Unit for module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:454 +#: dcim/forms/bulk_import.py:454 msgid "Limit platform assignments to this manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:476 netbox/dcim/forms/bulk_import.py:1425 -#: netbox/tenancy/forms/bulk_import.py:106 +#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 +#: tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:489 +#: dcim/forms/bulk_import.py:489 msgid "Device type manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:495 +#: dcim/forms/bulk_import.py:495 msgid "Device type model" msgstr "" -#: netbox/dcim/forms/bulk_import.py:502 -#: netbox/virtualization/forms/bulk_import.py:126 +#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "" -#: netbox/dcim/forms/bulk_import.py:510 netbox/dcim/forms/bulk_import.py:514 -#: netbox/dcim/forms/model_forms.py:536 +#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 +#: dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "" -#: netbox/dcim/forms/bulk_import.py:521 +#: dcim/forms/bulk_import.py:521 msgid "Virtualization cluster" msgstr "" -#: netbox/dcim/forms/bulk_import.py:550 +#: dcim/forms/bulk_import.py:550 msgid "Assigned location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:557 +#: dcim/forms/bulk_import.py:557 msgid "Assigned rack (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:560 +#: dcim/forms/bulk_import.py:560 msgid "Face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:563 +#: dcim/forms/bulk_import.py:563 msgid "Mounted rack face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:570 +#: dcim/forms/bulk_import.py:570 msgid "Parent device (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:573 +#: dcim/forms/bulk_import.py:573 msgid "Device bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:577 +#: dcim/forms/bulk_import.py:577 msgid "Device bay in which this device is installed (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:644 +#: dcim/forms/bulk_import.py:644 msgid "The device in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:647 netbox/dcim/forms/model_forms.py:640 +#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:650 +#: dcim/forms/bulk_import.py:650 msgid "The module bay in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:656 +#: dcim/forms/bulk_import.py:656 msgid "The type of module" msgstr "" -#: netbox/dcim/forms/bulk_import.py:664 netbox/dcim/forms/model_forms.py:656 +#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:666 +#: dcim/forms/bulk_import.py:666 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:662 +#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:671 netbox/dcim/forms/model_forms.py:665 +#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:711 netbox/dcim/forms/bulk_import.py:737 -#: netbox/dcim/forms/bulk_import.py:763 +#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 +#: dcim/forms/bulk_import.py:763 msgid "Port type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:719 netbox/dcim/forms/bulk_import.py:745 +#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 msgid "Port speed in bps" msgstr "" -#: netbox/dcim/forms/bulk_import.py:783 +#: dcim/forms/bulk_import.py:783 msgid "Outlet type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:790 +#: dcim/forms/bulk_import.py:790 msgid "Local power port which feeds this outlet" msgstr "" -#: netbox/dcim/forms/bulk_import.py:796 +#: dcim/forms/bulk_import.py:796 msgid "Electrical phase (for three-phase circuits)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:837 netbox/dcim/forms/model_forms.py:1316 -#: netbox/virtualization/forms/bulk_import.py:155 -#: netbox/virtualization/forms/model_forms.py:305 +#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 +#: virtualization/forms/bulk_import.py:155 +#: virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:844 netbox/dcim/forms/model_forms.py:1324 -#: netbox/virtualization/forms/bulk_import.py:162 -#: netbox/virtualization/forms/model_forms.py:313 +#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 +#: virtualization/forms/bulk_import.py:162 +#: virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:847 +#: dcim/forms/bulk_import.py:847 msgid "Lag" msgstr "" -#: netbox/dcim/forms/bulk_import.py:851 +#: dcim/forms/bulk_import.py:851 msgid "Parent LAG interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:854 +#: dcim/forms/bulk_import.py:854 msgid "Vdcs" msgstr "" -#: netbox/dcim/forms/bulk_import.py:859 +#: dcim/forms/bulk_import.py:859 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" -#: netbox/dcim/forms/bulk_import.py:865 +#: dcim/forms/bulk_import.py:865 msgid "Physical medium" msgstr "" -#: netbox/dcim/forms/bulk_import.py:868 netbox/dcim/forms/filtersets.py:1365 +#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "" -#: netbox/dcim/forms/bulk_import.py:873 +#: dcim/forms/bulk_import.py:873 msgid "Poe mode" msgstr "" -#: netbox/dcim/forms/bulk_import.py:879 +#: dcim/forms/bulk_import.py:879 msgid "Poe type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:888 -#: netbox/virtualization/forms/bulk_import.py:168 +#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:895 netbox/ipam/forms/bulk_import.py:161 -#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 -#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 -#: netbox/ipam/forms/filtersets.py:336 -#: netbox/virtualization/forms/bulk_import.py:175 +#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 +#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 +#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 +#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "" -#: netbox/dcim/forms/bulk_import.py:898 +#: dcim/forms/bulk_import.py:898 msgid "Rf role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:901 +#: dcim/forms/bulk_import.py:901 msgid "Wireless role (AP/station)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:937 +#: dcim/forms/bulk_import.py:937 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:951 netbox/dcim/forms/model_forms.py:1000 -#: netbox/dcim/forms/model_forms.py:1575 netbox/dcim/forms/object_import.py:117 +#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 +#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 msgid "Rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:954 +#: dcim/forms/bulk_import.py:954 msgid "Corresponding rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:959 netbox/dcim/forms/bulk_import.py:1000 -#: netbox/dcim/forms/bulk_import.py:1216 +#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 +#: dcim/forms/bulk_import.py:1216 msgid "Physical medium classification" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1028 netbox/dcim/tables/devices.py:822 +#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 msgid "Installed device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1032 +#: dcim/forms/bulk_import.py:1032 msgid "Child device installed within this bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1034 +#: dcim/forms/bulk_import.py:1034 msgid "Child device not found." msgstr "" -#: netbox/dcim/forms/bulk_import.py:1092 +#: dcim/forms/bulk_import.py:1092 msgid "Parent inventory item" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1095 +#: dcim/forms/bulk_import.py:1095 msgid "Component type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1099 +#: dcim/forms/bulk_import.py:1099 msgid "Component Type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1102 +#: dcim/forms/bulk_import.py:1102 msgid "Compnent name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1104 +#: dcim/forms/bulk_import.py:1104 msgid "Component Name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1146 +#: dcim/forms/bulk_import.py:1146 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1171 +#: dcim/forms/bulk_import.py:1171 msgid "Side A device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1174 netbox/dcim/forms/bulk_import.py:1192 +#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 msgid "Device name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1177 +#: dcim/forms/bulk_import.py:1177 msgid "Side A type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1180 netbox/dcim/forms/bulk_import.py:1198 +#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 msgid "Termination type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1183 +#: dcim/forms/bulk_import.py:1183 msgid "Side A name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1184 netbox/dcim/forms/bulk_import.py:1202 +#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 msgid "Termination name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1189 +#: dcim/forms/bulk_import.py:1189 msgid "Side B device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1195 +#: dcim/forms/bulk_import.py:1195 msgid "Side B type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1201 +#: dcim/forms/bulk_import.py:1201 msgid "Side B name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1210 -#: netbox/wireless/forms/bulk_import.py:86 +#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1262 +#: dcim/forms/bulk_import.py:1262 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1268 +#: dcim/forms/bulk_import.py:1268 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1293 netbox/dcim/forms/model_forms.py:785 -#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 -#: netbox/templates/dcim/virtualchassis.html:27 -#: netbox/templates/dcim/virtualchassis.html:67 +#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 +#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 +#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1297 +#: dcim/forms/bulk_import.py:1297 msgid "Master device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1314 +#: dcim/forms/bulk_import.py:1314 msgid "Name of parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1348 +#: dcim/forms/bulk_import.py:1348 msgid "Upstream power panel" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1378 +#: dcim/forms/bulk_import.py:1378 msgid "Primary or redundant" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1383 +#: dcim/forms/bulk_import.py:1383 msgid "Supply type (AC/DC)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1388 +#: dcim/forms/bulk_import.py:1388 msgid "Single or three-phase" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1439 netbox/dcim/forms/model_forms.py:1670 -#: netbox/templates/dcim/device.html:190 -#: netbox/templates/dcim/virtualdevicecontext.html:30 -#: netbox/templates/virtualization/virtualmachine.html:52 +#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 +#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 +#: templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1443 +#: dcim/forms/bulk_import.py:1443 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1446 netbox/dcim/forms/model_forms.py:1679 -#: netbox/templates/dcim/device.html:206 -#: netbox/templates/dcim/virtualdevicecontext.html:41 -#: netbox/templates/virtualization/virtualmachine.html:68 +#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 +#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 +#: templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1450 +#: dcim/forms/bulk_import.py:1450 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "" -#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 -#: netbox/templates/dcim/interface.html:57 -#: netbox/templates/virtualization/vminterface.html:55 -#: netbox/virtualization/forms/bulk_edit.py:225 +#: dcim/forms/common.py:24 dcim/models/device_components.py:527 +#: templates/dcim/interface.html:57 +#: templates/virtualization/vminterface.html:55 +#: virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "" -#: netbox/dcim/forms/common.py:65 +#: dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" msgstr "" -#: netbox/dcim/forms/common.py:126 +#: dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." msgstr "" -#: netbox/dcim/forms/common.py:131 +#: dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " "in tree but {tokens} placeholders given." msgstr "" -#: netbox/dcim/forms/common.py:144 +#: dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" -#: netbox/dcim/forms/common.py:153 +#: dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "" -#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 -#: netbox/dcim/tables/power.py:66 -#: netbox/templates/dcim/inc/cable_termination.html:37 -#: netbox/templates/dcim/powerfeed.html:24 -#: netbox/templates/dcim/powerpanel.html:19 -#: netbox/templates/dcim/trace/powerpanel.html:4 +#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 +#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 +#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 +#: templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "" -#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 -#: netbox/templates/dcim/powerfeed.html:21 -#: netbox/templates/dcim/powerport.html:80 +#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 +#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "" -#: netbox/dcim/forms/connections.py:81 +#: dcim/forms/connections.py:81 msgid "Side" msgstr "" -#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 +#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 msgid "Device Status" msgstr "" -#: netbox/dcim/forms/filtersets.py:149 +#: dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "" -#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 -#: netbox/tenancy/forms/bulk_import.py:62 netbox/tenancy/forms/filtersets.py:33 -#: netbox/tenancy/forms/filtersets.py:62 -#: netbox/wireless/forms/bulk_import.py:25 -#: netbox/wireless/forms/filtersets.py:25 +#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 +#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 +#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 +#: wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "" -#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 -#: netbox/templates/dcim/site.html:56 +#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 +#: templates/dcim/site.html:56 msgid "Facility" msgstr "" -#: netbox/dcim/forms/filtersets.py:380 +#: dcim/forms/filtersets.py:380 msgid "Rack type" msgstr "" -#: netbox/dcim/forms/filtersets.py:397 +#: dcim/forms/filtersets.py:397 msgid "Function" msgstr "" -#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 -#: netbox/templates/inc/panels/image_attachments.html:6 +#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 +#: templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "" -#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 -#: netbox/dcim/forms/filtersets.py:726 +#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 +#: dcim/forms/filtersets.py:726 msgid "Components" msgstr "" -#: netbox/dcim/forms/filtersets.py:506 +#: dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "" -#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 -#: netbox/templates/dcim/racktype.html:20 +#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 +#: templates/dcim/racktype.html:20 msgid "Model" msgstr "" -#: netbox/dcim/forms/filtersets.py:834 +#: dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "" -#: netbox/dcim/forms/filtersets.py:841 +#: dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "" -#: netbox/dcim/forms/filtersets.py:890 +#: dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "" -#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 -#: netbox/ipam/forms/filtersets.py:452 -#: netbox/virtualization/forms/filtersets.py:112 +#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 +#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "" -#: netbox/dcim/forms/filtersets.py:1210 +#: dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "" -#: netbox/dcim/forms/filtersets.py:1217 +#: dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "" -#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 -#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 -#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 -#: netbox/templates/dcim/consoleport.html:55 -#: netbox/templates/dcim/consoleserverport.html:55 -#: netbox/templates/dcim/frontport.html:69 -#: netbox/templates/dcim/interface.html:140 -#: netbox/templates/dcim/powerfeed.html:110 -#: netbox/templates/dcim/poweroutlet.html:59 -#: netbox/templates/dcim/powerport.html:59 -#: netbox/templates/dcim/rearport.html:65 +#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 +#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 +#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 +#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 +#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 +#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 +#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 msgid "Connection" msgstr "" -#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 -#: netbox/extras/forms/bulk_import.py:247 netbox/extras/forms/filtersets.py:464 -#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 -#: netbox/templates/extras/journalentry.html:30 +#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 +#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 +#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 +#: templates/extras/journalentry.html:30 msgid "Kind" msgstr "" -#: netbox/dcim/forms/filtersets.py:1377 +#: dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "" -#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1383 -#: netbox/dcim/models/device_components.py:629 -#: netbox/templates/dcim/interface.html:129 +#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 +#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 msgid "WWN" msgstr "" -#: netbox/dcim/forms/filtersets.py:1409 +#: dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "" -#: netbox/dcim/forms/filtersets.py:1413 +#: dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1417 +#: dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1421 netbox/templates/dcim/interface.html:85 +#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 -#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 -#: netbox/templates/dcim/cable_trace.html:46 -#: netbox/templates/dcim/frontport.html:77 -#: netbox/templates/dcim/htmx/cable_edit.html:50 -#: netbox/templates/dcim/inc/connection_endpoints.html:4 -#: netbox/templates/dcim/rearport.html:73 -#: netbox/templates/dcim/trace/cable.html:7 +#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 +#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 +#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 +#: templates/dcim/htmx/cable_edit.html:50 +#: templates/dcim/inc/connection_endpoints.html:4 +#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "" -#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 +#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 msgid "Discovered" msgstr "" -#: netbox/dcim/forms/formsets.py:20 +#: dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "" -#: netbox/dcim/forms/model_forms.py:140 +#: dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "" -#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 +#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "" -#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 -#: netbox/dcim/forms/model_forms.py:446 -#: netbox/utilities/forms/fields/fields.py:47 +#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 +#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "" -#: netbox/dcim/forms/model_forms.py:259 +#: dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" -#: netbox/dcim/forms/model_forms.py:265 +#: dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "" -#: netbox/dcim/forms/model_forms.py:313 +#: dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." msgstr "" -#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 +#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 msgid "Reservation" msgstr "" -#: netbox/dcim/forms/model_forms.py:423 -#: netbox/templates/dcim/devicerole.html:23 +#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "" -#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 +#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "" -#: netbox/dcim/forms/model_forms.py:547 +#: dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" -#: netbox/dcim/forms/model_forms.py:552 +#: dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "" -#: netbox/dcim/forms/model_forms.py:659 +#: dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" -#: netbox/dcim/forms/model_forms.py:767 +#: dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "" -#: netbox/dcim/forms/model_forms.py:1087 +#: dcim/forms/model_forms.py:1087 msgid "Console port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1095 +#: dcim/forms/model_forms.py:1095 msgid "Console server port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1103 +#: dcim/forms/model_forms.py:1103 msgid "Front port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1111 +#: dcim/forms/model_forms.py:1111 msgid "Interface template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1119 +#: dcim/forms/model_forms.py:1119 msgid "Power outlet template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1127 +#: dcim/forms/model_forms.py:1127 msgid "Power port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1135 +#: dcim/forms/model_forms.py:1135 msgid "Rear port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1144 netbox/dcim/forms/model_forms.py:1388 -#: netbox/dcim/forms/model_forms.py:1551 netbox/dcim/forms/model_forms.py:1583 -#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 -#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 -#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 -#: netbox/ipam/tables/vlans.py:169 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 -#: netbox/templates/dcim/frontport.html:106 -#: netbox/templates/dcim/interface.html:27 -#: netbox/templates/dcim/interface.html:184 -#: netbox/templates/dcim/interface.html:310 -#: netbox/templates/dcim/rearport.html:102 -#: netbox/templates/virtualization/vminterface.html:18 -#: netbox/templates/vpn/tunneltermination.html:31 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 -#: netbox/templates/wireless/wirelesslink.html:10 -#: netbox/templates/wireless/wirelesslink.html:55 -#: netbox/virtualization/forms/model_forms.py:348 -#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 -#: netbox/vpn/forms/model_forms.py:445 netbox/wireless/forms/model_forms.py:113 -#: netbox/wireless/forms/model_forms.py:155 +#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 +#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 +#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 +#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 +#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 +#: templates/circuits/inc/circuit_termination_fields.html:51 +#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 +#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 +#: templates/dcim/rearport.html:102 +#: templates/virtualization/vminterface.html:18 +#: templates/vpn/tunneltermination.html:31 +#: templates/wireless/inc/wirelesslink_interface.html:10 +#: templates/wireless/wirelesslink.html:10 +#: templates/wireless/wirelesslink.html:55 +#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 +#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 +#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 msgid "Interface" msgstr "" -#: netbox/dcim/forms/model_forms.py:1145 netbox/dcim/forms/model_forms.py:1584 -#: netbox/dcim/tables/connections.py:27 -#: netbox/templates/dcim/consoleport.html:17 -#: netbox/templates/dcim/consoleserverport.html:74 -#: netbox/templates/dcim/frontport.html:112 +#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 +#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 +#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 msgid "Console Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1146 netbox/dcim/forms/model_forms.py:1585 -#: netbox/templates/dcim/consoleport.html:73 -#: netbox/templates/dcim/consoleserverport.html:17 -#: netbox/templates/dcim/frontport.html:109 +#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 +#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 +#: templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1147 netbox/dcim/forms/model_forms.py:1586 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 -#: netbox/templates/dcim/consoleport.html:76 -#: netbox/templates/dcim/consoleserverport.html:77 -#: netbox/templates/dcim/frontport.html:17 -#: netbox/templates/dcim/frontport.html:115 -#: netbox/templates/dcim/interface.html:187 -#: netbox/templates/dcim/rearport.html:105 +#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 +#: templates/circuits/inc/circuit_termination_fields.html:52 +#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 +#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 +#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 msgid "Front Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1148 netbox/dcim/forms/model_forms.py:1587 -#: netbox/dcim/tables/devices.py:710 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 -#: netbox/templates/dcim/consoleport.html:79 -#: netbox/templates/dcim/consoleserverport.html:80 -#: netbox/templates/dcim/frontport.html:50 -#: netbox/templates/dcim/frontport.html:118 -#: netbox/templates/dcim/interface.html:190 -#: netbox/templates/dcim/rearport.html:17 -#: netbox/templates/dcim/rearport.html:108 +#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 +#: dcim/tables/devices.py:710 +#: templates/circuits/inc/circuit_termination_fields.html:53 +#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 +#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 +#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 +#: templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1149 netbox/dcim/forms/model_forms.py:1588 -#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 -#: netbox/templates/dcim/poweroutlet.html:44 -#: netbox/templates/dcim/powerport.html:17 +#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 +#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 +#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 msgid "Power Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1150 netbox/dcim/forms/model_forms.py:1589 -#: netbox/templates/dcim/poweroutlet.html:17 -#: netbox/templates/dcim/powerport.html:77 +#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 +#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "" -#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 msgid "Component Assignment" msgstr "" -#: netbox/dcim/forms/model_forms.py:1195 netbox/dcim/forms/model_forms.py:1638 +#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 msgid "An InventoryItem can only be assigned to a single component." msgstr "" -#: netbox/dcim/forms/model_forms.py:1332 +#: dcim/forms/model_forms.py:1332 msgid "LAG interface" msgstr "" -#: netbox/dcim/forms/model_forms.py:1355 +#: dcim/forms/model_forms.py:1355 msgid "Filter VLANs available for assignment by group." msgstr "" -#: netbox/dcim/forms/model_forms.py:1484 +#: dcim/forms/model_forms.py:1484 msgid "Child Device" msgstr "" -#: netbox/dcim/forms/model_forms.py:1485 +#: dcim/forms/model_forms.py:1485 msgid "" "Child devices must first be created and assigned to the site and rack of the " "parent device." msgstr "" -#: netbox/dcim/forms/model_forms.py:1527 +#: dcim/forms/model_forms.py:1527 msgid "Console port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1535 +#: dcim/forms/model_forms.py:1535 msgid "Console server port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1543 +#: dcim/forms/model_forms.py:1543 msgid "Front port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1559 +#: dcim/forms/model_forms.py:1559 msgid "Power outlet" msgstr "" -#: netbox/dcim/forms/model_forms.py:1579 -#: netbox/templates/dcim/inventoryitem.html:17 +#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "" -#: netbox/dcim/forms/model_forms.py:1652 -#: netbox/templates/dcim/inventoryitemrole.html:15 +#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "" -#: netbox/dcim/forms/object_create.py:48 netbox/dcim/forms/object_create.py:199 -#: netbox/dcim/forms/object_create.py:355 +#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 +#: dcim/forms/object_create.py:355 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" msgstr "" -#: netbox/dcim/forms/object_create.py:68 +#: dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are " "expected." msgstr "" -#: netbox/dcim/forms/object_create.py:110 -#: netbox/dcim/forms/object_create.py:271 netbox/dcim/tables/devices.py:252 +#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 +#: dcim/tables/devices.py:252 msgid "Rear ports" msgstr "" -#: netbox/dcim/forms/object_create.py:111 -#: netbox/dcim/forms/object_create.py:272 +#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 msgid "Select one rear port assignment for each front port being created." msgstr "" -#: netbox/dcim/forms/object_create.py:164 +#: dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " "match the selected number of rear port positions ({rearport_count})." msgstr "" -#: netbox/dcim/forms/object_create.py:251 +#: dcim/forms/object_create.py:251 #, python-brace-format msgid "" "The string {module} will be replaced with the position of the " "assigned module, if any." msgstr "" -#: netbox/dcim/forms/object_create.py:320 +#: dcim/forms/object_create.py:320 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " "selected number of rear port positions ({rearport_count})." msgstr "" -#: netbox/dcim/forms/object_create.py:409 netbox/dcim/tables/devices.py:1033 -#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 -#: netbox/templates/dcim/virtualchassis_edit.html:47 -#: netbox/templates/ipam/fhrpgroup.html:38 +#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 +#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 +#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "" -#: netbox/dcim/forms/object_create.py:418 +#: dcim/forms/object_create.py:418 msgid "Initial position" msgstr "" -#: netbox/dcim/forms/object_create.py:421 +#: dcim/forms/object_create.py:421 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "" -#: netbox/dcim/forms/object_create.py:435 +#: dcim/forms/object_create.py:435 msgid "A position must be specified for the first VC member." msgstr "" -#: netbox/dcim/models/cables.py:62 -#: netbox/dcim/models/device_component_templates.py:55 -#: netbox/dcim/models/device_components.py:62 -#: netbox/extras/models/customfields.py:111 +#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 +#: dcim/models/device_components.py:62 extras/models/customfields.py:111 msgid "label" msgstr "" -#: netbox/dcim/models/cables.py:71 +#: dcim/models/cables.py:71 msgid "length" msgstr "" -#: netbox/dcim/models/cables.py:78 +#: dcim/models/cables.py:78 msgid "length unit" msgstr "" -#: netbox/dcim/models/cables.py:95 +#: dcim/models/cables.py:95 msgid "cable" msgstr "" -#: netbox/dcim/models/cables.py:96 +#: dcim/models/cables.py:96 msgid "cables" msgstr "" -#: netbox/dcim/models/cables.py:165 +#: dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "" -#: netbox/dcim/models/cables.py:168 +#: dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" -#: netbox/dcim/models/cables.py:175 +#: dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" -#: netbox/dcim/models/cables.py:183 +#: dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "" -#: netbox/dcim/models/cables.py:193 +#: dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "" -#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 +#: dcim/models/cables.py:260 ipam/models/asns.py:37 msgid "end" msgstr "" -#: netbox/dcim/models/cables.py:313 +#: dcim/models/cables.py:313 msgid "cable termination" msgstr "" -#: netbox/dcim/models/cables.py:314 +#: dcim/models/cables.py:314 msgid "cable terminations" msgstr "" -#: netbox/dcim/models/cables.py:333 +#: dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " "{cable_pk}" msgstr "" -#: netbox/dcim/models/cables.py:343 +#: dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "" -#: netbox/dcim/models/cables.py:350 +#: dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" -#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 +#: dcim/models/cables.py:448 extras/models/configs.py:50 msgid "is active" msgstr "" -#: netbox/dcim/models/cables.py:452 +#: dcim/models/cables.py:452 msgid "is complete" msgstr "" -#: netbox/dcim/models/cables.py:456 +#: dcim/models/cables.py:456 msgid "is split" msgstr "" -#: netbox/dcim/models/cables.py:464 +#: dcim/models/cables.py:464 msgid "cable path" msgstr "" -#: netbox/dcim/models/cables.py:465 +#: dcim/models/cables.py:465 msgid "cable paths" msgstr "" -#: netbox/dcim/models/device_component_templates.py:46 +#: dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " "attached to a module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:58 -#: netbox/dcim/models/device_components.py:65 +#: dcim/models/device_component_templates.py:58 +#: dcim/models/device_components.py:65 msgid "Physical label" msgstr "" -#: netbox/dcim/models/device_component_templates.py:103 +#: dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:154 +#: dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:158 +#: dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:212 +#: dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:213 +#: dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:246 +#: dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:247 +#: dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:278 -#: netbox/dcim/models/device_components.py:352 +#: dcim/models/device_component_templates.py:278 +#: dcim/models/device_components.py:352 msgid "maximum draw" msgstr "" -#: netbox/dcim/models/device_component_templates.py:285 -#: netbox/dcim/models/device_components.py:359 +#: dcim/models/device_component_templates.py:285 +#: dcim/models/device_components.py:359 msgid "allocated draw" msgstr "" -#: netbox/dcim/models/device_component_templates.py:295 +#: dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:296 +#: dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:315 -#: netbox/dcim/models/device_components.py:382 +#: dcim/models/device_component_templates.py:315 +#: dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" -#: netbox/dcim/models/device_component_templates.py:347 -#: netbox/dcim/models/device_components.py:477 +#: dcim/models/device_component_templates.py:347 +#: dcim/models/device_components.py:477 msgid "feed leg" msgstr "" -#: netbox/dcim/models/device_component_templates.py:351 -#: netbox/dcim/models/device_components.py:481 +#: dcim/models/device_component_templates.py:351 +#: dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "" -#: netbox/dcim/models/device_component_templates.py:357 +#: dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:358 +#: dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:367 +#: dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:371 +#: dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:423 -#: netbox/dcim/models/device_components.py:611 +#: dcim/models/device_component_templates.py:423 +#: dcim/models/device_components.py:611 msgid "management only" msgstr "" -#: netbox/dcim/models/device_component_templates.py:431 -#: netbox/dcim/models/device_components.py:550 +#: dcim/models/device_component_templates.py:431 +#: dcim/models/device_components.py:550 msgid "bridge interface" msgstr "" -#: netbox/dcim/models/device_component_templates.py:449 -#: netbox/dcim/models/device_components.py:636 +#: dcim/models/device_component_templates.py:449 +#: dcim/models/device_components.py:636 msgid "wireless role" msgstr "" -#: netbox/dcim/models/device_component_templates.py:455 +#: dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:456 +#: dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:463 -#: netbox/dcim/models/device_components.py:804 -#: netbox/virtualization/models/virtualmachines.py:405 +#: dcim/models/device_component_templates.py:463 +#: dcim/models/device_components.py:804 +#: virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "" -#: netbox/dcim/models/device_component_templates.py:466 +#: dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:470 +#: dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:526 -#: netbox/dcim/models/device_components.py:984 +#: dcim/models/device_component_templates.py:526 +#: dcim/models/device_components.py:984 msgid "rear port position" msgstr "" -#: netbox/dcim/models/device_component_templates.py:551 +#: dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:552 +#: dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:562 +#: dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:568 +#: dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " "positions" msgstr "" -#: netbox/dcim/models/device_component_templates.py:621 -#: netbox/dcim/models/device_components.py:1053 +#: dcim/models/device_component_templates.py:621 +#: dcim/models/device_components.py:1053 msgid "positions" msgstr "" -#: netbox/dcim/models/device_component_templates.py:632 +#: dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:633 +#: dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:662 -#: netbox/dcim/models/device_components.py:1103 +#: dcim/models/device_component_templates.py:662 +#: dcim/models/device_components.py:1103 msgid "position" msgstr "" -#: netbox/dcim/models/device_component_templates.py:665 -#: netbox/dcim/models/device_components.py:1106 +#: dcim/models/device_component_templates.py:665 +#: dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" -#: netbox/dcim/models/device_component_templates.py:671 +#: dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:672 +#: dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:699 +#: dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:700 +#: dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:713 +#: dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " "allow device bays." msgstr "" -#: netbox/dcim/models/device_component_templates.py:768 -#: netbox/dcim/models/device_components.py:1262 +#: dcim/models/device_component_templates.py:768 +#: dcim/models/device_components.py:1262 msgid "part ID" msgstr "" -#: netbox/dcim/models/device_component_templates.py:770 -#: netbox/dcim/models/device_components.py:1264 +#: dcim/models/device_component_templates.py:770 +#: dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "" -#: netbox/dcim/models/device_component_templates.py:787 +#: dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:788 +#: dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "" -#: netbox/dcim/models/device_components.py:105 +#: dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "" -#: netbox/dcim/models/device_components.py:144 +#: dcim/models/device_components.py:144 msgid "cable end" msgstr "" -#: netbox/dcim/models/device_components.py:150 +#: dcim/models/device_components.py:150 msgid "mark connected" msgstr "" -#: netbox/dcim/models/device_components.py:152 +#: dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "" -#: netbox/dcim/models/device_components.py:170 +#: dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" -#: netbox/dcim/models/device_components.py:174 +#: dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "" -#: netbox/dcim/models/device_components.py:178 +#: dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "" -#: netbox/dcim/models/device_components.py:202 +#: dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "" -#: netbox/dcim/models/device_components.py:287 -#: netbox/dcim/models/device_components.py:316 -#: netbox/dcim/models/device_components.py:349 -#: netbox/dcim/models/device_components.py:467 +#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 +#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 msgid "Physical port type" msgstr "" -#: netbox/dcim/models/device_components.py:290 -#: netbox/dcim/models/device_components.py:319 +#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 msgid "speed" msgstr "" -#: netbox/dcim/models/device_components.py:294 -#: netbox/dcim/models/device_components.py:323 +#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "" -#: netbox/dcim/models/device_components.py:300 +#: dcim/models/device_components.py:300 msgid "console port" msgstr "" -#: netbox/dcim/models/device_components.py:301 +#: dcim/models/device_components.py:301 msgid "console ports" msgstr "" -#: netbox/dcim/models/device_components.py:329 +#: dcim/models/device_components.py:329 msgid "console server port" msgstr "" -#: netbox/dcim/models/device_components.py:330 +#: dcim/models/device_components.py:330 msgid "console server ports" msgstr "" -#: netbox/dcim/models/device_components.py:369 +#: dcim/models/device_components.py:369 msgid "power port" msgstr "" -#: netbox/dcim/models/device_components.py:370 +#: dcim/models/device_components.py:370 msgid "power ports" msgstr "" -#: netbox/dcim/models/device_components.py:487 +#: dcim/models/device_components.py:487 msgid "power outlet" msgstr "" -#: netbox/dcim/models/device_components.py:488 +#: dcim/models/device_components.py:488 msgid "power outlets" msgstr "" -#: netbox/dcim/models/device_components.py:499 +#: dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" -#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 -#: netbox/vpn/models/crypto.py:226 +#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 +#: vpn/models/crypto.py:226 msgid "mode" msgstr "" -#: netbox/dcim/models/device_components.py:534 +#: dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "" -#: netbox/dcim/models/device_components.py:542 +#: dcim/models/device_components.py:542 msgid "parent interface" msgstr "" -#: netbox/dcim/models/device_components.py:602 +#: dcim/models/device_components.py:602 msgid "parent LAG" msgstr "" -#: netbox/dcim/models/device_components.py:612 +#: dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "" -#: netbox/dcim/models/device_components.py:617 +#: dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "" -#: netbox/dcim/models/device_components.py:620 +#: dcim/models/device_components.py:620 msgid "duplex" msgstr "" -#: netbox/dcim/models/device_components.py:630 +#: dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "" -#: netbox/dcim/models/device_components.py:642 +#: dcim/models/device_components.py:642 msgid "wireless channel" msgstr "" -#: netbox/dcim/models/device_components.py:649 +#: dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "" -#: netbox/dcim/models/device_components.py:650 -#: netbox/dcim/models/device_components.py:658 +#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "" -#: netbox/dcim/models/device_components.py:664 +#: dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "" -#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 +#: dcim/models/device_components.py:689 wireless/models.py:117 msgid "wireless LANs" msgstr "" -#: netbox/dcim/models/device_components.py:697 -#: netbox/virtualization/models/virtualmachines.py:335 +#: dcim/models/device_components.py:697 +#: virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "" -#: netbox/dcim/models/device_components.py:703 -#: netbox/virtualization/models/virtualmachines.py:341 +#: dcim/models/device_components.py:703 +#: virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "" -#: netbox/dcim/models/device_components.py:745 -#: netbox/virtualization/models/virtualmachines.py:377 +#: dcim/models/device_components.py:745 +#: virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "" -#: netbox/dcim/models/device_components.py:746 -#: netbox/virtualization/models/virtualmachines.py:378 +#: dcim/models/device_components.py:746 +#: virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "" -#: netbox/dcim/models/device_components.py:757 +#: dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "" -#: netbox/dcim/models/device_components.py:765 +#: dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" -#: netbox/dcim/models/device_components.py:774 -#: netbox/virtualization/models/virtualmachines.py:390 +#: dcim/models/device_components.py:774 +#: virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "" -#: netbox/dcim/models/device_components.py:778 +#: dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" -#: netbox/dcim/models/device_components.py:785 +#: dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " "({device})" msgstr "" -#: netbox/dcim/models/device_components.py:791 +#: dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:811 +#: dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "" -#: netbox/dcim/models/device_components.py:817 +#: dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:828 +#: dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" -#: netbox/dcim/models/device_components.py:832 +#: dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "" -#: netbox/dcim/models/device_components.py:839 +#: dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" -#: netbox/dcim/models/device_components.py:845 +#: dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of " "virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:856 +#: dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "" -#: netbox/dcim/models/device_components.py:860 +#: dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "" -#: netbox/dcim/models/device_components.py:866 +#: dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "" -#: netbox/dcim/models/device_components.py:873 +#: dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:875 +#: dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:881 +#: dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:885 +#: dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" -#: netbox/dcim/models/device_components.py:891 +#: dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:893 +#: dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" -#: netbox/dcim/models/device_components.py:901 +#: dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent device, or it must be global." msgstr "" -#: netbox/dcim/models/device_components.py:990 +#: dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "" -#: netbox/dcim/models/device_components.py:1006 +#: dcim/models/device_components.py:1006 msgid "front port" msgstr "" -#: netbox/dcim/models/device_components.py:1007 +#: dcim/models/device_components.py:1007 msgid "front ports" msgstr "" -#: netbox/dcim/models/device_components.py:1021 +#: dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "" -#: netbox/dcim/models/device_components.py:1029 +#: dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only " "{positions} positions." msgstr "" -#: netbox/dcim/models/device_components.py:1059 +#: dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "" -#: netbox/dcim/models/device_components.py:1064 +#: dcim/models/device_components.py:1064 msgid "rear port" msgstr "" -#: netbox/dcim/models/device_components.py:1065 +#: dcim/models/device_components.py:1065 msgid "rear ports" msgstr "" -#: netbox/dcim/models/device_components.py:1079 +#: dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports " "({frontport_count})" msgstr "" -#: netbox/dcim/models/device_components.py:1120 +#: dcim/models/device_components.py:1120 msgid "module bay" msgstr "" -#: netbox/dcim/models/device_components.py:1121 +#: dcim/models/device_components.py:1121 msgid "module bays" msgstr "" -#: netbox/dcim/models/device_components.py:1138 -#: netbox/dcim/models/devices.py:1224 +#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" -#: netbox/dcim/models/device_components.py:1164 +#: dcim/models/device_components.py:1164 msgid "device bay" msgstr "" -#: netbox/dcim/models/device_components.py:1165 +#: dcim/models/device_components.py:1165 msgid "device bays" msgstr "" -#: netbox/dcim/models/device_components.py:1175 +#: dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" -#: netbox/dcim/models/device_components.py:1181 +#: dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "" -#: netbox/dcim/models/device_components.py:1189 +#: dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "" -#: netbox/dcim/models/device_components.py:1210 +#: dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "" -#: netbox/dcim/models/device_components.py:1211 +#: dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "" -#: netbox/dcim/models/device_components.py:1268 -#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 -#: netbox/dcim/models/racks.py:313 -#: netbox/virtualization/models/virtualmachines.py:131 +#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 +#: dcim/models/devices.py:1181 dcim/models/racks.py:313 +#: virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "" -#: netbox/dcim/models/device_components.py:1276 -#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 -#: netbox/dcim/models/racks.py:320 +#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 +#: dcim/models/devices.py:1188 dcim/models/racks.py:320 msgid "asset tag" msgstr "" -#: netbox/dcim/models/device_components.py:1277 +#: dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "" -#: netbox/dcim/models/device_components.py:1280 +#: dcim/models/device_components.py:1280 msgid "discovered" msgstr "" -#: netbox/dcim/models/device_components.py:1282 +#: dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "" -#: netbox/dcim/models/device_components.py:1300 +#: dcim/models/device_components.py:1300 msgid "inventory item" msgstr "" -#: netbox/dcim/models/device_components.py:1301 +#: dcim/models/device_components.py:1301 msgid "inventory items" msgstr "" -#: netbox/dcim/models/device_components.py:1312 +#: dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "" -#: netbox/dcim/models/device_components.py:1320 +#: dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "" -#: netbox/dcim/models/device_components.py:1326 +#: dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "" -#: netbox/dcim/models/device_components.py:1334 +#: dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" -#: netbox/dcim/models/devices.py:54 +#: dcim/models/devices.py:54 msgid "manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:55 +#: dcim/models/devices.py:55 msgid "manufacturers" msgstr "" -#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 -#: netbox/dcim/models/racks.py:133 +#: dcim/models/devices.py:82 dcim/models/devices.py:382 +#: dcim/models/racks.py:133 msgid "model" msgstr "" -#: netbox/dcim/models/devices.py:95 +#: dcim/models/devices.py:95 msgid "default platform" msgstr "" -#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 +#: dcim/models/devices.py:98 dcim/models/devices.py:386 msgid "part number" msgstr "" -#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 +#: dcim/models/devices.py:101 dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "" -#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 +#: dcim/models/devices.py:107 dcim/models/racks.py:54 msgid "height (U)" msgstr "" -#: netbox/dcim/models/devices.py:111 +#: dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "" -#: netbox/dcim/models/devices.py:112 +#: dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" -#: netbox/dcim/models/devices.py:116 +#: dcim/models/devices.py:116 msgid "is full depth" msgstr "" -#: netbox/dcim/models/devices.py:117 +#: dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "" -#: netbox/dcim/models/devices.py:123 +#: dcim/models/devices.py:123 msgid "parent/child status" msgstr "" -#: netbox/dcim/models/devices.py:124 +#: dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." msgstr "" -#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 -#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 +#: dcim/models/devices.py:128 dcim/models/devices.py:392 +#: dcim/models/devices.py:659 dcim/models/racks.py:324 msgid "airflow" msgstr "" -#: netbox/dcim/models/devices.py:204 +#: dcim/models/devices.py:204 msgid "device type" msgstr "" -#: netbox/dcim/models/devices.py:205 +#: dcim/models/devices.py:205 msgid "device types" msgstr "" -#: netbox/dcim/models/devices.py:290 +#: dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "" -#: netbox/dcim/models/devices.py:307 +#: dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate " "a height of {height}U" msgstr "" -#: netbox/dcim/models/devices.py:322 +#: dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " "instances already mounted within racks." msgstr "" -#: netbox/dcim/models/devices.py:331 +#: dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." msgstr "" -#: netbox/dcim/models/devices.py:337 +#: dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "" -#: netbox/dcim/models/devices.py:411 +#: dcim/models/devices.py:411 msgid "module type" msgstr "" -#: netbox/dcim/models/devices.py:412 +#: dcim/models/devices.py:412 msgid "module types" msgstr "" -#: netbox/dcim/models/devices.py:485 +#: dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "" -#: netbox/dcim/models/devices.py:497 +#: dcim/models/devices.py:497 msgid "device role" msgstr "" -#: netbox/dcim/models/devices.py:498 +#: dcim/models/devices.py:498 msgid "device roles" msgstr "" -#: netbox/dcim/models/devices.py:515 +#: dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:527 +#: dcim/models/devices.py:527 msgid "platform" msgstr "" -#: netbox/dcim/models/devices.py:528 +#: dcim/models/devices.py:528 msgid "platforms" msgstr "" -#: netbox/dcim/models/devices.py:576 +#: dcim/models/devices.py:576 msgid "The function this device serves" msgstr "" -#: netbox/dcim/models/devices.py:608 +#: dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 +#: dcim/models/devices.py:616 dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "" -#: netbox/dcim/models/devices.py:643 +#: dcim/models/devices.py:643 msgid "position (U)" msgstr "" -#: netbox/dcim/models/devices.py:650 +#: dcim/models/devices.py:650 msgid "rack face" msgstr "" -#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1415 -#: netbox/virtualization/models/virtualmachines.py:100 +#: dcim/models/devices.py:670 dcim/models/devices.py:1415 +#: virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "" -#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1423 -#: netbox/virtualization/models/virtualmachines.py:108 +#: dcim/models/devices.py:678 dcim/models/devices.py:1423 +#: virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "" -#: netbox/dcim/models/devices.py:686 +#: dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "" -#: netbox/dcim/models/devices.py:703 +#: dcim/models/devices.py:703 msgid "VC position" msgstr "" -#: netbox/dcim/models/devices.py:706 +#: dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "" -#: netbox/dcim/models/devices.py:709 +#: dcim/models/devices.py:709 msgid "VC priority" msgstr "" -#: netbox/dcim/models/devices.py:713 +#: dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "" -#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 +#: dcim/models/devices.py:716 dcim/models/sites.py:207 msgid "latitude" msgstr "" -#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 -#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 +#: dcim/models/devices.py:721 dcim/models/devices.py:729 +#: dcim/models/sites.py:212 dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "" -#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 +#: dcim/models/devices.py:724 dcim/models/sites.py:215 msgid "longitude" msgstr "" -#: netbox/dcim/models/devices.py:797 +#: dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "" -#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 +#: dcim/models/devices.py:808 ipam/models/services.py:75 msgid "device" msgstr "" -#: netbox/dcim/models/devices.py:809 +#: dcim/models/devices.py:809 msgid "devices" msgstr "" -#: netbox/dcim/models/devices.py:835 +#: dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:840 +#: dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:846 +#: dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "" -#: netbox/dcim/models/devices.py:853 +#: dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:857 +#: dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:863 +#: dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "" -#: netbox/dcim/models/devices.py:867 +#: dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" -#: netbox/dcim/models/devices.py:875 +#: dcim/models/devices.py:875 #, python-brace-format msgid "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "" -#: netbox/dcim/models/devices.py:886 +#: dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:893 +#: dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:907 +#: dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " "accommodate this device type: {device_type} ({u_height}U)" msgstr "" -#: netbox/dcim/models/devices.py:922 +#: dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "" -#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 +#: dcim/models/devices.py:931 dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" -#: netbox/dcim/models/devices.py:937 +#: dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "" -#: netbox/dcim/models/devices.py:964 +#: dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " "but this device's type belongs to {devicetype_manufacturer}." msgstr "" -#: netbox/dcim/models/devices.py:975 +#: dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "" -#: netbox/dcim/models/devices.py:983 +#: dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" -#: netbox/dcim/models/devices.py:988 +#: dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " "is currently designated as its master." msgstr "" -#: netbox/dcim/models/devices.py:1196 +#: dcim/models/devices.py:1196 msgid "module" msgstr "" -#: netbox/dcim/models/devices.py:1197 +#: dcim/models/devices.py:1197 msgid "modules" msgstr "" -#: netbox/dcim/models/devices.py:1213 +#: dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "" -#: netbox/dcim/models/devices.py:1334 +#: dcim/models/devices.py:1334 msgid "domain" msgstr "" -#: netbox/dcim/models/devices.py:1347 netbox/dcim/models/devices.py:1348 +#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 msgid "virtual chassis" msgstr "" -#: netbox/dcim/models/devices.py:1363 +#: dcim/models/devices.py:1363 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: netbox/dcim/models/devices.py:1379 +#: dcim/models/devices.py:1379 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: netbox/dcim/models/devices.py:1404 netbox/vpn/models/l2vpn.py:37 +#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: netbox/dcim/models/devices.py:1405 +#: dcim/models/devices.py:1405 msgid "Numeric identifier unique to the parent device" msgstr "" -#: netbox/dcim/models/devices.py:1433 netbox/extras/models/customfields.py:225 -#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 -#: netbox/netbox/models/__init__.py:115 +#: dcim/models/devices.py:1433 extras/models/customfields.py:225 +#: extras/models/models.py:107 extras/models/models.py:694 +#: netbox/models/__init__.py:115 msgid "comments" msgstr "" -#: netbox/dcim/models/devices.py:1449 +#: dcim/models/devices.py:1449 msgid "virtual device context" msgstr "" -#: netbox/dcim/models/devices.py:1450 +#: dcim/models/devices.py:1450 msgid "virtual device contexts" msgstr "" -#: netbox/dcim/models/devices.py:1482 +#: dcim/models/devices.py:1482 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: netbox/dcim/models/devices.py:1488 +#: dcim/models/devices.py:1488 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" -#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 -#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 -#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 +#: dcim/models/mixins.py:15 extras/models/configs.py:41 +#: extras/models/models.py:313 extras/models/models.py:522 +#: extras/models/search.py:48 ipam/models/ip.py:194 msgid "weight" msgstr "" -#: netbox/dcim/models/mixins.py:22 +#: dcim/models/mixins.py:22 msgid "weight unit" msgstr "" -#: netbox/dcim/models/mixins.py:51 +#: dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "" -#: netbox/dcim/models/power.py:55 +#: dcim/models/power.py:55 msgid "power panel" msgstr "" -#: netbox/dcim/models/power.py:56 +#: dcim/models/power.py:56 msgid "power panels" msgstr "" -#: netbox/dcim/models/power.py:70 +#: dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "" -#: netbox/dcim/models/power.py:108 +#: dcim/models/power.py:108 msgid "supply" msgstr "" -#: netbox/dcim/models/power.py:114 +#: dcim/models/power.py:114 msgid "phase" msgstr "" -#: netbox/dcim/models/power.py:120 +#: dcim/models/power.py:120 msgid "voltage" msgstr "" -#: netbox/dcim/models/power.py:125 +#: dcim/models/power.py:125 msgid "amperage" msgstr "" -#: netbox/dcim/models/power.py:130 +#: dcim/models/power.py:130 msgid "max utilization" msgstr "" -#: netbox/dcim/models/power.py:133 +#: dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "" -#: netbox/dcim/models/power.py:136 +#: dcim/models/power.py:136 msgid "available power" msgstr "" -#: netbox/dcim/models/power.py:164 +#: dcim/models/power.py:164 msgid "power feed" msgstr "" -#: netbox/dcim/models/power.py:165 +#: dcim/models/power.py:165 msgid "power feeds" msgstr "" -#: netbox/dcim/models/power.py:179 +#: dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " "are in different sites." msgstr "" -#: netbox/dcim/models/power.py:190 +#: dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "" -#: netbox/dcim/models/racks.py:47 +#: dcim/models/racks.py:47 msgid "width" msgstr "" -#: netbox/dcim/models/racks.py:48 +#: dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "" -#: netbox/dcim/models/racks.py:56 +#: dcim/models/racks.py:56 msgid "Height in rack units" msgstr "" -#: netbox/dcim/models/racks.py:60 +#: dcim/models/racks.py:60 msgid "starting unit" msgstr "" -#: netbox/dcim/models/racks.py:62 +#: dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "" -#: netbox/dcim/models/racks.py:66 +#: dcim/models/racks.py:66 msgid "descending units" msgstr "" -#: netbox/dcim/models/racks.py:67 +#: dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "" -#: netbox/dcim/models/racks.py:72 +#: dcim/models/racks.py:72 msgid "outer width" msgstr "" -#: netbox/dcim/models/racks.py:75 +#: dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "" -#: netbox/dcim/models/racks.py:78 +#: dcim/models/racks.py:78 msgid "outer depth" msgstr "" -#: netbox/dcim/models/racks.py:81 +#: dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "" -#: netbox/dcim/models/racks.py:84 +#: dcim/models/racks.py:84 msgid "outer unit" msgstr "" -#: netbox/dcim/models/racks.py:90 +#: dcim/models/racks.py:90 msgid "mounting depth" msgstr "" -#: netbox/dcim/models/racks.py:94 +#: dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this " "is the distance between the front and rear rails." msgstr "" -#: netbox/dcim/models/racks.py:102 +#: dcim/models/racks.py:102 msgid "max weight" msgstr "" -#: netbox/dcim/models/racks.py:105 +#: dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "" -#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 +#: dcim/models/racks.py:125 dcim/models/racks.py:252 msgid "form factor" msgstr "" -#: netbox/dcim/models/racks.py:162 +#: dcim/models/racks.py:162 msgid "rack type" msgstr "" -#: netbox/dcim/models/racks.py:163 +#: dcim/models/racks.py:163 msgid "rack types" msgstr "" -#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 +#: dcim/models/racks.py:180 dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" -#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 +#: dcim/models/racks.py:184 dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "" -#: netbox/dcim/models/racks.py:230 +#: dcim/models/racks.py:230 msgid "rack role" msgstr "" -#: netbox/dcim/models/racks.py:231 +#: dcim/models/racks.py:231 msgid "rack roles" msgstr "" -#: netbox/dcim/models/racks.py:274 +#: dcim/models/racks.py:274 msgid "facility ID" msgstr "" -#: netbox/dcim/models/racks.py:275 +#: dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "" -#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 -#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 -#: netbox/ipam/forms/bulk_import.py:459 -#: netbox/virtualization/forms/bulk_import.py:112 +#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 +#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 +#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "" -#: netbox/dcim/models/racks.py:321 +#: dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "" -#: netbox/dcim/models/racks.py:359 +#: dcim/models/racks.py:359 msgid "rack" msgstr "" -#: netbox/dcim/models/racks.py:360 +#: dcim/models/racks.py:360 msgid "racks" msgstr "" -#: netbox/dcim/models/racks.py:375 +#: dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "" -#: netbox/dcim/models/racks.py:393 +#: dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "" -#: netbox/dcim/models/racks.py:400 +#: dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "" -#: netbox/dcim/models/racks.py:408 +#: dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "" -#: netbox/dcim/models/racks.py:670 +#: dcim/models/racks.py:670 msgid "units" msgstr "" -#: netbox/dcim/models/racks.py:696 +#: dcim/models/racks.py:696 msgid "rack reservation" msgstr "" -#: netbox/dcim/models/racks.py:697 +#: dcim/models/racks.py:697 msgid "rack reservations" msgstr "" -#: netbox/dcim/models/racks.py:714 +#: dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" -#: netbox/dcim/models/racks.py:727 +#: dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "" -#: netbox/dcim/models/sites.py:49 +#: dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "" -#: netbox/dcim/models/sites.py:59 +#: dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "" -#: netbox/dcim/models/sites.py:62 +#: dcim/models/sites.py:62 msgid "region" msgstr "" -#: netbox/dcim/models/sites.py:63 +#: dcim/models/sites.py:63 msgid "regions" msgstr "" -#: netbox/dcim/models/sites.py:102 +#: dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "" -#: netbox/dcim/models/sites.py:112 +#: dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "" -#: netbox/dcim/models/sites.py:115 +#: dcim/models/sites.py:115 msgid "site group" msgstr "" -#: netbox/dcim/models/sites.py:116 +#: dcim/models/sites.py:116 msgid "site groups" msgstr "" -#: netbox/dcim/models/sites.py:141 +#: dcim/models/sites.py:141 msgid "Full name of the site" msgstr "" -#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 +#: dcim/models/sites.py:181 dcim/models/sites.py:279 msgid "facility" msgstr "" -#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 +#: dcim/models/sites.py:184 dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "" -#: netbox/dcim/models/sites.py:195 +#: dcim/models/sites.py:195 msgid "physical address" msgstr "" -#: netbox/dcim/models/sites.py:198 +#: dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "" -#: netbox/dcim/models/sites.py:201 +#: dcim/models/sites.py:201 msgid "shipping address" msgstr "" -#: netbox/dcim/models/sites.py:204 +#: dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "" -#: netbox/dcim/models/sites.py:238 +#: dcim/models/sites.py:238 msgid "site" msgstr "" -#: netbox/dcim/models/sites.py:239 +#: dcim/models/sites.py:239 msgid "sites" msgstr "" -#: netbox/dcim/models/sites.py:309 +#: dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "" -#: netbox/dcim/models/sites.py:319 +#: dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "" -#: netbox/dcim/models/sites.py:322 +#: dcim/models/sites.py:322 msgid "location" msgstr "" -#: netbox/dcim/models/sites.py:323 +#: dcim/models/sites.py:323 msgid "locations" msgstr "" -#: netbox/dcim/models/sites.py:337 +#: dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" -#: netbox/dcim/tables/cables.py:55 +#: dcim/tables/cables.py:55 msgid "Termination A" msgstr "" -#: netbox/dcim/tables/cables.py:60 +#: dcim/tables/cables.py:60 msgid "Termination B" msgstr "" -#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 +#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "" -#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 +#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "" -#: netbox/dcim/tables/cables.py:78 +#: dcim/tables/cables.py:78 msgid "Location A" msgstr "" -#: netbox/dcim/tables/cables.py:84 +#: dcim/tables/cables.py:84 msgid "Location B" msgstr "" -#: netbox/dcim/tables/cables.py:90 +#: dcim/tables/cables.py:90 msgid "Rack A" msgstr "" -#: netbox/dcim/tables/cables.py:96 +#: dcim/tables/cables.py:96 msgid "Rack B" msgstr "" -#: netbox/dcim/tables/cables.py:102 +#: dcim/tables/cables.py:102 msgid "Site A" msgstr "" -#: netbox/dcim/tables/cables.py:108 +#: dcim/tables/cables.py:108 msgid "Site B" msgstr "" -#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 -#: netbox/dcim/tables/connections.py:71 -#: netbox/templates/dcim/inc/connection_endpoints.html:16 +#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 +#: dcim/tables/connections.py:71 +#: templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "" -#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 -#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 -#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 -#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 -#: netbox/netbox/navigation/menu.py:75 -#: netbox/virtualization/forms/model_forms.py:122 -#: netbox/virtualization/tables/clusters.py:83 -#: netbox/virtualization/views.py:206 +#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 +#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 +#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 +#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 +#: virtualization/forms/model_forms.py:122 virtualization/tables/clusters.py:83 +#: virtualization/views.py:206 msgid "Devices" msgstr "" -#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 -#: netbox/virtualization/tables/clusters.py:88 +#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 +#: virtualization/tables/clusters.py:88 msgid "VMs" msgstr "" -#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 -#: netbox/extras/forms/model_forms.py:630 netbox/templates/dcim/device.html:112 -#: netbox/templates/dcim/device/render_config.html:11 -#: netbox/templates/dcim/device/render_config.html:14 -#: netbox/templates/dcim/devicerole.html:44 -#: netbox/templates/dcim/platform.html:41 -#: netbox/templates/extras/configtemplate.html:10 -#: netbox/templates/virtualization/virtualmachine.html:48 -#: netbox/templates/virtualization/virtualmachine/render_config.html:11 -#: netbox/templates/virtualization/virtualmachine/render_config.html:14 -#: netbox/virtualization/tables/virtualmachines.py:107 +#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 +#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 +#: templates/dcim/device/render_config.html:11 +#: templates/dcim/device/render_config.html:14 +#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 +#: templates/extras/configtemplate.html:10 +#: templates/virtualization/virtualmachine.html:48 +#: templates/virtualization/virtualmachine/render_config.html:11 +#: templates/virtualization/virtualmachine/render_config.html:14 +#: virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "" -#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 +#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "" -#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 -#: netbox/ipam/forms/bulk_import.py:503 netbox/ipam/forms/model_forms.py:306 -#: netbox/ipam/forms/model_forms.py:315 netbox/ipam/tables/ip.py:356 -#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 -#: netbox/templates/ipam/ipaddress.html:11 -#: netbox/virtualization/tables/virtualmachines.py:95 +#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 +#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 +#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 +#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 +#: virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "" -#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 -#: netbox/virtualization/tables/virtualmachines.py:86 +#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 +#: virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "" -#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 -#: netbox/virtualization/tables/virtualmachines.py:90 +#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 +#: virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "" -#: netbox/dcim/tables/devices.py:210 +#: dcim/tables/devices.py:210 msgid "VC Position" msgstr "" -#: netbox/dcim/tables/devices.py:213 +#: dcim/tables/devices.py:213 msgid "VC Priority" msgstr "" -#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 -#: netbox/templates/dcim/devicebay_populate.html:16 +#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 +#: templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "" -#: netbox/dcim/tables/devices.py:225 +#: dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "" -#: netbox/dcim/tables/devices.py:234 +#: dcim/tables/devices.py:234 msgid "Console ports" msgstr "" -#: netbox/dcim/tables/devices.py:237 +#: dcim/tables/devices.py:237 msgid "Console server ports" msgstr "" -#: netbox/dcim/tables/devices.py:240 +#: dcim/tables/devices.py:240 msgid "Power ports" msgstr "" -#: netbox/dcim/tables/devices.py:243 +#: dcim/tables/devices.py:243 msgid "Power outlets" msgstr "" -#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1042 -#: netbox/dcim/views.py:1281 netbox/dcim/views.py:1977 -#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 -#: netbox/templates/dcim/device/base.html:37 -#: netbox/templates/dcim/device_list.html:43 -#: netbox/templates/dcim/devicetype/base.html:34 -#: netbox/templates/dcim/inc/moduletype_buttons.html:25 -#: netbox/templates/dcim/module.html:34 -#: netbox/templates/dcim/virtualdevicecontext.html:61 -#: netbox/templates/dcim/virtualdevicecontext.html:81 -#: netbox/templates/virtualization/virtualmachine/base.html:27 -#: netbox/templates/virtualization/virtualmachine_list.html:14 -#: netbox/virtualization/tables/virtualmachines.py:101 -#: netbox/virtualization/views.py:366 netbox/wireless/tables/wirelesslan.py:55 +#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 +#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 +#: dcim/views.py:1977 netbox/navigation/menu.py:94 +#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 +#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 +#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 +#: templates/dcim/virtualdevicecontext.html:61 +#: templates/dcim/virtualdevicecontext.html:81 +#: templates/virtualization/virtualmachine/base.html:27 +#: templates/virtualization/virtualmachine_list.html:14 +#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 +#: wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "" -#: netbox/dcim/tables/devices.py:249 +#: dcim/tables/devices.py:249 msgid "Front ports" msgstr "" -#: netbox/dcim/tables/devices.py:255 +#: dcim/tables/devices.py:255 msgid "Device bays" msgstr "" -#: netbox/dcim/tables/devices.py:258 +#: dcim/tables/devices.py:258 msgid "Module bays" msgstr "" -#: netbox/dcim/tables/devices.py:261 +#: dcim/tables/devices.py:261 msgid "Inventory items" msgstr "" -#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 -#: netbox/templates/dcim/modulebay.html:17 +#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 +#: templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "" -#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1117 -#: netbox/dcim/views.py:2075 netbox/netbox/navigation/menu.py:103 -#: netbox/templates/dcim/device/base.html:52 -#: netbox/templates/dcim/device_list.html:71 -#: netbox/templates/dcim/devicetype/base.html:49 -#: netbox/templates/dcim/inc/panels/inventory_items.html:6 -#: netbox/templates/dcim/inventoryitemrole.html:32 +#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 +#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 +#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 +#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 +#: templates/dcim/inc/panels/inventory_items.html:6 +#: templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "" -#: netbox/dcim/tables/devices.py:333 +#: dcim/tables/devices.py:333 msgid "Cable Color" msgstr "" -#: netbox/dcim/tables/devices.py:339 +#: dcim/tables/devices.py:339 msgid "Link Peers" msgstr "" -#: netbox/dcim/tables/devices.py:342 +#: dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "" -#: netbox/dcim/tables/devices.py:461 +#: dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "" -#: netbox/dcim/tables/devices.py:464 +#: dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "" -#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:701 -#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 -#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 -#: netbox/netbox/navigation/menu.py:160 -#: netbox/templates/dcim/interface.html:339 -#: netbox/templates/ipam/ipaddress_bulk_add.html:15 -#: netbox/templates/ipam/service.html:40 -#: netbox/templates/virtualization/vminterface.html:85 -#: netbox/vpn/tables/tunnels.py:98 +#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 +#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 +#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 +#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 +#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 +#: vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "" -#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 +#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 +#: templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "" -#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 -#: netbox/templates/virtualization/vminterface.html:67 -#: netbox/templates/vpn/tunnel.html:18 -#: netbox/templates/vpn/tunneltermination.html:13 -#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 -#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 -#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 -#: netbox/vpn/tables/tunnels.py:78 +#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 +#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 +#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 +#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 +#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 +#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "" -#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 -#: netbox/templates/dcim/interface.html:65 +#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 +#: templates/dcim/interface.html:65 msgid "Management Only" msgstr "" -#: netbox/dcim/tables/devices.py:623 +#: dcim/tables/devices.py:623 msgid "VDCs" msgstr "" -#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 +#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "" -#: netbox/dcim/tables/devices.py:876 +#: dcim/tables/devices.py:876 msgid "Module Serial" msgstr "" -#: netbox/dcim/tables/devices.py:880 +#: dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "" -#: netbox/dcim/tables/devices.py:889 +#: dcim/tables/devices.py:889 msgid "Module Status" msgstr "" -#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 -#: netbox/templates/dcim/inventoryitem.html:40 +#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 +#: templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "" -#: netbox/dcim/tables/devices.py:1000 +#: dcim/tables/devices.py:1000 msgid "Items" msgstr "" -#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 -#: netbox/netbox/navigation/menu.py:86 +#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 +#: netbox/navigation/menu.py:86 msgid "Device Types" msgstr "" -#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 +#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 msgid "Module Types" msgstr "" -#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 -#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 -#: netbox/netbox/navigation/menu.py:78 +#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 +#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 +#: netbox/navigation/menu.py:78 msgid "Platforms" msgstr "" -#: netbox/dcim/tables/devicetypes.py:84 -#: netbox/templates/dcim/devicetype.html:29 +#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "" -#: netbox/dcim/tables/devicetypes.py:88 -#: netbox/templates/dcim/devicetype.html:45 +#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "" -#: netbox/dcim/tables/devicetypes.py:98 +#: dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "" -#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 -#: netbox/dcim/tables/racks.py:89 +#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 +#: dcim/tables/racks.py:89 msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:982 -#: netbox/dcim/views.py:1221 netbox/dcim/views.py:1913 -#: netbox/netbox/navigation/menu.py:97 -#: netbox/templates/dcim/device/base.html:25 -#: netbox/templates/dcim/device_list.html:15 -#: netbox/templates/dcim/devicetype/base.html:22 -#: netbox/templates/dcim/inc/moduletype_buttons.html:13 -#: netbox/templates/dcim/module.html:22 +#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 +#: dcim/views.py:1913 netbox/navigation/menu.py:97 +#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 +#: templates/dcim/devicetype/base.html:22 +#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:997 -#: netbox/dcim/views.py:1236 netbox/dcim/views.py:1929 -#: netbox/netbox/navigation/menu.py:98 -#: netbox/templates/dcim/device/base.html:28 -#: netbox/templates/dcim/device_list.html:22 -#: netbox/templates/dcim/devicetype/base.html:25 -#: netbox/templates/dcim/inc/moduletype_buttons.html:16 -#: netbox/templates/dcim/module.html:25 +#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 +#: dcim/views.py:1929 netbox/navigation/menu.py:98 +#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 +#: templates/dcim/devicetype/base.html:25 +#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1012 -#: netbox/dcim/views.py:1251 netbox/dcim/views.py:1945 -#: netbox/netbox/navigation/menu.py:99 -#: netbox/templates/dcim/device/base.html:31 -#: netbox/templates/dcim/device_list.html:29 -#: netbox/templates/dcim/devicetype/base.html:28 -#: netbox/templates/dcim/inc/moduletype_buttons.html:19 -#: netbox/templates/dcim/module.html:28 +#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 +#: dcim/views.py:1945 netbox/navigation/menu.py:99 +#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 +#: templates/dcim/devicetype/base.html:28 +#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1027 -#: netbox/dcim/views.py:1266 netbox/dcim/views.py:1961 -#: netbox/netbox/navigation/menu.py:100 -#: netbox/templates/dcim/device/base.html:34 -#: netbox/templates/dcim/device_list.html:36 -#: netbox/templates/dcim/devicetype/base.html:31 -#: netbox/templates/dcim/inc/moduletype_buttons.html:22 -#: netbox/templates/dcim/module.html:31 +#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 +#: dcim/views.py:1961 netbox/navigation/menu.py:100 +#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 +#: templates/dcim/devicetype/base.html:31 +#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1057 -#: netbox/dcim/views.py:1296 netbox/dcim/views.py:1999 -#: netbox/netbox/navigation/menu.py:95 -#: netbox/templates/dcim/device/base.html:40 -#: netbox/templates/dcim/devicetype/base.html:37 -#: netbox/templates/dcim/inc/moduletype_buttons.html:28 -#: netbox/templates/dcim/module.html:37 +#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 +#: dcim/views.py:1999 netbox/navigation/menu.py:95 +#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 +#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1072 -#: netbox/dcim/views.py:1311 netbox/dcim/views.py:2015 -#: netbox/netbox/navigation/menu.py:96 -#: netbox/templates/dcim/device/base.html:43 -#: netbox/templates/dcim/device_list.html:50 -#: netbox/templates/dcim/devicetype/base.html:40 -#: netbox/templates/dcim/inc/moduletype_buttons.html:31 -#: netbox/templates/dcim/module.html:40 +#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 +#: dcim/views.py:2015 netbox/navigation/menu.py:96 +#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 +#: templates/dcim/devicetype/base.html:40 +#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1102 -#: netbox/dcim/views.py:2055 netbox/netbox/navigation/menu.py:102 -#: netbox/templates/dcim/device/base.html:49 -#: netbox/templates/dcim/device_list.html:57 -#: netbox/templates/dcim/devicetype/base.html:46 +#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 +#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 +#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1087 -#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2035 -#: netbox/netbox/navigation/menu.py:101 -#: netbox/templates/dcim/device/base.html:46 -#: netbox/templates/dcim/device_list.html:64 -#: netbox/templates/dcim/devicetype/base.html:43 -#: netbox/templates/dcim/inc/moduletype_buttons.html:34 -#: netbox/templates/dcim/module.html:43 +#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 +#: dcim/views.py:2035 netbox/navigation/menu.py:101 +#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 +#: templates/dcim/devicetype/base.html:43 +#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 msgid "Module Bays" msgstr "" -#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 -#: netbox/templates/dcim/powerpanel.html:51 +#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 +#: templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "" -#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 +#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "" -#: netbox/dcim/tables/power.py:84 +#: dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "" -#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 -#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 -#: netbox/netbox/navigation/menu.py:49 +#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 +#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 +#: netbox/navigation/menu.py:49 msgid "Racks" msgstr "" -#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 -#: netbox/templates/dcim/device.html:318 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 +#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 +#: templates/dcim/device.html:318 +#: templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "" -#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 +#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 +#: templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "" -#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 +#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 +#: templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "" -#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 +#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 msgid "Max Weight" msgstr "" -#: netbox/dcim/tables/racks.py:154 +#: dcim/tables/racks.py:154 msgid "Space" msgstr "" -#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 -#: netbox/extras/forms/filtersets.py:351 netbox/extras/forms/model_forms.py:517 -#: netbox/ipam/forms/bulk_edit.py:131 netbox/ipam/forms/model_forms.py:153 -#: netbox/ipam/tables/asn.py:66 netbox/netbox/navigation/menu.py:15 -#: netbox/netbox/navigation/menu.py:17 +#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 +#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 +#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 +#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 +#: netbox/navigation/menu.py:17 msgid "Sites" msgstr "" -#: netbox/dcim/tests/test_api.py:47 +#: dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "" -#: netbox/dcim/views.py:140 +#: dcim/views.py:140 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:740 netbox/netbox/navigation/menu.py:51 +#: dcim/views.py:740 netbox/navigation/menu.py:51 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:759 netbox/templates/dcim/location.html:90 -#: netbox/templates/dcim/site.html:140 +#: dcim/views.py:759 templates/dcim/location.html:90 +#: templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2088 netbox/extras/forms/model_forms.py:577 -#: netbox/templates/extras/configcontext.html:10 -#: netbox/virtualization/forms/model_forms.py:225 -#: netbox/virtualization/views.py:407 +#: dcim/views.py:2088 extras/forms/model_forms.py:577 +#: templates/extras/configcontext.html:10 +#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2098 netbox/virtualization/views.py:417 +#: dcim/views.py:2098 virtualization/views.py:417 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 +#: dcim/views.py:2131 virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "" -#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 -#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 -#: netbox/virtualization/views.py:180 +#: dcim/views.py:2149 extras/tables/tables.py:550 netbox/navigation/menu.py:247 +#: netbox/navigation/menu.py:249 virtualization/views.py:180 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:2907 +#: dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:2948 +#: dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 +#: dcim/views.py:3054 ipam/tables/ip.py:234 msgid "Children" msgstr "" -#: netbox/dcim/views.py:3520 +#: dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "" -#: netbox/dcim/views.py:3567 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" -#: netbox/dcim/views.py:3580 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "" -#: netbox/extras/api/customfields.py:89 +#: extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "" -#: netbox/extras/api/serializers_/customfields.py:73 +#: extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "" -#: netbox/extras/api/serializers_/scripts.py:70 -#: netbox/extras/api/serializers_/scripts.py:75 +#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "" -#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 +#: extras/choices.py:30 extras/forms/misc.py:14 msgid "Text" msgstr "" -#: netbox/extras/choices.py:31 +#: extras/choices.py:31 msgid "Text (long)" msgstr "" -#: netbox/extras/choices.py:32 +#: extras/choices.py:32 msgid "Integer" msgstr "" -#: netbox/extras/choices.py:33 +#: extras/choices.py:33 msgid "Decimal" msgstr "" -#: netbox/extras/choices.py:34 +#: extras/choices.py:34 msgid "Boolean (true/false)" msgstr "" -#: netbox/extras/choices.py:35 +#: extras/choices.py:35 msgid "Date" msgstr "" -#: netbox/extras/choices.py:36 +#: extras/choices.py:36 msgid "Date & time" msgstr "" -#: netbox/extras/choices.py:38 +#: extras/choices.py:38 msgid "JSON" msgstr "" -#: netbox/extras/choices.py:39 +#: extras/choices.py:39 msgid "Selection" msgstr "" -#: netbox/extras/choices.py:40 +#: extras/choices.py:40 msgid "Multiple selection" msgstr "" -#: netbox/extras/choices.py:42 +#: extras/choices.py:42 msgid "Multiple objects" msgstr "" -#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 -#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 -#: netbox/wireless/choices.py:27 +#: extras/choices.py:53 netbox/preferences.py:21 +#: templates/extras/customfield.html:78 vpn/choices.py:20 +#: wireless/choices.py:27 msgid "Disabled" msgstr "" -#: netbox/extras/choices.py:54 +#: extras/choices.py:54 msgid "Loose" msgstr "" -#: netbox/extras/choices.py:55 +#: extras/choices.py:55 msgid "Exact" msgstr "" -#: netbox/extras/choices.py:66 +#: extras/choices.py:66 msgid "Always" msgstr "" -#: netbox/extras/choices.py:67 +#: extras/choices.py:67 msgid "If set" msgstr "" -#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 +#: extras/choices.py:68 extras/choices.py:81 msgid "Hidden" msgstr "" -#: netbox/extras/choices.py:79 +#: extras/choices.py:79 msgid "Yes" msgstr "" -#: netbox/extras/choices.py:80 +#: extras/choices.py:80 msgid "No" msgstr "" -#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 -#: netbox/tenancy/forms/bulk_edit.py:118 -#: netbox/wireless/forms/model_forms.py:168 +#: extras/choices.py:108 templates/tenancy/contact.html:57 +#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 msgid "Link" msgstr "" -#: netbox/extras/choices.py:124 +#: extras/choices.py:124 msgid "Newest" msgstr "" -#: netbox/extras/choices.py:125 +#: extras/choices.py:125 msgid "Oldest" msgstr "" -#: netbox/extras/choices.py:126 +#: extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "" -#: netbox/extras/choices.py:127 +#: extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "" -#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 +#: extras/choices.py:144 extras/choices.py:167 msgid "Info" msgstr "" -#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 +#: extras/choices.py:145 extras/choices.py:168 msgid "Success" msgstr "" -#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 +#: extras/choices.py:146 extras/choices.py:169 msgid "Warning" msgstr "" -#: netbox/extras/choices.py:147 +#: extras/choices.py:147 msgid "Danger" msgstr "" -#: netbox/extras/choices.py:165 +#: extras/choices.py:165 msgid "Debug" msgstr "" -#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 +#: extras/choices.py:166 netbox/choices.py:101 msgid "Default" msgstr "" -#: netbox/extras/choices.py:170 +#: extras/choices.py:170 msgid "Failure" msgstr "" -#: netbox/extras/choices.py:186 +#: extras/choices.py:186 msgid "Hourly" msgstr "" -#: netbox/extras/choices.py:187 +#: extras/choices.py:187 msgid "12 hours" msgstr "" -#: netbox/extras/choices.py:188 +#: extras/choices.py:188 msgid "Daily" msgstr "" -#: netbox/extras/choices.py:189 +#: extras/choices.py:189 msgid "Weekly" msgstr "" -#: netbox/extras/choices.py:190 +#: extras/choices.py:190 msgid "30 days" msgstr "" -#: netbox/extras/choices.py:226 -#: netbox/templates/dcim/virtualchassis_edit.html:107 -#: netbox/templates/generic/bulk_add_component.html:68 -#: netbox/templates/generic/object_edit.html:47 -#: netbox/templates/generic/object_edit.html:80 -#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 +#: templates/generic/bulk_add_component.html:68 +#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 +#: templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "" -#: netbox/extras/choices.py:227 +#: extras/choices.py:227 msgid "Update" msgstr "" -#: netbox/extras/choices.py:228 -#: netbox/templates/circuits/inc/circuit_termination.html:23 -#: netbox/templates/dcim/inc/panels/inventory_items.html:37 -#: netbox/templates/dcim/powerpanel.html:66 -#: netbox/templates/extras/script_list.html:35 -#: netbox/templates/generic/bulk_delete.html:20 -#: netbox/templates/generic/bulk_delete.html:66 -#: netbox/templates/generic/object_delete.html:19 -#: netbox/templates/htmx/delete_form.html:57 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 -#: netbox/templates/users/objectpermission.html:46 -#: netbox/utilities/templates/buttons/delete.html:11 +#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 +#: templates/dcim/inc/panels/inventory_items.html:37 +#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 +#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 +#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 +#: templates/ipam/inc/panels/fhrp_groups.html:48 +#: templates/users/objectpermission.html:46 +#: utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "" -#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 -#: netbox/netbox/choices.py:102 +#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 msgid "Blue" msgstr "" -#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 -#: netbox/netbox/choices.py:103 +#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 msgid "Indigo" msgstr "" -#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 -#: netbox/netbox/choices.py:104 +#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 msgid "Purple" msgstr "" -#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 -#: netbox/netbox/choices.py:105 +#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 msgid "Pink" msgstr "" -#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 -#: netbox/netbox/choices.py:106 +#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 msgid "Red" msgstr "" -#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 -#: netbox/netbox/choices.py:107 +#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 msgid "Orange" msgstr "" -#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 -#: netbox/netbox/choices.py:108 +#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 msgid "Yellow" msgstr "" -#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 -#: netbox/netbox/choices.py:109 +#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 msgid "Green" msgstr "" -#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 -#: netbox/netbox/choices.py:110 +#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 msgid "Teal" msgstr "" -#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 -#: netbox/netbox/choices.py:111 +#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 msgid "Cyan" msgstr "" -#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 +#: extras/choices.py:262 netbox/choices.py:112 msgid "Gray" msgstr "" -#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 -#: netbox/netbox/choices.py:113 +#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 msgid "Black" msgstr "" -#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 -#: netbox/netbox/choices.py:114 +#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 msgid "White" msgstr "" -#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 -#: netbox/extras/forms/model_forms.py:430 -#: netbox/templates/extras/webhook.html:10 +#: extras/choices.py:279 extras/forms/model_forms.py:353 +#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 msgid "Webhook" msgstr "" -#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 -#: netbox/templates/extras/script/base.html:29 +#: extras/choices.py:280 extras/forms/model_forms.py:418 +#: templates/extras/script/base.html:29 msgid "Script" msgstr "" -#: netbox/extras/choices.py:281 +#: extras/choices.py:281 msgid "Notification" msgstr "" -#: netbox/extras/conditions.py:54 +#: extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "" -#: netbox/extras/conditions.py:58 +#: extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "" -#: netbox/extras/conditions.py:60 +#: extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "" -#: netbox/extras/conditions.py:137 +#: extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "" -#: netbox/extras/conditions.py:142 +#: extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" -#: netbox/extras/conditions.py:154 +#: extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "" -#: netbox/extras/dashboard/forms.py:38 +#: extras/dashboard/forms.py:38 msgid "Widget type" msgstr "" -#: netbox/extras/dashboard/utils.py:36 +#: extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "" -#: netbox/extras/dashboard/widgets.py:125 +#: extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "" -#: netbox/extras/dashboard/widgets.py:144 +#: extras/dashboard/widgets.py:144 msgid "Note" msgstr "" -#: netbox/extras/dashboard/widgets.py:145 +#: extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" -#: netbox/extras/dashboard/widgets.py:158 +#: extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "" -#: netbox/extras/dashboard/widgets.py:159 +#: extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." msgstr "" -#: netbox/extras/dashboard/widgets.py:169 +#: extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "" -#: netbox/extras/dashboard/widgets.py:177 +#: extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" -#: netbox/extras/dashboard/widgets.py:208 +#: extras/dashboard/widgets.py:208 msgid "Object List" msgstr "" -#: netbox/extras/dashboard/widgets.py:209 +#: extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "" -#: netbox/extras/dashboard/widgets.py:222 +#: extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "" -#: netbox/extras/dashboard/widgets.py:234 +#: extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" -#: netbox/extras/dashboard/widgets.py:274 +#: extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "" -#: netbox/extras/dashboard/widgets.py:279 +#: extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "" -#: netbox/extras/dashboard/widgets.py:286 +#: extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "" -#: netbox/extras/dashboard/widgets.py:291 +#: extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "" -#: netbox/extras/dashboard/widgets.py:296 +#: extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "" -#: netbox/extras/dashboard/widgets.py:348 netbox/templates/account/base.html:10 -#: netbox/templates/account/bookmarks.html:7 -#: netbox/templates/inc/user_menu.html:48 +#: extras/dashboard/widgets.py:348 templates/account/base.html:10 +#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "" -#: netbox/extras/dashboard/widgets.py:352 +#: extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "" -#: netbox/extras/events.py:147 +#: extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "" -#: netbox/extras/events.py:192 +#: extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "" -#: netbox/extras/filtersets.py:45 +#: extras/filtersets.py:45 msgid "Script module (ID)" msgstr "" -#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 -#: netbox/extras/filtersets.py:665 +#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 msgid "Data file (ID)" msgstr "" -#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 -#: netbox/users/filtersets.py:191 +#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 msgid "Group (name)" msgstr "" -#: netbox/extras/filtersets.py:574 -#: netbox/virtualization/forms/filtersets.py:118 +#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "" -#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 -#: netbox/virtualization/filtersets.py:147 +#: extras/filtersets.py:580 virtualization/filtersets.py:95 +#: virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "" -#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 -#: netbox/tenancy/forms/forms.py:39 +#: extras/filtersets.py:601 tenancy/forms/forms.py:16 tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "" -#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 -#: netbox/tenancy/filtersets.py:208 +#: extras/filtersets.py:607 tenancy/filtersets.py:188 tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "" -#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 -#: netbox/templates/extras/tag.html:11 +#: extras/filtersets.py:623 extras/forms/model_forms.py:495 +#: templates/extras/tag.html:11 msgid "Tag" msgstr "" -#: netbox/extras/filtersets.py:629 +#: extras/filtersets.py:629 msgid "Tag (slug)" msgstr "" -#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 +#: extras/filtersets.py:689 extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "" -#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 +#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 msgid "Group name" msgstr "" -#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 -#: netbox/extras/tables/tables.py:65 -#: netbox/templates/extras/customfield.html:38 -#: netbox/templates/generic/bulk_import.html:118 +#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 +#: extras/tables/tables.py:65 templates/extras/customfield.html:38 +#: templates/generic/bulk_import.html:118 msgid "Required" msgstr "" -#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 +#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "" -#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 -#: netbox/extras/forms/filtersets.py:89 -#: netbox/extras/models/customfields.py:209 +#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 +#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 msgid "UI visible" msgstr "" -#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 -#: netbox/extras/forms/filtersets.py:94 -#: netbox/extras/models/customfields.py:216 +#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 +#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 msgid "UI editable" msgstr "" -#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 +#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "" -#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 +#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "" -#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 +#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "" -#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 +#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "" -#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 -#: netbox/extras/forms/model_forms.py:76 -#: netbox/templates/extras/customfield.html:70 +#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 +#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 msgid "Behavior" msgstr "" -#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 +#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 msgid "New window" msgstr "" -#: netbox/extras/forms/bulk_edit.py:137 +#: extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "" -#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 -#: netbox/extras/models/models.py:409 +#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 +#: extras/models/models.py:409 msgid "MIME type" msgstr "" -#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 +#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 msgid "File extension" msgstr "" -#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 +#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 msgid "As attachment" msgstr "" -#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 -#: netbox/extras/tables/tables.py:256 -#: netbox/templates/extras/savedfilter.html:29 +#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 +#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 msgid "Shared" msgstr "" -#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 -#: netbox/extras/models/models.py:174 +#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 +#: extras/models/models.py:174 msgid "HTTP method" msgstr "" -#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 -#: netbox/templates/extras/webhook.html:30 +#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 +#: templates/extras/webhook.html:30 msgid "Payload URL" msgstr "" -#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 +#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 msgid "SSL verification" msgstr "" -#: netbox/extras/forms/bulk_edit.py:227 netbox/templates/extras/webhook.html:38 +#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 msgid "Secret" msgstr "" -#: netbox/extras/forms/bulk_edit.py:232 +#: extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "" -#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 -#: netbox/extras/forms/model_forms.py:377 +#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 +#: extras/forms/model_forms.py:377 msgid "Event types" msgstr "" -#: netbox/extras/forms/bulk_edit.py:293 +#: extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "" -#: netbox/extras/forms/bulk_import.py:37 netbox/extras/forms/bulk_import.py:118 -#: netbox/extras/forms/bulk_import.py:139 -#: netbox/extras/forms/bulk_import.py:162 -#: netbox/extras/forms/bulk_import.py:186 netbox/extras/forms/filtersets.py:137 -#: netbox/extras/forms/filtersets.py:224 netbox/extras/forms/model_forms.py:47 -#: netbox/extras/forms/model_forms.py:205 -#: netbox/extras/forms/model_forms.py:237 -#: netbox/extras/forms/model_forms.py:278 -#: netbox/extras/forms/model_forms.py:372 -#: netbox/extras/forms/model_forms.py:489 netbox/users/forms/model_forms.py:276 +#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 +#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 +#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 +#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 +#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 +#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 +#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 msgid "Object types" msgstr "" -#: netbox/extras/forms/bulk_import.py:39 netbox/extras/forms/bulk_import.py:120 -#: netbox/extras/forms/bulk_import.py:141 -#: netbox/extras/forms/bulk_import.py:164 -#: netbox/extras/forms/bulk_import.py:188 -#: netbox/tenancy/forms/bulk_import.py:96 +#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 +#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 +#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "" -#: netbox/extras/forms/bulk_import.py:44 +#: extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "" -#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 -#: netbox/extras/forms/filtersets.py:281 netbox/extras/forms/model_forms.py:304 -#: netbox/extras/forms/model_forms.py:341 netbox/tenancy/forms/filtersets.py:92 +#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 +#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 +#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "" -#: netbox/extras/forms/bulk_import.py:50 +#: extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "" -#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 +#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 msgid "Choice set" msgstr "" -#: netbox/extras/forms/bulk_import.py:57 +#: extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "" -#: netbox/extras/forms/bulk_import.py:63 +#: extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "" -#: netbox/extras/forms/bulk_import.py:69 +#: extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "" -#: netbox/extras/forms/bulk_import.py:85 +#: extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "" -#: netbox/extras/forms/bulk_import.py:91 +#: extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" msgstr "" -#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 +#: extras/forms/bulk_import.py:123 extras/models/models.py:323 msgid "button class" msgstr "" -#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 +#: extras/forms/bulk_import.py:126 extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" -#: netbox/extras/forms/bulk_import.py:193 +#: extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "" -#: netbox/extras/forms/bulk_import.py:196 +#: extras/forms/bulk_import.py:196 msgid "Action object" msgstr "" -#: netbox/extras/forms/bulk_import.py:198 +#: extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "" -#: netbox/extras/forms/bulk_import.py:219 +#: extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "" -#: netbox/extras/forms/bulk_import.py:228 +#: extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "" -#: netbox/extras/forms/bulk_import.py:244 +#: extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "" -#: netbox/extras/forms/bulk_import.py:249 +#: extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "" -#: netbox/extras/forms/bulk_import.py:261 -#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 -#: netbox/templates/extras/notificationgroup.html:41 -#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 -#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 -#: netbox/users/tables.py:102 +#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 +#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 +#: templates/users/group.html:29 users/forms/model_forms.py:236 +#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 +#: users/tables.py:102 msgid "Users" msgstr "" -#: netbox/extras/forms/bulk_import.py:265 +#: extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" -#: netbox/extras/forms/bulk_import.py:268 -#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 -#: netbox/templates/extras/notificationgroup.html:31 -#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 -#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 -#: netbox/users/tables.py:106 +#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 +#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 +#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 +#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 msgid "Groups" msgstr "" -#: netbox/extras/forms/bulk_import.py:272 +#: extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "" -#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 +#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 msgid "Related object type" msgstr "" -#: netbox/extras/forms/filtersets.py:57 +#: extras/forms/filtersets.py:57 msgid "Field type" msgstr "" -#: netbox/extras/forms/filtersets.py:120 netbox/extras/forms/model_forms.py:157 -#: netbox/extras/tables/tables.py:91 -#: netbox/templates/generic/bulk_import.html:154 +#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 +#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 msgid "Choices" msgstr "" -#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 -#: netbox/extras/forms/filtersets.py:408 netbox/extras/forms/model_forms.py:572 -#: netbox/templates/core/job.html:96 netbox/templates/extras/eventrule.html:84 +#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 +#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 +#: templates/core/job.html:96 templates/extras/eventrule.html:84 msgid "Data" msgstr "" -#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 -#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 -#: netbox/utilities/forms/bulk_import.py:26 +#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 +#: extras/forms/filtersets.py:418 netbox/choices.py:130 +#: utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "" -#: netbox/extras/forms/filtersets.py:183 +#: extras/forms/filtersets.py:183 msgid "Content types" msgstr "" -#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 +#: extras/forms/filtersets.py:255 extras/models/models.py:179 msgid "HTTP content type" msgstr "" -#: netbox/extras/forms/filtersets.py:286 +#: extras/forms/filtersets.py:286 msgid "Event type" msgstr "" -#: netbox/extras/forms/filtersets.py:291 +#: extras/forms/filtersets.py:291 msgid "Action type" msgstr "" -#: netbox/extras/forms/filtersets.py:307 +#: extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "" -#: netbox/extras/forms/filtersets.py:312 +#: extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "" -#: netbox/extras/forms/filtersets.py:341 netbox/extras/forms/model_forms.py:507 -#: netbox/netbox/navigation/menu.py:18 +#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 +#: netbox/navigation/menu.py:18 msgid "Regions" msgstr "" -#: netbox/extras/forms/filtersets.py:346 netbox/extras/forms/model_forms.py:512 +#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 msgid "Site groups" msgstr "" -#: netbox/extras/forms/filtersets.py:356 netbox/extras/forms/model_forms.py:522 -#: netbox/netbox/navigation/menu.py:20 netbox/templates/dcim/site.html:127 +#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 +#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 msgid "Locations" msgstr "" -#: netbox/extras/forms/filtersets.py:361 netbox/extras/forms/model_forms.py:527 +#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 msgid "Device types" msgstr "" -#: netbox/extras/forms/filtersets.py:366 netbox/extras/forms/model_forms.py:532 +#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 msgid "Roles" msgstr "" -#: netbox/extras/forms/filtersets.py:376 netbox/extras/forms/model_forms.py:542 +#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "" -#: netbox/extras/forms/filtersets.py:381 netbox/extras/forms/model_forms.py:547 +#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "" -#: netbox/extras/forms/filtersets.py:386 netbox/extras/forms/model_forms.py:552 -#: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 -#: netbox/templates/virtualization/clustertype.html:30 -#: netbox/virtualization/tables/clusters.py:23 -#: netbox/virtualization/tables/clusters.py:45 +#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 +#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 +#: templates/virtualization/clustertype.html:30 +#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "" -#: netbox/extras/forms/filtersets.py:391 netbox/extras/forms/model_forms.py:557 +#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "" -#: netbox/extras/forms/model_forms.py:49 +#: extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "" -#: netbox/extras/forms/model_forms.py:52 +#: extras/forms/model_forms.py:52 msgid "Default value" msgstr "" -#: netbox/extras/forms/model_forms.py:58 +#: extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" -#: netbox/extras/forms/model_forms.py:61 -#: netbox/templates/extras/customfield.html:60 +#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 msgid "Related object filter" msgstr "" -#: netbox/extras/forms/model_forms.py:63 +#: extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "" -#: netbox/extras/forms/model_forms.py:73 -#: netbox/templates/extras/customfield.html:10 +#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 msgid "Custom Field" msgstr "" -#: netbox/extras/forms/model_forms.py:85 +#: extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." msgstr "" -#: netbox/extras/forms/model_forms.py:88 +#: extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "" -#: netbox/extras/forms/model_forms.py:143 +#: extras/forms/model_forms.py:143 msgid "Related Object" msgstr "" -#: netbox/extras/forms/model_forms.py:169 +#: extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" msgstr "" -#: netbox/extras/forms/model_forms.py:212 -#: netbox/templates/extras/customlink.html:10 +#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 msgid "Custom Link" msgstr "" -#: netbox/extras/forms/model_forms.py:214 +#: extras/forms/model_forms.py:214 msgid "Templates" msgstr "" -#: netbox/extras/forms/model_forms.py:226 +#: extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " "Links which render as empty text will not be displayed." msgstr "" -#: netbox/extras/forms/model_forms.py:230 +#: extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "" -#: netbox/extras/forms/model_forms.py:241 -#: netbox/extras/forms/model_forms.py:624 +#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 msgid "Template code" msgstr "" -#: netbox/extras/forms/model_forms.py:247 -#: netbox/templates/extras/exporttemplate.html:12 +#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "" -#: netbox/extras/forms/model_forms.py:249 +#: extras/forms/model_forms.py:249 msgid "Rendering" msgstr "" -#: netbox/extras/forms/model_forms.py:263 -#: netbox/extras/forms/model_forms.py:649 +#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" -#: netbox/extras/forms/model_forms.py:270 -#: netbox/extras/forms/model_forms.py:656 +#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "" -#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 -#: netbox/templates/extras/savedfilter.html:10 +#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 +#: templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "" -#: netbox/extras/forms/model_forms.py:334 +#: extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "" -#: netbox/extras/forms/model_forms.py:356 -#: netbox/templates/extras/webhook.html:23 +#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "" -#: netbox/extras/forms/model_forms.py:358 -#: netbox/templates/extras/webhook.html:44 +#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 msgid "SSL" msgstr "" -#: netbox/extras/forms/model_forms.py:380 +#: extras/forms/model_forms.py:380 msgid "Action choice" msgstr "" -#: netbox/extras/forms/model_forms.py:385 +#: extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "" -#: netbox/extras/forms/model_forms.py:389 +#: extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." msgstr "" -#: netbox/extras/forms/model_forms.py:394 -#: netbox/templates/extras/eventrule.html:10 +#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "" -#: netbox/extras/forms/model_forms.py:395 +#: extras/forms/model_forms.py:395 msgid "Triggers" msgstr "" -#: netbox/extras/forms/model_forms.py:442 +#: extras/forms/model_forms.py:442 msgid "Notification group" msgstr "" -#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 -#: netbox/tenancy/tables/tenants.py:22 +#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 +#: tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "" -#: netbox/extras/forms/model_forms.py:606 +#: extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "" -#: netbox/extras/forms/model_forms.py:612 +#: extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "" -#: netbox/extras/forms/model_forms.py:631 -#: netbox/templates/core/datafile.html:55 +#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 msgid "Content" msgstr "" -#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 +#: extras/forms/reports.py:17 extras/forms/scripts.py:23 msgid "Schedule at" msgstr "" -#: netbox/extras/forms/reports.py:18 +#: extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "" -#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 +#: extras/forms/reports.py:23 extras/forms/scripts.py:29 msgid "Recurs every" msgstr "" -#: netbox/extras/forms/reports.py:27 +#: extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "" -#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 +#: extras/forms/reports.py:35 extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr "" -#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 +#: extras/forms/reports.py:45 extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "" -#: netbox/extras/forms/scripts.py:17 +#: extras/forms/scripts.py:17 msgid "Commit changes" msgstr "" -#: netbox/extras/forms/scripts.py:18 +#: extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" -#: netbox/extras/forms/scripts.py:24 +#: extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "" -#: netbox/extras/forms/scripts.py:33 +#: extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "" -#: netbox/extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "" -#: netbox/extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "" -#: netbox/extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "" -#: netbox/extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "" -#: netbox/extras/management/commands/reindex.py:66 +#: extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "" -#: netbox/extras/models/configs.py:130 +#: extras/models/configs.py:130 msgid "config context" msgstr "" -#: netbox/extras/models/configs.py:131 +#: extras/models/configs.py:131 msgid "config contexts" msgstr "" -#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 +#: extras/models/configs.py:149 extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "" -#: netbox/extras/models/configs.py:169 +#: extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final " "rendered config context" msgstr "" -#: netbox/extras/models/configs.py:224 +#: extras/models/configs.py:224 msgid "template code" msgstr "" -#: netbox/extras/models/configs.py:225 +#: extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "" -#: netbox/extras/models/configs.py:228 +#: extras/models/configs.py:228 msgid "environment parameters" msgstr "" -#: netbox/extras/models/configs.py:233 +#: extras/models/configs.py:233 msgid "" "Any additional parameters to pass when constructing the Jinja2 " "environment." msgstr "" -#: netbox/extras/models/configs.py:240 +#: extras/models/configs.py:240 msgid "config template" msgstr "" -#: netbox/extras/models/configs.py:241 +#: extras/models/configs.py:241 msgid "config templates" msgstr "" -#: netbox/extras/models/customfields.py:75 +#: extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "" -#: netbox/extras/models/customfields.py:82 +#: extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "" -#: netbox/extras/models/customfields.py:89 +#: extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" -#: netbox/extras/models/customfields.py:95 +#: extras/models/customfields.py:95 msgid "Internal field name" msgstr "" -#: netbox/extras/models/customfields.py:99 +#: extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "" -#: netbox/extras/models/customfields.py:104 +#: extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" -#: netbox/extras/models/customfields.py:115 +#: extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" msgstr "" -#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 +#: extras/models/customfields.py:119 extras/models/models.py:317 msgid "group name" msgstr "" -#: netbox/extras/models/customfields.py:122 +#: extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "" -#: netbox/extras/models/customfields.py:130 +#: extras/models/customfields.py:130 msgid "required" msgstr "" -#: netbox/extras/models/customfields.py:132 +#: extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." msgstr "" -#: netbox/extras/models/customfields.py:135 +#: extras/models/customfields.py:135 msgid "must be unique" msgstr "" -#: netbox/extras/models/customfields.py:137 +#: extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "" -#: netbox/extras/models/customfields.py:140 +#: extras/models/customfields.py:140 msgid "search weight" msgstr "" -#: netbox/extras/models/customfields.py:143 +#: extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." msgstr "" -#: netbox/extras/models/customfields.py:148 +#: extras/models/customfields.py:148 msgid "filter logic" msgstr "" -#: netbox/extras/models/customfields.py:152 +#: extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire field." msgstr "" -#: netbox/extras/models/customfields.py:155 +#: extras/models/customfields.py:155 msgid "default" msgstr "" -#: netbox/extras/models/customfields.py:159 +#: extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with " "double quotes (e.g. \"Foo\")." msgstr "" -#: netbox/extras/models/customfields.py:166 +#: extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." msgstr "" -#: netbox/extras/models/customfields.py:172 +#: extras/models/customfields.py:172 msgid "display weight" msgstr "" -#: netbox/extras/models/customfields.py:173 +#: extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "" -#: netbox/extras/models/customfields.py:178 +#: extras/models/customfields.py:178 msgid "minimum value" msgstr "" -#: netbox/extras/models/customfields.py:179 +#: extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "" -#: netbox/extras/models/customfields.py:184 +#: extras/models/customfields.py:184 msgid "maximum value" msgstr "" -#: netbox/extras/models/customfields.py:185 +#: extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "" -#: netbox/extras/models/customfields.py:191 +#: extras/models/customfields.py:191 msgid "validation regex" msgstr "" -#: netbox/extras/models/customfields.py:193 +#: extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -8093,261 +7573,259 @@ msgid "" "values to exactly three uppercase letters." msgstr "" -#: netbox/extras/models/customfields.py:201 +#: extras/models/customfields.py:201 msgid "choice set" msgstr "" -#: netbox/extras/models/customfields.py:210 +#: extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" -#: netbox/extras/models/customfields.py:217 +#: extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" -#: netbox/extras/models/customfields.py:221 +#: extras/models/customfields.py:221 msgid "is cloneable" msgstr "" -#: netbox/extras/models/customfields.py:222 +#: extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "" -#: netbox/extras/models/customfields.py:239 +#: extras/models/customfields.py:239 msgid "custom field" msgstr "" -#: netbox/extras/models/customfields.py:240 +#: extras/models/customfields.py:240 msgid "custom fields" msgstr "" -#: netbox/extras/models/customfields.py:329 +#: extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "" -#: netbox/extras/models/customfields.py:336 +#: extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "" -#: netbox/extras/models/customfields.py:338 +#: extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "" -#: netbox/extras/models/customfields.py:348 +#: extras/models/customfields.py:348 msgid "Regular expression validation is supported only for text and URL fields" msgstr "" -#: netbox/extras/models/customfields.py:354 +#: extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "" -#: netbox/extras/models/customfields.py:364 +#: extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "" -#: netbox/extras/models/customfields.py:368 +#: extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "" -#: netbox/extras/models/customfields.py:375 +#: extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "" -#: netbox/extras/models/customfields.py:379 +#: extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "" -#: netbox/extras/models/customfields.py:386 +#: extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" -#: netbox/extras/models/customfields.py:390 +#: extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" -#: netbox/extras/models/customfields.py:469 +#: extras/models/customfields.py:469 msgid "True" msgstr "" -#: netbox/extras/models/customfields.py:470 +#: extras/models/customfields.py:470 msgid "False" msgstr "" -#: netbox/extras/models/customfields.py:560 +#: extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" -#: netbox/extras/models/customfields.py:654 +#: extras/models/customfields.py:654 msgid "Value must be a string." msgstr "" -#: netbox/extras/models/customfields.py:656 +#: extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "" -#: netbox/extras/models/customfields.py:661 +#: extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "" -#: netbox/extras/models/customfields.py:664 -#: netbox/extras/models/customfields.py:679 +#: extras/models/customfields.py:664 extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "" -#: netbox/extras/models/customfields.py:668 -#: netbox/extras/models/customfields.py:683 +#: extras/models/customfields.py:668 extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "" -#: netbox/extras/models/customfields.py:676 +#: extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "" -#: netbox/extras/models/customfields.py:688 +#: extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "" -#: netbox/extras/models/customfields.py:696 +#: extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "" -#: netbox/extras/models/customfields.py:705 +#: extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" -#: netbox/extras/models/customfields.py:712 +#: extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "" -#: netbox/extras/models/customfields.py:722 +#: extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "" -#: netbox/extras/models/customfields.py:731 +#: extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "" -#: netbox/extras/models/customfields.py:737 +#: extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "" -#: netbox/extras/models/customfields.py:741 +#: extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "" -#: netbox/extras/models/customfields.py:744 +#: extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "" -#: netbox/extras/models/customfields.py:763 +#: extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "" -#: netbox/extras/models/customfields.py:775 +#: extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "" -#: netbox/extras/models/customfields.py:782 +#: extras/models/customfields.py:782 msgid "custom field choice set" msgstr "" -#: netbox/extras/models/customfields.py:783 +#: extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "" -#: netbox/extras/models/customfields.py:825 +#: extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "" -#: netbox/extras/models/customfields.py:849 +#: extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " "it." msgstr "" -#: netbox/extras/models/dashboard.py:18 +#: extras/models/dashboard.py:18 msgid "layout" msgstr "" -#: netbox/extras/models/dashboard.py:22 +#: extras/models/dashboard.py:22 msgid "config" msgstr "" -#: netbox/extras/models/dashboard.py:27 +#: extras/models/dashboard.py:27 msgid "dashboard" msgstr "" -#: netbox/extras/models/dashboard.py:28 +#: extras/models/dashboard.py:28 msgid "dashboards" msgstr "" -#: netbox/extras/models/models.py:52 +#: extras/models/models.py:52 msgid "object types" msgstr "" -#: netbox/extras/models/models.py:53 +#: extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "" -#: netbox/extras/models/models.py:67 +#: extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "" -#: netbox/extras/models/models.py:74 +#: extras/models/models.py:74 msgid "conditions" msgstr "" -#: netbox/extras/models/models.py:77 +#: extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "" -#: netbox/extras/models/models.py:85 +#: extras/models/models.py:85 msgid "action type" msgstr "" -#: netbox/extras/models/models.py:104 +#: extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "" -#: netbox/extras/models/models.py:116 +#: extras/models/models.py:116 msgid "event rule" msgstr "" -#: netbox/extras/models/models.py:117 +#: extras/models/models.py:117 msgid "event rules" msgstr "" -#: netbox/extras/models/models.py:166 +#: extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the " "request body." msgstr "" -#: netbox/extras/models/models.py:181 +#: extras/models/models.py:181 msgid "" "The complete list of official content types is available here." msgstr "" -#: netbox/extras/models/models.py:186 +#: extras/models/models.py:186 msgid "additional headers" msgstr "" -#: netbox/extras/models/models.py:189 +#: extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8355,11 +7833,11 @@ msgid "" "as the request body (below)." msgstr "" -#: netbox/extras/models/models.py:195 +#: extras/models/models.py:195 msgid "body template" msgstr "" -#: netbox/extras/models/models.py:198 +#: extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8367,4381 +7845,4259 @@ msgid "" "username, request_id, and data." msgstr "" -#: netbox/extras/models/models.py:204 +#: extras/models/models.py:204 msgid "secret" msgstr "" -#: netbox/extras/models/models.py:208 +#: extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " "the key. The secret is not transmitted in the request." msgstr "" -#: netbox/extras/models/models.py:215 +#: extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" -#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 +#: extras/models/models.py:221 templates/extras/webhook.html:51 msgid "CA File Path" msgstr "" -#: netbox/extras/models/models.py:223 +#: extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to " "use the system defaults." msgstr "" -#: netbox/extras/models/models.py:234 +#: extras/models/models.py:234 msgid "webhook" msgstr "" -#: netbox/extras/models/models.py:235 +#: extras/models/models.py:235 msgid "webhooks" msgstr "" -#: netbox/extras/models/models.py:253 +#: extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" -#: netbox/extras/models/models.py:293 +#: extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "" -#: netbox/extras/models/models.py:305 +#: extras/models/models.py:305 msgid "link text" msgstr "" -#: netbox/extras/models/models.py:306 +#: extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "" -#: netbox/extras/models/models.py:309 +#: extras/models/models.py:309 msgid "link URL" msgstr "" -#: netbox/extras/models/models.py:310 +#: extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "" -#: netbox/extras/models/models.py:320 +#: extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "" -#: netbox/extras/models/models.py:330 +#: extras/models/models.py:330 msgid "new window" msgstr "" -#: netbox/extras/models/models.py:332 +#: extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "" -#: netbox/extras/models/models.py:341 +#: extras/models/models.py:341 msgid "custom link" msgstr "" -#: netbox/extras/models/models.py:342 +#: extras/models/models.py:342 msgid "custom links" msgstr "" -#: netbox/extras/models/models.py:389 +#: extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "" -#: netbox/extras/models/models.py:402 +#: extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." msgstr "" -#: netbox/extras/models/models.py:410 +#: extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "" -#: netbox/extras/models/models.py:413 +#: extras/models/models.py:413 msgid "file extension" msgstr "" -#: netbox/extras/models/models.py:416 +#: extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "" -#: netbox/extras/models/models.py:419 +#: extras/models/models.py:419 msgid "as attachment" msgstr "" -#: netbox/extras/models/models.py:421 +#: extras/models/models.py:421 msgid "Download file as attachment" msgstr "" -#: netbox/extras/models/models.py:430 +#: extras/models/models.py:430 msgid "export template" msgstr "" -#: netbox/extras/models/models.py:431 +#: extras/models/models.py:431 msgid "export templates" msgstr "" -#: netbox/extras/models/models.py:448 +#: extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "" -#: netbox/extras/models/models.py:498 +#: extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "" -#: netbox/extras/models/models.py:530 +#: extras/models/models.py:530 msgid "shared" msgstr "" -#: netbox/extras/models/models.py:543 +#: extras/models/models.py:543 msgid "saved filter" msgstr "" -#: netbox/extras/models/models.py:544 +#: extras/models/models.py:544 msgid "saved filters" msgstr "" -#: netbox/extras/models/models.py:562 +#: extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" -#: netbox/extras/models/models.py:590 +#: extras/models/models.py:590 msgid "image height" msgstr "" -#: netbox/extras/models/models.py:593 +#: extras/models/models.py:593 msgid "image width" msgstr "" -#: netbox/extras/models/models.py:610 +#: extras/models/models.py:610 msgid "image attachment" msgstr "" -#: netbox/extras/models/models.py:611 +#: extras/models/models.py:611 msgid "image attachments" msgstr "" -#: netbox/extras/models/models.py:625 +#: extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" -#: netbox/extras/models/models.py:688 +#: extras/models/models.py:688 msgid "kind" msgstr "" -#: netbox/extras/models/models.py:702 +#: extras/models/models.py:702 msgid "journal entry" msgstr "" -#: netbox/extras/models/models.py:703 +#: extras/models/models.py:703 msgid "journal entries" msgstr "" -#: netbox/extras/models/models.py:718 +#: extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "" -#: netbox/extras/models/models.py:760 +#: extras/models/models.py:760 msgid "bookmark" msgstr "" -#: netbox/extras/models/models.py:761 +#: extras/models/models.py:761 msgid "bookmarks" msgstr "" -#: netbox/extras/models/models.py:774 +#: extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "" -#: netbox/extras/models/notifications.py:43 +#: extras/models/notifications.py:43 msgid "read" msgstr "" -#: netbox/extras/models/notifications.py:66 +#: extras/models/notifications.py:66 msgid "event" msgstr "" -#: netbox/extras/models/notifications.py:84 +#: extras/models/notifications.py:84 msgid "notification" msgstr "" -#: netbox/extras/models/notifications.py:85 +#: extras/models/notifications.py:85 msgid "notifications" msgstr "" -#: netbox/extras/models/notifications.py:99 -#: netbox/extras/models/notifications.py:234 +#: extras/models/notifications.py:99 extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "" -#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 -#: netbox/users/models/users.py:77 +#: extras/models/notifications.py:137 users/models/users.py:58 +#: users/models/users.py:77 msgid "groups" msgstr "" -#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 +#: extras/models/notifications.py:143 users/models/users.py:93 msgid "users" msgstr "" -#: netbox/extras/models/notifications.py:152 +#: extras/models/notifications.py:152 msgid "notification group" msgstr "" -#: netbox/extras/models/notifications.py:153 +#: extras/models/notifications.py:153 msgid "notification groups" msgstr "" -#: netbox/extras/models/notifications.py:217 +#: extras/models/notifications.py:217 msgid "subscription" msgstr "" -#: netbox/extras/models/notifications.py:218 +#: extras/models/notifications.py:218 msgid "subscriptions" msgstr "" -#: netbox/extras/models/scripts.py:42 +#: extras/models/scripts.py:42 msgid "is executable" msgstr "" -#: netbox/extras/models/scripts.py:64 +#: extras/models/scripts.py:64 msgid "script" msgstr "" -#: netbox/extras/models/scripts.py:65 +#: extras/models/scripts.py:65 msgid "scripts" msgstr "" -#: netbox/extras/models/scripts.py:111 +#: extras/models/scripts.py:111 msgid "script module" msgstr "" -#: netbox/extras/models/scripts.py:112 +#: extras/models/scripts.py:112 msgid "script modules" msgstr "" -#: netbox/extras/models/search.py:22 +#: extras/models/search.py:22 msgid "timestamp" msgstr "" -#: netbox/extras/models/search.py:37 +#: extras/models/search.py:37 msgid "field" msgstr "" -#: netbox/extras/models/search.py:45 +#: extras/models/search.py:45 msgid "value" msgstr "" -#: netbox/extras/models/search.py:56 +#: extras/models/search.py:56 msgid "cached value" msgstr "" -#: netbox/extras/models/search.py:57 +#: extras/models/search.py:57 msgid "cached values" msgstr "" -#: netbox/extras/models/staging.py:44 +#: extras/models/staging.py:44 msgid "branch" msgstr "" -#: netbox/extras/models/staging.py:45 +#: extras/models/staging.py:45 msgid "branches" msgstr "" -#: netbox/extras/models/staging.py:97 +#: extras/models/staging.py:97 msgid "staged change" msgstr "" -#: netbox/extras/models/staging.py:98 +#: extras/models/staging.py:98 msgid "staged changes" msgstr "" -#: netbox/extras/models/tags.py:40 +#: extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "" -#: netbox/extras/models/tags.py:49 +#: extras/models/tags.py:49 msgid "tag" msgstr "" -#: netbox/extras/models/tags.py:50 +#: extras/models/tags.py:50 msgid "tags" msgstr "" -#: netbox/extras/models/tags.py:78 +#: extras/models/tags.py:78 msgid "tagged item" msgstr "" -#: netbox/extras/models/tags.py:79 +#: extras/models/tags.py:79 msgid "tagged items" msgstr "" -#: netbox/extras/scripts.py:429 +#: extras/scripts.py:429 msgid "Script Data" msgstr "" -#: netbox/extras/scripts.py:433 +#: extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "" -#: netbox/extras/tables/columns.py:12 -#: netbox/templates/htmx/notifications.html:18 +#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "" -#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 -#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 -#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 -#: netbox/extras/tables/tables.py:446 -#: netbox/templates/extras/customfield.html:105 -#: netbox/templates/extras/eventrule.html:27 -#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 +#: extras/tables/tables.py:62 extras/tables/tables.py:159 +#: extras/tables/tables.py:184 extras/tables/tables.py:250 +#: extras/tables/tables.py:276 extras/tables/tables.py:412 +#: extras/tables/tables.py:446 templates/extras/customfield.html:105 +#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 +#: users/tables.py:80 msgid "Object Types" msgstr "" -#: netbox/extras/tables/tables.py:69 +#: extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "" -#: netbox/extras/tables/tables.py:73 +#: extras/tables/tables.py:73 msgid "Visible" msgstr "" -#: netbox/extras/tables/tables.py:76 +#: extras/tables/tables.py:76 msgid "Editable" msgstr "" -#: netbox/extras/tables/tables.py:82 +#: extras/tables/tables.py:82 msgid "Related Object Type" msgstr "" -#: netbox/extras/tables/tables.py:86 -#: netbox/templates/extras/customfield.html:51 +#: extras/tables/tables.py:86 templates/extras/customfield.html:51 msgid "Choice Set" msgstr "" -#: netbox/extras/tables/tables.py:94 +#: extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "" -#: netbox/extras/tables/tables.py:98 -#: netbox/templates/extras/customfield.html:118 +#: extras/tables/tables.py:98 templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "" -#: netbox/extras/tables/tables.py:101 -#: netbox/templates/extras/customfield.html:122 +#: extras/tables/tables.py:101 templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "" -#: netbox/extras/tables/tables.py:104 +#: extras/tables/tables.py:104 msgid "Validation Regex" msgstr "" -#: netbox/extras/tables/tables.py:137 +#: extras/tables/tables.py:137 msgid "Count" msgstr "" -#: netbox/extras/tables/tables.py:140 +#: extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "" -#: netbox/extras/tables/tables.py:165 -#: netbox/templates/extras/customlink.html:33 +#: extras/tables/tables.py:165 templates/extras/customlink.html:33 msgid "New Window" msgstr "" -#: netbox/extras/tables/tables.py:187 +#: extras/tables/tables.py:187 msgid "As Attachment" msgstr "" -#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 -#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 -#: netbox/templates/dcim/device/render_config.html:22 -#: netbox/templates/extras/configcontext.html:39 -#: netbox/templates/extras/configtemplate.html:31 -#: netbox/templates/extras/exporttemplate.html:45 -#: netbox/templates/generic/bulk_import.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:22 +#: extras/tables/tables.py:195 extras/tables/tables.py:487 +#: extras/tables/tables.py:522 templates/core/datafile.html:24 +#: templates/dcim/device/render_config.html:22 +#: templates/extras/configcontext.html:39 +#: templates/extras/configtemplate.html:31 +#: templates/extras/exporttemplate.html:45 +#: templates/generic/bulk_import.html:35 +#: templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "" -#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 -#: netbox/extras/tables/tables.py:527 +#: extras/tables/tables.py:200 extras/tables/tables.py:499 +#: extras/tables/tables.py:527 msgid "Synced" msgstr "" -#: netbox/extras/tables/tables.py:227 +#: extras/tables/tables.py:227 msgid "Image" msgstr "" -#: netbox/extras/tables/tables.py:232 +#: extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "" -#: netbox/extras/tables/tables.py:339 +#: extras/tables/tables.py:339 msgid "Read" msgstr "" -#: netbox/extras/tables/tables.py:382 +#: extras/tables/tables.py:382 msgid "SSL Validation" msgstr "" -#: netbox/extras/tables/tables.py:418 netbox/templates/extras/eventrule.html:37 +#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 msgid "Event Types" msgstr "" -#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 -#: netbox/templates/dcim/devicerole.html:8 +#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 +#: templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "" -#: netbox/extras/tables/tables.py:587 +#: extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "" -#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 +#: extras/tables/tables.py:606 extras/tables/tables.py:640 msgid "Line" msgstr "" -#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 +#: extras/tables/tables.py:613 extras/tables/tables.py:650 msgid "Level" msgstr "" -#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 +#: extras/tables/tables.py:619 extras/tables/tables.py:659 msgid "Message" msgstr "" -#: netbox/extras/tables/tables.py:643 +#: extras/tables/tables.py:643 msgid "Method" msgstr "" -#: netbox/extras/validators.py:15 +#: extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "" -#: netbox/extras/validators.py:26 +#: extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "" -#: netbox/extras/validators.py:37 +#: extras/validators.py:37 msgid "This field must be empty." msgstr "" -#: netbox/extras/validators.py:52 +#: extras/validators.py:52 msgid "This field must not be empty." msgstr "" -#: netbox/extras/validators.py:94 +#: extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "" -#: netbox/extras/validators.py:119 +#: extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "" -#: netbox/extras/validators.py:133 +#: extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "" -#: netbox/extras/validators.py:150 +#: extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "" -#: netbox/extras/views.py:960 +#: extras/views.py:960 msgid "Your dashboard has been reset." msgstr "" -#: netbox/extras/views.py:1006 +#: extras/views.py:1006 msgid "Added widget: " msgstr "" -#: netbox/extras/views.py:1047 +#: extras/views.py:1047 msgid "Updated widget: " msgstr "" -#: netbox/extras/views.py:1083 +#: extras/views.py:1083 msgid "Deleted widget: " msgstr "" -#: netbox/extras/views.py:1085 +#: extras/views.py:1085 msgid "Error deleting widget: " msgstr "" -#: netbox/extras/views.py:1172 +#: extras/views.py:1172 msgid "Unable to run script: RQ worker process not running." msgstr "" -#: netbox/ipam/api/field_serializers.py:17 +#: ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "" -#: netbox/ipam/api/field_serializers.py:24 +#: ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "" -#: netbox/ipam/api/field_serializers.py:37 +#: ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" -#: netbox/ipam/api/field_serializers.py:44 +#: ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "" -#: netbox/ipam/api/views.py:358 +#: ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" -#: netbox/ipam/choices.py:30 +#: ipam/choices.py:30 msgid "Container" msgstr "" -#: netbox/ipam/choices.py:72 +#: ipam/choices.py:72 msgid "DHCP" msgstr "" -#: netbox/ipam/choices.py:73 +#: ipam/choices.py:73 msgid "SLAAC" msgstr "" -#: netbox/ipam/choices.py:89 +#: ipam/choices.py:89 msgid "Loopback" msgstr "" -#: netbox/ipam/choices.py:91 +#: ipam/choices.py:91 msgid "Anycast" msgstr "" -#: netbox/ipam/choices.py:115 +#: ipam/choices.py:115 msgid "Standard" msgstr "" -#: netbox/ipam/choices.py:120 +#: ipam/choices.py:120 msgid "CheckPoint" msgstr "" -#: netbox/ipam/choices.py:123 +#: ipam/choices.py:123 msgid "Cisco" msgstr "" -#: netbox/ipam/choices.py:137 +#: ipam/choices.py:137 msgid "Plaintext" msgstr "" -#: netbox/ipam/fields.py:36 +#: ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "" -#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 +#: ipam/filtersets.py:48 vpn/filtersets.py:304 msgid "Import target" msgstr "" -#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 +#: ipam/filtersets.py:54 vpn/filtersets.py:310 msgid "Import target (name)" msgstr "" -#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 +#: ipam/filtersets.py:59 vpn/filtersets.py:315 msgid "Export target" msgstr "" -#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 +#: ipam/filtersets.py:65 vpn/filtersets.py:321 msgid "Export target (name)" msgstr "" -#: netbox/ipam/filtersets.py:86 +#: ipam/filtersets.py:86 msgid "Importing VRF" msgstr "" -#: netbox/ipam/filtersets.py:92 +#: ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "" -#: netbox/ipam/filtersets.py:97 +#: ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "" -#: netbox/ipam/filtersets.py:103 +#: ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "" -#: netbox/ipam/filtersets.py:108 +#: ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "" -#: netbox/ipam/filtersets.py:114 +#: ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "" -#: netbox/ipam/filtersets.py:119 +#: ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "" -#: netbox/ipam/filtersets.py:125 +#: ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 -#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 -#: netbox/templates/ipam/prefix.html:12 +#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 +#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 msgid "Prefix" msgstr "" -#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "" -#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "" -#: netbox/ipam/filtersets.py:285 +#: ipam/filtersets.py:285 msgid "Within prefix" msgstr "" -#: netbox/ipam/filtersets.py:289 +#: ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "" -#: netbox/ipam/filtersets.py:293 +#: ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 -#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 -#: netbox/ipam/forms/filtersets.py:331 +#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 +#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: ipam/filtersets.py:373 vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: ipam/filtersets.py:377 vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:463 -#: netbox/templates/tenancy/contact.html:53 -#: netbox/tenancy/forms/bulk_edit.py:113 +#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 +#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 +#: tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "" -#: netbox/ipam/filtersets.py:479 +#: ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: ipam/filtersets.py:507 ipam/filtersets.py:563 msgid "Parent prefix" msgstr "" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 +#: vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 -#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 +#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 +#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 +#: vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 -#: netbox/vpn/filtersets.py:396 +#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 msgid "Interface (name)" msgstr "" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 -#: netbox/vpn/filtersets.py:407 +#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: ipam/filtersets.py:643 vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "" -#: netbox/ipam/filtersets.py:648 +#: ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "" -#: netbox/ipam/filtersets.py:652 +#: ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "" -#: netbox/ipam/filtersets.py:656 +#: ipam/filtersets.py:656 msgid "Is assigned" msgstr "" -#: netbox/ipam/filtersets.py:668 +#: ipam/filtersets.py:668 msgid "Service (ID)" msgstr "" -#: netbox/ipam/filtersets.py:673 +#: ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "" -#: netbox/ipam/filtersets.py:1046 +#: ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "" -#: netbox/ipam/filtersets.py:1136 +#: ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: ipam/filtersets.py:1142 ipam/models/ip.py:788 msgid "IP address" msgstr "" -#: netbox/ipam/filtersets.py:1167 +#: ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1172 +#: ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "" -#: netbox/ipam/formfields.py:14 +#: ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "" -#: netbox/ipam/formfields.py:32 +#: ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "" -#: netbox/ipam/formfields.py:37 +#: ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "" -#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 +#: ipam/formfields.py:39 ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "" -#: netbox/ipam/formfields.py:44 +#: ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "" -#: netbox/ipam/formfields.py:56 +#: ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "" -#: netbox/ipam/forms/bulk_create.py:13 +#: ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:50 +#: ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:88 +#: ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 -#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 -#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 -#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 -#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 -#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 -#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 -#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 -#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 -#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 -#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 -#: netbox/templates/ipam/rir.html:19 +#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 +#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 +#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 +#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 +#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 +#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 +#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 ipam/models/asns.py:103 +#: ipam/models/ip.py:71 ipam/models/ip.py:90 ipam/tables/asn.py:20 +#: ipam/tables/asn.py:45 templates/ipam/aggregate.html:18 +#: templates/ipam/asn.html:27 templates/ipam/asnrange.html:19 +#: templates/ipam/rir.html:19 msgid "RIR" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:171 +#: ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:586 -#: netbox/ipam/forms/model_forms.py:633 netbox/ipam/tables/ip.py:251 -#: netbox/templates/ipam/vlan_edit.html:37 -#: netbox/templates/ipam/vlangroup.html:27 +#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 +#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 +#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 -#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 -#: netbox/ipam/models/vlans.py:234 netbox/ipam/tables/ip.py:255 -#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 -#: netbox/templates/ipam/vlan/base.html:6 -#: netbox/templates/ipam/vlan_edit.html:10 -#: netbox/templates/wireless/wirelesslan.html:30 -#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 -#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 -#: netbox/wireless/forms/bulk_edit.py:55 -#: netbox/wireless/forms/bulk_import.py:48 -#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 +#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 +#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 templates/ipam/prefix.html:60 +#: templates/ipam/vlan.html:12 templates/ipam/vlan/base.html:6 +#: templates/ipam/vlan_edit.html:10 templates/wireless/wirelesslan.html:30 +#: vpn/forms/bulk_import.py:304 vpn/forms/filtersets.py:284 +#: vpn/forms/model_forms.py:433 vpn/forms/model_forms.py:452 +#: wireless/forms/bulk_edit.py:55 wireless/forms/bulk_import.py:48 +#: wireless/forms/model_forms.py:48 wireless/models.py:102 msgid "VLAN" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:245 +#: ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 -#: netbox/templates/ipam/prefix.html:85 +#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 +#: templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 -#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 -#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 +#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 +#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 +#: ipam/models/ip.py:272 ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 +#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 +#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 msgid "DNS name" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 -#: netbox/ipam/forms/bulk_import.py:394 netbox/ipam/forms/bulk_import.py:469 -#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/filtersets.py:390 -#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 -#: netbox/templates/ipam/service.html:32 -#: netbox/templates/ipam/servicetemplate.html:19 +#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 +#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 +#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 +#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 +#: templates/ipam/inc/panels/fhrp_groups.html:24 templates/ipam/service.html:32 +#: templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 -#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 +#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 +#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 -#: netbox/wireless/forms/bulk_edit.py:68 netbox/wireless/forms/bulk_edit.py:115 -#: netbox/wireless/forms/bulk_import.py:62 -#: netbox/wireless/forms/bulk_import.py:65 -#: netbox/wireless/forms/bulk_import.py:104 -#: netbox/wireless/forms/bulk_import.py:107 -#: netbox/wireless/forms/filtersets.py:54 -#: netbox/wireless/forms/filtersets.py:88 +#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 +#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 +#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 +#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 +#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 +#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 -#: netbox/ipam/forms/model_forms.py:474 netbox/netbox/navigation/menu.py:386 -#: netbox/templates/ipam/fhrpgroup.html:49 -#: netbox/templates/wireless/inc/authentication_attrs.html:5 -#: netbox/wireless/forms/bulk_edit.py:91 netbox/wireless/forms/bulk_edit.py:149 -#: netbox/wireless/forms/filtersets.py:36 -#: netbox/wireless/forms/filtersets.py:76 -#: netbox/wireless/forms/model_forms.py:55 -#: netbox/wireless/forms/model_forms.py:171 +#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 +#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 +#: templates/ipam/fhrpgroup.html:49 +#: templates/wireless/inc/authentication_attrs.html:5 +#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 +#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 +#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:575 +#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 msgid "Scope type" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 -#: netbox/ipam/forms/model_forms.py:578 netbox/ipam/forms/model_forms.py:588 -#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 +#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 +#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 +#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 +#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:525 +#: ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:659 -#: netbox/ipam/forms/model_forms.py:691 netbox/ipam/tables/services.py:19 -#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 -#: netbox/templates/ipam/servicetemplate.html:23 +#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 +#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 +#: ipam/tables/services.py:49 templates/ipam/service.html:36 +#: templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "" -#: netbox/ipam/forms/bulk_import.py:48 +#: ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "" -#: netbox/ipam/forms/bulk_import.py:54 +#: ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "" -#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 -#: netbox/ipam/forms/bulk_import.py:132 +#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 +#: ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "" -#: netbox/ipam/forms/bulk_import.py:182 +#: ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "" -#: netbox/ipam/forms/bulk_import.py:308 +#: ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "" -#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:488 -#: netbox/ipam/forms/model_forms.py:685 netbox/virtualization/filtersets.py:288 -#: netbox/virtualization/filtersets.py:327 -#: netbox/virtualization/forms/bulk_edit.py:200 -#: netbox/virtualization/forms/bulk_edit.py:326 -#: netbox/virtualization/forms/bulk_import.py:146 -#: netbox/virtualization/forms/bulk_import.py:207 -#: netbox/virtualization/forms/filtersets.py:212 -#: netbox/virtualization/forms/filtersets.py:248 -#: netbox/virtualization/forms/model_forms.py:288 -#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 +#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 +#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 +#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 +#: virtualization/forms/bulk_edit.py:326 +#: virtualization/forms/bulk_import.py:146 +#: virtualization/forms/bulk_import.py:207 +#: virtualization/forms/filtersets.py:212 +#: virtualization/forms/filtersets.py:248 +#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 +#: vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "" -#: netbox/ipam/forms/bulk_import.py:315 +#: ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "" -#: netbox/ipam/forms/bulk_import.py:325 +#: ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "" -#: netbox/ipam/forms/bulk_import.py:326 +#: ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "" -#: netbox/ipam/forms/bulk_import.py:365 +#: ipam/forms/bulk_import.py:365 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:369 +#: ipam/forms/bulk_import.py:369 msgid "No interface specified; cannot set as primary IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:398 +#: ipam/forms/bulk_import.py:398 msgid "Auth type" msgstr "" -#: netbox/ipam/forms/bulk_import.py:413 +#: ipam/forms/bulk_import.py:413 msgid "Scope type (app & model)" msgstr "" -#: netbox/ipam/forms/bulk_import.py:440 +#: ipam/forms/bulk_import.py:440 msgid "Assigned VLAN group" msgstr "" -#: netbox/ipam/forms/bulk_import.py:471 netbox/ipam/forms/bulk_import.py:497 +#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 msgid "IP protocol" msgstr "" -#: netbox/ipam/forms/bulk_import.py:485 +#: ipam/forms/bulk_import.py:485 msgid "Required if not assigned to a VM" msgstr "" -#: netbox/ipam/forms/bulk_import.py:492 +#: ipam/forms/bulk_import.py:492 msgid "Required if not assigned to a device" msgstr "" -#: netbox/ipam/forms/bulk_import.py:517 +#: ipam/forms/bulk_import.py:517 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "" -#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 -#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 +#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 +#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 -#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 +#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 +#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 -#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 +#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 +#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:73 +#: ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:78 +#: ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 -#: netbox/templates/ipam/rir.html:30 +#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 msgid "Private" msgstr "" -#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 -#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 +#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 +#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 msgid "Address family" msgstr "" -#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 +#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 msgid "Range" msgstr "" -#: netbox/ipam/forms/filtersets.py:128 +#: ipam/forms/filtersets.py:128 msgid "Start" msgstr "" -#: netbox/ipam/forms/filtersets.py:132 +#: ipam/forms/filtersets.py:132 msgid "End" msgstr "" -#: netbox/ipam/forms/filtersets.py:186 +#: ipam/forms/filtersets.py:186 msgid "Search within" msgstr "" -#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 +#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:311 +#: ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "" -#: netbox/ipam/forms/filtersets.py:321 +#: ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "" -#: netbox/ipam/forms/filtersets.py:347 +#: ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "" -#: netbox/ipam/forms/filtersets.py:352 +#: ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "" -#: netbox/ipam/forms/filtersets.py:366 +#: ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "" -#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 +#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "" -#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:235 -#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 -#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 -#: netbox/netbox/navigation/menu.py:195 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 +#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 +#: netbox/navigation/menu.py:195 msgid "VLANs" msgstr "" -#: netbox/ipam/forms/filtersets.py:457 +#: ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "" -#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:176 -#: netbox/templates/ipam/vlan.html:31 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 +#: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "" -#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:320 -#: netbox/ipam/forms/model_forms.py:713 netbox/ipam/forms/model_forms.py:739 -#: netbox/ipam/tables/vlans.py:195 -#: netbox/templates/virtualization/virtualdisk.html:21 -#: netbox/templates/virtualization/virtualmachine.html:12 -#: netbox/templates/virtualization/vminterface.html:21 -#: netbox/templates/vpn/tunneltermination.html:25 -#: netbox/virtualization/forms/filtersets.py:197 -#: netbox/virtualization/forms/filtersets.py:242 -#: netbox/virtualization/forms/model_forms.py:220 -#: netbox/virtualization/tables/virtualmachines.py:135 -#: netbox/virtualization/tables/virtualmachines.py:190 netbox/vpn/choices.py:45 -#: netbox/vpn/forms/filtersets.py:293 netbox/vpn/forms/model_forms.py:160 -#: netbox/vpn/forms/model_forms.py:171 netbox/vpn/forms/model_forms.py:273 -#: netbox/vpn/forms/model_forms.py:454 +#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 +#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 +#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 +#: templates/virtualization/virtualmachine.html:12 +#: templates/virtualization/vminterface.html:21 +#: templates/vpn/tunneltermination.html:25 +#: virtualization/forms/filtersets.py:197 +#: virtualization/forms/filtersets.py:242 +#: virtualization/forms/model_forms.py:220 +#: virtualization/tables/virtualmachines.py:135 +#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 +#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 +#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 +#: vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "" -#: netbox/ipam/forms/model_forms.py:80 -#: netbox/templates/ipam/routetarget.html:10 +#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "" -#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 -#: netbox/templates/ipam/aggregate.html:11 netbox/templates/ipam/prefix.html:38 +#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 +#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "" -#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 +#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "" -#: netbox/ipam/forms/model_forms.py:231 +#: ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "" -#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 +#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 msgid "IP Range" msgstr "" -#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:321 -#: netbox/ipam/forms/model_forms.py:473 netbox/templates/ipam/fhrpgroup.html:19 +#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 +#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "" -#: netbox/ipam/forms/model_forms.py:310 +#: ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "" -#: netbox/ipam/forms/model_forms.py:325 +#: ipam/forms/model_forms.py:325 msgid "NAT IP (Inside)" msgstr "" -#: netbox/ipam/forms/model_forms.py:384 +#: ipam/forms/model_forms.py:384 msgid "An IP address can only be assigned to a single object." msgstr "" -#: netbox/ipam/forms/model_forms.py:390 netbox/ipam/models/ip.py:897 +#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 msgid "" "Cannot reassign IP address while it is designated as the primary IP for the " "parent object" msgstr "" -#: netbox/ipam/forms/model_forms.py:400 +#: ipam/forms/model_forms.py:400 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" -#: netbox/ipam/forms/model_forms.py:475 +#: ipam/forms/model_forms.py:475 msgid "Virtual IP Address" msgstr "" -#: netbox/ipam/forms/model_forms.py:560 +#: ipam/forms/model_forms.py:560 msgid "Assignment already exists" msgstr "" -#: netbox/ipam/forms/model_forms.py:569 netbox/templates/ipam/vlangroup.html:42 +#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "" -#: netbox/ipam/forms/model_forms.py:587 +#: ipam/forms/model_forms.py:587 msgid "Child VLANs" msgstr "" -#: netbox/ipam/forms/model_forms.py:664 netbox/ipam/forms/model_forms.py:696 +#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." msgstr "" -#: netbox/ipam/forms/model_forms.py:669 -#: netbox/templates/ipam/servicetemplate.html:12 +#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "" -#: netbox/ipam/forms/model_forms.py:716 +#: ipam/forms/model_forms.py:716 msgid "Port(s)" msgstr "" -#: netbox/ipam/forms/model_forms.py:717 netbox/ipam/forms/model_forms.py:745 -#: netbox/templates/ipam/service.html:21 +#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 +#: templates/ipam/service.html:21 msgid "Service" msgstr "" -#: netbox/ipam/forms/model_forms.py:730 +#: ipam/forms/model_forms.py:730 msgid "Service template" msgstr "" -#: netbox/ipam/forms/model_forms.py:742 +#: ipam/forms/model_forms.py:742 msgid "From Template" msgstr "" -#: netbox/ipam/forms/model_forms.py:743 +#: ipam/forms/model_forms.py:743 msgid "Custom" msgstr "" -#: netbox/ipam/forms/model_forms.py:773 +#: ipam/forms/model_forms.py:773 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" -#: netbox/ipam/models/asns.py:34 +#: ipam/models/asns.py:34 msgid "start" msgstr "" -#: netbox/ipam/models/asns.py:51 +#: ipam/models/asns.py:51 msgid "ASN range" msgstr "" -#: netbox/ipam/models/asns.py:52 +#: ipam/models/asns.py:52 msgid "ASN ranges" msgstr "" -#: netbox/ipam/models/asns.py:72 +#: ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" -#: netbox/ipam/models/asns.py:104 +#: ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" -#: netbox/ipam/models/asns.py:109 +#: ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "" -#: netbox/ipam/models/fhrp.py:22 +#: ipam/models/fhrp.py:22 msgid "group ID" msgstr "" -#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 +#: ipam/models/fhrp.py:30 ipam/models/services.py:22 msgid "protocol" msgstr "" -#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 +#: ipam/models/fhrp.py:38 wireless/models.py:28 msgid "authentication type" msgstr "" -#: netbox/ipam/models/fhrp.py:43 +#: ipam/models/fhrp.py:43 msgid "authentication key" msgstr "" -#: netbox/ipam/models/fhrp.py:56 +#: ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "" -#: netbox/ipam/models/fhrp.py:57 +#: ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "" -#: netbox/ipam/models/fhrp.py:113 +#: ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "" -#: netbox/ipam/models/fhrp.py:114 +#: ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "" -#: netbox/ipam/models/ip.py:65 +#: ipam/models/ip.py:65 msgid "private" msgstr "" -#: netbox/ipam/models/ip.py:66 +#: ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "" -#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 +#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 msgid "RIRs" msgstr "" -#: netbox/ipam/models/ip.py:84 +#: ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "" -#: netbox/ipam/models/ip.py:91 +#: ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "" -#: netbox/ipam/models/ip.py:101 +#: ipam/models/ip.py:101 msgid "date added" msgstr "" -#: netbox/ipam/models/ip.py:115 +#: ipam/models/ip.py:115 msgid "aggregate" msgstr "" -#: netbox/ipam/models/ip.py:116 +#: ipam/models/ip.py:116 msgid "aggregates" msgstr "" -#: netbox/ipam/models/ip.py:132 +#: ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:144 +#: ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " "aggregate ({aggregate})." msgstr "" -#: netbox/ipam/models/ip.py:158 +#: ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " "({aggregate})." msgstr "" -#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 -#: netbox/vpn/models/tunnels.py:114 +#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 msgid "role" msgstr "" -#: netbox/ipam/models/ip.py:201 +#: ipam/models/ip.py:201 msgid "roles" msgstr "" -#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 +#: ipam/models/ip.py:217 ipam/models/ip.py:293 msgid "prefix" msgstr "" -#: netbox/ipam/models/ip.py:218 +#: ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "" -#: netbox/ipam/models/ip.py:254 +#: ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "" -#: netbox/ipam/models/ip.py:262 +#: ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "" -#: netbox/ipam/models/ip.py:265 +#: ipam/models/ip.py:265 msgid "is a pool" msgstr "" -#: netbox/ipam/models/ip.py:267 +#: ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" -#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 +#: ipam/models/ip.py:270 ipam/models/ip.py:537 msgid "mark utilized" msgstr "" -#: netbox/ipam/models/ip.py:294 +#: ipam/models/ip.py:294 msgid "prefixes" msgstr "" -#: netbox/ipam/models/ip.py:317 +#: ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 +#: ipam/models/ip.py:324 ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "" -#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 +#: ipam/models/ip.py:324 ipam/models/ip.py:874 msgid "global table" msgstr "" -#: netbox/ipam/models/ip.py:326 +#: ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "" -#: netbox/ipam/models/ip.py:495 +#: ipam/models/ip.py:495 msgid "start address" msgstr "" -#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 -#: netbox/ipam/models/ip.py:712 +#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "" -#: netbox/ipam/models/ip.py:499 +#: ipam/models/ip.py:499 msgid "end address" msgstr "" -#: netbox/ipam/models/ip.py:526 +#: ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "" -#: netbox/ipam/models/ip.py:534 +#: ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "" -#: netbox/ipam/models/ip.py:548 +#: ipam/models/ip.py:548 msgid "IP range" msgstr "" -#: netbox/ipam/models/ip.py:549 +#: ipam/models/ip.py:549 msgid "IP ranges" msgstr "" -#: netbox/ipam/models/ip.py:565 +#: ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "" -#: netbox/ipam/models/ip.py:571 +#: ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "" -#: netbox/ipam/models/ip.py:578 +#: ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" -#: netbox/ipam/models/ip.py:590 +#: ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" -#: netbox/ipam/models/ip.py:599 +#: ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" -#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 +#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 msgid "address" msgstr "" -#: netbox/ipam/models/ip.py:734 +#: ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "" -#: netbox/ipam/models/ip.py:741 +#: ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "" -#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 +#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "" -#: netbox/ipam/models/ip.py:766 +#: ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "" -#: netbox/ipam/models/ip.py:773 +#: ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "" -#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 +#: ipam/models/ip.py:789 ipam/models/services.py:94 msgid "IP addresses" msgstr "" -#: netbox/ipam/models/ip.py:845 +#: ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:851 +#: ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" -#: netbox/ipam/models/ip.py:862 +#: ipam/models/ip.py:862 #, python-brace-format msgid "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" -#: netbox/ipam/models/ip.py:876 +#: ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "" -#: netbox/ipam/models/ip.py:903 +#: ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "" -#: netbox/ipam/models/services.py:33 +#: ipam/models/services.py:33 msgid "port numbers" msgstr "" -#: netbox/ipam/models/services.py:59 +#: ipam/models/services.py:59 msgid "service template" msgstr "" -#: netbox/ipam/models/services.py:60 +#: ipam/models/services.py:60 msgid "service templates" msgstr "" -#: netbox/ipam/models/services.py:95 +#: ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" -#: netbox/ipam/models/services.py:102 +#: ipam/models/services.py:102 msgid "service" msgstr "" -#: netbox/ipam/models/services.py:103 +#: ipam/models/services.py:103 msgid "services" msgstr "" -#: netbox/ipam/models/services.py:117 +#: ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" -#: netbox/ipam/models/services.py:119 +#: ipam/models/services.py:119 msgid "A service must be associated with either a device or a virtual machine." msgstr "" -#: netbox/ipam/models/vlans.py:85 +#: ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "" -#: netbox/ipam/models/vlans.py:95 +#: ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "" -#: netbox/ipam/models/vlans.py:97 +#: ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "" -#: netbox/ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "" -#: netbox/ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" - -#: netbox/ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" -#: netbox/ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "" -#: netbox/ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "" -#: netbox/ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "" -#: netbox/ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "" -#: netbox/ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " "site {site}." msgstr "" -#: netbox/ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" -#: netbox/ipam/models/vrfs.py:30 +#: ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "" -#: netbox/ipam/models/vrfs.py:31 +#: ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "" -#: netbox/ipam/models/vrfs.py:42 +#: ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "" -#: netbox/ipam/models/vrfs.py:43 +#: ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "" -#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 -#: netbox/netbox/navigation/menu.py:188 +#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 +#: netbox/navigation/menu.py:188 msgid "VRFs" msgstr "" -#: netbox/ipam/models/vrfs.py:82 +#: ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "" -#: netbox/ipam/models/vrfs.py:94 +#: ipam/models/vrfs.py:94 msgid "route target" msgstr "" -#: netbox/ipam/models/vrfs.py:95 +#: ipam/models/vrfs.py:95 msgid "route targets" msgstr "" -#: netbox/ipam/tables/asn.py:52 +#: ipam/tables/asn.py:52 msgid "ASDOT" msgstr "" -#: netbox/ipam/tables/asn.py:57 +#: ipam/tables/asn.py:57 msgid "Site Count" msgstr "" -#: netbox/ipam/tables/asn.py:62 +#: ipam/tables/asn.py:62 msgid "Provider Count" msgstr "" -#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 -#: netbox/netbox/navigation/menu.py:181 +#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 +#: netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "" -#: netbox/ipam/tables/ip.py:125 +#: ipam/tables/ip.py:125 msgid "Added" msgstr "" -#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 -#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 -#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 -#: netbox/templates/ipam/vlan.html:84 +#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 +#: ipam/views.py:346 netbox/navigation/menu.py:165 +#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "" -#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 -#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 -#: netbox/templates/dcim/device.html:260 -#: netbox/templates/ipam/aggregate.html:24 -#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 +#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 +#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 +#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 +#: templates/ipam/prefix.html:106 msgid "Utilization" msgstr "" -#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 +#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "" -#: netbox/ipam/tables/ip.py:221 +#: ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "" -#: netbox/ipam/tables/ip.py:225 +#: ipam/tables/ip.py:225 msgid "Depth" msgstr "" -#: netbox/ipam/tables/ip.py:262 +#: ipam/tables/ip.py:262 msgid "Pool" msgstr "" -#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 +#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "" -#: netbox/ipam/tables/ip.py:304 +#: ipam/tables/ip.py:304 msgid "Start address" msgstr "" -#: netbox/ipam/tables/ip.py:383 +#: ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "" -#: netbox/ipam/tables/ip.py:388 +#: ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "" -#: netbox/ipam/tables/ip.py:393 +#: ipam/tables/ip.py:393 msgid "Assigned" msgstr "" -#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 -#: netbox/vpn/forms/filtersets.py:240 +#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 +#: vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "" -#: netbox/ipam/tables/vlans.py:68 +#: ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "" -#: netbox/ipam/tables/vlans.py:76 +#: ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "" -#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 -#: netbox/templates/dcim/inc/interface_vlans_table.html:4 +#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 +#: templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "" -#: netbox/ipam/tables/vrfs.py:30 +#: ipam/tables/vrfs.py:30 msgid "RD" msgstr "" -#: netbox/ipam/tables/vrfs.py:33 +#: ipam/tables/vrfs.py:33 msgid "Unique" msgstr "" -#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 +#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "" -#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 +#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "" -#: netbox/ipam/validators.py:9 +#: ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "" -#: netbox/ipam/validators.py:16 +#: ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "" -#: netbox/ipam/validators.py:24 +#: ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "" -#: netbox/ipam/validators.py:33 +#: ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" msgstr "" -#: netbox/ipam/views.py:533 +#: ipam/views.py:533 msgid "Child Prefixes" msgstr "" -#: netbox/ipam/views.py:569 +#: ipam/views.py:569 msgid "Child Ranges" msgstr "" -#: netbox/ipam/views.py:898 +#: ipam/views.py:898 msgid "Related IPs" msgstr "" -#: netbox/ipam/views.py:1127 +#: ipam/views.py:1127 msgid "Device Interfaces" msgstr "" -#: netbox/ipam/views.py:1145 +#: ipam/views.py:1145 msgid "VM Interfaces" msgstr "" -#: netbox/netbox/api/fields.py:65 +#: netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "" -#: netbox/netbox/api/fields.py:70 +#: netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." msgstr "" -#: netbox/netbox/api/fields.py:91 +#: netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "" -#: netbox/netbox/api/fields.py:104 +#: netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "" -#: netbox/netbox/api/fields.py:105 +#: netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" -#: netbox/netbox/api/fields.py:167 +#: netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "" -#: netbox/netbox/api/fields.py:169 +#: netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "" -#: netbox/netbox/api/serializers/fields.py:40 +#: netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "" -#: netbox/netbox/authentication/__init__.py:138 +#: netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "" -#: netbox/netbox/choices.py:49 +#: netbox/choices.py:49 msgid "Dark Red" msgstr "" -#: netbox/netbox/choices.py:52 +#: netbox/choices.py:52 msgid "Rose" msgstr "" -#: netbox/netbox/choices.py:53 +#: netbox/choices.py:53 msgid "Fuchsia" msgstr "" -#: netbox/netbox/choices.py:55 +#: netbox/choices.py:55 msgid "Dark Purple" msgstr "" -#: netbox/netbox/choices.py:58 +#: netbox/choices.py:58 msgid "Light Blue" msgstr "" -#: netbox/netbox/choices.py:61 +#: netbox/choices.py:61 msgid "Aqua" msgstr "" -#: netbox/netbox/choices.py:62 +#: netbox/choices.py:62 msgid "Dark Green" msgstr "" -#: netbox/netbox/choices.py:64 +#: netbox/choices.py:64 msgid "Light Green" msgstr "" -#: netbox/netbox/choices.py:65 +#: netbox/choices.py:65 msgid "Lime" msgstr "" -#: netbox/netbox/choices.py:67 +#: netbox/choices.py:67 msgid "Amber" msgstr "" -#: netbox/netbox/choices.py:69 +#: netbox/choices.py:69 msgid "Dark Orange" msgstr "" -#: netbox/netbox/choices.py:70 +#: netbox/choices.py:70 msgid "Brown" msgstr "" -#: netbox/netbox/choices.py:71 +#: netbox/choices.py:71 msgid "Light Grey" msgstr "" -#: netbox/netbox/choices.py:72 +#: netbox/choices.py:72 msgid "Grey" msgstr "" -#: netbox/netbox/choices.py:73 +#: netbox/choices.py:73 msgid "Dark Grey" msgstr "" -#: netbox/netbox/choices.py:128 +#: netbox/choices.py:128 msgid "Direct" msgstr "" -#: netbox/netbox/choices.py:129 +#: netbox/choices.py:129 msgid "Upload" msgstr "" -#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 +#: netbox/choices.py:141 netbox/choices.py:155 msgid "Auto-detect" msgstr "" -#: netbox/netbox/choices.py:156 +#: netbox/choices.py:156 msgid "Comma" msgstr "" -#: netbox/netbox/choices.py:157 +#: netbox/choices.py:157 msgid "Semicolon" msgstr "" -#: netbox/netbox/choices.py:158 +#: netbox/choices.py:158 msgid "Tab" msgstr "" -#: netbox/netbox/config/__init__.py:67 +#: netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "" -#: netbox/netbox/config/parameters.py:22 -#: netbox/templates/core/inc/config_data.html:62 +#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "" -#: netbox/netbox/config/parameters.py:24 +#: netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "" -#: netbox/netbox/config/parameters.py:33 -#: netbox/templates/core/inc/config_data.html:66 +#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "" -#: netbox/netbox/config/parameters.py:35 +#: netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "" -#: netbox/netbox/config/parameters.py:44 -#: netbox/templates/core/inc/config_data.html:70 +#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "" -#: netbox/netbox/config/parameters.py:46 +#: netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "" -#: netbox/netbox/config/parameters.py:55 -#: netbox/templates/core/inc/config_data.html:74 +#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "" -#: netbox/netbox/config/parameters.py:57 +#: netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "" -#: netbox/netbox/config/parameters.py:68 +#: netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "" -#: netbox/netbox/config/parameters.py:70 +#: netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "" -#: netbox/netbox/config/parameters.py:75 -#: netbox/templates/core/inc/config_data.html:44 +#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "" -#: netbox/netbox/config/parameters.py:77 +#: netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "" -#: netbox/netbox/config/parameters.py:84 +#: netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "" -#: netbox/netbox/config/parameters.py:86 +#: netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "" -#: netbox/netbox/config/parameters.py:91 +#: netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "" -#: netbox/netbox/config/parameters.py:93 +#: netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "" -#: netbox/netbox/config/parameters.py:100 +#: netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "" -#: netbox/netbox/config/parameters.py:102 +#: netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "" -#: netbox/netbox/config/parameters.py:107 +#: netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "" -#: netbox/netbox/config/parameters.py:109 +#: netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "" -#: netbox/netbox/config/parameters.py:114 +#: netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "" -#: netbox/netbox/config/parameters.py:116 +#: netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "" -#: netbox/netbox/config/parameters.py:123 -#: netbox/templates/core/inc/config_data.html:53 +#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "" -#: netbox/netbox/config/parameters.py:128 +#: netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" -#: netbox/netbox/config/parameters.py:136 +#: netbox/config/parameters.py:136 msgid "Default page size" msgstr "" -#: netbox/netbox/config/parameters.py:142 +#: netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "" -#: netbox/netbox/config/parameters.py:150 -#: netbox/templates/core/inc/config_data.html:96 +#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "" -#: netbox/netbox/config/parameters.py:152 +#: netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "" -#: netbox/netbox/config/parameters.py:160 -#: netbox/templates/core/inc/config_data.html:104 +#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "" -#: netbox/netbox/config/parameters.py:162 +#: netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "" -#: netbox/netbox/config/parameters.py:172 -#: netbox/templates/core/inc/config_data.html:117 +#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "" -#: netbox/netbox/config/parameters.py:174 +#: netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "" -#: netbox/netbox/config/parameters.py:181 -#: netbox/templates/core/inc/config_data.html:129 +#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "" -#: netbox/netbox/config/parameters.py:183 +#: netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "" -#: netbox/netbox/config/parameters.py:188 -#: netbox/templates/core/inc/config_data.html:133 +#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "" -#: netbox/netbox/config/parameters.py:190 +#: netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "" -#: netbox/netbox/config/parameters.py:195 -#: netbox/templates/core/inc/config_data.html:137 +#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "" -#: netbox/netbox/config/parameters.py:197 +#: netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" -#: netbox/netbox/config/parameters.py:202 +#: netbox/config/parameters.py:202 msgid "Job result retention" msgstr "" -#: netbox/netbox/config/parameters.py:204 +#: netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" -#: netbox/netbox/config/parameters.py:209 -#: netbox/templates/core/inc/config_data.html:145 +#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "" -#: netbox/netbox/config/parameters.py:211 +#: netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "" -#: netbox/netbox/forms/__init__.py:12 +#: netbox/forms/__init__.py:12 msgid "Partial match" msgstr "" -#: netbox/netbox/forms/__init__.py:13 +#: netbox/forms/__init__.py:13 msgid "Exact match" msgstr "" -#: netbox/netbox/forms/__init__.py:14 +#: netbox/forms/__init__.py:14 msgid "Starts with" msgstr "" -#: netbox/netbox/forms/__init__.py:15 +#: netbox/forms/__init__.py:15 msgid "Ends with" msgstr "" -#: netbox/netbox/forms/__init__.py:16 +#: netbox/forms/__init__.py:16 msgid "Regex" msgstr "" -#: netbox/netbox/forms/__init__.py:34 +#: netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "" -#: netbox/netbox/forms/__init__.py:40 +#: netbox/forms/__init__.py:40 msgid "Lookup" msgstr "" -#: netbox/netbox/forms/base.py:90 +#: netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. \"tag1,tag2," "tag3\")" msgstr "" -#: netbox/netbox/forms/base.py:120 +#: netbox/forms/base.py:120 msgid "Add tags" msgstr "" -#: netbox/netbox/forms/base.py:125 +#: netbox/forms/base.py:125 msgid "Remove tags" msgstr "" -#: netbox/netbox/forms/mixins.py:38 +#: netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "" -#: netbox/netbox/models/features.py:280 +#: netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "" -#: netbox/netbox/models/features.py:286 +#: netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "" -#: netbox/netbox/models/features.py:295 +#: netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "" -#: netbox/netbox/models/features.py:302 +#: netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "" -#: netbox/netbox/models/features.py:462 +#: netbox/models/features.py:462 msgid "Remote data source" msgstr "" -#: netbox/netbox/models/features.py:472 +#: netbox/models/features.py:472 msgid "data path" msgstr "" -#: netbox/netbox/models/features.py:476 +#: netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "" -#: netbox/netbox/models/features.py:479 +#: netbox/models/features.py:479 msgid "auto sync enabled" msgstr "" -#: netbox/netbox/models/features.py:481 +#: netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" -#: netbox/netbox/models/features.py:484 +#: netbox/models/features.py:484 msgid "date synced" msgstr "" -#: netbox/netbox/models/features.py:578 +#: netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "" -#: netbox/netbox/navigation/menu.py:11 +#: netbox/navigation/menu.py:11 msgid "Organization" msgstr "" -#: netbox/netbox/navigation/menu.py:19 +#: netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:27 +#: netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:34 +#: netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:35 -#: netbox/templates/tenancy/contactrole.html:8 +#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:36 +#: netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "" -#: netbox/netbox/navigation/menu.py:50 +#: netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:54 +#: netbox/navigation/menu.py:54 msgid "Elevations" msgstr "" -#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 +#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "" -#: netbox/netbox/navigation/menu.py:76 +#: netbox/navigation/menu.py:76 msgid "Modules" msgstr "" -#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 -#: netbox/templates/dcim/virtualdevicecontext.html:8 +#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 +#: templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "" -#: netbox/netbox/navigation/menu.py:88 +#: netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "" -#: netbox/netbox/navigation/menu.py:92 +#: netbox/navigation/menu.py:92 msgid "Device Components" msgstr "" -#: netbox/netbox/navigation/menu.py:104 -#: netbox/templates/dcim/inventoryitemrole.html:8 +#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 +#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 msgid "Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:117 +#: netbox/navigation/menu.py:117 msgid "Cables" msgstr "" -#: netbox/netbox/navigation/menu.py:118 +#: netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "" -#: netbox/netbox/navigation/menu.py:121 +#: netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:126 +#: netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:131 +#: netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:147 +#: netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:168 +#: netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:174 +#: netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "" -#: netbox/netbox/navigation/menu.py:196 +#: netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:203 +#: netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 -#: netbox/templates/ipam/ipaddress.html:118 -#: netbox/templates/virtualization/virtualmachine.html:154 +#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 +#: templates/ipam/ipaddress.html:118 +#: templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "" -#: netbox/netbox/navigation/menu.py:211 +#: netbox/navigation/menu.py:211 msgid "VPN" msgstr "" -#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 -#: netbox/vpn/tables/tunnels.py:24 +#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 +#: vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "" -#: netbox/netbox/navigation/menu.py:218 netbox/templates/vpn/tunnelgroup.html:8 +#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:219 +#: netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "" -#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 -#: netbox/vpn/models/l2vpn.py:64 +#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 +#: vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "" -#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 -#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 +#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 +#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "" -#: netbox/netbox/navigation/menu.py:232 +#: netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "" -#: netbox/netbox/navigation/menu.py:233 -#: netbox/templates/vpn/ikeproposal.html:41 +#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "" -#: netbox/netbox/navigation/menu.py:234 +#: netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "" -#: netbox/netbox/navigation/menu.py:235 -#: netbox/templates/vpn/ipsecproposal.html:37 +#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "" -#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 -#: netbox/templates/vpn/ipsecpolicy.html:25 +#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 +#: templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "" -#: netbox/netbox/navigation/menu.py:251 -#: netbox/templates/virtualization/virtualmachine.html:174 -#: netbox/templates/virtualization/virtualmachine/base.html:32 -#: netbox/templates/virtualization/virtualmachine_list.html:21 -#: netbox/virtualization/tables/virtualmachines.py:104 -#: netbox/virtualization/views.py:388 +#: netbox/navigation/menu.py:251 +#: templates/virtualization/virtualmachine.html:174 +#: templates/virtualization/virtualmachine/base.html:32 +#: templates/virtualization/virtualmachine_list.html:21 +#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 msgid "Virtual Disks" msgstr "" -#: netbox/netbox/navigation/menu.py:258 +#: netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "" -#: netbox/netbox/navigation/menu.py:259 +#: netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:273 +#: netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "" -#: netbox/netbox/navigation/menu.py:274 +#: netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:275 -#: netbox/templates/circuits/circuit.html:66 +#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "" -#: netbox/netbox/navigation/menu.py:276 +#: netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "" -#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 +#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 msgid "Providers" msgstr "" -#: netbox/netbox/navigation/menu.py:283 -#: netbox/templates/circuits/provider.html:51 +#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "" -#: netbox/netbox/navigation/menu.py:284 +#: netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "" -#: netbox/netbox/navigation/menu.py:298 +#: netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "" -#: netbox/netbox/navigation/menu.py:309 +#: netbox/navigation/menu.py:309 msgid "Configurations" msgstr "" -#: netbox/netbox/navigation/menu.py:311 +#: netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "" -#: netbox/netbox/navigation/menu.py:312 +#: netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 +#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 msgid "Customization" msgstr "" -#: netbox/netbox/navigation/menu.py:325 -#: netbox/templates/dcim/device_edit.html:103 -#: netbox/templates/dcim/htmx/cable_edit.html:81 -#: netbox/templates/dcim/virtualchassis_add.html:31 -#: netbox/templates/dcim/virtualchassis_edit.html:40 -#: netbox/templates/generic/bulk_edit.html:76 -#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 -#: netbox/templates/inc/panels/custom_fields.html:7 -#: netbox/templates/ipam/ipaddress_bulk_add.html:35 -#: netbox/templates/ipam/vlan_edit.html:59 +#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 +#: templates/dcim/htmx/cable_edit.html:81 +#: templates/dcim/virtualchassis_add.html:31 +#: templates/dcim/virtualchassis_edit.html:40 +#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 +#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 +#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "" -#: netbox/netbox/navigation/menu.py:326 +#: netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "" -#: netbox/netbox/navigation/menu.py:327 +#: netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "" -#: netbox/netbox/navigation/menu.py:328 +#: netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:329 +#: netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "" -#: netbox/netbox/navigation/menu.py:331 +#: netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "" -#: netbox/netbox/navigation/menu.py:349 +#: netbox/navigation/menu.py:349 msgid "Operations" msgstr "" -#: netbox/netbox/navigation/menu.py:353 +#: netbox/navigation/menu.py:353 msgid "Integrations" msgstr "" -#: netbox/netbox/navigation/menu.py:355 +#: netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "" -#: netbox/netbox/navigation/menu.py:356 +#: netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "" -#: netbox/netbox/navigation/menu.py:357 +#: netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "" -#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 -#: netbox/netbox/views/generic/feature_views.py:153 -#: netbox/templates/extras/report/base.html:37 -#: netbox/templates/extras/script/base.html:36 +#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 +#: netbox/views/generic/feature_views.py:153 +#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 msgid "Jobs" msgstr "" -#: netbox/netbox/navigation/menu.py:371 +#: netbox/navigation/menu.py:371 msgid "Logging" msgstr "" -#: netbox/netbox/navigation/menu.py:373 +#: netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:374 +#: netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "" -#: netbox/netbox/navigation/menu.py:375 -#: netbox/templates/core/objectchange.html:9 -#: netbox/templates/core/objectchange_list.html:4 +#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 +#: templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "" -#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 +#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 msgid "Admin" msgstr "" -#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 -#: netbox/templates/inc/user_menu.html:57 +#: netbox/navigation/menu.py:430 templates/account/base.html:27 +#: templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "" -#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 -#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 -#: netbox/users/forms/model_forms.py:249 +#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 +#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 +#: users/forms/model_forms.py:249 msgid "Permissions" msgstr "" -#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 -#: netbox/templates/core/system.html:7 +#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 +#: templates/core/system.html:7 msgid "System" msgstr "" -#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 -#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 -#: netbox/templates/core/plugin.html:13 -#: netbox/templates/core/plugin_list.html:7 -#: netbox/templates/core/plugin_list.html:12 +#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 +#: templates/500.html:35 templates/account/preferences.html:22 +#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 +#: templates/core/plugin_list.html:12 msgid "Plugins" msgstr "" -#: netbox/netbox/navigation/menu.py:459 +#: netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "" -#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 -#: netbox/templates/core/rq_task_list.html:22 +#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 +#: templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "" -#: netbox/netbox/plugins/navigation.py:47 -#: netbox/netbox/plugins/navigation.py:69 +#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "" -#: netbox/netbox/plugins/navigation.py:51 +#: netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "" -#: netbox/netbox/plugins/navigation.py:73 +#: netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "" -#: netbox/netbox/plugins/registration.py:25 +#: netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an instance!" msgstr "" -#: netbox/netbox/plugins/registration.py:31 +#: netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of netbox.plugins." "PluginTemplateExtension!" msgstr "" -#: netbox/netbox/plugins/registration.py:51 +#: netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "" -#: netbox/netbox/plugins/registration.py:62 +#: netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "" -#: netbox/netbox/plugins/registration.py:67 +#: netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "" -#: netbox/netbox/plugins/templates.py:37 +#: netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "" -#: netbox/netbox/preferences.py:19 +#: netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "" -#: netbox/netbox/preferences.py:24 +#: netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "" -#: netbox/netbox/preferences.py:26 +#: netbox/preferences.py:26 msgid "Experimental feature" msgstr "" -#: netbox/netbox/preferences.py:29 +#: netbox/preferences.py:29 msgid "Language" msgstr "" -#: netbox/netbox/preferences.py:34 +#: netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "" -#: netbox/netbox/preferences.py:36 +#: netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "" -#: netbox/netbox/preferences.py:42 +#: netbox/preferences.py:42 msgid "Page length" msgstr "" -#: netbox/netbox/preferences.py:44 +#: netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "" -#: netbox/netbox/preferences.py:48 +#: netbox/preferences.py:48 msgid "Paginator placement" msgstr "" -#: netbox/netbox/preferences.py:50 +#: netbox/preferences.py:50 msgid "Bottom" msgstr "" -#: netbox/netbox/preferences.py:51 +#: netbox/preferences.py:51 msgid "Top" msgstr "" -#: netbox/netbox/preferences.py:52 +#: netbox/preferences.py:52 msgid "Both" msgstr "" -#: netbox/netbox/preferences.py:55 +#: netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" -#: netbox/netbox/preferences.py:60 +#: netbox/preferences.py:60 msgid "Data format" msgstr "" -#: netbox/netbox/preferences.py:65 +#: netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" -#: netbox/netbox/registry.py:14 +#: netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "" -#: netbox/netbox/registry.py:17 +#: netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "" -#: netbox/netbox/registry.py:20 +#: netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "" -#: netbox/netbox/settings.py:760 +#: netbox/settings.py:760 msgid "Czech" msgstr "" -#: netbox/netbox/settings.py:761 +#: netbox/settings.py:761 msgid "Danish" msgstr "" -#: netbox/netbox/settings.py:762 +#: netbox/settings.py:762 msgid "German" msgstr "" -#: netbox/netbox/settings.py:763 +#: netbox/settings.py:763 msgid "English" msgstr "" -#: netbox/netbox/settings.py:764 +#: netbox/settings.py:764 msgid "Spanish" msgstr "" -#: netbox/netbox/settings.py:765 +#: netbox/settings.py:765 msgid "French" msgstr "" -#: netbox/netbox/settings.py:766 +#: netbox/settings.py:766 msgid "Italian" msgstr "" -#: netbox/netbox/settings.py:767 +#: netbox/settings.py:767 msgid "Japanese" msgstr "" -#: netbox/netbox/settings.py:768 +#: netbox/settings.py:768 msgid "Dutch" msgstr "" -#: netbox/netbox/settings.py:769 +#: netbox/settings.py:769 msgid "Polish" msgstr "" -#: netbox/netbox/settings.py:770 +#: netbox/settings.py:770 msgid "Portuguese" msgstr "" -#: netbox/netbox/settings.py:771 +#: netbox/settings.py:771 msgid "Russian" msgstr "" -#: netbox/netbox/settings.py:772 +#: netbox/settings.py:772 msgid "Turkish" msgstr "" -#: netbox/netbox/settings.py:773 +#: netbox/settings.py:773 msgid "Ukrainian" msgstr "" -#: netbox/netbox/settings.py:774 +#: netbox/settings.py:774 msgid "Chinese" msgstr "" -#: netbox/netbox/tables/columns.py:176 +#: netbox/tables/columns.py:176 msgid "Select all" msgstr "" -#: netbox/netbox/tables/columns.py:189 +#: netbox/tables/columns.py:189 msgid "Toggle all" msgstr "" -#: netbox/netbox/tables/columns.py:300 +#: netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "" -#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 +#: netbox/tables/columns.py:572 templates/core/job.html:53 msgid "Error" msgstr "" -#: netbox/netbox/tables/tables.py:58 +#: netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "" -#: netbox/netbox/tables/tables.py:249 -#: netbox/templates/generic/bulk_import.html:117 +#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 msgid "Field" msgstr "" -#: netbox/netbox/tables/tables.py:252 +#: netbox/tables/tables.py:252 msgid "Value" msgstr "" -#: netbox/netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:114 +#: netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " "{error}" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:416 +#: netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:709 -#: netbox/netbox/views/generic/bulk_views.py:907 -#: netbox/netbox/views/generic/bulk_views.py:955 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:789 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:885 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "" -#: netbox/netbox/views/generic/feature_views.py:40 +#: netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "" -#: netbox/netbox/views/generic/feature_views.py:93 +#: netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "" -#: netbox/netbox/views/generic/feature_views.py:207 +#: netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "" -#: netbox/netbox/views/generic/feature_views.py:211 +#: netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "" -#: netbox/netbox/views/generic/feature_views.py:236 +#: netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "" -#: netbox/netbox/views/generic/object_views.py:108 +#: netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "" -#: netbox/netbox/views/misc.py:46 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." msgstr "" -#: netbox/templates/403.html:4 +#: templates/403.html:4 msgid "Access Denied" msgstr "" -#: netbox/templates/403.html:9 +#: templates/403.html:9 msgid "You do not have permission to access this page" msgstr "" -#: netbox/templates/404.html:4 +#: templates/404.html:4 msgid "Page Not Found" msgstr "" -#: netbox/templates/404.html:9 +#: templates/404.html:9 msgid "The requested page does not exist" msgstr "" -#: netbox/templates/500.html:7 netbox/templates/500.html:18 +#: templates/500.html:7 templates/500.html:18 msgid "Server Error" msgstr "" -#: netbox/templates/500.html:23 +#: templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" -#: netbox/templates/500.html:28 +#: templates/500.html:28 msgid "The complete exception is provided below" msgstr "" -#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 +#: templates/500.html:33 templates/core/system.html:40 msgid "Python version" msgstr "" -#: netbox/templates/500.html:34 +#: templates/500.html:34 msgid "NetBox version" msgstr "" -#: netbox/templates/500.html:36 +#: templates/500.html:36 msgid "None installed" msgstr "" -#: netbox/templates/500.html:39 +#: templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "" -#: netbox/templates/500.html:39 +#: templates/500.html:39 msgid "NetBox discussion forum" msgstr "" -#: netbox/templates/500.html:39 +#: templates/500.html:39 msgid "on GitHub" msgstr "" -#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 +#: templates/500.html:42 templates/base/40x.html:17 msgid "Home Page" msgstr "" -#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 -#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 -#: netbox/vpn/forms/model_forms.py:379 +#: templates/account/base.html:7 templates/inc/user_menu.html:45 +#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 +#: vpn/forms/model_forms.py:379 msgid "Profile" msgstr "" -#: netbox/templates/account/base.html:13 -#: netbox/templates/account/notifications.html:7 -#: netbox/templates/inc/user_menu.html:15 +#: templates/account/base.html:13 templates/account/notifications.html:7 +#: templates/inc/user_menu.html:15 msgid "Notifications" msgstr "" -#: netbox/templates/account/base.html:16 -#: netbox/templates/account/subscriptions.html:7 -#: netbox/templates/inc/user_menu.html:51 +#: templates/account/base.html:16 templates/account/subscriptions.html:7 +#: templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "" -#: netbox/templates/account/base.html:19 netbox/templates/inc/user_menu.html:54 +#: templates/account/base.html:19 templates/inc/user_menu.html:54 msgid "Preferences" msgstr "" -#: netbox/templates/account/password.html:5 +#: templates/account/password.html:5 msgid "Change Password" msgstr "" -#: netbox/templates/account/password.html:19 -#: netbox/templates/account/preferences.html:77 -#: netbox/templates/core/configrevision_restore.html:63 -#: netbox/templates/dcim/devicebay_populate.html:34 -#: netbox/templates/dcim/virtualchassis_add_member.html:26 -#: netbox/templates/dcim/virtualchassis_edit.html:103 -#: netbox/templates/extras/object_journal.html:26 -#: netbox/templates/extras/script.html:38 -#: netbox/templates/generic/bulk_add_component.html:67 -#: netbox/templates/generic/bulk_delete.html:65 -#: netbox/templates/generic/bulk_edit.html:106 -#: netbox/templates/generic/bulk_import.html:56 -#: netbox/templates/generic/bulk_import.html:78 -#: netbox/templates/generic/bulk_import.html:100 -#: netbox/templates/generic/bulk_remove.html:62 -#: netbox/templates/generic/bulk_rename.html:63 -#: netbox/templates/generic/confirmation_form.html:19 -#: netbox/templates/generic/object_edit.html:72 -#: netbox/templates/htmx/delete_form.html:53 -#: netbox/templates/htmx/delete_form.html:55 -#: netbox/templates/ipam/ipaddress_assign.html:28 -#: netbox/templates/virtualization/cluster_add_devices.html:30 +#: templates/account/password.html:19 templates/account/preferences.html:77 +#: templates/core/configrevision_restore.html:63 +#: templates/dcim/devicebay_populate.html:34 +#: templates/dcim/virtualchassis_add_member.html:26 +#: templates/dcim/virtualchassis_edit.html:103 +#: templates/extras/object_journal.html:26 templates/extras/script.html:38 +#: templates/generic/bulk_add_component.html:67 +#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 +#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 +#: templates/generic/bulk_import.html:100 templates/generic/bulk_remove.html:62 +#: templates/generic/bulk_rename.html:63 +#: templates/generic/confirmation_form.html:19 +#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 +#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 +#: templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "" -#: netbox/templates/account/password.html:20 -#: netbox/templates/account/preferences.html:78 -#: netbox/templates/dcim/devicebay_populate.html:35 -#: netbox/templates/dcim/virtualchassis_add_member.html:28 -#: netbox/templates/dcim/virtualchassis_edit.html:105 -#: netbox/templates/extras/dashboard/widget_add.html:26 -#: netbox/templates/extras/dashboard/widget_config.html:19 -#: netbox/templates/extras/object_journal.html:27 -#: netbox/templates/generic/object_edit.html:75 -#: netbox/utilities/templates/helpers/applied_filters.html:16 -#: netbox/utilities/templates/helpers/table_config_form.html:40 +#: templates/account/password.html:20 templates/account/preferences.html:78 +#: templates/dcim/devicebay_populate.html:35 +#: templates/dcim/virtualchassis_add_member.html:28 +#: templates/dcim/virtualchassis_edit.html:105 +#: templates/extras/dashboard/widget_add.html:26 +#: templates/extras/dashboard/widget_config.html:19 +#: templates/extras/object_journal.html:27 +#: templates/generic/object_edit.html:75 +#: utilities/templates/helpers/applied_filters.html:16 +#: utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "" -#: netbox/templates/account/preferences.html:34 +#: templates/account/preferences.html:34 msgid "Table Configurations" msgstr "" -#: netbox/templates/account/preferences.html:39 +#: templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "" -#: netbox/templates/account/preferences.html:47 +#: templates/account/preferences.html:47 msgid "Toggle All" msgstr "" -#: netbox/templates/account/preferences.html:49 +#: templates/account/preferences.html:49 msgid "Table" msgstr "" -#: netbox/templates/account/preferences.html:50 +#: templates/account/preferences.html:50 msgid "Ordering" msgstr "" -#: netbox/templates/account/preferences.html:51 +#: templates/account/preferences.html:51 msgid "Columns" msgstr "" -#: netbox/templates/account/preferences.html:71 -#: netbox/templates/dcim/cable_trace.html:113 -#: netbox/templates/extras/object_configcontext.html:43 +#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 +#: templates/extras/object_configcontext.html:43 msgid "None found" msgstr "" -#: netbox/templates/account/profile.html:6 +#: templates/account/profile.html:6 msgid "User Profile" msgstr "" -#: netbox/templates/account/profile.html:12 +#: templates/account/profile.html:12 msgid "Account Details" msgstr "" -#: netbox/templates/account/profile.html:29 -#: netbox/templates/tenancy/contact.html:43 netbox/templates/users/user.html:25 -#: netbox/tenancy/forms/bulk_edit.py:109 +#: templates/account/profile.html:29 templates/tenancy/contact.html:43 +#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "" -#: netbox/templates/account/profile.html:33 netbox/templates/users/user.html:29 +#: templates/account/profile.html:33 templates/users/user.html:29 msgid "Account Created" msgstr "" -#: netbox/templates/account/profile.html:37 netbox/templates/users/user.html:33 +#: templates/account/profile.html:37 templates/users/user.html:33 msgid "Last Login" msgstr "" -#: netbox/templates/account/profile.html:41 netbox/templates/users/user.html:45 +#: templates/account/profile.html:41 templates/users/user.html:45 msgid "Superuser" msgstr "" -#: netbox/templates/account/profile.html:45 -#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 +#: templates/account/profile.html:45 templates/inc/user_menu.html:31 +#: templates/users/user.html:41 msgid "Staff" msgstr "" -#: netbox/templates/account/profile.html:53 -#: netbox/templates/users/objectpermission.html:82 -#: netbox/templates/users/user.html:53 +#: templates/account/profile.html:53 templates/users/objectpermission.html:82 +#: templates/users/user.html:53 msgid "Assigned Groups" msgstr "" -#: netbox/templates/account/profile.html:58 -#: netbox/templates/circuits/circuit_terminations_swap.html:18 -#: netbox/templates/circuits/circuit_terminations_swap.html:26 -#: netbox/templates/circuits/circuittermination.html:34 -#: netbox/templates/circuits/inc/circuit_termination.html:68 -#: netbox/templates/core/objectchange.html:124 -#: netbox/templates/core/objectchange.html:142 -#: netbox/templates/dcim/devicebay.html:59 -#: netbox/templates/dcim/inc/panels/inventory_items.html:45 -#: netbox/templates/dcim/interface.html:296 -#: netbox/templates/dcim/modulebay.html:80 -#: netbox/templates/extras/configcontext.html:70 -#: netbox/templates/extras/eventrule.html:66 -#: netbox/templates/extras/htmx/script_result.html:60 -#: netbox/templates/extras/webhook.html:65 -#: netbox/templates/extras/webhook.html:75 -#: netbox/templates/inc/panel_table.html:13 -#: netbox/templates/inc/panels/comments.html:10 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 -#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 -#: netbox/templates/users/objectpermission.html:77 -#: netbox/templates/users/objectpermission.html:87 -#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 +#: templates/account/profile.html:58 +#: templates/circuits/circuit_terminations_swap.html:18 +#: templates/circuits/circuit_terminations_swap.html:26 +#: templates/circuits/circuittermination.html:34 +#: templates/circuits/inc/circuit_termination.html:68 +#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 +#: templates/dcim/devicebay.html:59 +#: templates/dcim/inc/panels/inventory_items.html:45 +#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 +#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 +#: templates/extras/htmx/script_result.html:60 templates/extras/webhook.html:65 +#: templates/extras/webhook.html:75 templates/inc/panel_table.html:13 +#: templates/inc/panels/comments.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 +#: templates/users/group.html:44 templates/users/objectpermission.html:77 +#: templates/users/objectpermission.html:87 templates/users/user.html:58 +#: templates/users/user.html:68 msgid "None" msgstr "" -#: netbox/templates/account/profile.html:68 netbox/templates/users/user.html:78 +#: templates/account/profile.html:68 templates/users/user.html:78 msgid "Recent Activity" msgstr "" -#: netbox/templates/account/token.html:8 -#: netbox/templates/account/token_list.html:6 +#: templates/account/token.html:8 templates/account/token_list.html:6 msgid "My API Tokens" msgstr "" -#: netbox/templates/account/token.html:11 -#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 -#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 +#: templates/account/token.html:11 templates/account/token.html:19 +#: templates/users/token.html:6 templates/users/token.html:14 +#: users/forms/filtersets.py:120 msgid "Token" msgstr "" -#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 -#: netbox/users/forms/bulk_edit.py:107 +#: templates/account/token.html:39 templates/users/token.html:31 +#: users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "" -#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 +#: templates/account/token.html:51 templates/users/token.html:43 msgid "Last used" msgstr "" -#: netbox/templates/account/token_list.html:12 +#: templates/account/token_list.html:12 msgid "Add a Token" msgstr "" -#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 +#: templates/base/base.html:22 templates/home.html:27 msgid "Home" msgstr "" -#: netbox/templates/base/layout.html:25 +#: templates/base/layout.html:25 msgid "NetBox Motif" msgstr "" -#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 -#: netbox/templates/login.html:14 netbox/templates/login.html:15 +#: templates/base/layout.html:38 templates/base/layout.html:39 +#: templates/login.html:14 templates/login.html:15 msgid "NetBox Logo" msgstr "" -#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 +#: templates/base/layout.html:150 templates/base/layout.html:151 msgid "Docs" msgstr "" -#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 -#: netbox/templates/rest_framework/api.html:10 +#: templates/base/layout.html:156 templates/base/layout.html:157 +#: templates/rest_framework/api.html:10 msgid "REST API" msgstr "" -#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 +#: templates/base/layout.html:162 templates/base/layout.html:163 msgid "REST API documentation" msgstr "" -#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 +#: templates/base/layout.html:169 templates/base/layout.html:170 msgid "GraphQL API" msgstr "" -#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 +#: templates/base/layout.html:185 templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "" -#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 +#: templates/base/layout.html:194 templates/base/layout.html:195 msgid "Source Code" msgstr "" -#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 +#: templates/base/layout.html:200 templates/base/layout.html:201 msgid "Community" msgstr "" -#: netbox/templates/circuits/circuit.html:47 +#: templates/circuits/circuit.html:47 msgid "Install Date" msgstr "" -#: netbox/templates/circuits/circuit.html:51 +#: templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "" -#: netbox/templates/circuits/circuit.html:70 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 +#: templates/circuits/circuit.html:70 +#: templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "" -#: netbox/templates/circuits/circuit_terminations_swap.html:4 +#: templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "" -#: netbox/templates/circuits/circuit_terminations_swap.html:8 +#: templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "" -#: netbox/templates/circuits/circuit_terminations_swap.html:14 +#: templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "" -#: netbox/templates/circuits/circuit_terminations_swap.html:22 +#: templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "" -#: netbox/templates/circuits/circuitgroup.html:16 +#: templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "" -#: netbox/templates/circuits/circuitgroupassignment.html:19 +#: templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "" -#: netbox/templates/circuits/circuittype.html:10 +#: templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "" -#: netbox/templates/circuits/circuittype.html:19 +#: templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination.html:10 -#: netbox/templates/dcim/manufacturer.html:11 -#: netbox/templates/generic/bulk_add_component.html:22 -#: netbox/templates/users/objectpermission.html:38 -#: netbox/utilities/templates/buttons/add.html:4 -#: netbox/utilities/templates/helpers/table_config_form.html:20 +#: templates/circuits/inc/circuit_termination.html:10 +#: templates/dcim/manufacturer.html:11 +#: templates/generic/bulk_add_component.html:22 +#: templates/users/objectpermission.html:38 +#: utilities/templates/buttons/add.html:4 +#: utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination.html:15 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 -#: netbox/templates/dcim/inc/panels/inventory_items.html:32 -#: netbox/templates/dcim/powerpanel.html:56 -#: netbox/templates/extras/script_list.html:30 -#: netbox/templates/generic/object_edit.html:47 -#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 -#: netbox/utilities/templates/buttons/edit.html:3 +#: templates/circuits/inc/circuit_termination.html:15 +#: templates/circuits/inc/circuit_termination_fields.html:36 +#: templates/dcim/inc/panels/inventory_items.html:32 +#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 +#: templates/generic/object_edit.html:47 +#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: templates/ipam/inc/panels/fhrp_groups.html:43 +#: utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination.html:18 +#: templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 -#: netbox/templates/dcim/consoleport.html:59 -#: netbox/templates/dcim/consoleserverport.html:60 -#: netbox/templates/dcim/powerfeed.html:114 +#: templates/circuits/inc/circuit_termination_fields.html:19 +#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 +#: templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 +#: templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 -#: netbox/templates/dcim/frontport.html:80 -#: netbox/templates/dcim/inc/connection_endpoints.html:7 -#: netbox/templates/dcim/interface.html:154 -#: netbox/templates/dcim/rearport.html:76 +#: templates/circuits/inc/circuit_termination_fields.html:31 +#: templates/circuits/inc/circuit_termination_fields.html:32 +#: templates/dcim/frontport.html:80 +#: templates/dcim/inc/connection_endpoints.html:7 +#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 msgid "Trace" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 +#: templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 +#: templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 -#: netbox/templates/dcim/bulk_disconnect.html:5 -#: netbox/templates/dcim/device/consoleports.html:12 -#: netbox/templates/dcim/device/consoleserverports.html:12 -#: netbox/templates/dcim/device/frontports.html:12 -#: netbox/templates/dcim/device/interfaces.html:16 -#: netbox/templates/dcim/device/poweroutlets.html:12 -#: netbox/templates/dcim/device/powerports.html:12 -#: netbox/templates/dcim/device/rearports.html:12 -#: netbox/templates/dcim/powerpanel.html:61 +#: templates/circuits/inc/circuit_termination_fields.html:41 +#: templates/dcim/bulk_disconnect.html:5 +#: templates/dcim/device/consoleports.html:12 +#: templates/dcim/device/consoleserverports.html:12 +#: templates/dcim/device/frontports.html:12 +#: templates/dcim/device/interfaces.html:16 +#: templates/dcim/device/poweroutlets.html:12 +#: templates/dcim/device/powerports.html:12 +#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 -#: netbox/templates/dcim/consoleport.html:69 -#: netbox/templates/dcim/consoleserverport.html:70 -#: netbox/templates/dcim/frontport.html:102 -#: netbox/templates/dcim/interface.html:180 -#: netbox/templates/dcim/interface.html:200 -#: netbox/templates/dcim/powerfeed.html:127 -#: netbox/templates/dcim/poweroutlet.html:71 -#: netbox/templates/dcim/poweroutlet.html:72 -#: netbox/templates/dcim/powerport.html:73 -#: netbox/templates/dcim/rearport.html:98 +#: templates/circuits/inc/circuit_termination_fields.html:48 +#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 +#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 +#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 +#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 +#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 msgid "Connect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 +#: templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 +#: templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 +#: templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 +#: templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "" -#: netbox/templates/circuits/provider.html:11 +#: templates/circuits/provider.html:11 msgid "Add circuit" msgstr "" -#: netbox/templates/circuits/provideraccount.html:17 +#: templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "" -#: netbox/templates/core/configrevision.html:35 +#: templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "" -#: netbox/templates/core/configrevision.html:40 +#: templates/core/configrevision.html:40 msgid "Comment" msgstr "" -#: netbox/templates/core/configrevision_restore.html:8 -#: netbox/templates/core/configrevision_restore.html:25 -#: netbox/templates/core/configrevision_restore.html:64 +#: templates/core/configrevision_restore.html:8 +#: templates/core/configrevision_restore.html:25 +#: templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "" -#: netbox/templates/core/configrevision_restore.html:36 +#: templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "" -#: netbox/templates/core/configrevision_restore.html:37 +#: templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "" -#: netbox/templates/core/configrevision_restore.html:38 +#: templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "" -#: netbox/templates/core/configrevision_restore.html:50 +#: templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "" -#: netbox/templates/core/datafile.html:42 netbox/templates/ipam/iprange.html:25 -#: netbox/templates/virtualization/virtualdisk.html:29 -#: netbox/virtualization/tables/virtualmachines.py:198 +#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 +#: templates/virtualization/virtualdisk.html:29 +#: virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "" -#: netbox/templates/core/datafile.html:43 +#: templates/core/datafile.html:43 msgid "bytes" msgstr "" -#: netbox/templates/core/datafile.html:46 +#: templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "" -#: netbox/templates/core/datasource.html:14 -#: netbox/templates/core/datasource.html:20 -#: netbox/utilities/templates/buttons/sync.html:5 +#: templates/core/datasource.html:14 templates/core/datasource.html:20 +#: utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "" -#: netbox/templates/core/datasource.html:50 +#: templates/core/datasource.html:50 msgid "Last synced" msgstr "" -#: netbox/templates/core/datasource.html:84 +#: templates/core/datasource.html:84 msgid "Backend" msgstr "" -#: netbox/templates/core/datasource.html:99 +#: templates/core/datasource.html:99 msgid "No parameters defined" msgstr "" -#: netbox/templates/core/datasource.html:114 +#: templates/core/datasource.html:114 msgid "Files" msgstr "" -#: netbox/templates/core/inc/config_data.html:7 +#: templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "" -#: netbox/templates/core/inc/config_data.html:10 +#: templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "" -#: netbox/templates/core/inc/config_data.html:14 +#: templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "" -#: netbox/templates/core/inc/config_data.html:20 +#: templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "" -#: netbox/templates/core/inc/config_data.html:23 +#: templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "" -#: netbox/templates/core/inc/config_data.html:27 +#: templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "" -#: netbox/templates/core/inc/config_data.html:31 +#: templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "" -#: netbox/templates/core/inc/config_data.html:40 +#: templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "" -#: netbox/templates/core/inc/config_data.html:83 +#: templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "" -#: netbox/templates/core/inc/config_data.html:87 +#: templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "" -#: netbox/templates/core/inc/config_data.html:114 +#: templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "" -#: netbox/templates/core/inc/config_data.html:141 +#: templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "" -#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 -#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 +#: templates/core/job.html:35 templates/core/rq_task.html:12 +#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 msgid "Job" msgstr "" -#: netbox/templates/core/job.html:58 -#: netbox/templates/extras/journalentry.html:26 +#: templates/core/job.html:58 templates/extras/journalentry.html:26 msgid "Created By" msgstr "" -#: netbox/templates/core/job.html:66 +#: templates/core/job.html:66 msgid "Scheduling" msgstr "" -#: netbox/templates/core/job.html:77 +#: templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "" -#: netbox/templates/core/objectchange.html:29 -#: netbox/templates/users/objectpermission.html:42 +#: templates/core/objectchange.html:29 templates/users/objectpermission.html:42 msgid "Change" msgstr "" -#: netbox/templates/core/objectchange.html:79 +#: templates/core/objectchange.html:79 msgid "Difference" msgstr "" -#: netbox/templates/core/objectchange.html:82 +#: templates/core/objectchange.html:82 msgid "Previous" msgstr "" -#: netbox/templates/core/objectchange.html:85 +#: templates/core/objectchange.html:85 msgid "Next" msgstr "" -#: netbox/templates/core/objectchange.html:93 +#: templates/core/objectchange.html:93 msgid "Object Created" msgstr "" -#: netbox/templates/core/objectchange.html:95 +#: templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "" -#: netbox/templates/core/objectchange.html:97 +#: templates/core/objectchange.html:97 msgid "No Changes" msgstr "" -#: netbox/templates/core/objectchange.html:111 +#: templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "" -#: netbox/templates/core/objectchange.html:122 +#: templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" -#: netbox/templates/core/objectchange.html:131 +#: templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "" -#: netbox/templates/core/objectchange.html:162 +#: templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "" -#: netbox/templates/core/objectchange_list.html:9 -#: netbox/templates/extras/object_changelog.html:15 +#: templates/core/objectchange_list.html:9 +#: templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "" -#: netbox/templates/core/objectchange_list.html:9 -#: netbox/templates/extras/object_changelog.html:15 +#: templates/core/objectchange_list.html:9 +#: templates/extras/object_changelog.html:15 msgid "days" msgstr "" -#: netbox/templates/core/objectchange_list.html:9 -#: netbox/templates/extras/object_changelog.html:15 +#: templates/core/objectchange_list.html:9 +#: templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "" -#: netbox/templates/core/plugin.html:22 +#: templates/core/plugin.html:22 msgid "Not installed" msgstr "" -#: netbox/templates/core/plugin.html:33 +#: templates/core/plugin.html:33 msgid "Overview" msgstr "" -#: netbox/templates/core/plugin.html:39 +#: templates/core/plugin.html:39 msgid "Install" msgstr "" -#: netbox/templates/core/plugin.html:51 +#: templates/core/plugin.html:51 msgid "Plugin Details" msgstr "" -#: netbox/templates/core/plugin.html:58 +#: templates/core/plugin.html:58 msgid "Summary" msgstr "" -#: netbox/templates/core/plugin.html:76 +#: templates/core/plugin.html:76 msgid "License" msgstr "" -#: netbox/templates/core/plugin.html:96 +#: templates/core/plugin.html:96 msgid "Version History" msgstr "" -#: netbox/templates/core/plugin.html:107 +#: templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "" -#: netbox/templates/core/rq_queue_list.html:5 -#: netbox/templates/core/rq_queue_list.html:13 -#: netbox/templates/core/rq_task_list.html:14 -#: netbox/templates/core/rq_worker.html:7 +#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 +#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "" -#: netbox/templates/core/rq_queue_list.html:24 -#: netbox/templates/core/rq_queue_list.html:25 -#: netbox/templates/core/rq_worker_list.html:49 -#: netbox/templates/core/rq_worker_list.html:50 -#: netbox/templates/extras/script_result.html:67 -#: netbox/templates/extras/script_result.html:69 -#: netbox/templates/inc/table_controls_htmx.html:30 -#: netbox/templates/inc/table_controls_htmx.html:33 +#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 +#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 +#: templates/extras/script_result.html:67 +#: templates/extras/script_result.html:69 +#: templates/inc/table_controls_htmx.html:30 +#: templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "" -#: netbox/templates/core/rq_task.html:29 +#: templates/core/rq_task.html:29 msgid "Stop" msgstr "" -#: netbox/templates/core/rq_task.html:34 +#: templates/core/rq_task.html:34 msgid "Requeue" msgstr "" -#: netbox/templates/core/rq_task.html:39 +#: templates/core/rq_task.html:39 msgid "Enqueue" msgstr "" -#: netbox/templates/core/rq_task.html:61 +#: templates/core/rq_task.html:61 msgid "Queue" msgstr "" -#: netbox/templates/core/rq_task.html:65 +#: templates/core/rq_task.html:65 msgid "Timeout" msgstr "" -#: netbox/templates/core/rq_task.html:69 +#: templates/core/rq_task.html:69 msgid "Result TTL" msgstr "" -#: netbox/templates/core/rq_task.html:89 +#: templates/core/rq_task.html:89 msgid "Meta" msgstr "" -#: netbox/templates/core/rq_task.html:93 +#: templates/core/rq_task.html:93 msgid "Arguments" msgstr "" -#: netbox/templates/core/rq_task.html:97 +#: templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "" -#: netbox/templates/core/rq_task.html:103 +#: templates/core/rq_task.html:103 msgid "Depends on" msgstr "" -#: netbox/templates/core/rq_task.html:109 +#: templates/core/rq_task.html:109 msgid "Exception" msgstr "" -#: netbox/templates/core/rq_task_list.html:28 +#: templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "" -#: netbox/templates/core/rq_task_list.html:33 +#: templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "" -#: netbox/templates/core/rq_task_list.html:64 -#: netbox/templates/extras/script_result.html:86 +#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" msgstr "" -#: netbox/templates/core/rq_worker.html:10 +#: templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "" -#: netbox/templates/core/rq_worker.html:31 -#: netbox/templates/core/rq_worker.html:40 +#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 msgid "Worker" msgstr "" -#: netbox/templates/core/rq_worker.html:55 +#: templates/core/rq_worker.html:55 msgid "Queues" msgstr "" -#: netbox/templates/core/rq_worker.html:63 +#: templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "" -#: netbox/templates/core/rq_worker.html:67 +#: templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "" -#: netbox/templates/core/rq_worker.html:71 +#: templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "" -#: netbox/templates/core/rq_worker.html:75 +#: templates/core/rq_worker.html:75 msgid "Total working time" msgstr "" -#: netbox/templates/core/rq_worker.html:76 +#: templates/core/rq_worker.html:76 msgid "seconds" msgstr "" -#: netbox/templates/core/rq_worker_list.html:13 -#: netbox/templates/core/rq_worker_list.html:21 +#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "" -#: netbox/templates/core/rq_worker_list.html:29 +#: templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "" -#: netbox/templates/core/system.html:11 -#: netbox/utilities/templates/buttons/export.html:4 +#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 msgid "Export" msgstr "" -#: netbox/templates/core/system.html:28 +#: templates/core/system.html:28 msgid "System Status" msgstr "" -#: netbox/templates/core/system.html:31 +#: templates/core/system.html:31 msgid "NetBox release" msgstr "" -#: netbox/templates/core/system.html:44 +#: templates/core/system.html:44 msgid "Django version" msgstr "" -#: netbox/templates/core/system.html:48 +#: templates/core/system.html:48 msgid "PostgreSQL version" msgstr "" -#: netbox/templates/core/system.html:52 +#: templates/core/system.html:52 msgid "Database name" msgstr "" -#: netbox/templates/core/system.html:56 +#: templates/core/system.html:56 msgid "Database size" msgstr "" -#: netbox/templates/core/system.html:61 +#: templates/core/system.html:61 msgid "Unavailable" msgstr "" -#: netbox/templates/core/system.html:66 +#: templates/core/system.html:66 msgid "RQ workers" msgstr "" -#: netbox/templates/core/system.html:69 +#: templates/core/system.html:69 msgid "default queue" msgstr "" -#: netbox/templates/core/system.html:73 +#: templates/core/system.html:73 msgid "System time" msgstr "" -#: netbox/templates/core/system.html:85 +#: templates/core/system.html:85 msgid "Current Configuration" msgstr "" -#: netbox/templates/dcim/bulk_disconnect.html:9 +#: templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" -#: netbox/templates/dcim/cable_trace.html:10 +#: templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "" -#: netbox/templates/dcim/cable_trace.html:24 -#: netbox/templates/dcim/inc/rack_elevation.html:7 +#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "" -#: netbox/templates/dcim/cable_trace.html:30 +#: templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "" -#: netbox/templates/dcim/cable_trace.html:31 +#: templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" -#: netbox/templates/dcim/cable_trace.html:38 +#: templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "" -#: netbox/templates/dcim/cable_trace.html:39 +#: templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "" -#: netbox/templates/dcim/cable_trace.html:55 +#: templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "" -#: netbox/templates/dcim/cable_trace.html:58 +#: templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "" -#: netbox/templates/dcim/cable_trace.html:62 +#: templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "" -#: netbox/templates/dcim/cable_trace.html:77 +#: templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "" -#: netbox/templates/dcim/cable_trace.html:85 +#: templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "" -#: netbox/templates/dcim/cable_trace.html:89 +#: templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "" -#: netbox/templates/dcim/cable_trace.html:90 +#: templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "" -#: netbox/templates/dcim/cable_trace.html:91 +#: templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "" -#: netbox/templates/dcim/cable_trace.html:104 +#: templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "" -#: netbox/templates/dcim/component_list.html:14 +#: templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "" -#: netbox/templates/dcim/consoleport.html:65 -#: netbox/templates/dcim/consoleserverport.html:66 -#: netbox/templates/dcim/frontport.html:98 -#: netbox/templates/dcim/interface.html:176 -#: netbox/templates/dcim/poweroutlet.html:69 -#: netbox/templates/dcim/powerport.html:69 +#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 +#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 +#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "" -#: netbox/templates/dcim/device.html:34 +#: templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "" -#: netbox/templates/dcim/device.html:55 +#: templates/dcim/device.html:55 msgid "Not racked" msgstr "" -#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 +#: templates/dcim/device.html:62 templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "" -#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 -#: netbox/templates/dcim/site.html:100 +#: templates/dcim/device.html:68 templates/dcim/site.html:81 +#: templates/dcim/site.html:100 msgid "Map" msgstr "" -#: netbox/templates/dcim/device.html:108 -#: netbox/templates/dcim/inventoryitem.html:56 -#: netbox/templates/dcim/module.html:81 netbox/templates/dcim/modulebay.html:74 -#: netbox/templates/dcim/rack.html:61 +#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 +#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 +#: templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "" -#: netbox/templates/dcim/device.html:123 +#: templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "" -#: netbox/templates/dcim/device.html:164 +#: templates/dcim/device.html:164 msgid "Create VDC" msgstr "" -#: netbox/templates/dcim/device.html:175 -#: netbox/templates/dcim/device_edit.html:64 -#: netbox/virtualization/forms/model_forms.py:223 +#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 +#: virtualization/forms/model_forms.py:223 msgid "Management" msgstr "" -#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 -#: netbox/templates/dcim/device.html:227 -#: netbox/templates/virtualization/virtualmachine.html:57 -#: netbox/templates/virtualization/virtualmachine.html:73 +#: templates/dcim/device.html:195 templates/dcim/device.html:211 +#: templates/dcim/device.html:227 +#: templates/virtualization/virtualmachine.html:57 +#: templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "" -#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 -#: netbox/templates/dcim/device.html:229 -#: netbox/templates/virtualization/virtualmachine.html:59 -#: netbox/templates/virtualization/virtualmachine.html:75 +#: templates/dcim/device.html:197 templates/dcim/device.html:213 +#: templates/dcim/device.html:229 +#: templates/virtualization/virtualmachine.html:59 +#: templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "" -#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 +#: templates/dcim/device.html:252 templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "" -#: netbox/templates/dcim/device.html:256 +#: templates/dcim/device.html:256 msgid "Input" msgstr "" -#: netbox/templates/dcim/device.html:257 +#: templates/dcim/device.html:257 msgid "Outlets" msgstr "" -#: netbox/templates/dcim/device.html:258 +#: templates/dcim/device.html:258 msgid "Allocated" msgstr "" -#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 -#: netbox/templates/dcim/device.html:286 -#: netbox/templates/dcim/powerfeed.html:67 +#: templates/dcim/device.html:268 templates/dcim/device.html:270 +#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 msgid "VA" msgstr "" -#: netbox/templates/dcim/device.html:280 +#: templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "" -#: netbox/templates/dcim/device.html:306 -#: netbox/templates/virtualization/virtualmachine.html:158 +#: templates/dcim/device.html:306 +#: templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "" -#: netbox/templates/dcim/device/base.html:21 -#: netbox/templates/dcim/device_list.html:9 -#: netbox/templates/dcim/devicetype/base.html:18 -#: netbox/templates/dcim/inc/moduletype_buttons.html:9 -#: netbox/templates/dcim/module.html:18 -#: netbox/templates/virtualization/virtualmachine/base.html:22 -#: netbox/templates/virtualization/virtualmachine_list.html:8 +#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 +#: templates/dcim/devicetype/base.html:18 +#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 +#: templates/virtualization/virtualmachine/base.html:22 +#: templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "" -#: netbox/templates/dcim/device/consoleports.html:24 +#: templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "" -#: netbox/templates/dcim/device/consoleserverports.html:24 +#: templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "" -#: netbox/templates/dcim/device/devicebays.html:10 +#: templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "" -#: netbox/templates/dcim/device/frontports.html:24 +#: templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "" -#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 +#: templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "" -#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 +#: templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "" -#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 +#: templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "" -#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 +#: templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "" -#: netbox/templates/dcim/device/interfaces.html:27 +#: templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "" -#: netbox/templates/dcim/device/inventory.html:10 -#: netbox/templates/dcim/inc/panels/inventory_items.html:10 +#: templates/dcim/device/inventory.html:10 +#: templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "" -#: netbox/templates/dcim/device/modulebays.html:10 +#: templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "" -#: netbox/templates/dcim/device/poweroutlets.html:24 +#: templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "" -#: netbox/templates/dcim/device/powerports.html:24 +#: templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "" -#: netbox/templates/dcim/device/rearports.html:24 +#: templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "" -#: netbox/templates/dcim/device/render_config.html:5 -#: netbox/templates/virtualization/virtualmachine/render_config.html:5 +#: templates/dcim/device/render_config.html:5 +#: templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "" -#: netbox/templates/dcim/device/render_config.html:35 -#: netbox/templates/virtualization/virtualmachine/render_config.html:35 +#: templates/dcim/device/render_config.html:35 +#: templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "" -#: netbox/templates/dcim/device/render_config.html:53 -#: netbox/templates/virtualization/virtualmachine/render_config.html:53 +#: templates/dcim/device/render_config.html:53 +#: templates/virtualization/virtualmachine/render_config.html:53 msgid "Rendered Config" msgstr "" -#: netbox/templates/dcim/device/render_config.html:55 -#: netbox/templates/virtualization/virtualmachine/render_config.html:55 +#: templates/dcim/device/render_config.html:55 +#: templates/virtualization/virtualmachine/render_config.html:55 msgid "Download" msgstr "" -#: netbox/templates/dcim/device/render_config.html:61 -#: netbox/templates/virtualization/virtualmachine/render_config.html:61 +#: templates/dcim/device/render_config.html:61 +#: templates/virtualization/virtualmachine/render_config.html:61 msgid "No configuration template found" msgstr "" -#: netbox/templates/dcim/device_edit.html:44 +#: templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "" -#: netbox/templates/dcim/device_edit.html:48 -#: netbox/utilities/templates/form_helpers/render_field.html:22 +#: templates/dcim/device_edit.html:48 +#: utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "" -#: netbox/templates/dcim/device_edit.html:49 -#: netbox/templates/generic/bulk_remove.html:21 -#: netbox/utilities/templates/helpers/table_config_form.html:23 +#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 +#: utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "" -#: netbox/templates/dcim/device_edit.html:110 +#: templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "" -#: netbox/templates/dcim/device_list.html:82 -#: netbox/templates/generic/bulk_rename.html:57 -#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 -#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 +#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 +#: templates/virtualization/virtualmachine/interfaces.html:11 +#: templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "" -#: netbox/templates/dcim/devicebay.html:17 +#: templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "" -#: netbox/templates/dcim/devicebay.html:43 +#: templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "" -#: netbox/templates/dcim/devicebay_depopulate.html:6 +#: templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "" -#: netbox/templates/dcim/devicebay_depopulate.html:13 +#: templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " "%(device_bay)s?" msgstr "" -#: netbox/templates/dcim/devicebay_populate.html:13 +#: templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "" -#: netbox/templates/dcim/devicebay_populate.html:22 +#: templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "" -#: netbox/templates/dcim/devicerole.html:14 -#: netbox/templates/dcim/platform.html:17 +#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 msgid "Add Device" msgstr "" -#: netbox/templates/dcim/devicerole.html:40 +#: templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "" -#: netbox/templates/dcim/devicetype.html:18 -#: netbox/templates/dcim/moduletype.html:29 +#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "" -#: netbox/templates/dcim/devicetype.html:25 -#: netbox/templates/dcim/moduletype.html:33 +#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "" -#: netbox/templates/dcim/devicetype.html:41 +#: templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "" -#: netbox/templates/dcim/devicetype.html:59 +#: templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "" -#: netbox/templates/dcim/devicetype.html:71 +#: templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "" -#: netbox/templates/dcim/devicetype.html:83 +#: templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "" -#: netbox/templates/dcim/frontport.html:54 +#: templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "" -#: netbox/templates/dcim/frontport.html:72 -#: netbox/templates/dcim/interface.html:144 -#: netbox/templates/dcim/poweroutlet.html:63 -#: netbox/templates/dcim/powerport.html:63 -#: netbox/templates/dcim/rearport.html:68 +#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 +#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 +#: templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "" -#: netbox/templates/dcim/frontport.html:86 -#: netbox/templates/dcim/rearport.html:82 +#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "" -#: netbox/templates/dcim/htmx/cable_edit.html:10 +#: templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "" -#: netbox/templates/dcim/htmx/cable_edit.html:30 +#: templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "" -#: netbox/templates/dcim/inc/cable_termination.html:65 +#: templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "" -#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 +#: templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "" -#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 +#: templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "" -#: netbox/templates/dcim/inc/connection_endpoints.html:13 +#: templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "" -#: netbox/templates/dcim/inc/connection_endpoints.html:18 +#: templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "" -#: netbox/templates/dcim/inc/connection_endpoints.html:23 +#: templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "" -#: netbox/templates/dcim/inc/endpoint_connection.html:8 -#: netbox/templates/dcim/powerfeed.html:120 -#: netbox/templates/dcim/rearport.html:94 +#: templates/dcim/inc/endpoint_connection.html:8 +#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 msgid "Not connected" msgstr "" -#: netbox/templates/dcim/inc/interface_vlans_table.html:6 +#: templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "" -#: netbox/templates/dcim/inc/interface_vlans_table.html:37 +#: templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "" -#: netbox/templates/dcim/inc/interface_vlans_table.html:44 -#: netbox/templates/ipam/prefix_list.html:16 -#: netbox/templates/ipam/prefix_list.html:33 +#: templates/dcim/inc/interface_vlans_table.html:44 +#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "" -#: netbox/templates/dcim/inc/interface_vlans_table.html:47 +#: templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "" -#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 +#: templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "" -#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 +#: templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "" -#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 +#: templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "" -#: netbox/templates/dcim/inc/rack_elevation.html:3 +#: templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "" -#: netbox/templates/dcim/interface.html:17 +#: templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "" -#: netbox/templates/dcim/interface.html:50 +#: templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "" -#: netbox/templates/dcim/interface.html:73 +#: templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "" -#: netbox/templates/dcim/interface.html:77 +#: templates/dcim/interface.html:77 msgid "PoE Type" msgstr "" -#: netbox/templates/dcim/interface.html:81 -#: netbox/templates/virtualization/vminterface.html:63 +#: templates/dcim/interface.html:81 +#: templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "" -#: netbox/templates/dcim/interface.html:125 -#: netbox/templates/virtualization/vminterface.html:59 +#: templates/dcim/interface.html:125 +#: templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "" -#: netbox/templates/dcim/interface.html:151 +#: templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "" -#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:55 +#: templates/dcim/interface.html:218 vpn/choices.py:55 msgid "Peer" msgstr "" -#: netbox/templates/dcim/interface.html:230 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 +#: templates/dcim/interface.html:230 +#: templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "" -#: netbox/templates/dcim/interface.html:239 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 +#: templates/dcim/interface.html:239 +#: templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "" -#: netbox/templates/dcim/interface.html:242 -#: netbox/templates/dcim/interface.html:250 -#: netbox/templates/dcim/interface.html:261 -#: netbox/templates/dcim/interface.html:269 +#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 +#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 msgid "MHz" msgstr "" -#: netbox/templates/dcim/interface.html:258 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 +#: templates/dcim/interface.html:258 +#: templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "" -#: netbox/templates/dcim/interface.html:285 -#: netbox/templates/wireless/wirelesslan.html:14 -#: netbox/templates/wireless/wirelesslink.html:21 -#: netbox/wireless/forms/bulk_edit.py:60 netbox/wireless/forms/bulk_edit.py:102 -#: netbox/wireless/forms/filtersets.py:40 -#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 -#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 +#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 +#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 +#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 +#: wireless/forms/filtersets.py:80 wireless/models.py:82 wireless/models.py:156 +#: wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "" -#: netbox/templates/dcim/interface.html:305 +#: templates/dcim/interface.html:305 msgid "LAG Members" msgstr "" -#: netbox/templates/dcim/interface.html:323 +#: templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "" -#: netbox/templates/dcim/interface.html:343 -#: netbox/templates/ipam/fhrpgroup.html:73 -#: netbox/templates/ipam/iprange/ip_addresses.html:7 -#: netbox/templates/ipam/prefix/ip_addresses.html:7 -#: netbox/templates/virtualization/vminterface.html:89 +#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 +#: templates/ipam/iprange/ip_addresses.html:7 +#: templates/ipam/prefix/ip_addresses.html:7 +#: templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "" -#: netbox/templates/dcim/inventoryitem.html:24 +#: templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "" -#: netbox/templates/dcim/inventoryitem.html:48 +#: templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "" -#: netbox/templates/dcim/location.html:17 +#: templates/dcim/location.html:17 msgid "Add Child Location" msgstr "" -#: netbox/templates/dcim/location.html:77 +#: templates/dcim/location.html:77 msgid "Child Locations" msgstr "" -#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 +#: templates/dcim/location.html:81 templates/dcim/site.html:131 msgid "Add a Location" msgstr "" -#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 +#: templates/dcim/location.html:94 templates/dcim/site.html:144 msgid "Add a Device" msgstr "" -#: netbox/templates/dcim/manufacturer.html:16 +#: templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "" -#: netbox/templates/dcim/manufacturer.html:21 +#: templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "" -#: netbox/templates/dcim/powerfeed.html:53 +#: templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "" -#: netbox/templates/dcim/powerfeed.html:63 +#: templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "" -#: netbox/templates/dcim/powerfeed.html:80 +#: templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "" -#: netbox/templates/dcim/powerfeed.html:88 +#: templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "" -#: netbox/templates/dcim/powerfeed.html:92 +#: templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "" -#: netbox/templates/dcim/poweroutlet.html:48 +#: templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "" -#: netbox/templates/dcim/powerpanel.html:72 +#: templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "" -#: netbox/templates/dcim/powerport.html:44 +#: templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "" -#: netbox/templates/dcim/powerport.html:48 +#: templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "" -#: netbox/templates/dcim/rack.html:69 +#: templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "" -#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 +#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "" -#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 +#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "" -#: netbox/templates/dcim/rack.html:104 +#: templates/dcim/rack.html:104 msgid "Total Weight" msgstr "" -#: netbox/templates/dcim/rack.html:125 -#: netbox/templates/dcim/rack_elevation_list.html:15 +#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "" -#: netbox/templates/dcim/rack.html:126 -#: netbox/templates/dcim/rack_elevation_list.html:16 +#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "" -#: netbox/templates/dcim/rack.html:127 -#: netbox/templates/dcim/rack_elevation_list.html:17 +#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "" -#: netbox/templates/dcim/rack/reservations.html:8 +#: templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "" -#: netbox/templates/dcim/rack_elevation_list.html:12 +#: templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "" -#: netbox/templates/dcim/rack_elevation_list.html:14 +#: templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "" -#: netbox/templates/dcim/rack_elevation_list.html:25 +#: templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "" -#: netbox/templates/dcim/rack_elevation_list.html:74 +#: templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "" -#: netbox/templates/dcim/rack_list.html:8 +#: templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "" -#: netbox/templates/dcim/rackreservation.html:42 +#: templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "" -#: netbox/templates/dcim/rackrole.html:10 +#: templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "" -#: netbox/templates/dcim/rearport.html:50 +#: templates/dcim/rearport.html:50 msgid "Positions" msgstr "" -#: netbox/templates/dcim/region.html:17 netbox/templates/dcim/sitegroup.html:17 +#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "" -#: netbox/templates/dcim/region.html:55 +#: templates/dcim/region.html:55 msgid "Child Regions" msgstr "" -#: netbox/templates/dcim/region.html:59 +#: templates/dcim/region.html:59 msgid "Add Region" msgstr "" -#: netbox/templates/dcim/site.html:64 +#: templates/dcim/site.html:64 msgid "Time Zone" msgstr "" -#: netbox/templates/dcim/site.html:67 +#: templates/dcim/site.html:67 msgid "UTC" msgstr "" -#: netbox/templates/dcim/site.html:68 +#: templates/dcim/site.html:68 msgid "Site time" msgstr "" -#: netbox/templates/dcim/site.html:75 +#: templates/dcim/site.html:75 msgid "Physical Address" msgstr "" -#: netbox/templates/dcim/site.html:90 +#: templates/dcim/site.html:90 msgid "Shipping Address" msgstr "" -#: netbox/templates/dcim/sitegroup.html:55 -#: netbox/templates/tenancy/contactgroup.html:46 -#: netbox/templates/tenancy/tenantgroup.html:55 -#: netbox/templates/wireless/wirelesslangroup.html:55 +#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 +#: templates/tenancy/tenantgroup.html:55 +#: templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "" -#: netbox/templates/dcim/sitegroup.html:59 +#: templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "" -#: netbox/templates/dcim/trace/attachment.html:5 -#: netbox/templates/extras/exporttemplate.html:31 +#: templates/dcim/trace/attachment.html:5 +#: templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "" -#: netbox/templates/dcim/virtualchassis.html:57 +#: templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "" -#: netbox/templates/dcim/virtualchassis_add.html:18 +#: templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "" -#: netbox/templates/dcim/virtualchassis_add_member.html:10 +#: templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "" -#: netbox/templates/dcim/virtualchassis_add_member.html:19 +#: templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "" -#: netbox/templates/dcim/virtualchassis_add_member.html:27 -#: netbox/templates/generic/object_edit.html:78 -#: netbox/templates/users/objectpermission.html:31 -#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 +#: templates/dcim/virtualchassis_add_member.html:27 +#: templates/generic/object_edit.html:78 +#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 +#: users/forms/model_forms.py:312 msgid "Actions" msgstr "" -#: netbox/templates/dcim/virtualchassis_add_member.html:29 +#: templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "" -#: netbox/templates/dcim/virtualchassis_edit.html:7 +#: templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "" -#: netbox/templates/dcim/virtualchassis_edit.html:53 +#: templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "" -#: netbox/templates/dcim/virtualchassis_remove_member.html:5 +#: templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "" -#: netbox/templates/dcim/virtualchassis_remove_member.html:9 +#: templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " "chassis %(name)s?" msgstr "" -#: netbox/templates/dcim/virtualdevicecontext.html:26 -#: netbox/templates/vpn/l2vpn.html:18 +#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "" -#: netbox/templates/exceptions/import_error.html:6 +#: templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" msgstr "" -#: netbox/templates/exceptions/import_error.html:10 +#: templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "" -#: netbox/templates/exceptions/import_error.html:11 +#: templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12751,28 +12107,28 @@ msgid "" "of required packages." msgstr "" -#: netbox/templates/exceptions/import_error.html:20 +#: templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "" -#: netbox/templates/exceptions/import_error.html:21 +#: templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service " "(e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code " "is running." msgstr "" -#: netbox/templates/exceptions/permission_error.html:6 +#: templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" msgstr "" -#: netbox/templates/exceptions/permission_error.html:10 +#: templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "" -#: netbox/templates/exceptions/permission_error.html:11 +#: templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12780,377 +12136,372 @@ msgid "" "path." msgstr "" -#: netbox/templates/exceptions/programming_error.html:6 +#: templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" msgstr "" -#: netbox/templates/exceptions/programming_error.html:10 +#: templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "" -#: netbox/templates/exceptions/programming_error.html:11 +#: templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " "executing python3 manage.py migrate from the command line." msgstr "" -#: netbox/templates/exceptions/programming_error.html:18 +#: templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "" -#: netbox/templates/exceptions/programming_error.html:19 +#: templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " "for SELECT VERSION()." msgstr "" -#: netbox/templates/extras/configcontext.html:45 -#: netbox/templates/extras/configtemplate.html:37 -#: netbox/templates/extras/exporttemplate.html:51 +#: templates/extras/configcontext.html:45 +#: templates/extras/configtemplate.html:37 +#: templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "" -#: netbox/templates/extras/configcontext.html:54 -#: netbox/templates/extras/configtemplate.html:46 -#: netbox/templates/extras/exporttemplate.html:60 +#: templates/extras/configcontext.html:54 +#: templates/extras/configtemplate.html:46 +#: templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "" -#: netbox/templates/extras/configcontext_list.html:7 -#: netbox/templates/extras/configtemplate_list.html:7 -#: netbox/templates/extras/exporttemplate_list.html:7 +#: templates/extras/configcontext_list.html:7 +#: templates/extras/configtemplate_list.html:7 +#: templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "" -#: netbox/templates/extras/configtemplate.html:56 +#: templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "" -#: netbox/templates/extras/configtemplate.html:67 -#: netbox/templates/extras/exporttemplate.html:79 +#: templates/extras/configtemplate.html:67 +#: templates/extras/exporttemplate.html:79 msgid "Template" msgstr "" -#: netbox/templates/extras/customfield.html:30 -#: netbox/templates/extras/customlink.html:21 +#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 msgid "Group Name" msgstr "" -#: netbox/templates/extras/customfield.html:42 +#: templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "" -#: netbox/templates/extras/customfield.html:46 +#: templates/extras/customfield.html:46 msgid "Cloneable" msgstr "" -#: netbox/templates/extras/customfield.html:56 +#: templates/extras/customfield.html:56 msgid "Default Value" msgstr "" -#: netbox/templates/extras/customfield.html:73 +#: templates/extras/customfield.html:73 msgid "Search Weight" msgstr "" -#: netbox/templates/extras/customfield.html:83 +#: templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "" -#: netbox/templates/extras/customfield.html:87 +#: templates/extras/customfield.html:87 msgid "Display Weight" msgstr "" -#: netbox/templates/extras/customfield.html:91 +#: templates/extras/customfield.html:91 msgid "UI Visible" msgstr "" -#: netbox/templates/extras/customfield.html:95 +#: templates/extras/customfield.html:95 msgid "UI Editable" msgstr "" -#: netbox/templates/extras/customfield.html:115 +#: templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "" -#: netbox/templates/extras/customfield.html:126 +#: templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "" -#: netbox/templates/extras/customlink.html:29 +#: templates/extras/customlink.html:29 msgid "Button Class" msgstr "" -#: netbox/templates/extras/customlink.html:39 -#: netbox/templates/extras/exporttemplate.html:66 -#: netbox/templates/extras/savedfilter.html:39 +#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 +#: templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "" -#: netbox/templates/extras/customlink.html:52 +#: templates/extras/customlink.html:52 msgid "Link Text" msgstr "" -#: netbox/templates/extras/customlink.html:58 +#: templates/extras/customlink.html:58 msgid "Link URL" msgstr "" -#: netbox/templates/extras/dashboard/reset.html:4 netbox/templates/home.html:66 +#: templates/extras/dashboard/reset.html:4 templates/home.html:66 msgid "Reset Dashboard" msgstr "" -#: netbox/templates/extras/dashboard/reset.html:8 +#: templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." msgstr "" -#: netbox/templates/extras/dashboard/reset.html:13 +#: templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." msgstr "" -#: netbox/templates/extras/dashboard/widget.html:21 +#: templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "" -#: netbox/templates/extras/dashboard/widget.html:36 +#: templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "" -#: netbox/templates/extras/dashboard/widget_add.html:7 +#: templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "" -#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 +#: templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "" -#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 +#: templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "" -#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 +#: templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "" -#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 +#: templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "" -#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 +#: templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "" -#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 +#: templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "" -#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 +#: templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "" -#: netbox/templates/extras/eventrule.html:61 +#: templates/extras/eventrule.html:61 msgid "Conditions" msgstr "" -#: netbox/templates/extras/exporttemplate.html:23 +#: templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "" -#: netbox/templates/extras/exporttemplate.html:27 +#: templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "" -#: netbox/templates/extras/htmx/script_result.html:10 +#: templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "" -#: netbox/templates/extras/htmx/script_result.html:15 +#: templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "" -#: netbox/templates/extras/htmx/script_result.html:23 +#: templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "" -#: netbox/templates/extras/htmx/script_result.html:43 +#: templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "" -#: netbox/templates/extras/htmx/script_result.html:56 +#: templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "" -#: netbox/templates/extras/inc/result_pending.html:4 +#: templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "" -#: netbox/templates/extras/inc/result_pending.html:6 +#: templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "" -#: netbox/templates/extras/journalentry.html:15 +#: templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "" -#: netbox/templates/extras/notificationgroup.html:11 +#: templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "" -#: netbox/templates/extras/notificationgroup.html:36 -#: netbox/templates/extras/notificationgroup.html:46 -#: netbox/utilities/templates/widgets/clearable_file_input.html:12 +#: templates/extras/notificationgroup.html:36 +#: templates/extras/notificationgroup.html:46 +#: utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "" -#: netbox/templates/extras/object_configcontext.html:19 +#: templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "" -#: netbox/templates/extras/object_configcontext.html:25 +#: templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "" -#: netbox/templates/extras/object_journal.html:17 +#: templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "" -#: netbox/templates/extras/report/base.html:30 +#: templates/extras/report/base.html:30 msgid "Report" msgstr "" -#: netbox/templates/extras/script.html:14 +#: templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "" -#: netbox/templates/extras/script.html:41 -#: netbox/templates/extras/script.html:45 -#: netbox/templates/extras/script_list.html:87 +#: templates/extras/script.html:41 templates/extras/script.html:45 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "" -#: netbox/templates/extras/script.html:51 -#: netbox/templates/extras/script/source.html:10 +#: templates/extras/script.html:51 templates/extras/script/source.html:10 msgid "Error loading script" msgstr "" -#: netbox/templates/extras/script/jobs.html:16 +#: templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "" -#: netbox/templates/extras/script_list.html:47 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "" -#: netbox/templates/extras/script_list.html:62 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "" -#: netbox/templates/extras/script_list.html:75 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "" -#: netbox/templates/extras/script_list.html:85 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "" -#: netbox/templates/extras/script_list.html:133 +#: templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: netbox/templates/extras/script_list.html:141 +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "" -#: netbox/templates/extras/script_list.html:144 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " "an uploaded file or data source." msgstr "" -#: netbox/templates/extras/script_result.html:35 -#: netbox/templates/generic/object_list.html:50 netbox/templates/search.html:13 +#: templates/extras/script_result.html:35 templates/generic/object_list.html:50 +#: templates/search.html:13 msgid "Results" msgstr "" -#: netbox/templates/extras/script_result.html:46 +#: templates/extras/script_result.html:46 msgid "Log threshold" msgstr "" -#: netbox/templates/extras/script_result.html:56 +#: templates/extras/script_result.html:56 msgid "All" msgstr "" -#: netbox/templates/extras/tag.html:32 +#: templates/extras/tag.html:32 msgid "Tagged Items" msgstr "" -#: netbox/templates/extras/tag.html:43 +#: templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "" -#: netbox/templates/extras/tag.html:51 +#: templates/extras/tag.html:51 msgid "Any" msgstr "" -#: netbox/templates/extras/tag.html:57 +#: templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "" -#: netbox/templates/extras/tag.html:81 +#: templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "" -#: netbox/templates/extras/webhook.html:26 +#: templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "" -#: netbox/templates/extras/webhook.html:34 +#: templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "" -#: netbox/templates/extras/webhook.html:47 +#: templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "" -#: netbox/templates/extras/webhook.html:60 +#: templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "" -#: netbox/templates/extras/webhook.html:70 +#: templates/extras/webhook.html:70 msgid "Body Template" msgstr "" -#: netbox/templates/generic/bulk_add_component.html:29 +#: templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "" -#: netbox/templates/generic/bulk_add_component.html:34 -#: netbox/templates/generic/bulk_delete.html:32 -#: netbox/templates/generic/bulk_edit.html:33 +#: templates/generic/bulk_add_component.html:34 +#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "" -#: netbox/templates/generic/bulk_add_component.html:58 +#: templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "" -#: netbox/templates/generic/bulk_delete.html:27 +#: templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "" -#: netbox/templates/generic/bulk_delete.html:49 +#: templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "" -#: netbox/templates/generic/bulk_delete.html:50 +#: templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -13158,82 +12509,79 @@ msgid "" "this action." msgstr "" -#: netbox/templates/generic/bulk_edit.html:21 -#: netbox/templates/generic/object_edit.html:22 +#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 msgid "Editing" msgstr "" -#: netbox/templates/generic/bulk_edit.html:28 +#: templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "" -#: netbox/templates/generic/bulk_edit.html:107 -#: netbox/templates/generic/bulk_rename.html:66 +#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "" -#: netbox/templates/generic/bulk_import.html:19 +#: templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "" -#: netbox/templates/generic/bulk_import.html:25 +#: templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "" -#: netbox/templates/generic/bulk_import.html:30 +#: templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "" -#: netbox/templates/generic/bulk_import.html:58 -#: netbox/templates/generic/bulk_import.html:80 -#: netbox/templates/generic/bulk_import.html:102 +#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 +#: templates/generic/bulk_import.html:102 msgid "Submit" msgstr "" -#: netbox/templates/generic/bulk_import.html:113 +#: templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "" -#: netbox/templates/generic/bulk_import.html:119 +#: templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "" -#: netbox/templates/generic/bulk_import.html:148 +#: templates/generic/bulk_import.html:148 msgid "choices" msgstr "" -#: netbox/templates/generic/bulk_import.html:161 +#: templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "" -#: netbox/templates/generic/bulk_import.html:181 +#: templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "" -#: netbox/templates/generic/bulk_import.html:183 +#: templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "" -#: netbox/templates/generic/bulk_import.html:195 +#: templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" -#: netbox/templates/generic/bulk_import.html:201 +#: templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " "%(example)s would identify a VRF by its route distinguisher." msgstr "" -#: netbox/templates/generic/bulk_remove.html:28 +#: templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "" -#: netbox/templates/generic/bulk_remove.html:42 +#: templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "" -#: netbox/templates/generic/bulk_remove.html:43 +#: templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13241,442 +12589,440 @@ msgid "" "removed and confirm below." msgstr "" -#: netbox/templates/generic/bulk_remove.html:64 +#: templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "" -#: netbox/templates/generic/bulk_rename.html:20 +#: templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "" -#: netbox/templates/generic/bulk_rename.html:27 +#: templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "" -#: netbox/templates/generic/bulk_rename.html:39 +#: templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "" -#: netbox/templates/generic/bulk_rename.html:40 +#: templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "" -#: netbox/templates/generic/bulk_rename.html:64 -#: netbox/utilities/templates/widgets/markdown_input.html:11 +#: templates/generic/bulk_rename.html:64 +#: utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "" -#: netbox/templates/generic/confirmation_form.html:16 +#: templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "" -#: netbox/templates/generic/confirmation_form.html:20 +#: templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "" -#: netbox/templates/generic/object_children.html:47 -#: netbox/utilities/templates/buttons/bulk_edit.html:4 +#: templates/generic/object_children.html:47 +#: utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "" -#: netbox/templates/generic/object_children.html:61 -#: netbox/utilities/templates/buttons/bulk_delete.html:4 +#: templates/generic/object_children.html:61 +#: utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "" -#: netbox/templates/generic/object_edit.html:24 +#: templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "" -#: netbox/templates/generic/object_edit.html:35 +#: templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "" -#: netbox/templates/generic/object_edit.html:36 +#: templates/generic/object_edit.html:36 msgid "Help" msgstr "" -#: netbox/templates/generic/object_edit.html:83 +#: templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "" -#: netbox/templates/generic/object_list.html:57 +#: templates/generic/object_list.html:57 msgid "Filters" msgstr "" -#: netbox/templates/generic/object_list.html:88 +#: templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " "%(object_type_plural)s matching query" msgstr "" -#: netbox/templates/home.html:15 +#: templates/home.html:15 msgid "New Release Available" msgstr "" -#: netbox/templates/home.html:16 +#: templates/home.html:16 msgid "is available" msgstr "" -#: netbox/templates/home.html:18 +#: templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "" -#: netbox/templates/home.html:40 +#: templates/home.html:40 msgid "Unlock Dashboard" msgstr "" -#: netbox/templates/home.html:49 +#: templates/home.html:49 msgid "Lock Dashboard" msgstr "" -#: netbox/templates/home.html:60 +#: templates/home.html:60 msgid "Add Widget" msgstr "" -#: netbox/templates/home.html:63 +#: templates/home.html:63 msgid "Save Layout" msgstr "" -#: netbox/templates/htmx/delete_form.html:7 +#: templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "" -#: netbox/templates/htmx/delete_form.html:11 +#: templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " "%(object_type)s %(object)s?" msgstr "" -#: netbox/templates/htmx/delete_form.html:17 +#: templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "" -#: netbox/templates/htmx/notifications.html:15 +#: templates/htmx/notifications.html:15 msgid "ago" msgstr "" -#: netbox/templates/htmx/notifications.html:26 +#: templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "" -#: netbox/templates/htmx/notifications.html:31 +#: templates/htmx/notifications.html:31 msgid "All notifications" msgstr "" -#: netbox/templates/htmx/object_selector.html:5 +#: templates/htmx/object_selector.html:5 msgid "Select" msgstr "" -#: netbox/templates/inc/filter_list.html:43 -#: netbox/utilities/templates/helpers/table_config_form.html:39 +#: templates/inc/filter_list.html:43 +#: utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "" -#: netbox/templates/inc/light_toggle.html:4 +#: templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "" -#: netbox/templates/inc/light_toggle.html:7 +#: templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "" -#: netbox/templates/inc/missing_prerequisites.html:8 +#: templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " "%(prerequisite_model)s." msgstr "" -#: netbox/templates/inc/paginator.html:15 +#: templates/inc/paginator.html:15 msgid "Page selection" msgstr "" -#: netbox/templates/inc/paginator.html:75 +#: templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "" -#: netbox/templates/inc/paginator.html:82 +#: templates/inc/paginator.html:82 msgid "Pagination options" msgstr "" -#: netbox/templates/inc/paginator.html:86 +#: templates/inc/paginator.html:86 msgid "Per Page" msgstr "" -#: netbox/templates/inc/panels/image_attachments.html:10 +#: templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "" -#: netbox/templates/inc/panels/related_objects.html:5 +#: templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "" -#: netbox/templates/inc/panels/tags.html:11 +#: templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "" -#: netbox/templates/inc/sync_warning.html:10 +#: templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "" -#: netbox/templates/inc/table_controls_htmx.html:7 +#: templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "" -#: netbox/templates/inc/table_controls_htmx.html:20 +#: templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "" -#: netbox/templates/inc/table_htmx.html:18 +#: templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "" -#: netbox/templates/inc/user_menu.html:6 +#: templates/inc/user_menu.html:6 msgid "Help center" msgstr "" -#: netbox/templates/inc/user_menu.html:41 +#: templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "" -#: netbox/templates/inc/user_menu.html:61 +#: templates/inc/user_menu.html:61 msgid "Log Out" msgstr "" -#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 +#: templates/inc/user_menu.html:68 templates/login.html:38 msgid "Log In" msgstr "" -#: netbox/templates/ipam/aggregate.html:14 -#: netbox/templates/ipam/ipaddress.html:14 -#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 +#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 +#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 msgid "Family" msgstr "" -#: netbox/templates/ipam/aggregate.html:39 +#: templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "" -#: netbox/templates/ipam/aggregate/prefixes.html:8 -#: netbox/templates/ipam/prefix/prefixes.html:8 -#: netbox/templates/ipam/role.html:10 +#: templates/ipam/aggregate/prefixes.html:8 +#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 msgid "Add Prefix" msgstr "" -#: netbox/templates/ipam/asn.html:23 +#: templates/ipam/asn.html:23 msgid "AS Number" msgstr "" -#: netbox/templates/ipam/fhrpgroup.html:52 +#: templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "" -#: netbox/templates/ipam/fhrpgroup.html:56 +#: templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "" -#: netbox/templates/ipam/fhrpgroup.html:69 +#: templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "" -#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 +#: templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "" -#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 +#: templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "" -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 +#: templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "" -#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 +#: templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "" -#: netbox/templates/ipam/inc/toggle_available.html:7 +#: templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "" -#: netbox/templates/ipam/inc/toggle_available.html:10 +#: templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "" -#: netbox/templates/ipam/inc/toggle_available.html:13 +#: templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "" -#: netbox/templates/ipam/ipaddress.html:23 -#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 +#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 +#: templates/ipam/prefix.html:24 msgid "Global" msgstr "" -#: netbox/templates/ipam/ipaddress.html:85 +#: templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "" -#: netbox/templates/ipam/ipaddress_assign.html:8 +#: templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "" -#: netbox/templates/ipam/ipaddress_assign.html:22 +#: templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "" -#: netbox/templates/ipam/ipaddress_assign.html:35 +#: templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "" -#: netbox/templates/ipam/ipaddress_bulk_add.html:6 +#: templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "" -#: netbox/templates/ipam/iprange.html:17 +#: templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "" -#: netbox/templates/ipam/iprange.html:21 +#: templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "" -#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 +#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "" -#: netbox/templates/ipam/prefix.html:99 +#: templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "" -#: netbox/templates/ipam/prefix.html:118 +#: templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "" -#: netbox/templates/ipam/prefix.html:126 +#: templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "" -#: netbox/templates/ipam/prefix.html:138 +#: templates/ipam/prefix.html:138 msgid "First available IP" msgstr "" -#: netbox/templates/ipam/prefix.html:179 +#: templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "" -#: netbox/templates/ipam/prefix.html:185 +#: templates/ipam/prefix.html:185 msgid "Network Address" msgstr "" -#: netbox/templates/ipam/prefix.html:189 +#: templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "" -#: netbox/templates/ipam/prefix.html:193 +#: templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "" -#: netbox/templates/ipam/prefix.html:197 +#: templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "" -#: netbox/templates/ipam/prefix/ip_ranges.html:7 +#: templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "" -#: netbox/templates/ipam/prefix_list.html:7 +#: templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "" -#: netbox/templates/ipam/prefix_list.html:11 +#: templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "" -#: netbox/templates/ipam/prefix_list.html:28 +#: templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "" -#: netbox/templates/ipam/rir.html:10 +#: templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "" -#: netbox/templates/ipam/routetarget.html:38 +#: templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "" -#: netbox/templates/ipam/routetarget.html:44 +#: templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "" -#: netbox/templates/ipam/routetarget.html:52 +#: templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "" -#: netbox/templates/ipam/routetarget.html:58 +#: templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "" -#: netbox/templates/ipam/vlan.html:88 +#: templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "" -#: netbox/templates/ipam/vlangroup.html:18 +#: templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "" -#: netbox/templates/ipam/vrf.html:16 +#: templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "" -#: netbox/templates/ipam/vrf.html:29 +#: templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "" -#: netbox/templates/login.html:29 -#: netbox/utilities/templates/form_helpers/render_errors.html:7 +#: templates/login.html:29 +#: utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "" -#: netbox/templates/login.html:69 +#: templates/login.html:69 msgid "Sign In" msgstr "" -#: netbox/templates/login.html:77 +#: templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "" -#: netbox/templates/media_failure.html:7 +#: templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "" -#: netbox/templates/media_failure.html:21 +#: templates/media_failure.html:21 msgid "Static Media Failure" msgstr "" -#: netbox/templates/media_failure.html:23 +#: templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "" -#: netbox/templates/media_failure.html:26 +#: templates/media_failure.html:26 msgid "Check the following" msgstr "" -#: netbox/templates/media_failure.html:29 +#: templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade. " "This installs the most recent iteration of each static file into the static " "root path." msgstr "" -#: netbox/templates/media_failure.html:35 +#: templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13684,1914 +13030,1879 @@ msgid "" "installation documentation for further guidance." msgstr "" -#: netbox/templates/media_failure.html:47 +#: templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " "is readable by the HTTP server." msgstr "" -#: netbox/templates/media_failure.html:55 +#: templates/media_failure.html:55 #, python-format msgid "" "Click here to attempt loading NetBox again." msgstr "" -#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 -#: netbox/tenancy/forms/bulk_edit.py:137 netbox/tenancy/forms/filtersets.py:102 -#: netbox/tenancy/forms/forms.py:56 netbox/tenancy/forms/model_forms.py:106 -#: netbox/tenancy/forms/model_forms.py:130 netbox/tenancy/tables/contacts.py:98 +#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 +#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 +#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 +#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 msgid "Contact" msgstr "" -#: netbox/templates/tenancy/contact.html:29 -#: netbox/tenancy/forms/bulk_edit.py:99 +#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "" -#: netbox/templates/tenancy/contact.html:33 -#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 +#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 +#: tenancy/tables/contacts.py:64 msgid "Phone" msgstr "" -#: netbox/templates/tenancy/contactgroup.html:18 -#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 +#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 +#: tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "" -#: netbox/templates/tenancy/contactgroup.html:50 +#: templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "" -#: netbox/templates/tenancy/contactrole.html:15 -#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 -#: netbox/tenancy/forms/model_forms.py:87 +#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 +#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "" -#: netbox/templates/tenancy/object_contacts.html:9 +#: templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "" -#: netbox/templates/tenancy/tenantgroup.html:17 +#: templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "" -#: netbox/templates/tenancy/tenantgroup.html:26 -#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 -#: netbox/tenancy/tables/columns.py:61 +#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 +#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "" -#: netbox/templates/tenancy/tenantgroup.html:59 +#: templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "" -#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 +#: templates/users/group.html:39 templates/users/user.html:63 msgid "Assigned Permissions" msgstr "" -#: netbox/templates/users/objectpermission.html:6 -#: netbox/templates/users/objectpermission.html:14 -#: netbox/users/forms/filtersets.py:66 +#: templates/users/objectpermission.html:6 +#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 msgid "Permission" msgstr "" -#: netbox/templates/users/objectpermission.html:34 +#: templates/users/objectpermission.html:34 msgid "View" msgstr "" -#: netbox/templates/users/objectpermission.html:52 -#: netbox/users/forms/model_forms.py:315 +#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 msgid "Constraints" msgstr "" -#: netbox/templates/users/objectpermission.html:72 +#: templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "" -#: netbox/templates/virtualization/cluster.html:52 +#: templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "" -#: netbox/templates/virtualization/cluster.html:55 -#: netbox/templates/virtualization/virtualmachine.html:125 +#: templates/virtualization/cluster.html:55 +#: templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "" -#: netbox/templates/virtualization/cluster.html:59 -#: netbox/templates/virtualization/virtualmachine.html:129 +#: templates/virtualization/cluster.html:59 +#: templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "" -#: netbox/templates/virtualization/cluster.html:69 -#: netbox/templates/virtualization/virtualmachine.html:140 +#: templates/virtualization/cluster.html:69 +#: templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "" -#: netbox/templates/virtualization/cluster/base.html:18 +#: templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "" -#: netbox/templates/virtualization/cluster/base.html:24 +#: templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "" -#: netbox/templates/virtualization/cluster/devices.html:10 +#: templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "" -#: netbox/templates/virtualization/cluster_add_devices.html:9 +#: templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "" -#: netbox/templates/virtualization/cluster_add_devices.html:23 +#: templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "" -#: netbox/templates/virtualization/cluster_add_devices.html:31 +#: templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "" -#: netbox/templates/virtualization/clustergroup.html:10 -#: netbox/templates/virtualization/clustertype.html:10 +#: templates/virtualization/clustergroup.html:10 +#: templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "" -#: netbox/templates/virtualization/clustergroup.html:19 -#: netbox/virtualization/forms/model_forms.py:50 +#: templates/virtualization/clustergroup.html:19 +#: virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "" -#: netbox/templates/virtualization/clustertype.html:19 -#: netbox/templates/virtualization/virtualmachine.html:110 -#: netbox/virtualization/forms/model_forms.py:36 +#: templates/virtualization/clustertype.html:19 +#: templates/virtualization/virtualmachine.html:110 +#: virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "" -#: netbox/templates/virtualization/virtualdisk.html:18 +#: templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "" -#: netbox/templates/virtualization/virtualmachine.html:122 -#: netbox/virtualization/forms/bulk_edit.py:190 -#: netbox/virtualization/forms/model_forms.py:224 +#: templates/virtualization/virtualmachine.html:122 +#: virtualization/forms/bulk_edit.py:190 +#: virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "" -#: netbox/templates/virtualization/virtualmachine.html:178 +#: templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "" -#: netbox/templates/vpn/ikepolicy.html:10 -#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 +#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 +#: vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "" -#: netbox/templates/vpn/ikepolicy.html:21 +#: templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "" -#: netbox/templates/vpn/ikepolicy.html:29 +#: templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "" -#: netbox/templates/vpn/ikepolicy.html:33 -#: netbox/templates/wireless/inc/authentication_attrs.html:20 +#: templates/vpn/ikepolicy.html:33 +#: templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "" -#: netbox/templates/vpn/ikepolicy.html:57 -#: netbox/templates/vpn/ipsecpolicy.html:45 -#: netbox/templates/vpn/ipsecprofile.html:52 -#: netbox/templates/vpn/ipsecprofile.html:77 -#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 -#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 +#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 +#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 +#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 +#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 msgid "Proposals" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:10 +#: templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 -#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 +#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 +#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:25 -#: netbox/templates/vpn/ipsecproposal.html:21 netbox/vpn/forms/bulk_edit.py:102 -#: netbox/vpn/forms/bulk_edit.py:172 netbox/vpn/forms/bulk_import.py:149 -#: netbox/vpn/forms/bulk_import.py:195 netbox/vpn/forms/filtersets.py:106 -#: netbox/vpn/forms/filtersets.py:154 +#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 +#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 +#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 +#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:29 -#: netbox/templates/vpn/ipsecproposal.html:25 netbox/vpn/forms/bulk_edit.py:107 -#: netbox/vpn/forms/bulk_edit.py:177 netbox/vpn/forms/bulk_import.py:153 -#: netbox/vpn/forms/bulk_import.py:200 netbox/vpn/forms/filtersets.py:111 -#: netbox/vpn/forms/filtersets.py:159 +#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 +#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 +#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 +#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:33 +#: templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "" -#: netbox/templates/vpn/ikeproposal.html:37 -#: netbox/templates/vpn/ipsecproposal.html:29 netbox/vpn/forms/bulk_edit.py:182 -#: netbox/vpn/models/crypto.py:146 +#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 +#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "" -#: netbox/templates/vpn/ipsecpolicy.html:10 -#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 +#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 +#: vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "" -#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 -#: netbox/vpn/models/crypto.py:193 +#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 +#: vpn/models/crypto.py:193 msgid "PFS group" msgstr "" -#: netbox/templates/vpn/ipsecprofile.html:10 netbox/vpn/forms/model_forms.py:54 +#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "" -#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 +#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "" -#: netbox/templates/vpn/ipsecproposal.html:10 +#: templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "" -#: netbox/templates/vpn/ipsecproposal.html:33 netbox/vpn/forms/bulk_edit.py:186 -#: netbox/vpn/models/crypto.py:152 +#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 +#: vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "" -#: netbox/templates/vpn/l2vpn.html:11 -#: netbox/templates/vpn/l2vpntermination.html:9 +#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "" -#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 +#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "" -#: netbox/templates/vpn/tunnel.html:9 +#: templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "" -#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 -#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 +#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 +#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "" -#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 -#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 -#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 +#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 +#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 +#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "" -#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 -#: netbox/vpn/forms/filtersets.py:68 +#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 +#: vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "" -#: netbox/templates/vpn/tunnelgroup.html:14 +#: templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "" -#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 -#: netbox/vpn/forms/model_forms.py:49 +#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 +#: vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "" -#: netbox/templates/vpn/tunneltermination.html:10 +#: templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "" -#: netbox/templates/vpn/tunneltermination.html:35 -#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 -#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 -#: netbox/vpn/tables/tunnels.py:101 +#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 +#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 +#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "" -#: netbox/templates/vpn/tunneltermination.html:51 +#: templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "" -#: netbox/templates/wireless/inc/authentication_attrs.html:12 +#: templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "" -#: netbox/templates/wireless/inc/authentication_attrs.html:16 +#: templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "" -#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 +#: templates/wireless/inc/wirelesslink_interface.html:35 +#: templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "" -#: netbox/templates/wireless/wirelesslan.html:57 +#: templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "" -#: netbox/templates/wireless/wirelesslangroup.html:17 +#: templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "" -#: netbox/templates/wireless/wirelesslangroup.html:26 -#: netbox/wireless/forms/model_forms.py:28 +#: templates/wireless/wirelesslangroup.html:26 wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "" -#: netbox/templates/wireless/wirelesslangroup.html:59 +#: templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "" -#: netbox/templates/wireless/wirelesslink.html:14 +#: templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "" -#: netbox/templates/wireless/wirelesslink.html:38 -#: netbox/wireless/forms/bulk_edit.py:129 -#: netbox/wireless/forms/filtersets.py:102 -#: netbox/wireless/forms/model_forms.py:165 +#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 +#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 msgid "Distance" msgstr "" -#: netbox/tenancy/filtersets.py:28 +#: tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:34 +#: tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "" -#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 -#: netbox/tenancy/filtersets.py:110 +#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 -#: netbox/tenancy/filtersets.py:117 +#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "" -#: netbox/tenancy/filtersets.py:104 +#: tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:121 +#: tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:127 +#: tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "" -#: netbox/tenancy/filtersets.py:158 +#: tenancy/filtersets.py:158 msgid "Contact group" msgstr "" -#: netbox/tenancy/filtersets.py:169 +#: tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:175 +#: tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "" -#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 +#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:234 +#: tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "" -#: netbox/tenancy/filtersets.py:241 +#: tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "" -#: netbox/tenancy/forms/bulk_edit.py:66 +#: tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "" -#: netbox/tenancy/forms/bulk_import.py:101 +#: tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "" -#: netbox/tenancy/models/contacts.py:32 +#: tenancy/models/contacts.py:32 msgid "contact group" msgstr "" -#: netbox/tenancy/models/contacts.py:33 +#: tenancy/models/contacts.py:33 msgid "contact groups" msgstr "" -#: netbox/tenancy/models/contacts.py:48 +#: tenancy/models/contacts.py:48 msgid "contact role" msgstr "" -#: netbox/tenancy/models/contacts.py:49 +#: tenancy/models/contacts.py:49 msgid "contact roles" msgstr "" -#: netbox/tenancy/models/contacts.py:68 +#: tenancy/models/contacts.py:68 msgid "title" msgstr "" -#: netbox/tenancy/models/contacts.py:73 +#: tenancy/models/contacts.py:73 msgid "phone" msgstr "" -#: netbox/tenancy/models/contacts.py:78 +#: tenancy/models/contacts.py:78 msgid "email" msgstr "" -#: netbox/tenancy/models/contacts.py:87 +#: tenancy/models/contacts.py:87 msgid "link" msgstr "" -#: netbox/tenancy/models/contacts.py:103 +#: tenancy/models/contacts.py:103 msgid "contact" msgstr "" -#: netbox/tenancy/models/contacts.py:104 +#: tenancy/models/contacts.py:104 msgid "contacts" msgstr "" -#: netbox/tenancy/models/contacts.py:153 +#: tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "" -#: netbox/tenancy/models/contacts.py:154 +#: tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "" -#: netbox/tenancy/models/contacts.py:170 +#: tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "" -#: netbox/tenancy/models/tenants.py:32 +#: tenancy/models/tenants.py:32 msgid "tenant group" msgstr "" -#: netbox/tenancy/models/tenants.py:33 +#: tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "" -#: netbox/tenancy/models/tenants.py:70 +#: tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "" -#: netbox/tenancy/models/tenants.py:80 +#: tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "" -#: netbox/tenancy/models/tenants.py:88 +#: tenancy/models/tenants.py:88 msgid "tenant" msgstr "" -#: netbox/tenancy/models/tenants.py:89 +#: tenancy/models/tenants.py:89 msgid "tenants" msgstr "" -#: netbox/tenancy/tables/contacts.py:112 +#: tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "" -#: netbox/tenancy/tables/contacts.py:116 +#: tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "" -#: netbox/tenancy/tables/contacts.py:121 +#: tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "" -#: netbox/tenancy/tables/contacts.py:125 +#: tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "" -#: netbox/tenancy/tables/contacts.py:129 +#: tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "" -#: netbox/tenancy/tables/contacts.py:133 +#: tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "" -#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 +#: users/filtersets.py:33 users/filtersets.py:73 msgid "Permission (ID)" msgstr "" -#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 +#: users/filtersets.py:38 users/filtersets.py:78 msgid "Notification group (ID)" msgstr "" -#: netbox/users/forms/bulk_edit.py:26 +#: users/forms/bulk_edit.py:26 msgid "First name" msgstr "" -#: netbox/users/forms/bulk_edit.py:31 +#: users/forms/bulk_edit.py:31 msgid "Last name" msgstr "" -#: netbox/users/forms/bulk_edit.py:43 +#: users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "" -#: netbox/users/forms/bulk_edit.py:48 +#: users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "" -#: netbox/users/forms/bulk_import.py:41 +#: users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "" -#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 +#: users/forms/filtersets.py:51 users/tables.py:42 msgid "Is Staff" msgstr "" -#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 +#: users/forms/filtersets.py:58 users/tables.py:45 msgid "Is Superuser" msgstr "" -#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 +#: users/forms/filtersets.py:91 users/tables.py:86 msgid "Can View" msgstr "" -#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 +#: users/forms/filtersets.py:98 users/tables.py:89 msgid "Can Add" msgstr "" -#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 +#: users/forms/filtersets.py:105 users/tables.py:92 msgid "Can Change" msgstr "" -#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 +#: users/forms/filtersets.py:112 users/tables.py:95 msgid "Can Delete" msgstr "" -#: netbox/users/forms/model_forms.py:62 +#: users/forms/model_forms.py:62 msgid "User Interface" msgstr "" -#: netbox/users/forms/model_forms.py:114 +#: users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " "accessible once the token has been created." msgstr "" -#: netbox/users/forms/model_forms.py:126 +#: users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " "no restrictions. Example: 10.1.1.0/24,192.168.10.16/32,2001:" "db8:1::/64" msgstr "" -#: netbox/users/forms/model_forms.py:175 +#: users/forms/model_forms.py:175 msgid "Confirm password" msgstr "" -#: netbox/users/forms/model_forms.py:178 +#: users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "" -#: netbox/users/forms/model_forms.py:227 +#: users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" -#: netbox/users/forms/model_forms.py:294 +#: users/forms/model_forms.py:294 msgid "Additional actions" msgstr "" -#: netbox/users/forms/model_forms.py:297 +#: users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "" -#: netbox/users/forms/model_forms.py:313 +#: users/forms/model_forms.py:313 msgid "Objects" msgstr "" -#: netbox/users/forms/model_forms.py:325 +#: users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " "objects will result in a logical OR operation." msgstr "" -#: netbox/users/forms/model_forms.py:364 +#: users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "" -#: netbox/users/forms/model_forms.py:382 +#: users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "" -#: netbox/users/models/permissions.py:39 +#: users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "" -#: netbox/users/models/permissions.py:44 +#: users/models/permissions.py:44 msgid "constraints" msgstr "" -#: netbox/users/models/permissions.py:45 +#: users/models/permissions.py:45 msgid "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" -#: netbox/users/models/permissions.py:52 +#: users/models/permissions.py:52 msgid "permission" msgstr "" -#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 +#: users/models/permissions.py:53 users/models/users.py:47 msgid "permissions" msgstr "" -#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 +#: users/models/preferences.py:29 users/models/preferences.py:30 msgid "user preferences" msgstr "" -#: netbox/users/models/preferences.py:97 +#: users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "" -#: netbox/users/models/preferences.py:109 +#: users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" -#: netbox/users/models/tokens.py:36 +#: users/models/tokens.py:36 msgid "expires" msgstr "" -#: netbox/users/models/tokens.py:41 +#: users/models/tokens.py:41 msgid "last used" msgstr "" -#: netbox/users/models/tokens.py:46 +#: users/models/tokens.py:46 msgid "key" msgstr "" -#: netbox/users/models/tokens.py:52 +#: users/models/tokens.py:52 msgid "write enabled" msgstr "" -#: netbox/users/models/tokens.py:54 +#: users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" -#: netbox/users/models/tokens.py:65 +#: users/models/tokens.py:65 msgid "allowed IPs" msgstr "" -#: netbox/users/models/tokens.py:67 +#: users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for " "no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" msgstr "" -#: netbox/users/models/tokens.py:75 +#: users/models/tokens.py:75 msgid "token" msgstr "" -#: netbox/users/models/tokens.py:76 +#: users/models/tokens.py:76 msgid "tokens" msgstr "" -#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 +#: users/models/users.py:57 vpn/models/crypto.py:42 msgid "group" msgstr "" -#: netbox/users/models/users.py:92 +#: users/models/users.py:92 msgid "user" msgstr "" -#: netbox/users/models/users.py:104 +#: users/models/users.py:104 msgid "A user with this username already exists." msgstr "" -#: netbox/users/tables.py:98 +#: users/tables.py:98 msgid "Custom Actions" msgstr "" -#: netbox/utilities/api.py:153 +#: utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" -#: netbox/utilities/api.py:156 +#: utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "" -#: netbox/utilities/api.py:168 +#: utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " "attributes. Received an unrecognized value: {value}" msgstr "" -#: netbox/utilities/api.py:177 +#: utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" -#: netbox/utilities/choices.py:19 +#: utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "" -#: netbox/utilities/conversion.py:19 +#: utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "" -#: netbox/utilities/conversion.py:21 +#: utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "" -#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 +#: utilities/conversion.py:32 utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" -#: netbox/utilities/conversion.py:45 +#: utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "" -#: netbox/utilities/conversion.py:47 +#: utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "" -#: netbox/utilities/error_handlers.py:31 +#: utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " "found: " msgstr "" -#: netbox/utilities/error_handlers.py:33 +#: utilities/error_handlers.py:33 msgid "More than 50" msgstr "" -#: netbox/utilities/fields.py:30 +#: utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "" -#: netbox/utilities/fields.py:159 +#: utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " "in the format 'app.model'" msgstr "" -#: netbox/utilities/fields.py:169 +#: utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " "in the format 'field'" msgstr "" -#: netbox/utilities/forms/bulk_import.py:23 +#: utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "" -#: netbox/utilities/forms/bulk_import.py:36 +#: utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "" -#: netbox/utilities/forms/bulk_import.py:37 +#: utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" -#: netbox/utilities/forms/bulk_import.py:51 +#: utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" -#: netbox/utilities/forms/bulk_import.py:80 +#: utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "" -#: netbox/utilities/forms/bulk_import.py:100 +#: utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "" -#: netbox/utilities/forms/bulk_import.py:123 +#: utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "" -#: netbox/utilities/forms/bulk_import.py:167 +#: utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." msgstr "" -#: netbox/utilities/forms/fields/array.py:20 +#: utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " "order." msgstr "" -#: netbox/utilities/forms/fields/array.py:40 +#: utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" msgstr "" -#: netbox/utilities/forms/fields/array.py:47 +#: utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." msgstr "" -#: netbox/utilities/forms/fields/csv.py:44 +#: utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "" -#: netbox/utilities/forms/fields/csv.py:57 -#: netbox/utilities/forms/fields/csv.py:78 +#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "" -#: netbox/utilities/forms/fields/csv.py:65 +#: utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were found" msgstr "" -#: netbox/utilities/forms/fields/csv.py:69 +#: utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "" -#: netbox/utilities/forms/fields/csv.py:101 +#: utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "" -#: netbox/utilities/forms/fields/csv.py:105 +#: utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "" -#: netbox/utilities/forms/fields/expandable.py:25 +#: utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: [ge,xe]-0/0/[0-9])." msgstr "" -#: netbox/utilities/forms/fields/expandable.py:46 +#: utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: 192.0.2." "[1,5,100-254]/24" msgstr "" -#: netbox/utilities/forms/fields/fields.py:31 +#: utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" " Markdown syntax is supported" msgstr "" -#: netbox/utilities/forms/fields/fields.py:48 +#: utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "" -#: netbox/utilities/forms/fields/fields.py:101 +#: utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" -#: netbox/utilities/forms/fields/fields.py:124 +#: utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "" -#: netbox/utilities/forms/forms.py:52 +#: utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "" -#: netbox/utilities/forms/forms.py:75 +#: utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" -#: netbox/utilities/forms/forms.py:92 +#: utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "" -#: netbox/utilities/forms/forms.py:118 +#: utilities/forms/forms.py:118 msgid "Available Columns" msgstr "" -#: netbox/utilities/forms/forms.py:126 +#: utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "" -#: netbox/utilities/forms/mixins.py:44 +#: utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." msgstr "" -#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 -#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 +#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 +#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "" -#: netbox/utilities/forms/utils.py:74 +#: utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " "({begin})." msgstr "" -#: netbox/utilities/forms/utils.py:232 +#: utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "" -#: netbox/utilities/forms/utils.py:238 +#: utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "" -#: netbox/utilities/forms/utils.py:247 +#: utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" -#: netbox/utilities/forms/utils.py:270 +#: utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "" -#: netbox/utilities/forms/utils.py:272 +#: utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "" -#: netbox/utilities/forms/utils.py:276 +#: utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" -#: netbox/utilities/forms/utils.py:284 +#: utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "" -#: netbox/utilities/forms/widgets/apiselect.py:124 +#: utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" -#: netbox/utilities/forms/widgets/apiselect.py:141 +#: utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" -#: netbox/utilities/password_validation.py:13 +#: utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "" -#: netbox/utilities/password_validation.py:18 +#: utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "" -#: netbox/utilities/password_validation.py:23 +#: utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "" -#: netbox/utilities/password_validation.py:27 +#: utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." msgstr "" -#: netbox/utilities/permissions.py:42 +#: utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format ." "_" msgstr "" -#: netbox/utilities/permissions.py:60 +#: utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "" -#: netbox/utilities/request.py:76 +#: utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "" -#: netbox/utilities/tables.py:47 +#: utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" -#: netbox/utilities/templates/builtins/customfield_value.html:30 +#: utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "" -#: netbox/utilities/templates/buttons/bookmark.html:9 +#: utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "" -#: netbox/utilities/templates/buttons/bookmark.html:13 +#: utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "" -#: netbox/utilities/templates/buttons/clone.html:4 +#: utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "" -#: netbox/utilities/templates/buttons/export.html:7 +#: utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "" -#: netbox/utilities/templates/buttons/export.html:8 +#: utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "" -#: netbox/utilities/templates/buttons/export.html:28 +#: utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "" -#: netbox/utilities/templates/buttons/import.html:4 +#: utilities/templates/buttons/import.html:4 msgid "Import" msgstr "" -#: netbox/utilities/templates/buttons/subscribe.html:10 +#: utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "" -#: netbox/utilities/templates/buttons/subscribe.html:14 +#: utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "" -#: netbox/utilities/templates/form_helpers/render_field.html:41 +#: utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "" -#: netbox/utilities/templates/form_helpers/render_field.html:57 +#: utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "" -#: netbox/utilities/templates/form_helpers/render_field.html:70 +#: utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "" -#: netbox/utilities/templates/helpers/applied_filters.html:11 +#: utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "" -#: netbox/utilities/templates/helpers/table_config_form.html:8 +#: utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "" -#: netbox/utilities/templates/helpers/table_config_form.html:31 +#: utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "" -#: netbox/utilities/templates/helpers/table_config_form.html:34 +#: utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "" -#: netbox/utilities/templates/navigation/menu.html:14 +#: utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "" -#: netbox/utilities/templates/navigation/menu.html:14 +#: utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "" -#: netbox/utilities/templates/widgets/apiselect.html:7 +#: utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "" -#: netbox/utilities/templates/widgets/markdown_input.html:6 +#: utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "" -#: netbox/utilities/testing/views.py:632 +#: utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "" -#: netbox/utilities/validators.py:65 +#: utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "" -#: netbox/utilities/views.py:57 +#: utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" -#: netbox/utilities/views.py:93 +#: utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "" -#: netbox/utilities/views.py:117 +#: utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only " "be used on views which define a base queryset" msgstr "" -#: netbox/virtualization/filtersets.py:79 +#: virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "" -#: netbox/virtualization/filtersets.py:85 +#: virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "" -#: netbox/virtualization/filtersets.py:89 -#: netbox/virtualization/filtersets.py:141 +#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "" -#: netbox/virtualization/filtersets.py:151 -#: netbox/virtualization/filtersets.py:271 +#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:166 -#: netbox/virtualization/models/virtualmachines.py:115 +#: virtualization/forms/bulk_edit.py:166 +#: virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:170 +#: virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:174 +#: virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:334 -#: netbox/virtualization/forms/filtersets.py:251 +#: virtualization/forms/bulk_edit.py:334 virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:44 +#: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:51 +#: virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:96 +#: virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:103 +#: virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "" -#: netbox/virtualization/forms/filtersets.py:183 +#: virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "" -#: netbox/virtualization/forms/model_forms.py:153 +#: virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " "({cluster_site})" msgstr "" -#: netbox/virtualization/forms/model_forms.py:192 +#: virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:221 +#: virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:244 +#: virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" -#: netbox/virtualization/forms/model_forms.py:372 -#: netbox/virtualization/tables/virtualmachines.py:111 +#: virtualization/forms/model_forms.py:372 +#: virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "" -#: netbox/virtualization/models/clusters.py:25 +#: virtualization/models/clusters.py:25 msgid "cluster type" msgstr "" -#: netbox/virtualization/models/clusters.py:26 +#: virtualization/models/clusters.py:26 msgid "cluster types" msgstr "" -#: netbox/virtualization/models/clusters.py:45 +#: virtualization/models/clusters.py:45 msgid "cluster group" msgstr "" -#: netbox/virtualization/models/clusters.py:46 +#: virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "" -#: netbox/virtualization/models/clusters.py:121 +#: virtualization/models/clusters.py:121 msgid "cluster" msgstr "" -#: netbox/virtualization/models/clusters.py:122 +#: virtualization/models/clusters.py:122 msgid "clusters" msgstr "" -#: netbox/virtualization/models/clusters.py:141 +#: virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " "{site}" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:123 +#: virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:128 +#: virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:166 +#: virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:169 +#: virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:170 +#: virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:184 +#: virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:191 +#: virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:198 +#: virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:203 +#: virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:215 +#: virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " "virtual disks ({total_size})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:229 +#: virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:238 +#: virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:396 +#: virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:411 +#: virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:422 +#: virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent virtual machine, or it must be global." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:434 +#: virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:438 +#: virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:439 +#: virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "" -#: netbox/virtualization/views.py:275 +#: virtualization/views.py:275 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "" -#: netbox/virtualization/views.py:310 +#: virtualization/views.py:310 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "" -#: netbox/vpn/choices.py:31 +#: vpn/choices.py:31 msgid "IPsec - Transport" msgstr "" -#: netbox/vpn/choices.py:32 +#: vpn/choices.py:32 msgid "IPsec - Tunnel" msgstr "" -#: netbox/vpn/choices.py:33 +#: vpn/choices.py:33 msgid "IP-in-IP" msgstr "" -#: netbox/vpn/choices.py:34 +#: vpn/choices.py:34 msgid "GRE" msgstr "" -#: netbox/vpn/choices.py:56 +#: vpn/choices.py:56 msgid "Hub" msgstr "" -#: netbox/vpn/choices.py:57 +#: vpn/choices.py:57 msgid "Spoke" msgstr "" -#: netbox/vpn/choices.py:80 +#: vpn/choices.py:80 msgid "Aggressive" msgstr "" -#: netbox/vpn/choices.py:81 +#: vpn/choices.py:81 msgid "Main" msgstr "" -#: netbox/vpn/choices.py:92 +#: vpn/choices.py:92 msgid "Pre-shared keys" msgstr "" -#: netbox/vpn/choices.py:93 +#: vpn/choices.py:93 msgid "Certificates" msgstr "" -#: netbox/vpn/choices.py:94 +#: vpn/choices.py:94 msgid "RSA signatures" msgstr "" -#: netbox/vpn/choices.py:95 +#: vpn/choices.py:95 msgid "DSA signatures" msgstr "" -#: netbox/vpn/choices.py:178 netbox/vpn/choices.py:179 -#: netbox/vpn/choices.py:180 netbox/vpn/choices.py:181 -#: netbox/vpn/choices.py:182 netbox/vpn/choices.py:183 -#: netbox/vpn/choices.py:184 netbox/vpn/choices.py:185 -#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 -#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 -#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 -#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 -#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 -#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 -#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 -#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 +#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 +#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 +#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 +#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 +#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 #, python-brace-format msgid "Group {n}" msgstr "" -#: netbox/vpn/choices.py:243 +#: vpn/choices.py:243 msgid "Ethernet Private LAN" msgstr "" -#: netbox/vpn/choices.py:244 +#: vpn/choices.py:244 msgid "Ethernet Virtual Private LAN" msgstr "" -#: netbox/vpn/choices.py:247 +#: vpn/choices.py:247 msgid "Ethernet Private Tree" msgstr "" -#: netbox/vpn/choices.py:248 +#: vpn/choices.py:248 msgid "Ethernet Virtual Private Tree" msgstr "" -#: netbox/vpn/filtersets.py:41 +#: vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "" -#: netbox/vpn/filtersets.py:47 +#: vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "" -#: netbox/vpn/filtersets.py:54 +#: vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "" -#: netbox/vpn/filtersets.py:60 +#: vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "" -#: netbox/vpn/filtersets.py:81 +#: vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "" -#: netbox/vpn/filtersets.py:87 +#: vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "" -#: netbox/vpn/filtersets.py:118 +#: vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "" -#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 +#: vpn/filtersets.py:130 vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "" -#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 +#: vpn/filtersets.py:136 vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "" -#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 +#: vpn/filtersets.py:200 vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "" -#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 +#: vpn/filtersets.py:206 vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "" -#: netbox/vpn/filtersets.py:348 +#: vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "" -#: netbox/vpn/filtersets.py:412 +#: vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "" -#: netbox/vpn/filtersets.py:418 +#: vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 -#: netbox/vpn/forms/filtersets.py:54 +#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 +#: vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 +#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 -#: netbox/wireless/forms/bulk_edit.py:126 -#: netbox/wireless/forms/filtersets.py:64 -#: netbox/wireless/forms/filtersets.py:98 +#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 +#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 +#: wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 -#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 -#: netbox/vpn/models/crypto.py:104 +#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 +#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 +#: vpn/models/crypto.py:104 msgid "IKE policy" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 -#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 -#: netbox/vpn/models/crypto.py:209 +#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 +#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 +#: vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "" -#: netbox/vpn/forms/bulk_import.py:50 +#: vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "" -#: netbox/vpn/forms/bulk_import.py:83 +#: vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "" -#: netbox/vpn/forms/bulk_import.py:90 +#: vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "" -#: netbox/vpn/forms/bulk_import.py:97 +#: vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "" -#: netbox/vpn/forms/bulk_import.py:104 +#: vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "" -#: netbox/vpn/forms/bulk_import.py:183 +#: vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 +#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "" -#: netbox/vpn/forms/bulk_import.py:222 +#: vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:236 +#: vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "" -#: netbox/vpn/forms/bulk_import.py:266 +#: vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "" -#: netbox/vpn/forms/bulk_import.py:287 +#: vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:294 +#: vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:301 +#: vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:334 +#: vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" -#: netbox/vpn/forms/bulk_import.py:336 +#: vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "" -#: netbox/vpn/forms/bulk_import.py:338 +#: vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "" -#: netbox/vpn/forms/filtersets.py:130 +#: vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "" -#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 -#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 +#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 +#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "" -#: netbox/vpn/forms/filtersets.py:251 +#: vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "" -#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 -#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 +#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 +#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "" -#: netbox/vpn/forms/model_forms.py:150 +#: vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "" -#: netbox/vpn/forms/model_forms.py:153 +#: vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "" -#: netbox/vpn/forms/model_forms.py:197 +#: vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "" -#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 +#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 msgid "Policy" msgstr "" -#: netbox/vpn/forms/model_forms.py:487 +#: vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "" -#: netbox/vpn/forms/model_forms.py:489 +#: vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" -#: netbox/vpn/models/crypto.py:33 +#: vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "" -#: netbox/vpn/models/crypto.py:37 +#: vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "" -#: netbox/vpn/models/crypto.py:44 +#: vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "" -#: netbox/vpn/models/crypto.py:50 +#: vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "" -#: netbox/vpn/models/crypto.py:59 +#: vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "" -#: netbox/vpn/models/crypto.py:60 +#: vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "" -#: netbox/vpn/models/crypto.py:76 +#: vpn/models/crypto.py:76 msgid "version" msgstr "" -#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 +#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 msgid "proposals" msgstr "" -#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 +#: vpn/models/crypto.py:91 wireless/models.py:39 msgid "pre-shared key" msgstr "" -#: netbox/vpn/models/crypto.py:105 +#: vpn/models/crypto.py:105 msgid "IKE policies" msgstr "" -#: netbox/vpn/models/crypto.py:118 +#: vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "" -#: netbox/vpn/models/crypto.py:122 +#: vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "" -#: netbox/vpn/models/crypto.py:136 +#: vpn/models/crypto.py:136 msgid "encryption" msgstr "" -#: netbox/vpn/models/crypto.py:141 +#: vpn/models/crypto.py:141 msgid "authentication" msgstr "" -#: netbox/vpn/models/crypto.py:149 +#: vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "" -#: netbox/vpn/models/crypto.py:155 +#: vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "" -#: netbox/vpn/models/crypto.py:164 +#: vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "" -#: netbox/vpn/models/crypto.py:165 +#: vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "" -#: netbox/vpn/models/crypto.py:178 +#: vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" -#: netbox/vpn/models/crypto.py:210 +#: vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "" -#: netbox/vpn/models/crypto.py:251 +#: vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "" -#: netbox/vpn/models/l2vpn.py:116 +#: vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "" -#: netbox/vpn/models/l2vpn.py:117 +#: vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "" -#: netbox/vpn/models/l2vpn.py:135 +#: vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "" -#: netbox/vpn/models/l2vpn.py:147 +#: vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " "{terminations_count} already defined." msgstr "" -#: netbox/vpn/models/tunnels.py:26 +#: vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "" -#: netbox/vpn/models/tunnels.py:27 +#: vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "" -#: netbox/vpn/models/tunnels.py:53 +#: vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "" -#: netbox/vpn/models/tunnels.py:72 +#: vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "" -#: netbox/vpn/models/tunnels.py:94 +#: vpn/models/tunnels.py:94 msgid "tunnel" msgstr "" -#: netbox/vpn/models/tunnels.py:95 +#: vpn/models/tunnels.py:95 msgid "tunnels" msgstr "" -#: netbox/vpn/models/tunnels.py:153 +#: vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "" -#: netbox/vpn/models/tunnels.py:156 +#: vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "" -#: netbox/vpn/models/tunnels.py:157 +#: vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "" -#: netbox/vpn/models/tunnels.py:174 +#: vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "" -#: netbox/vpn/tables/crypto.py:22 +#: vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "" -#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 +#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "" -#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 +#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "" -#: netbox/vpn/tables/crypto.py:34 +#: vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "" -#: netbox/vpn/tables/crypto.py:71 +#: vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "" -#: netbox/vpn/tables/crypto.py:103 +#: vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "" -#: netbox/vpn/tables/crypto.py:106 +#: vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "" -#: netbox/vpn/tables/l2vpn.py:69 +#: vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "" -#: netbox/vpn/tables/l2vpn.py:74 +#: vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "" -#: netbox/wireless/choices.py:11 +#: wireless/choices.py:11 msgid "Access point" msgstr "" -#: netbox/wireless/choices.py:12 +#: wireless/choices.py:12 msgid "Station" msgstr "" -#: netbox/wireless/choices.py:467 +#: wireless/choices.py:467 msgid "Open" msgstr "" -#: netbox/wireless/choices.py:469 +#: wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "" -#: netbox/wireless/choices.py:470 +#: wireless/choices.py:470 msgid "WPA Enterprise" msgstr "" -#: netbox/wireless/forms/bulk_edit.py:73 netbox/wireless/forms/bulk_edit.py:120 -#: netbox/wireless/forms/bulk_import.py:68 -#: netbox/wireless/forms/bulk_import.py:71 -#: netbox/wireless/forms/bulk_import.py:110 -#: netbox/wireless/forms/bulk_import.py:113 -#: netbox/wireless/forms/filtersets.py:59 -#: netbox/wireless/forms/filtersets.py:93 +#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 +#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 +#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 +#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "" -#: netbox/wireless/forms/bulk_edit.py:134 -#: netbox/wireless/forms/bulk_import.py:116 -#: netbox/wireless/forms/bulk_import.py:119 -#: netbox/wireless/forms/filtersets.py:106 +#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 +#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "" -#: netbox/wireless/forms/bulk_import.py:52 +#: wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "" -#: netbox/wireless/forms/bulk_import.py:89 -#: netbox/wireless/tables/wirelesslink.py:28 +#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "" -#: netbox/wireless/forms/bulk_import.py:93 -#: netbox/wireless/tables/wirelesslink.py:37 +#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "" -#: netbox/wireless/forms/model_forms.py:161 +#: wireless/forms/model_forms.py:161 msgid "Side B" msgstr "" -#: netbox/wireless/models.py:31 +#: wireless/models.py:31 msgid "authentication cipher" msgstr "" -#: netbox/wireless/models.py:69 +#: wireless/models.py:69 msgid "wireless LAN group" msgstr "" -#: netbox/wireless/models.py:70 +#: wireless/models.py:70 msgid "wireless LAN groups" msgstr "" -#: netbox/wireless/models.py:116 +#: wireless/models.py:116 msgid "wireless LAN" msgstr "" -#: netbox/wireless/models.py:144 +#: wireless/models.py:144 msgid "interface A" msgstr "" -#: netbox/wireless/models.py:151 +#: wireless/models.py:151 msgid "interface B" msgstr "" -#: netbox/wireless/models.py:165 +#: wireless/models.py:165 msgid "distance" msgstr "" -#: netbox/wireless/models.py:172 +#: wireless/models.py:172 msgid "distance unit" msgstr "" -#: netbox/wireless/models.py:219 +#: wireless/models.py:219 msgid "wireless link" msgstr "" -#: netbox/wireless/models.py:220 +#: wireless/models.py:220 msgid "wireless links" msgstr "" -#: netbox/wireless/models.py:236 +#: wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" -#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 +#: wireless/models.py:242 wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "" -#: netbox/wireless/utils.py:16 +#: wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "" -#: netbox/wireless/utils.py:26 +#: wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "" From 4f7bfc836c10008d4df51816e2dfcc2ad9e5accf Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 21 Nov 2024 11:51:30 -0500 Subject: [PATCH 049/169] Fixes: #17950 - Handle InvalidJobOperation error in job enqueueing test (#18062) * Wait until job1 exists in Redis before enqueueing job2 * Job can exist but not have status * Catch InvalidJobOperation and use as trigger for retry * Catch InvalidJobOperation when deleting/canceling job * Remove testing code --- netbox/core/models/jobs.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/netbox/core/models/jobs.py b/netbox/core/models/jobs.py index 3cfea3e2a..82bfd72c8 100644 --- a/netbox/core/models/jobs.py +++ b/netbox/core/models/jobs.py @@ -9,6 +9,7 @@ from django.db import models from django.urls import reverse from django.utils import timezone from django.utils.translation import gettext as _ +from rq.exceptions import InvalidJobOperation from core.choices import JobStatusChoices from core.models import ObjectType @@ -158,7 +159,11 @@ class Job(models.Model): job = queue.fetch_job(str(self.job_id)) if job: - job.cancel() + try: + job.cancel() + except InvalidJobOperation: + # Job may raise this exception from get_status() if missing from Redis + pass def start(self): """ From 6fb476081e877eff3c2d778d031ed84bdce630f9 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Thu, 21 Nov 2024 12:32:24 -0500 Subject: [PATCH 050/169] Fixes: #17459 - Ensure help text on component create forms shows both bulk edit and substitution token instructions (#17931) * Move {module} substitution help text to main ComponentCreateForm.__init__ so it applies to all component types, and fix formatting * Simplify help text replacement string for component forms with 'module' field * Reuse help text string in both ComponentCreateForm and ModularComponentTemplateForm * Remove help text override from regular (direct) object creation of device components * Re-add space * Tweak help text --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/forms/model_forms.py | 7 +++++++ netbox/dcim/forms/object_create.py | 8 -------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 908312a8a..8f9c4227d 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -909,6 +909,13 @@ class ModularComponentTemplateForm(ComponentTemplateForm): if self.instance.pk: self.fields['module_type'].disabled = True + # Components attached to a module need to present this standardized substitution help text. + self.fields['name'].help_text = _( + "Alphanumeric ranges are supported for bulk creation. Mixed cases and types within a single range are not " + "supported (example: [ge,xe]-0/0/[0-9]). The token {module}, if present, will be " + "automatically replaced with the position value when creating a new module." + ) + class ConsolePortTemplateForm(ModularComponentTemplateForm): fieldsets = ( diff --git a/netbox/dcim/forms/object_create.py b/netbox/dcim/forms/object_create.py index d18c7ed14..85c613b8c 100644 --- a/netbox/dcim/forms/object_create.py +++ b/netbox/dcim/forms/object_create.py @@ -243,14 +243,6 @@ class InterfaceCreateForm(ComponentCreateForm, model_forms.InterfaceForm): class Meta(model_forms.InterfaceForm.Meta): exclude = ('name', 'label') - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - - if 'module' in self.fields: - self.fields['name'].help_text += _( - "The string {module} will be replaced with the position of the assigned module, if any." - ) - class FrontPortCreateForm(ComponentCreateForm, model_forms.FrontPortForm): device = DynamicModelChoiceField( From 3b3990a4e66bf0c43fc38127db331eb0ec1b4e0f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 21 Nov 2024 13:18:52 -0500 Subject: [PATCH 051/169] Release v4.1.7 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- contrib/generated_schema.json | 1 + docs/release-notes/version-4.1.md | 7 + netbox/release.yaml | 4 +- netbox/translations/cs/LC_MESSAGES/django.mo | Bin 229642 -> 229328 bytes netbox/translations/cs/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/da/LC_MESSAGES/django.mo | Bin 222459 -> 222153 bytes netbox/translations/da/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/de/LC_MESSAGES/django.mo | Bin 234158 -> 234250 bytes netbox/translations/de/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/es/LC_MESSAGES/django.mo | Bin 235950 -> 235650 bytes netbox/translations/es/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 238002 -> 237671 bytes netbox/translations/fr/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/it/LC_MESSAGES/django.mo | Bin 234190 -> 233875 bytes netbox/translations/it/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 251462 -> 251566 bytes netbox/translations/ja/LC_MESSAGES/django.po | 607 ++++---- netbox/translations/nl/LC_MESSAGES/django.mo | Bin 230234 -> 230015 bytes netbox/translations/nl/LC_MESSAGES/django.po | 606 ++++---- netbox/translations/pl/LC_MESSAGES/django.mo | Bin 231926 -> 231612 bytes netbox/translations/pl/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 232592 -> 232620 bytes netbox/translations/pt/LC_MESSAGES/django.po | 607 ++++---- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 297746 -> 297341 bytes netbox/translations/ru/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/tr/LC_MESSAGES/django.mo | Bin 226590 -> 226285 bytes netbox/translations/tr/LC_MESSAGES/django.po | 603 ++++---- netbox/translations/uk/LC_MESSAGES/django.mo | Bin 297606 -> 298841 bytes netbox/translations/uk/LC_MESSAGES/django.po | 1359 +++++++++-------- netbox/translations/zh/LC_MESSAGES/django.mo | Bin 209410 -> 209120 bytes netbox/translations/zh/LC_MESSAGES/django.po | 601 ++++---- requirements.txt | 10 +- 34 files changed, 4818 insertions(+), 4415 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index 300d7ce6a..ec755cd0c 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.6 + placeholder: v4.1.7 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 2b782a6cd..3ae3cbd33 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.6 + placeholder: v4.1.7 validations: required: true - type: dropdown diff --git a/contrib/generated_schema.json b/contrib/generated_schema.json index 56ddee50e..639f0df8d 100644 --- a/contrib/generated_schema.json +++ b/contrib/generated_schema.json @@ -329,6 +329,7 @@ "100base-tx", "100base-t1", "1000base-t", + "1000base-lx", "1000base-tx", "2.5gbase-t", "5gbase-t", diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index b94374721..397741171 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -6,14 +6,21 @@ * [#15239](https://github.com/netbox-community/netbox/issues/15239) - Enable adding/removing individual VLANs while bulk editing device interfaces * [#17871](https://github.com/netbox-community/netbox/issues/17871) - Enable the assignment/removal of virtualization cluster via device bulk edit +* [#17934](https://github.com/netbox-community/netbox/issues/17934) - Add 1000Base-LX interface type +* [#18007](https://github.com/netbox-community/netbox/issues/18007) - Hide sensitive parameters under data source view (even for privileged users) ### Bug Fixes +* [#17459](https://github.com/netbox-community/netbox/issues/17459) - Correct help text on `name` field of module type component templates * [#17901](https://github.com/netbox-community/netbox/issues/17901) - Ensure GraphiQL UI resources are served locally +* [#17921](https://github.com/netbox-community/netbox/issues/17921) - Fix scheduling of recurring custom scripts +* [#17923](https://github.com/netbox-community/netbox/issues/17923) - Fix the execution of custom scripts via REST API & management command * [#17963](https://github.com/netbox-community/netbox/issues/17963) - Fix selection of all listed objects during bulk edit * [#17969](https://github.com/netbox-community/netbox/issues/17969) - Fix system info export when a config revision exists * [#17972](https://github.com/netbox-community/netbox/issues/17972) - Force evaluation of `LOGIN_REQUIRED` when requesting static media * [#17986](https://github.com/netbox-community/netbox/issues/17986) - Correct labels for virtual machine & virtual disk size properties +* [#18037](https://github.com/netbox-community/netbox/issues/18037) - Fix validation of maximum VLAN ID value when defining VLAN groups +* [#18038](https://github.com/netbox-community/netbox/issues/18038) - The `to_grams()` utility function should always return an integer value --- diff --git a/netbox/release.yaml b/netbox/release.yaml index b4811804f..fadb01274 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.1.6" +version: "4.1.7" edition: "Community" -published: "2024-10-31" +published: "2024-11-21" diff --git a/netbox/translations/cs/LC_MESSAGES/django.mo b/netbox/translations/cs/LC_MESSAGES/django.mo index df95c667cae851173482ebbe02dc15df2662c12d..2fb886a1ab78217ee732b25af5d87747e9585f23 100644 GIT binary patch delta 66008 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" msgstr "Přidán člen {device}" -#: dcim/views.py:3557 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Nelze odebrat hlavní zařízení {device} z virtuálního podvozku." -#: dcim/views.py:3570 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Odstraněno {device} z virtuálního šasi {chassis}" @@ -7513,19 +7531,19 @@ msgstr "Naplánujte spuštění skriptu na nastavený čas" msgid "Interval at which this script is re-run (in minutes)" msgstr "Interval, ve kterém je tento skript znovu spuštěn (v minutách)" -#: extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Změny v databázi byly automaticky vráceny." -#: extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Skript byl přerušen s chybou: " -#: extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "Došlo k výjimce: " -#: extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Změny databáze byly vráceny kvůli chybě." @@ -8833,7 +8851,7 @@ msgstr "Skupina VLAN" #: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 #: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:234 ipam/tables/ip.py:255 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 #: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 #: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 #: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 @@ -9089,7 +9107,7 @@ msgstr "Přiřazeno k rozhraní" msgid "DNS Name" msgstr "Název DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:235 ipam/tables/ip.py:176 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 #: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 #: netbox/navigation/menu.py:195 msgid "VLANs" @@ -9099,7 +9117,7 @@ msgstr "VLAN" msgid "Contains VLAN ID" msgstr "Obsahuje VLAN ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:176 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 #: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "ID VLAN" @@ -9550,40 +9568,48 @@ msgstr "Nelze nastavit scope_type bez scope_id." msgid "Cannot set scope_id without scope_type." msgstr "Nelze nastavit scope_id bez scope_type." -#: ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Rozsahy se nemohou překrývat." -#: ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" -"Maximální dětský VID musí být větší nebo roven minimálnímu dětskému VID " -"({value})" - -#: ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Konkrétní místo, ke kterému je tato VLAN přiřazena (pokud existuje)" -#: ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Skupina VLAN (volitelné)" -#: ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerické ID VLAN (1-4094)" -#: ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Provozní stav této VLAN" -#: ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Primární funkce této VLAN" -#: ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9592,7 +9618,7 @@ msgstr "" "VLAN je přiřazena ke skupině {group} (oblast působnosti: {scope}); nelze " "také přiřadit k webu {site}." -#: ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID musí být v rozmezí {ranges} pro sítě VLAN ve skupině {group}" @@ -10333,10 +10359,6 @@ msgstr "Zásady protokolu IPsec" msgid "IPSec Profiles" msgstr "Profily IPsec" -#: netbox/navigation/menu.py:243 templates/dcim/device_edit.html:78 -msgid "Virtualization" -msgstr "Virtualizace" - #: netbox/navigation/menu.py:251 #: templates/virtualization/virtualmachine.html:174 #: templates/virtualization/virtualmachine/base.html:32 @@ -10737,19 +10759,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "Řádek {i}: Objekt s ID {id} neexistuje" -#: netbox/views/generic/bulk_views.py:702 -#: netbox/views/generic/bulk_views.py:900 -#: netbox/views/generic/bulk_views.py:948 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "Ne {object_type} Byly vybrány." -#: netbox/views/generic/bulk_views.py:782 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Přejmenováno {count} {object_type}" -#: netbox/views/generic/bulk_views.py:878 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Vymazáno {count} {object_type}" @@ -10781,7 +10803,7 @@ msgstr "Synchronizováno {count} {object_type}" msgid "{class_name} must implement get_children()" msgstr "{class_name} musí implementovat get_children ()" -#: netbox/views/misc.py:44 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -12635,7 +12657,7 @@ msgid "You do not have permission to run scripts" msgstr "Nemáte oprávnění spouštět skripty" #: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:86 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "Spustit skript" @@ -12647,27 +12669,32 @@ msgstr "Chyba při načítání skriptu" msgid "Script no longer exists in the source file." msgstr "Skript již ve zdrojovém souboru neexistuje." -#: templates/extras/script_list.html:46 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "Poslední běh" -#: templates/extras/script_list.html:61 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Skript již není přítomen ve zdrojovém souboru" -#: templates/extras/script_list.html:74 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "Nikdy" -#: templates/extras/script_list.html:84 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "Spustit znovu" -#: templates/extras/script_list.html:138 +#: templates/extras/script_list.html:133 +#, python-format +msgid "Could not load scripts from module %(module)s" +msgstr "" + +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Nenalezeny žádné skripty" -#: templates/extras/script_list.html:141 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -14505,13 +14532,13 @@ msgid "Memory (MB)" msgstr "Paměť (MB)" #: virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" -msgstr "Disk (GB)" +msgid "Disk (MB)" +msgstr "" #: virtualization/forms/bulk_edit.py:334 #: virtualization/forms/filtersets.py:251 -msgid "Size (GB)" -msgstr "Velikost (GB)" +msgid "Size (MB)" +msgstr "" #: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" diff --git a/netbox/translations/da/LC_MESSAGES/django.mo b/netbox/translations/da/LC_MESSAGES/django.mo index 2390fc9f1eb8c75c17cb9e652bba6d7a8021c7c3..338255ed65af41400b36ff1bff5bad7fc67193f2 100644 GIT binary patch delta 66008 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%0A>I~6mag1%%BPv1a*SdK%JDkE*o8| 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 delta 66213 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%0DX}OW;4UM@WFBD?wp3cSYAg{x)zOmH~PcN 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 z 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 AJpcdz diff --git a/netbox/translations/da/LC_MESSAGES/django.po b/netbox/translations/da/LC_MESSAGES/django.po index e569dd86b..2ab752fd7 100644 --- a/netbox/translations/da/LC_MESSAGES/django.po +++ b/netbox/translations/da/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-28 19:20+0000\n" +"POT-Creation-Date: 2024-11-21 15:50+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2024\n" "Language-Team: Danish (https://app.transifex.com/netbox-community/teams/178115/da/)\n" @@ -85,8 +85,8 @@ msgid "Your password has been changed successfully." msgstr "Din adgangskode er blevet ændret." #: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1530 -#: dcim/choices.py:1606 dcim/choices.py:1656 virtualization/choices.py:20 +#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 +#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 #: virtualization/choices.py:45 vpn/choices.py:18 msgid "Planned" msgstr "Planlagt" @@ -97,7 +97,7 @@ msgstr "Opretter" #: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 #: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1605 dcim/choices.py:1655 extras/tables/tables.py:495 +#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 #: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 #: ipam/choices.py:154 templates/extras/configcontext.html:25 #: templates/users/user.html:37 users/forms/bulk_edit.py:38 @@ -107,7 +107,7 @@ msgid "Active" msgstr "Aktiv" #: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1604 dcim/choices.py:1657 virtualization/choices.py:24 +#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 #: virtualization/choices.py:43 msgid "Offline" msgstr "Offline" @@ -120,7 +120,7 @@ msgstr "Nedlægger" msgid "Decommissioned" msgstr "Nedlagt" -#: circuits/choices.py:90 dcim/choices.py:1617 tenancy/choices.py:17 +#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 msgid "Primary" msgstr "Primær" @@ -179,8 +179,8 @@ msgstr "Områdegruppe (slug)" #: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 #: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 #: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:168 dcim/forms/bulk_edit.py:329 -#: dcim/forms/bulk_edit.py:677 dcim/forms/bulk_edit.py:873 +#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 +#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 #: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 #: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 #: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 @@ -345,7 +345,7 @@ msgstr "Kredsløbsgruppe (slug)" #: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 #: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:128 dcim/forms/filtersets.py:195 +#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 #: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 #: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 #: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 @@ -357,21 +357,21 @@ msgstr "ASN'er" #: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 #: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 #: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:73 -#: dcim/forms/bulk_edit.py:92 dcim/forms/bulk_edit.py:151 -#: dcim/forms/bulk_edit.py:192 dcim/forms/bulk_edit.py:210 -#: dcim/forms/bulk_edit.py:288 dcim/forms/bulk_edit.py:432 -#: dcim/forms/bulk_edit.py:466 dcim/forms/bulk_edit.py:481 -#: dcim/forms/bulk_edit.py:540 dcim/forms/bulk_edit.py:584 -#: dcim/forms/bulk_edit.py:618 dcim/forms/bulk_edit.py:642 -#: dcim/forms/bulk_edit.py:715 dcim/forms/bulk_edit.py:767 -#: dcim/forms/bulk_edit.py:819 dcim/forms/bulk_edit.py:842 -#: dcim/forms/bulk_edit.py:890 dcim/forms/bulk_edit.py:960 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1048 -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1177 dcim/forms/bulk_edit.py:1204 -#: dcim/forms/bulk_edit.py:1222 dcim/forms/bulk_edit.py:1240 -#: dcim/forms/bulk_edit.py:1258 dcim/forms/bulk_edit.py:1682 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 +#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 +#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 +#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 +#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 +#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 +#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 +#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 +#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 +#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 +#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 +#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 +#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 +#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 +#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 #: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 #: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 #: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 @@ -412,7 +412,7 @@ msgstr "ASN'er" #: templates/extras/dashboard/widget_add.html:14 #: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 #: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:45 +#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 #: templates/extras/tag.html:20 templates/extras/webhook.html:17 #: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 #: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 @@ -479,9 +479,9 @@ msgid "Service ID" msgstr "Tjeneste-id" #: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:604 -#: dcim/forms/bulk_edit.py:804 dcim/forms/bulk_edit.py:1173 -#: dcim/forms/bulk_edit.py:1200 dcim/forms/bulk_edit.py:1678 +#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 +#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 #: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 #: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 #: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 @@ -498,11 +498,11 @@ msgstr "Farve" #: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 #: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 #: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:782 -#: dcim/forms/bulk_edit.py:921 dcim/forms/bulk_edit.py:989 -#: dcim/forms/bulk_edit.py:1008 dcim/forms/bulk_edit.py:1031 -#: dcim/forms/bulk_edit.py:1073 dcim/forms/bulk_edit.py:1117 -#: dcim/forms/bulk_edit.py:1168 dcim/forms/bulk_edit.py:1195 +#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 +#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 +#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 +#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 +#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 #: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 #: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 #: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 @@ -547,11 +547,11 @@ msgstr "Leverandørkonto" #: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 #: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 #: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:106 -#: dcim/forms/bulk_edit.py:181 dcim/forms/bulk_edit.py:351 -#: dcim/forms/bulk_edit.py:700 dcim/forms/bulk_edit.py:756 -#: dcim/forms/bulk_edit.py:788 dcim/forms/bulk_edit.py:915 -#: dcim/forms/bulk_edit.py:1701 dcim/forms/bulk_import.py:88 +#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 +#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 +#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 +#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 +#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 #: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 #: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 #: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 @@ -578,7 +578,7 @@ msgstr "Leverandørkonto" #: templates/dcim/device.html:178 templates/dcim/location.html:45 #: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 #: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:47 templates/ipam/ipaddress.html:37 +#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 #: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 #: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 #: templates/virtualization/virtualmachine.html:19 @@ -603,10 +603,10 @@ msgstr "Status" #: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 #: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 #: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:122 dcim/forms/bulk_edit.py:187 -#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:461 -#: dcim/forms/bulk_edit.py:690 dcim/forms/bulk_edit.py:794 -#: dcim/forms/bulk_edit.py:1706 dcim/forms/bulk_import.py:107 +#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 +#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 +#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 +#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 #: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 #: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 #: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 @@ -710,11 +710,11 @@ msgstr "Porthastighed (Kbps)" msgid "Upstream speed (Kbps)" msgstr "Opstrøms hastighed (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:951 -#: dcim/forms/bulk_edit.py:1315 dcim/forms/bulk_edit.py:1332 -#: dcim/forms/bulk_edit.py:1349 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1455 dcim/forms/bulk_edit.py:1594 -#: dcim/forms/bulk_edit.py:1611 +#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 +#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 +#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 +#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 +#: dcim/forms/bulk_edit.py:1649 msgid "Mark connected" msgstr "Marker tilsluttet" @@ -792,9 +792,9 @@ msgid "Provider network" msgstr "Leverandørnetværk" #: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:338 -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:682 -#: dcim/forms/bulk_edit.py:729 dcim/forms/bulk_edit.py:882 +#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 +#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 +#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 #: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 #: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 #: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 @@ -841,8 +841,8 @@ msgid "Contacts" msgstr "Kontakter" #: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:112 dcim/forms/bulk_edit.py:313 -#: dcim/forms/bulk_edit.py:857 dcim/forms/bulk_import.py:93 +#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 +#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 #: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 #: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 #: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 @@ -865,7 +865,7 @@ msgid "Region" msgstr "Regionen" #: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:321 dcim/forms/bulk_edit.py:865 +#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 #: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 #: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 #: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 @@ -883,7 +883,7 @@ msgstr "Områdegruppe" #: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 #: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 #: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:828 dcim/forms/filtersets.py:172 +#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 #: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 #: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 #: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 @@ -918,16 +918,17 @@ msgstr "Konto" msgid "Term Side" msgstr "Termside" -#: circuits/forms/filtersets.py:250 extras/forms/model_forms.py:582 -#: ipam/forms/filtersets.py:142 ipam/forms/filtersets.py:546 -#: ipam/forms/model_forms.py:323 templates/extras/configcontext.html:60 -#: templates/ipam/ipaddress.html:59 templates/ipam/vlan_edit.html:30 -#: tenancy/forms/filtersets.py:87 users/forms/model_forms.py:314 +#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 +#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 +#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 +#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 +#: users/forms/model_forms.py:314 msgid "Assignment" msgstr "Opgave" #: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:117 +#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 #: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 #: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 #: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 @@ -993,7 +994,7 @@ msgstr "Unikt kredsløbs-ID" #: dcim/models/devices.py:1173 dcim/models/devices.py:1399 #: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 #: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:195 +#: ipam/models/ip.py:730 ipam/models/vlans.py:211 #: virtualization/models/clusters.py:74 #: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 #: wireless/models.py:95 wireless/models.py:159 @@ -1132,7 +1133,7 @@ msgstr "" #: extras/models/notifications.py:126 extras/models/scripts.py:30 #: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 #: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:184 ipam/models/vrfs.py:22 +#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 #: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 #: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 #: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 @@ -1243,7 +1244,7 @@ msgstr "leverandørnetværk" #: templates/extras/customfield.html:13 templates/extras/customlink.html:13 #: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 #: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:44 +#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 #: templates/extras/tag.html:14 templates/extras/webhook.html:13 #: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 #: templates/ipam/rir.html:22 templates/ipam/role.html:22 @@ -1380,7 +1381,7 @@ msgstr "Afsluttet" #: core/choices.py:22 core/choices.py:59 core/constants.py:20 #: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1607 virtualization/choices.py:47 +#: dcim/choices.py:1609 virtualization/choices.py:47 msgid "Failed" msgstr "Mislykkedes" @@ -1527,8 +1528,8 @@ msgid "User name" msgstr "Brugernavn" #: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1400 dcim/forms/filtersets.py:1370 +#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 +#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 #: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 #: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 #: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 @@ -1628,7 +1629,7 @@ msgid "Completed before" msgstr "Færdiggjort før" #: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:456 dcim/forms/filtersets.py:418 +#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 #: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 #: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 #: extras/tables/tables.py:302 extras/tables/tables.py:342 @@ -1688,9 +1689,9 @@ msgstr "Skal uploade en fil eller vælge en datafil, der skal synkroniseres" msgid "Rack Elevations" msgstr "Rackhøjder" -#: core/forms/model_forms.py:157 dcim/choices.py:1518 -#: dcim/forms/bulk_edit.py:969 dcim/forms/bulk_edit.py:1357 -#: dcim/forms/bulk_edit.py:1375 dcim/tables/racks.py:158 +#: core/forms/model_forms.py:157 dcim/choices.py:1520 +#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 +#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 #: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 msgid "Power" msgstr "Strøm" @@ -2221,11 +2222,11 @@ msgstr "Job {id} er blevet stoppet." msgid "Failed to stop job {id}" msgstr "Det lykkedes ikke at stoppe jobbet {id}" -#: core/views.py:678 +#: core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Plugin-kataloget kunne ikke indlæses" -#: core/views.py:712 +#: core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} ikke fundet" @@ -2243,7 +2244,7 @@ msgid "Staging" msgstr "Iscenesættelse" #: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1531 virtualization/choices.py:23 +#: dcim/choices.py:1533 virtualization/choices.py:23 #: virtualization/choices.py:48 msgid "Decommissioning" msgstr "Nedlæggelse" @@ -2303,7 +2304,7 @@ msgstr "Forældet" msgid "Millimeters" msgstr "Millimeter" -#: dcim/choices.py:115 dcim/choices.py:1553 +#: dcim/choices.py:115 dcim/choices.py:1555 msgid "Inches" msgstr "Tommer" @@ -2315,8 +2316,8 @@ msgstr "Foran til bag" msgid "Rear to front" msgstr "Bagsiden til forsiden" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:68 dcim/forms/bulk_edit.py:87 -#: dcim/forms/bulk_edit.py:173 dcim/forms/bulk_edit.py:1405 +#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 +#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 #: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 #: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 #: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 @@ -2390,7 +2391,7 @@ msgstr "Bund til top" msgid "Top to bottom" msgstr "Top til bund" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1303 +#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 msgid "Passive" msgstr "Passiv" @@ -2418,8 +2419,8 @@ msgstr "International/ITA" msgid "Proprietary" msgstr "Proprietær" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1219 -#: dcim/choices.py:1221 dcim/choices.py:1447 dcim/choices.py:1449 +#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 +#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 #: netbox/navigation/menu.py:200 msgid "Other" msgstr "Andet" @@ -2432,22 +2433,22 @@ msgstr "ITA/International" msgid "Physical" msgstr "Fysisk" -#: dcim/choices.py:855 dcim/choices.py:1023 +#: dcim/choices.py:855 dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuel" -#: dcim/choices.py:856 dcim/choices.py:1097 dcim/forms/bulk_edit.py:1515 +#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 #: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 #: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 #: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 msgid "Wireless" msgstr "Trådløs" -#: dcim/choices.py:1021 +#: dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Virtuelle grænseflader" -#: dcim/choices.py:1024 dcim/forms/bulk_edit.py:1410 +#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 #: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 #: dcim/tables/devices.py:660 templates/dcim/interface.html:106 #: templates/virtualization/vminterface.html:43 @@ -2457,155 +2458,155 @@ msgstr "Virtuelle grænseflader" msgid "Bridge" msgstr "Bro" -#: dcim/choices.py:1025 +#: dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Link Aggregation Group (LAG)" -#: dcim/choices.py:1029 +#: dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fast)" -#: dcim/choices.py:1044 +#: dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulopbygget)" -#: dcim/choices.py:1081 +#: dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (bagplan)" -#: dcim/choices.py:1113 +#: dcim/choices.py:1115 msgid "Cellular" msgstr "Cellulær" -#: dcim/choices.py:1165 dcim/forms/filtersets.py:383 +#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 #: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 #: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 #: templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seriel" -#: dcim/choices.py:1180 +#: dcim/choices.py:1182 msgid "Coaxial" msgstr "Koaksial" -#: dcim/choices.py:1200 +#: dcim/choices.py:1202 msgid "Stacking" msgstr "Stabling" -#: dcim/choices.py:1250 +#: dcim/choices.py:1252 msgid "Half" msgstr "Halvdelen" -#: dcim/choices.py:1251 +#: dcim/choices.py:1253 msgid "Full" msgstr "Fuld" -#: dcim/choices.py:1252 netbox/preferences.py:31 wireless/choices.py:480 +#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1263 +#: dcim/choices.py:1265 msgid "Access" msgstr "Adgang" -#: dcim/choices.py:1264 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 +#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 #: templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Markeret" -#: dcim/choices.py:1265 +#: dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Tagget (Alle)" -#: dcim/choices.py:1294 +#: dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE-standard" -#: dcim/choices.py:1305 +#: dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Passiv 24V (2-par)" -#: dcim/choices.py:1306 +#: dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Passiv 24V (4-par)" -#: dcim/choices.py:1307 +#: dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Passiv 48V (2-par)" -#: dcim/choices.py:1308 +#: dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Passiv 48V (4-par)" -#: dcim/choices.py:1378 dcim/choices.py:1488 +#: dcim/choices.py:1380 dcim/choices.py:1490 msgid "Copper" msgstr "Kobber" -#: dcim/choices.py:1401 +#: dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fiberoptisk" -#: dcim/choices.py:1434 dcim/choices.py:1517 +#: dcim/choices.py:1436 dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1504 +#: dcim/choices.py:1506 msgid "Fiber" msgstr "Fiber" -#: dcim/choices.py:1529 dcim/forms/filtersets.py:1227 +#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Tilsluttet" -#: dcim/choices.py:1548 wireless/choices.py:497 +#: dcim/choices.py:1550 wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometer" -#: dcim/choices.py:1549 templates/dcim/cable_trace.html:65 +#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 #: wireless/choices.py:498 msgid "Meters" msgstr "Meter" -#: dcim/choices.py:1550 +#: dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimeter" -#: dcim/choices.py:1551 wireless/choices.py:499 +#: dcim/choices.py:1553 wireless/choices.py:499 msgid "Miles" msgstr "Mil" -#: dcim/choices.py:1552 templates/dcim/cable_trace.html:66 +#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 #: wireless/choices.py:500 msgid "Feet" msgstr "Fod" -#: dcim/choices.py:1568 templates/dcim/device.html:327 +#: dcim/choices.py:1570 templates/dcim/device.html:327 #: templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogram" -#: dcim/choices.py:1569 +#: dcim/choices.py:1571 msgid "Grams" msgstr "Gram" -#: dcim/choices.py:1570 templates/dcim/device.html:328 +#: dcim/choices.py:1572 templates/dcim/device.html:328 #: templates/dcim/rack.html:108 msgid "Pounds" msgstr "pund" -#: dcim/choices.py:1571 +#: dcim/choices.py:1573 msgid "Ounces" msgstr "Ounce" -#: dcim/choices.py:1618 +#: dcim/choices.py:1620 msgid "Redundant" msgstr "Redundant" -#: dcim/choices.py:1639 +#: dcim/choices.py:1641 msgid "Single phase" msgstr "Enkeltfase" -#: dcim/choices.py:1640 +#: dcim/choices.py:1642 msgid "Three-phase" msgstr "Trefaset" @@ -2838,7 +2839,7 @@ msgstr "Klyngegruppe (ID)" msgid "Device model (slug)" msgstr "Enhedsmodel (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:516 +#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 msgid "Is full depth" msgstr "Er fuld dybde" @@ -2954,7 +2955,7 @@ msgstr "Tildelt VLAN" msgid "Assigned VID" msgstr "Tildelt VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1489 +#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 #: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 #: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 #: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 @@ -3115,27 +3116,27 @@ msgstr "" "Alfanumeriske intervaller understøttes. (Skal svare til antallet af navne, " "der oprettes.)" -#: dcim/forms/bulk_edit.py:132 +#: dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Kontaktens navn" -#: dcim/forms/bulk_edit.py:137 +#: dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Kontakt telefon" -#: dcim/forms/bulk_edit.py:143 +#: dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Kontakt E-mail" -#: dcim/forms/bulk_edit.py:146 dcim/forms/bulk_import.py:123 +#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 #: dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Tidszone" -#: dcim/forms/bulk_edit.py:224 dcim/forms/bulk_edit.py:495 -#: dcim/forms/bulk_edit.py:559 dcim/forms/bulk_edit.py:632 -#: dcim/forms/bulk_edit.py:656 dcim/forms/bulk_edit.py:740 -#: dcim/forms/bulk_edit.py:1267 dcim/forms/bulk_edit.py:1660 +#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 +#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 +#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 #: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 #: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 #: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 @@ -3158,51 +3159,51 @@ msgstr "Tidszone" msgid "Manufacturer" msgstr "Producent" -#: dcim/forms/bulk_edit.py:229 dcim/forms/bulk_edit.py:372 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 #: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 #: dcim/forms/filtersets.py:255 #: templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Formfaktor" -#: dcim/forms/bulk_edit.py:234 dcim/forms/bulk_edit.py:377 +#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 #: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 #: dcim/forms/filtersets.py:260 #: templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Bredde" -#: dcim/forms/bulk_edit.py:240 dcim/forms/bulk_edit.py:383 +#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 #: templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Højde (U)" -#: dcim/forms/bulk_edit.py:249 dcim/forms/bulk_edit.py:388 +#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 #: dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Faldende enheder" -#: dcim/forms/bulk_edit.py:252 dcim/forms/bulk_edit.py:391 +#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 msgid "Outer width" msgstr "Udvendig bredde" -#: dcim/forms/bulk_edit.py:257 dcim/forms/bulk_edit.py:396 +#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 msgid "Outer depth" msgstr "Ydre dybde" -#: dcim/forms/bulk_edit.py:262 dcim/forms/bulk_edit.py:401 +#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 #: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 msgid "Outer unit" msgstr "Ydre enhed" -#: dcim/forms/bulk_edit.py:267 dcim/forms/bulk_edit.py:406 +#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 msgid "Mounting depth" msgstr "Monteringsdybde" -#: dcim/forms/bulk_edit.py:272 dcim/forms/bulk_edit.py:299 -#: dcim/forms/bulk_edit.py:416 dcim/forms/bulk_edit.py:446 -#: dcim/forms/bulk_edit.py:529 dcim/forms/bulk_edit.py:552 -#: dcim/forms/bulk_edit.py:573 dcim/forms/bulk_edit.py:595 +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 +#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 +#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 +#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 #: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 #: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 #: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 @@ -3223,13 +3224,13 @@ msgstr "Monteringsdybde" msgid "Weight" msgstr "Vægt" -#: dcim/forms/bulk_edit.py:277 dcim/forms/bulk_edit.py:421 +#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 #: dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maks. Vægt" -#: dcim/forms/bulk_edit.py:282 dcim/forms/bulk_edit.py:426 -#: dcim/forms/bulk_edit.py:534 dcim/forms/bulk_edit.py:578 +#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 +#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 #: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 #: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 #: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 @@ -3237,31 +3238,31 @@ msgstr "Maks. Vægt" msgid "Weight unit" msgstr "Vægtenhed" -#: dcim/forms/bulk_edit.py:296 dcim/forms/filtersets.py:305 +#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 #: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 #: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Racktype" -#: dcim/forms/bulk_edit.py:298 dcim/forms/model_forms.py:220 +#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 #: dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Udvendige mål" -#: dcim/forms/bulk_edit.py:301 dcim/forms/model_forms.py:222 +#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 #: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 #: templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensioner" -#: dcim/forms/bulk_edit.py:303 dcim/forms/filtersets.py:306 +#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 #: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 #: templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Nummerering" -#: dcim/forms/bulk_edit.py:357 dcim/forms/bulk_edit.py:1262 -#: dcim/forms/bulk_edit.py:1655 dcim/forms/bulk_import.py:253 +#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 +#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 #: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 #: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 #: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 @@ -3301,21 +3302,21 @@ msgstr "Nummerering" msgid "Role" msgstr "Rolle" -#: dcim/forms/bulk_edit.py:364 dcim/forms/bulk_edit.py:712 -#: dcim/forms/bulk_edit.py:764 templates/dcim/device.html:104 +#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 +#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 #: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 #: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Serienummer" -#: dcim/forms/bulk_edit.py:367 dcim/forms/filtersets.py:387 +#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 #: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 #: dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Aktivemærke" -#: dcim/forms/bulk_edit.py:411 dcim/forms/bulk_edit.py:524 -#: dcim/forms/bulk_edit.py:568 dcim/forms/bulk_edit.py:705 +#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 +#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 #: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 #: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 #: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 @@ -3325,7 +3326,7 @@ msgstr "Aktivemærke" msgid "Airflow" msgstr "Luftstrøm" -#: dcim/forms/bulk_edit.py:440 dcim/forms/bulk_edit.py:910 +#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 #: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 #: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 #: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 @@ -3345,7 +3346,7 @@ msgstr "Luftstrøm" msgid "Rack" msgstr "Rack" -#: dcim/forms/bulk_edit.py:444 dcim/forms/bulk_edit.py:730 +#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 #: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 #: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 #: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 @@ -3354,49 +3355,49 @@ msgstr "Rack" msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:500 dcim/forms/bulk_import.py:377 +#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 #: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Standardplatform" -#: dcim/forms/bulk_edit.py:505 dcim/forms/bulk_edit.py:564 +#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 #: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Varenummer" -#: dcim/forms/bulk_edit.py:509 +#: dcim/forms/bulk_edit.py:510 msgid "U height" msgstr "U højde" -#: dcim/forms/bulk_edit.py:521 dcim/tables/devicetypes.py:102 +#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Ekskluder fra udnyttelse" -#: dcim/forms/bulk_edit.py:550 dcim/forms/model_forms.py:368 +#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 #: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 #: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 msgid "Device Type" msgstr "Enhedstype" -#: dcim/forms/bulk_edit.py:592 dcim/forms/model_forms.py:401 +#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 #: dcim/tables/modules.py:17 dcim/tables/modules.py:65 #: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 #: templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Modultype" -#: dcim/forms/bulk_edit.py:596 dcim/forms/model_forms.py:371 +#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 #: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chassis" -#: dcim/forms/bulk_edit.py:610 dcim/models/devices.py:484 +#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 #: dcim/tables/devices.py:67 msgid "VM role" msgstr "VM-rolle" -#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_edit.py:637 -#: dcim/forms/bulk_edit.py:720 dcim/forms/bulk_import.py:434 +#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 +#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 #: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 #: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 #: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 @@ -3409,19 +3410,19 @@ msgstr "VM-rolle" msgid "Config template" msgstr "Konfigurationsskabelon" -#: dcim/forms/bulk_edit.py:661 dcim/forms/bulk_edit.py:1061 +#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 #: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 #: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 #: dcim/forms/model_forms.py:889 extras/filtersets.py:547 msgid "Device type" msgstr "Enhedstype" -#: dcim/forms/bulk_edit.py:672 dcim/forms/bulk_import.py:473 +#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 #: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Enhedsrolle" -#: dcim/forms/bulk_edit.py:695 dcim/forms/bulk_import.py:498 +#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 #: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 #: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 #: extras/filtersets.py:563 templates/dcim/device.html:186 @@ -3435,8 +3436,28 @@ msgstr "Enhedsrolle" msgid "Platform" msgstr "Platformen" -#: dcim/forms/bulk_edit.py:728 dcim/forms/bulk_edit.py:1281 -#: dcim/forms/bulk_edit.py:1650 dcim/forms/bulk_edit.py:1696 +#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 +#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 +#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 +#: extras/filtersets.py:596 extras/forms/filtersets.py:322 +#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 +#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:101 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 +#: virtualization/forms/bulk_edit.py:129 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:99 +#: virtualization/forms/filtersets.py:123 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/model_forms.py:79 +#: virtualization/forms/model_forms.py:176 +#: virtualization/tables/virtualmachines.py:67 +msgid "Cluster" +msgstr "Klynge" + +#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 +#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 #: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 #: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 #: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 @@ -3493,22 +3514,27 @@ msgstr "Platformen" msgid "Device" msgstr "Enhed" -#: dcim/forms/bulk_edit.py:731 templates/extras/dashboard/widget_config.html:7 +#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 #: virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Konfiguration" -#: dcim/forms/bulk_edit.py:745 dcim/forms/bulk_import.py:653 +#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 +#: templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Virtualisering" + +#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 #: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Modultype" -#: dcim/forms/bulk_edit.py:799 dcim/forms/bulk_edit.py:984 -#: dcim/forms/bulk_edit.py:1003 dcim/forms/bulk_edit.py:1026 -#: dcim/forms/bulk_edit.py:1068 dcim/forms/bulk_edit.py:1112 -#: dcim/forms/bulk_edit.py:1163 dcim/forms/bulk_edit.py:1190 -#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1235 -#: dcim/forms/bulk_edit.py:1253 dcim/forms/filtersets.py:67 +#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 +#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 +#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 +#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 +#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 #: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 #: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 #: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 @@ -3520,82 +3546,82 @@ msgstr "Modultype" msgid "Label" msgstr "Mærke" -#: dcim/forms/bulk_edit.py:808 dcim/forms/filtersets.py:1068 +#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 #: templates/dcim/cable.html:50 msgid "Length" msgstr "Længde" -#: dcim/forms/bulk_edit.py:813 dcim/forms/bulk_import.py:1226 +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 #: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Længdeenhed" -#: dcim/forms/bulk_edit.py:837 templates/dcim/virtualchassis.html:23 +#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "domæne" -#: dcim/forms/bulk_edit.py:905 dcim/forms/bulk_import.py:1345 +#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 #: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Strømpanel" -#: dcim/forms/bulk_edit.py:927 dcim/forms/bulk_import.py:1381 +#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 #: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Forsyning" -#: dcim/forms/bulk_edit.py:933 dcim/forms/bulk_import.py:1386 +#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 #: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:939 dcim/forms/filtersets.py:1190 +#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 #: templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Spænding" -#: dcim/forms/bulk_edit.py:943 dcim/forms/filtersets.py:1194 +#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 #: templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Strømstyrke" -#: dcim/forms/bulk_edit.py:947 dcim/forms/filtersets.py:1198 +#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maksimal udnyttelse" -#: dcim/forms/bulk_edit.py:1036 +#: dcim/forms/bulk_edit.py:1046 msgid "Maximum draw" msgstr "Maksimal trækning" -#: dcim/forms/bulk_edit.py:1039 dcim/models/device_component_templates.py:282 +#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 #: dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maksimal forbrug (watt)" -#: dcim/forms/bulk_edit.py:1042 +#: dcim/forms/bulk_edit.py:1052 msgid "Allocated draw" msgstr "Tildelt lodtrækning" -#: dcim/forms/bulk_edit.py:1045 dcim/models/device_component_templates.py:289 +#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 #: dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Allokeret forbrug (watt)" -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_import.py:786 +#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 #: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 #: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 msgid "Power port" msgstr "Strømstik" -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_import.py:793 +#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 msgid "Feed leg" msgstr "Foderben" -#: dcim/forms/bulk_edit.py:1129 dcim/forms/bulk_edit.py:1440 +#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 msgid "Management only" msgstr "Kun ledelse" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1446 +#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 #: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 #: dcim/forms/object_import.py:90 #: dcim/models/device_component_templates.py:437 @@ -3603,7 +3629,7 @@ msgstr "Kun ledelse" msgid "PoE mode" msgstr "PoE-tilstand" -#: dcim/forms/bulk_edit.py:1145 dcim/forms/bulk_edit.py:1452 +#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 #: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 #: dcim/forms/object_import.py:95 #: dcim/models/device_component_templates.py:443 @@ -3611,12 +3637,12 @@ msgstr "PoE-tilstand" msgid "PoE type" msgstr "PoE-type" -#: dcim/forms/bulk_edit.py:1151 dcim/forms/filtersets.py:1404 +#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 #: dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Trådløs rolle" -#: dcim/forms/bulk_edit.py:1288 dcim/forms/model_forms.py:669 +#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 #: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 #: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 #: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 @@ -3626,16 +3652,16 @@ msgstr "Trådløs rolle" msgid "Module" msgstr "Modul" -#: dcim/forms/bulk_edit.py:1420 dcim/tables/devices.py:665 +#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 #: templates/dcim/interface.html:110 msgid "LAG" msgstr "FORSINKELSE" -#: dcim/forms/bulk_edit.py:1425 dcim/forms/model_forms.py:1305 +#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 msgid "Virtual device contexts" msgstr "Virtuelle enhedskontekster" -#: dcim/forms/bulk_edit.py:1431 dcim/forms/bulk_import.py:714 +#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 #: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 #: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 #: dcim/tables/devices.py:610 @@ -3644,7 +3670,7 @@ msgstr "Virtuelle enhedskontekster" msgid "Speed" msgstr "Hastighed" -#: dcim/forms/bulk_edit.py:1460 dcim/forms/bulk_import.py:885 +#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 #: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 #: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 #: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 @@ -3655,36 +3681,44 @@ msgstr "Hastighed" msgid "Mode" msgstr "Tilstand" -#: dcim/forms/bulk_edit.py:1468 dcim/forms/model_forms.py:1354 +#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 #: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 #: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 #: virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN-gruppe" -#: dcim/forms/bulk_edit.py:1476 dcim/forms/model_forms.py:1360 +#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 #: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 #: virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Umærket VLAN" -#: dcim/forms/bulk_edit.py:1484 dcim/forms/model_forms.py:1369 +#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 #: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 #: virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Mærkede VLAN'er" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1341 +#: dcim/forms/bulk_edit.py:1506 +msgid "Add tagged VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1515 +msgid "Remove tagged VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 msgid "Wireless LAN group" msgstr "Trådløs LAN-gruppe" -#: dcim/forms/bulk_edit.py:1499 dcim/forms/model_forms.py:1346 +#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 #: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 #: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Trådløse LAN" -#: dcim/forms/bulk_edit.py:1508 dcim/forms/filtersets.py:1328 +#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 #: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 #: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 #: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 @@ -3692,33 +3726,37 @@ msgstr "Trådløse LAN" msgid "Addressing" msgstr "Adressering" -#: dcim/forms/bulk_edit.py:1509 dcim/forms/filtersets.py:720 +#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 #: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Betjening" -#: dcim/forms/bulk_edit.py:1510 dcim/forms/filtersets.py:1329 +#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 #: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1511 dcim/forms/model_forms.py:1392 +#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 #: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 #: virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Relaterede grænseflader" -#: dcim/forms/bulk_edit.py:1512 dcim/forms/model_forms.py:1394 +#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 #: virtualization/forms/bulk_edit.py:268 #: virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q-skift" -#: dcim/forms/bulk_edit.py:1574 dcim/forms/bulk_edit.py:1576 +#: dcim/forms/bulk_edit.py:1553 +msgid "Add/Remove" +msgstr "" + +#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 msgid "Interface mode must be specified to assign VLANs" msgstr "Interfacetilstand skal specificeres for at tildele VLAN'er" -#: dcim/forms/bulk_edit.py:1581 dcim/forms/common.py:50 +#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "En adgangsgrænseflade kan ikke have tildelt taggede VLAN'er." @@ -3859,26 +3897,6 @@ msgstr "Tildelt platform" msgid "Virtual chassis" msgstr "Virtuelt kabinet" -#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:728 -#: dcim/forms/filtersets.py:898 dcim/forms/model_forms.py:522 -#: dcim/tables/devices.py:202 extras/filtersets.py:596 -#: extras/forms/filtersets.py:322 ipam/forms/filtersets.py:415 -#: ipam/forms/filtersets.py:447 templates/dcim/device.html:239 -#: templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 -msgid "Cluster" -msgstr "Klynge" - #: dcim/forms/bulk_import.py:521 msgid "Virtualization cluster" msgstr "Virtualiseringsklynge" @@ -6570,31 +6588,31 @@ msgstr "Der opstod en fejl under gengivelse af skabelonen: {error}" msgid "Virtual Machines" msgstr "Virtuelle maskiner" -#: dcim/views.py:2897 +#: dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Installeret enhed {device} i bugten {device_bay}." -#: dcim/views.py:2938 +#: dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Fjernet enhed {device} fra bugten {device_bay}." -#: dcim/views.py:3044 ipam/tables/ip.py:234 +#: dcim/views.py:3054 ipam/tables/ip.py:234 msgid "Children" msgstr "Børn" -#: dcim/views.py:3510 +#: dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Tilføjet medlem {device}" -#: dcim/views.py:3557 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Kan ikke fjerne masterenheden {device} fra det virtuelle chassis." -#: dcim/views.py:3570 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Fjernet {device} fra virtuelt chassis {chassis}" @@ -7529,19 +7547,19 @@ msgstr "Planlæg udførelse af script til et bestemt tidspunkt" msgid "Interval at which this script is re-run (in minutes)" msgstr "Interval, hvor scriptet køres igen (i minutter)" -#: extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Databaseændringer er blevet tilbageført automatisk." -#: extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Script afbrudt med fejl: " -#: extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "Der opstod en undtagelse: " -#: extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Databaseændringer er blevet tilbageført på grund af fejl." @@ -8853,7 +8871,7 @@ msgstr "VLAN-gruppen" #: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 #: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:234 ipam/tables/ip.py:255 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 #: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 #: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 #: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 @@ -9108,7 +9126,7 @@ msgstr "Tildelt til en grænseflade" msgid "DNS Name" msgstr "DNS-navn" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:235 ipam/tables/ip.py:176 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 #: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 #: netbox/navigation/menu.py:195 msgid "VLANs" @@ -9118,7 +9136,7 @@ msgstr "VLAN'er" msgid "Contains VLAN ID" msgstr "Indeholder VLAN ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:176 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 #: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN-ID" @@ -9575,40 +9593,48 @@ msgstr "Kan ikke indstille scope_type uden scope_id." msgid "Cannot set scope_id without scope_type." msgstr "Kan ikke indstille scope_id uden scope_type." -#: ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Intervaller kan ikke overlappe hinanden." -#: ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" -"Maksimal børneVID skal være større end eller lig med minimum børns VID " -"({value})" - -#: ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Det specifikke område, som dette VLAN er tildelt (hvis nogen)" -#: ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN-gruppe (valgfrit)" -#: ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerisk VLAN-id (1-4094)" -#: ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Driftsstatus for dette VLAN" -#: ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Den primære funktion af denne VLAN" -#: ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9617,7 +9643,7 @@ msgstr "" "VLAN er tildelt til gruppe {group} (anvendelsesområde: {scope}); kan ikke " "også tildele til området {site}." -#: ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" @@ -10361,10 +10387,6 @@ msgstr "IPsec-politikker" msgid "IPSec Profiles" msgstr "IPsec-profiler" -#: netbox/navigation/menu.py:243 templates/dcim/device_edit.html:78 -msgid "Virtualization" -msgstr "Virtualisering" - #: netbox/navigation/menu.py:251 #: templates/virtualization/virtualmachine.html:174 #: templates/virtualization/virtualmachine/base.html:32 @@ -10769,19 +10791,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "Række {i}: Objekt med ID {id} findes ikke" -#: netbox/views/generic/bulk_views.py:702 -#: netbox/views/generic/bulk_views.py:900 -#: netbox/views/generic/bulk_views.py:948 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "Nej {object_type} blev udvalgt." -#: netbox/views/generic/bulk_views.py:782 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Omdøbt {count} {object_type}" -#: netbox/views/generic/bulk_views.py:878 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Slettet {count} {object_type}" @@ -10813,7 +10835,7 @@ msgstr "Synkroniseret {count} {object_type}" msgid "{class_name} must implement get_children()" msgstr "{class_name} skal implementere get_children ()" -#: netbox/views/misc.py:44 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -12671,7 +12693,7 @@ msgid "You do not have permission to run scripts" msgstr "Du har ikke tilladelse til at køre scripts" #: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:86 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "Kør script" @@ -12683,27 +12705,32 @@ msgstr "Fejl ved indlæsning af script" msgid "Script no longer exists in the source file." msgstr "Script findes ikke længere i kildefilen." -#: templates/extras/script_list.html:46 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "Sidste løb" -#: templates/extras/script_list.html:61 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Script findes ikke længere i kildefilen" -#: templates/extras/script_list.html:74 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "Aldrig" -#: templates/extras/script_list.html:84 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "Kør igen" -#: templates/extras/script_list.html:138 +#: templates/extras/script_list.html:133 +#, python-format +msgid "Could not load scripts from module %(module)s" +msgstr "" + +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Ingen scripts fundet" -#: templates/extras/script_list.html:141 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -14546,13 +14573,13 @@ msgid "Memory (MB)" msgstr "Hukommelse (MB)" #: virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" -msgstr "Disk (GB)" +msgid "Disk (MB)" +msgstr "" #: virtualization/forms/bulk_edit.py:334 #: virtualization/forms/filtersets.py:251 -msgid "Size (GB)" -msgstr "Størrelse (GB)" +msgid "Size (MB)" +msgstr "" #: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" diff --git a/netbox/translations/de/LC_MESSAGES/django.mo b/netbox/translations/de/LC_MESSAGES/django.mo index fdcad71564f2ae6aab71e0ca8c964854bcc294d8..84659662029e5457eb6bfb4432fdf973ab58d332 100644 GIT binary patch delta 66345 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

    9d#V*N1{#Wv^un z9as;EO$bJV%OiUJJ9D&qAnQqoV_EaC#ewLY9e-t-D~rCFq_rfU=Q8*(!Ef}T=$p{1 zS|O2sP(JZ*D7Kl^2d)Y5?jj}|tGN}AOq}QavlIIiiX1e0=qv6pTWQQ zvf#UI$3F(*g~X&%9+;Y9lFbgds$owE&qLxef{pMO#kZ0DH!vtHUk_I#(HCOLA0xPp zO_Bsm28m=HNf()FJPoWdTQsH$mbLi3xT`19Y$5oD6E|t|5U<726SegB^Q~2(Xr(|` zQ9nQ5E=^l{l+4xq+jr>ZzcqafuPN!$we#~0=+MQtU5BQAzJbj_(6>eB4()y0 zckt`l&fhm>8b?VRxOH~{udY$NDsIhQ-m856t*3{24a*w-Ux}?{w|QNUj5qlauSh+U zmT4W(t80scyIT4O`1-dF@DKED=}!YKyRi4PG&NIU?>JGMh|DDey0q}`9I&-uVedw{ z3RG{aHvE0tb_fVid_e2wt-AO&?HcIo=ilD9qWXfZT~j}N-TgZY{&l%^dROnF(P`u6 hQ13dWxAOnpCNCVNw3T)$Z{@#gDW#B5NqklW{vX-dA720f delta 66226 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" msgstr "Mitglied hinzugefügt {device}" -#: dcim/views.py:3557 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Ein Hauptgerät (Master Device) {device} kann von einem virtuellen Gehäuse " "nicht entfernt werden." -#: dcim/views.py:3570 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "{device} vom virtuellen Gehäuse {chassis} entfernt." @@ -7657,19 +7675,19 @@ msgstr "Planen Sie die Ausführung des Skripts auf eine festgelegte Zeit" msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervall, in dem dieses Skript erneut ausgeführt wird (in Minuten)" -#: extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Datenbankänderungen wurden automatisch rückgängig gemacht." -#: extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Das Skript wurde mit einem Fehler abgebrochen: " -#: extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "Eine Ausnahme ist aufgetreten: " -#: extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Datenbankänderungen wurden aufgrund eines Fehlers rückgängig gemacht." @@ -9010,7 +9028,7 @@ msgstr "VLAN-Gruppe" #: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 #: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:234 ipam/tables/ip.py:255 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 #: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 #: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 #: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 @@ -9267,7 +9285,7 @@ msgstr "Einer Schnittstelle zugewiesen" msgid "DNS Name" msgstr "DNS-Name" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:235 ipam/tables/ip.py:176 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 #: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 #: netbox/navigation/menu.py:195 msgid "VLANs" @@ -9277,7 +9295,7 @@ msgstr "VLANs" msgid "Contains VLAN ID" msgstr "Enthält VLAN-ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:176 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 #: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN-ID" @@ -9746,41 +9764,49 @@ msgstr "scope_type kann nicht ohne scope_id gesetzt werden." msgid "Cannot set scope_id without scope_type." msgstr "scope_id kann nicht ohne scope_type gesetzt werden." -#: ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Bereiche dürfen sich nicht überschneiden." -#: ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" -"Die maximale untergeordnete VID muss größer oder gleich der Mindest-VID für " -"untergeordnete VIDs sein ({value})" - -#: ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" "Der spezifische Standort, der dieses VLAN zugewiesen ist (falls vorhanden)" -#: ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN-Gruppe (optional)" -#: ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerische VLAN-ID (1-4094)" -#: ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Betriebsstatus dieses VLAN" -#: ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Die Hauptfunktion dieses VLAN" -#: ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9789,7 +9815,7 @@ msgstr "" "VLAN ist der Gruppe {group} (Scope: {scope}) zugewiesen; kann nicht auch dem" " Standort {site} zugewiesen werden." -#: ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" @@ -10537,10 +10563,6 @@ msgstr "IPSec-Richtlinien" msgid "IPSec Profiles" msgstr "IPSec-Profile" -#: netbox/navigation/menu.py:243 templates/dcim/device_edit.html:78 -msgid "Virtualization" -msgstr "Virtualisierung" - #: netbox/navigation/menu.py:251 #: templates/virtualization/virtualmachine.html:174 #: templates/virtualization/virtualmachine/base.html:32 @@ -10951,19 +10973,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "Reihe {i}: Objekt mit ID {id} existiert nicht" -#: netbox/views/generic/bulk_views.py:702 -#: netbox/views/generic/bulk_views.py:900 -#: netbox/views/generic/bulk_views.py:948 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "Kein {object_type}ausgewählt" -#: netbox/views/generic/bulk_views.py:782 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Umbenannt {count} {object_type}" -#: netbox/views/generic/bulk_views.py:878 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Gelöscht {count} {object_type}" @@ -10995,7 +11017,7 @@ msgstr "Synchronisiert {count} {object_type}" msgid "{class_name} must implement get_children()" msgstr "{class_name} muss get_children () implementieren" -#: netbox/views/misc.py:44 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -12859,7 +12881,7 @@ msgid "You do not have permission to run scripts" msgstr "Sie sind nicht berechtigt, Skripts auszuführen" #: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:86 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "Skript ausführen" @@ -12871,27 +12893,32 @@ msgstr "Fehler beim Laden des Skripts" msgid "Script no longer exists in the source file." msgstr "Das Skript ist in der Quelldatei nicht mehr vorhanden." -#: templates/extras/script_list.html:46 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "Letzter Lauf" -#: templates/extras/script_list.html:61 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Das Skript ist in der Quelldatei nicht mehr vorhanden" -#: templates/extras/script_list.html:74 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "Niemals" -#: templates/extras/script_list.html:84 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "Nochmal ausführen" -#: templates/extras/script_list.html:138 +#: templates/extras/script_list.html:133 +#, python-format +msgid "Could not load scripts from module %(module)s" +msgstr "Skripte konnten nicht aus dem Modul geladen werden %(module)s" + +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Keine Skripte gefunden" -#: templates/extras/script_list.html:141 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -14759,13 +14786,13 @@ msgid "Memory (MB)" msgstr "Speicher (MB)" #: virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" -msgstr "Festplatte (GB)" +msgid "Disk (MB)" +msgstr "Festplatte (MB)" #: virtualization/forms/bulk_edit.py:334 #: virtualization/forms/filtersets.py:251 -msgid "Size (GB)" -msgstr "Größe (GB)" +msgid "Size (MB)" +msgstr "Größe (MB)" #: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" diff --git a/netbox/translations/es/LC_MESSAGES/django.mo b/netbox/translations/es/LC_MESSAGES/django.mo index 86fb45730f6ad525e0aaea48fc931328343a917b..5c7e126e0709d9121ca0dc893f83a3ef7b4a27c4 100644 GIT binary patch delta 66008 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 delta 66247 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 diff --git a/netbox/translations/es/LC_MESSAGES/django.po b/netbox/translations/es/LC_MESSAGES/django.po index ee77d76fc..480eb9f0f 100644 --- a/netbox/translations/es/LC_MESSAGES/django.po +++ b/netbox/translations/es/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-10-28 19:20+0000\n" +"POT-Creation-Date: 2024-11-21 15:50+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2024\n" "Language-Team: Spanish (https://app.transifex.com/netbox-community/teams/178115/es/)\n" @@ -84,8 +84,8 @@ msgid "Your password has been changed successfully." msgstr "La contraseña se ha cambiado correctamente." #: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1530 -#: dcim/choices.py:1606 dcim/choices.py:1656 virtualization/choices.py:20 +#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 +#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 #: virtualization/choices.py:45 vpn/choices.py:18 msgid "Planned" msgstr "Planificado" @@ -96,7 +96,7 @@ msgstr "Aprovisionamiento" #: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 #: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1605 dcim/choices.py:1655 extras/tables/tables.py:495 +#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 #: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 #: ipam/choices.py:154 templates/extras/configcontext.html:25 #: templates/users/user.html:37 users/forms/bulk_edit.py:38 @@ -106,7 +106,7 @@ msgid "Active" msgstr "Activo" #: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1604 dcim/choices.py:1657 virtualization/choices.py:24 +#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 #: virtualization/choices.py:43 msgid "Offline" msgstr "Desconectado" @@ -119,7 +119,7 @@ msgstr "Desaprovisionamiento" msgid "Decommissioned" msgstr "Desmantelado" -#: circuits/choices.py:90 dcim/choices.py:1617 tenancy/choices.py:17 +#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 msgid "Primary" msgstr "Primaria" @@ -178,8 +178,8 @@ msgstr "Grupo de sitios (slug)" #: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 #: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 #: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:168 dcim/forms/bulk_edit.py:329 -#: dcim/forms/bulk_edit.py:677 dcim/forms/bulk_edit.py:873 +#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 +#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 #: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 #: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 #: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 @@ -344,7 +344,7 @@ msgstr "Grupo de circuitos (slug)" #: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 #: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:128 dcim/forms/filtersets.py:195 +#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 #: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 #: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 #: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 @@ -356,21 +356,21 @@ msgstr "ASNs" #: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 #: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 #: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:73 -#: dcim/forms/bulk_edit.py:92 dcim/forms/bulk_edit.py:151 -#: dcim/forms/bulk_edit.py:192 dcim/forms/bulk_edit.py:210 -#: dcim/forms/bulk_edit.py:288 dcim/forms/bulk_edit.py:432 -#: dcim/forms/bulk_edit.py:466 dcim/forms/bulk_edit.py:481 -#: dcim/forms/bulk_edit.py:540 dcim/forms/bulk_edit.py:584 -#: dcim/forms/bulk_edit.py:618 dcim/forms/bulk_edit.py:642 -#: dcim/forms/bulk_edit.py:715 dcim/forms/bulk_edit.py:767 -#: dcim/forms/bulk_edit.py:819 dcim/forms/bulk_edit.py:842 -#: dcim/forms/bulk_edit.py:890 dcim/forms/bulk_edit.py:960 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1048 -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1177 dcim/forms/bulk_edit.py:1204 -#: dcim/forms/bulk_edit.py:1222 dcim/forms/bulk_edit.py:1240 -#: dcim/forms/bulk_edit.py:1258 dcim/forms/bulk_edit.py:1682 +#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 +#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 +#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 +#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 +#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 +#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 +#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 +#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 +#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 +#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 +#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 +#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 +#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 +#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 +#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 #: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 #: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 #: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 @@ -411,7 +411,7 @@ msgstr "ASNs" #: templates/extras/dashboard/widget_add.html:14 #: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 #: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:45 +#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 #: templates/extras/tag.html:20 templates/extras/webhook.html:17 #: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 #: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 @@ -478,9 +478,9 @@ msgid "Service ID" msgstr "ID de servicio" #: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:604 -#: dcim/forms/bulk_edit.py:804 dcim/forms/bulk_edit.py:1173 -#: dcim/forms/bulk_edit.py:1200 dcim/forms/bulk_edit.py:1678 +#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 +#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 +#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 #: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 #: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 #: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 @@ -497,11 +497,11 @@ msgstr "Color" #: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 #: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 #: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:782 -#: dcim/forms/bulk_edit.py:921 dcim/forms/bulk_edit.py:989 -#: dcim/forms/bulk_edit.py:1008 dcim/forms/bulk_edit.py:1031 -#: dcim/forms/bulk_edit.py:1073 dcim/forms/bulk_edit.py:1117 -#: dcim/forms/bulk_edit.py:1168 dcim/forms/bulk_edit.py:1195 +#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 +#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 +#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 +#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 +#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 #: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 #: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 #: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 @@ -546,11 +546,11 @@ msgstr "Cuenta de proveedor" #: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 #: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 #: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:106 -#: dcim/forms/bulk_edit.py:181 dcim/forms/bulk_edit.py:351 -#: dcim/forms/bulk_edit.py:700 dcim/forms/bulk_edit.py:756 -#: dcim/forms/bulk_edit.py:788 dcim/forms/bulk_edit.py:915 -#: dcim/forms/bulk_edit.py:1701 dcim/forms/bulk_import.py:88 +#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 +#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 +#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 +#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 +#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 #: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 #: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 #: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 @@ -577,7 +577,7 @@ msgstr "Cuenta de proveedor" #: templates/dcim/device.html:178 templates/dcim/location.html:45 #: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 #: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:47 templates/ipam/ipaddress.html:37 +#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 #: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 #: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 #: templates/virtualization/virtualmachine.html:19 @@ -602,10 +602,10 @@ msgstr "Estado" #: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 #: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 #: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:122 dcim/forms/bulk_edit.py:187 -#: dcim/forms/bulk_edit.py:346 dcim/forms/bulk_edit.py:461 -#: dcim/forms/bulk_edit.py:690 dcim/forms/bulk_edit.py:794 -#: dcim/forms/bulk_edit.py:1706 dcim/forms/bulk_import.py:107 +#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 +#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 +#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 +#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 #: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 #: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 #: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 @@ -709,11 +709,11 @@ msgstr "Velocidad del puerto (Kbps)" msgid "Upstream speed (Kbps)" msgstr "Velocidad de subida (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:951 -#: dcim/forms/bulk_edit.py:1315 dcim/forms/bulk_edit.py:1332 -#: dcim/forms/bulk_edit.py:1349 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1455 dcim/forms/bulk_edit.py:1594 -#: dcim/forms/bulk_edit.py:1611 +#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 +#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 +#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 +#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 +#: dcim/forms/bulk_edit.py:1649 msgid "Mark connected" msgstr "Marcar conectado" @@ -791,9 +791,9 @@ msgid "Provider network" msgstr "Red de proveedores" #: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:338 -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:682 -#: dcim/forms/bulk_edit.py:729 dcim/forms/bulk_edit.py:882 +#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 +#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 +#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 #: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 #: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 #: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 @@ -840,8 +840,8 @@ msgid "Contacts" msgstr "Contactos" #: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:112 dcim/forms/bulk_edit.py:313 -#: dcim/forms/bulk_edit.py:857 dcim/forms/bulk_import.py:93 +#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 +#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 #: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 #: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 #: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 @@ -864,7 +864,7 @@ msgid "Region" msgstr "Región" #: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:321 dcim/forms/bulk_edit.py:865 +#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 #: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 #: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 #: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 @@ -882,7 +882,7 @@ msgstr "Grupo de sitios" #: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 #: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 #: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:828 dcim/forms/filtersets.py:172 +#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 #: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 #: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 #: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 @@ -917,16 +917,17 @@ msgstr "Cuenta" msgid "Term Side" msgstr "Lado del término" -#: circuits/forms/filtersets.py:250 extras/forms/model_forms.py:582 -#: ipam/forms/filtersets.py:142 ipam/forms/filtersets.py:546 -#: ipam/forms/model_forms.py:323 templates/extras/configcontext.html:60 -#: templates/ipam/ipaddress.html:59 templates/ipam/vlan_edit.html:30 -#: tenancy/forms/filtersets.py:87 users/forms/model_forms.py:314 +#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 +#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 +#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 +#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 +#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 +#: users/forms/model_forms.py:314 msgid "Assignment" msgstr "Asignación" #: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:117 +#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 #: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 #: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 #: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 @@ -992,7 +993,7 @@ msgstr "ID de circuito único" #: dcim/models/devices.py:1173 dcim/models/devices.py:1399 #: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 #: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:195 +#: ipam/models/ip.py:730 ipam/models/vlans.py:211 #: virtualization/models/clusters.py:74 #: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 #: wireless/models.py:95 wireless/models.py:159 @@ -1131,7 +1132,7 @@ msgstr "" #: extras/models/notifications.py:126 extras/models/scripts.py:30 #: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 #: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:184 ipam/models/vrfs.py:22 +#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 #: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 #: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 #: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 @@ -1242,7 +1243,7 @@ msgstr "redes de proveedores" #: templates/extras/customfield.html:13 templates/extras/customlink.html:13 #: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 #: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:44 +#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 #: templates/extras/tag.html:14 templates/extras/webhook.html:13 #: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 #: templates/ipam/rir.html:22 templates/ipam/role.html:22 @@ -1379,7 +1380,7 @@ msgstr "Completado" #: core/choices.py:22 core/choices.py:59 core/constants.py:20 #: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1607 virtualization/choices.py:47 +#: dcim/choices.py:1609 virtualization/choices.py:47 msgid "Failed" msgstr "Falló" @@ -1526,8 +1527,8 @@ msgid "User name" msgstr "Nombre de usuario" #: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1400 dcim/forms/filtersets.py:1370 +#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 +#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 #: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 #: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 #: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 @@ -1627,7 +1628,7 @@ msgid "Completed before" msgstr "Completado antes" #: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:456 dcim/forms/filtersets.py:418 +#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 #: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 #: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 #: extras/tables/tables.py:302 extras/tables/tables.py:342 @@ -1689,9 +1690,9 @@ msgstr "" msgid "Rack Elevations" msgstr "Elevaciones de estanterías" -#: core/forms/model_forms.py:157 dcim/choices.py:1518 -#: dcim/forms/bulk_edit.py:969 dcim/forms/bulk_edit.py:1357 -#: dcim/forms/bulk_edit.py:1375 dcim/tables/racks.py:158 +#: core/forms/model_forms.py:157 dcim/choices.py:1520 +#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 +#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 #: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 msgid "Power" msgstr "Potencia" @@ -2227,11 +2228,11 @@ msgstr "Trabajo {id} se ha detenido." msgid "Failed to stop job {id}" msgstr "No se pudo detener el trabajo {id}" -#: core/views.py:678 +#: core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "No se pudo cargar el catálogo de complementos" -#: core/views.py:712 +#: core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} no se encontró" @@ -2249,7 +2250,7 @@ msgid "Staging" msgstr "Puesta en escena" #: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1531 virtualization/choices.py:23 +#: dcim/choices.py:1533 virtualization/choices.py:23 #: virtualization/choices.py:48 msgid "Decommissioning" msgstr "Desmantelamiento" @@ -2309,7 +2310,7 @@ msgstr "Obsoleto" msgid "Millimeters" msgstr "Milímetros" -#: dcim/choices.py:115 dcim/choices.py:1553 +#: dcim/choices.py:115 dcim/choices.py:1555 msgid "Inches" msgstr "Pulgadas" @@ -2321,8 +2322,8 @@ msgstr "De adelante hacia atrás" msgid "Rear to front" msgstr "De atrás hacia adelante" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:68 dcim/forms/bulk_edit.py:87 -#: dcim/forms/bulk_edit.py:173 dcim/forms/bulk_edit.py:1405 +#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 +#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 #: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 #: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 #: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 @@ -2396,7 +2397,7 @@ msgstr "De abajo hacia arriba" msgid "Top to bottom" msgstr "De arriba a abajo" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1303 +#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 msgid "Passive" msgstr "Pasivo" @@ -2424,8 +2425,8 @@ msgstr "Internacional/ITA" msgid "Proprietary" msgstr "Proprietario" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1219 -#: dcim/choices.py:1221 dcim/choices.py:1447 dcim/choices.py:1449 +#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 +#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 #: netbox/navigation/menu.py:200 msgid "Other" msgstr "Otros" @@ -2438,22 +2439,22 @@ msgstr "ITA/Internacional" msgid "Physical" msgstr "Físico" -#: dcim/choices.py:855 dcim/choices.py:1023 +#: dcim/choices.py:855 dcim/choices.py:1024 msgid "Virtual" msgstr "Virtual" -#: dcim/choices.py:856 dcim/choices.py:1097 dcim/forms/bulk_edit.py:1515 +#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 #: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 #: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 #: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 msgid "Wireless" msgstr "inalámbrico" -#: dcim/choices.py:1021 +#: dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfaces virtuales" -#: dcim/choices.py:1024 dcim/forms/bulk_edit.py:1410 +#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 #: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 #: dcim/tables/devices.py:660 templates/dcim/interface.html:106 #: templates/virtualization/vminterface.html:43 @@ -2463,155 +2464,155 @@ msgstr "Interfaces virtuales" msgid "Bridge" msgstr "puente" -#: dcim/choices.py:1025 +#: dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Grupo de agregación de enlaces (LAG)" -#: dcim/choices.py:1029 +#: dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fijo)" -#: dcim/choices.py:1044 +#: dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modular)" -#: dcim/choices.py:1081 +#: dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (placa base)" -#: dcim/choices.py:1113 +#: dcim/choices.py:1115 msgid "Cellular" msgstr "Celular" -#: dcim/choices.py:1165 dcim/forms/filtersets.py:383 +#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 #: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 #: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 #: templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "serie" -#: dcim/choices.py:1180 +#: dcim/choices.py:1182 msgid "Coaxial" msgstr "Coaxial" -#: dcim/choices.py:1200 +#: dcim/choices.py:1202 msgid "Stacking" msgstr "Apilamiento" -#: dcim/choices.py:1250 +#: dcim/choices.py:1252 msgid "Half" msgstr "Mitad" -#: dcim/choices.py:1251 +#: dcim/choices.py:1253 msgid "Full" msgstr "Lleno" -#: dcim/choices.py:1252 netbox/preferences.py:31 wireless/choices.py:480 +#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1263 +#: dcim/choices.py:1265 msgid "Access" msgstr "Acceso" -#: dcim/choices.py:1264 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 +#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 #: templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Etiquetado" -#: dcim/choices.py:1265 +#: dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Etiquetado (Todos)" -#: dcim/choices.py:1294 +#: dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Estándar IEEE" -#: dcim/choices.py:1305 +#: dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Pasivo 24 V (2 pares)" -#: dcim/choices.py:1306 +#: dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Pasivo de 24 V (4 pares)" -#: dcim/choices.py:1307 +#: dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Pasivo 48 V (2 pares)" -#: dcim/choices.py:1308 +#: dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Pasivo de 48 V (4 pares)" -#: dcim/choices.py:1378 dcim/choices.py:1488 +#: dcim/choices.py:1380 dcim/choices.py:1490 msgid "Copper" msgstr "Cobre" -#: dcim/choices.py:1401 +#: dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fibra óptica" -#: dcim/choices.py:1434 dcim/choices.py:1517 +#: dcim/choices.py:1436 dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1504 +#: dcim/choices.py:1506 msgid "Fiber" msgstr "Fibra" -#: dcim/choices.py:1529 dcim/forms/filtersets.py:1227 +#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Conectado" -#: dcim/choices.py:1548 wireless/choices.py:497 +#: dcim/choices.py:1550 wireless/choices.py:497 msgid "Kilometers" msgstr "Kilómetros" -#: dcim/choices.py:1549 templates/dcim/cable_trace.html:65 +#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 #: wireless/choices.py:498 msgid "Meters" msgstr "Medidores" -#: dcim/choices.py:1550 +#: dcim/choices.py:1552 msgid "Centimeters" msgstr "Centímetros" -#: dcim/choices.py:1551 wireless/choices.py:499 +#: dcim/choices.py:1553 wireless/choices.py:499 msgid "Miles" msgstr "Millas" -#: dcim/choices.py:1552 templates/dcim/cable_trace.html:66 +#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 #: wireless/choices.py:500 msgid "Feet" msgstr "Pies" -#: dcim/choices.py:1568 templates/dcim/device.html:327 +#: dcim/choices.py:1570 templates/dcim/device.html:327 #: templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogramos" -#: dcim/choices.py:1569 +#: dcim/choices.py:1571 msgid "Grams" msgstr "Gramos" -#: dcim/choices.py:1570 templates/dcim/device.html:328 +#: dcim/choices.py:1572 templates/dcim/device.html:328 #: templates/dcim/rack.html:108 msgid "Pounds" msgstr "Libras" -#: dcim/choices.py:1571 +#: dcim/choices.py:1573 msgid "Ounces" msgstr "Onzas" -#: dcim/choices.py:1618 +#: dcim/choices.py:1620 msgid "Redundant" msgstr "Redundante" -#: dcim/choices.py:1639 +#: dcim/choices.py:1641 msgid "Single phase" msgstr "Monofásico" -#: dcim/choices.py:1640 +#: dcim/choices.py:1642 msgid "Three-phase" msgstr "Trifásico" @@ -2844,7 +2845,7 @@ msgstr "Grupo de clústeres (ID)" msgid "Device model (slug)" msgstr "Modelo de dispositivo (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:516 +#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 msgid "Is full depth" msgstr "Es de profundidad total" @@ -2960,7 +2961,7 @@ msgstr "VLAN asignada" msgid "Assigned VID" msgstr "VID asignado" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1489 +#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 #: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 #: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 #: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 @@ -3121,27 +3122,27 @@ msgstr "" "Se admiten los rangos alfanuméricos. (Debe coincidir con el número de " "nombres que se están creando)." -#: dcim/forms/bulk_edit.py:132 +#: dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Nombre de contacto" -#: dcim/forms/bulk_edit.py:137 +#: dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Teléfono de contacto" -#: dcim/forms/bulk_edit.py:143 +#: dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Correo electrónico de contacto" -#: dcim/forms/bulk_edit.py:146 dcim/forms/bulk_import.py:123 +#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 #: dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Zona horaria" -#: dcim/forms/bulk_edit.py:224 dcim/forms/bulk_edit.py:495 -#: dcim/forms/bulk_edit.py:559 dcim/forms/bulk_edit.py:632 -#: dcim/forms/bulk_edit.py:656 dcim/forms/bulk_edit.py:740 -#: dcim/forms/bulk_edit.py:1267 dcim/forms/bulk_edit.py:1660 +#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 +#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 +#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 +#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 #: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 #: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 #: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 @@ -3164,51 +3165,51 @@ msgstr "Zona horaria" msgid "Manufacturer" msgstr "fabricante" -#: dcim/forms/bulk_edit.py:229 dcim/forms/bulk_edit.py:372 +#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 #: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 #: dcim/forms/filtersets.py:255 #: templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Factor de forma" -#: dcim/forms/bulk_edit.py:234 dcim/forms/bulk_edit.py:377 +#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 #: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 #: dcim/forms/filtersets.py:260 #: templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Anchura" -#: dcim/forms/bulk_edit.py:240 dcim/forms/bulk_edit.py:383 +#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 #: templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Altura (U)" -#: dcim/forms/bulk_edit.py:249 dcim/forms/bulk_edit.py:388 +#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 #: dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Unidades descendentes" -#: dcim/forms/bulk_edit.py:252 dcim/forms/bulk_edit.py:391 +#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 msgid "Outer width" msgstr "Anchura exterior" -#: dcim/forms/bulk_edit.py:257 dcim/forms/bulk_edit.py:396 +#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 msgid "Outer depth" msgstr "Profundidad exterior" -#: dcim/forms/bulk_edit.py:262 dcim/forms/bulk_edit.py:401 +#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 #: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 msgid "Outer unit" msgstr "Unidad exterior" -#: dcim/forms/bulk_edit.py:267 dcim/forms/bulk_edit.py:406 +#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 msgid "Mounting depth" msgstr "Profundidad de montaje" -#: dcim/forms/bulk_edit.py:272 dcim/forms/bulk_edit.py:299 -#: dcim/forms/bulk_edit.py:416 dcim/forms/bulk_edit.py:446 -#: dcim/forms/bulk_edit.py:529 dcim/forms/bulk_edit.py:552 -#: dcim/forms/bulk_edit.py:573 dcim/forms/bulk_edit.py:595 +#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 +#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 +#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 +#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 #: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 #: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 #: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 @@ -3229,13 +3230,13 @@ msgstr "Profundidad de montaje" msgid "Weight" msgstr "Peso" -#: dcim/forms/bulk_edit.py:277 dcim/forms/bulk_edit.py:421 +#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 #: dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Peso máximo" -#: dcim/forms/bulk_edit.py:282 dcim/forms/bulk_edit.py:426 -#: dcim/forms/bulk_edit.py:534 dcim/forms/bulk_edit.py:578 +#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 +#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 #: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 #: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 #: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 @@ -3243,31 +3244,31 @@ msgstr "Peso máximo" msgid "Weight unit" msgstr "Unidad de peso" -#: dcim/forms/bulk_edit.py:296 dcim/forms/filtersets.py:305 +#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 #: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 #: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Tipo de bastidor" -#: dcim/forms/bulk_edit.py:298 dcim/forms/model_forms.py:220 +#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 #: dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dimensiones exteriores" -#: dcim/forms/bulk_edit.py:301 dcim/forms/model_forms.py:222 +#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 #: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 #: templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensiones" -#: dcim/forms/bulk_edit.py:303 dcim/forms/filtersets.py:306 +#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 #: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 #: templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numeración" -#: dcim/forms/bulk_edit.py:357 dcim/forms/bulk_edit.py:1262 -#: dcim/forms/bulk_edit.py:1655 dcim/forms/bulk_import.py:253 +#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 +#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 #: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 #: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 #: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 @@ -3307,21 +3308,21 @@ msgstr "Numeración" msgid "Role" msgstr "Rol" -#: dcim/forms/bulk_edit.py:364 dcim/forms/bulk_edit.py:712 -#: dcim/forms/bulk_edit.py:764 templates/dcim/device.html:104 +#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 +#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 #: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 #: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Número de serie" -#: dcim/forms/bulk_edit.py:367 dcim/forms/filtersets.py:387 +#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 #: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 #: dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Etiqueta de activo" -#: dcim/forms/bulk_edit.py:411 dcim/forms/bulk_edit.py:524 -#: dcim/forms/bulk_edit.py:568 dcim/forms/bulk_edit.py:705 +#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 +#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 #: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 #: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 #: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 @@ -3331,7 +3332,7 @@ msgstr "Etiqueta de activo" msgid "Airflow" msgstr "Flujo de aire" -#: dcim/forms/bulk_edit.py:440 dcim/forms/bulk_edit.py:910 +#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 #: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 #: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 #: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 @@ -3351,7 +3352,7 @@ msgstr "Flujo de aire" msgid "Rack" msgstr "Estante" -#: dcim/forms/bulk_edit.py:444 dcim/forms/bulk_edit.py:730 +#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 #: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 #: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 #: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 @@ -3360,49 +3361,49 @@ msgstr "Estante" msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:500 dcim/forms/bulk_import.py:377 +#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 #: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Plataforma predeterminada" -#: dcim/forms/bulk_edit.py:505 dcim/forms/bulk_edit.py:564 +#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 #: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Número de pieza" -#: dcim/forms/bulk_edit.py:509 +#: dcim/forms/bulk_edit.py:510 msgid "U height" msgstr "Altura en U" -#: dcim/forms/bulk_edit.py:521 dcim/tables/devicetypes.py:102 +#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Excluir de la utilización" -#: dcim/forms/bulk_edit.py:550 dcim/forms/model_forms.py:368 +#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 #: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 #: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 msgid "Device Type" msgstr "Tipo de dispositivo" -#: dcim/forms/bulk_edit.py:592 dcim/forms/model_forms.py:401 +#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 #: dcim/tables/modules.py:17 dcim/tables/modules.py:65 #: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 #: templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Tipo de módulo" -#: dcim/forms/bulk_edit.py:596 dcim/forms/model_forms.py:371 +#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 #: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chasis" -#: dcim/forms/bulk_edit.py:610 dcim/models/devices.py:484 +#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 #: dcim/tables/devices.py:67 msgid "VM role" msgstr "Función de máquina virtual" -#: dcim/forms/bulk_edit.py:613 dcim/forms/bulk_edit.py:637 -#: dcim/forms/bulk_edit.py:720 dcim/forms/bulk_import.py:434 +#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 +#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 #: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 #: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 #: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 @@ -3415,19 +3416,19 @@ msgstr "Función de máquina virtual" msgid "Config template" msgstr "Plantilla de configuración" -#: dcim/forms/bulk_edit.py:661 dcim/forms/bulk_edit.py:1061 +#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 #: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 #: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 #: dcim/forms/model_forms.py:889 extras/filtersets.py:547 msgid "Device type" msgstr "Tipo de dispositivo" -#: dcim/forms/bulk_edit.py:672 dcim/forms/bulk_import.py:473 +#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 #: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Función del dispositivo" -#: dcim/forms/bulk_edit.py:695 dcim/forms/bulk_import.py:498 +#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 #: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 #: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 #: extras/filtersets.py:563 templates/dcim/device.html:186 @@ -3441,8 +3442,28 @@ msgstr "Función del dispositivo" msgid "Platform" msgstr "Plataforma" -#: dcim/forms/bulk_edit.py:728 dcim/forms/bulk_edit.py:1281 -#: dcim/forms/bulk_edit.py:1650 dcim/forms/bulk_edit.py:1696 +#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 +#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 +#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 +#: extras/filtersets.py:596 extras/forms/filtersets.py:322 +#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 +#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 +#: templates/virtualization/virtualmachine.html:92 +#: templates/virtualization/virtualmachine.html:101 +#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 +#: virtualization/forms/bulk_edit.py:129 +#: virtualization/forms/bulk_import.py:92 +#: virtualization/forms/filtersets.py:99 +#: virtualization/forms/filtersets.py:123 +#: virtualization/forms/filtersets.py:204 +#: virtualization/forms/model_forms.py:79 +#: virtualization/forms/model_forms.py:176 +#: virtualization/tables/virtualmachines.py:67 +msgid "Cluster" +msgstr "Clúster" + +#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 +#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 #: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 #: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 #: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 @@ -3499,22 +3520,27 @@ msgstr "Plataforma" msgid "Device" msgstr "Dispositivo" -#: dcim/forms/bulk_edit.py:731 templates/extras/dashboard/widget_config.html:7 +#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 #: virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configuración" -#: dcim/forms/bulk_edit.py:745 dcim/forms/bulk_import.py:653 +#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 +#: templates/dcim/device_edit.html:78 +msgid "Virtualization" +msgstr "Virtualización" + +#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 #: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Tipo de módulo" -#: dcim/forms/bulk_edit.py:799 dcim/forms/bulk_edit.py:984 -#: dcim/forms/bulk_edit.py:1003 dcim/forms/bulk_edit.py:1026 -#: dcim/forms/bulk_edit.py:1068 dcim/forms/bulk_edit.py:1112 -#: dcim/forms/bulk_edit.py:1163 dcim/forms/bulk_edit.py:1190 -#: dcim/forms/bulk_edit.py:1217 dcim/forms/bulk_edit.py:1235 -#: dcim/forms/bulk_edit.py:1253 dcim/forms/filtersets.py:67 +#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 +#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 +#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 +#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 +#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 +#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 #: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 #: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 #: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 @@ -3526,82 +3552,82 @@ msgstr "Tipo de módulo" msgid "Label" msgstr "Etiqueta" -#: dcim/forms/bulk_edit.py:808 dcim/forms/filtersets.py:1068 +#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 #: templates/dcim/cable.html:50 msgid "Length" msgstr "Longitud" -#: dcim/forms/bulk_edit.py:813 dcim/forms/bulk_import.py:1226 +#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 #: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Unidad de longitud" -#: dcim/forms/bulk_edit.py:837 templates/dcim/virtualchassis.html:23 +#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Dominio" -#: dcim/forms/bulk_edit.py:905 dcim/forms/bulk_import.py:1345 +#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 #: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Panel de alimentación" -#: dcim/forms/bulk_edit.py:927 dcim/forms/bulk_import.py:1381 +#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 #: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Suministro" -#: dcim/forms/bulk_edit.py:933 dcim/forms/bulk_import.py:1386 +#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 #: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:939 dcim/forms/filtersets.py:1190 +#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 #: templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Tensión" -#: dcim/forms/bulk_edit.py:943 dcim/forms/filtersets.py:1194 +#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 #: templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Amperaje" -#: dcim/forms/bulk_edit.py:947 dcim/forms/filtersets.py:1198 +#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Utilización máxima" -#: dcim/forms/bulk_edit.py:1036 +#: dcim/forms/bulk_edit.py:1046 msgid "Maximum draw" msgstr "Sorteo máximo" -#: dcim/forms/bulk_edit.py:1039 dcim/models/device_component_templates.py:282 +#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 #: dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Consumo máximo de energía (vatios)" -#: dcim/forms/bulk_edit.py:1042 +#: dcim/forms/bulk_edit.py:1052 msgid "Allocated draw" msgstr "Sorteo asignado" -#: dcim/forms/bulk_edit.py:1045 dcim/models/device_component_templates.py:289 +#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 #: dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Consumo de energía asignado (vatios)" -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_import.py:786 +#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 #: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 #: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 msgid "Power port" msgstr "Puerto de alimentación" -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_import.py:793 +#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 msgid "Feed leg" msgstr "Pierna de alimentación" -#: dcim/forms/bulk_edit.py:1129 dcim/forms/bulk_edit.py:1440 +#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 msgid "Management only" msgstr "Solo administración" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1446 +#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 #: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 #: dcim/forms/object_import.py:90 #: dcim/models/device_component_templates.py:437 @@ -3609,7 +3635,7 @@ msgstr "Solo administración" msgid "PoE mode" msgstr "Modo PoE" -#: dcim/forms/bulk_edit.py:1145 dcim/forms/bulk_edit.py:1452 +#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 #: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 #: dcim/forms/object_import.py:95 #: dcim/models/device_component_templates.py:443 @@ -3617,12 +3643,12 @@ msgstr "Modo PoE" msgid "PoE type" msgstr "Tipo de PoE" -#: dcim/forms/bulk_edit.py:1151 dcim/forms/filtersets.py:1404 +#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 #: dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Función inalámbrica" -#: dcim/forms/bulk_edit.py:1288 dcim/forms/model_forms.py:669 +#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 #: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 #: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 #: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 @@ -3632,16 +3658,16 @@ msgstr "Función inalámbrica" msgid "Module" msgstr "Módulo" -#: dcim/forms/bulk_edit.py:1420 dcim/tables/devices.py:665 +#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 #: templates/dcim/interface.html:110 msgid "LAG" msgstr "DESFASE" -#: dcim/forms/bulk_edit.py:1425 dcim/forms/model_forms.py:1305 +#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 msgid "Virtual device contexts" msgstr "Contextos de dispositivos virtuales" -#: dcim/forms/bulk_edit.py:1431 dcim/forms/bulk_import.py:714 +#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 #: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 #: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 #: dcim/tables/devices.py:610 @@ -3650,7 +3676,7 @@ msgstr "Contextos de dispositivos virtuales" msgid "Speed" msgstr "Velocidad" -#: dcim/forms/bulk_edit.py:1460 dcim/forms/bulk_import.py:885 +#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 #: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 #: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 #: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 @@ -3661,36 +3687,44 @@ msgstr "Velocidad" msgid "Mode" msgstr "Modo" -#: dcim/forms/bulk_edit.py:1468 dcim/forms/model_forms.py:1354 +#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 #: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 #: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 #: virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Grupo de VLAN" -#: dcim/forms/bulk_edit.py:1476 dcim/forms/model_forms.py:1360 +#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 #: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 #: virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN sin etiquetar" -#: dcim/forms/bulk_edit.py:1484 dcim/forms/model_forms.py:1369 +#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 #: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 #: virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLAN etiquetadas" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1341 +#: dcim/forms/bulk_edit.py:1506 +msgid "Add tagged VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1515 +msgid "Remove tagged VLANs" +msgstr "" + +#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 msgid "Wireless LAN group" msgstr "Grupo LAN inalámbrico" -#: dcim/forms/bulk_edit.py:1499 dcim/forms/model_forms.py:1346 +#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 #: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 #: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "LAN inalámbricas" -#: dcim/forms/bulk_edit.py:1508 dcim/forms/filtersets.py:1328 +#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 #: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 #: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 #: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 @@ -3698,33 +3732,37 @@ msgstr "LAN inalámbricas" msgid "Addressing" msgstr "Dirigiéndose" -#: dcim/forms/bulk_edit.py:1509 dcim/forms/filtersets.py:720 +#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 #: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operación" -#: dcim/forms/bulk_edit.py:1510 dcim/forms/filtersets.py:1329 +#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 #: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1511 dcim/forms/model_forms.py:1392 +#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 #: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 #: virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Interfaces relacionadas" -#: dcim/forms/bulk_edit.py:1512 dcim/forms/model_forms.py:1394 +#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 #: virtualization/forms/bulk_edit.py:268 #: virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Conmutación 802.1Q" -#: dcim/forms/bulk_edit.py:1574 dcim/forms/bulk_edit.py:1576 +#: dcim/forms/bulk_edit.py:1553 +msgid "Add/Remove" +msgstr "" + +#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 msgid "Interface mode must be specified to assign VLANs" msgstr "Se debe especificar el modo de interfaz para asignar las VLAN" -#: dcim/forms/bulk_edit.py:1581 dcim/forms/common.py:50 +#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Una interfaz de acceso no puede tener asignadas VLAN etiquetadas." @@ -3866,26 +3904,6 @@ msgstr "Plataforma asignada" msgid "Virtual chassis" msgstr "Chasis virtual" -#: dcim/forms/bulk_import.py:517 dcim/forms/filtersets.py:728 -#: dcim/forms/filtersets.py:898 dcim/forms/model_forms.py:522 -#: dcim/tables/devices.py:202 extras/filtersets.py:596 -#: extras/forms/filtersets.py:322 ipam/forms/filtersets.py:415 -#: ipam/forms/filtersets.py:447 templates/dcim/device.html:239 -#: templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 -msgid "Cluster" -msgstr "Clúster" - #: dcim/forms/bulk_import.py:521 msgid "Virtualization cluster" msgstr "Clúster de virtualización" @@ -6632,33 +6650,33 @@ msgstr "Se ha producido un error al renderizar la plantilla: {error}" msgid "Virtual Machines" msgstr "Máquinas virtuales" -#: dcim/views.py:2897 +#: dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Dispositivo instalado {device} en la bahía {device_bay}." -#: dcim/views.py:2938 +#: dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Dispositivo eliminado {device} desde la bahía {device_bay}." -#: dcim/views.py:3044 ipam/tables/ip.py:234 +#: dcim/views.py:3054 ipam/tables/ip.py:234 msgid "Children" msgstr "Niños" -#: dcim/views.py:3510 +#: dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Miembro agregado {device}" -#: dcim/views.py:3557 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "No se puede eliminar el dispositivo maestro {device} desde el chasis " "virtual." -#: dcim/views.py:3570 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Eliminado {device} desde un chasis virtual {chassis}" @@ -7608,19 +7626,19 @@ msgstr "Programe la ejecución del script a una hora determinada" msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervalo en el que se vuelve a ejecutar este script (en minutos)" -#: extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Los cambios en la base de datos se han revertido automáticamente." -#: extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Secuencia de comandos abortada con un error: " -#: extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "Se ha producido una excepción: " -#: extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Los cambios en la base de datos se han revertido debido a un error." @@ -8953,7 +8971,7 @@ msgstr "Grupo VLAN" #: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 #: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:234 ipam/tables/ip.py:255 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 #: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 #: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 #: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 @@ -9210,7 +9228,7 @@ msgstr "Asignado a una interfaz" msgid "DNS Name" msgstr "Nombre DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:235 ipam/tables/ip.py:176 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 #: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 #: netbox/navigation/menu.py:195 msgid "VLANs" @@ -9220,7 +9238,7 @@ msgstr "VLAN" msgid "Contains VLAN ID" msgstr "Contiene el identificador de VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:176 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 #: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "IDENTIFICADOR DE VLAN" @@ -9682,40 +9700,48 @@ msgstr "No se puede establecer scope_type sin scope_id." msgid "Cannot set scope_id without scope_type." msgstr "No se puede establecer scope_id sin scope_type." -#: ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Los rangos no se pueden superponer." -#: ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" -"El VID infantil máximo debe ser mayor o igual al VID infantil mínimo " -"({value})" - -#: ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "El sitio específico al que está asignada esta VLAN (si existe)" -#: ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Grupo de VLAN (opcional)" -#: ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID de VLAN numérico (1-4094)" -#: ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Estado operativo de esta VLAN" -#: ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "La función principal de esta VLAN" -#: ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9724,7 +9750,7 @@ msgstr "" "La VLAN está asignada al grupo {group} (alcance: {scope}); no se puede " "asignar también al sitio {site}." -#: ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "El VID debe estar en rangos {ranges} para VLAN en grupo {group}" @@ -10477,10 +10503,6 @@ msgstr "Políticas IPSec" msgid "IPSec Profiles" msgstr "Perfiles IPSec" -#: netbox/navigation/menu.py:243 templates/dcim/device_edit.html:78 -msgid "Virtualization" -msgstr "Virtualización" - #: netbox/navigation/menu.py:251 #: templates/virtualization/virtualmachine.html:174 #: templates/virtualization/virtualmachine/base.html:32 @@ -10885,19 +10907,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "Fila {i}: Objeto con ID {id} no existe" -#: netbox/views/generic/bulk_views.py:702 -#: netbox/views/generic/bulk_views.py:900 -#: netbox/views/generic/bulk_views.py:948 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "No {object_type} fueron seleccionados." -#: netbox/views/generic/bulk_views.py:782 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Renombrado {count} {object_type}" -#: netbox/views/generic/bulk_views.py:878 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Eliminado {count} {object_type}" @@ -10931,7 +10953,7 @@ msgstr "Sincronizado {count} {object_type}" msgid "{class_name} must implement get_children()" msgstr "{class_name} debe implementar get_children ()" -#: netbox/views/misc.py:44 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -12795,7 +12817,7 @@ msgid "You do not have permission to run scripts" msgstr "No tiene permiso para ejecutar scripts" #: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:86 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "Ejecutar script" @@ -12807,27 +12829,32 @@ msgstr "Error al cargar el script" msgid "Script no longer exists in the source file." msgstr "El script ya no existe en el archivo fuente." -#: templates/extras/script_list.html:46 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "Última ejecución" -#: templates/extras/script_list.html:61 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "La secuencia de comandos ya no está presente en el archivo fuente" -#: templates/extras/script_list.html:74 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "Nunca" -#: templates/extras/script_list.html:84 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "Corre otra vez" -#: templates/extras/script_list.html:138 +#: templates/extras/script_list.html:133 +#, python-format +msgid "Could not load scripts from module %(module)s" +msgstr "" + +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "No se encontró ningún script" -#: templates/extras/script_list.html:141 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -14690,13 +14717,13 @@ msgid "Memory (MB)" msgstr "Memoria (MB)" #: virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" -msgstr "Disco (GB)" +msgid "Disk (MB)" +msgstr "" #: virtualization/forms/bulk_edit.py:334 #: virtualization/forms/filtersets.py:251 -msgid "Size (GB)" -msgstr "Tamaño (GB)" +msgid "Size (MB)" +msgstr "" #: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" diff --git a/netbox/translations/fr/LC_MESSAGES/django.mo b/netbox/translations/fr/LC_MESSAGES/django.mo index bf80d8fca67b92dc156c9c3598b5a4165b6f57af..4e3ff8a09766e66583d301dca5dac4754f5e43c7 100644 GIT binary patch delta 66008 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 D8j!<+ delta 66252 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 Qtpi}B*Vg5!y!Z6{KUJ6weE{device}" msgstr "Membre ajouté {device}" -#: dcim/views.py:3557 +#: dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Impossible de supprimer le périphérique principal {device} depuis le châssis" " virtuel." -#: dcim/views.py:3570 +#: dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Supprimé {device} depuis un châssis virtuel {chassis}" @@ -7620,21 +7638,21 @@ msgstr "Planifier l'exécution du script à une heure définie" msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervalle auquel ce script est réexécuté (en minutes)" -#: extras/jobs.py:49 +#: extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "" "Les modifications apportées à la base de données ont été annulées " "automatiquement." -#: extras/jobs.py:55 +#: extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Le script a été abandonné avec une erreur : " -#: extras/jobs.py:65 +#: extras/jobs.py:63 msgid "An exception occurred: " msgstr "Une exception s'est produite : " -#: extras/jobs.py:70 +#: extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "" "Les modifications apportées à la base de données ont été annulées en raison " @@ -8980,7 +8998,7 @@ msgstr "Groupe VLAN" #: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 #: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:234 ipam/tables/ip.py:255 +#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 #: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 #: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 #: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 @@ -9238,7 +9256,7 @@ msgstr "Affecté à une interface" msgid "DNS Name" msgstr "Nom DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:235 ipam/tables/ip.py:176 +#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 #: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 #: netbox/navigation/menu.py:195 msgid "VLANs" @@ -9248,7 +9266,7 @@ msgstr "VLAN" msgid "Contains VLAN ID" msgstr "Contient un ID de VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:176 +#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 #: templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "IDENTIFIANT DE VLAN" @@ -9717,40 +9735,48 @@ msgstr "Impossible de définir scope_type sans scope_id." msgid "Cannot set scope_id without scope_type." msgstr "Impossible de définir scope_id sans scope_type." -#: ipam/models/vlans.py:101 +#: ipam/models/vlans.py:105 +#, python-brace-format +msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" +msgstr "" + +#: ipam/models/vlans.py:111 +#, python-brace-format +msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" +msgstr "" + +#: ipam/models/vlans.py:118 +#, python-brace-format +msgid "" +"Ending VLAN ID in range must be greater than or equal to the starting VLAN " +"ID ({range})" +msgstr "" + +#: ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Les plages ne peuvent pas se chevaucher." -#: ipam/models/vlans.py:106 -#, python-brace-format -msgid "" -"Maximum child VID must be greater than or equal to minimum child VID " -"({value})" -msgstr "" -"La VID maximale pour les enfants doit être supérieure ou égale à la VID " -"minimale pour les enfants ({value})" - -#: ipam/models/vlans.py:165 +#: ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Le site spécifique auquel ce VLAN est associé (le cas échéant)" -#: ipam/models/vlans.py:173 +#: ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Groupe VLAN (facultatif)" -#: ipam/models/vlans.py:181 +#: ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID VLAN numérique (1-4094)" -#: ipam/models/vlans.py:199 +#: ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "État opérationnel de ce VLAN" -#: ipam/models/vlans.py:207 +#: ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "La principale fonction de ce VLAN" -#: ipam/models/vlans.py:250 +#: ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9759,7 +9785,7 @@ msgstr "" "Le VLAN est associé au groupe {group} (champ d'application : {scope}) ; ne " "peut pas également être associé au site {site}." -#: ipam/models/vlans.py:259 +#: ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" @@ -10520,10 +10546,6 @@ msgstr "Politiques IPSec" msgid "IPSec Profiles" msgstr "Profils IPSec" -#: netbox/navigation/menu.py:243 templates/dcim/device_edit.html:78 -msgid "Virtualization" -msgstr "Virtualisation" - #: netbox/navigation/menu.py:251 #: templates/virtualization/virtualmachine.html:174 #: templates/virtualization/virtualmachine/base.html:32 @@ -10931,19 +10953,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "Rangée {i}: Objet avec identifiant {id} n'existe pas" -#: netbox/views/generic/bulk_views.py:702 -#: netbox/views/generic/bulk_views.py:900 -#: netbox/views/generic/bulk_views.py:948 +#: netbox/views/generic/bulk_views.py:709 +#: netbox/views/generic/bulk_views.py:907 +#: netbox/views/generic/bulk_views.py:955 #, python-brace-format msgid "No {object_type} were selected." msgstr "Non {object_type} ont été sélectionnés." -#: netbox/views/generic/bulk_views.py:782 +#: netbox/views/generic/bulk_views.py:789 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Renommé {count} {object_type}" -#: netbox/views/generic/bulk_views.py:878 +#: netbox/views/generic/bulk_views.py:885 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Supprimé {count} {object_type}" @@ -10977,7 +10999,7 @@ msgstr "Synchronisé {count} {object_type}" msgid "{class_name} must implement get_children()" msgstr "{class_name} doit implémenter get_children ()" -#: netbox/views/misc.py:44 +#: netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -12842,7 +12864,7 @@ msgid "You do not have permission to run scripts" msgstr "Vous n'avez pas le droit d'exécuter des scripts" #: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:86 +#: templates/extras/script_list.html:87 msgid "Run Script" msgstr "Exécuter le script" @@ -12854,27 +12876,32 @@ msgstr "Erreur de chargement du script" msgid "Script no longer exists in the source file." msgstr "Le script n'existe plus dans le fichier source." -#: templates/extras/script_list.html:46 +#: templates/extras/script_list.html:47 msgid "Last Run" msgstr "Dernière exécution" -#: templates/extras/script_list.html:61 +#: templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Le script n'est plus présent dans le fichier source" -#: templates/extras/script_list.html:74 +#: templates/extras/script_list.html:75 msgid "Never" msgstr "Jamais" -#: templates/extras/script_list.html:84 +#: templates/extras/script_list.html:85 msgid "Run Again" msgstr "Exécutez à nouveau" -#: templates/extras/script_list.html:138 +#: templates/extras/script_list.html:133 +#, python-format +msgid "Could not load scripts from module %(module)s" +msgstr "" + +#: templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Aucun script trouvé" -#: templates/extras/script_list.html:141 +#: templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -14734,13 +14761,13 @@ msgid "Memory (MB)" msgstr "Mémoire (Mo)" #: virtualization/forms/bulk_edit.py:174 -msgid "Disk (GB)" -msgstr "Disque (Go)" +msgid "Disk (MB)" +msgstr "" #: virtualization/forms/bulk_edit.py:334 #: virtualization/forms/filtersets.py:251 -msgid "Size (GB)" -msgstr "Taille (Go)" +msgid "Size (MB)" +msgstr "" #: virtualization/forms/bulk_import.py:44 msgid "Type of cluster" diff --git a/netbox/translations/it/LC_MESSAGES/django.mo b/netbox/translations/it/LC_MESSAGES/django.mo index 839e154005e5dfd277bb98d051202ffc85e838c1..3e357f35d37e0476407cddcfe9fd629ba015ba34 100644 GIT binary patch delta 66008 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

    {% plugin_left_page object %} From 02cbdc10f20fa6699b291c2367b61af0250172b4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 13:28:17 -0500 Subject: [PATCH 059/169] #9604: Remove provider_network from CircuitTerminationSerializer & CircuitCircuitTerminationSerializer --- netbox/circuits/api/serializers_/circuits.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 70644a7b7..9b25c3af2 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -54,13 +54,12 @@ class CircuitCircuitTerminationSerializer(WritableNestedSerializer): ) termination_id = serializers.IntegerField(allow_null=True, required=False, default=None) termination = serializers.SerializerMethodField(read_only=True) - provider_network = ProviderNetworkSerializer(nested=True, allow_null=True) class Meta: model = CircuitTermination fields = [ - 'id', 'url', 'display_url', 'display', 'termination_type', 'termination_id', 'termination', - 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'description', + 'id', 'url', 'display_url', 'display', 'termination_type', 'termination_id', 'termination', 'port_speed', + 'upstream_speed', 'xconnect_id', 'description', ] @extend_schema_field(serializers.JSONField(allow_null=True)) @@ -133,15 +132,14 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer ) termination_id = serializers.IntegerField(allow_null=True, required=False, default=None) termination = serializers.SerializerMethodField(read_only=True) - provider_network = ProviderNetworkSerializer(nested=True, required=False, allow_null=True) class Meta: model = CircuitTermination fields = [ 'id', 'url', 'display_url', 'display', 'circuit', 'term_side', 'termination_type', 'termination_id', - 'termination', 'provider_network', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', - 'mark_connected', 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', - 'last_updated', '_occupied', + 'termination', 'port_speed', 'upstream_speed', 'xconnect_id', 'pp_info', 'description', 'mark_connected', + 'cable', 'cable_end', 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', + '_occupied', ] brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied') From dd29c0ede56873522fa8989ef926d4f2093fe25b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 13:35:15 -0500 Subject: [PATCH 060/169] #16136: Remove obsolete accommodation for Django admin UI --- netbox/templates/django/forms/widgets/checkbox.html | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/netbox/templates/django/forms/widgets/checkbox.html b/netbox/templates/django/forms/widgets/checkbox.html index f769fce96..8a1e1d23a 100644 --- a/netbox/templates/django/forms/widgets/checkbox.html +++ b/netbox/templates/django/forms/widgets/checkbox.html @@ -1,7 +1,6 @@ {% comment %} Include a hidden field of the same name to ensure that unchecked checkboxes - are always included in the submitted form data. Omit fields names - _selected_action to avoid breaking the admin UI. + are always included in the submitted form data. {% endcomment %} -{% if widget.name != '_selected_action' %}{% endif %} + From b45b8f3a4d217494050533c1251dac601230fbe0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 14:02:45 -0500 Subject: [PATCH 061/169] #7336: Correct API test --- netbox/ipam/tests/test_api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/tests/test_api.py b/netbox/ipam/tests/test_api.py index cbcb2e7c8..e9dcacc16 100644 --- a/netbox/ipam/tests/test_api.py +++ b/netbox/ipam/tests/test_api.py @@ -1080,7 +1080,7 @@ class VLANTranslationPolicyTest(APIViewTestCases.APIViewTestCase): class VLANTranslationRuleTest(APIViewTestCases.APIViewTestCase): model = VLANTranslationRule - brief_fields = ['id', 'local_vid', 'policy', 'remote_vid',] + brief_fields = ['description', 'display', 'id', 'local_vid', 'policy', 'remote_vid', 'url'] @classmethod def setUpTestData(cls): From 17189456c9e2d54e4ab67c1b38932c96d31b3968 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 14:51:59 -0500 Subject: [PATCH 062/169] #13086: Include button to terminate virtual circuit on interfaces table --- netbox/dcim/tables/template_code.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index e6f2c8817..449d55e14 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -390,6 +390,15 @@ INTERFACE_BUTTONS = """ {% endif %} + {% if perms.circuits.add_virtualcircuittermination and not record.virtual_circuit_termination %} + + + + {% elif perms.circuits.delete_virtualcircuittermination and record.virtual_circuit_termination %} + + + + {% endif %} {% elif record.is_wired and perms.dcim.add_cable %} From f17545788f8cb690c5e2b5bd9aebea020b2f0239 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 15:26:20 -0500 Subject: [PATCH 063/169] #16547: Reorder API serializer fields for Circuit --- netbox/circuits/api/serializers_/circuits.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 9b25c3af2..0365dca33 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -104,18 +104,19 @@ class CircuitSerializer(NetBoxModelSerializer): provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) status = ChoiceField(choices=CircuitStatusChoices, required=False) type = CircuitTypeSerializer(nested=True) + distance_unit = ChoiceField(choices=DistanceUnitChoices, allow_blank=True, required=False, allow_null=True) tenant = TenantSerializer(nested=True, required=False, allow_null=True) termination_a = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True) termination_z = CircuitCircuitTerminationSerializer(read_only=True, allow_null=True) assignments = CircuitGroupAssignmentSerializer_(nested=True, many=True, required=False) - distance_unit = ChoiceField(choices=DistanceUnitChoices, allow_blank=True, required=False, allow_null=True) class Meta: model = Circuit fields = [ 'id', 'url', 'display_url', 'display', 'cid', 'provider', 'provider_account', 'type', 'status', 'tenant', - 'install_date', 'termination_date', 'commit_rate', 'description', 'termination_a', 'termination_z', - 'distance', 'distance_unit', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'assignments', + 'install_date', 'termination_date', 'commit_rate', 'description', 'distance', 'distance_unit', + 'termination_a', 'termination_z', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'assignments', ] brief_fields = ('id', 'url', 'display', 'provider', 'cid', 'description') From b841875f6375990a4bf066abb888a6eb8ffeef05 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 15:30:15 -0500 Subject: [PATCH 064/169] #16783: Misc cleanup --- netbox/dcim/forms/filtersets.py | 2 +- netbox/templates/dcim/inventoryitem.html | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/netbox/dcim/forms/filtersets.py b/netbox/dcim/forms/filtersets.py index 4a373a996..37b8afd17 100644 --- a/netbox/dcim/forms/filtersets.py +++ b/netbox/dcim/forms/filtersets.py @@ -1524,7 +1524,7 @@ class InventoryItemFilterForm(DeviceComponentFilterForm): fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet( - 'name', 'label', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered', + 'name', 'label', 'status', 'role_id', 'manufacturer_id', 'serial', 'asset_tag', 'discovered', name=_('Attributes') ), FieldSet('region_id', 'site_group_id', 'site_id', 'location_id', 'rack_id', name=_('Location')), diff --git a/netbox/templates/dcim/inventoryitem.html b/netbox/templates/dcim/inventoryitem.html index f17bf2ade..fd8ea42eb 100644 --- a/netbox/templates/dcim/inventoryitem.html +++ b/netbox/templates/dcim/inventoryitem.html @@ -32,6 +32,10 @@ {% trans "Label" %} {{ object.label|placeholder }} + + {% trans "Status" %} + {% badge object.get_status_display bg_color=object.get_status_color %} + {% trans "Role" %} {{ object.role|linkify|placeholder }} @@ -56,10 +60,6 @@ {% trans "Asset Tag" %} {{ object.asset_tag|placeholder }} - - {% trans "Status" %} - {% badge object.get_status_display bg_color=object.get_status_color %} - {% trans "Description" %} {{ object.description|placeholder }} From d093b21bc0047f42d4e3b287f98f6403ac695480 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 25 Nov 2024 16:50:53 -0500 Subject: [PATCH 065/169] #17761: Set null=True on Site.time_zone --- netbox/dcim/migrations/0194_charfield_null_choices.py | 8 ++++++++ netbox/dcim/models/sites.py | 3 ++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/migrations/0194_charfield_null_choices.py b/netbox/dcim/migrations/0194_charfield_null_choices.py index 83c056386..e13b0e10d 100644 --- a/netbox/dcim/migrations/0194_charfield_null_choices.py +++ b/netbox/dcim/migrations/0194_charfield_null_choices.py @@ -1,3 +1,4 @@ +import timezone_field.fields from django.db import migrations, models @@ -24,6 +25,7 @@ def set_null_values(apps, schema_editor): Rack = apps.get_model('dcim', 'Rack') RackType = apps.get_model('dcim', 'RackType') RearPort = apps.get_model('dcim', 'RearPort') + Site = apps.get_model('dcim', 'Site') Cable.objects.filter(length_unit='').update(length_unit=None) Cable.objects.filter(type='').update(type=None) @@ -66,6 +68,7 @@ def set_null_values(apps, schema_editor): RackType.objects.filter(outer_unit='').update(outer_unit=None) RackType.objects.filter(weight_unit='').update(weight_unit=None) RearPort.objects.filter(cable_end='').update(cable_end=None) + Site.objects.filter(time_zone='').update(time_zone=None) class Migration(migrations.Migration): @@ -279,5 +282,10 @@ class Migration(migrations.Migration): name='cable_end', field=models.CharField(blank=True, max_length=1, null=True), ), + migrations.AlterField( + model_name='site', + name='time_zone', + field=timezone_field.fields.TimeZoneField(blank=True, null=True), + ), migrations.RunPython(code=set_null_values, reverse_code=migrations.RunPython.noop), ] diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 0985a8d7a..7880a067f 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -189,7 +189,8 @@ class Site(ContactsMixin, ImageAttachmentsMixin, PrimaryModel): blank=True ) time_zone = TimeZoneField( - blank=True + blank=True, + null=True ) physical_address = models.CharField( verbose_name=_('physical address'), From 9b4b56febc3e1078fb1e18d05a4439d271b89fde Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Nov 2024 09:56:33 -0500 Subject: [PATCH 066/169] #13428: Misc cleanup --- netbox/dcim/forms/bulk_edit.py | 15 +++++++++++++-- netbox/dcim/forms/model_forms.py | 2 +- netbox/ipam/choices.py | 4 ++-- netbox/ipam/forms/bulk_import.py | 2 +- netbox/templates/dcim/interface.html | 6 ++++++ netbox/templates/ipam/vlan.html | 6 +++--- 6 files changed, 26 insertions(+), 9 deletions(-) diff --git a/netbox/dcim/forms/bulk_edit.py b/netbox/dcim/forms/bulk_edit.py index 654459fce..dccca1bdf 100644 --- a/netbox/dcim/forms/bulk_edit.py +++ b/netbox/dcim/forms/bulk_edit.py @@ -7,6 +7,7 @@ from dcim.choices import * from dcim.constants import * from dcim.models import * from extras.models import ConfigTemplate +from ipam.choices import VLANQinQRoleChoices from ipam.models import ASN, VLAN, VLANGroup, VRF from netbox.choices import * from netbox.forms import NetBoxModelBulkEditForm @@ -1522,6 +1523,16 @@ class InterfaceBulkEditForm( 'available_on_device': '$device', } ) + qinq_svlan = DynamicModelChoiceField( + queryset=VLAN.objects.all(), + required=False, + label=_('Q-in-Q Service VLAN'), + query_params={ + 'group_id': '$vlan_group', + 'available_on_device': '$device', + 'qinq_role': VLANQinQRoleChoices.ROLE_SERVICE, + } + ) vrf = DynamicModelChoiceField( queryset=VRF.objects.all(), required=False, @@ -1548,7 +1559,7 @@ class InterfaceBulkEditForm( FieldSet('vdcs', 'mtu', 'tx_power', 'enabled', 'mgmt_only', 'mark_connected', name=_('Operation')), FieldSet('poe_mode', 'poe_type', name=_('PoE')), FieldSet('parent', 'bridge', 'lag', name=_('Related Interfaces')), - FieldSet('mode', 'vlan_group', 'untagged_vlan', name=_('802.1Q Switching')), + FieldSet('mode', 'vlan_group', 'untagged_vlan', 'qinq_svlan', name=_('802.1Q Switching')), FieldSet( TabbedGroups( FieldSet('tagged_vlans', name=_('Assignment')), @@ -1563,7 +1574,7 @@ class InterfaceBulkEditForm( nullable_fields = ( 'module', 'label', 'parent', 'bridge', 'lag', 'speed', 'duplex', 'wwn', 'vdcs', 'mtu', 'description', 'poe_mode', 'poe_type', 'mode', 'rf_channel', 'rf_channel_frequency', 'rf_channel_width', 'tx_power', - 'untagged_vlan', 'tagged_vlans', 'vrf', 'wireless_lans' + 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'vrf', 'wireless_lans' ) def __init__(self, *args, **kwargs): diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 3e6d87ff0..d6fdb21e2 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1395,7 +1395,7 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): 'available_on_device': '$device', } ) - qinq_svlan = DynamicModelMultipleChoiceField( + qinq_svlan = DynamicModelChoiceField( queryset=VLAN.objects.all(), required=False, label=_('Q-in-Q Service VLAN'), diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index 4d9c0bdd4..51b65a6da 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -159,8 +159,8 @@ class VLANStatusChoices(ChoiceSet): class VLANQinQRoleChoices(ChoiceSet): - ROLE_SERVICE = 's-vlan' - ROLE_CUSTOMER = 'c-vlan' + ROLE_SERVICE = 'svlan' + ROLE_CUSTOMER = 'cvlan' CHOICES = [ (ROLE_SERVICE, _('Service'), 'blue'), diff --git a/netbox/ipam/forms/bulk_import.py b/netbox/ipam/forms/bulk_import.py index e8d48de7c..0b37665d5 100644 --- a/netbox/ipam/forms/bulk_import.py +++ b/netbox/ipam/forms/bulk_import.py @@ -459,7 +459,7 @@ class VLANImportForm(NetBoxModelImportForm): ) qinq_role = CSVChoiceField( label=_('Q-in-Q role'), - choices=VLANStatusChoices, + choices=VLANQinQRoleChoices, required=False, help_text=_('Operational status') ) diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html index 1658dd37e..510780dd9 100644 --- a/netbox/templates/dcim/interface.html +++ b/netbox/templates/dcim/interface.html @@ -81,6 +81,12 @@ {% trans "802.1Q Mode" %} {{ object.get_mode_display|placeholder }} + {% if object.mode == 'q-in-q' %} + + {% trans "Q-in-Q SVLAN" %} + {{ object.qinq_svlan|linkify|placeholder }} + + {% endif %} {% trans "Transmit power (dBm)" %} {{ object.tx_power|placeholder }} diff --git a/netbox/templates/ipam/vlan.html b/netbox/templates/ipam/vlan.html index a10a1439a..fa480f2f6 100644 --- a/netbox/templates/ipam/vlan.html +++ b/netbox/templates/ipam/vlan.html @@ -72,7 +72,7 @@ {% endif %} - {% if object.qinq_role == 'c-vlan' %} + {% if object.qinq_role == 'cvlan' %} {% trans "Q-in-Q SVLAN" %} {{ object.qinq_svlan|linkify|placeholder }} @@ -108,13 +108,13 @@ {% htmx_table 'ipam:prefix_list' vlan_id=object.pk %} - {% if object.qinq_role == 's-vlan' %} + {% if object.qinq_role == 'svlan' %}

    {% trans "Customer VLANs" %} {% if perms.ipam.add_vlan %} From a24576f12607a73f24d2c75d9a2c97194a3066d6 Mon Sep 17 00:00:00 2001 From: Arthur Hanson Date: Tue, 26 Nov 2024 07:01:06 -0800 Subject: [PATCH 067/169] 7848 Add RQ API (#17938) * 7848 Add Background Tasks (RQ) to API * 7848 Tasks * 7848 cleanup * 7848 add worker support * 7848 switch to APIView * 7848 Task detail view * 7848 Task enqueue, requeue, stop * 7848 Task enqueue, requeue, stop * 7848 Task enqueue, requeue, stop * 7848 tests * 7848 tests * 7848 OpenAPI doc generation * 7848 OpenAPI doc generation * 7848 review changes * 7848 viewset * 7848 viewset * 7848 fix tests * 7848 more viewsets * 7848 fix docstring * 7848 review comments * 7848 review comments - get all tasks * 7848 queue detail view * 7848 cleanup * 7848 cleanup * 7848 cleanup * 7848 cleanup * Rename viewsets for consistency w/serializers * Misc cleanup * 7848 review changes * 7848 review changes * 7848 add test * 7848 queue detail view * 7848 fix tests * 7848 fix the spectacular test failure * 7848 fix the spectacular test failure * Misc cleanup --------- Co-authored-by: Jeremy Stretch --- netbox/core/api/schema.py | 3 + netbox/core/api/serializers.py | 1 + netbox/core/api/serializers_/tasks.py | 87 +++++++++++++ netbox/core/api/urls.py | 5 +- netbox/core/api/views.py | 161 ++++++++++++++++++++++++ netbox/core/tests/test_api.py | 170 +++++++++++++++++++++++++- netbox/core/utils.py | 155 +++++++++++++++++++++++ netbox/core/views.py | 104 ++-------------- netbox/netbox/api/pagination.py | 25 ++++ 9 files changed, 612 insertions(+), 99 deletions(-) create mode 100644 netbox/core/api/serializers_/tasks.py create mode 100644 netbox/core/utils.py diff --git a/netbox/core/api/schema.py b/netbox/core/api/schema.py index fad907ac1..663ee2899 100644 --- a/netbox/core/api/schema.py +++ b/netbox/core/api/schema.py @@ -158,6 +158,9 @@ class NetBoxAutoSchema(AutoSchema): fields = {} if hasattr(serializer, 'child') else serializer.fields remove_fields = [] + # If you get a failure here for "AttributeError: 'cached_property' object has no attribute 'items'" + # it is probably because you are using a viewsets.ViewSet for the API View and are defining a + # serializer_class. You will also need to define a get_serializer() method like for GenericAPIView. for child_name, child in fields.items(): # read_only fields don't need to be in writable (write only) serializers if 'read_only' in dir(child) and child.read_only: diff --git a/netbox/core/api/serializers.py b/netbox/core/api/serializers.py index 2dde6be9f..9a6d4d726 100644 --- a/netbox/core/api/serializers.py +++ b/netbox/core/api/serializers.py @@ -1,3 +1,4 @@ from .serializers_.change_logging import * from .serializers_.data import * from .serializers_.jobs import * +from .serializers_.tasks import * diff --git a/netbox/core/api/serializers_/tasks.py b/netbox/core/api/serializers_/tasks.py new file mode 100644 index 000000000..53f2b5126 --- /dev/null +++ b/netbox/core/api/serializers_/tasks.py @@ -0,0 +1,87 @@ +from rest_framework import serializers +from rest_framework.reverse import reverse + +__all__ = ( + 'BackgroundTaskSerializer', + 'BackgroundQueueSerializer', + 'BackgroundWorkerSerializer', +) + + +class BackgroundTaskSerializer(serializers.Serializer): + id = serializers.CharField() + url = serializers.HyperlinkedIdentityField( + view_name='core-api:rqtask-detail', + lookup_field='id', + lookup_url_kwarg='pk' + ) + description = serializers.CharField() + origin = serializers.CharField() + func_name = serializers.CharField() + args = serializers.ListField(child=serializers.CharField()) + kwargs = serializers.DictField() + result = serializers.CharField() + timeout = serializers.IntegerField() + result_ttl = serializers.IntegerField() + created_at = serializers.DateTimeField() + enqueued_at = serializers.DateTimeField() + started_at = serializers.DateTimeField() + ended_at = serializers.DateTimeField() + worker_name = serializers.CharField() + position = serializers.SerializerMethodField() + status = serializers.SerializerMethodField() + meta = serializers.DictField() + last_heartbeat = serializers.CharField() + + is_finished = serializers.BooleanField() + is_queued = serializers.BooleanField() + is_failed = serializers.BooleanField() + is_started = serializers.BooleanField() + is_deferred = serializers.BooleanField() + is_canceled = serializers.BooleanField() + is_scheduled = serializers.BooleanField() + is_stopped = serializers.BooleanField() + + def get_position(self, obj) -> int: + return obj.get_position() + + def get_status(self, obj) -> str: + return obj.get_status() + + +class BackgroundQueueSerializer(serializers.Serializer): + name = serializers.CharField() + url = serializers.SerializerMethodField() + jobs = serializers.IntegerField() + oldest_job_timestamp = serializers.CharField() + index = serializers.IntegerField() + scheduler_pid = serializers.CharField() + workers = serializers.IntegerField() + finished_jobs = serializers.IntegerField() + started_jobs = serializers.IntegerField() + deferred_jobs = serializers.IntegerField() + failed_jobs = serializers.IntegerField() + scheduled_jobs = serializers.IntegerField() + + def get_url(self, obj): + return reverse('core-api:rqqueue-detail', args=[obj['name']], request=self.context.get("request")) + + +class BackgroundWorkerSerializer(serializers.Serializer): + name = serializers.CharField() + url = serializers.HyperlinkedIdentityField( + view_name='core-api:rqworker-detail', + lookup_field='name' + ) + state = serializers.SerializerMethodField() + birth_date = serializers.DateTimeField() + queue_names = serializers.ListField( + child=serializers.CharField() + ) + pid = serializers.CharField() + successful_job_count = serializers.IntegerField() + failed_job_count = serializers.IntegerField() + total_working_time = serializers.IntegerField() + + def get_state(self, obj): + return obj.get_state() diff --git a/netbox/core/api/urls.py b/netbox/core/api/urls.py index 95ee1896e..3c22f1cf4 100644 --- a/netbox/core/api/urls.py +++ b/netbox/core/api/urls.py @@ -1,6 +1,7 @@ from netbox.api.routers import NetBoxRouter from . import views +app_name = 'core-api' router = NetBoxRouter() router.APIRootView = views.CoreRootView @@ -9,6 +10,8 @@ router.register('data-sources', views.DataSourceViewSet) router.register('data-files', views.DataFileViewSet) router.register('jobs', views.JobViewSet) router.register('object-changes', views.ObjectChangeViewSet) +router.register('background-queues', views.BackgroundQueueViewSet, basename='rqqueue') +router.register('background-workers', views.BackgroundWorkerViewSet, basename='rqworker') +router.register('background-tasks', views.BackgroundTaskViewSet, basename='rqtask') -app_name = 'core-api' urlpatterns = router.urls diff --git a/netbox/core/api/views.py b/netbox/core/api/views.py index b3a024c02..4e5b148fc 100644 --- a/netbox/core/api/views.py +++ b/netbox/core/api/views.py @@ -1,5 +1,8 @@ +from django.http import Http404, HttpResponse from django.shortcuts import get_object_or_404 from django.utils.translation import gettext_lazy as _ +from drf_spectacular.types import OpenApiTypes +from drf_spectacular.utils import extend_schema from rest_framework.decorators import action from rest_framework.exceptions import PermissionDenied from rest_framework.response import Response @@ -10,8 +13,17 @@ from core import filtersets from core.choices import DataSourceStatusChoices from core.jobs import SyncDataSourceJob from core.models import * +from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs, requeue_rq_job, stop_rq_job +from django_rq.queues import get_redis_connection +from django_rq.utils import get_statistics +from django_rq.settings import QUEUES_LIST from netbox.api.metadata import ContentTypeMetadata +from netbox.api.pagination import LimitOffsetListPagination from netbox.api.viewsets import NetBoxModelViewSet, NetBoxReadOnlyModelViewSet +from rest_framework import viewsets +from rest_framework.permissions import IsAdminUser +from rq.job import Job as RQ_Job +from rq.worker import Worker from . import serializers @@ -71,3 +83,152 @@ class ObjectChangeViewSet(ReadOnlyModelViewSet): queryset = ObjectChange.objects.valid_models() serializer_class = serializers.ObjectChangeSerializer filterset_class = filtersets.ObjectChangeFilterSet + + +class BaseRQViewSet(viewsets.ViewSet): + """ + Base class for RQ view sets. Provides a list() method. Subclasses must implement get_data(). + """ + permission_classes = [IsAdminUser] + serializer_class = None + + def get_data(self): + raise NotImplementedError() + + @extend_schema(responses={200: OpenApiTypes.OBJECT}) + def list(self, request): + data = self.get_data() + paginator = LimitOffsetListPagination() + data = paginator.paginate_list(data, request) + + serializer = self.serializer_class(data, many=True, context={'request': request}) + return paginator.get_paginated_response(serializer.data) + + def get_serializer(self, *args, **kwargs): + """ + Return the serializer instance that should be used for validating and + deserializing input, and for serializing output. + """ + serializer_class = self.get_serializer_class() + kwargs['context'] = self.get_serializer_context() + return serializer_class(*args, **kwargs) + + +class BackgroundQueueViewSet(BaseRQViewSet): + """ + Retrieve a list of RQ Queues. + Note: Queue names are not URL safe so not returning a detail view. + """ + serializer_class = serializers.BackgroundQueueSerializer + lookup_field = 'name' + lookup_value_regex = r'[\w.@+-]+' + + def get_view_name(self): + return "Background Queues" + + def get_data(self): + return get_statistics(run_maintenance_tasks=True)["queues"] + + @extend_schema(responses={200: OpenApiTypes.OBJECT}) + def retrieve(self, request, name): + data = self.get_data() + if not data: + raise Http404 + + for queue in data: + if queue['name'] == name: + serializer = self.serializer_class(queue, context={'request': request}) + return Response(serializer.data) + + raise Http404 + + +class BackgroundWorkerViewSet(BaseRQViewSet): + """ + Retrieve a list of RQ Workers. + """ + serializer_class = serializers.BackgroundWorkerSerializer + lookup_field = 'name' + + def get_view_name(self): + return "Background Workers" + + def get_data(self): + config = QUEUES_LIST[0] + return Worker.all(get_redis_connection(config['connection_config'])) + + def retrieve(self, request, name): + # all the RQ queues should use the same connection + config = QUEUES_LIST[0] + workers = Worker.all(get_redis_connection(config['connection_config'])) + worker = next((item for item in workers if item.name == name), None) + if not worker: + raise Http404 + + serializer = serializers.BackgroundWorkerSerializer(worker, context={'request': request}) + return Response(serializer.data) + + +class BackgroundTaskViewSet(BaseRQViewSet): + """ + Retrieve a list of RQ Tasks. + """ + serializer_class = serializers.BackgroundTaskSerializer + + def get_view_name(self): + return "Background Tasks" + + def get_data(self): + return get_rq_jobs() + + def get_task_from_id(self, task_id): + config = QUEUES_LIST[0] + task = RQ_Job.fetch(task_id, connection=get_redis_connection(config['connection_config'])) + if not task: + raise Http404 + + return task + + @extend_schema(responses={200: OpenApiTypes.OBJECT}) + def retrieve(self, request, pk): + """ + Retrieve the details of the specified RQ Task. + """ + task = self.get_task_from_id(pk) + serializer = self.serializer_class(task, context={'request': request}) + return Response(serializer.data) + + @action(methods=["POST"], detail=True) + def delete(self, request, pk): + """ + Delete the specified RQ Task. + """ + delete_rq_job(pk) + return HttpResponse(status=200) + + @action(methods=["POST"], detail=True) + def requeue(self, request, pk): + """ + Requeues the specified RQ Task. + """ + requeue_rq_job(pk) + return HttpResponse(status=200) + + @action(methods=["POST"], detail=True) + def enqueue(self, request, pk): + """ + Enqueues the specified RQ Task. + """ + enqueue_rq_job(pk) + return HttpResponse(status=200) + + @action(methods=["POST"], detail=True) + def stop(self, request, pk): + """ + Stops the specified RQ Task. + """ + stopped_jobs = stop_rq_job(pk) + if len(stopped_jobs) == 1: + return HttpResponse(status=200) + else: + return HttpResponse(status=204) diff --git a/netbox/core/tests/test_api.py b/netbox/core/tests/test_api.py index eeb3bd9c4..d8fb8fd83 100644 --- a/netbox/core/tests/test_api.py +++ b/netbox/core/tests/test_api.py @@ -1,7 +1,14 @@ +import uuid + +from django_rq import get_queue +from django_rq.workers import get_worker from django.urls import reverse from django.utils import timezone +from rq.job import Job as RQ_Job, JobStatus +from rq.registry import FailedJobRegistry, StartedJobRegistry -from utilities.testing import APITestCase, APIViewTestCases +from users.models import Token, User +from utilities.testing import APITestCase, APIViewTestCases, TestCase from ..models import * @@ -91,3 +98,164 @@ class DataFileTest( ), ) DataFile.objects.bulk_create(data_files) + + +class BackgroundTaskTestCase(TestCase): + user_permissions = () + + @staticmethod + def dummy_job_default(): + return "Job finished" + + @staticmethod + def dummy_job_failing(): + raise Exception("Job failed") + + def setUp(self): + """ + Create a user and token for API calls. + """ + # Create the test user and assign permissions + self.user = User.objects.create_user(username='testuser') + self.user.is_staff = True + self.user.is_active = True + self.user.save() + self.token = Token.objects.create(user=self.user) + self.header = {'HTTP_AUTHORIZATION': f'Token {self.token.key}'} + + # Clear all queues prior to running each test + get_queue('default').connection.flushall() + get_queue('high').connection.flushall() + get_queue('low').connection.flushall() + + def test_background_queue_list(self): + url = reverse('core-api:rqqueue-list') + + # Attempt to load view without permission + self.user.is_staff = False + self.user.save() + response = self.client.get(url, **self.header) + self.assertEqual(response.status_code, 403) + + # Load view with permission + self.user.is_staff = True + self.user.save() + response = self.client.get(url, **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn('default', str(response.content)) + self.assertIn('high', str(response.content)) + self.assertIn('low', str(response.content)) + + def test_background_queue(self): + response = self.client.get(reverse('core-api:rqqueue-detail', args=['default']), **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn('default', str(response.content)) + self.assertIn('oldest_job_timestamp', str(response.content)) + self.assertIn('scheduled_jobs', str(response.content)) + + def test_background_task_list(self): + queue = get_queue('default') + queue.enqueue(self.dummy_job_default) + + response = self.client.get(reverse('core-api:rqtask-list'), **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn('origin', str(response.content)) + self.assertIn('core.tests.test_api.BackgroundTaskTestCase.dummy_job_default()', str(response.content)) + + def test_background_task(self): + queue = get_queue('default') + job = queue.enqueue(self.dummy_job_default) + + response = self.client.get(reverse('core-api:rqtask-detail', args=[job.id]), **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn(str(job.id), str(response.content)) + self.assertIn('origin', str(response.content)) + self.assertIn('meta', str(response.content)) + self.assertIn('kwargs', str(response.content)) + + def test_background_task_delete(self): + queue = get_queue('default') + job = queue.enqueue(self.dummy_job_default) + + response = self.client.post(reverse('core-api:rqtask-delete', args=[job.id]), **self.header) + self.assertEqual(response.status_code, 200) + self.assertFalse(RQ_Job.exists(job.id, connection=queue.connection)) + queue = get_queue('default') + self.assertNotIn(job.id, queue.job_ids) + + def test_background_task_requeue(self): + queue = get_queue('default') + + # Enqueue & run a job that will fail + job = queue.enqueue(self.dummy_job_failing) + worker = get_worker('default') + worker.work(burst=True) + self.assertTrue(job.is_failed) + + # Re-enqueue the failed job and check that its status has been reset + response = self.client.post(reverse('core-api:rqtask-requeue', args=[job.id]), **self.header) + self.assertEqual(response.status_code, 200) + job = RQ_Job.fetch(job.id, queue.connection) + self.assertFalse(job.is_failed) + + def test_background_task_enqueue(self): + queue = get_queue('default') + + # Enqueue some jobs that each depends on its predecessor + job = previous_job = None + for _ in range(0, 3): + job = queue.enqueue(self.dummy_job_default, depends_on=previous_job) + previous_job = job + + # Check that the last job to be enqueued has a status of deferred + self.assertIsNotNone(job) + self.assertEqual(job.get_status(), JobStatus.DEFERRED) + self.assertIsNone(job.enqueued_at) + + # Force-enqueue the deferred job + response = self.client.post(reverse('core-api:rqtask-enqueue', args=[job.id]), **self.header) + self.assertEqual(response.status_code, 200) + + # Check that job's status is updated correctly + job = queue.fetch_job(job.id) + self.assertEqual(job.get_status(), JobStatus.QUEUED) + self.assertIsNotNone(job.enqueued_at) + + def test_background_task_stop(self): + queue = get_queue('default') + + worker = get_worker('default') + job = queue.enqueue(self.dummy_job_default) + worker.prepare_job_execution(job) + + self.assertEqual(job.get_status(), JobStatus.STARTED) + response = self.client.post(reverse('core-api:rqtask-stop', args=[job.id]), **self.header) + self.assertEqual(response.status_code, 200) + worker.monitor_work_horse(job, queue) # Sets the job as Failed and removes from Started + started_job_registry = StartedJobRegistry(queue.name, connection=queue.connection) + self.assertEqual(len(started_job_registry), 0) + + canceled_job_registry = FailedJobRegistry(queue.name, connection=queue.connection) + self.assertEqual(len(canceled_job_registry), 1) + self.assertIn(job.id, canceled_job_registry) + + def test_worker_list(self): + worker1 = get_worker('default', name=uuid.uuid4().hex) + worker1.register_birth() + + worker2 = get_worker('high') + worker2.register_birth() + + response = self.client.get(reverse('core-api:rqworker-list'), **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn(str(worker1.name), str(response.content)) + + def test_worker(self): + worker1 = get_worker('default', name=uuid.uuid4().hex) + worker1.register_birth() + + response = self.client.get(reverse('core-api:rqworker-detail', args=[worker1.name]), **self.header) + self.assertEqual(response.status_code, 200) + self.assertIn(str(worker1.name), str(response.content)) + self.assertIn('birth_date', str(response.content)) + self.assertIn('total_working_time', str(response.content)) diff --git a/netbox/core/utils.py b/netbox/core/utils.py new file mode 100644 index 000000000..26adfdfa2 --- /dev/null +++ b/netbox/core/utils.py @@ -0,0 +1,155 @@ +from django.http import Http404 +from django.utils.translation import gettext_lazy as _ +from django_rq.queues import get_queue, get_queue_by_index, get_redis_connection +from django_rq.settings import QUEUES_MAP, QUEUES_LIST +from django_rq.utils import get_jobs, stop_jobs +from rq import requeue_job +from rq.exceptions import NoSuchJobError +from rq.job import Job as RQ_Job, JobStatus as RQJobStatus +from rq.registry import ( + DeferredJobRegistry, + FailedJobRegistry, + FinishedJobRegistry, + ScheduledJobRegistry, + StartedJobRegistry, +) + +__all__ = ( + 'delete_rq_job', + 'enqueue_rq_job', + 'get_rq_jobs', + 'get_rq_jobs_from_status', + 'requeue_rq_job', + 'stop_rq_job', +) + + +def get_rq_jobs(): + """ + Return a list of all RQ jobs. + """ + jobs = set() + + for queue in QUEUES_LIST: + queue = get_queue(queue['name']) + jobs.update(queue.get_jobs()) + + return list(jobs) + + +def get_rq_jobs_from_status(queue, status): + """ + Return the RQ jobs with the given status. + """ + jobs = [] + + try: + registry_cls = { + RQJobStatus.STARTED: StartedJobRegistry, + RQJobStatus.DEFERRED: DeferredJobRegistry, + RQJobStatus.FINISHED: FinishedJobRegistry, + RQJobStatus.FAILED: FailedJobRegistry, + RQJobStatus.SCHEDULED: ScheduledJobRegistry, + }[status] + except KeyError: + raise Http404 + registry = registry_cls(queue.name, queue.connection) + + job_ids = registry.get_job_ids() + if status != RQJobStatus.DEFERRED: + jobs = get_jobs(queue, job_ids, registry) + else: + # Deferred jobs require special handling + for job_id in job_ids: + try: + jobs.append(RQ_Job.fetch(job_id, connection=queue.connection, serializer=queue.serializer)) + except NoSuchJobError: + pass + + if jobs and status == RQJobStatus.SCHEDULED: + for job in jobs: + job.scheduled_at = registry.get_scheduled_time(job) + + return jobs + + +def delete_rq_job(job_id): + """ + Delete the specified RQ job. + """ + config = QUEUES_LIST[0] + 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)) + + queue_index = QUEUES_MAP[job.origin] + queue = get_queue_by_index(queue_index) + + # Remove job id from queue and delete the actual job + queue.connection.lrem(queue.key, 0, job.id) + job.delete() + + +def requeue_rq_job(job_id): + """ + Requeue the specified RQ job. + """ + config = QUEUES_LIST[0] + try: + job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) + except NoSuchJobError: + 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) + + +def enqueue_rq_job(job_id): + """ + Enqueue the specified RQ job. + """ + config = QUEUES_LIST[0] + try: + job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) + except NoSuchJobError: + raise Http404(_("Job {id} not found.").format(id=job_id)) + + queue_index = QUEUES_MAP[job.origin] + queue = get_queue_by_index(queue_index) + + try: + # _enqueue_job is new in RQ 1.14, this is used to enqueue + # job regardless of its dependencies + queue._enqueue_job(job) + except AttributeError: + queue.enqueue_job(job) + + # Remove job from correct registry if needed + if job.get_status() == RQJobStatus.DEFERRED: + registry = DeferredJobRegistry(queue.name, queue.connection) + registry.remove(job) + elif job.get_status() == RQJobStatus.FINISHED: + registry = FinishedJobRegistry(queue.name, queue.connection) + registry.remove(job) + elif job.get_status() == RQJobStatus.SCHEDULED: + registry = ScheduledJobRegistry(queue.name, queue.connection) + registry.remove(job) + + +def stop_rq_job(job_id): + """ + Stop the specified RQ job. + """ + config = QUEUES_LIST[0] + 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)) + + queue_index = QUEUES_MAP[job.origin] + queue = get_queue_by_index(queue_index) + + return stop_jobs(queue, job_id)[0] diff --git a/netbox/core/views.py b/netbox/core/views.py index a9ec5d70a..713807a82 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -14,16 +14,13 @@ from django.utils.translation import gettext_lazy as _ from django.views.generic import View from django_rq.queues import get_connection, get_queue_by_index, get_redis_connection from django_rq.settings import QUEUES_MAP, QUEUES_LIST -from django_rq.utils import get_jobs, get_statistics, stop_jobs -from rq import requeue_job +from django_rq.utils import get_statistics from rq.exceptions import NoSuchJobError from rq.job import Job as RQ_Job, JobStatus as RQJobStatus -from rq.registry import ( - DeferredJobRegistry, FailedJobRegistry, FinishedJobRegistry, ScheduledJobRegistry, StartedJobRegistry, -) from rq.worker import Worker from rq.worker_registration import clean_worker_registry +from core.utils import delete_rq_job, enqueue_rq_job, get_rq_jobs_from_status, requeue_rq_job, stop_rq_job from netbox.config import get_config, PARAMS from netbox.views import generic from netbox.views.generic.base import BaseObjectView @@ -363,41 +360,12 @@ class BackgroundTaskListView(TableMixin, BaseRQView): table = tables.BackgroundTaskTable def get_table_data(self, request, queue, status): - jobs = [] # Call get_jobs() to returned queued tasks if status == RQJobStatus.QUEUED: return queue.get_jobs() - # For other statuses, determine the registry to list (or raise a 404 for invalid statuses) - try: - registry_cls = { - RQJobStatus.STARTED: StartedJobRegistry, - RQJobStatus.DEFERRED: DeferredJobRegistry, - RQJobStatus.FINISHED: FinishedJobRegistry, - RQJobStatus.FAILED: FailedJobRegistry, - RQJobStatus.SCHEDULED: ScheduledJobRegistry, - }[status] - except KeyError: - raise Http404 - registry = registry_cls(queue.name, queue.connection) - - job_ids = registry.get_job_ids() - if status != RQJobStatus.DEFERRED: - jobs = get_jobs(queue, job_ids, registry) - else: - # Deferred jobs require special handling - for job_id in job_ids: - try: - jobs.append(RQ_Job.fetch(job_id, connection=queue.connection, serializer=queue.serializer)) - except NoSuchJobError: - pass - - if jobs and status == RQJobStatus.SCHEDULED: - for job in jobs: - job.scheduled_at = registry.get_scheduled_time(job) - - return jobs + return get_rq_jobs_from_status(queue, status) def get(self, request, queue_index, status): queue = get_queue_by_index(queue_index) @@ -463,19 +431,7 @@ class BackgroundTaskDeleteView(BaseRQView): form = ConfirmationForm(request.POST) if form.is_valid(): - # all the RQ queues should use the same connection - config = QUEUES_LIST[0] - 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)) - - queue_index = QUEUES_MAP[job.origin] - queue = get_queue_by_index(queue_index) - - # Remove job id from queue and delete the actual job - queue.connection.lrem(queue.key, 0, job.id) - job.delete() + delete_rq_job(job_id) messages.success(request, _('Job {id} has been deleted.').format(id=job_id)) else: messages.error(request, _('Error deleting job {id}: {error}').format(id=job_id, error=form.errors[0])) @@ -486,17 +442,7 @@ class BackgroundTaskDeleteView(BaseRQView): class BackgroundTaskRequeueView(BaseRQView): def get(self, request, job_id): - # all the RQ queues should use the same connection - config = QUEUES_LIST[0] - try: - job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) - except NoSuchJobError: - 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) + requeue_rq_job(job_id) messages.success(request, _('Job {id} has been re-enqueued.').format(id=job_id)) return redirect(reverse('core:background_task', args=[job_id])) @@ -505,33 +451,7 @@ class BackgroundTaskEnqueueView(BaseRQView): def get(self, request, job_id): # all the RQ queues should use the same connection - config = QUEUES_LIST[0] - try: - job = RQ_Job.fetch(job_id, connection=get_redis_connection(config['connection_config']),) - except NoSuchJobError: - raise Http404(_("Job {id} not found.").format(id=job_id)) - - queue_index = QUEUES_MAP[job.origin] - queue = get_queue_by_index(queue_index) - - try: - # _enqueue_job is new in RQ 1.14, this is used to enqueue - # job regardless of its dependencies - queue._enqueue_job(job) - except AttributeError: - queue.enqueue_job(job) - - # Remove job from correct registry if needed - if job.get_status() == RQJobStatus.DEFERRED: - registry = DeferredJobRegistry(queue.name, queue.connection) - registry.remove(job) - elif job.get_status() == RQJobStatus.FINISHED: - registry = FinishedJobRegistry(queue.name, queue.connection) - registry.remove(job) - elif job.get_status() == RQJobStatus.SCHEDULED: - registry = ScheduledJobRegistry(queue.name, queue.connection) - registry.remove(job) - + enqueue_rq_job(job_id) messages.success(request, _('Job {id} has been enqueued.').format(id=job_id)) return redirect(reverse('core:background_task', args=[job_id])) @@ -539,17 +459,7 @@ class BackgroundTaskEnqueueView(BaseRQView): class BackgroundTaskStopView(BaseRQView): def get(self, request, job_id): - # all the RQ queues should use the same connection - config = QUEUES_LIST[0] - 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)) - - queue_index = QUEUES_MAP[job.origin] - queue = get_queue_by_index(queue_index) - - stopped_jobs = stop_jobs(queue, job_id)[0] + stopped_jobs = stop_rq_job(job_id) if len(stopped_jobs) == 1: messages.success(request, _('Job {id} has been stopped.').format(id=job_id)) else: diff --git a/netbox/netbox/api/pagination.py b/netbox/netbox/api/pagination.py index 5ecade264..f47434ebd 100644 --- a/netbox/netbox/api/pagination.py +++ b/netbox/netbox/api/pagination.py @@ -83,3 +83,28 @@ class StripCountAnnotationsPaginator(OptionalLimitOffsetPagination): cloned_queryset.query.annotations.clear() return cloned_queryset.count() + + +class LimitOffsetListPagination(LimitOffsetPagination): + """ + DRF LimitOffset Paginator but for list instead of queryset + """ + count = 0 + offset = 0 + + def paginate_list(self, data, request, view=None): + self.request = request + self.limit = self.get_limit(request) + self.count = len(data) + self.offset = self.get_offset(request) + + if self.limit is None: + self.limit = self.count + + if self.count == 0 or self.offset > self.count: + return [] + + if self.count > self.limit and self.template is not None: + self.display_page_controls = True + + return data[self.offset:self.offset + self.limit] From 64e56cd7c84b80fb78a293ba9cc6a5100c99b589 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Nov 2024 10:35:30 -0500 Subject: [PATCH 068/169] #16971: Improve example in documentation --- docs/plugins/development/background-jobs.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/docs/plugins/development/background-jobs.md b/docs/plugins/development/background-jobs.md index d51981b9e..3d789b6b9 100644 --- a/docs/plugins/development/background-jobs.md +++ b/docs/plugins/development/background-jobs.md @@ -87,14 +87,17 @@ class MyHousekeepingJob(JobRunner): def run(self, *args, **kwargs): MyModel.objects.filter(foo='bar').delete() - -system_jobs = ( - MyHousekeepingJob, -) ``` !!! note - Ensure that any system jobs are imported on initialization. Otherwise, they won't be registered. This can be achieved by extending the PluginConfig's `ready()` method. + Ensure that any system jobs are imported on initialization. Otherwise, they won't be registered. This can be achieved by extending the PluginConfig's `ready()` method. For example: + + ```python + def ready(self): + super().ready() + + from .jobs import MyHousekeepingJob + ``` ## Task queues From 3ee951b0d08cfa0fca34a0d0fea36a39180a951f Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Nov 2024 10:45:30 -0500 Subject: [PATCH 069/169] Fix missing/incorrect documentation links --- docs/models/virtualization/vminterface.md | 4 +- docs/plugins/development/index.md | 46 +++++++++++------------ mkdocs.yml | 4 ++ 3 files changed, 29 insertions(+), 25 deletions(-) diff --git a/docs/models/virtualization/vminterface.md b/docs/models/virtualization/vminterface.md index 6617b5e59..880cf927b 100644 --- a/docs/models/virtualization/vminterface.md +++ b/docs/models/virtualization/vminterface.md @@ -29,10 +29,10 @@ If not selected, this interface will be treated as disabled/inoperative. ### Primary MAC Address -The [MAC address](./macaddress.md) assigned to this interface which is designated as its primary. +The [MAC address](../dcim/macaddress.md) assigned to this interface which is designated as its primary. !!! note "Changed in NetBox v4.2" - The MAC address of an interface (formerly a concrete database field) is available as a property, `mac_address`, which reflects the value of the primary linked [MAC address](./macaddress.md) object. + The MAC address of an interface (formerly a concrete database field) is available as a property, `mac_address`, which reflects the value of the primary linked [MAC address](../dcim/macaddress.md) object. ### MTU diff --git a/docs/plugins/development/index.md b/docs/plugins/development/index.md index 8a83ab71b..246816349 100644 --- a/docs/plugins/development/index.md +++ b/docs/plugins/development/index.md @@ -98,29 +98,29 @@ NetBox looks for the `config` variable within a plugin's `__init__.py` to load i ### PluginConfig Attributes -| Name | Description | -|-----------------------|--------------------------------------------------------------------------------------------------------------------------| -| `name` | Raw plugin name; same as the plugin's source directory | -| `verbose_name` | Human-friendly name for the plugin | -| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | -| `description` | Brief description of the plugin's purpose | -| `author` | Name of plugin's author | -| `author_email` | Author's public email address | -| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | -| `required_settings` | A list of any configuration parameters that **must** be defined by the user | -| `default_settings` | A dictionary of configuration parameters and their default values | -| `django_apps` | A list of additional Django apps to load alongside the plugin | -| `min_version` | Minimum version of NetBox with which the plugin is compatible | -| `max_version` | Maximum version of NetBox with which the plugin is compatible | -| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | -| `queues` | A list of custom background task queues to create | -| `events_pipeline` | A list of handlers to add to [`EVENTS_PIPELINE`](./miscellaneous.md#events_pipeline), identified by dotted paths | -| `search_extensions` | The dotted path to the list of search index classes (default: `search.indexes`) | -| `data_backends` | The dotted path to the list of data source backend classes (default: `data_backends.backends`) | -| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | -| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | -| `graphql_schema` | The dotted path to the plugin's GraphQL schema class, if any (default: `graphql.schema`) | -| `user_preferences` | The dotted path to the dictionary mapping of user preferences defined by the plugin (default: `preferences.preferences`) | +| Name | Description | +|-----------------------|------------------------------------------------------------------------------------------------------------------------------------| +| `name` | Raw plugin name; same as the plugin's source directory | +| `verbose_name` | Human-friendly name for the plugin | +| `version` | Current release ([semantic versioning](https://semver.org/) is encouraged) | +| `description` | Brief description of the plugin's purpose | +| `author` | Name of plugin's author | +| `author_email` | Author's public email address | +| `base_url` | Base path to use for plugin URLs (optional). If not specified, the project's `name` will be used. | +| `required_settings` | A list of any configuration parameters that **must** be defined by the user | +| `default_settings` | A dictionary of configuration parameters and their default values | +| `django_apps` | A list of additional Django apps to load alongside the plugin | +| `min_version` | Minimum version of NetBox with which the plugin is compatible | +| `max_version` | Maximum version of NetBox with which the plugin is compatible | +| `middleware` | A list of middleware classes to append after NetBox's build-in middleware | +| `queues` | A list of custom background task queues to create | +| `events_pipeline` | A list of handlers to add to [`EVENTS_PIPELINE`](../../configuration/miscellaneous.md#events_pipeline), identified by dotted paths | +| `search_extensions` | The dotted path to the list of search index classes (default: `search.indexes`) | +| `data_backends` | The dotted path to the list of data source backend classes (default: `data_backends.backends`) | +| `template_extensions` | The dotted path to the list of template extension classes (default: `template_content.template_extensions`) | +| `menu_items` | The dotted path to the list of menu items provided by the plugin (default: `navigation.menu_items`) | +| `graphql_schema` | The dotted path to the plugin's GraphQL schema class, if any (default: `graphql.schema`) | +| `user_preferences` | The dotted path to the dictionary mapping of user preferences defined by the plugin (default: `preferences.preferences`) | All required settings must be configured by the user. If a configuration parameter is listed in both `required_settings` and `default_settings`, the default setting will be ignored. diff --git a/mkdocs.yml b/mkdocs.yml index a66baa286..f870b69d6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -199,6 +199,7 @@ nav: - InventoryItemRole: 'models/dcim/inventoryitemrole.md' - InventoryItemTemplate: 'models/dcim/inventoryitemtemplate.md' - Location: 'models/dcim/location.md' + - MACAddress: 'models/dcim/macaddress.md' - Manufacturer: 'models/dcim/manufacturer.md' - Module: 'models/dcim/module.md' - ModuleBay: 'models/dcim/modulebay.md' @@ -257,6 +258,8 @@ nav: - ServiceTemplate: 'models/ipam/servicetemplate.md' - VLAN: 'models/ipam/vlan.md' - VLANGroup: 'models/ipam/vlangroup.md' + - VLANTranslationPolicy: 'models/ipam/vlantranslationpolicy.md' + - VLANTranslationRule: 'models/ipam/vlantranslationrule.md' - VRF: 'models/ipam/vrf.md' - Tenancy: - Contact: 'models/tenancy/contact.md' @@ -308,6 +311,7 @@ nav: - git Cheat Sheet: 'development/git-cheat-sheet.md' - Release Notes: - Summary: 'release-notes/index.md' + - Version 4.2: 'release-notes/version-4.2.md' - Version 4.1: 'release-notes/version-4.1.md' - Version 4.0: 'release-notes/version-4.0.md' - Version 3.7: 'release-notes/version-3.7.md' From d511ba487db89bf0a96bf0ab61cc43ad7298eaca Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Nov 2024 12:20:59 -0500 Subject: [PATCH 070/169] #13086: Add virtual circuit to InterfaceTable --- netbox/dcim/tables/devices.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 59d0845d5..963150a7a 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -647,6 +647,10 @@ class InterfaceTable(BaseInterfaceTable, ModularDeviceComponentTable, PathEndpoi verbose_name=_('VRF'), linkify=True ) + virtual_circuit_termination = tables.Column( + verbose_name=_('Virtual Circuit'), + linkify=True + ) tags = columns.TagColumn( url_name='dcim:interface_list' ) From 678d89d406d1cc21af4dc70bc8c861f397b7f385 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 26 Nov 2024 12:38:29 -0500 Subject: [PATCH 071/169] Update documentation for v4.2 --- docs/configuration/miscellaneous.md | 1 + docs/configuration/system.md | 2 -- docs/features/notifications.md | 2 -- docs/models/circuits/circuitgroup.md | 2 -- docs/models/circuits/circuittermination.md | 2 ++ docs/models/circuits/virtualcircuit.md | 2 ++ docs/models/circuits/virtualcircuittermination.md | 2 ++ docs/models/dcim/interface.md | 5 +++++ docs/models/dcim/inventoryitem.md | 10 ++++++---- docs/models/dcim/macaddress.md | 2 ++ docs/models/dcim/modulebay.md | 2 -- docs/models/dcim/moduletype.md | 2 -- docs/models/dcim/poweroutlet.md | 2 ++ docs/models/dcim/racktype.md | 2 -- docs/models/extras/customfield.md | 2 -- docs/models/ipam/prefix.md | 6 ++++-- docs/models/ipam/vlan.md | 4 ++++ docs/models/ipam/vlangroup.md | 2 -- docs/models/ipam/vlantranslationpolicy.md | 2 ++ docs/models/ipam/vlantranslationrule.md | 2 ++ docs/models/virtualization/cluster.md | 2 ++ docs/models/virtualization/virtualmachine.md | 2 -- docs/models/virtualization/vminterface.md | 5 +++++ docs/models/wireless/wirelesslan.md | 2 ++ docs/models/wireless/wirelesslink.md | 2 -- docs/plugins/development/background-jobs.md | 4 ++-- docs/plugins/development/event-types.md | 2 -- docs/plugins/development/views.md | 2 -- docs/release-notes/index.md | 8 ++++++++ 29 files changed, 53 insertions(+), 32 deletions(-) diff --git a/docs/configuration/miscellaneous.md b/docs/configuration/miscellaneous.md index b983acd80..c14c0ac77 100644 --- a/docs/configuration/miscellaneous.md +++ b/docs/configuration/miscellaneous.md @@ -108,6 +108,7 @@ By default, NetBox will prevent the creation of duplicate prefixes and IP addres ## EVENTS_PIPELINE +!!! info "This parameter was introduced in NetBox v4.2." Default: `['extras.events.process_event_queue',]` diff --git a/docs/configuration/system.md b/docs/configuration/system.md index 25c724bc9..af3a6f5e6 100644 --- a/docs/configuration/system.md +++ b/docs/configuration/system.md @@ -89,8 +89,6 @@ addresses (and [`DEBUG`](./development.md#debug) is true). ## ISOLATED_DEPLOYMENT -!!! info "This feature was introduced in NetBox v4.1." - Default: False Set this configuration parameter to True for NetBox deployments which do not have Internet access. This will disable miscellaneous functionality which depends on access to the Internet. diff --git a/docs/features/notifications.md b/docs/features/notifications.md index a28a17947..0567a6db6 100644 --- a/docs/features/notifications.md +++ b/docs/features/notifications.md @@ -1,7 +1,5 @@ # Notifications -!!! info "This feature was introduced in NetBox v4.1." - NetBox includes a system for generating user notifications, which can be marked as read or deleted by individual users. There are two built-in mechanisms for generating a notification: * A user can subscribe to an object. When that object is modified, a notification is created to inform the user of the change. diff --git a/docs/models/circuits/circuitgroup.md b/docs/models/circuits/circuitgroup.md index faa9dbc14..6d1503509 100644 --- a/docs/models/circuits/circuitgroup.md +++ b/docs/models/circuits/circuitgroup.md @@ -1,7 +1,5 @@ # Circuit Groups -!!! info "This feature was introduced in NetBox v4.1." - [Circuits](./circuit.md) can be arranged into administrative groups for organization. The assignment of a circuit to a group is optional. ## Fields diff --git a/docs/models/circuits/circuittermination.md b/docs/models/circuits/circuittermination.md index 791863483..4b1a16ded 100644 --- a/docs/models/circuits/circuittermination.md +++ b/docs/models/circuits/circuittermination.md @@ -23,6 +23,8 @@ If selected, the circuit termination will be considered "connected" even if no c ### Termination +!!! info "This field replaced the `site` and `provider_network` fields in NetBox v4.2." + The [region](../dcim/region.md), [site group](../dcim/sitegroup.md), [site](../dcim/site.md), [location](../dcim/location.md) or [provider network](./providernetwork.md) with which this circuit termination is associated. Once created, a cable can be connected between the circuit termination and a device interface (or similar component). ### Port Speed diff --git a/docs/models/circuits/virtualcircuit.md b/docs/models/circuits/virtualcircuit.md index a379b6330..c81c654c8 100644 --- a/docs/models/circuits/virtualcircuit.md +++ b/docs/models/circuits/virtualcircuit.md @@ -1,5 +1,7 @@ # Virtual Circuits +!!! info "This feature was introduced in NetBox v4.2." + A virtual circuit can connect two or more interfaces atop a set of decoupled physical connections. For example, it's very common to form a virtual connection between two virtual interfaces, each of which is bound to a physical interface on its respective device and physically connected to a [provider network](./providernetwork.md) via an independent [physical circuit](./circuit.md). ## Fields diff --git a/docs/models/circuits/virtualcircuittermination.md b/docs/models/circuits/virtualcircuittermination.md index 82ea43eef..a7833e13c 100644 --- a/docs/models/circuits/virtualcircuittermination.md +++ b/docs/models/circuits/virtualcircuittermination.md @@ -1,5 +1,7 @@ # Virtual Circuit Terminations +!!! info "This feature was introduced in NetBox v4.2." + This model represents the connection of a virtual [interface](../dcim/interface.md) to a [virtual circuit](./virtualcircuit.md). ## Fields diff --git a/docs/models/dcim/interface.md b/docs/models/dcim/interface.md index f2af1a2ad..b7115050f 100644 --- a/docs/models/dcim/interface.md +++ b/docs/models/dcim/interface.md @@ -112,6 +112,7 @@ For switched Ethernet interfaces, this identifies the 802.1Q encapsulation strat * **Access:** All traffic is assigned to a single VLAN, with no tagging. * **Tagged:** One untagged "native" VLAN is allowed, as well as any number of tagged VLANs. * **Tagged (all):** Implies that all VLANs are carried by the interface. One untagged VLAN may be designated. +* **Q-in-Q:** Q-in-Q (IEEE 802.1ad) encapsulation is performed using the assigned SVLAN. This field must be left blank for routed interfaces which do employ 802.1Q encapsulation. @@ -125,6 +126,8 @@ The tagged VLANs which are configured to be carried by this interface. Valid onl ### Q-in-Q SVLAN +!!! info "This field was introduced in NetBox v4.2." + The assigned service VLAN (for Q-in-Q/802.1ad interfaces). ### Wireless Role @@ -152,4 +155,6 @@ The [wireless LANs](../wireless/wirelesslan.md) for which this interface carries ### VLAN Translation Policy +!!! info "This field was introduced in NetBox v4.2." + The [VLAN translation policy](../ipam/vlantranslationpolicy.md) that applies to this interface (optional). diff --git a/docs/models/dcim/inventoryitem.md b/docs/models/dcim/inventoryitem.md index a6dfa32db..2d648341b 100644 --- a/docs/models/dcim/inventoryitem.md +++ b/docs/models/dcim/inventoryitem.md @@ -25,6 +25,12 @@ The inventory item's name. If the inventory item is assigned to a parent item, i An alternative physical label identifying the inventory item. +### Status + +!!! info "This field was introduced in NetBox v4.2." + +The inventory item's operational status. + ### Role The functional [role](./inventoryitemrole.md) assigned to this inventory item. @@ -44,7 +50,3 @@ The serial number assigned by the manufacturer. ### Asset Tag A unique, locally-administered label used to identify hardware resources. - -### Status - -The inventory item's operational status. diff --git a/docs/models/dcim/macaddress.md b/docs/models/dcim/macaddress.md index fe3d1f0e3..5b1dd93be 100644 --- a/docs/models/dcim/macaddress.md +++ b/docs/models/dcim/macaddress.md @@ -1,5 +1,7 @@ # MAC Addresses +!!! info "This feature was introduced in NetBox v4.2." + A MAC address object in NetBox comprises a single Ethernet link layer address, and represents a MAC address as reported by or assigned to a network interface. MAC addresses can be assigned to [device](../dcim/device.md) and [virtual machine](../virtualization/virtualmachine.md) interfaces. A MAC address can be specified as the primary MAC address for a given device or VM interface. Most interfaces have only a single MAC address, hard-coded at the factory. However, on some devices (particularly virtual interfaces) it is possible to assign additional MAC addresses or change existing ones. For this reason NetBox allows multiple MACAddress objects to be assigned to a single interface. diff --git a/docs/models/dcim/modulebay.md b/docs/models/dcim/modulebay.md index 1bff799c2..494012a7b 100644 --- a/docs/models/dcim/modulebay.md +++ b/docs/models/dcim/modulebay.md @@ -16,8 +16,6 @@ The device to which this module bay belongs. ### Module -!!! info "This feature was introduced in NetBox v4.1." - The module to which this bay belongs (optional). ### Name diff --git a/docs/models/dcim/moduletype.md b/docs/models/dcim/moduletype.md index 225873d61..7077e16c2 100644 --- a/docs/models/dcim/moduletype.md +++ b/docs/models/dcim/moduletype.md @@ -42,6 +42,4 @@ The numeric weight of the module, including a unit designation (e.g. 3 kilograms ### Airflow -!!! info "The `airflow` field was introduced in NetBox v4.1." - The direction in which air circulates through the device chassis for cooling. diff --git a/docs/models/dcim/poweroutlet.md b/docs/models/dcim/poweroutlet.md index fe9390056..a99f60b23 100644 --- a/docs/models/dcim/poweroutlet.md +++ b/docs/models/dcim/poweroutlet.md @@ -31,6 +31,8 @@ The type of power outlet. ### Color +!!! info "This field was introduced in NetBox v4.2." + The power outlet's color (optional). ### Power Port diff --git a/docs/models/dcim/racktype.md b/docs/models/dcim/racktype.md index eeb90bd29..b5f2d99e7 100644 --- a/docs/models/dcim/racktype.md +++ b/docs/models/dcim/racktype.md @@ -1,7 +1,5 @@ # Rack Types -!!! info "This feature was introduced in NetBox v4.1." - A rack type defines the physical characteristics of a particular model of [rack](./rack.md). ## Fields diff --git a/docs/models/extras/customfield.md b/docs/models/extras/customfield.md index 9aab66a36..a5d083492 100644 --- a/docs/models/extras/customfield.md +++ b/docs/models/extras/customfield.md @@ -44,8 +44,6 @@ For object and multiple-object fields only. Designates the type of NetBox object ### Related Object Filter -!!! info "This field was introduced in NetBox v4.1." - For object and multi-object custom fields, a filter may be defined to limit the available objects when populating a field value. This filter maps object attributes to values. For example, `{"status": "active"}` will include only objects with a status of "active." !!! warning diff --git a/docs/models/ipam/prefix.md b/docs/models/ipam/prefix.md index 2fb01daf0..939ca3ea5 100644 --- a/docs/models/ipam/prefix.md +++ b/docs/models/ipam/prefix.md @@ -34,9 +34,11 @@ Designates whether the prefix should be treated as a pool. If selected, the firs If selected, this prefix will report 100% utilization regardless of how many child objects have been defined within it. -### Site +### Scope -The [site](../dcim/site.md) to which this prefix is assigned (optional). +!!! info "This field replaced the `site` field in NetBox v4.2." + +The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) to which the prefix is assigned (optional). ### VLAN diff --git a/docs/models/ipam/vlan.md b/docs/models/ipam/vlan.md index dc547ddbc..3c90d8cc9 100644 --- a/docs/models/ipam/vlan.md +++ b/docs/models/ipam/vlan.md @@ -29,8 +29,12 @@ The [VLAN group](./vlangroup.md) or [site](../dcim/site.md) to which the VLAN is ### Q-in-Q Role +!!! info "This field was introduced in NetBox v4.2." + For VLANs which comprise a Q-in-Q/IEEE 802.1ad topology, this field indicates whether the VLAN is treated as a service or customer VLAN. ### Q-in-Q Service VLAN +!!! info "This field was introduced in NetBox v4.2." + The designated parent service VLAN for a Q-in-Q customer VLAN. This may be set only for Q-in-Q custom VLANs. diff --git a/docs/models/ipam/vlangroup.md b/docs/models/ipam/vlangroup.md index 20989452f..67050ab4c 100644 --- a/docs/models/ipam/vlangroup.md +++ b/docs/models/ipam/vlangroup.md @@ -16,8 +16,6 @@ A unique URL-friendly identifier. (This value can be used for filtering.) ### VLAN ID Ranges -!!! info "This field replaced the legacy `min_vid` and `max_vid` fields in NetBox v4.1." - The set of VLAN IDs which are encompassed by the group. By default, this will be the entire range of valid IEEE 802.1Q VLAN IDs (1 to 4094, inclusive). VLANs created within a group must have a VID that falls within one of these ranges. Ranges may not overlap. ### Scope diff --git a/docs/models/ipam/vlantranslationpolicy.md b/docs/models/ipam/vlantranslationpolicy.md index 59541931e..9e3e8de98 100644 --- a/docs/models/ipam/vlantranslationpolicy.md +++ b/docs/models/ipam/vlantranslationpolicy.md @@ -1,5 +1,7 @@ # VLAN Translation Policies +!!! info "This feature was introduced in NetBox v4.2." + VLAN translation is a feature that consists of VLAN translation policies and [VLAN translation rules](./vlantranslationrule.md). Many rules can belong to a policy, and each rule defines a mapping of a local to remote VLAN ID (VID). A policy can then be assigned to an [Interface](../dcim/interface.md) or [VMInterface](../virtualization/vminterface.md), and all VLAN translation rules associated with that policy will be visible in the interface details. There are uniqueness constraints on `(policy, local_vid)` and on `(policy, remote_vid)` in the `VLANTranslationRule` model. Thus, you cannot have multiple rules linked to the same policy that have the same local VID or the same remote VID. A set of policies and rules might look like this: diff --git a/docs/models/ipam/vlantranslationrule.md b/docs/models/ipam/vlantranslationrule.md index bffc030ed..eb356d0d0 100644 --- a/docs/models/ipam/vlantranslationrule.md +++ b/docs/models/ipam/vlantranslationrule.md @@ -1,5 +1,7 @@ # VLAN Translation Rules +!!! info "This feature was introduced in NetBox v4.2." + A VLAN translation rule represents a one-to-one mapping of a local VLAN ID (VID) to a remote VID. Many rules can belong to a single policy. See [VLAN translation policies](./vlantranslationpolicy.md) for an overview of the VLAN Translation feature. diff --git a/docs/models/virtualization/cluster.md b/docs/models/virtualization/cluster.md index 9acdb2bc4..b9e6b608f 100644 --- a/docs/models/virtualization/cluster.md +++ b/docs/models/virtualization/cluster.md @@ -25,4 +25,6 @@ The cluster's operational status. ### Scope +!!! info "This field replaced the `site` field in NetBox v4.2." + The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) with which this cluster is associated. diff --git a/docs/models/virtualization/virtualmachine.md b/docs/models/virtualization/virtualmachine.md index 7ea31111c..a90b2752d 100644 --- a/docs/models/virtualization/virtualmachine.md +++ b/docs/models/virtualization/virtualmachine.md @@ -57,6 +57,4 @@ The amount of disk storage provisioned, in megabytes. ### Serial Number -!!! info "This field was introduced in NetBox v4.1." - Optional serial number assigned to this virtual machine. Unlike devices, uniqueness is not enforced for virtual machine serial numbers. diff --git a/docs/models/virtualization/vminterface.md b/docs/models/virtualization/vminterface.md index 880cf927b..ba0c68b15 100644 --- a/docs/models/virtualization/vminterface.md +++ b/docs/models/virtualization/vminterface.md @@ -45,6 +45,7 @@ For switched Ethernet interfaces, this identifies the 802.1Q encapsulation strat * **Access:** All traffic is assigned to a single VLAN, with no tagging. * **Tagged:** One untagged "native" VLAN is allowed, as well as any number of tagged VLANs. * **Tagged (all):** Implies that all VLANs are carried by the interface. One untagged VLAN may be designated. +* **Q-in-Q:** Q-in-Q (IEEE 802.1ad) encapsulation is performed using the assigned SVLAN. This field must be left blank for routed interfaces which do employ 802.1Q encapsulation. @@ -58,6 +59,8 @@ The tagged VLANs which are configured to be carried by this interface. Valid onl ### Q-in-Q SVLAN +!!! info "This field was introduced in NetBox v4.2." + The assigned service VLAN (for Q-in-Q/802.1ad interfaces). ### VRF @@ -66,4 +69,6 @@ The [virtual routing and forwarding](../ipam/vrf.md) instance to which this inte ### VLAN Translation Policy +!!! info "This field was introduced in NetBox v4.2." + The [VLAN translation policy](../ipam/vlantranslationpolicy.md) that applies to this interface (optional). diff --git a/docs/models/wireless/wirelesslan.md b/docs/models/wireless/wirelesslan.md index a448c42a2..2ce673086 100644 --- a/docs/models/wireless/wirelesslan.md +++ b/docs/models/wireless/wirelesslan.md @@ -46,4 +46,6 @@ The security key configured on each client to grant access to the secured wirele ### Scope +!!! info "This field was introduced in NetBox v4.2." + The [region](../dcim/region.md), [site](../dcim/site.md), [site group](../dcim/sitegroup.md) or [location](../dcim/location.md) with which this wireless LAN is associated. diff --git a/docs/models/wireless/wirelesslink.md b/docs/models/wireless/wirelesslink.md index 7553902b0..a9fd6b4fc 100644 --- a/docs/models/wireless/wirelesslink.md +++ b/docs/models/wireless/wirelesslink.md @@ -22,8 +22,6 @@ The service set identifier (SSID) for the wireless link (optional). ### Distance -!!! info "This field was introduced in NetBox v4.1." - The distance between the link's two endpoints, including a unit designation (e.g. 100 meters or 25 feet). ### Authentication Type diff --git a/docs/plugins/development/background-jobs.md b/docs/plugins/development/background-jobs.md index 3d789b6b9..9be52c3ca 100644 --- a/docs/plugins/development/background-jobs.md +++ b/docs/plugins/development/background-jobs.md @@ -1,7 +1,5 @@ # Background Jobs -!!! info "This feature was introduced in NetBox v4.1." - NetBox plugins can defer certain operations by enqueuing [background jobs](../../features/background-jobs.md), which are executed asynchronously by background workers. This is helpful for decoupling long-running processes from the user-facing request-response cycle. For example, your plugin might need to fetch data from a remote system. Depending on the amount of data and the responsiveness of the remote server, this could take a few minutes. Deferring this task to a queued job ensures that it can be completed in the background, without interrupting the user. The data it fetches can be made available once the job has completed. @@ -69,6 +67,8 @@ class MyModel(NetBoxModel): ### System Jobs +!!! info "This feature was introduced in NetBox v4.2." + Some plugins may implement background jobs that are decoupled from the request/response cycle. Typical use cases would be housekeeping tasks or synchronization jobs. These can be registered as _system jobs_ using the `system_job()` decorator. The job interval must be passed as an integer (in minutes) when registering a system job. System jobs are scheduled automatically when the RQ worker (`manage.py rqworker`) is run. #### Example diff --git a/docs/plugins/development/event-types.md b/docs/plugins/development/event-types.md index 4bcdeea31..65e2bbc5c 100644 --- a/docs/plugins/development/event-types.md +++ b/docs/plugins/development/event-types.md @@ -1,7 +1,5 @@ # Event Types -!!! info "This feature was introduced in NetBox v4.1." - Plugins can register their own custom event types for use with NetBox [event rules](../../models/extras/eventrule.md). This is accomplished by calling the `register()` method on an instance of the `EventType` class. This can be done anywhere within the plugin. An example is provided below. ```python diff --git a/docs/plugins/development/views.md b/docs/plugins/development/views.md index 3b6213917..e3740de59 100644 --- a/docs/plugins/development/views.md +++ b/docs/plugins/development/views.md @@ -206,8 +206,6 @@ Plugins can inject custom content into certain areas of core NetBox views. This | `right_page()` | Object view | Inject content on the right side of the page | | `full_width_page()` | Object view | Inject content across the entire bottom of the page | -!!! info "The `navbar()` and `alerts()` methods were introduced in NetBox v4.1." - Additionally, a `render()` method is available for convenience. This method accepts the name of a template to render, and any additional context data you want to pass. Its use is optional, however. To control where the custom content is injected, plugin authors can specify an iterable of models by overriding the `models` attribute on the subclass. Extensions which do not specify a set of models will be invoked on every view, where supported. diff --git a/docs/release-notes/index.md b/docs/release-notes/index.md index 82da8cc4e..d996224c1 100644 --- a/docs/release-notes/index.md +++ b/docs/release-notes/index.md @@ -10,6 +10,14 @@ Minor releases are published in April, August, and December of each calendar yea This page contains a history of all major and minor releases since NetBox v2.0. For more detail on a specific patch release, please see the release notes page for that specific minor release. +#### [Version 4.2](./version-4.2.md) (January 2025) + +* Assign Multiple MAC Addresses per Interface ([#4867](https://github.com/netbox-community/netbox/issues/4867)) +* Quick Add UI Widget ([#5858](https://github.com/netbox-community/netbox/issues/5858)) +* VLAN Translation ([#7336](https://github.com/netbox-community/netbox/issues/7336)) +* Virtual Circuits ([#13086](https://github.com/netbox-community/netbox/issues/13086)) +* Q-in-Q Encapsulation ([#13428](https://github.com/netbox-community/netbox/issues/13428)) + #### [Version 4.1](./version-4.1.md) (September 2024) * Circuit Groups ([#7025](https://github.com/netbox-community/netbox/issues/7025)) From 27d970df418680f7fc3d0fcb2c6b2ba291db2757 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 2 Dec 2024 09:32:38 -0500 Subject: [PATCH 072/169] Update UI dependencies --- .../dist/graphiql/graphiql.min.js | 5568 +++++++---------- netbox/project-static/dist/netbox.js | Bin 390918 -> 390368 bytes netbox/project-static/dist/netbox.js.map | Bin 527957 -> 524890 bytes .../netbox-graphiql/package.json | 6 +- netbox/project-static/package.json | 6 +- .../src/select/classes/dynamicTomSelect.ts | 39 +- netbox/project-static/tsconfig.json | 4 +- netbox/project-static/yarn.lock | 82 +- 8 files changed, 2406 insertions(+), 3299 deletions(-) diff --git a/netbox/project-static/dist/graphiql/graphiql.min.js b/netbox/project-static/dist/graphiql/graphiql.min.js index 862ce3a80..03d4ac1e1 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.js +++ b/netbox/project-static/dist/graphiql/graphiql.min.js @@ -22986,17 +22986,79 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.GraphQLError = void 0; +exports.formatError = formatError; +exports.printError = printError; var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _location = __webpack_require__(/*! ../language/location.mjs */ "../../../node_modules/graphql/language/location.mjs"); var _printLocation = __webpack_require__(/*! ../language/printLocation.mjs */ "../../../node_modules/graphql/language/printLocation.mjs"); +function toNormalizedOptions(args) { + const firstArg = args[0]; + if (firstArg == null || 'kind' in firstArg || 'length' in firstArg) { + return { + nodes: firstArg, + source: args[1], + positions: args[2], + path: args[3], + originalError: args[4], + extensions: args[5] + }; + } + return firstArg; +} /** * A GraphQLError describes an Error found during the parse, validate, or * execute phases of performing a GraphQL operation. In addition to a message * and stack trace, it also includes information about the locations in a * GraphQL document and/or execution result that correspond to the Error. */ + class GraphQLError extends Error { - constructor(message, options = {}) { + /** + * An array of `{ line, column }` locations within the source GraphQL document + * which correspond to this error. + * + * Errors during validation often contain multiple locations, for example to + * point out two things with the same name. Errors during execution include a + * single location, the field which produced the error. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array describing the JSON-path into the execution response which + * corresponds to this error. Only included for errors during execution. + * + * Enumerable, and appears in the result of JSON.stringify(). + */ + + /** + * An array of GraphQL AST Nodes corresponding to this error. + */ + + /** + * The source GraphQL document for the first location of this error. + * + * Note that if this Error represents more than one node, the source may not + * represent nodes after the first node. + */ + + /** + * An array of character offsets within the source GraphQL document + * which correspond to this error. + */ + + /** + * The original error thrown from a field resolver during execution. + */ + + /** + * Extension fields to add to the formatted error. + */ + + /** + * @deprecated Please use the `GraphQLErrorOptions` constructor overload instead. + */ + constructor(message, ...rawArgs) { var _this$nodes, _nodeLocations$, _ref; const { nodes, @@ -23005,22 +23067,22 @@ class GraphQLError extends Error { path, originalError, extensions - } = options; + } = toNormalizedOptions(rawArgs); super(message); this.name = 'GraphQLError'; this.path = path !== null && path !== void 0 ? path : undefined; - this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; - // Compute list of blame nodes. + this.originalError = originalError !== null && originalError !== void 0 ? originalError : undefined; // Compute list of blame nodes. + this.nodes = undefinedIfEmpty(Array.isArray(nodes) ? nodes : nodes ? [nodes] : undefined); - const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); - // Compute locations in the source for the given nodes/positions. + const nodeLocations = undefinedIfEmpty((_this$nodes = this.nodes) === null || _this$nodes === void 0 ? void 0 : _this$nodes.map(node => node.loc).filter(loc => loc != null)); // Compute locations in the source for the given nodes/positions. + this.source = source !== null && source !== void 0 ? source : nodeLocations === null || nodeLocations === void 0 ? void 0 : (_nodeLocations$ = nodeLocations[0]) === null || _nodeLocations$ === void 0 ? void 0 : _nodeLocations$.source; this.positions = positions !== null && positions !== void 0 ? positions : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => loc.start); this.locations = positions && source ? positions.map(pos => (0, _location.getLocation)(source, pos)) : nodeLocations === null || nodeLocations === void 0 ? void 0 : nodeLocations.map(loc => (0, _location.getLocation)(loc.source, loc.start)); const originalExtensions = (0, _isObjectLike.isObjectLike)(originalError === null || originalError === void 0 ? void 0 : originalError.extensions) ? originalError === null || originalError === void 0 ? void 0 : originalError.extensions : undefined; - this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); - // Only properties prescribed by the spec should be enumerable. + this.extensions = (_ref = extensions !== null && extensions !== void 0 ? extensions : originalExtensions) !== null && _ref !== void 0 ? _ref : Object.create(null); // Only properties prescribed by the spec should be enumerable. // Keep the rest as non-enumerable. + Object.defineProperties(this, { message: { writable: true, @@ -23041,17 +23103,18 @@ class GraphQLError extends Error { originalError: { enumerable: false } - }); - // Include (non-enumerable) stack trace. + }); // Include (non-enumerable) stack trace. + /* c8 ignore start */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 - if ((originalError === null || originalError === void 0 ? void 0 : originalError.stack) != null) { + + if (originalError !== null && originalError !== void 0 && originalError.stack) { Object.defineProperty(this, 'stack', { value: originalError.stack, writable: true, configurable: true }); - } else if (Error.captureStackTrace != null) { + } else if (Error.captureStackTrace) { Error.captureStackTrace(this, GraphQLError); } else { Object.defineProperty(this, 'stack', { @@ -23100,6 +23163,29 @@ exports.GraphQLError = GraphQLError; function undefinedIfEmpty(array) { return array === undefined || array.length === 0 ? undefined : array; } +/** + * See: https://spec.graphql.org/draft/#sec-Errors + */ + +/** + * Prints a GraphQLError to a string, representing useful location information + * about the error's position in the source. + * + * @deprecated Please use `error.toString` instead. Will be removed in v17 + */ +function printError(error) { + return error.toString(); +} +/** + * Given a GraphQLError, format it according to the rules described by the + * Response Format, Errors section of the GraphQL Specification. + * + * @deprecated Please use `error.toJSON` instead. Will be removed in v17 + */ + +function formatError(error) { + return error.toJSON(); +} /***/ }), @@ -23120,12 +23206,24 @@ Object.defineProperty(exports, "GraphQLError", ({ return _GraphQLError.GraphQLError; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _GraphQLError.formatError; + } +})); Object.defineProperty(exports, "locatedError", ({ enumerable: true, get: function () { return _locatedError.locatedError; } })); +Object.defineProperty(exports, "printError", ({ + enumerable: true, + get: function () { + return _GraphQLError.printError; + } +})); Object.defineProperty(exports, "syntaxError", ({ enumerable: true, get: function () { @@ -23157,15 +23255,16 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * GraphQL operation, produce a new GraphQLError aware of the location in the * document responsible for the original Error. */ + function locatedError(rawOriginalError, nodes, path) { - var _originalError$nodes; - const originalError = (0, _toError.toError)(rawOriginalError); - // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + var _nodes; + const originalError = (0, _toError.toError)(rawOriginalError); // Note: this uses a brand-check to support GraphQL errors originating from other contexts. + if (isLocatedGraphQLError(originalError)) { return originalError; } return new _GraphQLError.GraphQLError(originalError.message, { - nodes: (_originalError$nodes = originalError.nodes) !== null && _originalError$nodes !== void 0 ? _originalError$nodes : nodes, + nodes: (_nodes = originalError.nodes) !== null && _nodes !== void 0 ? _nodes : nodes, source: originalError.source, positions: originalError.positions, path, @@ -23195,6 +23294,7 @@ var _GraphQLError = __webpack_require__(/*! ./GraphQLError.mjs */ "../../../node * Produces a GraphQLError representing a syntax error, containing useful * descriptive information about the syntax error's position in the source. */ + function syntaxError(source, position, description) { return new _GraphQLError.GraphQLError(`Syntax Error: ${description}`, { source, @@ -23204,613 +23304,6 @@ function syntaxError(source, position, description) { /***/ }), -/***/ "../../../node_modules/graphql/execution/IncrementalGraph.mjs": -/*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalGraph.mjs ***! - \********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.IncrementalGraph = void 0; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -var _promiseWithResolvers = __webpack_require__(/*! ../jsutils/promiseWithResolvers.mjs */ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -/** - * @internal - */ -class IncrementalGraph { - constructor() { - this._rootNodes = new Set(); - this._completedQueue = []; - this._nextQueue = []; - } - getNewRootNodes(incrementalDataRecords) { - const initialResultChildren = new Set(); - this._addIncrementalDataRecords(incrementalDataRecords, undefined, initialResultChildren); - return this._promoteNonEmptyToRoot(initialResultChildren); - } - addCompletedSuccessfulExecutionGroup(successfulExecutionGroup) { - for (const deferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - deferredFragmentRecord.pendingExecutionGroups.delete(successfulExecutionGroup.pendingExecutionGroup); - deferredFragmentRecord.successfulExecutionGroups.add(successfulExecutionGroup); - } - const incrementalDataRecords = successfulExecutionGroup.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - this._addIncrementalDataRecords(incrementalDataRecords, successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords); - } - } - *currentCompletedBatch() { - let completed; - while ((completed = this._completedQueue.shift()) !== undefined) { - yield completed; - } - if (this._rootNodes.size === 0) { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - } - nextCompletedBatch() { - const { - promise, - resolve - } = (0, _promiseWithResolvers.promiseWithResolvers)(); - this._nextQueue.push(resolve); - return promise; - } - abort() { - for (const resolve of this._nextQueue) { - resolve(undefined); - } - } - hasNext() { - return this._rootNodes.size > 0; - } - completeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord) || deferredFragmentRecord.pendingExecutionGroups.size > 0) { - return; - } - const successfulExecutionGroups = Array.from(deferredFragmentRecord.successfulExecutionGroups); - this._removeRootNode(deferredFragmentRecord); - for (const successfulExecutionGroup of successfulExecutionGroups) { - for (const otherDeferredFragmentRecord of successfulExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - otherDeferredFragmentRecord.successfulExecutionGroups.delete(successfulExecutionGroup); - } - } - const newRootNodes = this._promoteNonEmptyToRoot(deferredFragmentRecord.children); - return { - newRootNodes, - successfulExecutionGroups - }; - } - removeDeferredFragment(deferredFragmentRecord) { - if (!this._rootNodes.has(deferredFragmentRecord)) { - return false; - } - this._removeRootNode(deferredFragmentRecord); - return true; - } - removeStream(streamRecord) { - this._removeRootNode(streamRecord); - } - _removeRootNode(deliveryGroup) { - this._rootNodes.delete(deliveryGroup); - } - _addIncrementalDataRecords(incrementalDataRecords, parents, initialResultChildren) { - for (const incrementalDataRecord of incrementalDataRecords) { - if ((0, _types.isPendingExecutionGroup)(incrementalDataRecord)) { - for (const deferredFragmentRecord of incrementalDataRecord.deferredFragmentRecords) { - this._addDeferredFragment(deferredFragmentRecord, initialResultChildren); - deferredFragmentRecord.pendingExecutionGroups.add(incrementalDataRecord); - } - if (this._completesRootNode(incrementalDataRecord)) { - this._onExecutionGroup(incrementalDataRecord); - } - } else if (parents === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(incrementalDataRecord); - } else { - for (const parent of parents) { - this._addDeferredFragment(parent, initialResultChildren); - parent.children.add(incrementalDataRecord); - } - } - } - } - _promoteNonEmptyToRoot(maybeEmptyNewRootNodes) { - const newRootNodes = []; - for (const node of maybeEmptyNewRootNodes) { - if ((0, _types.isDeferredFragmentRecord)(node)) { - if (node.pendingExecutionGroups.size > 0) { - for (const pendingExecutionGroup of node.pendingExecutionGroups) { - if (!this._completesRootNode(pendingExecutionGroup)) { - this._onExecutionGroup(pendingExecutionGroup); - } - } - this._rootNodes.add(node); - newRootNodes.push(node); - continue; - } - for (const child of node.children) { - maybeEmptyNewRootNodes.add(child); - } - } else { - this._rootNodes.add(node); - newRootNodes.push(node); - // eslint-disable-next-line @typescript-eslint/no-floating-promises - this._onStreamItems(node); - } - } - return newRootNodes; - } - _completesRootNode(pendingExecutionGroup) { - return pendingExecutionGroup.deferredFragmentRecords.some(deferredFragmentRecord => this._rootNodes.has(deferredFragmentRecord)); - } - _addDeferredFragment(deferredFragmentRecord, initialResultChildren) { - if (this._rootNodes.has(deferredFragmentRecord)) { - return; - } - const parent = deferredFragmentRecord.parent; - if (parent === undefined) { - initialResultChildren !== undefined || (0, _invariant.invariant)(false); - initialResultChildren.add(deferredFragmentRecord); - return; - } - parent.children.add(deferredFragmentRecord); - this._addDeferredFragment(parent, initialResultChildren); - } - _onExecutionGroup(pendingExecutionGroup) { - let completedExecutionGroup = pendingExecutionGroup.result; - if (!(completedExecutionGroup instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue)) { - completedExecutionGroup = completedExecutionGroup(); - } - const value = completedExecutionGroup.value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => this._enqueue(resolved)); - } else { - this._enqueue(value); - } - } - async _onStreamItems(streamRecord) { - let items = []; - let errors = []; - let incrementalDataRecords = []; - const streamItemQueue = streamRecord.streamItemQueue; - let streamItemRecord; - while ((streamItemRecord = streamItemQueue.shift()) !== undefined) { - let result = streamItemRecord instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue ? streamItemRecord.value : streamItemRecord().value; - if ((0, _isPromise.isPromise)(result)) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: - // TODO add additional test case or rework for coverage - errors.length > 0 /* c8 ignore start */ ? { - items, - errors - } /* c8 ignore stop */ : { - items - }, - incrementalDataRecords - }); - items = []; - errors = []; - incrementalDataRecords = []; - } - // eslint-disable-next-line no-await-in-loop - result = await result; - // wait an additional tick to coalesce resolving additional promises - // within the queue - // eslint-disable-next-line no-await-in-loop - await Promise.resolve(); - } - if (result.item === undefined) { - if (items.length > 0) { - this._enqueue({ - streamRecord, - result: errors.length > 0 ? { - items, - errors - } : { - items - }, - incrementalDataRecords - }); - } - this._enqueue(result.errors === undefined ? { - streamRecord - } : { - streamRecord, - errors: result.errors - }); - return; - } - items.push(result.item); - if (result.errors !== undefined) { - errors.push(...result.errors); - } - if (result.incrementalDataRecords !== undefined) { - incrementalDataRecords.push(...result.incrementalDataRecords); - } - } - } - *_yieldCurrentCompletedIncrementalData(first) { - yield first; - yield* this.currentCompletedBatch(); - } - _enqueue(completed) { - const next = this._nextQueue.shift(); - if (next !== undefined) { - next(this._yieldCurrentCompletedIncrementalData(completed)); - return; - } - this._completedQueue.push(completed); - } -} -exports.IncrementalGraph = IncrementalGraph; - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs": -/*!************************************************************************!*\ - !*** ../../../node_modules/graphql/execution/IncrementalPublisher.mjs ***! - \************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildIncrementalResponse = buildIncrementalResponse; -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); -var _IncrementalGraph = __webpack_require__(/*! ./IncrementalGraph.mjs */ "../../../node_modules/graphql/execution/IncrementalGraph.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); -function buildIncrementalResponse(context, result, errors, incrementalDataRecords) { - const incrementalPublisher = new IncrementalPublisher(context); - return incrementalPublisher.buildResponse(result, errors, incrementalDataRecords); -} -/** - * This class is used to publish incremental results to the client, enabling semi-concurrent - * execution while preserving result order. - * - * @internal - */ -class IncrementalPublisher { - constructor(context) { - this._context = context; - this._nextId = 0; - this._incrementalGraph = new _IncrementalGraph.IncrementalGraph(); - } - buildResponse(data, errors, incrementalDataRecords) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - const pending = this._toPendingResults(newRootNodes); - const initialResult = errors === undefined ? { - data, - pending, - hasNext: true - } : { - errors, - data, - pending, - hasNext: true - }; - return { - initialResult, - subsequentResults: this._subscribe() - }; - } - _toPendingResults(newRootNodes) { - const pendingResults = []; - for (const node of newRootNodes) { - const id = String(this._getNextId()); - node.id = id; - const pendingResult = { - id, - path: (0, _Path.pathToArray)(node.path) - }; - if (node.label !== undefined) { - pendingResult.label = node.label; - } - pendingResults.push(pendingResult); - } - return pendingResults; - } - _getNextId() { - return String(this._nextId++); - } - _subscribe() { - let isDone = false; - const _next = async () => { - if (isDone) { - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - } - const context = { - pending: [], - incremental: [], - completed: [] - }; - let batch = this._incrementalGraph.currentCompletedBatch(); - do { - for (const completedResult of batch) { - this._handleCompletedIncrementalData(completedResult, context); - } - const { - incremental, - completed - } = context; - if (incremental.length > 0 || completed.length > 0) { - const hasNext = this._incrementalGraph.hasNext(); - if (!hasNext) { - isDone = true; - } - const subsequentIncrementalExecutionResult = { - hasNext - }; - const pending = context.pending; - if (pending.length > 0) { - subsequentIncrementalExecutionResult.pending = pending; - } - if (incremental.length > 0) { - subsequentIncrementalExecutionResult.incremental = incremental; - } - if (completed.length > 0) { - subsequentIncrementalExecutionResult.completed = completed; - } - return { - value: subsequentIncrementalExecutionResult, - done: false - }; - } - // eslint-disable-next-line no-await-in-loop - batch = await this._incrementalGraph.nextCompletedBatch(); - } while (batch !== undefined); - await this._returnAsyncIteratorsIgnoringErrors(); - return { - value: undefined, - done: true - }; - }; - const _return = async () => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return { - value: undefined, - done: true - }; - }; - const _throw = async error => { - isDone = true; - this._incrementalGraph.abort(); - await this._returnAsyncIterators(); - return Promise.reject(error); - }; - return { - [Symbol.asyncIterator]() { - return this; - }, - next: _next, - return: _return, - throw: _throw - }; - } - _handleCompletedIncrementalData(completedIncrementalData, context) { - if ((0, _types.isCompletedExecutionGroup)(completedIncrementalData)) { - this._handleCompletedExecutionGroup(completedIncrementalData, context); - } else { - this._handleCompletedStreamItems(completedIncrementalData, context); - } - } - _handleCompletedExecutionGroup(completedExecutionGroup, context) { - if ((0, _types.isFailedExecutionGroup)(completedExecutionGroup)) { - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const id = deferredFragmentRecord.id; - if (!this._incrementalGraph.removeDeferredFragment(deferredFragmentRecord)) { - // This can occur if multiple deferred grouped field sets error for a fragment. - continue; - } - id !== undefined || (0, _invariant.invariant)(false); - context.completed.push({ - id, - errors: completedExecutionGroup.errors - }); - } - return; - } - this._incrementalGraph.addCompletedSuccessfulExecutionGroup(completedExecutionGroup); - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - const completion = this._incrementalGraph.completeDeferredFragment(deferredFragmentRecord); - if (completion === undefined) { - continue; - } - const id = deferredFragmentRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - const incremental = context.incremental; - const { - newRootNodes, - successfulExecutionGroups - } = completion; - context.pending.push(...this._toPendingResults(newRootNodes)); - for (const successfulExecutionGroup of successfulExecutionGroups) { - const { - bestId, - subPath - } = this._getBestIdAndSubPath(id, deferredFragmentRecord, successfulExecutionGroup); - const incrementalEntry = { - ...successfulExecutionGroup.result, - id: bestId - }; - if (subPath !== undefined) { - incrementalEntry.subPath = subPath; - } - incremental.push(incrementalEntry); - } - context.completed.push({ - id - }); - } - } - _handleCompletedStreamItems(streamItemsResult, context) { - const streamRecord = streamItemsResult.streamRecord; - const id = streamRecord.id; - id !== undefined || (0, _invariant.invariant)(false); - if (streamItemsResult.errors !== undefined) { - context.completed.push({ - id, - errors: streamItemsResult.errors - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - streamRecord.earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - } else if (streamItemsResult.result === undefined) { - context.completed.push({ - id - }); - this._incrementalGraph.removeStream(streamRecord); - if ((0, _types.isCancellableStreamRecord)(streamRecord)) { - this._context.cancellableStreams !== undefined || (0, _invariant.invariant)(false); - this._context.cancellableStreams.delete(streamRecord); - } - } else { - const incrementalEntry = { - id, - ...streamItemsResult.result - }; - context.incremental.push(incrementalEntry); - const incrementalDataRecords = streamItemsResult.incrementalDataRecords; - if (incrementalDataRecords !== undefined) { - const newRootNodes = this._incrementalGraph.getNewRootNodes(incrementalDataRecords); - context.pending.push(...this._toPendingResults(newRootNodes)); - } - } - } - _getBestIdAndSubPath(initialId, initialDeferredFragmentRecord, completedExecutionGroup) { - let maxLength = (0, _Path.pathToArray)(initialDeferredFragmentRecord.path).length; - let bestId = initialId; - for (const deferredFragmentRecord of completedExecutionGroup.pendingExecutionGroup.deferredFragmentRecords) { - if (deferredFragmentRecord === initialDeferredFragmentRecord) { - continue; - } - const id = deferredFragmentRecord.id; - // TODO: add test case for when an fragment has not been released, but might be processed for the shortest path. - /* c8 ignore next 3 */ - if (id === undefined) { - continue; - } - const fragmentPath = (0, _Path.pathToArray)(deferredFragmentRecord.path); - const length = fragmentPath.length; - if (length > maxLength) { - maxLength = length; - bestId = id; - } - } - const subPath = completedExecutionGroup.path.slice(maxLength); - return { - bestId, - subPath: subPath.length > 0 ? subPath : undefined - }; - } - async _returnAsyncIterators() { - const cancellableStreams = this._context.cancellableStreams; - if (cancellableStreams === undefined) { - return; - } - const promises = []; - for (const streamRecord of cancellableStreams) { - if (streamRecord.earlyReturn !== undefined) { - promises.push(streamRecord.earlyReturn()); - } - } - await Promise.all(promises); - } - async _returnAsyncIteratorsIgnoringErrors() { - await this._returnAsyncIterators().catch(() => { - // Ignore errors - }); - } -} - -/***/ }), - -/***/ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/buildExecutionPlan.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.buildExecutionPlan = buildExecutionPlan; -var _getBySet = __webpack_require__(/*! ../jsutils/getBySet.mjs */ "../../../node_modules/graphql/jsutils/getBySet.mjs"); -var _isSameSet = __webpack_require__(/*! ../jsutils/isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function buildExecutionPlan(originalGroupedFieldSet, parentDeferUsages = new Set()) { - const groupedFieldSet = new Map(); - const newGroupedFieldSets = new Map(); - for (const [responseKey, fieldGroup] of originalGroupedFieldSet) { - const filteredDeferUsageSet = getFilteredDeferUsageSet(fieldGroup); - if ((0, _isSameSet.isSameSet)(filteredDeferUsageSet, parentDeferUsages)) { - groupedFieldSet.set(responseKey, fieldGroup); - continue; - } - let newGroupedFieldSet = (0, _getBySet.getBySet)(newGroupedFieldSets, filteredDeferUsageSet); - if (newGroupedFieldSet === undefined) { - newGroupedFieldSet = new Map(); - newGroupedFieldSets.set(filteredDeferUsageSet, newGroupedFieldSet); - } - newGroupedFieldSet.set(responseKey, fieldGroup); - } - return { - groupedFieldSet, - newGroupedFieldSets - }; -} -function getFilteredDeferUsageSet(fieldGroup) { - const filteredDeferUsageSet = new Set(); - for (const fieldDetails of fieldGroup) { - const deferUsage = fieldDetails.deferUsage; - if (deferUsage === undefined) { - filteredDeferUsageSet.clear(); - return filteredDeferUsageSet; - } - filteredDeferUsageSet.add(deferUsage); - } - for (const deferUsage of filteredDeferUsageSet) { - let parentDeferUsage = deferUsage.parentDeferUsage; - while (parentDeferUsage !== undefined) { - if (filteredDeferUsageSet.has(parentDeferUsage)) { - filteredDeferUsageSet.delete(deferUsage); - break; - } - parentDeferUsage = parentDeferUsage.parentDeferUsage; - } - } - return filteredDeferUsageSet; -} - -/***/ }), - /***/ "../../../node_modules/graphql/execution/collectFields.mjs": /*!*****************************************************************!*\ !*** ../../../node_modules/graphql/execution/collectFields.mjs ***! @@ -23824,9 +23317,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.collectFields = collectFields; exports.collectSubfields = collectSubfields; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -23841,22 +23331,11 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra * * @internal */ -function collectFields(schema, fragments, variableValues, runtimeType, operation) { - const groupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - const context = { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames: new Set() - }; - collectFieldsImpl(context, operation.selectionSet, groupedFieldSet, newDeferUsages); - return { - groupedFieldSet, - newDeferUsages - }; + +function collectFields(schema, fragments, variableValues, runtimeType, selectionSet) { + const fields = new Map(); + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, new Set()); + return fields; } /** * Given an array of field nodes, collects all of the subfields of the passed @@ -23868,38 +23347,18 @@ function collectFields(schema, fragments, variableValues, runtimeType, operation * * @internal */ -// eslint-disable-next-line max-params -function collectSubfields(schema, fragments, variableValues, operation, returnType, fieldGroup) { - const context = { - schema, - fragments, - variableValues, - runtimeType: returnType, - operation, - visitedFragmentNames: new Set() - }; - const subGroupedFieldSet = new _AccumulatorMap.AccumulatorMap(); - const newDeferUsages = []; - for (const fieldDetail of fieldGroup) { - const node = fieldDetail.node; + +function collectSubfields(schema, fragments, variableValues, returnType, fieldNodes) { + const subFieldNodes = new Map(); + const visitedFragmentNames = new Set(); + for (const node of fieldNodes) { if (node.selectionSet) { - collectFieldsImpl(context, node.selectionSet, subGroupedFieldSet, newDeferUsages, fieldDetail.deferUsage); + collectFieldsImpl(schema, fragments, variableValues, returnType, node.selectionSet, subFieldNodes, visitedFragmentNames); } } - return { - groupedFieldSet: subGroupedFieldSet, - newDeferUsages - }; + return subFieldNodes; } -function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsages, deferUsage) { - const { - schema, - fragments, - variableValues, - runtimeType, - operation, - visitedFragmentNames - } = context; +function collectFieldsImpl(schema, fragments, variableValues, runtimeType, selectionSet, fields, visitedFragmentNames) { for (const selection of selectionSet.selections) { switch (selection.kind) { case _kinds.Kind.FIELD: @@ -23907,10 +23366,13 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection)) { continue; } - groupedFieldSet.add(getFieldEntryKey(selection), { - node: selection, - deferUsage - }); + const name = getFieldEntryKey(selection); + const fieldList = fields.get(name); + if (fieldList !== undefined) { + fieldList.push(selection); + } else { + fields.set(name, [selection]); + } break; } case _kinds.Kind.INLINE_FRAGMENT: @@ -23918,61 +23380,31 @@ function collectFieldsImpl(context, selectionSet, groupedFieldSet, newDeferUsage if (!shouldIncludeNode(variableValues, selection) || !doesFragmentConditionMatch(schema, selection, runtimeType)) { continue; } - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage) { - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, selection.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, selection.selectionSet, fields, visitedFragmentNames); break; } case _kinds.Kind.FRAGMENT_SPREAD: { const fragName = selection.name.value; - const newDeferUsage = getDeferUsage(operation, variableValues, selection, deferUsage); - if (!newDeferUsage && (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection))) { + if (visitedFragmentNames.has(fragName) || !shouldIncludeNode(variableValues, selection)) { continue; } + visitedFragmentNames.add(fragName); const fragment = fragments[fragName]; - if (fragment == null || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { + if (!fragment || !doesFragmentConditionMatch(schema, fragment, runtimeType)) { continue; } - if (!newDeferUsage) { - visitedFragmentNames.add(fragName); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, deferUsage); - } else { - newDeferUsages.push(newDeferUsage); - collectFieldsImpl(context, fragment.selectionSet, groupedFieldSet, newDeferUsages, newDeferUsage); - } + collectFieldsImpl(schema, fragments, variableValues, runtimeType, fragment.selectionSet, fields, visitedFragmentNames); break; } } } } -/** - * Returns an object containing the `@defer` arguments if a field should be - * deferred based on the experimental flag, defer directive present and - * not disabled by the "if" argument. - */ -function getDeferUsage(operation, variableValues, node, parentDeferUsage) { - const defer = (0, _values.getDirectiveValues)(_directives.GraphQLDeferDirective, node, variableValues); - if (!defer) { - return; - } - if (defer.if === false) { - return; - } - operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@defer` directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.'); - return { - label: typeof defer.label === 'string' ? defer.label : undefined, - parentDeferUsage - }; -} /** * Determines if a field should be included based on the `@include` and `@skip` * directives, where `@skip` has higher precedence than `@include`. */ + function shouldIncludeNode(variableValues, node) { const skip = (0, _values.getDirectiveValues)(_directives.GraphQLSkipDirective, node, variableValues); if ((skip === null || skip === void 0 ? void 0 : skip.if) === true) { @@ -23987,6 +23419,7 @@ function shouldIncludeNode(variableValues, node) { /** * Determines if a fragment is applicable to the given type. */ + function doesFragmentConditionMatch(schema, fragment, type) { const typeConditionNode = fragment.typeCondition; if (!typeConditionNode) { @@ -24004,6 +23437,7 @@ function doesFragmentConditionMatch(schema, fragment, type) { /** * Implements the logic to compute the key of a given field's entry */ + function getFieldEntryKey(node) { return node.alias ? node.alias.value : node.name.value; } @@ -24021,18 +23455,16 @@ function getFieldEntryKey(node) { Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.assertValidExecutionArguments = assertValidExecutionArguments; exports.buildExecutionContext = buildExecutionContext; exports.buildResolveInfo = buildResolveInfo; -exports.createSourceEventStream = createSourceEventStream; exports.defaultTypeResolver = exports.defaultFieldResolver = void 0; exports.execute = execute; exports.executeSync = executeSync; -exports.experimentalExecuteIncrementally = experimentalExecuteIncrementally; -exports.subscribe = subscribe; -var _BoxedPromiseOrValue = __webpack_require__(/*! ../jsutils/BoxedPromiseOrValue.mjs */ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs"); +exports.getFieldDef = getFieldDef; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); var _isIterableObject = __webpack_require__(/*! ../jsutils/isIterableObject.mjs */ "../../../node_modules/graphql/jsutils/isIterableObject.mjs"); var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _isPromise = __webpack_require__(/*! ../jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); @@ -24045,25 +23477,44 @@ var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); -var _buildExecutionPlan = __webpack_require__(/*! ./buildExecutionPlan.mjs */ "../../../node_modules/graphql/execution/buildExecutionPlan.mjs"); var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -var _IncrementalPublisher = __webpack_require__(/*! ./IncrementalPublisher.mjs */ "../../../node_modules/graphql/execution/IncrementalPublisher.mjs"); -var _mapAsyncIterable = __webpack_require__(/*! ./mapAsyncIterable.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs"); -var _types = __webpack_require__(/*! ./types.mjs */ "../../../node_modules/graphql/execution/types.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. /** * A memoized collection of relevant subfields with regard to the return * type. Memoizing ensures the subfields are not repeatedly calculated, which * saves overhead when resolving lists of values. */ -const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldGroup) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, exeContext.operation, returnType, fieldGroup)); -const UNEXPECTED_EXPERIMENTAL_DIRECTIVES = 'The provided schema unexpectedly contains experimental directives (@defer or @stream). These directives may only be utilized if experimental execution features are explicitly enabled.'; -const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would unexpectedly produce multiple payloads (due to @defer or @stream directive)'; + +const collectSubfields = (0, _memoize.memoize3)((exeContext, returnType, fieldNodes) => (0, _collectFields.collectSubfields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, returnType, fieldNodes)); +/** + * Terminology + * + * "Definitions" are the generic name for top-level statements in the document. + * Examples of this include: + * 1) Operations (such as a query) + * 2) Fragments + * + * "Operations" are a generic name for requests in the document. + * Examples of this include: + * 1) query, + * 2) mutation + * + * "Selections" are the definitions that can appear legally and at + * single level of the query. These include: + * 1) field references e.g `a` + * 2) fragment "spreads" e.g. `...c` + * 3) inline fragment "spreads" e.g. `...on Type { a }` + */ + +/** + * Data that must be available at all points during query execution. + * + * Namely, schema of the type system that is currently executing, + * and the fragments defined in the query document + */ + /** * Implements the "Executing requests" section of the GraphQL specification. * @@ -24073,177 +23524,105 @@ const UNEXPECTED_MULTIPLE_PAYLOADS = 'Executing this GraphQL operation would une * * If the arguments to this function do not result in a legal execution context, * a GraphQLError will be thrown immediately explaining the invalid input. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, it will throw or return a rejected promise. - * Use `experimentalExecuteIncrementally` if you want to support incremental - * delivery. */ function execute(args) { - if (args.schema.getDirective('defer') || args.schema.getDirective('stream')) { - throw new Error(UNEXPECTED_EXPERIMENTAL_DIRECTIVES); - } - const result = experimentalExecuteIncrementally(args); - if (!(0, _isPromise.isPromise)(result)) { - if ('initialResult' in result) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return result; - } - return result.then(incrementalResult => { - if ('initialResult' in incrementalResult) { - // This can happen if the operation contains @defer or @stream directives - // and is not validated prior to execution - throw new Error(UNEXPECTED_MULTIPLE_PAYLOADS); - } - return incrementalResult; - }); -} -/** - * Implements the "Executing requests" section of the GraphQL specification, - * including `@defer` and `@stream` as proposed in - * https://github.com/graphql/graphql-spec/pull/742 - * - * This function returns a Promise of an ExperimentalIncrementalExecutionResults - * object. This object either consists of a single ExecutionResult, or an - * object containing an `initialResult` and a stream of `subsequentResults`. - * - * If the arguments to this function do not result in a legal execution context, - * a GraphQLError will be thrown immediately explaining the invalid input. - */ -function experimentalExecuteIncrementally(args) { - // If a valid execution context cannot be created due to incorrect arguments, + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const { + schema, + document, + variableValues, + rootValue + } = args; // If arguments are missing or incorrect, throw an error. + + assertValidExecutionArguments(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. + + const exeContext = buildExecutionContext(args); // Return early errors if execution context failed. + if (!('schema' in exeContext)) { return { errors: exeContext }; - } - return executeOperation(exeContext); -} -/** - * Implements the "Executing operations" section of the spec. - * - * Returns a Promise that will eventually resolve to the data described by - * The "Response" section of the GraphQL specification. - * - * If errors are encountered while executing a GraphQL field, only that - * field and its descendants will be omitted, and sibling fields will still - * be executed. An execution which encounters errors will still result in a - * resolved Promise. - * - * Errors from sub-fields of a NonNull type may propagate to the top level, - * at which point we still log the error and null the parent field, which - * in this case is the entire response. - */ -function executeOperation(exeContext) { + } // Return a Promise that will eventually resolve to the data described by + // The "Response" section of the GraphQL specification. + // + // If errors are encountered while executing a GraphQL field, only that + // field and its descendants will be omitted, and sibling fields will still + // be executed. An execution which encounters errors will still result in a + // resolved Promise. + // + // Errors from sub-fields of a NonNull type may propagate to the top level, + // at which point we still log the error and null the parent field, which + // in this case is the entire response. + try { const { - operation, - schema, - fragments, - variableValues, - rootValue + operation } = exeContext; - const rootType = schema.getRootType(operation.operation); - if (rootType == null) { - throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { - nodes: operation + const result = executeOperation(exeContext, operation, rootValue); + if ((0, _isPromise.isPromise)(result)) { + return result.then(data => buildResponse(data, exeContext.errors), error => { + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); }); } - const collectedFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - let groupedFieldSet = collectedFields.groupedFieldSet; - const newDeferUsages = collectedFields.newDeferUsages; - let graphqlWrappedResult; - if (newDeferUsages.length === 0) { - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, undefined); - } else { - const executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(groupedFieldSet); - groupedFieldSet = executionPlan.groupedFieldSet; - const newGroupedFieldSets = executionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map()); - graphqlWrappedResult = executeRootGroupedFieldSet(exeContext, operation.operation, rootType, rootValue, groupedFieldSet, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, rootType, rootValue, undefined, undefined, newGroupedFieldSets, newDeferMap); - graphqlWrappedResult = withNewExecutionGroups(graphqlWrappedResult, newPendingExecutionGroups); - } - } - if ((0, _isPromise.isPromise)(graphqlWrappedResult)) { - return graphqlWrappedResult.then(resolved => buildDataResponse(exeContext, resolved[0], resolved[1]), error => ({ - data: null, - errors: withError(exeContext.errors, error) - })); - } - return buildDataResponse(exeContext, graphqlWrappedResult[0], graphqlWrappedResult[1]); + return buildResponse(result, exeContext.errors); } catch (error) { - return { - data: null, - errors: withError(exeContext.errors, error) - }; + exeContext.errors.push(error); + return buildResponse(null, exeContext.errors); } } -function withNewExecutionGroups(result, newPendingExecutionGroups) { - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - addIncrementalDataRecords(resolved, newPendingExecutionGroups); - return resolved; - }); - } - addIncrementalDataRecords(result, newPendingExecutionGroups); - return result; -} -function addIncrementalDataRecords(graphqlWrappedResult, incrementalDataRecords) { - if (incrementalDataRecords === undefined) { - return; - } - if (graphqlWrappedResult[1] === undefined) { - graphqlWrappedResult[1] = [...incrementalDataRecords]; - } else { - graphqlWrappedResult[1].push(...incrementalDataRecords); - } -} -function withError(errors, error) { - return errors === undefined ? [error] : [...errors, error]; -} -function buildDataResponse(exeContext, data, incrementalDataRecords) { - const errors = exeContext.errors; - if (incrementalDataRecords === undefined) { - return errors !== undefined ? { - errors, - data - } : { - data - }; - } - return (0, _IncrementalPublisher.buildIncrementalResponse)(exeContext, data, errors, incrementalDataRecords); -} /** * Also implements the "Executing requests" section of the GraphQL specification. * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function executeSync(args) { - const result = experimentalExecuteIncrementally(args); - // Assert that the execution was synchronous. - if ((0, _isPromise.isPromise)(result) || 'initialResult' in result) { + const result = execute(args); // Assert that the execution was synchronous. + + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } +/** + * Given a completed execution context and data, build the `{ errors, data }` + * response defined by the "Response" section of the GraphQL specification. + */ + +function buildResponse(data, errors) { + return errors.length === 0 ? { + data + } : { + errors, + data + }; +} +/** + * Essential assertions before executing to provide developer feedback for + * improper use of the GraphQL library. + * + * @internal + */ + +function assertValidExecutionArguments(schema, document, rawVariableValues) { + document || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for execution is invalid, throw an error. + + (0, _validate.assertValidSchema)(schema); // Variables, if provided, must be an object. + + rawVariableValues == null || (0, _isObjectLike.isObjectLike)(rawVariableValues) || (0, _devAssert.devAssert)(false, 'Variables must be provided as an Object where each property is a variable value. Perhaps look to see if an unparsed JSON string was provided.'); +} /** * Constructs a ExecutionContext object from the arguments passed to * execute, which we will pass throughout the other execution methods. * * Throws a GraphQLError if a valid execution context cannot be created. * - * TODO: consider no longer exporting this function * @internal */ + function buildExecutionContext(args) { var _definition$name, _operation$variableDe; const { @@ -24255,11 +23634,8 @@ function buildExecutionContext(args) { operationName, fieldResolver, typeResolver, - subscribeFieldResolver, - enableEarlyExecution + subscribeFieldResolver } = args; - // If the schema used for execution is invalid, throw an error. - (0, _validate.assertValidSchema)(schema); let operation; const fragments = Object.create(null); for (const definition of document.definitions) { @@ -24277,8 +23653,7 @@ function buildExecutionContext(args) { case _kinds.Kind.FRAGMENT_DEFINITION: fragments[definition.name.value] = definition; break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } } if (!operation) { @@ -24286,9 +23661,10 @@ function buildExecutionContext(args) { return [new _GraphQLError.GraphQLError(`Unknown operation named "${operationName}".`)]; } return [new _GraphQLError.GraphQLError('Must provide an operation.')]; - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; const coercedVariableValues = (0, _values.getVariableValues)(schema, variableDefinitions, rawVariableValues !== null && rawVariableValues !== void 0 ? rawVariableValues : {}, { maxErrors: 50 @@ -24306,100 +23682,91 @@ function buildExecutionContext(args) { fieldResolver: fieldResolver !== null && fieldResolver !== void 0 ? fieldResolver : defaultFieldResolver, typeResolver: typeResolver !== null && typeResolver !== void 0 ? typeResolver : defaultTypeResolver, subscribeFieldResolver: subscribeFieldResolver !== null && subscribeFieldResolver !== void 0 ? subscribeFieldResolver : defaultFieldResolver, - enableEarlyExecution: enableEarlyExecution === true, - errors: undefined, - cancellableStreams: undefined + errors: [] }; } -function buildPerEventExecutionContext(exeContext, payload) { - return { - ...exeContext, - rootValue: payload, - errors: undefined - }; -} -function executeRootGroupedFieldSet(exeContext, operation, rootType, rootValue, groupedFieldSet, deferMap) { - switch (operation) { +/** + * Implements the "Executing operations" section of the spec. + */ + +function executeOperation(exeContext, operation, rootValue) { + const rootType = exeContext.schema.getRootType(operation.operation); + if (rootType == null) { + throw new _GraphQLError.GraphQLError(`Schema is not configured to execute ${operation.operation} operation.`, { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(exeContext.schema, exeContext.fragments, exeContext.variableValues, rootType, operation.selectionSet); + const path = undefined; + switch (operation.operation) { case _ast.OperationTypeNode.QUERY: - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.MUTATION: - return executeFieldsSerially(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFieldsSerially(exeContext, rootType, rootValue, path, rootFields); case _ast.OperationTypeNode.SUBSCRIPTION: // TODO: deprecate `subscribe` and move all logic here // Temporary solution until we finish merging execute and subscribe together - return executeFields(exeContext, rootType, rootValue, undefined, groupedFieldSet, undefined, deferMap); + return executeFields(exeContext, rootType, rootValue, path, rootFields); } } /** * Implements the "Executing selection sets" section of the spec * for fields that must be executed serially. */ -function executeFieldsSerially(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - return (0, _promiseReduce.promiseReduce)(groupedFieldSet, (graphqlWrappedResult, [responseName, fieldGroup]) => { + +function executeFieldsSerially(exeContext, parentType, sourceValue, path, fields) { + return (0, _promiseReduce.promiseReduce)(fields.entries(), (results, [responseName, fieldNodes]) => { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result === undefined) { - return graphqlWrappedResult; + return results; } if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => { - graphqlWrappedResult[0][responseName] = resolved[0]; - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return graphqlWrappedResult; + return result.then(resolvedResult => { + results[responseName] = resolvedResult; + return results; }); } - graphqlWrappedResult[0][responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); - return graphqlWrappedResult; - }, [Object.create(null), undefined]); + results[responseName] = result; + return results; + }, Object.create(null)); } /** * Implements the "Executing selection sets" section of the spec * for fields that may be executed in parallel. */ -function executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { + +function executeFields(exeContext, parentType, sourceValue, path, fields) { const results = Object.create(null); - const graphqlWrappedResult = [results, undefined]; let containsPromise = false; try { - for (const [responseName, fieldGroup] of groupedFieldSet) { + for (const [responseName, fieldNodes] of fields.entries()) { const fieldPath = (0, _Path.addPath)(path, responseName, parentType.name); - const result = executeField(exeContext, parentType, sourceValue, fieldGroup, fieldPath, incrementalContext, deferMap); + const result = executeField(exeContext, parentType, sourceValue, fieldNodes, fieldPath); if (result !== undefined) { + results[responseName] = result; if ((0, _isPromise.isPromise)(result)) { - results[responseName] = result.then(resolved => { - addIncrementalDataRecords(graphqlWrappedResult, resolved[1]); - return resolved[0]; - }); containsPromise = true; - } else { - results[responseName] = result[0]; - addIncrementalDataRecords(graphqlWrappedResult, result[1]); } } } } catch (error) { if (containsPromise) { // Ensure that any promises returned by other fields are handled, as they may also reject. - return (0, _promiseForObject.promiseForObject)(results, () => { - /* noop */ - }).finally(() => { + return (0, _promiseForObject.promiseForObject)(results).finally(() => { throw error; }); } throw error; - } - // If there are no promises, we can just return the object and any incrementalDataRecords + } // If there are no promises, we can just return the object + if (!containsPromise) { - return graphqlWrappedResult; - } - // Otherwise, results is a map from field name to the result of resolving that + return results; + } // Otherwise, results is a map from field name to the result of resolving that // field, which is possibly a promise. Return a promise that will return this // same map, but with any promises replaced with the values they resolved to. - return (0, _promiseForObject.promiseForObject)(results, resolved => [resolved, graphqlWrappedResult[1]]); -} -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); + + return (0, _promiseForObject.promiseForObject)(results); } /** * Implements the "Executing fields" section of the spec @@ -24407,49 +23774,51 @@ function toNodes(fieldGroup) { * calling its resolve function, then calls completeValue to complete promises, * serialize scalars, or execute the sub-selection-set for objects. */ -function executeField(exeContext, parentType, source, fieldGroup, path, incrementalContext, deferMap) { + +function executeField(exeContext, parentType, source, fieldNodes, path) { var _fieldDef$resolve; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = exeContext.schema.getField(parentType, fieldName); + const fieldDef = getFieldDef(exeContext.schema, parentType, fieldNodes[0]); if (!fieldDef) { return; } const returnType = fieldDef.type; const resolveFn = (_fieldDef$resolve = fieldDef.resolve) !== null && _fieldDef$resolve !== void 0 ? _fieldDef$resolve : exeContext.fieldResolver; - const info = buildResolveInfo(exeContext, fieldDef, toNodes(fieldGroup), parentType, path); - // Get the resolve function, regardless of if its result is normal or abrupt (error). + const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path); // Get the resolve function, regardless of if its result is normal or abrupt (error). + try { // Build a JS object of arguments from the field.arguments AST, using the // variables scope to fulfill any variable references. // TODO: find a way to memoize, in case this field is within a List type. - const args = (0, _values.getArgumentValues)(fieldDef, fieldGroup[0].node, exeContext.variableValues); - // The resolve function's optional third argument is a context value that + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], exeContext.variableValues); // The resolve function's optional third argument is a context value that // is provided to every resolve function within an execution. It is commonly // used to represent an authenticated user, or request-specific caches. + const contextValue = exeContext.contextValue; const result = resolveFn(source, args, contextValue, info); + let completed; if ((0, _isPromise.isPromise)(result)) { - return completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + completed = result.then(resolved => completeValue(exeContext, returnType, fieldNodes, info, path, resolved)); + } else { + completed = completeValue(exeContext, returnType, fieldNodes, info, path, result); } - const completed = completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); if ((0, _isPromise.isPromise)(completed)) { // Note: we don't rely on a `catch` method, but we do expect "thenable" // to take a second callback for the error case. return completed.then(undefined, rawError => { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); }); } return completed; } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(path)); + return handleFieldError(error, returnType, exeContext); } } /** - * TODO: consider no longer exporting this function * @internal */ + function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { // The resolve function's optional fourth argument is a collection of // information about the current execution state. @@ -24466,22 +23835,16 @@ function buildResolveInfo(exeContext, fieldDef, fieldNodes, parentType, path) { variableValues: exeContext.variableValues }; } -function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext) { - const error = (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); +function handleFieldError(error, returnType, exeContext) { // If the field type is non-nullable, then it is resolved without any // protection from errors, however it still properly locates the error. if ((0, _definition.isNonNullType)(returnType)) { throw error; - } - // Otherwise, error protection is applied, logging the error and resolving + } // Otherwise, error protection is applied, logging the error and resolving // a null value for this field if one is encountered. - const context = incrementalContext !== null && incrementalContext !== void 0 ? incrementalContext : exeContext; - let errors = context.errors; - if (errors === undefined) { - errors = []; - context.errors = errors; - } - errors.push(error); + + exeContext.errors.push(error); + return null; } /** * Implements the instructions for completeValue as defined in the @@ -24504,271 +23867,94 @@ function handleFieldError(rawError, exeContext, returnType, fieldGroup, path, in * Otherwise, the field type expects a sub-selection set, and will complete the * value by executing all sub-selections. */ -function completeValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeValue(exeContext, returnType, fieldNodes, info, path, result) { // If result is an Error, throw a located error. if (result instanceof Error) { throw result; - } - // If field type is NonNull, complete for inner type, and throw field error + } // If field type is NonNull, complete for inner type, and throw field error // if result is null. + if ((0, _definition.isNonNullType)(returnType)) { - const completed = completeValue(exeContext, returnType.ofType, fieldGroup, info, path, result, incrementalContext, deferMap); - if (completed[0] === null) { + const completed = completeValue(exeContext, returnType.ofType, fieldNodes, info, path, result); + if (completed === null) { throw new Error(`Cannot return null for non-nullable field ${info.parentType.name}.${info.fieldName}.`); } return completed; - } - // If result value is null or undefined then return null. + } // If result value is null or undefined then return null. + if (result == null) { - return [null, undefined]; - } - // If field type is List, complete each item in the list with the inner type + return null; + } // If field type is List, complete each item in the list with the inner type + if ((0, _definition.isListType)(returnType)) { - return completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is a leaf type, Scalar or Enum, serialize to a valid value, + return completeListValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is a leaf type, Scalar or Enum, serialize to a valid value, // returning null if serialization is not possible. + if ((0, _definition.isLeafType)(returnType)) { - return [completeLeafValue(returnType, result), undefined]; - } - // If field type is an abstract type, Interface or Union, determine the + return completeLeafValue(returnType, result); + } // If field type is an abstract type, Interface or Union, determine the // runtime Object type and complete for that type. + if ((0, _definition.isAbstractType)(returnType)) { - return completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); - } - // If field type is Object, execute and complete all sub-selections. + return completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result); + } // If field type is Object, execute and complete all sub-selections. + if ((0, _definition.isObjectType)(returnType)) { - return completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, returnType, fieldNodes, info, path, result); } /* c8 ignore next 6 */ // Not reachable, all possible output types have been considered. + false || (0, _invariant.invariant)(false, 'Cannot complete value of unexpected output type: ' + (0, _inspect.inspect)(returnType)); } -async function completePromisedValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - try { - const resolved = await result; - let completed = completeValue(exeContext, returnType, fieldGroup, info, path, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - return completed; - } catch (rawError) { - handleFieldError(rawError, exeContext, returnType, fieldGroup, path, incrementalContext); - return [null, undefined]; - } -} -/** - * Returns an object containing info for streaming if a field should be - * streamed based on the experimental flag, stream directive present and - * not disabled by the "if" argument. - */ -function getStreamUsage(exeContext, fieldGroup, path) { - // do not stream inner lists of multi-dimensional lists - if (typeof path.key === 'number') { - return; - } - // TODO: add test for this case (a streamed list nested under a list). - /* c8 ignore next 7 */ - if (fieldGroup._streamUsage !== undefined) { - return fieldGroup._streamUsage; - } - // validation only allows equivalent streams on multiple fields, so it is - // safe to only check the first fieldNode for the stream directive - const stream = (0, _values.getDirectiveValues)(_directives.GraphQLStreamDirective, fieldGroup[0].node, exeContext.variableValues); - if (!stream) { - return; - } - if (stream.if === false) { - return; - } - typeof stream.initialCount === 'number' || (0, _invariant.invariant)(false, 'initialCount must be a number'); - stream.initialCount >= 0 || (0, _invariant.invariant)(false, 'initialCount must be a positive integer'); - exeContext.operation.operation !== _ast.OperationTypeNode.SUBSCRIPTION || (0, _invariant.invariant)(false, '`@stream` directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.'); - const streamedFieldGroup = fieldGroup.map(fieldDetails => ({ - node: fieldDetails.node, - deferUsage: undefined - })); - const streamUsage = { - initialCount: stream.initialCount, - label: typeof stream.label === 'string' ? stream.label : undefined, - fieldGroup: streamedFieldGroup - }; - fieldGroup._streamUsage = streamUsage; - return streamUsage; -} -/** - * Complete a async iterator value by completing the result and calling - * recursively until all the results are completed. - */ -async function completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap) { - let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const earlyReturn = asyncIterator.return === undefined ? undefined : asyncIterator.return.bind(asyncIterator); - try { - // eslint-disable-next-line no-constant-condition - while (true) { - if (streamUsage && index >= streamUsage.initialCount) { - const streamItemQueue = buildAsyncStreamItemQueue(index, path, asyncIterator, exeContext, streamUsage.fieldGroup, info, itemType); - let streamRecord; - if (earlyReturn === undefined) { - streamRecord = { - label: streamUsage.label, - path, - streamItemQueue - }; - } else { - streamRecord = { - label: streamUsage.label, - path, - earlyReturn, - streamItemQueue - }; - if (exeContext.cancellableStreams === undefined) { - exeContext.cancellableStreams = new Set(); - } - exeContext.cancellableStreams.add(streamRecord); - } - addIncrementalDataRecords(graphqlWrappedResult, [streamRecord]); - break; - } - const itemPath = (0, _Path.addPath)(path, index, undefined); - let iteration; - try { - // eslint-disable-next-line no-await-in-loop - iteration = await asyncIterator.next(); - } catch (rawError) { - throw (0, _locatedError.locatedError)(rawError, toNodes(fieldGroup), (0, _Path.pathToArray)(path)); - } - // TODO: add test case for stream returning done before initialCount - /* c8 ignore next 3 */ - if (iteration.done) { - break; - } - const item = iteration.value; - // TODO: add tests for stream backed by asyncIterator that returns a promise - /* c8 ignore start */ - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if ( /* c8 ignore stop */ - completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) - // TODO: add tests for stream backed by asyncIterator that completes to a promise - /* c8 ignore start */) { - containsPromise = true; - } - /* c8 ignore stop */ - index++; - } - } catch (error) { - if (earlyReturn !== undefined) { - earlyReturn().catch(() => { - /* c8 ignore next 1 */ - // ignore error - }); - } - throw error; - } - return containsPromise ? /* c8 ignore start */Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : /* c8 ignore stop */graphqlWrappedResult; -} /** * Complete a list value by completing each item in the list with the * inner type */ -function completeListValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - const itemType = returnType.ofType; - if ((0, _isAsyncIterable.isAsyncIterable)(result)) { - const asyncIterator = result[Symbol.asyncIterator](); - return completeAsyncIteratorValue(exeContext, itemType, fieldGroup, info, path, asyncIterator, incrementalContext, deferMap); - } + +function completeListValue(exeContext, returnType, fieldNodes, info, path, result) { if (!(0, _isIterableObject.isIterableObject)(result)) { throw new _GraphQLError.GraphQLError(`Expected Iterable, but did not find one for field "${info.parentType.name}.${info.fieldName}".`); - } - return completeIterableValue(exeContext, itemType, fieldGroup, info, path, result, incrementalContext, deferMap); -} -function completeIterableValue(exeContext, itemType, fieldGroup, info, path, items, incrementalContext, deferMap) { - // This is specified as a simple map, however we're optimizing the path + } // This is specified as a simple map, however we're optimizing the path // where the list contains no Promises by avoiding creating another Promise. + + const itemType = returnType.ofType; let containsPromise = false; - const completedResults = []; - const graphqlWrappedResult = [completedResults, undefined]; - let index = 0; - const streamUsage = getStreamUsage(exeContext, fieldGroup, path); - const iterator = items[Symbol.iterator](); - let iteration = iterator.next(); - while (!iteration.done) { - const item = iteration.value; - if (streamUsage && index >= streamUsage.initialCount) { - const syncStreamRecord = { - label: streamUsage.label, - path, - streamItemQueue: buildSyncStreamItemQueue(item, index, path, iterator, exeContext, streamUsage.fieldGroup, info, itemType) - }; - addIncrementalDataRecords(graphqlWrappedResult, [syncStreamRecord]); - break; - } + const completedResults = Array.from(result, (item, index) => { // No need to modify the info object containing the path, // since from here on it is not ever accessed by resolver functions. const itemPath = (0, _Path.addPath)(path, index, undefined); - if ((0, _isPromise.isPromise)(item)) { - completedResults.push(completePromisedListItemValue(item, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)); - containsPromise = true; - } else if (completeListItemValue(item, completedResults, graphqlWrappedResult, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap)) { - containsPromise = true; + try { + let completedItem; + if ((0, _isPromise.isPromise)(item)) { + completedItem = item.then(resolved => completeValue(exeContext, itemType, fieldNodes, info, itemPath, resolved)); + } else { + completedItem = completeValue(exeContext, itemType, fieldNodes, info, itemPath, item); + } + if ((0, _isPromise.isPromise)(completedItem)) { + containsPromise = true; // Note: we don't rely on a `catch` method, but we do expect "thenable" + // to take a second callback for the error case. + + return completedItem.then(undefined, rawError => { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); + }); + } + return completedItem; + } catch (rawError) { + const error = (0, _locatedError.locatedError)(rawError, fieldNodes, (0, _Path.pathToArray)(itemPath)); + return handleFieldError(error, itemType, exeContext); } - index++; - iteration = iterator.next(); - } - return containsPromise ? Promise.all(completedResults).then(resolved => [resolved, graphqlWrappedResult[1]]) : graphqlWrappedResult; -} -/** - * Complete a list item value by adding it to the completed results. - * - * Returns true if the value is a Promise. - */ -function completeListItemValue(item, completedResults, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const completedItem = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completedItem)) { - // Note: we don't rely on a `catch` method, but we do expect "thenable" - // to take a second callback for the error case. - completedResults.push(completedItem.then(resolved => { - addIncrementalDataRecords(parent, resolved[1]); - return resolved[0]; - }, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - })); - return true; - } - completedResults.push(completedItem[0]); - addIncrementalDataRecords(parent, completedItem[1]); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - completedResults.push(null); - } - return false; -} -async function completePromisedListItemValue(item, parent, exeContext, itemType, fieldGroup, info, itemPath, incrementalContext, deferMap) { - try { - const resolved = await item; - let completed = completeValue(exeContext, itemType, fieldGroup, info, itemPath, resolved, incrementalContext, deferMap); - if ((0, _isPromise.isPromise)(completed)) { - completed = await completed; - } - addIncrementalDataRecords(parent, completed[1]); - return completed[0]; - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return null; - } + }); + return containsPromise ? Promise.all(completedResults) : completedResults; } /** * Complete a Scalar or Enum by serializing to a valid value, returning * null if serialization is not possible. */ + function completeLeafValue(returnType, result) { const serializedResult = returnType.serialize(result); if (serializedResult == null) { @@ -24780,24 +23966,23 @@ function completeLeafValue(returnType, result) { * Complete a value of an abstract type by determining the runtime object type * of that value, then complete the value for that type. */ -function completeAbstractValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { + +function completeAbstractValue(exeContext, returnType, fieldNodes, info, path, result) { var _returnType$resolveTy; const resolveTypeFn = (_returnType$resolveTy = returnType.resolveType) !== null && _returnType$resolveTy !== void 0 ? _returnType$resolveTy : exeContext.typeResolver; const contextValue = exeContext.contextValue; const runtimeType = resolveTypeFn(result, contextValue, info, returnType); if ((0, _isPromise.isPromise)(runtimeType)) { - return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap)); + return runtimeType.then(resolvedRuntimeType => completeObjectValue(exeContext, ensureValidRuntimeType(resolvedRuntimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result)); } - return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldGroup, info, result), fieldGroup, info, path, result, incrementalContext, deferMap); + return completeObjectValue(exeContext, ensureValidRuntimeType(runtimeType, exeContext, returnType, fieldNodes, info, result), fieldNodes, info, path, result); } -function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGroup, info, result) { +function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldNodes, info, result) { if (runtimeTypeName == null) { - throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, { - nodes: toNodes(fieldGroup) - }); - } - // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` + throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" must resolve to an Object type at runtime for field "${info.parentType.name}.${info.fieldName}". Either the "${returnType.name}" type should provide a "resolveType" function or each possible type should provide an "isTypeOf" function.`, fieldNodes); + } // releases before 16.0.0 supported returning `GraphQLObjectType` from `resolveType` // TODO: remove in 17.0.0 release + if ((0, _definition.isObjectType)(runtimeTypeName)) { throw new _GraphQLError.GraphQLError('Support for returning GraphQLObjectType from resolveType was removed in graphql-js@16.0.0 please return type name instead.'); } @@ -24807,17 +23992,17 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr const runtimeType = exeContext.schema.getType(runtimeTypeName); if (runtimeType == null) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a type "${runtimeTypeName}" that does not exist inside the schema.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!(0, _definition.isObjectType)(runtimeType)) { throw new _GraphQLError.GraphQLError(`Abstract type "${returnType.name}" was resolved to a non-object type "${runtimeTypeName}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } if (!exeContext.schema.isSubType(returnType, runtimeType)) { throw new _GraphQLError.GraphQLError(`Runtime Object type "${runtimeType.name}" is not a possible type for "${returnType.name}".`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } return runtimeType; @@ -24825,92 +24010,34 @@ function ensureValidRuntimeType(runtimeTypeName, exeContext, returnType, fieldGr /** * Complete an Object value by executing all sub-selections. */ -function completeObjectValue(exeContext, returnType, fieldGroup, info, path, result, incrementalContext, deferMap) { - // If there is an isTypeOf predicate function, call it with the + +function completeObjectValue(exeContext, returnType, fieldNodes, info, path, result) { + // Collect sub-fields to execute to complete this value. + const subFieldNodes = collectSubfields(exeContext, returnType, fieldNodes); // If there is an isTypeOf predicate function, call it with the // current result. If isTypeOf returns false, then raise an error rather // than continuing execution. + if (returnType.isTypeOf) { const isTypeOf = returnType.isTypeOf(result, exeContext.contextValue, info); if ((0, _isPromise.isPromise)(isTypeOf)) { return isTypeOf.then(resolvedIsTypeOf => { if (!resolvedIsTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); }); } if (!isTypeOf) { - throw invalidReturnTypeError(returnType, result, fieldGroup); + throw invalidReturnTypeError(returnType, result, fieldNodes); } } - return collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap); + return executeFields(exeContext, returnType, result, path, subFieldNodes); } -function invalidReturnTypeError(returnType, result, fieldGroup) { +function invalidReturnTypeError(returnType, result, fieldNodes) { return new _GraphQLError.GraphQLError(`Expected value of type "${returnType.name}" but got: ${(0, _inspect.inspect)(result)}.`, { - nodes: toNodes(fieldGroup) + nodes: fieldNodes }); } -/** - * Instantiates new DeferredFragmentRecords for the given path within an - * incremental data record, returning an updated map of DeferUsage - * objects to DeferredFragmentRecords. - * - * Note: As defer directives may be used with operations returning lists, - * a DeferUsage object may correspond to many DeferredFragmentRecords. - * - * DeferredFragmentRecord creation includes the following steps: - * 1. The new DeferredFragmentRecord is instantiated at the given path. - * 2. The parent result record is calculated from the given incremental data - * record. - * 3. The IncrementalPublisher is notified that a new DeferredFragmentRecord - * with the calculated parent has been added; the record will be released only - * after the parent has completed. - * - */ -function addNewDeferredFragments(newDeferUsages, newDeferMap, path) { - // For each new deferUsage object: - for (const newDeferUsage of newDeferUsages) { - const parentDeferUsage = newDeferUsage.parentDeferUsage; - const parent = parentDeferUsage === undefined ? undefined : deferredFragmentRecordFromDeferUsage(parentDeferUsage, newDeferMap); - // Instantiate the new record. - const deferredFragmentRecord = new _types.DeferredFragmentRecord(path, newDeferUsage.label, parent); - // Update the map. - newDeferMap.set(newDeferUsage, deferredFragmentRecord); - } - return newDeferMap; -} -function deferredFragmentRecordFromDeferUsage(deferUsage, deferMap) { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return deferMap.get(deferUsage); -} -function collectAndExecuteSubfields(exeContext, returnType, fieldGroup, path, result, incrementalContext, deferMap) { - // Collect sub-fields to execute to complete this value. - const collectedSubfields = collectSubfields(exeContext, returnType, fieldGroup); - let groupedFieldSet = collectedSubfields.groupedFieldSet; - const newDeferUsages = collectedSubfields.newDeferUsages; - if (deferMap === undefined && newDeferUsages.length === 0) { - return executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, undefined); - } - const subExecutionPlan = buildSubExecutionPlan(groupedFieldSet, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet); - groupedFieldSet = subExecutionPlan.groupedFieldSet; - const newGroupedFieldSets = subExecutionPlan.newGroupedFieldSets; - const newDeferMap = addNewDeferredFragments(newDeferUsages, new Map(deferMap), path); - const subFields = executeFields(exeContext, returnType, result, path, groupedFieldSet, incrementalContext, newDeferMap); - if (newGroupedFieldSets.size > 0) { - const newPendingExecutionGroups = collectExecutionGroups(exeContext, returnType, result, path, incrementalContext === null || incrementalContext === void 0 ? void 0 : incrementalContext.deferUsageSet, newGroupedFieldSets, newDeferMap); - return withNewExecutionGroups(subFields, newPendingExecutionGroups); - } - return subFields; -} -function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { - let executionPlan = originalGroupedFieldSet._executionPlan; - if (executionPlan !== undefined) { - return executionPlan; - } - executionPlan = (0, _buildExecutionPlan.buildExecutionPlan)(originalGroupedFieldSet, deferUsageSet); - originalGroupedFieldSet._executionPlan = executionPlan; - return executionPlan; -} /** * If a resolveType function is not given, then a default resolve behavior is * used which attempts two strategies: @@ -24921,12 +24048,13 @@ function buildSubExecutionPlan(originalGroupedFieldSet, deferUsageSet) { * Otherwise, test each possible type for the abstract type by calling * isTypeOf for the object being coerced, returning the first type that matches. */ + const defaultTypeResolver = function (value, contextValue, info, abstractType) { // First, look for `__typename`. if ((0, _isObjectLike.isObjectLike)(value) && typeof value.__typename === 'string') { return value.__typename; - } - // Otherwise, test each possible type. + } // Otherwise, test each possible type. + const possibleTypes = info.schema.getPossibleTypes(abstractType); const promisedIsTypeOfResults = []; for (let i = 0; i < possibleTypes.length; i++) { @@ -24968,340 +24096,27 @@ const defaultFieldResolver = function (source, args, contextValue, info) { } }; /** - * Implements the "Subscribe" algorithm described in the GraphQL specification. + * This method looks up the field on the given type definition. + * It has special casing for the three introspection fields, + * __schema, __type and __typename. __typename is special because + * it can always be queried as a field, even in situations where no + * other fields are allowed, like on a Union. __schema and __type + * could get automatically added to the query type, but that would + * require mutating type definitions, which would cause issues. * - * Returns a Promise which resolves to either an AsyncIterator (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with descriptive - * errors and no data will be returned. - * - * If the source stream could not be created due to faulty subscription resolver - * logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to an AsyncIterator, which - * yields a stream of ExecutionResults representing the response stream. - * - * This function does not support incremental delivery (`@defer` and `@stream`). - * If an operation which would defer or stream data is executed with this - * function, a field error will be raised at the location of the `@defer` or - * `@stream` directive. - * - * Accepts an object with named arguments. + * @internal */ exports.defaultFieldResolver = defaultFieldResolver; -function subscribe(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; +function getFieldDef(schema, parentType, fieldNode) { + const fieldName = fieldNode.name.value; + if (fieldName === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } else if (fieldName === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } else if (fieldName === _introspection.TypeNameMetaFieldDef.name) { + return _introspection.TypeNameMetaFieldDef; } - const resultOrStream = createSourceEventStreamImpl(exeContext); - if ((0, _isPromise.isPromise)(resultOrStream)) { - return resultOrStream.then(resolvedResultOrStream => mapSourceToResponse(exeContext, resolvedResultOrStream)); - } - return mapSourceToResponse(exeContext, resultOrStream); -} -function mapSourceToResponse(exeContext, resultOrStream) { - if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { - return resultOrStream; - } - // For each payload yielded from a subscription, map it over the normal - // GraphQL `execute` function, with `payload` as the rootValue. - // This implements the "MapSourceToResponseEvent" algorithm described in - // the GraphQL specification. The `execute` function provides the - // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the - // "ExecuteQuery" algorithm, for which `execute` is also used. - return (0, _mapAsyncIterable.mapAsyncIterable)(resultOrStream, payload => executeOperation(buildPerEventExecutionContext(exeContext, payload))); -} -/** - * Implements the "CreateSourceEventStream" algorithm described in the - * GraphQL specification, resolving the subscription source event stream. - * - * Returns a Promise which resolves to either an AsyncIterable (if successful) - * or an ExecutionResult (error). The promise will be rejected if the schema or - * other arguments to this function are invalid, or if the resolved event stream - * is not an async iterable. - * - * If the client-provided arguments to this function do not result in a - * compliant subscription, a GraphQL Response (ExecutionResult) with - * descriptive errors and no data will be returned. - * - * If the the source stream could not be created due to faulty subscription - * resolver logic or underlying systems, the promise will resolve to a single - * ExecutionResult containing `errors` and no `data`. - * - * If the operation succeeded, the promise resolves to the AsyncIterable for the - * event stream returned by the resolver. - * - * A Source Event Stream represents a sequence of events, each of which triggers - * a GraphQL execution for that event. - * - * This may be useful when hosting the stateful subscription service in a - * different process or machine than the stateless GraphQL execution engine, - * or otherwise separating these two steps. For more on this, see the - * "Supporting Subscriptions at Scale" information in the GraphQL specification. - */ -function createSourceEventStream(args) { - // If a valid execution context cannot be created due to incorrect arguments, - // a "Response" with only errors is returned. - const exeContext = buildExecutionContext(args); - // Return early errors if execution context failed. - if (!('schema' in exeContext)) { - return { - errors: exeContext - }; - } - return createSourceEventStreamImpl(exeContext); -} -function createSourceEventStreamImpl(exeContext) { - try { - const eventStream = executeSubscription(exeContext); - if ((0, _isPromise.isPromise)(eventStream)) { - return eventStream.then(undefined, error => ({ - errors: [error] - })); - } - return eventStream; - } catch (error) { - return { - errors: [error] - }; - } -} -function executeSubscription(exeContext) { - const { - schema, - fragments, - operation, - variableValues, - rootValue - } = exeContext; - const rootType = schema.getSubscriptionType(); - if (rootType == null) { - throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { - nodes: operation - }); - } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation); - const firstRootField = groupedFieldSet.entries().next().value; - const [responseName, fieldGroup] = firstRootField; - const fieldName = fieldGroup[0].node.name.value; - const fieldDef = schema.getField(rootType, fieldName); - const fieldNodes = fieldGroup.map(fieldDetails => fieldDetails.node); - if (!fieldDef) { - throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { - nodes: fieldNodes - }); - } - const path = (0, _Path.addPath)(undefined, responseName, rootType.name); - const info = buildResolveInfo(exeContext, fieldDef, fieldNodes, rootType, path); - try { - var _fieldDef$subscribe; - // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. - // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. - // Build a JS object of arguments from the field.arguments AST, using the - // variables scope to fulfill any variable references. - const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); - // The resolve function's optional third argument is a context value that - // is provided to every resolve function within an execution. It is commonly - // used to represent an authenticated user, or request-specific caches. - const contextValue = exeContext.contextValue; - // Call the `subscribe()` resolver or the default resolver to produce an - // AsyncIterable yielding raw payloads. - const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; - const result = resolveFn(rootValue, args, contextValue, info); - if ((0, _isPromise.isPromise)(result)) { - return result.then(assertEventStream).then(undefined, error => { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - }); - } - return assertEventStream(result); - } catch (error) { - throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); - } -} -function assertEventStream(result) { - if (result instanceof Error) { - throw result; - } - // Assert field returned an event stream, otherwise yield an error. - if (!(0, _isAsyncIterable.isAsyncIterable)(result)) { - throw new _GraphQLError.GraphQLError('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(result)}.`); - } - return result; -} -function collectExecutionGroups(exeContext, parentType, sourceValue, path, parentDeferUsages, newGroupedFieldSets, deferMap) { - const newPendingExecutionGroups = []; - for (const [deferUsageSet, groupedFieldSet] of newGroupedFieldSets) { - const deferredFragmentRecords = getDeferredFragmentRecords(deferUsageSet, deferMap); - const pendingExecutionGroup = { - deferredFragmentRecords, - result: undefined - }; - const executor = () => executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, { - errors: undefined, - deferUsageSet - }, deferMap); - if (exeContext.enableEarlyExecution) { - pendingExecutionGroup.result = new _BoxedPromiseOrValue.BoxedPromiseOrValue(shouldDefer(parentDeferUsages, deferUsageSet) ? Promise.resolve().then(executor) : executor()); - } else { - pendingExecutionGroup.result = () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()); - } - newPendingExecutionGroups.push(pendingExecutionGroup); - } - return newPendingExecutionGroups; -} -function shouldDefer(parentDeferUsages, deferUsages) { - // If we have a new child defer usage, defer. - // Otherwise, this defer usage was already deferred when it was initially - // encountered, and is now in the midst of executing early, so the new - // deferred grouped fields set can be executed immediately. - return parentDeferUsages === undefined || !Array.from(deferUsages).every(deferUsage => parentDeferUsages.has(deferUsage)); -} -function executeExecutionGroup(pendingExecutionGroup, exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap) { - let result; - try { - result = executeFields(exeContext, parentType, sourceValue, path, groupedFieldSet, incrementalContext, deferMap); - } catch (error) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(resolved => buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, resolved), error => ({ - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - errors: withError(incrementalContext.errors, error) - })); - } - return buildCompletedExecutionGroup(incrementalContext.errors, pendingExecutionGroup, path, result); -} -function buildCompletedExecutionGroup(errors, pendingExecutionGroup, path, result) { - return { - pendingExecutionGroup, - path: (0, _Path.pathToArray)(path), - result: errors === undefined ? { - data: result[0] - } : { - data: result[0], - errors - }, - incrementalDataRecords: result[1] - }; -} -function getDeferredFragmentRecords(deferUsages, deferMap) { - return Array.from(deferUsages).map(deferUsage => deferredFragmentRecordFromDeferUsage(deferUsage, deferMap)); -} -function buildSyncStreamItemQueue(initialItem, initialIndex, streamPath, iterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const enableEarlyExecution = exeContext.enableEarlyExecution; - const firstExecutor = () => { - const initialPath = (0, _Path.addPath)(streamPath, initialIndex, undefined); - const firstStreamItem = new _BoxedPromiseOrValue.BoxedPromiseOrValue(completeStreamItem(initialPath, initialItem, exeContext, { - errors: undefined - }, fieldGroup, info, itemType)); - let iteration = iterator.next(); - let currentIndex = initialIndex + 1; - let currentStreamItem = firstStreamItem; - while (!iteration.done) { - // TODO: add test case for early sync termination - /* c8 ignore next 6 */ - if (currentStreamItem instanceof _BoxedPromiseOrValue.BoxedPromiseOrValue) { - const result = currentStreamItem.value; - if (!(0, _isPromise.isPromise)(result) && result.errors !== undefined) { - break; - } - } - const itemPath = (0, _Path.addPath)(streamPath, currentIndex, undefined); - const value = iteration.value; - const currentExecutor = () => completeStreamItem(itemPath, value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - currentStreamItem = enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(currentExecutor()); - streamItemQueue.push(currentStreamItem); - iteration = iterator.next(); - currentIndex = initialIndex + 1; - } - streamItemQueue.push(new _BoxedPromiseOrValue.BoxedPromiseOrValue({})); - return firstStreamItem.value; - }; - streamItemQueue.push(enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(Promise.resolve().then(firstExecutor)) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(firstExecutor())); - return streamItemQueue; -} -function buildAsyncStreamItemQueue(initialIndex, streamPath, asyncIterator, exeContext, fieldGroup, info, itemType) { - const streamItemQueue = []; - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, initialIndex, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return streamItemQueue; -} -async function getNextAsyncStreamItemResult(streamItemQueue, streamPath, index, asyncIterator, exeContext, fieldGroup, info, itemType) { - let iteration; - try { - iteration = await asyncIterator.next(); - } catch (error) { - return { - errors: [(0, _locatedError.locatedError)(error, toNodes(fieldGroup), (0, _Path.pathToArray)(streamPath))] - }; - } - if (iteration.done) { - return {}; - } - const itemPath = (0, _Path.addPath)(streamPath, index, undefined); - const result = completeStreamItem(itemPath, iteration.value, exeContext, { - errors: undefined - }, fieldGroup, info, itemType); - const executor = () => getNextAsyncStreamItemResult(streamItemQueue, streamPath, index + 1, asyncIterator, exeContext, fieldGroup, info, itemType); - streamItemQueue.push(exeContext.enableEarlyExecution ? new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor()) : () => new _BoxedPromiseOrValue.BoxedPromiseOrValue(executor())); - return result; -} -function completeStreamItem(itemPath, item, exeContext, incrementalContext, fieldGroup, info, itemType) { - if ((0, _isPromise.isPromise)(item)) { - return completePromisedValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - let result; - try { - try { - result = completeValue(exeContext, itemType, fieldGroup, info, itemPath, item, incrementalContext, new Map()); - } catch (rawError) { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - result = [null, undefined]; - } - } catch (error) { - return { - errors: withError(incrementalContext.errors, error) - }; - } - if ((0, _isPromise.isPromise)(result)) { - return result.then(undefined, rawError => { - handleFieldError(rawError, exeContext, itemType, fieldGroup, itemPath, incrementalContext); - return [null, undefined]; - }).then(resolvedItem => buildStreamItemResult(incrementalContext.errors, resolvedItem), error => ({ - errors: withError(incrementalContext.errors, error) - })); - } - return buildStreamItemResult(incrementalContext.errors, result); -} -function buildStreamItemResult(errors, result) { - return { - item: result[0], - errors, - incrementalDataRecords: result[1] - }; + return parentType.getFields()[fieldName]; } /***/ }), @@ -25320,7 +24135,7 @@ Object.defineProperty(exports, "__esModule", ({ Object.defineProperty(exports, "createSourceEventStream", ({ enumerable: true, get: function () { - return _execute.createSourceEventStream; + return _subscribe.createSourceEventStream; } })); Object.defineProperty(exports, "defaultFieldResolver", ({ @@ -25347,12 +24162,6 @@ Object.defineProperty(exports, "executeSync", ({ return _execute.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _execute.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -25380,18 +24189,19 @@ Object.defineProperty(exports, "responsePathAsArray", ({ Object.defineProperty(exports, "subscribe", ({ enumerable: true, get: function () { - return _execute.subscribe; + return _subscribe.subscribe; } })); var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _subscribe = __webpack_require__(/*! ./subscribe.mjs */ "../../../node_modules/graphql/execution/subscribe.mjs"); var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); /***/ }), -/***/ "../../../node_modules/graphql/execution/mapAsyncIterable.mjs": +/***/ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs": /*!********************************************************************!*\ - !*** ../../../node_modules/graphql/execution/mapAsyncIterable.mjs ***! + !*** ../../../node_modules/graphql/execution/mapAsyncIterator.mjs ***! \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { @@ -25400,12 +24210,12 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.mapAsyncIterable = mapAsyncIterable; +exports.mapAsyncIterator = mapAsyncIterator; /** * Given an AsyncIterable and a callback function, return an AsyncIterator * which produces values mapped via calling the callback function. */ -function mapAsyncIterable(iterable, callback) { +function mapAsyncIterator(iterable, callback) { const iterator = iterable[Symbol.asyncIterator](); async function mapResult(result) { if (result.done) { @@ -25455,49 +24265,201 @@ function mapAsyncIterable(iterable, callback) { /***/ }), -/***/ "../../../node_modules/graphql/execution/types.mjs": -/*!*********************************************************!*\ - !*** ../../../node_modules/graphql/execution/types.mjs ***! - \*********************************************************/ -/***/ (function(__unused_webpack_module, exports) { +/***/ "../../../node_modules/graphql/execution/subscribe.mjs": +/*!*************************************************************!*\ + !*** ../../../node_modules/graphql/execution/subscribe.mjs ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.DeferredFragmentRecord = void 0; -exports.isCancellableStreamRecord = isCancellableStreamRecord; -exports.isCompletedExecutionGroup = isCompletedExecutionGroup; -exports.isDeferredFragmentRecord = isDeferredFragmentRecord; -exports.isFailedExecutionGroup = isFailedExecutionGroup; -exports.isPendingExecutionGroup = isPendingExecutionGroup; -function isPendingExecutionGroup(incrementalDataRecord) { - return 'deferredFragmentRecords' in incrementalDataRecord; +exports.createSourceEventStream = createSourceEventStream; +exports.subscribe = subscribe; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _isAsyncIterable = __webpack_require__(/*! ../jsutils/isAsyncIterable.mjs */ "../../../node_modules/graphql/jsutils/isAsyncIterable.mjs"); +var _Path = __webpack_require__(/*! ../jsutils/Path.mjs */ "../../../node_modules/graphql/jsutils/Path.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _locatedError = __webpack_require__(/*! ../error/locatedError.mjs */ "../../../node_modules/graphql/error/locatedError.mjs"); +var _collectFields = __webpack_require__(/*! ./collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); +var _execute = __webpack_require__(/*! ./execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +var _mapAsyncIterator = __webpack_require__(/*! ./mapAsyncIterator.mjs */ "../../../node_modules/graphql/execution/mapAsyncIterator.mjs"); +var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/graphql/execution/values.mjs"); +/** + * Implements the "Subscribe" algorithm described in the GraphQL specification. + * + * Returns a Promise which resolves to either an AsyncIterator (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to an AsyncIterator, which + * yields a stream of ExecutionResults representing the response stream. + * + * Accepts either an object with named arguments, or individual arguments. + */ + +async function subscribe(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); + const resultOrStream = await createSourceEventStream(args); + if (!(0, _isAsyncIterable.isAsyncIterable)(resultOrStream)) { + return resultOrStream; + } // For each payload yielded from a subscription, map it over the normal + // GraphQL `execute` function, with `payload` as the rootValue. + // This implements the "MapSourceToResponseEvent" algorithm described in + // the GraphQL specification. The `execute` function provides the + // "ExecuteSubscriptionEvent" algorithm, as it is nearly identical to the + // "ExecuteQuery" algorithm, for which `execute` is also used. + + const mapSourceToResponse = payload => (0, _execute.execute)({ + ...args, + rootValue: payload + }); // Map every source value to a ExecutionResult value as described above. + + return (0, _mapAsyncIterator.mapAsyncIterator)(resultOrStream, mapSourceToResponse); } -function isCompletedExecutionGroup(subsequentResult) { - return 'pendingExecutionGroup' in subsequentResult; +function toNormalizedArgs(args) { + const firstArg = args[0]; + if (firstArg && 'document' in firstArg) { + return firstArg; + } + return { + schema: firstArg, + // FIXME: when underlying TS bug fixed, see https://github.com/microsoft/TypeScript/issues/31613 + document: args[1], + rootValue: args[2], + contextValue: args[3], + variableValues: args[4], + operationName: args[5], + subscribeFieldResolver: args[6] + }; } -function isFailedExecutionGroup(completedExecutionGroup) { - return completedExecutionGroup.errors !== undefined; -} -/** @internal */ -class DeferredFragmentRecord { - constructor(path, label, parent) { - this.path = path; - this.label = label; - this.parent = parent; - this.pendingExecutionGroups = new Set(); - this.successfulExecutionGroups = new Set(); - this.children = new Set(); +/** + * Implements the "CreateSourceEventStream" algorithm described in the + * GraphQL specification, resolving the subscription source event stream. + * + * Returns a Promise which resolves to either an AsyncIterable (if successful) + * or an ExecutionResult (error). The promise will be rejected if the schema or + * other arguments to this function are invalid, or if the resolved event stream + * is not an async iterable. + * + * If the client-provided arguments to this function do not result in a + * compliant subscription, a GraphQL Response (ExecutionResult) with + * descriptive errors and no data will be returned. + * + * If the the source stream could not be created due to faulty subscription + * resolver logic or underlying systems, the promise will resolve to a single + * ExecutionResult containing `errors` and no `data`. + * + * If the operation succeeded, the promise resolves to the AsyncIterable for the + * event stream returned by the resolver. + * + * A Source Event Stream represents a sequence of events, each of which triggers + * a GraphQL execution for that event. + * + * This may be useful when hosting the stateful subscription service in a + * different process or machine than the stateless GraphQL execution engine, + * or otherwise separating these two steps. For more on this, see the + * "Supporting Subscriptions at Scale" information in the GraphQL specification. + */ + +async function createSourceEventStream(...rawArgs) { + const args = toNormalizedArgs(rawArgs); + const { + schema, + document, + variableValues + } = args; // If arguments are missing or incorrectly typed, this is an internal + // developer mistake which should throw an early error. + + (0, _execute.assertValidExecutionArguments)(schema, document, variableValues); // If a valid execution context cannot be created due to incorrect arguments, + // a "Response" with only errors is returned. + + const exeContext = (0, _execute.buildExecutionContext)(args); // Return early errors if execution context failed. + + if (!('schema' in exeContext)) { + return { + errors: exeContext + }; + } + try { + const eventStream = await executeSubscription(exeContext); // Assert field returned an event stream, otherwise yield an error. + + if (!(0, _isAsyncIterable.isAsyncIterable)(eventStream)) { + throw new Error('Subscription field must return Async Iterable. ' + `Received: ${(0, _inspect.inspect)(eventStream)}.`); + } + return eventStream; + } catch (error) { + // If it GraphQLError, report it as an ExecutionResult, containing only errors and no data. + // Otherwise treat the error as a system-class error and re-throw it. + if (error instanceof _GraphQLError.GraphQLError) { + return { + errors: [error] + }; + } + throw error; } } -exports.DeferredFragmentRecord = DeferredFragmentRecord; -function isDeferredFragmentRecord(deliveryGroup) { - return deliveryGroup instanceof DeferredFragmentRecord; -} -function isCancellableStreamRecord(deliveryGroup) { - return 'earlyReturn' in deliveryGroup; +async function executeSubscription(exeContext) { + const { + schema, + fragments, + operation, + variableValues, + rootValue + } = exeContext; + const rootType = schema.getSubscriptionType(); + if (rootType == null) { + throw new _GraphQLError.GraphQLError('Schema is not configured to execute subscription operation.', { + nodes: operation + }); + } + const rootFields = (0, _collectFields.collectFields)(schema, fragments, variableValues, rootType, operation.selectionSet); + const [responseName, fieldNodes] = [...rootFields.entries()][0]; + const fieldDef = (0, _execute.getFieldDef)(schema, rootType, fieldNodes[0]); + if (!fieldDef) { + const fieldName = fieldNodes[0].name.value; + throw new _GraphQLError.GraphQLError(`The subscription field "${fieldName}" is not defined.`, { + nodes: fieldNodes + }); + } + const path = (0, _Path.addPath)(undefined, responseName, rootType.name); + const info = (0, _execute.buildResolveInfo)(exeContext, fieldDef, fieldNodes, rootType, path); + try { + var _fieldDef$subscribe; + + // Implements the "ResolveFieldEventStream" algorithm from GraphQL specification. + // It differs from "ResolveFieldValue" due to providing a different `resolveFn`. + // Build a JS object of arguments from the field.arguments AST, using the + // variables scope to fulfill any variable references. + const args = (0, _values.getArgumentValues)(fieldDef, fieldNodes[0], variableValues); // The resolve function's optional third argument is a context value that + // is provided to every resolve function within an execution. It is commonly + // used to represent an authenticated user, or request-specific caches. + + const contextValue = exeContext.contextValue; // Call the `subscribe()` resolver or the default resolver to produce an + // AsyncIterable yielding raw payloads. + + const resolveFn = (_fieldDef$subscribe = fieldDef.subscribe) !== null && _fieldDef$subscribe !== void 0 ? _fieldDef$subscribe : exeContext.subscribeFieldResolver; + const eventStream = await resolveFn(rootValue, args, contextValue, info); + if (eventStream instanceof Error) { + throw eventStream; + } + return eventStream; + } catch (error) { + throw (0, _locatedError.locatedError)(error, fieldNodes, (0, _Path.pathToArray)(path)); + } } /***/ }), @@ -25517,6 +24479,7 @@ exports.getArgumentValues = getArgumentValues; exports.getDirectiveValues = getDirectiveValues; exports.getVariableValues = getVariableValues; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _printPathArray = __webpack_require__(/*! ../jsutils/printPathArray.mjs */ "../../../node_modules/graphql/jsutils/printPathArray.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -25570,7 +24533,7 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { })); continue; } - if (!Object.hasOwn(inputs, varName)) { + if (!hasOwnProperty(inputs, varName)) { if (varDefNode.defaultValue) { coercedValues[varName] = (0, _valueFromAST.valueFromAST)(varDefNode.defaultValue, varType); } else if ((0, _definition.isNonNullType)(varType)) { @@ -25610,18 +24573,20 @@ function coerceVariableValues(schema, varDefNodes, inputs, onError) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getArgumentValues(def, node, variableValues) { var _node$arguments; - const coercedValues = {}; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const coercedValues = {}; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_node$arguments = node.arguments) !== null && _node$arguments !== void 0 ? _node$arguments : []; - const argNodeMap = new Map(argumentNodes.map(arg => [arg.name.value, arg])); + const argNodeMap = (0, _keyMap.keyMap)(argumentNodes, arg => arg.name.value); for (const argDef of def.args) { const name = argDef.name; const argType = argDef.type; - const argumentNode = argNodeMap.get(name); - if (argumentNode == null) { + const argumentNode = argNodeMap[name]; + if (!argumentNode) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25635,7 +24600,7 @@ function getArgumentValues(def, node, variableValues) { let isNull = valueNode.kind === _kinds.Kind.NULL; if (valueNode.kind === _kinds.Kind.VARIABLE) { const variableName = valueNode.name.value; - if (variableValues == null || !Object.hasOwn(variableValues, variableName)) { + if (variableValues == null || !hasOwnProperty(variableValues, variableName)) { if (argDef.defaultValue !== undefined) { coercedValues[name] = argDef.defaultValue; } else if ((0, _definition.isNonNullType)(argType)) { @@ -25676,6 +24641,7 @@ function getArgumentValues(def, node, variableValues) { * exposed to user code. Care should be taken to not pull values from the * Object prototype. */ + function getDirectiveValues(directiveDef, node, variableValues) { var _node$directives; const directiveNode = (_node$directives = node.directives) === null || _node$directives === void 0 ? void 0 : _node$directives.find(directive => directive.name.value === directiveDef.name); @@ -25683,6 +24649,9 @@ function getDirectiveValues(directiveDef, node, variableValues) { return getArgumentValues(directiveDef, directiveNode, variableValues); } } +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} /***/ }), @@ -25699,11 +24668,52 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.graphql = graphql; exports.graphqlSync = graphqlSync; +var _devAssert = __webpack_require__(/*! ./jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _isPromise = __webpack_require__(/*! ./jsutils/isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); var _parser = __webpack_require__(/*! ./language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _validate = __webpack_require__(/*! ./type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); var _validate2 = __webpack_require__(/*! ./validation/validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _execute = __webpack_require__(/*! ./execution/execute.mjs */ "../../../node_modules/graphql/execution/execute.mjs"); +/** + * This is the primary entry point function for fulfilling GraphQL operations + * by parsing, validating, and executing a GraphQL document along side a + * GraphQL schema. + * + * More sophisticated GraphQL servers, such as those which persist queries, + * may wish to separate the validation and execution phases to a static time + * tooling step, and a server runtime step. + * + * Accepts either an object with named arguments, or individual arguments: + * + * schema: + * The GraphQL type system to use when validating and executing a query. + * source: + * A GraphQL language formatted string representing the requested operation. + * rootValue: + * The value provided as the first argument to resolver functions on the top + * level type (e.g. the query object type). + * contextValue: + * The context value is provided as an argument to resolver functions after + * field arguments. It is used to pass shared information useful at any point + * during executing this query, for example the currently logged in user and + * connections to databases or other services. + * variableValues: + * A mapping of variable name to runtime value to use for all variables + * defined in the requestString. + * operationName: + * The name of the operation to use if requestString contains multiple + * possible operations. Can be omitted if requestString contains only + * one operation. + * fieldResolver: + * A resolver function to use when one is not provided by the schema. + * If not provided, the default field resolver is used (which looks for a + * value or method on the source value with the field's name). + * typeResolver: + * A type resolver function to use when none is provided by the schema. + * If not provided, the default type resolver is used (which looks for a + * `__typename` field or alternatively calls the `isTypeOf` method). + */ + function graphql(args) { // Always return a Promise for a consistent API. return new Promise(resolve => resolve(graphqlImpl(args))); @@ -25714,15 +24724,18 @@ function graphql(args) { * However, it guarantees to complete synchronously (or throw an error) assuming * that all field resolvers are also synchronous. */ + function graphqlSync(args) { - const result = graphqlImpl(args); - // Assert that the execution was synchronous. + const result = graphqlImpl(args); // Assert that the execution was synchronous. + if ((0, _isPromise.isPromise)(result)) { throw new Error('GraphQL execution failed to complete synchronously.'); } return result; } function graphqlImpl(args) { + // Temporary for v15 to v16 migration. Remove in v17 + arguments.length < 2 || (0, _devAssert.devAssert)(false, 'graphql@16 dropped long-deprecated support for positional arguments, please pass an object instead.'); const { schema, source, @@ -25732,15 +24745,15 @@ function graphqlImpl(args) { operationName, fieldResolver, typeResolver - } = args; - // Validate Schema + } = args; // Validate Schema + const schemaValidationErrors = (0, _validate.validateSchema)(schema); if (schemaValidationErrors.length > 0) { return { errors: schemaValidationErrors }; - } - // Parse + } // Parse + let document; try { document = (0, _parser.parse)(source); @@ -25748,15 +24761,15 @@ function graphqlImpl(args) { return { errors: [syntaxError] }; - } - // Validate + } // Validate + const validationErrors = (0, _validate2.validate)(schema, document); if (validationErrors.length > 0) { return { errors: validationErrors }; - } - // Execute + } // Execute + return (0, _execute.execute)({ schema, document, @@ -25848,12 +24861,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _index.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -25962,12 +24969,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _index.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _index.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -26430,6 +25431,12 @@ Object.defineProperty(exports, "assertUnionType", ({ return _index.assertUnionType; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _index6.assertValidName; + } +})); Object.defineProperty(exports, "assertValidSchema", ({ enumerable: true, get: function () { @@ -26514,12 +25521,6 @@ Object.defineProperty(exports, "executeSync", ({ return _index3.executeSync; } })); -Object.defineProperty(exports, "experimentalExecuteIncrementally", ({ - enumerable: true, - get: function () { - return _index3.experimentalExecuteIncrementally; - } -})); Object.defineProperty(exports, "extendSchema", ({ enumerable: true, get: function () { @@ -26538,6 +25539,12 @@ Object.defineProperty(exports, "findDangerousChanges", ({ return _index6.findDangerousChanges; } })); +Object.defineProperty(exports, "formatError", ({ + enumerable: true, + get: function () { + return _index5.formatError; + } +})); Object.defineProperty(exports, "getArgumentValues", ({ enumerable: true, get: function () { @@ -26586,12 +25593,24 @@ Object.defineProperty(exports, "getOperationAST", ({ return _index6.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _index6.getOperationRootType; + } +})); Object.defineProperty(exports, "getVariableValues", ({ enumerable: true, get: function () { return _index3.getVariableValues; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _index2.getVisitFn; + } +})); Object.defineProperty(exports, "graphql", ({ enumerable: true, get: function () { @@ -26712,12 +25731,6 @@ Object.defineProperty(exports, "isNonNullType", ({ return _index.isNonNullType; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _index2.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isNullableType", ({ enumerable: true, get: function () { @@ -26826,6 +25839,12 @@ Object.defineProperty(exports, "isUnionType", ({ return _index.isUnionType; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _index6.isValidNameError; + } +})); Object.defineProperty(exports, "isValueNode", ({ enumerable: true, get: function () { @@ -26880,10 +25899,10 @@ Object.defineProperty(exports, "print", ({ return _index2.print; } })); -Object.defineProperty(exports, "printDirective", ({ +Object.defineProperty(exports, "printError", ({ enumerable: true, get: function () { - return _index6.printDirective; + return _index5.printError; } })); Object.defineProperty(exports, "printIntrospectionSchema", ({ @@ -27053,76 +26072,6 @@ var _index6 = __webpack_require__(/*! ./utilities/index.mjs */ "../../../node_mo /***/ }), -/***/ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs": -/*!****************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/AccumulatorMap.mjs ***! - \****************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.AccumulatorMap = void 0; -/** - * ES6 Map with additional `add` method to accumulate items. - */ -class AccumulatorMap extends Map { - get [Symbol.toStringTag]() { - return 'AccumulatorMap'; - } - add(key, item) { - const group = this.get(key); - if (group === undefined) { - this.set(key, [item]); - } else { - group.push(item); - } - } -} -exports.AccumulatorMap = AccumulatorMap; - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs": -/*!*********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/BoxedPromiseOrValue.mjs ***! - \*********************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.BoxedPromiseOrValue = void 0; -var _isPromise = __webpack_require__(/*! ./isPromise.mjs */ "../../../node_modules/graphql/jsutils/isPromise.mjs"); -/** - * A BoxedPromiseOrValue is a container for a value or promise where the value - * will be updated when the promise resolves. - * - * A BoxedPromiseOrValue may only be used with promises whose possible - * rejection has already been handled, otherwise this will lead to unhandled - * promise rejections. - * - * @internal - * */ -class BoxedPromiseOrValue { - constructor(value) { - this.value = value; - if ((0, _isPromise.isPromise)(value)) { - // eslint-disable-next-line @typescript-eslint/no-floating-promises - value.then(resolved => { - this.value = resolved; - }); - } - } -} -exports.BoxedPromiseOrValue = BoxedPromiseOrValue; - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/Path.mjs": /*!******************************************************!*\ !*** ../../../node_modules/graphql/jsutils/Path.mjs ***! @@ -27149,6 +26098,7 @@ function addPath(prev, key, typename) { /** * Given a Path, return an Array of the path keys. */ + function pathToArray(path) { const flattened = []; let curr = path; @@ -27161,27 +26111,6 @@ function pathToArray(path) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/capitalize.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/capitalize.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.capitalize = capitalize; -/** - * Converts the first character of string to upper case and the remaining to lower case. - */ -function capitalize(str) { - return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/devAssert.mjs": /*!***********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/devAssert.mjs ***! @@ -27195,7 +26124,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.devAssert = devAssert; function devAssert(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message); } } @@ -27206,7 +26136,7 @@ function devAssert(condition, message) { /*!************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/didYouMean.mjs ***! \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27214,84 +26144,29 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.didYouMean = didYouMean; -var _formatList = __webpack_require__(/*! ./formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); const MAX_SUGGESTIONS = 5; +/** + * Given [ A, B, C ] return ' Did you mean A, B, or C?'. + */ + function didYouMean(firstArg, secondArg) { - const [subMessage, suggestions] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; - if (suggestions.length === 0) { - return ''; - } + const [subMessage, suggestionsArg] = secondArg ? [firstArg, secondArg] : [undefined, firstArg]; let message = ' Did you mean '; - if (subMessage != null) { + if (subMessage) { message += subMessage + ' '; } - const suggestionList = (0, _formatList.orList)(suggestions.slice(0, MAX_SUGGESTIONS).map(x => `"${x}"`)); - return message + suggestionList + '?'; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/formatList.mjs": -/*!************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/formatList.mjs ***! - \************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.andList = andList; -exports.orList = orList; -var _invariant = __webpack_require__(/*! ./invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); -/** - * Given [ A, B, C ] return 'A, B, or C'. - */ -function orList(items) { - return formatList('or', items); -} -/** - * Given [ A, B, C ] return 'A, B, and C'. - */ -function andList(items) { - return formatList('and', items); -} -function formatList(conjunction, items) { - items.length !== 0 || (0, _invariant.invariant)(false); - switch (items.length) { + const suggestions = suggestionsArg.map(x => `"${x}"`); + switch (suggestions.length) { + case 0: + return ''; case 1: - return items[0]; + return message + suggestions[0] + '?'; case 2: - return items[0] + ' ' + conjunction + ' ' + items[1]; + return message + suggestions[0] + ' or ' + suggestions[1] + '?'; } - const allButLast = items.slice(0, -1); - const lastItem = items.at(-1); - return allButLast.join(', ') + ', ' + conjunction + ' ' + lastItem; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/jsutils/getBySet.mjs": -/*!**********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/getBySet.mjs ***! - \**********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.getBySet = getBySet; -var _isSameSet = __webpack_require__(/*! ./isSameSet.mjs */ "../../../node_modules/graphql/jsutils/isSameSet.mjs"); -function getBySet(map, setToMatch) { - for (const set of map.keys()) { - if ((0, _isSameSet.isSameSet)(set, setToMatch)) { - return map.get(set); - } - } - return undefined; + const selected = suggestions.slice(0, MAX_SUGGESTIONS); + const lastItem = selected.pop(); + return message + selected.join(', ') + ', or ' + lastItem + '?'; } /***/ }), @@ -27300,7 +26175,7 @@ function getBySet(map, setToMatch) { /*!*********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/groupBy.mjs ***! \*********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { +/***/ (function(__unused_webpack_module, exports) { @@ -27308,14 +26183,19 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.groupBy = groupBy; -var _AccumulatorMap = __webpack_require__(/*! ./AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); /** * Groups array items into a Map, given a function to produce grouping key. */ function groupBy(list, keyFn) { - const result = new _AccumulatorMap.AccumulatorMap(); + const result = new Map(); for (const item of list) { - result.add(keyFn(item), item); + const key = keyFn(item); + const group = result.get(key); + if (group === undefined) { + result.set(key, [item]); + } else { + group.push(item); + } } return result; } @@ -27360,6 +26240,7 @@ const MAX_RECURSIVE_DEPTH = 2; /** * Used to print values in error messages. */ + function inspect(value) { return formatValue(value, []); } @@ -27384,8 +26265,8 @@ function formatObjectValue(value, previouslySeenValues) { } const seenValues = [...previouslySeenValues, value]; if (isJSONable(value)) { - const jsonValue = value.toJSON(); - // check for infinite recursion + const jsonValue = value.toJSON(); // check for infinite recursion + if (jsonValue !== value) { return typeof jsonValue === 'string' ? jsonValue : formatValue(jsonValue, seenValues); } @@ -27454,15 +26335,21 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.instanceOf = void 0; var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +/* c8 ignore next 3 */ + +const isProduction = globalThis.process && +// eslint-disable-next-line no-undef +"development" === 'production'; /** * A replacement for instanceof which includes an error warning when multi-realm * constructors are detected. * See: https://expressjs.com/en/advanced/best-practice-performance.html#set-node_env-to-production * See: https://webpack.js.org/guides/production/ */ + const instanceOf = exports.instanceOf = /* c8 ignore next 6 */ // FIXME: https://github.com/graphql/graphql-js/issues/2317 -globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? function instanceOf(value, constructor) { +isProduction ? function instanceOf(value, constructor) { return value instanceof constructor; } : function instanceOf(value, constructor) { if (value instanceof constructor) { @@ -27470,11 +26357,13 @@ globalThis.process != null && globalThis.process.env.NODE_ENV === 'production' ? } if (typeof value === 'object' && value !== null) { var _value$constructor; + // Prefer Symbol.toStringTag since it is immune to minification. const className = constructor.prototype[Symbol.toStringTag]; const valueClassName = // We still need to support constructor's name to detect conflicts with older versions of this library. - Symbol.toStringTag in value ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; + Symbol.toStringTag in value // @ts-expect-error TS bug see, https://github.com/microsoft/TypeScript/issues/38009 + ? value[Symbol.toStringTag] : (_value$constructor = value.constructor) === null || _value$constructor === void 0 ? void 0 : _value$constructor.name; if (className === valueClassName) { const stringifiedValue = (0, _inspect.inspect)(value); throw new Error(`Cannot use ${className} "${stringifiedValue}" from another module or realm. @@ -27509,7 +26398,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.invariant = invariant; function invariant(condition, message) { - if (!condition) { + const booleanCondition = Boolean(condition); + if (!booleanCondition) { throw new Error(message != null ? message : 'Unexpected invariant triggered.'); } } @@ -27617,32 +26507,6 @@ function isPromise(value) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/isSameSet.mjs": -/*!***********************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/isSameSet.mjs ***! - \***********************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.isSameSet = isSameSet; -function isSameSet(setA, setB) { - if (setA.size !== setB.size) { - return false; - } - for (const item of setA) { - if (!setB.has(item)) { - return false; - } - } - return true; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/keyMap.mjs": /*!********************************************************!*\ !*** ../../../node_modules/graphql/jsutils/keyMap.mjs ***! @@ -27904,15 +26768,14 @@ exports.promiseForObject = promiseForObject; * This is akin to bluebird's `Promise.props`, but implemented only using * `Promise.all` so it will work with any implementation of ES6 promises. */ -async function promiseForObject(object, callback) { - const keys = Object.keys(object); - const values = Object.values(object); - const resolvedValues = await Promise.all(values); - const resolvedObject = Object.create(null); - for (let i = 0; i < keys.length; ++i) { - resolvedObject[keys[i]] = resolvedValues[i]; - } - return callback(resolvedObject); +function promiseForObject(object) { + return Promise.all(Object.values(object)).then(resolvedValues => { + const resolvedObject = Object.create(null); + for (const [i, key] of Object.keys(object).entries()) { + resolvedObject[key] = resolvedValues[i]; + } + return resolvedObject; + }); } /***/ }), @@ -27947,39 +26810,6 @@ function promiseReduce(values, callbackFn, initialValue) { /***/ }), -/***/ "../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs": -/*!**********************************************************************!*\ - !*** ../../../node_modules/graphql/jsutils/promiseWithResolvers.mjs ***! - \**********************************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.promiseWithResolvers = promiseWithResolvers; -/** - * Based on Promise.withResolvers proposal - * https://github.com/tc39/proposal-promise-with-resolvers - */ -function promiseWithResolvers() { - // these are assigned synchronously within the Promise constructor - let resolve; - let reject; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }); - return { - promise, - resolve, - reject - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/jsutils/suggestionList.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/jsutils/suggestionList.mjs ***! @@ -27997,6 +26827,7 @@ var _naturalCompare = __webpack_require__(/*! ./naturalCompare.mjs */ "../../../ * Given an invalid input string and a list of valid options, returns a filtered * list of valid options sorted based on their similarity with the input. */ + function suggestionList(input, options) { const optionsByDistance = Object.create(null); const lexicalDistance = new LexicalDistance(input); @@ -28026,6 +26857,7 @@ function suggestionList(input, options) { * * This distance can be useful for detecting typos in input or sorting */ + class LexicalDistance { constructor(input) { this._input = input; @@ -28037,8 +26869,8 @@ class LexicalDistance { if (this._input === option) { return 0; } - const optionLowerCase = option.toLowerCase(); - // Any case change counts as a single edit + const optionLowerCase = option.toLowerCase(); // Any case change counts as a single edit + if (this._inputLowerCase === optionLowerCase) { return 1; } @@ -28068,7 +26900,8 @@ class LexicalDistance { // delete currentRow[j - 1] + 1, // insert - upRow[j - 1] + cost); + upRow[j - 1] + cost // substitute + ); if (i > 1 && j > 1 && a[i - 1] === b[j - 2] && a[i - 2] === b[j - 1]) { // transposition const doubleDiagonalCell = rows[(i - 2) % 3][j - 2]; @@ -28078,8 +26911,8 @@ class LexicalDistance { smallestCell = currentCell; } currentRow[j] = currentCell; - } - // Early exit, since distance can't go smaller than smallest element of the previous row. + } // Early exit, since distance can't go smaller than smallest element of the previous row. + if (smallestCell > threshold) { return undefined; } @@ -28115,6 +26948,7 @@ var _inspect = __webpack_require__(/*! ./inspect.mjs */ "../../../node_modules/g /** * Sometimes a non-error is thrown, wrap it as an Error instance to ensure a consistent Error interface. */ + function toError(thrownValue) { return thrownValue instanceof Error ? thrownValue : new NonErrorThrown(thrownValue); } @@ -28174,6 +27008,25 @@ exports.isNode = isNode; * identify the region of the source from which the AST derived. */ class Location { + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The Token at which this Node begins. + */ + + /** + * The Token at which this Node ends. + */ + + /** + * The Source document the AST represents. + */ constructor(startToken, endToken, source) { this.start = startToken.start; this.end = endToken.end; @@ -28197,14 +27050,45 @@ class Location { */ exports.Location = Location; class Token { - // eslint-disable-next-line max-params + /** + * The kind of Token. + */ + + /** + * The character offset at which this Node begins. + */ + + /** + * The character offset at which this Node ends. + */ + + /** + * The 1-indexed line number on which this Token appears. + */ + + /** + * The 1-indexed column number at which this Token begins. + */ + + /** + * For non-punctuation tokens, represents the interpreted value of the token. + * + * Note: is undefined for punctuation tokens, but typed as string for + * convenience in the parser. + */ + + /** + * Tokens exist as nodes in a double-linked-list amongst all tokens + * including ignored tokens. is always the first node and + * the last. + */ constructor(kind, start, end, line, column, value) { this.kind = kind; this.start = start; this.end = end; this.line = line; - this.column = column; - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.column = column; // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this.value = value; this.prev = null; this.next = null; @@ -28221,6 +27105,10 @@ class Token { }; } } +/** + * The list of all possible AST node types. + */ + /** * @internal */ @@ -28232,16 +27120,8 @@ const QueryDocumentKeys = exports.QueryDocumentKeys = { VariableDefinition: ['variable', 'type', 'defaultValue', 'directives'], Variable: ['name'], SelectionSet: ['selections'], - Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet', - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - 'nullabilityAssertion'], + Field: ['alias', 'name', 'arguments', 'directives', 'selectionSet'], Argument: ['name', 'value'], - // Note: Client Controlled Nullability is experimental and may be changed - // or removed in the future. - ListNullabilityOperator: ['nullabilityAssertion'], - NonNullAssertion: ['nullabilityAssertion'], - ErrorBoundary: ['nullabilityAssertion'], FragmentSpread: ['name', 'directives'], InlineFragment: ['typeCondition', 'directives', 'selectionSet'], FragmentDefinition: ['name', @@ -28284,10 +27164,13 @@ const kindValues = new Set(Object.keys(QueryDocumentKeys)); /** * @internal */ + function isNode(maybeNode) { const maybeKind = maybeNode === null || maybeNode === void 0 ? void 0 : maybeNode.kind; return typeof maybeKind === 'string' && kindValues.has(maybeKind); } +/** Name */ + var OperationTypeNode; (function (OperationTypeNode) { OperationTypeNode['QUERY'] = 'query'; @@ -28320,28 +27203,28 @@ var _characterClasses = __webpack_require__(/*! ./characterClasses.mjs */ "../.. * * @internal */ + function dedentBlockStringLines(lines) { - var _firstNonEmptyLine; + var _firstNonEmptyLine2; let commonIndent = Number.MAX_SAFE_INTEGER; let firstNonEmptyLine = null; let lastNonEmptyLine = -1; for (let i = 0; i < lines.length; ++i) { + var _firstNonEmptyLine; const line = lines[i]; const indent = leadingWhitespace(line); if (indent === line.length) { continue; // skip empty lines } - firstNonEmptyLine ??= i; + firstNonEmptyLine = (_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : i; lastNonEmptyLine = i; if (i !== 0 && indent < commonIndent) { commonIndent = indent; } } - return lines - // Remove common indentation from all lines but first. - .map((line, i) => i === 0 ? line : line.slice(commonIndent)) - // Remove leading and trailing blank lines. - .slice((_firstNonEmptyLine = firstNonEmptyLine) !== null && _firstNonEmptyLine !== void 0 ? _firstNonEmptyLine : 0, lastNonEmptyLine + 1); + return lines // Remove common indentation from all lines but first. + .map((line, i) => i === 0 ? line : line.slice(commonIndent)) // Remove leading and trailing blank lines. + .slice((_firstNonEmptyLine2 = firstNonEmptyLine) !== null && _firstNonEmptyLine2 !== void 0 ? _firstNonEmptyLine2 : 0, lastNonEmptyLine + 1); } function leadingWhitespace(str) { let i = 0; @@ -28353,6 +27236,7 @@ function leadingWhitespace(str) { /** * @internal */ + function isPrintableAsBlockString(value) { if (value === '') { return true; // empty string is printable @@ -28378,10 +27262,12 @@ function isPrintableAsBlockString(value) { case 0x000f: return false; // Has non-printable characters + case 0x000d: // \r return false; // Has \r or \r\n which will be replaced as \n + case 10: // \n if (isEmptyLine && !seenNonEmptyLine) { @@ -28392,12 +27278,13 @@ function isPrintableAsBlockString(value) { hasIndent = false; break; case 9: // \t + case 32: // - hasIndent ||= isEmptyLine; + hasIndent || (hasIndent = isEmptyLine); break; default: - hasCommonIndent &&= hasIndent; + hasCommonIndent && (hasCommonIndent = hasIndent); isEmptyLine = false; } } @@ -28416,24 +27303,25 @@ function isPrintableAsBlockString(value) { * * @internal */ + function printBlockString(value, options) { - const escapedValue = value.replaceAll('"""', '\\"""'); - // Expand a block string's raw value into independent lines. + const escapedValue = value.replace(/"""/g, '\\"""'); // Expand a block string's raw value into independent lines. + const lines = escapedValue.split(/\r\n|[\n\r]/g); - const isSingleLine = lines.length === 1; - // If common indentation is found we can fix some of those cases by adding leading new line - const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); - // Trailing triple quotes just looks confusing but doesn't force trailing new line - const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); - // Trailing quote (single or double) or slash forces trailing new line + const isSingleLine = lines.length === 1; // If common indentation is found we can fix some of those cases by adding leading new line + + const forceLeadingNewLine = lines.length > 1 && lines.slice(1).every(line => line.length === 0 || (0, _characterClasses.isWhiteSpace)(line.charCodeAt(0))); // Trailing triple quotes just looks confusing but doesn't force trailing new line + + const hasTrailingTripleQuotes = escapedValue.endsWith('\\"""'); // Trailing quote (single or double) or slash forces trailing new line + const hasTrailingQuote = value.endsWith('"') && !hasTrailingTripleQuotes; const hasTrailingSlash = value.endsWith('\\'); const forceTrailingNewline = hasTrailingQuote || hasTrailingSlash; const printAsMultipleLines = !(options !== null && options !== void 0 && options.minimize) && ( // add leading and trailing new lines only if it improves readability !isSingleLine || value.length > 70 || forceTrailingNewline || forceLeadingNewLine || hasTrailingTripleQuotes); - let result = ''; - // Format a multi-line block quote to account for leading space. + let result = ''; // Format a multi-line block quote to account for leading space. + const skipLeadingNewLine = isSingleLine && (0, _characterClasses.isWhiteSpace)(value.charCodeAt(0)); if (printAsMultipleLines && !skipLeadingNewLine || forceLeadingNewLine) { result += '\n'; @@ -28481,6 +27369,7 @@ function isWhiteSpace(code) { * ``` * @internal */ + function isDigit(code) { return code >= 0x0030 && code <= 0x0039; } @@ -28494,6 +27383,7 @@ function isDigit(code) { * ``` * @internal */ + function isLetter(code) { return code >= 0x0061 && code <= 0x007a || // A-Z @@ -28508,6 +27398,7 @@ function isLetter(code) { * ``` * @internal */ + function isNameStart(code) { return isLetter(code) || code === 0x005f; } @@ -28520,6 +27411,7 @@ function isNameStart(code) { * ``` * @internal */ + function isNameContinue(code) { return isLetter(code) || isDigit(code) || code === 0x005f; } @@ -28543,7 +27435,6 @@ exports.DirectiveLocation = void 0; */ var DirectiveLocation; (function (DirectiveLocation) { - /** Request Definitions */ DirectiveLocation['QUERY'] = 'QUERY'; DirectiveLocation['MUTATION'] = 'MUTATION'; DirectiveLocation['SUBSCRIPTION'] = 'SUBSCRIPTION'; @@ -28552,7 +27443,6 @@ var DirectiveLocation; DirectiveLocation['FRAGMENT_SPREAD'] = 'FRAGMENT_SPREAD'; DirectiveLocation['INLINE_FRAGMENT'] = 'INLINE_FRAGMENT'; DirectiveLocation['VARIABLE_DEFINITION'] = 'VARIABLE_DEFINITION'; - /** Type System Definitions */ DirectiveLocation['SCHEMA'] = 'SCHEMA'; DirectiveLocation['SCALAR'] = 'SCALAR'; DirectiveLocation['OBJECT'] = 'OBJECT'; @@ -28566,6 +27456,12 @@ var DirectiveLocation; DirectiveLocation['INPUT_FIELD_DEFINITION'] = 'INPUT_FIELD_DEFINITION'; })(DirectiveLocation || (exports.DirectiveLocation = DirectiveLocation = {})); +/** + * The enum type representing the directive location values. + * + * @deprecated Please use `DirectiveLocation`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/index.mjs": @@ -28645,6 +27541,12 @@ Object.defineProperty(exports, "getLocation", ({ return _location.getLocation; } })); +Object.defineProperty(exports, "getVisitFn", ({ + enumerable: true, + get: function () { + return _visitor.getVisitFn; + } +})); Object.defineProperty(exports, "isConstValueNode", ({ enumerable: true, get: function () { @@ -28663,12 +27565,6 @@ Object.defineProperty(exports, "isExecutableDefinitionNode", ({ return _predicates.isExecutableDefinitionNode; } })); -Object.defineProperty(exports, "isNullabilityAssertionNode", ({ - enumerable: true, - get: function () { - return _predicates.isNullabilityAssertionNode; - } -})); Object.defineProperty(exports, "isSelectionNode", ({ enumerable: true, get: function () { @@ -28797,24 +27693,16 @@ exports.Kind = void 0; */ var Kind; (function (Kind) { - /** Name */ Kind['NAME'] = 'Name'; - /** Document */ Kind['DOCUMENT'] = 'Document'; Kind['OPERATION_DEFINITION'] = 'OperationDefinition'; Kind['VARIABLE_DEFINITION'] = 'VariableDefinition'; Kind['SELECTION_SET'] = 'SelectionSet'; Kind['FIELD'] = 'Field'; Kind['ARGUMENT'] = 'Argument'; - /** Nullability Modifiers */ - Kind['LIST_NULLABILITY_OPERATOR'] = 'ListNullabilityOperator'; - Kind['NON_NULL_ASSERTION'] = 'NonNullAssertion'; - Kind['ERROR_BOUNDARY'] = 'ErrorBoundary'; - /** Fragments */ Kind['FRAGMENT_SPREAD'] = 'FragmentSpread'; Kind['INLINE_FRAGMENT'] = 'InlineFragment'; Kind['FRAGMENT_DEFINITION'] = 'FragmentDefinition'; - /** Values */ Kind['VARIABLE'] = 'Variable'; Kind['INT'] = 'IntValue'; Kind['FLOAT'] = 'FloatValue'; @@ -28825,16 +27713,12 @@ var Kind; Kind['LIST'] = 'ListValue'; Kind['OBJECT'] = 'ObjectValue'; Kind['OBJECT_FIELD'] = 'ObjectField'; - /** Directives */ Kind['DIRECTIVE'] = 'Directive'; - /** Types */ Kind['NAMED_TYPE'] = 'NamedType'; Kind['LIST_TYPE'] = 'ListType'; Kind['NON_NULL_TYPE'] = 'NonNullType'; - /** Type System Definitions */ Kind['SCHEMA_DEFINITION'] = 'SchemaDefinition'; Kind['OPERATION_TYPE_DEFINITION'] = 'OperationTypeDefinition'; - /** Type Definitions */ Kind['SCALAR_TYPE_DEFINITION'] = 'ScalarTypeDefinition'; Kind['OBJECT_TYPE_DEFINITION'] = 'ObjectTypeDefinition'; Kind['FIELD_DEFINITION'] = 'FieldDefinition'; @@ -28844,11 +27728,8 @@ var Kind; Kind['ENUM_TYPE_DEFINITION'] = 'EnumTypeDefinition'; Kind['ENUM_VALUE_DEFINITION'] = 'EnumValueDefinition'; Kind['INPUT_OBJECT_TYPE_DEFINITION'] = 'InputObjectTypeDefinition'; - /** Directive Definitions */ Kind['DIRECTIVE_DEFINITION'] = 'DirectiveDefinition'; - /** Type System Extensions */ Kind['SCHEMA_EXTENSION'] = 'SchemaExtension'; - /** Type Extensions */ Kind['SCALAR_TYPE_EXTENSION'] = 'ScalarTypeExtension'; Kind['OBJECT_TYPE_EXTENSION'] = 'ObjectTypeExtension'; Kind['INTERFACE_TYPE_EXTENSION'] = 'InterfaceTypeExtension'; @@ -28857,6 +27738,12 @@ var Kind; Kind['INPUT_OBJECT_TYPE_EXTENSION'] = 'InputObjectTypeExtension'; })(Kind || (exports.Kind = Kind = {})); +/** + * The enum type representing the possible kind values of AST nodes. + * + * @deprecated Please use `Kind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/lexer.mjs": @@ -28885,7 +27772,23 @@ var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modul * EOF, after which the lexer will repeatedly return the same EOF token * whenever called. */ + class Lexer { + /** + * The previously focused non-ignored token. + */ + + /** + * The currently focused non-ignored token. + */ + + /** + * The (1-indexed) line containing the current token. + */ + + /** + * The character offset at which the current line begins. + */ constructor(source) { const startOfFileToken = new _ast.Token(_tokenKind.TokenKind.SOF, 0, 0, 0, 0); this.source = source; @@ -28900,6 +27803,7 @@ class Lexer { /** * Advances the token stream to the next non-ignored token. */ + advance() { this.lastToken = this.token; const token = this.token = this.lookahead(); @@ -28909,6 +27813,7 @@ class Lexer { * Looks ahead and returns the next non-ignored token, but does not change * the state of Lexer. */ + lookahead() { let token = this.token; if (token.kind !== _tokenKind.TokenKind.EOF) { @@ -28917,10 +27822,10 @@ class Lexer { token = token.next; } else { // Read the next token and form a link in the token linked-list. - const nextToken = readNextToken(this, token.end); - // @ts-expect-error next is only mutable during parsing. - token.next = nextToken; - // @ts-expect-error prev is only mutable during parsing. + const nextToken = readNextToken(this, token.end); // @ts-expect-error next is only mutable during parsing. + + token.next = nextToken; // @ts-expect-error prev is only mutable during parsing. + nextToken.prev = token; token = nextToken; } @@ -28934,7 +27839,7 @@ class Lexer { */ exports.Lexer = Lexer; function isPunctuatorTokenKind(kind) { - return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.QUESTION_MARK || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; + return kind === _tokenKind.TokenKind.BANG || kind === _tokenKind.TokenKind.DOLLAR || kind === _tokenKind.TokenKind.AMP || kind === _tokenKind.TokenKind.PAREN_L || kind === _tokenKind.TokenKind.PAREN_R || kind === _tokenKind.TokenKind.SPREAD || kind === _tokenKind.TokenKind.COLON || kind === _tokenKind.TokenKind.EQUALS || kind === _tokenKind.TokenKind.AT || kind === _tokenKind.TokenKind.BRACKET_L || kind === _tokenKind.TokenKind.BRACKET_R || kind === _tokenKind.TokenKind.BRACE_L || kind === _tokenKind.TokenKind.PIPE || kind === _tokenKind.TokenKind.BRACE_R; } /** * A Unicode scalar value is any Unicode code point except surrogate code @@ -28944,6 +27849,7 @@ function isPunctuatorTokenKind(kind) { * SourceCharacter :: * - "Any Unicode scalar value" */ + function isUnicodeScalarValue(code) { return code >= 0x0000 && code <= 0xd7ff || code >= 0xe000 && code <= 0x10ffff; } @@ -28955,6 +27861,7 @@ function isUnicodeScalarValue(code) { * encodes a supplementary code point (above U+FFFF), but unpaired surrogate * code points are not valid source characters. */ + function isSupplementaryCodePoint(body, location) { return isLeadingSurrogate(body.charCodeAt(location)) && isTrailingSurrogate(body.charCodeAt(location + 1)); } @@ -28971,6 +27878,7 @@ function isTrailingSurrogate(code) { * Printable ASCII is printed quoted, while other points are printed in Unicode * code point form (ie. U+1234). */ + function printCodePointAt(lexer, location) { const code = lexer.source.body.codePointAt(location); if (code === undefined) { @@ -28979,13 +27887,14 @@ function printCodePointAt(lexer, location) { // Printable ASCII const char = String.fromCodePoint(code); return char === '"' ? "'\"'" : `"${char}"`; - } - // Unicode code point + } // Unicode code point + return 'U+' + code.toString(16).toUpperCase().padStart(4, '0'); } /** * Create a token with line and column location information. */ + function createToken(lexer, kind, start, end, value) { const line = lexer.line; const col = 1 + start - lexer.lineStart; @@ -28998,13 +27907,14 @@ function createToken(lexer, kind, start, end, value) { * punctuators immediately or calls the appropriate helper function for more * complicated tokens. */ + function readNextToken(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start; while (position < bodyLength) { - const code = body.charCodeAt(position); - // SourceCharacter + const code = body.charCodeAt(position); // SourceCharacter + switch (code) { // Ignored :: // - UnicodeBOM @@ -29021,8 +27931,11 @@ function readNextToken(lexer, start) { // // Comma :: , case 0xfeff: // + case 0x0009: // \t + case 0x0020: // + case 0x002c: // , ++position; @@ -29031,6 +27944,7 @@ function readNextToken(lexer, start) { // - "New Line (U+000A)" // - "Carriage Return (U+000D)" [lookahead != "New Line (U+000A)"] // - "Carriage Return (U+000D)" "New Line (U+000A)" + case 0x000a: // \n ++position; @@ -29048,6 +27962,7 @@ function readNextToken(lexer, start) { lexer.lineStart = position; continue; // Comment + case 0x0023: // # return readComment(lexer, position); @@ -29059,6 +27974,7 @@ function readNextToken(lexer, start) { // - StringValue // // Punctuator :: one of ! $ & ( ) ... : = @ [ ] { | } + case 0x0021: // ! return createToken(lexer, _tokenKind.TokenKind.BANG, position, position + 1); @@ -29104,22 +28020,20 @@ function readNextToken(lexer, start) { case 0x007d: // } return createToken(lexer, _tokenKind.TokenKind.BRACE_R, position, position + 1); - case 0x003f: - // ? - return createToken(lexer, _tokenKind.TokenKind.QUESTION_MARK, position, position + 1); // StringValue + case 0x0022: // " if (body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { return readBlockString(lexer, position); } return readString(lexer, position); - } - // IntValue | FloatValue (Digit | -) + } // IntValue | FloatValue (Digit | -) + if ((0, _characterClasses.isDigit)(code) || code === 0x002d) { return readNumber(lexer, position, code); - } - // Name + } // Name + if ((0, _characterClasses.isNameStart)(code)) { return readName(lexer, position); } @@ -29136,17 +28050,18 @@ function readNextToken(lexer, start) { * CommentChar :: SourceCharacter but not LineTerminator * ``` */ + function readComment(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; let position = start + 1; while (position < bodyLength) { - const code = body.charCodeAt(position); - // LineTerminator (\n | \r) + const code = body.charCodeAt(position); // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29186,16 +28101,17 @@ function readComment(lexer, start) { * Sign :: one of + - * ``` */ + function readNumber(lexer, start, firstCode) { const body = lexer.source.body; let position = start; let code = firstCode; - let isFloat = false; - // NegativeSign (-) + let isFloat = false; // NegativeSign (-) + if (code === 0x002d) { code = body.charCodeAt(++position); - } - // Zero (0) + } // Zero (0) + if (code === 0x0030) { code = body.charCodeAt(++position); if ((0, _characterClasses.isDigit)(code)) { @@ -29204,26 +28120,26 @@ function readNumber(lexer, start, firstCode) { } else { position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Full stop (.) + } // Full stop (.) + if (code === 0x002e) { isFloat = true; code = body.charCodeAt(++position); position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // E e + } // E e + if (code === 0x0045 || code === 0x0065) { isFloat = true; - code = body.charCodeAt(++position); - // + - + code = body.charCodeAt(++position); // + - + if (code === 0x002b || code === 0x002d) { code = body.charCodeAt(++position); } position = readDigits(lexer, position, code); code = body.charCodeAt(position); - } - // Numbers cannot be followed by . or NameStart + } // Numbers cannot be followed by . or NameStart + if (code === 0x002e || (0, _characterClasses.isNameStart)(code)) { throw (0, _syntaxError.syntaxError)(lexer.source, position, `Invalid number, expected digit but got: ${printCodePointAt(lexer, position)}.`); } @@ -29232,12 +28148,14 @@ function readNumber(lexer, start, firstCode) { /** * Returns the new position in the source after reading one or more digits. */ + function readDigits(lexer, start, firstCode) { if (!(0, _characterClasses.isDigit)(firstCode)) { throw (0, _syntaxError.syntaxError)(lexer.source, start, `Invalid number, expected digit but got: ${printCodePointAt(lexer, start)}.`); } const body = lexer.source.body; let position = start + 1; // +1 to skip first firstCode + while ((0, _characterClasses.isDigit)(body.charCodeAt(position))) { ++position; } @@ -29263,6 +28181,7 @@ function readDigits(lexer, start, firstCode) { * EscapedCharacter :: one of `"` `\` `/` `b` `f` `n` `r` `t` * ``` */ + function readString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29270,13 +28189,13 @@ function readString(lexer, start) { let chunkStart = position; let value = ''; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Quote (") + const code = body.charCodeAt(position); // Closing Quote (") + if (code === 0x0022) { value += body.slice(chunkStart, position); return createToken(lexer, _tokenKind.TokenKind.STRING, start, position + 1, value); - } - // Escape Sequence (\) + } // Escape Sequence (\) + if (code === 0x005c) { value += body.slice(chunkStart, position); const escape = body.charCodeAt(position + 1) === 0x0075 // u @@ -29286,12 +28205,12 @@ function readString(lexer, start) { position += escape.size; chunkStart = position; continue; - } - // LineTerminator (\n | \r) + } // LineTerminator (\n | \r) + if (code === 0x000a || code === 0x000d) { break; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29301,15 +28220,16 @@ function readString(lexer, start) { } } throw (0, _syntaxError.syntaxError)(lexer.source, position, 'Unterminated string.'); -} +} // The string value and lexed size of an escape sequence. + function readEscapedUnicodeVariableWidth(lexer, position) { const body = lexer.source.body; let point = 0; - let size = 3; - // Cannot be larger than 12 chars (\u{00000000}). + let size = 3; // Cannot be larger than 12 chars (\u{00000000}). + while (size < 12) { - const code = body.charCodeAt(position + size++); - // Closing Brace (}) + const code = body.charCodeAt(position + size++); // Closing Brace (}) + if (code === 0x007d) { // Must be at least 5 chars (\u{0}) and encode a Unicode scalar value. if (size < 5 || !isUnicodeScalarValue(point)) { @@ -29319,8 +28239,8 @@ function readEscapedUnicodeVariableWidth(lexer, position) { value: String.fromCodePoint(point), size }; - } - // Append this hex digit to the code point. + } // Append this hex digit to the code point. + point = point << 4 | readHexDigit(code); if (point < 0) { break; @@ -29336,9 +28256,9 @@ function readEscapedUnicodeFixedWidth(lexer, position) { value: String.fromCodePoint(code), size: 6 }; - } - // GraphQL allows JSON-style surrogate pair escape sequences, but only when + } // GraphQL allows JSON-style surrogate pair escape sequences, but only when // a valid pair is formed. + if (isLeadingSurrogate(code)) { // \u if (body.charCodeAt(position + 6) === 0x005c && body.charCodeAt(position + 7) === 0x0075) { @@ -29366,6 +28286,7 @@ function readEscapedUnicodeFixedWidth(lexer, position) { * * Returns a negative number if any char was not a valid hexadecimal digit. */ + function read16BitHexCode(body, position) { // readHexDigit() returns -1 on error. ORing a negative value with any other // value always produces a negative value. @@ -29385,6 +28306,7 @@ function read16BitHexCode(body, position) { * - `A` `B` `C` `D` `E` `F` * - `a` `b` `c` `d` `e` `f` */ + function readHexDigit(code) { return code >= 0x0030 && code <= 0x0039 // 0-9 ? code - 0x0030 : code >= 0x0041 && code <= 0x0046 // A-F @@ -29403,6 +28325,7 @@ function readHexDigit(code) { * | `r` | U+000D | carriage return | * | `t` | U+0009 | horizontal tab | */ + function readEscapedCharacter(lexer, position) { const body = lexer.source.body; const code = body.charCodeAt(position + 1); @@ -29470,6 +28393,7 @@ function readEscapedCharacter(lexer, position) { * - `\"""` * ``` */ + function readBlockString(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29479,8 +28403,8 @@ function readBlockString(lexer, start) { let currentLine = ''; const blockLines = []; while (position < bodyLength) { - const code = body.charCodeAt(position); - // Closing Triple-Quote (""") + const code = body.charCodeAt(position); // Closing Triple-Quote (""") + if (code === 0x0022 && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29490,15 +28414,16 @@ function readBlockString(lexer, start) { lexer.line += blockLines.length - 1; lexer.lineStart = lineStart; return token; - } - // Escaped Triple-Quote (\""") + } // Escaped Triple-Quote (\""") + if (code === 0x005c && body.charCodeAt(position + 1) === 0x0022 && body.charCodeAt(position + 2) === 0x0022 && body.charCodeAt(position + 3) === 0x0022) { currentLine += body.slice(chunkStart, position); chunkStart = position + 1; // skip only slash + position += 4; continue; - } - // LineTerminator + } // LineTerminator + if (code === 0x000a || code === 0x000d) { currentLine += body.slice(chunkStart, position); blockLines.push(currentLine); @@ -29511,8 +28436,8 @@ function readBlockString(lexer, start) { chunkStart = position; lineStart = position; continue; - } - // SourceCharacter + } // SourceCharacter + if (isUnicodeScalarValue(code)) { ++position; } else if (isSupplementaryCodePoint(body, position)) { @@ -29531,6 +28456,7 @@ function readBlockString(lexer, start) { * - NameStart NameContinue* [lookahead != NameContinue] * ``` */ + function readName(lexer, start) { const body = lexer.source.body; const bodyLength = body.length; @@ -29562,6 +28488,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.getLocation = getLocation; var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); const LineRegExp = /\r\n|[\n\r]/g; +/** + * Represents a location in a Source. + */ + /** * Takes a Source and a UTF-8 character offset, and returns the corresponding * line and column as a SourceLocation. @@ -29608,6 +28538,10 @@ var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graph var _lexer = __webpack_require__(/*! ./lexer.mjs */ "../../../node_modules/graphql/language/lexer.mjs"); var _source = __webpack_require__(/*! ./source.mjs */ "../../../node_modules/graphql/language/source.mjs"); var _tokenKind = __webpack_require__(/*! ./tokenKind.mjs */ "../../../node_modules/graphql/language/tokenKind.mjs"); +/** + * Configuration options to control parser behavior + */ + /** * Given a GraphQL source, parses it into a Document. * Throws GraphQLError if a syntax error is encountered. @@ -29626,6 +28560,7 @@ function parse(source, options) { * * Consider providing the results to the utility function: valueFromAST(). */ + function parseValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29637,6 +28572,7 @@ function parseValue(source, options) { * Similar to parseValue(), but raises a parse error if it encounters a * variable. The return type will be a constant value. */ + function parseConstValue(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29654,6 +28590,7 @@ function parseConstValue(source, options) { * * Consider providing the results to the utility function: typeFromAST(). */ + function parseType(source, options) { const parser = new Parser(source, options); parser.expectToken(_tokenKind.TokenKind.SOF); @@ -29672,6 +28609,7 @@ function parseType(source, options) { * * @internal */ + class Parser { constructor(source, options = {}) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); @@ -29682,17 +28620,19 @@ class Parser { /** * Converts a name lex token into a name parse node. */ + parseName() { const token = this.expectToken(_tokenKind.TokenKind.NAME); return this.node(token, { kind: _kinds.Kind.NAME, value: token.value }); - } - // Implements the parsing rules in the Document section. + } // Implements the parsing rules in the Document section. + /** * Document : Definition+ */ + parseDocument() { return this.node(this._lexer.token, { kind: _kinds.Kind.DOCUMENT, @@ -29722,11 +28662,12 @@ class Parser { * - EnumTypeDefinition * - InputObjectTypeDefinition */ + parseDefinition() { if (this.peek(_tokenKind.TokenKind.BRACE_L)) { return this.parseOperationDefinition(); - } - // Many definitions begin with a description and require a lookahead. + } // Many definitions begin with a description and require a lookahead. + const hasDescription = this.peekDescription(); const keywordToken = hasDescription ? this._lexer.lookahead() : this._lexer.token; if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -29763,13 +28704,14 @@ class Parser { } } throw this.unexpected(keywordToken); - } - // Implements the parsing rules in the Operations section. + } // Implements the parsing rules in the Operations section. + /** * OperationDefinition : * - SelectionSet * - OperationType Name? VariableDefinitions? Directives? SelectionSet */ + parseOperationDefinition() { const start = this._lexer.token; if (this.peek(_tokenKind.TokenKind.BRACE_L)) { @@ -29799,6 +28741,7 @@ class Parser { /** * OperationType : one of query mutation subscription */ + parseOperationType() { const operationToken = this.expectToken(_tokenKind.TokenKind.NAME); switch (operationToken.value) { @@ -29814,12 +28757,14 @@ class Parser { /** * VariableDefinitions : ( VariableDefinition+ ) */ + parseVariableDefinitions() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseVariableDefinition, _tokenKind.TokenKind.PAREN_R); } /** * VariableDefinition : Variable : Type DefaultValue? Directives[Const]? */ + parseVariableDefinition() { return this.node(this._lexer.token, { kind: _kinds.Kind.VARIABLE_DEFINITION, @@ -29832,6 +28777,7 @@ class Parser { /** * Variable : $ Name */ + parseVariable() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.DOLLAR); @@ -29845,6 +28791,7 @@ class Parser { * SelectionSet : { Selection+ } * ``` */ + parseSelectionSet() { return this.node(this._lexer.token, { kind: _kinds.Kind.SELECTION_SET, @@ -29857,6 +28804,7 @@ class Parser { * - FragmentSpread * - InlineFragment */ + parseSelection() { return this.peek(_tokenKind.TokenKind.SPREAD) ? this.parseFragment() : this.parseField(); } @@ -29865,6 +28813,7 @@ class Parser { * * Alias : Name : */ + parseField() { const start = this._lexer.token; const nameOrAlias = this.parseName(); @@ -29881,47 +28830,22 @@ class Parser { alias, name, arguments: this.parseArguments(false), - // Experimental support for Client Controlled Nullability changes - // the grammar of Field: - nullabilityAssertion: this.parseNullabilityAssertion(), directives: this.parseDirectives(false), selectionSet: this.peek(_tokenKind.TokenKind.BRACE_L) ? this.parseSelectionSet() : undefined }); } - // TODO: add grammar comment after it finalizes - parseNullabilityAssertion() { - // Note: Client Controlled Nullability is experimental and may be changed or - // removed in the future. - if (this._options.experimentalClientControlledNullability !== true) { - return undefined; - } - const start = this._lexer.token; - let nullabilityAssertion; - if (this.expectOptionalToken(_tokenKind.TokenKind.BRACKET_L)) { - const innerModifier = this.parseNullabilityAssertion(); - this.expectToken(_tokenKind.TokenKind.BRACKET_R); - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.LIST_NULLABILITY_OPERATOR, - nullabilityAssertion: innerModifier - }); - } - if (this.expectOptionalToken(_tokenKind.TokenKind.BANG)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.NON_NULL_ASSERTION, - nullabilityAssertion - }); - } else if (this.expectOptionalToken(_tokenKind.TokenKind.QUESTION_MARK)) { - nullabilityAssertion = this.node(start, { - kind: _kinds.Kind.ERROR_BOUNDARY, - nullabilityAssertion - }); - } - return nullabilityAssertion; - } + /** + * Arguments[Const] : ( Argument[?Const]+ ) + */ + parseArguments(isConst) { const item = isConst ? this.parseConstArgument : this.parseArgument; return this.optionalMany(_tokenKind.TokenKind.PAREN_L, item, _tokenKind.TokenKind.PAREN_R); } + /** + * Argument[Const] : Name : Value[?Const] + */ + parseArgument(isConst = false) { const start = this._lexer.token; const name = this.parseName(); @@ -29934,8 +28858,8 @@ class Parser { } parseConstArgument() { return this.parseArgument(true); - } - // Implements the parsing rules in the Fragments section. + } // Implements the parsing rules in the Fragments section. + /** * Corresponds to both FragmentSpread and InlineFragment in the spec. * @@ -29943,6 +28867,7 @@ class Parser { * * InlineFragment : ... TypeCondition? Directives? SelectionSet */ + parseFragment() { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.SPREAD); @@ -29967,12 +28892,13 @@ class Parser { * * TypeCondition : NamedType */ + parseFragmentDefinition() { const start = this._lexer.token; - this.expectKeyword('fragment'); - // Legacy support for defining variables within fragments changes + this.expectKeyword('fragment'); // Legacy support for defining variables within fragments changes // the grammar of FragmentDefinition: // - fragment FragmentName VariableDefinitions? on TypeCondition Directives? SelectionSet + if (this._options.allowLegacyFragmentVariables === true) { return this.node(start, { kind: _kinds.Kind.FRAGMENT_DEFINITION, @@ -29994,12 +28920,33 @@ class Parser { /** * FragmentName : Name but not `on` */ + parseFragmentName() { if (this._lexer.token.value === 'on') { throw this.unexpected(); } return this.parseName(); - } + } // Implements the parsing rules in the Values section. + + /** + * Value[Const] : + * - [~Const] Variable + * - IntValue + * - FloatValue + * - StringValue + * - BooleanValue + * - NullValue + * - EnumValue + * - ListValue[?Const] + * - ObjectValue[?Const] + * + * BooleanValue : one of `true` `false` + * + * NullValue : `null` + * + * EnumValue : Name but not `true`, `false` or `null` + */ + parseValueLiteral(isConst) { const token = this._lexer.token; switch (token.kind) { @@ -30072,6 +29019,12 @@ class Parser { block: token.kind === _tokenKind.TokenKind.BLOCK_STRING }); } + /** + * ListValue[Const] : + * - [ ] + * - [ Value[?Const]+ ] + */ + parseList(isConst) { const item = () => this.parseValueLiteral(isConst); return this.node(this._lexer.token, { @@ -30079,6 +29032,14 @@ class Parser { values: this.any(_tokenKind.TokenKind.BRACKET_L, item, _tokenKind.TokenKind.BRACKET_R) }); } + /** + * ``` + * ObjectValue[Const] : + * - { } + * - { ObjectField[?Const]+ } + * ``` + */ + parseObject(isConst) { const item = () => this.parseObjectField(isConst); return this.node(this._lexer.token, { @@ -30086,6 +29047,10 @@ class Parser { fields: this.any(_tokenKind.TokenKind.BRACE_L, item, _tokenKind.TokenKind.BRACE_R) }); } + /** + * ObjectField[Const] : Name : Value[?Const] + */ + parseObjectField(isConst) { const start = this._lexer.token; const name = this.parseName(); @@ -30095,7 +29060,12 @@ class Parser { name, value: this.parseValueLiteral(isConst) }); - } + } // Implements the parsing rules in the Directives section. + + /** + * Directives[Const] : Directive[?Const]+ + */ + parseDirectives(isConst) { const directives = []; while (this.peek(_tokenKind.TokenKind.AT)) { @@ -30106,6 +29076,12 @@ class Parser { parseConstDirectives() { return this.parseDirectives(true); } + /** + * ``` + * Directive[Const] : @ Name Arguments[?Const]? + * ``` + */ + parseDirective(isConst) { const start = this._lexer.token; this.expectToken(_tokenKind.TokenKind.AT); @@ -30114,14 +29090,15 @@ class Parser { name: this.parseName(), arguments: this.parseArguments(isConst) }); - } - // Implements the parsing rules in the Types section. + } // Implements the parsing rules in the Types section. + /** * Type : * - NamedType * - ListType * - NonNullType */ + parseTypeReference() { const start = this._lexer.token; let type; @@ -30146,19 +29123,21 @@ class Parser { /** * NamedType : Name */ + parseNamedType() { return this.node(this._lexer.token, { kind: _kinds.Kind.NAMED_TYPE, name: this.parseName() }); - } - // Implements the parsing rules in the Type Definition section. + } // Implements the parsing rules in the Type Definition section. + peekDescription() { return this.peek(_tokenKind.TokenKind.STRING) || this.peek(_tokenKind.TokenKind.BLOCK_STRING); } /** * Description : StringValue */ + parseDescription() { if (this.peekDescription()) { return this.parseStringLiteral(); @@ -30169,6 +29148,7 @@ class Parser { * SchemaDefinition : Description? schema Directives[Const]? { OperationTypeDefinition+ } * ``` */ + parseSchemaDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30185,6 +29165,7 @@ class Parser { /** * OperationTypeDefinition : OperationType : NamedType */ + parseOperationTypeDefinition() { const start = this._lexer.token; const operation = this.parseOperationType(); @@ -30199,6 +29180,7 @@ class Parser { /** * ScalarTypeDefinition : Description? scalar Name Directives[Const]? */ + parseScalarTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30217,6 +29199,7 @@ class Parser { * Description? * type Name ImplementsInterfaces? Directives[Const]? FieldsDefinition? */ + parseObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30239,6 +29222,7 @@ class Parser { * - implements `&`? NamedType * - ImplementsInterfaces & NamedType */ + parseImplementsInterfaces() { return this.expectOptionalKeyword('implements') ? this.delimitedMany(_tokenKind.TokenKind.AMP, this.parseNamedType) : []; } @@ -30247,6 +29231,7 @@ class Parser { * FieldsDefinition : { FieldDefinition+ } * ``` */ + parseFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseFieldDefinition, _tokenKind.TokenKind.BRACE_R); } @@ -30254,6 +29239,7 @@ class Parser { * FieldDefinition : * - Description? Name ArgumentsDefinition? : Type Directives[Const]? */ + parseFieldDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30274,6 +29260,7 @@ class Parser { /** * ArgumentsDefinition : ( InputValueDefinition+ ) */ + parseArgumentDefs() { return this.optionalMany(_tokenKind.TokenKind.PAREN_L, this.parseInputValueDef, _tokenKind.TokenKind.PAREN_R); } @@ -30281,6 +29268,7 @@ class Parser { * InputValueDefinition : * - Description? Name : Type DefaultValue? Directives[Const]? */ + parseInputValueDef() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30305,6 +29293,7 @@ class Parser { * InterfaceTypeDefinition : * - Description? interface Name Directives[Const]? FieldsDefinition? */ + parseInterfaceTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30326,6 +29315,7 @@ class Parser { * UnionTypeDefinition : * - Description? union Name Directives[Const]? UnionMemberTypes? */ + parseUnionTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30346,6 +29336,7 @@ class Parser { * - = `|`? NamedType * - UnionMemberTypes | NamedType */ + parseUnionMemberTypes() { return this.expectOptionalToken(_tokenKind.TokenKind.EQUALS) ? this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseNamedType) : []; } @@ -30353,6 +29344,7 @@ class Parser { * EnumTypeDefinition : * - Description? enum Name Directives[Const]? EnumValuesDefinition? */ + parseEnumTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30373,12 +29365,14 @@ class Parser { * EnumValuesDefinition : { EnumValueDefinition+ } * ``` */ + parseEnumValuesDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseEnumValueDefinition, _tokenKind.TokenKind.BRACE_R); } /** * EnumValueDefinition : Description? EnumValue Directives[Const]? */ + parseEnumValueDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30394,6 +29388,7 @@ class Parser { /** * EnumValue : Name but not `true`, `false` or `null` */ + parseEnumValueName() { if (this._lexer.token.value === 'true' || this._lexer.token.value === 'false' || this._lexer.token.value === 'null') { throw (0, _syntaxError.syntaxError)(this._lexer.source, this._lexer.token.start, `${getTokenDesc(this._lexer.token)} is reserved and cannot be used for an enum value.`); @@ -30404,6 +29399,7 @@ class Parser { * InputObjectTypeDefinition : * - Description? input Name Directives[Const]? InputFieldsDefinition? */ + parseInputObjectTypeDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30424,6 +29420,7 @@ class Parser { * InputFieldsDefinition : { InputValueDefinition+ } * ``` */ + parseInputFieldsDefinition() { return this.optionalMany(_tokenKind.TokenKind.BRACE_L, this.parseInputValueDef, _tokenKind.TokenKind.BRACE_R); } @@ -30440,6 +29437,7 @@ class Parser { * - EnumTypeExtension * - InputObjectTypeDefinition */ + parseTypeSystemExtension() { const keywordToken = this._lexer.lookahead(); if (keywordToken.kind === _tokenKind.TokenKind.NAME) { @@ -30469,6 +29467,7 @@ class Parser { * - extend schema Directives[Const] * ``` */ + parseSchemaExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30488,6 +29487,7 @@ class Parser { * ScalarTypeExtension : * - extend scalar Name Directives[Const] */ + parseScalarTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30509,6 +29509,7 @@ class Parser { * - extend type Name ImplementsInterfaces? Directives[Const] * - extend type Name ImplementsInterfaces */ + parseObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30534,6 +29535,7 @@ class Parser { * - extend interface Name ImplementsInterfaces? Directives[Const] * - extend interface Name ImplementsInterfaces */ + parseInterfaceTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30558,6 +29560,7 @@ class Parser { * - extend union Name Directives[Const]? UnionMemberTypes * - extend union Name Directives[Const] */ + parseUnionTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30580,6 +29583,7 @@ class Parser { * - extend enum Name Directives[Const]? EnumValuesDefinition * - extend enum Name Directives[Const] */ + parseEnumTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30602,6 +29606,7 @@ class Parser { * - extend input Name Directives[Const]? InputFieldsDefinition * - extend input Name Directives[Const] */ + parseInputObjectTypeExtension() { const start = this._lexer.token; this.expectKeyword('extend'); @@ -30625,6 +29630,7 @@ class Parser { * - Description? directive @ Name ArgumentsDefinition? `repeatable`? on DirectiveLocations * ``` */ + parseDirectiveDefinition() { const start = this._lexer.token; const description = this.parseDescription(); @@ -30649,6 +29655,7 @@ class Parser { * - `|`? DirectiveLocation * - DirectiveLocations | DirectiveLocation */ + parseDirectiveLocations() { return this.delimitedMany(_tokenKind.TokenKind.PIPE, this.parseDirectiveLocation); } @@ -30679,20 +29686,22 @@ class Parser { * `INPUT_OBJECT` * `INPUT_FIELD_DEFINITION` */ + parseDirectiveLocation() { const start = this._lexer.token; const name = this.parseName(); - if (Object.hasOwn(_directiveLocation.DirectiveLocation, name.value)) { + if (Object.prototype.hasOwnProperty.call(_directiveLocation.DirectiveLocation, name.value)) { return name; } throw this.unexpected(start); - } - // Core parsing utility functions + } // Core parsing utility functions + /** * Returns a node that, if configured to do so, sets a "loc" field as a * location object, used to identify the place in the source that created a * given parsed object. */ + node(startToken, node) { if (this._options.noLocation !== true) { node.loc = new _ast.Location(startToken, this._lexer.lastToken, this._lexer.source); @@ -30702,6 +29711,7 @@ class Parser { /** * Determines if the next token is of a given kind */ + peek(kind) { return this._lexer.token.kind === kind; } @@ -30709,6 +29719,7 @@ class Parser { * If the next token is of the given kind, return that token after advancing the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30721,6 +29732,7 @@ class Parser { * If the next token is of the given kind, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalToken(kind) { const token = this._lexer.token; if (token.kind === kind) { @@ -30733,6 +29745,7 @@ class Parser { * If the next token is a given keyword, advance the lexer. * Otherwise, do not change the parser state and throw an error. */ + expectKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30745,6 +29758,7 @@ class Parser { * If the next token is a given keyword, return "true" after advancing the lexer. * Otherwise, do not change the parser state and return "false". */ + expectOptionalKeyword(value) { const token = this._lexer.token; if (token.kind === _tokenKind.TokenKind.NAME && token.value === value) { @@ -30756,6 +29770,7 @@ class Parser { /** * Helper function for creating an error when an unexpected lexed token is encountered. */ + unexpected(atToken) { const token = atToken !== null && atToken !== void 0 ? atToken : this._lexer.token; return (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Unexpected ${getTokenDesc(token)}.`); @@ -30765,6 +29780,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + any(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30779,6 +29795,7 @@ class Parser { * that begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + optionalMany(openKind, parseFn, closeKind) { if (this.expectOptionalToken(openKind)) { const nodes = []; @@ -30794,6 +29811,7 @@ class Parser { * This list begins with a lex token of openKind and ends with a lex token of closeKind. * Advances the parser to the next lex token after the closing token. */ + many(openKind, parseFn, closeKind) { this.expectToken(openKind); const nodes = []; @@ -30807,6 +29825,7 @@ class Parser { * This list may begin with a lex token of delimiterKind followed by items separated by lex tokens of tokenKind. * Advances the parser to the next lex token after last item in the list. */ + delimitedMany(delimiterKind, parseFn) { this.expectOptionalToken(delimiterKind); const nodes = []; @@ -30823,7 +29842,7 @@ class Parser { if (maxTokens !== undefined && token.kind !== _tokenKind.TokenKind.EOF) { ++this._tokenCounter; if (this._tokenCounter > maxTokens) { - throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more than ${maxTokens} tokens. Parsing aborted.`); + throw (0, _syntaxError.syntaxError)(this._lexer.source, token.start, `Document contains more that ${maxTokens} tokens. Parsing aborted.`); } } } @@ -30839,6 +29858,7 @@ function getTokenDesc(token) { /** * A helper function to describe a token kind as a string for debugging. */ + function getTokenKindDesc(kind) { return (0, _lexer.isPunctuatorTokenKind)(kind) ? `"${kind}"` : kind; } @@ -30859,7 +29879,6 @@ Object.defineProperty(exports, "__esModule", ({ exports.isConstValueNode = isConstValueNode; exports.isDefinitionNode = isDefinitionNode; exports.isExecutableDefinitionNode = isExecutableDefinitionNode; -exports.isNullabilityAssertionNode = isNullabilityAssertionNode; exports.isSelectionNode = isSelectionNode; exports.isTypeDefinitionNode = isTypeDefinitionNode; exports.isTypeExtensionNode = isTypeExtensionNode; @@ -30877,9 +29896,6 @@ function isExecutableDefinitionNode(node) { function isSelectionNode(node) { return node.kind === _kinds.Kind.FIELD || node.kind === _kinds.Kind.FRAGMENT_SPREAD || node.kind === _kinds.Kind.INLINE_FRAGMENT; } -function isNullabilityAssertionNode(node) { - return node.kind === _kinds.Kind.LIST_NULLABILITY_OPERATOR || node.kind === _kinds.Kind.NON_NULL_ASSERTION || node.kind === _kinds.Kind.ERROR_BOUNDARY; -} function isValueNode(node) { return node.kind === _kinds.Kind.VARIABLE || node.kind === _kinds.Kind.INT || node.kind === _kinds.Kind.FLOAT || node.kind === _kinds.Kind.STRING || node.kind === _kinds.Kind.BOOLEAN || node.kind === _kinds.Kind.NULL || node.kind === _kinds.Kind.ENUM || node.kind === _kinds.Kind.LIST || node.kind === _kinds.Kind.OBJECT; } @@ -30927,6 +29943,7 @@ function printLocation(location) { /** * Render a helpful description of the location in the GraphQL Source document. */ + function printSourceLocation(source, sourceLocation) { const firstLineColumnOffset = source.locationOffset.column - 1; const body = ''.padStart(firstLineColumnOffset) + source.body; @@ -30937,8 +29954,8 @@ function printSourceLocation(source, sourceLocation) { const columnNum = sourceLocation.column + columnOffset; const locationStr = `${source.name}:${lineNum}:${columnNum}\n`; const lines = body.split(/\r\n|[\n\r]/g); - const locationLine = lines[lineIndex]; - // Special case for minified documents + const locationLine = lines[lineIndex]; // Special case for minified documents + if (locationLine.length > 120) { const subLineIndex = Math.floor(columnNum / 80); const subLineColumnNum = columnNum % 80; @@ -30978,14 +29995,24 @@ exports.printString = printString; */ function printString(str) { return `"${str.replace(escapedRegExp, escapedReplacer)}"`; -} -// eslint-disable-next-line no-control-regex +} // eslint-disable-next-line no-control-regex + const escapedRegExp = /[\x00-\x1f\x22\x5c\x7f-\x9f]/g; function escapedReplacer(str) { return escapeSequences[str.charCodeAt(0)]; -} -// prettier-ignore -const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; +} // prettier-ignore + +const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', '\\u0005', '\\u0006', '\\u0007', '\\b', '\\t', '\\n', '\\u000B', '\\f', '\\r', '\\u000E', '\\u000F', '\\u0010', '\\u0011', '\\u0012', '\\u0013', '\\u0014', '\\u0015', '\\u0016', '\\u0017', '\\u0018', '\\u0019', '\\u001A', '\\u001B', '\\u001C', '\\u001D', '\\u001E', '\\u001F', '', '', '\\"', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 2F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 3F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 4F +'', '', '', '', '', '', '', '', '', '', '', '', '\\\\', '', '', '', +// 5F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', +// 6F +'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '\\u007F', '\\u0080', '\\u0081', '\\u0082', '\\u0083', '\\u0084', '\\u0085', '\\u0086', '\\u0087', '\\u0088', '\\u0089', '\\u008A', '\\u008B', '\\u008C', '\\u008D', '\\u008E', '\\u008F', '\\u0090', '\\u0091', '\\u0092', '\\u0093', '\\u0094', '\\u0095', '\\u0096', '\\u0097', '\\u0098', '\\u0099', '\\u009A', '\\u009B', '\\u009C', '\\u009D', '\\u009E', '\\u009F']; /***/ }), @@ -31008,6 +30035,7 @@ var _visitor = __webpack_require__(/*! ./visitor.mjs */ "../../../node_modules/g * Converts an AST into a string, using one set of reasonable * formatting rules. */ + function print(ast) { return (0, _visitor.visit)(ast, printDocASTReducer); } @@ -31026,9 +30054,9 @@ const printDocASTReducer = { OperationDefinition: { leave(node) { const varDefs = wrap('(', join(node.variableDefinitions, ', '), ')'); - const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); - // Anonymous queries with no directives or variable definitions can use + const prefix = join([node.operation, join([node.name, varDefs]), join(node.directives, ' ')], ' '); // Anonymous queries with no directives or variable definitions can use // the query short form. + return (prefix === 'query' ? '' : prefix + ' ') + node.selectionSet; } }, @@ -31050,19 +30078,15 @@ const printDocASTReducer = { alias, name, arguments: args, - nullabilityAssertion, directives, selectionSet }) { - const prefix = join([wrap('', alias, ': '), name], ''); + const prefix = wrap('', alias, ': ') + name; let argsLine = prefix + wrap('(', join(args, ', '), ')'); if (argsLine.length > MAX_LINE_LENGTH) { argsLine = prefix + wrap('(\n', indent(join(args, '\n')), '\n)'); } - return join([argsLine, - // Note: Client Controlled Nullability is experimental and may be - // changed or removed in the future. - nullabilityAssertion, wrap(' ', join(directives, ' ')), wrap(' ', selectionSet)]); + return join([argsLine, join(directives, ' '), selectionSet], ' '); } }, Argument: { @@ -31071,28 +30095,6 @@ const printDocASTReducer = { value }) => name + ': ' + value }, - // Nullability Modifiers - ListNullabilityOperator: { - leave({ - nullabilityAssertion - }) { - return join(['[', nullabilityAssertion, ']']); - } - }, - NonNullAssertion: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '!']); - } - }, - ErrorBoundary: { - leave({ - nullabilityAssertion - }) { - return join([nullabilityAssertion, '?']); - } - }, // Fragments FragmentSpread: { leave: ({ @@ -31114,8 +30116,8 @@ const printDocASTReducer = { variableDefinitions, directives, selectionSet - }) => - // Note: fragment variable definitions are experimental and may be changed + } // Note: fragment variable definitions are experimental and may be changed + ) => // or removed in the future. `fragment ${name}${wrap('(', join(variableDefinitions, ', '), ')')} ` + `on ${typeCondition} ${wrap('', join(directives, ' '), ' ')}` + selectionSet }, @@ -31134,7 +30136,7 @@ const printDocASTReducer = { leave: ({ value, block: isBlockString - }) => isBlockString === true ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) + }) => isBlockString ? (0, _blockString.printBlockString)(value) : (0, _printString.printString)(value) }, BooleanValue: { leave: ({ @@ -31152,21 +30154,12 @@ const printDocASTReducer = { ListValue: { leave: ({ values - }) => { - const valuesLine = '[' + join(values, ', ') + ']'; - if (valuesLine.length > MAX_LINE_LENGTH) { - return '[\n' + indent(join(values, '\n')) + '\n]'; - } - return valuesLine; - } + }) => '[' + join(values, ', ') + ']' }, ObjectValue: { leave: ({ fields - }) => { - const fieldsLine = '{ ' + join(fields, ', ') + ' }'; - return fieldsLine.length > MAX_LINE_LENGTH ? block(fields) : fieldsLine; - } + }) => '{' + join(fields, ', ') + '}' }, ObjectField: { leave: ({ @@ -31348,6 +30341,7 @@ const printDocASTReducer = { * Given maybeArray, print an empty string if it is null or empty, otherwise * print all items together separated by separator if provided */ + function join(maybeArray, separator = '') { var _maybeArray$filter$jo; return (_maybeArray$filter$jo = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.filter(x => x).join(separator)) !== null && _maybeArray$filter$jo !== void 0 ? _maybeArray$filter$jo : ''; @@ -31355,21 +30349,25 @@ function join(maybeArray, separator = '') { /** * Given array, print each item on its own line, wrapped in an indented `{ }` block. */ + function block(array) { return wrap('{\n', indent(join(array, '\n')), '\n}'); } /** * If maybeString is not null or empty, then wrap with start and end, otherwise print an empty string. */ + function wrap(start, maybeString, end = '') { return maybeString != null && maybeString !== '' ? start + maybeString + end : ''; } function indent(str) { - return wrap(' ', str.replaceAll('\n', '\n ')); + return wrap(' ', str.replace(/\n/g, '\n ')); } function hasMultilineItems(maybeArray) { var _maybeArray$some; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ return (_maybeArray$some = maybeArray === null || maybeArray === void 0 ? void 0 : maybeArray.some(str => str.includes('\n'))) !== null && _maybeArray$some !== void 0 ? _maybeArray$some : false; } @@ -31390,6 +30388,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.Source = void 0; exports.isSource = isSource; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); /** * A representation of source input to GraphQL. The `name` and `locationOffset` parameters are @@ -31403,6 +30402,7 @@ class Source { line: 1, column: 1 }) { + typeof body === 'string' || (0, _devAssert.devAssert)(false, `Body must be a string. Received: ${(0, _inspect.inspect)(body)}.`); this.body = body; this.name = name; this.locationOffset = locationOffset; @@ -31446,7 +30446,6 @@ var TokenKind; TokenKind['SOF'] = ''; TokenKind['EOF'] = ''; TokenKind['BANG'] = '!'; - TokenKind['QUESTION_MARK'] = '?'; TokenKind['DOLLAR'] = '$'; TokenKind['AMP'] = '&'; TokenKind['PAREN_L'] = '('; @@ -31468,6 +30467,12 @@ var TokenKind; TokenKind['COMMENT'] = 'Comment'; })(TokenKind || (exports.TokenKind = TokenKind = {})); +/** + * The enum type representing the token kinds values. + * + * @deprecated Please use `TokenKind`. Will be remove in v17. + */ + /***/ }), /***/ "../../../node_modules/graphql/language/visitor.mjs": @@ -31483,19 +30488,105 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.BREAK = void 0; exports.getEnterLeaveForKind = getEnterLeaveForKind; +exports.getVisitFn = getVisitFn; exports.visit = visit; exports.visitInParallel = visitInParallel; var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _ast = __webpack_require__(/*! ./ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _kinds = __webpack_require__(/*! ./kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +/** + * A visitor is provided to visit, it contains the collection of + * relevant functions to be called during the visitor's traversal. + */ + const BREAK = exports.BREAK = Object.freeze({}); +/** + * visit() will walk through an AST using a depth-first traversal, calling + * the visitor's enter function at each node in the traversal, and calling the + * leave function after visiting that node and all of its child nodes. + * + * By returning different values from the enter and leave functions, the + * behavior of the visitor can be altered, including skipping over a sub-tree of + * the AST (by returning false), editing the AST by returning a value or null + * to remove the value, or to stop the whole traversal by returning BREAK. + * + * When using visit() to edit an AST, the original AST will not be modified, and + * a new version of the AST with the changes applied will be returned from the + * visit function. + * + * ```ts + * const editedAST = visit(ast, { + * enter(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: skip visiting this node + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * }, + * leave(node, key, parent, path, ancestors) { + * // @return + * // undefined: no action + * // false: no action + * // visitor.BREAK: stop visiting altogether + * // null: delete this node + * // any value: replace this node with the returned value + * } + * }); + * ``` + * + * Alternatively to providing enter() and leave() functions, a visitor can + * instead provide functions named the same as the kinds of AST nodes, or + * enter/leave visitors at a named key, leading to three permutations of the + * visitor API: + * + * 1) Named visitors triggered when entering a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind(node) { + * // enter the "Kind" node + * } + * }) + * ``` + * + * 2) Named visitors that trigger upon entering and leaving a node of a specific kind. + * + * ```ts + * visit(ast, { + * Kind: { + * enter(node) { + * // enter the "Kind" node + * } + * leave(node) { + * // leave the "Kind" node + * } + * } + * }) + * ``` + * + * 3) Generic visitors that trigger upon entering and leaving any node. + * + * ```ts + * visit(ast, { + * enter(node) { + * // enter any node + * }, + * leave(node) { + * // leave any node + * } + * }) + * ``` + */ + function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const enterLeaveMap = new Map(); for (const kind of Object.values(_kinds.Kind)) { enterLeaveMap.set(kind, getEnterLeaveForKind(visitor, kind)); } /* eslint-disable no-undef-init */ + let stack = undefined; let inArray = Array.isArray(root); let keys = [root]; @@ -31507,6 +30598,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { const path = []; const ancestors = []; /* eslint-enable no-undef-init */ + do { index++; const isLeaving = index === keys.length; @@ -31540,7 +30632,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { edits = stack.edits; inArray = stack.inArray; stack = stack.prev; - } else if (parent != null) { + } else if (parent) { key = inArray ? index : keys[index]; node = parent[key]; if (node === null || node === undefined) { @@ -31580,7 +30672,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { if (isLeaving) { path.pop(); } else { - var _visitorKeys$node$kin; + var _node$kind; stack = { inArray, index, @@ -31589,10 +30681,10 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { prev: stack }; inArray = Array.isArray(node); - keys = inArray ? node : (_visitorKeys$node$kin = visitorKeys[node.kind]) !== null && _visitorKeys$node$kin !== void 0 ? _visitorKeys$node$kin : []; + keys = inArray ? node : (_node$kind = visitorKeys[node.kind]) !== null && _node$kind !== void 0 ? _node$kind : []; index = -1; edits = []; - if (parent != null) { + if (parent) { ancestors.push(parent); } parent = node; @@ -31600,7 +30692,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { } while (stack !== undefined); if (edits.length !== 0) { // New root - return edits.at(-1)[1]; + return edits[edits.length - 1][1]; } return root; } @@ -31610,6 +30702,7 @@ function visit(root, visitor, visitorKeys = _ast.QueryDocumentKeys) { * * If a prior visitor edits a node, no following visitors will see that node. */ + function visitInParallel(visitors) { const skipping = new Array(visitors.length).fill(null); const mergedVisitor = Object.create(null); @@ -31622,7 +30715,7 @@ function visitInParallel(visitors) { enter, leave } = getEnterLeaveForKind(visitors[i], kind); - hasVisitor ||= enter != null || leave != null; + hasVisitor || (hasVisitor = enter != null || leave != null); enterList[i] = enter; leaveList[i] = leave; } @@ -31670,6 +30763,7 @@ function visitInParallel(visitors) { /** * Given a visitor instance and a node kind, return EnterLeaveVisitor for that kind. */ + function getEnterLeaveForKind(visitor, kind) { const kindVisitor = visitor[kind]; if (typeof kindVisitor === 'object') { @@ -31681,13 +30775,29 @@ function getEnterLeaveForKind(visitor, kind) { enter: kindVisitor, leave: undefined }; - } - // { enter() {}, leave() {} } + } // { enter() {}, leave() {} } + return { enter: visitor.enter, leave: visitor.leave }; } +/** + * Given a visitor instance, if it is leaving or not, and a node kind, return + * the function the visitor runtime should call. + * + * @deprecated Please use `getEnterLeaveForKind` instead. Will be removed in v17 + */ + +/* c8 ignore next 8 */ + +function getVisitFn(visitor, kind, isLeaving) { + const { + enter, + leave + } = getEnterLeaveForKind(visitor, kind); + return isLeaving ? leave : enter; +} /***/ }), @@ -31704,12 +30814,16 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertEnumValueName = assertEnumValueName; exports.assertName = assertName; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _characterClasses = __webpack_require__(/*! ../language/characterClasses.mjs */ "../../../node_modules/graphql/language/characterClasses.mjs"); /** * Upholds the spec rules about naming. */ + function assertName(name) { + name != null || (0, _devAssert.devAssert)(false, 'Must provide name.'); + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); if (name.length === 0) { throw new _GraphQLError.GraphQLError('Expected name to be a non-empty string.'); } @@ -31728,6 +30842,7 @@ function assertName(name) { * * @internal */ + function assertEnumValueName(name) { if (name === 'true' || name === 'false' || name === 'null') { throw new _GraphQLError.GraphQLError(`Enum values cannot be named: ${name}`); @@ -31796,6 +30911,7 @@ var _didYouMean = __webpack_require__(/*! ../jsutils/didYouMean.mjs */ "../../.. var _identityFunc = __webpack_require__(/*! ../jsutils/identityFunc.mjs */ "../../../node_modules/graphql/jsutils/identityFunc.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); @@ -31818,6 +30934,7 @@ function assertType(type) { /** * There are predicates for each kind of GraphQL type. */ + function isScalarType(type) { return (0, _instanceOf.instanceOf)(type, GraphQLScalarType); } @@ -31890,6 +31007,10 @@ function assertNonNullType(type) { } return type; } +/** + * These types may be used as input types for arguments and directives. + */ + function isInputType(type) { return isScalarType(type) || isEnumType(type) || isInputObjectType(type) || isWrappingType(type) && isInputType(type.ofType); } @@ -31899,6 +31020,10 @@ function assertInputType(type) { } return type; } +/** + * These types may be used as output types as the result of fields. + */ + function isOutputType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isWrappingType(type) && isOutputType(type.ofType); } @@ -31908,6 +31033,10 @@ function assertOutputType(type) { } return type; } +/** + * These types may describe types which may be leaf values. + */ + function isLeafType(type) { return isScalarType(type) || isEnumType(type); } @@ -31917,6 +31046,10 @@ function assertLeafType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isCompositeType(type) { return isObjectType(type) || isInterfaceType(type) || isUnionType(type); } @@ -31926,6 +31059,10 @@ function assertCompositeType(type) { } return type; } +/** + * These types may describe the parent context of a selection set. + */ + function isAbstractType(type) { return isInterfaceType(type) || isUnionType(type); } @@ -31954,8 +31091,10 @@ function assertAbstractType(type) { * }) * ``` */ + class GraphQLList { constructor(ofType) { + isType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -31992,6 +31131,7 @@ class GraphQLList { exports.GraphQLList = GraphQLList; class GraphQLNonNull { constructor(ofType) { + isNullableType(ofType) || (0, _devAssert.devAssert)(false, `Expected ${(0, _inspect.inspect)(ofType)} to be a GraphQL nullable type.`); this.ofType = ofType; } get [Symbol.toStringTag]() { @@ -32004,6 +31144,9 @@ class GraphQLNonNull { return this.toString(); } } +/** + * These types wrap and modify other types + */ exports.GraphQLNonNull = GraphQLNonNull; function isWrappingType(type) { return isListType(type) || isNonNullType(type); @@ -32014,6 +31157,10 @@ function assertWrappingType(type) { } return type; } +/** + * These types can all accept null as a value. + */ + function isNullableType(type) { return isType(type) && !isNonNullType(type); } @@ -32028,6 +31175,10 @@ function getNullableType(type) { return isNonNullType(type) ? type.ofType : type; } } +/** + * These named types do not include modifiers like List or NonNull. + */ + function isNamedType(type) { return isScalarType(type) || isObjectType(type) || isInterfaceType(type) || isUnionType(type) || isEnumType(type) || isInputObjectType(type); } @@ -32046,12 +31197,27 @@ function getNamedType(type) { return unwrappedType; } } +/** + * Used while defining GraphQL types to allow for circular references in + * otherwise immutable type definitions. + */ + function resolveReadonlyArrayThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } function resolveObjMapThunk(thunk) { return typeof thunk === 'function' ? thunk() : thunk; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Scalar Type Definition * @@ -32096,6 +31262,8 @@ class GraphQLScalarType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; + config.specifiedByURL == null || typeof config.specifiedByURL === 'string' || (0, _devAssert.devAssert)(false, `${this.name} must provide "specifiedByURL" as a string, ` + `but got: ${(0, _inspect.inspect)(config.specifiedByURL)}.`); + config.serialize == null || typeof config.serialize === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "serialize" function. If this custom Scalar is also used as an input type, ensure "parseValue" and "parseLiteral" functions are also provided.`); if (config.parseLiteral) { typeof config.parseValue === 'function' && typeof config.parseLiteral === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide both "parseValue" and "parseLiteral" functions.`); } @@ -32123,6 +31291,7 @@ class GraphQLScalarType { return this.toString(); } } + /** * Object Type Definition * @@ -32173,10 +31342,9 @@ class GraphQLObjectType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN2 = config.extensionASTNodes) !== null && _config$extensionASTN2 !== void 0 ? _config$extensionASTN2 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = () => defineFieldMap(config); + this._interfaces = () => defineInterfaces(config); + config.isTypeOf == null || typeof config.isTypeOf === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "isTypeOf" as a function, ` + `but got: ${(0, _inspect.inspect)(config.isTypeOf)}.`); } get [Symbol.toStringTag]() { return 'GraphQLObjectType'; @@ -32213,14 +31381,21 @@ class GraphQLObjectType { } } exports.GraphQLObjectType = GraphQLObjectType; -function defineInterfaces(interfaces) { - return resolveReadonlyArrayThunk(interfaces !== null && interfaces !== void 0 ? interfaces : []); +function defineInterfaces(config) { + var _config$interfaces; + const interfaces = resolveReadonlyArrayThunk((_config$interfaces = config.interfaces) !== null && _config$interfaces !== void 0 ? _config$interfaces : []); + Array.isArray(interfaces) || (0, _devAssert.devAssert)(false, `${config.name} interfaces must be an Array or a function which returns an Array.`); + return interfaces; } -function defineFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); +function defineFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { var _fieldConfig$args; + isPlainObj(fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field config must be an object.`); + fieldConfig.resolve == null || typeof fieldConfig.resolve === 'function' || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field resolver must be a function if ` + `provided, but got: ${(0, _inspect.inspect)(fieldConfig.resolve)}.`); const argsConfig = (_fieldConfig$args = fieldConfig.args) !== null && _fieldConfig$args !== void 0 ? _fieldConfig$args : {}; + isPlainObj(argsConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} args must be an object with argument names as keys.`); return { name: (0, _assertName.assertName)(fieldName), description: fieldConfig.description, @@ -32234,8 +31409,8 @@ function defineFieldMap(fields) { }; }); } -function defineArguments(args) { - return Object.entries(args).map(([argName, argConfig]) => ({ +function defineArguments(config) { + return Object.entries(config).map(([argName, argConfig]) => ({ name: (0, _assertName.assertName)(argName), description: argConfig.description, type: argConfig.type, @@ -32245,6 +31420,9 @@ function defineArguments(args) { astNode: argConfig.astNode })); } +function isPlainObj(obj) { + return (0, _isObjectLike.isObjectLike)(obj) && !Array.isArray(obj); +} function fieldsToFieldsConfig(fields) { return (0, _mapValue.mapValue)(fields, field => ({ description: field.description, @@ -32260,6 +31438,7 @@ function fieldsToFieldsConfig(fields) { /** * @internal */ + function argsToArgsConfig(args) { return (0, _keyValMap.keyValMap)(args, arg => arg.name, arg => ({ description: arg.description, @@ -32273,6 +31452,7 @@ function argsToArgsConfig(args) { function isRequiredArgument(arg) { return isNonNullType(arg.type) && arg.defaultValue === undefined; } + /** * Interface Type Definition * @@ -32301,10 +31481,9 @@ class GraphQLInterfaceType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN3 = config.extensionASTNodes) !== null && _config$extensionASTN3 !== void 0 ? _config$extensionASTN3 : []; - // prettier-ignore - // FIXME: blocked by https://github.com/prettier/prettier/issues/14625 - this._fields = defineFieldMap.bind(undefined, config.fields); - this._interfaces = defineInterfaces.bind(undefined, config.interfaces); + this._fields = defineFieldMap.bind(undefined, config); + this._interfaces = defineInterfaces.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLInterfaceType'; @@ -32340,6 +31519,7 @@ class GraphQLInterfaceType { return this.toString(); } } + /** * Union Type Definition * @@ -32374,7 +31554,8 @@ class GraphQLUnionType { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN4 = config.extensionASTNodes) !== null && _config$extensionASTN4 !== void 0 ? _config$extensionASTN4 : []; - this._types = defineTypes.bind(undefined, config.types); + this._types = defineTypes.bind(undefined, config); + config.resolveType == null || typeof config.resolveType === 'function' || (0, _devAssert.devAssert)(false, `${this.name} must provide "resolveType" as a function, ` + `but got: ${(0, _inspect.inspect)(config.resolveType)}.`); } get [Symbol.toStringTag]() { return 'GraphQLUnionType'; @@ -32404,19 +31585,12 @@ class GraphQLUnionType { } } exports.GraphQLUnionType = GraphQLUnionType; -function defineTypes(types) { - return resolveReadonlyArrayThunk(types); -} -function enumValuesFromConfig(values) { - return Object.entries(values).map(([valueName, valueConfig]) => ({ - name: (0, _assertName.assertEnumValueName)(valueName), - description: valueConfig.description, - value: valueConfig.value !== undefined ? valueConfig.value : valueName, - deprecationReason: valueConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), - astNode: valueConfig.astNode - })); +function defineTypes(config) { + const types = resolveReadonlyArrayThunk(config.types); + Array.isArray(types) || (0, _devAssert.devAssert)(false, `Must provide Array of types or a function which returns such an array for Union ${config.name}.`); + return types; } + /** * Enum Type Definition * @@ -32440,7 +31614,8 @@ function enumValuesFromConfig(values) { * Note: If a value is not provided in a definition, the name of the enum value * will be used as its internal value. */ -class GraphQLEnumType /* */ { +class GraphQLEnumType { + /* */ constructor(config) { var _config$extensionASTN5; this.name = (0, _assertName.assertName)(config.name); @@ -32448,7 +31623,7 @@ class GraphQLEnumType /* */ { this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN5 = config.extensionASTNodes) !== null && _config$extensionASTN5 !== void 0 ? _config$extensionASTN5 : []; - this._values = typeof config.values === 'function' ? config.values : enumValuesFromConfig(config.values); + this._values = typeof config.values === 'function' ? config.values : defineEnumValues(this.name, config.values); this._valueLookup = null; this._nameLookup = null; } @@ -32457,7 +31632,7 @@ class GraphQLEnumType /* */ { } getValues() { if (typeof this._values === 'function') { - this._values = enumValuesFromConfig(this._values()); + this._values = defineEnumValues(this.name, this._values()); } return this._values; } @@ -32467,7 +31642,7 @@ class GraphQLEnumType /* */ { } return this._nameLookup[name]; } - serialize(outputValue /* T */) { + serialize(outputValue) { if (this._valueLookup === null) { this._valueLookup = new Map(this.getValues().map(enumValue => [enumValue.value, enumValue])); } @@ -32477,7 +31652,8 @@ class GraphQLEnumType /* */ { } return enumValue.name; } - parseValue(inputValue) { + parseValue(inputValue) /* T */ + { if (typeof inputValue !== 'string') { const valueStr = (0, _inspect.inspect)(inputValue); throw new _GraphQLError.GraphQLError(`Enum "${this.name}" cannot represent non-string value: ${valueStr}.` + didYouMeanEnumValue(this, valueStr)); @@ -32488,7 +31664,8 @@ class GraphQLEnumType /* */ { } return enumValue.value; } - parseLiteral(valueNode, _variables) { + parseLiteral(valueNode, _variables) /* T */ + { // Note: variables will be resolved to a value before calling this function. if (valueNode.kind !== _kinds.Kind.ENUM) { const valueStr = (0, _printer.print)(valueNode); @@ -32535,6 +31712,21 @@ function didYouMeanEnumValue(enumType, unknownValueStr) { const suggestedValues = (0, _suggestionList.suggestionList)(unknownValueStr, allNames); return (0, _didYouMean.didYouMean)('the enum value', suggestedValues); } +function defineEnumValues(typeName, valueMap) { + isPlainObj(valueMap) || (0, _devAssert.devAssert)(false, `${typeName} values must be an object with value names as keys.`); + return Object.entries(valueMap).map(([valueName, valueConfig]) => { + isPlainObj(valueConfig) || (0, _devAssert.devAssert)(false, `${typeName}.${valueName} must refer to an object with a "value" key ` + `representing an internal value but got: ${(0, _inspect.inspect)(valueConfig)}.`); + return { + name: (0, _assertName.assertEnumValueName)(valueName), + description: valueConfig.description, + value: valueConfig.value !== undefined ? valueConfig.value : valueName, + deprecationReason: valueConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(valueConfig.extensions), + astNode: valueConfig.astNode + }; + }); +} + /** * Input Object Type Definition * @@ -32565,7 +31757,7 @@ class GraphQLInputObjectType { this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN6 = config.extensionASTNodes) !== null && _config$extensionASTN6 !== void 0 ? _config$extensionASTN6 : []; this.isOneOf = (_config$isOneOf = config.isOneOf) !== null && _config$isOneOf !== void 0 ? _config$isOneOf : false; - this._fields = defineInputFieldMap.bind(undefined, config.fields); + this._fields = defineInputFieldMap.bind(undefined, config); } get [Symbol.toStringTag]() { return 'GraphQLInputObjectType'; @@ -32603,17 +31795,21 @@ class GraphQLInputObjectType { } } exports.GraphQLInputObjectType = GraphQLInputObjectType; -function defineInputFieldMap(fields) { - const fieldMap = resolveObjMapThunk(fields); - return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => ({ - name: (0, _assertName.assertName)(fieldName), - description: fieldConfig.description, - type: fieldConfig.type, - defaultValue: fieldConfig.defaultValue, - deprecationReason: fieldConfig.deprecationReason, - extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), - astNode: fieldConfig.astNode - })); +function defineInputFieldMap(config) { + const fieldMap = resolveObjMapThunk(config.fields); + isPlainObj(fieldMap) || (0, _devAssert.devAssert)(false, `${config.name} fields must be an object with field names as keys or a function which returns such an object.`); + return (0, _mapValue.mapValue)(fieldMap, (fieldConfig, fieldName) => { + !('resolve' in fieldConfig) || (0, _devAssert.devAssert)(false, `${config.name}.${fieldName} field has a resolve property, but Input Types cannot define resolvers.`); + return { + name: (0, _assertName.assertName)(fieldName), + description: fieldConfig.description, + type: fieldConfig.type, + defaultValue: fieldConfig.defaultValue, + deprecationReason: fieldConfig.deprecationReason, + extensions: (0, _toObjMap.toObjMap)(fieldConfig.extensions), + astNode: fieldConfig.astNode + }; + }); } function isRequiredInputField(field) { return isNonNullType(field.type) && field.defaultValue === undefined; @@ -32632,13 +31828,15 @@ function isRequiredInputField(field) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.GraphQLStreamDirective = exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.GraphQLDeferDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; +exports.GraphQLSpecifiedByDirective = exports.GraphQLSkipDirective = exports.GraphQLOneOfDirective = exports.GraphQLIncludeDirective = exports.GraphQLDirective = exports.GraphQLDeprecatedDirective = exports.DEFAULT_DEPRECATION_REASON = void 0; exports.assertDirective = assertDirective; exports.isDirective = isDirective; exports.isSpecifiedDirective = isSpecifiedDirective; exports.specifiedDirectives = void 0; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _directiveLocation = __webpack_require__(/*! ../language/directiveLocation.mjs */ "../../../node_modules/graphql/language/directiveLocation.mjs"); var _assertName = __webpack_require__(/*! ./assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); @@ -32647,6 +31845,7 @@ var _scalars = __webpack_require__(/*! ./scalars.mjs */ "../../../node_modules/g /** * Test if the given value is a GraphQL directive. */ + function isDirective(directive) { return (0, _instanceOf.instanceOf)(directive, GraphQLDirective); } @@ -32656,6 +31855,16 @@ function assertDirective(directive) { } return directive; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Directives are used by the GraphQL runtime as a way of modifying execution * behavior. Type system creators will usually not create these directly. @@ -32669,7 +31878,9 @@ class GraphQLDirective { this.isRepeatable = (_config$isRepeatable = config.isRepeatable) !== null && _config$isRepeatable !== void 0 ? _config$isRepeatable : false; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; + Array.isArray(config.locations) || (0, _devAssert.devAssert)(false, `@${config.name} locations must be an Array.`); const args = (_config$args = config.args) !== null && _config$args !== void 0 ? _config$args : {}; + (0, _isObjectLike.isObjectLike)(args) && !Array.isArray(args) || (0, _devAssert.devAssert)(false, `@${config.name} args must be an object with argument names as keys.`); this.args = (0, _definition.defineArguments)(args); } get [Symbol.toStringTag]() { @@ -32693,6 +31904,7 @@ class GraphQLDirective { return this.toString(); } } + /** * Used to conditionally include fields or fragments. */ @@ -32711,6 +31923,7 @@ const GraphQLIncludeDirective = exports.GraphQLIncludeDirective = new GraphQLDir /** * Used to conditionally skip (exclude) fields or fragments. */ + const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective({ name: 'skip', description: 'Directs the executor to skip this field or fragment when the `if` argument is true.', @@ -32722,56 +31935,15 @@ const GraphQLSkipDirective = exports.GraphQLSkipDirective = new GraphQLDirective } } }); -/** - * Used to conditionally defer fragments. - */ -const GraphQLDeferDirective = exports.GraphQLDeferDirective = new GraphQLDirective({ - name: 'defer', - description: 'Directs the executor to defer this fragment when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FRAGMENT_SPREAD, _directiveLocation.DirectiveLocation.INLINE_FRAGMENT], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Deferred when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - } - } -}); -/** - * Used to conditionally stream list fields. - */ -const GraphQLStreamDirective = exports.GraphQLStreamDirective = new GraphQLDirective({ - name: 'stream', - description: 'Directs the executor to stream plural fields when the `if` argument is true or undefined.', - locations: [_directiveLocation.DirectiveLocation.FIELD], - args: { - if: { - type: new _definition.GraphQLNonNull(_scalars.GraphQLBoolean), - description: 'Stream when true or undefined.', - defaultValue: true - }, - label: { - type: _scalars.GraphQLString, - description: 'Unique name' - }, - initialCount: { - defaultValue: 0, - type: _scalars.GraphQLInt, - description: 'Number of items to return immediately' - } - } -}); /** * Constant string used for default reason for a deprecation. */ + const DEFAULT_DEPRECATION_REASON = exports.DEFAULT_DEPRECATION_REASON = 'No longer supported'; /** * Used to declare element of a GraphQL schema as deprecated. */ + const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new GraphQLDirective({ name: 'deprecated', description: 'Marks an element of a GraphQL schema as no longer supported.', @@ -32787,6 +31959,7 @@ const GraphQLDeprecatedDirective = exports.GraphQLDeprecatedDirective = new Grap /** * Used to provide a URL for specifying the behavior of custom scalar definitions. */ + const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new GraphQLDirective({ name: 'specifiedBy', description: 'Exposes a URL that specifies the behavior of this scalar.', @@ -32801,6 +31974,7 @@ const GraphQLSpecifiedByDirective = exports.GraphQLSpecifiedByDirective = new Gr /** * Used to indicate an Input Object is a OneOf Input Object. */ + const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirective({ name: 'oneOf', description: 'Indicates exactly one field must be supplied and this field must not be `null`.', @@ -32810,6 +31984,7 @@ const GraphQLOneOfDirective = exports.GraphQLOneOfDirective = new GraphQLDirecti /** * The full list of specified directives. */ + const specifiedDirectives = exports.specifiedDirectives = Object.freeze([GraphQLIncludeDirective, GraphQLSkipDirective, GraphQLDeprecatedDirective, GraphQLSpecifiedByDirective, GraphQLOneOfDirective]); function isSpecifiedDirective(directive) { return specifiedDirectives.some(({ @@ -32854,12 +32029,6 @@ Object.defineProperty(exports, "GraphQLBoolean", ({ return _scalars.GraphQLBoolean; } })); -Object.defineProperty(exports, "GraphQLDeferDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLDeferDirective; - } -})); Object.defineProperty(exports, "GraphQLDeprecatedDirective", ({ enumerable: true, get: function () { @@ -32962,12 +32131,6 @@ Object.defineProperty(exports, "GraphQLSpecifiedByDirective", ({ return _directives.GraphQLSpecifiedByDirective; } })); -Object.defineProperty(exports, "GraphQLStreamDirective", ({ - enumerable: true, - get: function () { - return _directives.GraphQLStreamDirective; - } -})); Object.defineProperty(exports, "GraphQLString", ({ enumerable: true, get: function () { @@ -33474,7 +32637,7 @@ const __Directive = exports.__Directive = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } } }) @@ -33594,6 +32757,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered) + false || (0, _invariant.invariant)(false, `Unexpected type: "${(0, _inspect.inspect)(type)}".`); } }, @@ -33603,9 +32767,8 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }, description: { type: _scalars.GraphQLString, - resolve: type => - // FIXME: add test case - /* c8 ignore next */ + resolve: (type // FIXME: add test case + ) => /* c8 ignore next */ 'description' in type ? type.description : undefined }, specifiedByURL: { @@ -33625,7 +32788,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const fields = Object.values(type.getFields()); - return includeDeprecated === true ? fields : fields.filter(field => field.deprecationReason == null); + return includeDeprecated ? fields : fields.filter(field => field.deprecationReason == null); } } }, @@ -33660,7 +32823,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isEnumType)(type)) { const values = type.getValues(); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33677,7 +32840,7 @@ const __Type = exports.__Type = new _definition.GraphQLObjectType({ }) { if ((0, _definition.isInputObjectType)(type)) { const values = Object.values(type.getFields()); - return includeDeprecated === true ? values : values.filter(field => field.deprecationReason == null); + return includeDeprecated ? values : values.filter(field => field.deprecationReason == null); } } }, @@ -33718,7 +32881,7 @@ const __Field = exports.__Field = new _definition.GraphQLObjectType({ resolve(field, { includeDeprecated }) { - return includeDeprecated === true ? field.args : field.args.filter(arg => arg.deprecationReason == null); + return includeDeprecated ? field.args : field.args.filter(arg => arg.deprecationReason == null); } }, type: { @@ -33848,6 +33011,7 @@ const __TypeKind = exports.__TypeKind = new _definition.GraphQLEnumType({ * Note that these are GraphQLField and not GraphQLFieldConfig, * so the format for args is different. */ + const SchemaMetaFieldDef = exports.SchemaMetaFieldDef = { name: '__schema', type: new _definition.GraphQLNonNull(__Schema), @@ -33927,11 +33091,13 @@ var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_mod * Maximum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe up-to 2^53 - 1 * */ + const GRAPHQL_MAX_INT = exports.GRAPHQL_MAX_INT = 2147483647; /** * Minimum possible Int value as per GraphQL Spec (32-bit signed integer). * n.b. This differs from JavaScript's numbers that are IEEE 754 doubles safe starting at -(2^53 - 1) * */ + const GRAPHQL_MIN_INT = exports.GRAPHQL_MIN_INT = -2147483648; const GraphQLInt = exports.GraphQLInt = new _definition.GraphQLScalarType({ name: 'Int', @@ -34002,9 +33168,7 @@ const GraphQLFloat = exports.GraphQLFloat = new _definition.GraphQLScalarType({ }, parseLiteral(valueNode) { if (valueNode.kind !== _kinds.Kind.FLOAT && valueNode.kind !== _kinds.Kind.INT) { - throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, { - nodes: valueNode - }); + throw new _GraphQLError.GraphQLError(`Float cannot represent non numeric value: ${(0, _printer.print)(valueNode)}`, valueNode); } return parseFloat(valueNode.value); } @@ -34013,9 +33177,9 @@ const GraphQLString = exports.GraphQLString = new _definition.GraphQLScalarType( name: 'String', description: 'The `String` scalar type represents textual data, represented as UTF-8 character sequences. The String type is most often used by GraphQL to represent free-form human-readable text.', serialize(outputValue) { - const coercedValue = serializeObject(outputValue); - // Serialize string, boolean and number values to a string, but do not + const coercedValue = serializeObject(outputValue); // Serialize string, boolean and number values to a string, but do not // attempt to coerce object, function, symbol, or other types as strings. + if (typeof coercedValue === 'string') { return coercedValue; } @@ -34106,10 +33270,10 @@ function isSpecifiedScalarType(type) { return specifiedScalarTypes.some(({ name }) => type.name === name); -} -// Support serializing objects with custom valueOf() or toJSON() functions - +} // Support serializing objects with custom valueOf() or toJSON() functions - // a common way to represent a complex value which can be represented as // a string (ex: MongoDB id objects). + function serializeObject(outputValue) { if ((0, _isObjectLike.isObjectLike)(outputValue)) { if (typeof outputValue.valueOf === 'function') { @@ -34141,8 +33305,10 @@ Object.defineProperty(exports, "__esModule", ({ exports.GraphQLSchema = void 0; exports.assertSchema = assertSchema; exports.isSchema = isSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _instanceOf = __webpack_require__(/*! ../jsutils/instanceOf.mjs */ "../../../node_modules/graphql/jsutils/instanceOf.mjs"); +var _isObjectLike = __webpack_require__(/*! ../jsutils/isObjectLike.mjs */ "../../../node_modules/graphql/jsutils/isObjectLike.mjs"); var _toObjMap = __webpack_require__(/*! ../jsutils/toObjMap.mjs */ "../../../node_modules/graphql/jsutils/toObjMap.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); var _definition = __webpack_require__(/*! ./definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); @@ -34151,6 +33317,7 @@ var _introspection = __webpack_require__(/*! ./introspection.mjs */ "../../../no /** * Test if the given value is a GraphQL schema. */ + function isSchema(schema) { return (0, _instanceOf.instanceOf)(schema, GraphQLSchema); } @@ -34160,6 +33327,16 @@ function assertSchema(schema) { } return schema; } +/** + * Custom extensions + * + * @remarks + * Use a unique identifier name for your extension, for example the name of + * your library or project. Do not use a shortened identifier as this increases + * the risk of conflicts. We recommend you add at most one extension field, + * an object which can contain all the values you need. + */ + /** * Schema Definition * @@ -34229,22 +33406,28 @@ function assertSchema(schema) { * ``` */ class GraphQLSchema { + // Used as a cache for validateSchema(). constructor(config) { var _config$extensionASTN, _config$directives; + // If this schema was built from a source known to be valid, then it may be // marked with assumeValid to avoid an additional type system validation. - this.__validationErrors = config.assumeValid === true ? [] : undefined; + this.__validationErrors = config.assumeValid === true ? [] : undefined; // Check for common mistakes during construction to produce early errors. + + (0, _isObjectLike.isObjectLike)(config) || (0, _devAssert.devAssert)(false, 'Must provide configuration object.'); + !config.types || Array.isArray(config.types) || (0, _devAssert.devAssert)(false, `"types" must be Array if provided but got: ${(0, _inspect.inspect)(config.types)}.`); + !config.directives || Array.isArray(config.directives) || (0, _devAssert.devAssert)(false, '"directives" must be Array if provided but got: ' + `${(0, _inspect.inspect)(config.directives)}.`); this.description = config.description; this.extensions = (0, _toObjMap.toObjMap)(config.extensions); this.astNode = config.astNode; this.extensionASTNodes = (_config$extensionASTN = config.extensionASTNodes) !== null && _config$extensionASTN !== void 0 ? _config$extensionASTN : []; this._queryType = config.query; this._mutationType = config.mutation; - this._subscriptionType = config.subscription; - // Provide specified directives (e.g. @include and @skip) by default. - this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; - // To preserve order of user-provided types, we add first to add them to + this._subscriptionType = config.subscription; // Provide specified directives (e.g. @include and @skip) by default. + + this._directives = (_config$directives = config.directives) !== null && _config$directives !== void 0 ? _config$directives : _directives.specifiedDirectives; // To preserve order of user-provided types, we add first to add them to // the set of "collected" types, so `collectReferencedTypes` ignore them. + const allReferencedTypes = new Set(config.types); if (config.types != null) { for (const type of config.types) { @@ -34271,17 +33454,18 @@ class GraphQLSchema { } } } - collectReferencedTypes(_introspection.__Schema, allReferencedTypes); - // Storing the resulting map for reference by the schema. + collectReferencedTypes(_introspection.__Schema, allReferencedTypes); // Storing the resulting map for reference by the schema. + this._typeMap = Object.create(null); - this._subTypeMap = new Map(); - // Keep track of all implementations by interface name. + this._subTypeMap = Object.create(null); // Keep track of all implementations by interface name. + this._implementationsMap = Object.create(null); for (const namedType of allReferencedTypes) { if (namedType == null) { continue; } const typeName = namedType.name; + typeName || (0, _devAssert.devAssert)(false, 'One of the provided types for building the Schema is missing a name.'); if (this._typeMap[typeName] !== undefined) { throw new Error(`Schema must contain uniquely named types but contains multiple types named "${typeName}".`); } @@ -34356,17 +33540,25 @@ class GraphQLSchema { }; } isSubType(abstractType, maybeSubType) { - let set = this._subTypeMap.get(abstractType); - if (set === undefined) { + let map = this._subTypeMap[abstractType.name]; + if (map === undefined) { + map = Object.create(null); if ((0, _definition.isUnionType)(abstractType)) { - set = new Set(abstractType.getTypes()); + for (const type of abstractType.getTypes()) { + map[type.name] = true; + } } else { const implementations = this.getImplementations(abstractType); - set = new Set([...implementations.objects, ...implementations.interfaces]); + for (const type of implementations.objects) { + map[type.name] = true; + } + for (const type of implementations.interfaces) { + map[type.name] = true; + } } - this._subTypeMap.set(abstractType, set); + this._subTypeMap[abstractType.name] = map; } - return set.has(maybeSubType); + return map[maybeSubType.name] !== undefined; } getDirectives() { return this._directives; @@ -34374,33 +33566,6 @@ class GraphQLSchema { getDirective(name) { return this.getDirectives().find(directive => directive.name === name); } - /** - * This method looks up the field on the given type definition. - * It has special casing for the three introspection fields, `__schema`, - * `__type` and `__typename`. - * - * `__typename` is special because it can always be queried as a field, even - * in situations where no other fields are allowed, like on a Union. - * - * `__schema` and `__type` could get automatically added to the query type, - * but that would require mutating type definitions, which would cause issues. - */ - getField(parentType, fieldName) { - switch (fieldName) { - case _introspection.SchemaMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.SchemaMetaFieldDef : undefined; - case _introspection.TypeMetaFieldDef.name: - return this.getQueryType() === parentType ? _introspection.TypeMetaFieldDef : undefined; - case _introspection.TypeNameMetaFieldDef.name: - return _introspection.TypeNameMetaFieldDef; - } - // this function is part "hot" path inside executor and check presence - // of 'getFields' is faster than to use `!isUnionType` - if ('getFields' in parentType) { - return parentType.getFields()[fieldName]; - } - return undefined; - } toConfig() { return { description: this.description, @@ -34459,9 +33624,6 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.assertValidSchema = assertValidSchema; exports.validateSchema = validateSchema; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); -var _capitalize = __webpack_require__(/*! ../jsutils/capitalize.mjs */ "../../../node_modules/graphql/jsutils/capitalize.mjs"); -var _formatList = __webpack_require__(/*! ../jsutils/formatList.mjs */ "../../../node_modules/graphql/jsutils/formatList.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); @@ -34477,20 +33639,21 @@ var _schema = __webpack_require__(/*! ./schema.mjs */ "../../../node_modules/gra * Validation runs synchronously, returning an array of encountered errors, or * an empty array if no errors were encountered and the Schema is valid. */ + function validateSchema(schema) { // First check to ensure the provided value is in fact a GraphQLSchema. - (0, _schema.assertSchema)(schema); - // If this Schema has already been validated, return the previous results. + (0, _schema.assertSchema)(schema); // If this Schema has already been validated, return the previous results. + if (schema.__validationErrors) { return schema.__validationErrors; - } - // Validate the schema, producing a list of errors. + } // Validate the schema, producing a list of errors. + const context = new SchemaValidationContext(schema); validateRootTypes(context); validateDirectives(context); - validateTypes(context); - // Persist the results of validation before returning to ensure validation + validateTypes(context); // Persist the results of validation before returning to ensure validation // does not run multiple times for this schema. + const errors = context.getErrors(); schema.__validationErrors = errors; return errors; @@ -34499,6 +33662,7 @@ function validateSchema(schema) { * Utility function which asserts a schema is valid by throwing an error if * it is invalid. */ + function assertValidSchema(schema) { const errors = validateSchema(schema); if (errors.length !== 0) { @@ -34522,28 +33686,22 @@ class SchemaValidationContext { } function validateRootTypes(context) { const schema = context.schema; - if (schema.getQueryType() == null) { + const queryType = schema.getQueryType(); + if (!queryType) { context.reportError('Query root type must be provided.', schema.astNode); + } else if (!(0, _definition.isObjectType)(queryType)) { + var _getOperationTypeNode; + context.reportError(`Query root type must be Object type, it cannot be ${(0, _inspect.inspect)(queryType)}.`, (_getOperationTypeNode = getOperationTypeNode(schema, _ast.OperationTypeNode.QUERY)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : queryType.astNode); } - const rootTypesMap = new _AccumulatorMap.AccumulatorMap(); - for (const operationType of Object.values(_ast.OperationTypeNode)) { - const rootType = schema.getRootType(operationType); - if (rootType != null) { - if (!(0, _definition.isObjectType)(rootType)) { - var _getOperationTypeNode; - const operationTypeStr = (0, _capitalize.capitalize)(operationType); - const rootTypeStr = (0, _inspect.inspect)(rootType); - context.reportError(operationType === _ast.OperationTypeNode.QUERY ? `${operationTypeStr} root type must be Object type, it cannot be ${rootTypeStr}.` : `${operationTypeStr} root type must be Object type if provided, it cannot be ${rootTypeStr}.`, (_getOperationTypeNode = getOperationTypeNode(schema, operationType)) !== null && _getOperationTypeNode !== void 0 ? _getOperationTypeNode : rootType.astNode); - } else { - rootTypesMap.add(rootType, operationType); - } - } + const mutationType = schema.getMutationType(); + if (mutationType && !(0, _definition.isObjectType)(mutationType)) { + var _getOperationTypeNode2; + context.reportError('Mutation root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(mutationType)}.`, (_getOperationTypeNode2 = getOperationTypeNode(schema, _ast.OperationTypeNode.MUTATION)) !== null && _getOperationTypeNode2 !== void 0 ? _getOperationTypeNode2 : mutationType.astNode); } - for (const [rootType, operationTypes] of rootTypesMap) { - if (operationTypes.length > 1) { - const operationList = (0, _formatList.andList)(operationTypes); - context.reportError(`All root types must be different, "${rootType.name}" type is used as ${operationList} root types.`, operationTypes.map(operationType => getOperationTypeNode(schema, operationType))); - } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && !(0, _definition.isObjectType)(subscriptionType)) { + var _getOperationTypeNode3; + context.reportError('Subscription root type must be Object type if provided, it cannot be ' + `${(0, _inspect.inspect)(subscriptionType)}.`, (_getOperationTypeNode3 = getOperationTypeNode(schema, _ast.OperationTypeNode.SUBSCRIPTION)) !== null && _getOperationTypeNode3 !== void 0 ? _getOperationTypeNode3 : subscriptionType.astNode); } } function getOperationTypeNode(schema, operation) { @@ -34552,7 +33710,9 @@ function getOperationTypeNode(schema, operation) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 schemaNode => { var _schemaNode$operation; - return /* c8 ignore next */(_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : []; + return /* c8 ignore next */( + (_schemaNode$operation = schemaNode === null || schemaNode === void 0 ? void 0 : schemaNode.operationTypes) !== null && _schemaNode$operation !== void 0 ? _schemaNode$operation : [] + ); }).find(operationNode => operationNode.operation === operation)) === null || _flatMap$find === void 0 ? void 0 : _flatMap$find.type; } function validateDirectives(context) { @@ -34561,17 +33721,15 @@ function validateDirectives(context) { if (!(0, _directives.isDirective)(directive)) { context.reportError(`Expected directive but got: ${(0, _inspect.inspect)(directive)}.`, directive === null || directive === void 0 ? void 0 : directive.astNode); continue; - } - // Ensure they are named correctly. - validateName(context, directive); - if (directive.locations.length === 0) { - context.reportError(`Directive @${directive.name} must include 1 or more locations.`, directive.astNode); - } + } // Ensure they are named correctly. + + validateName(context, directive); // TODO: Ensure proper locations. // Ensure the arguments are valid. + for (const arg of directive.args) { // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type. + validateName(context, arg); // Ensure the type is an input type. + if (!(0, _definition.isInputType)(arg.type)) { context.reportError(`The type of @${directive.name}(${arg.name}:) must be Input Type ` + `but got: ${(0, _inspect.inspect)(arg.type)}.`, arg.astNode); } @@ -34596,20 +33754,20 @@ function validateTypes(context) { if (!(0, _definition.isNamedType)(type)) { context.reportError(`Expected GraphQL named type but got: ${(0, _inspect.inspect)(type)}.`, type.astNode); continue; - } - // Ensure it is named correctly (excluding introspection types). + } // Ensure it is named correctly (excluding introspection types). + if (!(0, _introspection.isIntrospectionType)(type)) { validateName(context, type); } if ((0, _definition.isObjectType)(type)) { // Ensure fields are valid - validateFields(context, type); - // Ensure objects implement the interfaces they claim to. + validateFields(context, type); // Ensure objects implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isInterfaceType)(type)) { // Ensure fields are valid. - validateFields(context, type); - // Ensure interfaces implement the interfaces they claim to. + validateFields(context, type); // Ensure interfaces implement the interfaces they claim to. + validateInterfaces(context, type); } else if ((0, _definition.isUnionType)(type)) { // Ensure Unions include valid member types. @@ -34619,32 +33777,32 @@ function validateTypes(context) { validateEnumValues(context, type); } else if ((0, _definition.isInputObjectType)(type)) { // Ensure Input Object fields are valid. - validateInputFields(context, type); - // Ensure Input Objects do not contain non-nullable circular references + validateInputFields(context, type); // Ensure Input Objects do not contain non-nullable circular references + validateInputObjectCircularRefs(type); } } } function validateFields(context, type) { - const fields = Object.values(type.getFields()); - // Objects and Interfaces both must define one or more fields. + const fields = Object.values(type.getFields()); // Objects and Interfaces both must define one or more fields. + if (fields.length === 0) { context.reportError(`Type ${type.name} must define one or more fields.`, [type.astNode, ...type.extensionASTNodes]); } for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an output type + validateName(context, field); // Ensure the type is an output type + if (!(0, _definition.isOutputType)(field.type)) { var _field$astNode; context.reportError(`The type of ${type.name}.${field.name} must be Output Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode = field.astNode) === null || _field$astNode === void 0 ? void 0 : _field$astNode.type); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const arg of field.args) { - const argName = arg.name; - // Ensure they are named correctly. - validateName(context, arg); - // Ensure the type is an input type + const argName = arg.name; // Ensure they are named correctly. + + validateName(context, arg); // Ensure the type is an input type + if (!(0, _definition.isInputType)(arg.type)) { var _arg$astNode2; context.reportError(`The type of ${type.name}.${field.name}(${argName}:) must be Input ` + `Type but got: ${(0, _inspect.inspect)(arg.type)}.`, (_arg$astNode2 = arg.astNode) === null || _arg$astNode2 === void 0 ? void 0 : _arg$astNode2.type); @@ -34657,7 +33815,7 @@ function validateFields(context, type) { } } function validateInterfaces(context, type) { - const ifaceTypeNames = new Set(); + const ifaceTypeNames = Object.create(null); for (const iface of type.getInterfaces()) { if (!(0, _definition.isInterfaceType)(iface)) { context.reportError(`Type ${(0, _inspect.inspect)(type)} must only implement Interface types, ` + `it cannot implement ${(0, _inspect.inspect)(iface)}.`, getAllImplementsInterfaceNodes(type, iface)); @@ -34667,51 +33825,50 @@ function validateInterfaces(context, type) { context.reportError(`Type ${type.name} cannot implement itself because it would create a circular reference.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - if (ifaceTypeNames.has(iface.name)) { + if (ifaceTypeNames[iface.name]) { context.reportError(`Type ${type.name} can only implement ${iface.name} once.`, getAllImplementsInterfaceNodes(type, iface)); continue; } - ifaceTypeNames.add(iface.name); + ifaceTypeNames[iface.name] = true; validateTypeImplementsAncestors(context, type, iface); validateTypeImplementsInterface(context, type, iface); } } function validateTypeImplementsInterface(context, type, iface) { - const typeFieldMap = type.getFields(); - // Assert each interface field is implemented. + const typeFieldMap = type.getFields(); // Assert each interface field is implemented. + for (const ifaceField of Object.values(iface.getFields())) { const fieldName = ifaceField.name; - const typeField = typeFieldMap[fieldName]; - // Assert interface field exists on type. - if (typeField == null) { + const typeField = typeFieldMap[fieldName]; // Assert interface field exists on type. + + if (!typeField) { context.reportError(`Interface field ${iface.name}.${fieldName} expected but ${type.name} does not provide it.`, [ifaceField.astNode, type.astNode, ...type.extensionASTNodes]); continue; - } - // Assert interface field type is satisfied by type field type, by being + } // Assert interface field type is satisfied by type field type, by being // a valid subtype. (covariant) + if (!(0, _typeComparators.isTypeSubTypeOf)(context.schema, typeField.type, ifaceField.type)) { var _ifaceField$astNode, _typeField$astNode; context.reportError(`Interface field ${iface.name}.${fieldName} expects type ` + `${(0, _inspect.inspect)(ifaceField.type)} but ${type.name}.${fieldName} ` + `is type ${(0, _inspect.inspect)(typeField.type)}.`, [(_ifaceField$astNode = ifaceField.astNode) === null || _ifaceField$astNode === void 0 ? void 0 : _ifaceField$astNode.type, (_typeField$astNode = typeField.astNode) === null || _typeField$astNode === void 0 ? void 0 : _typeField$astNode.type]); - } - // Assert each interface field arg is implemented. + } // Assert each interface field arg is implemented. + for (const ifaceArg of ifaceField.args) { const argName = ifaceArg.name; - const typeArg = typeField.args.find(arg => arg.name === argName); - // Assert interface field arg exists on object field. + const typeArg = typeField.args.find(arg => arg.name === argName); // Assert interface field arg exists on object field. + if (!typeArg) { context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) expected but ${type.name}.${fieldName} does not provide it.`, [ifaceArg.astNode, typeField.astNode]); continue; - } - // Assert interface field arg type matches object field arg type. + } // Assert interface field arg type matches object field arg type. // (invariant) // TODO: change to contravariant? + if (!(0, _typeComparators.isEqualType)(ifaceArg.type, typeArg.type)) { var _ifaceArg$astNode, _typeArg$astNode; context.reportError(`Interface field argument ${iface.name}.${fieldName}(${argName}:) ` + `expects type ${(0, _inspect.inspect)(ifaceArg.type)} but ` + `${type.name}.${fieldName}(${argName}:) is type ` + `${(0, _inspect.inspect)(typeArg.type)}.`, [(_ifaceArg$astNode = ifaceArg.astNode) === null || _ifaceArg$astNode === void 0 ? void 0 : _ifaceArg$astNode.type, (_typeArg$astNode = typeArg.astNode) === null || _typeArg$astNode === void 0 ? void 0 : _typeArg$astNode.type]); - } - // TODO: validate default values? - } - // Assert additional arguments must not be required. + } // TODO: validate default values? + } // Assert additional arguments must not be required. + for (const typeArg of typeField.args) { const argName = typeArg.name; const ifaceArg = ifaceField.args.find(arg => arg.name === argName); @@ -34734,13 +33891,13 @@ function validateUnionMembers(context, union) { if (memberTypes.length === 0) { context.reportError(`Union type ${union.name} must define one or more member types.`, [union.astNode, ...union.extensionASTNodes]); } - const includedTypeNames = new Set(); + const includedTypeNames = Object.create(null); for (const memberType of memberTypes) { - if (includedTypeNames.has(memberType.name)) { + if (includedTypeNames[memberType.name]) { context.reportError(`Union type ${union.name} can only include type ${memberType.name} once.`, getUnionMemberTypeNodes(union, memberType.name)); continue; } - includedTypeNames.add(memberType.name); + includedTypeNames[memberType.name] = true; if (!(0, _definition.isObjectType)(memberType)) { context.reportError(`Union type ${union.name} can only include Object types, ` + `it cannot include ${(0, _inspect.inspect)(memberType)}.`, getUnionMemberTypeNodes(union, String(memberType))); } @@ -34760,12 +33917,12 @@ function validateInputFields(context, inputObj) { const fields = Object.values(inputObj.getFields()); if (fields.length === 0) { context.reportError(`Input Object type ${inputObj.name} must define one or more fields.`, [inputObj.astNode, ...inputObj.extensionASTNodes]); - } - // Ensure the arguments are valid + } // Ensure the arguments are valid + for (const field of fields) { // Ensure they are named correctly. - validateName(context, field); - // Ensure the type is an input type + validateName(context, field); // Ensure the type is an input type + if (!(0, _definition.isInputType)(field.type)) { var _field$astNode2; context.reportError(`The type of ${inputObj.name}.${field.name} must be Input Type ` + `but got: ${(0, _inspect.inspect)(field.type)}.`, (_field$astNode2 = field.astNode) === null || _field$astNode2 === void 0 ? void 0 : _field$astNode2.type); @@ -34792,20 +33949,20 @@ function createInputObjectCircularRefsValidator(context) { // Modified copy of algorithm from 'src/validation/rules/NoFragmentCycles.js'. // Tracks already visited types to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedTypes = new Set(); - // Array of types nodes used to produce meaningful errors - const fieldPath = []; - // Position in the type path + const visitedTypes = Object.create(null); // Array of types nodes used to produce meaningful errors + + const fieldPath = []; // Position in the type path + const fieldPathIndexByTypeName = Object.create(null); - return detectCycleRecursive; - // This does a straight-forward DFS to find cycles. + return detectCycleRecursive; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(inputObj) { - if (visitedTypes.has(inputObj)) { + if (visitedTypes[inputObj.name]) { return; } - visitedTypes.add(inputObj); + visitedTypes[inputObj.name] = true; fieldPathIndexByTypeName[inputObj.name] = fieldPath.length; const fields = Object.values(inputObj.getFields()); for (const field of fields) { @@ -34831,11 +33988,13 @@ function getAllImplementsInterfaceNodes(type, iface) { astNode, extensionASTNodes } = type; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(typeNode => { var _typeNode$interfaces; - return /* c8 ignore next */(_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : []; + return /* c8 ignore next */( + (_typeNode$interfaces = typeNode.interfaces) !== null && _typeNode$interfaces !== void 0 ? _typeNode$interfaces : [] + ); }).filter(ifaceNode => ifaceNode.name.value === iface.name); } function getUnionMemberTypeNodes(union, typeName) { @@ -34843,11 +34002,13 @@ function getUnionMemberTypeNodes(union, typeName) { astNode, extensionASTNodes } = union; - const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const nodes = astNode != null ? [astNode, ...extensionASTNodes] : extensionASTNodes; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + return nodes.flatMap(unionNode => { var _unionNode$types; - return /* c8 ignore next */(_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : []; + return /* c8 ignore next */( + (_unionNode$types = unionNode.types) !== null && _unionNode$types !== void 0 ? _unionNode$types : [] + ); }).filter(typeNode => typeNode.name.value === typeName); } function getDeprecatedDirectiveNode(definitionNode) { @@ -34874,12 +34035,14 @@ var _ast = __webpack_require__(/*! ../language/ast.mjs */ "../../../node_modules var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); +var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); var _typeFromAST = __webpack_require__(/*! ./typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); /** * TypeInfo is a utility class which, given a GraphQL schema, can keep track * of the current field and type definitions at any point in a GraphQL document * AST during a recursive descent by calling `enter(node)` and `leave(node)`. */ + class TypeInfo { constructor(schema, /** @@ -34914,22 +34077,34 @@ class TypeInfo { return 'TypeInfo'; } getType() { - return this._typeStack.at(-1); + if (this._typeStack.length > 0) { + return this._typeStack[this._typeStack.length - 1]; + } } getParentType() { - return this._parentTypeStack.at(-1); + if (this._parentTypeStack.length > 0) { + return this._parentTypeStack[this._parentTypeStack.length - 1]; + } } getInputType() { - return this._inputTypeStack.at(-1); + if (this._inputTypeStack.length > 0) { + return this._inputTypeStack[this._inputTypeStack.length - 1]; + } } getParentInputType() { - return this._inputTypeStack.at(-2); + if (this._inputTypeStack.length > 1) { + return this._inputTypeStack[this._inputTypeStack.length - 2]; + } } getFieldDef() { - return this._fieldDefStack.at(-1); + if (this._fieldDefStack.length > 0) { + return this._fieldDefStack[this._fieldDefStack.length - 1]; + } } getDefaultValue() { - return this._defaultValueStack.at(-1); + if (this._defaultValueStack.length > 0) { + return this._defaultValueStack[this._defaultValueStack.length - 1]; + } } getDirective() { return this._directive; @@ -34941,11 +34116,11 @@ class TypeInfo { return this._enumValue; } enter(node) { - const schema = this._schema; - // Note: many of the types below are explicitly typed as "unknown" to drop + const schema = this._schema; // Note: many of the types below are explicitly typed as "unknown" to drop // any assumptions of a valid schema to ensure runtime types are properly // checked before continuing since TypeInfo is used as part of validation // which occurs before guarantees of schema and document validity. + switch (node.kind) { case _kinds.Kind.SELECTION_SET: { @@ -35011,8 +34186,8 @@ class TypeInfo { case _kinds.Kind.LIST: { const listType = (0, _definition.getNullableType)(this.getInputType()); - const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; - // List positions never have a default value. + const itemType = (0, _definition.isListType)(listType) ? listType.ofType : listType; // List positions never have a default value. + this._defaultValueStack.push(undefined); this._inputTypeStack.push((0, _definition.isInputType)(itemType) ? itemType : undefined); break; @@ -35024,7 +34199,7 @@ class TypeInfo { let inputField; if ((0, _definition.isInputObjectType)(objectType)) { inputField = objectType.getFields()[node.name.value]; - if (inputField != null) { + if (inputField) { inputFieldType = inputField.type; } } @@ -35042,8 +34217,7 @@ class TypeInfo { this._enumValue = enumValue; break; } - default: - // Ignore other nodes + default: // Ignore other nodes } } leave(node) { @@ -35079,19 +34253,37 @@ class TypeInfo { case _kinds.Kind.ENUM: this._enumValue = null; break; - default: - // Ignore other nodes + default: // Ignore other nodes } } } + +/** + * Not exactly the same as the executor's definition of getFieldDef, in this + * statically evaluated environment we do not always have an Object type, + * and need to handle Interface and Union types. + */ exports.TypeInfo = TypeInfo; function getFieldDef(schema, parentType, fieldNode) { - return schema.getField(parentType, fieldNode.name.value); + const name = fieldNode.name.value; + if (name === _introspection.SchemaMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.SchemaMetaFieldDef; + } + if (name === _introspection.TypeMetaFieldDef.name && schema.getQueryType() === parentType) { + return _introspection.TypeMetaFieldDef; + } + if (name === _introspection.TypeNameMetaFieldDef.name && (0, _definition.isCompositeType)(parentType)) { + return _introspection.TypeNameMetaFieldDef; + } + if ((0, _definition.isObjectType)(parentType) || (0, _definition.isInterfaceType)(parentType)) { + return parentType.getFields()[name]; + } } /** * Creates a new visitor instance which maintains a provided TypeInfo instance * along with visiting visitor. */ + function visitWithTypeInfo(typeInfo, visitor) { return { enter(...args) { @@ -35124,6 +34316,56 @@ function visitWithTypeInfo(typeInfo, visitor) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/assertValidName.mjs": +/*!*******************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/assertValidName.mjs ***! + \*******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.assertValidName = assertValidName; +exports.isValidNameError = isValidNameError; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +var _assertName = __webpack_require__(/*! ../type/assertName.mjs */ "../../../node_modules/graphql/type/assertName.mjs"); +/* c8 ignore start */ + +/** + * Upholds the spec rules about naming. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function assertValidName(name) { + const error = isValidNameError(name); + if (error) { + throw error; + } + return name; +} +/** + * Returns an Error if a name is invalid. + * @deprecated Please use `assertName` instead. Will be removed in v17 + */ + +function isValidNameError(name) { + typeof name === 'string' || (0, _devAssert.devAssert)(false, 'Expected name to be a string.'); + if (name.startsWith('__')) { + return new _GraphQLError.GraphQLError(`Name "${name}" must not begin with "__", which is reserved by GraphQL introspection.`); + } + try { + (0, _assertName.assertName)(name); + } catch (error) { + return error; + } +} +/* c8 ignore stop */ + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/astFromValue.mjs": /*!****************************************************************!*\ !*** ../../../node_modules/graphql/utilities/astFromValue.mjs ***! @@ -35164,6 +34406,7 @@ var _scalars = __webpack_require__(/*! ../type/scalars.mjs */ "../../../node_mod * | null | NullValue | * */ + function astFromValue(value, type) { if ((0, _definition.isNonNullType)(type)) { const astValue = astFromValue(value, type.ofType); @@ -35171,19 +34414,19 @@ function astFromValue(value, type) { return null; } return astValue; - } - // only explicit null, not undefined, NaN + } // only explicit null, not undefined, NaN + if (value === null) { return { kind: _kinds.Kind.NULL }; - } - // undefined + } // undefined + if (value === undefined) { return null; - } - // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but + } // Convert JavaScript array to GraphQL list. If the GraphQLType is a list, but // the value is not an array, convert the value using the list's item type. + if ((0, _definition.isListType)(type)) { const itemType = type.ofType; if ((0, _isIterableObject.isIterableObject)(value)) { @@ -35200,9 +34443,9 @@ function astFromValue(value, type) { }; } return astFromValue(value, itemType); - } - // Populate the fields of the input object by creating ASTs from each value + } // Populate the fields of the input object by creating ASTs from each value // in the JavaScript object according to the fields in the input type. + if ((0, _definition.isInputObjectType)(type)) { if (!(0, _isObjectLike.isObjectLike)(value)) { return null; @@ -35232,15 +34475,15 @@ function astFromValue(value, type) { const serialized = type.serialize(value); if (serialized == null) { return null; - } - // Others serialize based on their corresponding JavaScript scalar types. + } // Others serialize based on their corresponding JavaScript scalar types. + if (typeof serialized === 'boolean') { return { kind: _kinds.Kind.BOOLEAN, value: serialized }; - } - // JavaScript numbers can be Int or Float values. + } // JavaScript numbers can be Int or Float values. + if (typeof serialized === 'number' && Number.isFinite(serialized)) { const stringNum = String(serialized); return integerStringRegExp.test(stringNum) ? { @@ -35258,8 +34501,8 @@ function astFromValue(value, type) { kind: _kinds.Kind.ENUM, value: serialized }; - } - // ID types can use Int literals. + } // ID types can use Int literals. + if (type === _scalars.GraphQLID && integerStringRegExp.test(serialized)) { return { kind: _kinds.Kind.INT, @@ -35275,6 +34518,7 @@ function astFromValue(value, type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } /** @@ -35282,6 +34526,7 @@ function astFromValue(value, type) { * - NegativeSign? 0 * - NegativeSign? NonZeroDigit ( Digit+ )? */ + const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; /***/ }), @@ -35299,6 +34544,8 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.buildASTSchema = buildASTSchema; exports.buildSchema = buildSchema; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); +var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _parser = __webpack_require__(/*! ../language/parser.mjs */ "../../../node_modules/graphql/language/parser.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modules/graphql/type/schema.mjs"); @@ -35315,6 +34562,7 @@ var _extendSchema = __webpack_require__(/*! ./extendSchema.mjs */ "../../../node * has no resolve methods, so execution will use default resolvers. */ function buildASTSchema(documentAST, options) { + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDL)(documentAST); } @@ -35360,6 +34608,7 @@ function buildASTSchema(documentAST, options) { * A helper function to build a GraphQLSchema directly from a source * document. */ + function buildSchema(source, options) { const document = (0, _parser.parse)(source, { noLocation: options === null || options === void 0 ? void 0 : options.noLocation, @@ -35408,50 +34657,49 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node * This function expects a complete introspection result. Don't forget to check * the "errors" field of a server response before calling this function. */ + function buildClientSchema(introspection, options) { - // Even though the `introspection` argument is typed, in most cases it's received - // as an untyped value from the server, so we will do an additional check here. - (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); - // Get the schema from the introspection result. - const schemaIntrospection = introspection.__schema; - // Iterate through all types, getting the type definition for each. - const typeMap = new Map(schemaIntrospection.types.map(typeIntrospection => [typeIntrospection.name, buildType(typeIntrospection)])); - // Include standard types only if they are used. + (0, _isObjectLike.isObjectLike)(introspection) && (0, _isObjectLike.isObjectLike)(introspection.__schema) || (0, _devAssert.devAssert)(false, `Invalid or incomplete introspection result. Ensure that you are passing "data" property of introspection response and no "errors" was returned alongside: ${(0, _inspect.inspect)(introspection)}.`); // Get the schema from the introspection result. + + const schemaIntrospection = introspection.__schema; // Iterate through all types, getting the type definition for each. + + const typeMap = (0, _keyValMap.keyValMap)(schemaIntrospection.types, typeIntrospection => typeIntrospection.name, typeIntrospection => buildType(typeIntrospection)); // Include standard types only if they are used. + for (const stdType of [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes]) { - if (typeMap.has(stdType.name)) { - typeMap.set(stdType.name, stdType); + if (typeMap[stdType.name]) { + typeMap[stdType.name] = stdType; } - } - // Get the root Query, Mutation, and Subscription types. - const queryType = schemaIntrospection.queryType != null ? getObjectType(schemaIntrospection.queryType) : null; - const mutationType = schemaIntrospection.mutationType != null ? getObjectType(schemaIntrospection.mutationType) : null; - const subscriptionType = schemaIntrospection.subscriptionType != null ? getObjectType(schemaIntrospection.subscriptionType) : null; - // Get the directives supported by Introspection, assuming empty-set if + } // Get the root Query, Mutation, and Subscription types. + + const queryType = schemaIntrospection.queryType ? getObjectType(schemaIntrospection.queryType) : null; + const mutationType = schemaIntrospection.mutationType ? getObjectType(schemaIntrospection.mutationType) : null; + const subscriptionType = schemaIntrospection.subscriptionType ? getObjectType(schemaIntrospection.subscriptionType) : null; // Get the directives supported by Introspection, assuming empty-set if // directives were not queried for. - const directives = schemaIntrospection.directives != null ? schemaIntrospection.directives.map(buildDirective) : []; - // Then produce and return a Schema with these types. + + const directives = schemaIntrospection.directives ? schemaIntrospection.directives.map(buildDirective) : []; // Then produce and return a Schema with these types. + return new _schema.GraphQLSchema({ description: schemaIntrospection.description, query: queryType, mutation: mutationType, subscription: subscriptionType, - types: [...typeMap.values()], + types: Object.values(typeMap), directives, assumeValid: options === null || options === void 0 ? void 0 : options.assumeValid - }); - // Given a type reference in introspection, return the GraphQLType instance. + }); // Given a type reference in introspection, return the GraphQLType instance. // preferring cached instances before building new instances. + function getType(typeRef) { if (typeRef.kind === _introspection.TypeKind.LIST) { const itemRef = typeRef.ofType; - if (itemRef == null) { + if (!itemRef) { throw new Error('Decorated type deeper than introspection query.'); } return new _definition.GraphQLList(getType(itemRef)); } if (typeRef.kind === _introspection.TypeKind.NON_NULL) { const nullableRef = typeRef.ofType; - if (nullableRef == null) { + if (!nullableRef) { throw new Error('Decorated type deeper than introspection query.'); } const nullableType = getType(nullableRef); @@ -35464,8 +34712,8 @@ function buildClientSchema(introspection, options) { if (!typeName) { throw new Error(`Unknown type reference: ${(0, _inspect.inspect)(typeRef)}.`); } - const type = typeMap.get(typeName); - if (type == null) { + const type = typeMap[typeName]; + if (!type) { throw new Error(`Invalid or incomplete schema, unknown type: ${typeName}. Ensure that a full introspection query is used in order to build a client schema.`); } return type; @@ -35475,9 +34723,9 @@ function buildClientSchema(introspection, options) { } function getInterfaceType(typeRef) { return (0, _definition.assertInterfaceType)(getNamedType(typeRef)); - } - // Given a type's introspection result, construct the correct + } // Given a type's introspection result, construct the correct // GraphQLType instance. + function buildType(type) { // eslint-disable-next-line @typescript-eslint/prefer-optional-chain if (type != null && type.name != null && type.kind != null) { @@ -35514,7 +34762,7 @@ function buildClientSchema(introspection, options) { if (implementingIntrospection.interfaces === null && implementingIntrospection.kind === _introspection.TypeKind.INTERFACE) { return []; } - if (implementingIntrospection.interfaces == null) { + if (!implementingIntrospection.interfaces) { const implementingIntrospectionStr = (0, _inspect.inspect)(implementingIntrospection); throw new Error(`Introspection result missing interfaces: ${implementingIntrospectionStr}.`); } @@ -35537,7 +34785,7 @@ function buildClientSchema(introspection, options) { }); } function buildUnionDef(unionIntrospection) { - if (unionIntrospection.possibleTypes == null) { + if (!unionIntrospection.possibleTypes) { const unionIntrospectionStr = (0, _inspect.inspect)(unionIntrospection); throw new Error(`Introspection result missing possibleTypes: ${unionIntrospectionStr}.`); } @@ -35548,7 +34796,7 @@ function buildClientSchema(introspection, options) { }); } function buildEnumDef(enumIntrospection) { - if (enumIntrospection.enumValues == null) { + if (!enumIntrospection.enumValues) { const enumIntrospectionStr = (0, _inspect.inspect)(enumIntrospection); throw new Error(`Introspection result missing enumValues: ${enumIntrospectionStr}.`); } @@ -35562,7 +34810,7 @@ function buildClientSchema(introspection, options) { }); } function buildInputObjectDef(inputObjectIntrospection) { - if (inputObjectIntrospection.inputFields == null) { + if (!inputObjectIntrospection.inputFields) { const inputObjectIntrospectionStr = (0, _inspect.inspect)(inputObjectIntrospection); throw new Error(`Introspection result missing inputFields: ${inputObjectIntrospectionStr}.`); } @@ -35574,7 +34822,7 @@ function buildClientSchema(introspection, options) { }); } function buildFieldDefMap(typeIntrospection) { - if (typeIntrospection.fields == null) { + if (!typeIntrospection.fields) { throw new Error(`Introspection result missing fields: ${(0, _inspect.inspect)(typeIntrospection)}.`); } return (0, _keyValMap.keyValMap)(typeIntrospection.fields, fieldIntrospection => fieldIntrospection.name, buildField); @@ -35585,7 +34833,7 @@ function buildClientSchema(introspection, options) { const typeStr = (0, _inspect.inspect)(type); throw new Error(`Introspection must provide output type for fields, but received: ${typeStr}.`); } - if (fieldIntrospection.args == null) { + if (!fieldIntrospection.args) { const fieldIntrospectionStr = (0, _inspect.inspect)(fieldIntrospection); throw new Error(`Introspection result missing field args: ${fieldIntrospectionStr}.`); } @@ -35614,11 +34862,11 @@ function buildClientSchema(introspection, options) { }; } function buildDirective(directiveIntrospection) { - if (directiveIntrospection.args == null) { + if (!directiveIntrospection.args) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive args: ${directiveIntrospectionStr}.`); } - if (directiveIntrospection.locations == null) { + if (!directiveIntrospection.locations) { const directiveIntrospectionStr = (0, _inspect.inspect)(directiveIntrospection); throw new Error(`Introspection result missing directive locations: ${directiveIntrospectionStr}.`); } @@ -35689,8 +34937,8 @@ function coerceInputValueImpl(inputValue, type, onError, path) { const itemPath = (0, _Path.addPath)(path, index, undefined); return coerceInputValueImpl(itemValue, itemType, onError, itemPath); }); - } - // Lists accept a non-list value as a list of one. + } // Lists accept a non-list value as a list of one. + return [coerceInputValueImpl(inputValue, itemType, onError, path)]; } if ((0, _definition.isInputObjectType)(type)) { @@ -35712,10 +34960,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { continue; } coercedValue[field.name] = coerceInputValueImpl(fieldValue, field.type, onError, (0, _Path.addPath)(path, field.name, type.name)); - } - // Ensure every provided field is defined. + } // Ensure every provided field is defined. + for (const fieldName of Object.keys(inputValue)) { - if (fieldDefs[fieldName] == null) { + if (!fieldDefs[fieldName]) { const suggestions = (0, _suggestionList.suggestionList)(fieldName, Object.keys(type.getFields())); onError((0, _Path.pathToArray)(path), inputValue, new _GraphQLError.GraphQLError(`Field "${fieldName}" is not defined by type "${type.name}".` + (0, _didYouMean.didYouMean)(suggestions))); } @@ -35734,10 +34982,10 @@ function coerceInputValueImpl(inputValue, type, onError, path) { return coercedValue; } if ((0, _definition.isLeafType)(type)) { - let parseResult; - // Scalars and Enums determine if an input value is valid via parseValue(), + let parseResult; // Scalars and Enums determine if a input value is valid via parseValue(), // which can throw to indicate failure. If it throws, maintain a reference // to the original error. + try { parseResult = type.parseValue(inputValue); } catch (error) { @@ -35757,6 +35005,7 @@ function coerceInputValueImpl(inputValue, type, onError, path) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); } @@ -35780,6 +35029,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * concatenate the ASTs together into batched AST, useful for validating many * GraphQL source files which together represent one conceptual application. */ + function concatAST(documents) { const definitions = []; for (const doc of documents) { @@ -35806,11 +35056,13 @@ Object.defineProperty(exports, "__esModule", ({ })); exports.extendSchema = extendSchema; exports.extendSchemaImpl = extendSchemaImpl; -var _AccumulatorMap = __webpack_require__(/*! ../jsutils/AccumulatorMap.mjs */ "../../../node_modules/graphql/jsutils/AccumulatorMap.mjs"); +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _mapValue = __webpack_require__(/*! ../jsutils/mapValue.mjs */ "../../../node_modules/graphql/jsutils/mapValue.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); +var _predicates = __webpack_require__(/*! ../language/predicates.mjs */ "../../../node_modules/graphql/language/predicates.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); var _introspection = __webpack_require__(/*! ../type/introspection.mjs */ "../../../node_modules/graphql/type/introspection.mjs"); @@ -35833,6 +35085,7 @@ var _valueFromAST = __webpack_require__(/*! ./valueFromAST.mjs */ "../../../node */ function extendSchema(schema, documentAST, options) { (0, _schema.assertSchema)(schema); + documentAST != null && documentAST.kind === _kinds.Kind.DOCUMENT || (0, _devAssert.devAssert)(false, 'Must provide valid Document AST.'); if ((options === null || options === void 0 ? void 0 : options.assumeValid) !== true && (options === null || options === void 0 ? void 0 : options.assumeValidSDL) !== true) { (0, _validate.assertValidSDLExtension)(documentAST, schema); } @@ -35843,77 +35096,47 @@ function extendSchema(schema, documentAST, options) { /** * @internal */ + function extendSchemaImpl(schemaConfig, documentAST, options) { - var _schemaDef$descriptio, _schemaDef, _schemaDef$descriptio2, _schemaDef2, _options$assumeValid; + var _schemaDef, _schemaDef$descriptio, _schemaDef2, _options$assumeValid; + // Collect the type definitions and extensions found in the document. const typeDefs = []; - const scalarExtensions = new _AccumulatorMap.AccumulatorMap(); - const objectExtensions = new _AccumulatorMap.AccumulatorMap(); - const interfaceExtensions = new _AccumulatorMap.AccumulatorMap(); - const unionExtensions = new _AccumulatorMap.AccumulatorMap(); - const enumExtensions = new _AccumulatorMap.AccumulatorMap(); - const inputObjectExtensions = new _AccumulatorMap.AccumulatorMap(); - // New directives and types are separate because a directives and types can + const typeExtensionsMap = Object.create(null); // New directives and types are separate because a directives and types can // have the same name. For example, a type named "skip". + const directiveDefs = []; - let schemaDef; - // Schema extensions are collected which may add additional operation types. + let schemaDef; // Schema extensions are collected which may add additional operation types. + const schemaExtensions = []; - let isSchemaChanged = false; for (const def of documentAST.definitions) { - switch (def.kind) { - case _kinds.Kind.SCHEMA_DEFINITION: - schemaDef = def; - break; - case _kinds.Kind.SCHEMA_EXTENSION: - schemaExtensions.push(def); - break; - case _kinds.Kind.DIRECTIVE_DEFINITION: - directiveDefs.push(def); - break; - // Type Definitions - case _kinds.Kind.SCALAR_TYPE_DEFINITION: - case _kinds.Kind.OBJECT_TYPE_DEFINITION: - case _kinds.Kind.INTERFACE_TYPE_DEFINITION: - case _kinds.Kind.UNION_TYPE_DEFINITION: - case _kinds.Kind.ENUM_TYPE_DEFINITION: - case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: - typeDefs.push(def); - break; - // Type System Extensions - case _kinds.Kind.SCALAR_TYPE_EXTENSION: - scalarExtensions.add(def.name.value, def); - break; - case _kinds.Kind.OBJECT_TYPE_EXTENSION: - objectExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INTERFACE_TYPE_EXTENSION: - interfaceExtensions.add(def.name.value, def); - break; - case _kinds.Kind.UNION_TYPE_EXTENSION: - unionExtensions.add(def.name.value, def); - break; - case _kinds.Kind.ENUM_TYPE_EXTENSION: - enumExtensions.add(def.name.value, def); - break; - case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: - inputObjectExtensions.add(def.name.value, def); - break; - default: - continue; + if (def.kind === _kinds.Kind.SCHEMA_DEFINITION) { + schemaDef = def; + } else if (def.kind === _kinds.Kind.SCHEMA_EXTENSION) { + schemaExtensions.push(def); + } else if ((0, _predicates.isTypeDefinitionNode)(def)) { + typeDefs.push(def); + } else if ((0, _predicates.isTypeExtensionNode)(def)) { + const extendedTypeName = def.name.value; + const existingTypeExtensions = typeExtensionsMap[extendedTypeName]; + typeExtensionsMap[extendedTypeName] = existingTypeExtensions ? existingTypeExtensions.concat([def]) : [def]; + } else if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { + directiveDefs.push(def); } - isSchemaChanged = true; - } - // If this document contains no new types, extensions, or directives then + } // If this document contains no new types, extensions, or directives then // return the same unmodified GraphQLSchema instance. - if (!isSchemaChanged) { + + if (Object.keys(typeExtensionsMap).length === 0 && typeDefs.length === 0 && directiveDefs.length === 0 && schemaExtensions.length === 0 && schemaDef == null) { return schemaConfig; } - const typeMap = new Map(schemaConfig.types.map(type => [type.name, extendNamedType(type)])); + const typeMap = Object.create(null); + for (const existingType of schemaConfig.types) { + typeMap[existingType.name] = extendNamedType(existingType); + } for (const typeNode of typeDefs) { - var _stdTypeMap$get; + var _stdTypeMap$name; const name = typeNode.name.value; - typeMap.set(name, (_stdTypeMap$get = stdTypeMap.get(name)) !== null && _stdTypeMap$get !== void 0 ? _stdTypeMap$get : buildType(typeNode)); + typeMap[name] = (_stdTypeMap$name = stdTypeMap[name]) !== null && _stdTypeMap$name !== void 0 ? _stdTypeMap$name : buildType(typeNode); } const operationTypes = { // Get the extended root operation types. @@ -35923,20 +35146,20 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // Then, incorporate schema definition and all schema extensions. ...(schemaDef && getOperationTypes([schemaDef])), ...getOperationTypes(schemaExtensions) - }; - // Then produce and return a Schema config with these types. + }; // Then produce and return a Schema config with these types. + return { - description: (_schemaDef$descriptio = (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio2 = _schemaDef.description) === null || _schemaDef$descriptio2 === void 0 ? void 0 : _schemaDef$descriptio2.value) !== null && _schemaDef$descriptio !== void 0 ? _schemaDef$descriptio : schemaConfig.description, + description: (_schemaDef = schemaDef) === null || _schemaDef === void 0 ? void 0 : (_schemaDef$descriptio = _schemaDef.description) === null || _schemaDef$descriptio === void 0 ? void 0 : _schemaDef$descriptio.value, ...operationTypes, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: [...schemaConfig.directives.map(replaceDirective), ...directiveDefs.map(buildDirective)], - extensions: schemaConfig.extensions, + extensions: Object.create(null), astNode: (_schemaDef2 = schemaDef) !== null && _schemaDef2 !== void 0 ? _schemaDef2 : schemaConfig.astNode, extensionASTNodes: schemaConfig.extensionASTNodes.concat(schemaExtensions), assumeValid: (_options$assumeValid = options === null || options === void 0 ? void 0 : options.assumeValid) !== null && _options$assumeValid !== void 0 ? _options$assumeValid : false - }; - // Below are functions used for producing this schema that have closed over + }; // Below are functions used for producing this schema that have closed over // this scope and have access to the schema, cache, and newly defined types. + function replaceType(type) { if ((0, _definition.isListType)(type)) { // @ts-expect-error @@ -35945,21 +35168,17 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME + } // @ts-expect-error FIXME + return replaceNamedType(type); } function replaceNamedType(type) { // Note: While this could make early assertions to get the correctly // typed values, that would throw immediately while type system // validation with validateSchema() will produce more actionable results. - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceDirective(directive) { - if ((0, _directives.isSpecifiedDirective)(directive)) { - // Builtin directives are not extended. - return directive; - } const config = directive.toConfig(); return new _directives.GraphQLDirective({ ...config, @@ -35991,12 +35210,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } /* c8 ignore next 3 */ // Not reachable, all possible type definition nodes have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extendInputObjectType(type) { - var _inputObjectExtension; + var _typeExtensionsMap$co; const config = type.toConfig(); - const extensions = (_inputObjectExtension = inputObjectExtensions.get(config.name)) !== null && _inputObjectExtension !== void 0 ? _inputObjectExtension : []; + const extensions = (_typeExtensionsMap$co = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co !== void 0 ? _typeExtensionsMap$co : []; return new _definition.GraphQLInputObjectType({ ...config, fields: () => ({ @@ -36010,9 +35230,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendEnumType(type) { - var _enumExtensions$get; + var _typeExtensionsMap$ty; const config = type.toConfig(); - const extensions = (_enumExtensions$get = enumExtensions.get(type.name)) !== null && _enumExtensions$get !== void 0 ? _enumExtensions$get : []; + const extensions = (_typeExtensionsMap$ty = typeExtensionsMap[type.name]) !== null && _typeExtensionsMap$ty !== void 0 ? _typeExtensionsMap$ty : []; return new _definition.GraphQLEnumType({ ...config, values: { @@ -36023,9 +35243,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendScalarType(type) { - var _scalarExtensions$get; + var _typeExtensionsMap$co2; const config = type.toConfig(); - const extensions = (_scalarExtensions$get = scalarExtensions.get(config.name)) !== null && _scalarExtensions$get !== void 0 ? _scalarExtensions$get : []; + const extensions = (_typeExtensionsMap$co2 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co2 !== void 0 ? _typeExtensionsMap$co2 : []; let specifiedByURL = config.specifiedByURL; for (const extensionNode of extensions) { var _getSpecifiedByURL; @@ -36038,9 +35258,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendObjectType(type) { - var _objectExtensions$get; + var _typeExtensionsMap$co3; const config = type.toConfig(); - const extensions = (_objectExtensions$get = objectExtensions.get(config.name)) !== null && _objectExtensions$get !== void 0 ? _objectExtensions$get : []; + const extensions = (_typeExtensionsMap$co3 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co3 !== void 0 ? _typeExtensionsMap$co3 : []; return new _definition.GraphQLObjectType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36052,9 +35272,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendInterfaceType(type) { - var _interfaceExtensions$; + var _typeExtensionsMap$co4; const config = type.toConfig(); - const extensions = (_interfaceExtensions$ = interfaceExtensions.get(config.name)) !== null && _interfaceExtensions$ !== void 0 ? _interfaceExtensions$ : []; + const extensions = (_typeExtensionsMap$co4 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co4 !== void 0 ? _typeExtensionsMap$co4 : []; return new _definition.GraphQLInterfaceType({ ...config, interfaces: () => [...type.getInterfaces().map(replaceNamedType), ...buildInterfaces(extensions)], @@ -36066,9 +35286,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { }); } function extendUnionType(type) { - var _unionExtensions$get; + var _typeExtensionsMap$co5; const config = type.toConfig(); - const extensions = (_unionExtensions$get = unionExtensions.get(config.name)) !== null && _unionExtensions$get !== void 0 ? _unionExtensions$get : []; + const extensions = (_typeExtensionsMap$co5 = typeExtensionsMap[config.name]) !== null && _typeExtensionsMap$co5 !== void 0 ? _typeExtensionsMap$co5 : []; return new _definition.GraphQLUnionType({ ...config, types: () => [...type.getTypes().map(replaceNamedType), ...buildUnionTypes(extensions)], @@ -36092,8 +35312,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const opTypes = {}; for (const node of nodes) { var _node$operationTypes; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const operationTypesNodes = /* c8 ignore next */(_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; + const operationTypesNodes = /* c8 ignore next */ + (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { // Note: While this could make early assertions to get the correctly // typed values below, that would throw immediately while type system @@ -36105,9 +35327,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { return opTypes; } function getNamedType(node) { - var _stdTypeMap$get2; + var _stdTypeMap$name2; const name = node.name.value; - const type = (_stdTypeMap$get2 = stdTypeMap.get(name)) !== null && _stdTypeMap$get2 !== void 0 ? _stdTypeMap$get2 : typeMap.get(name); + const type = (_stdTypeMap$name2 = stdTypeMap[name]) !== null && _stdTypeMap$name2 !== void 0 ? _stdTypeMap$name2 : typeMap[name]; if (type === undefined) { throw new Error(`Unknown type: "${name}".`); } @@ -36140,8 +35362,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const fieldConfigMap = Object.create(null); for (const node of nodes) { var _node$fields; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const nodeFields = /* c8 ignore next */(_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const nodeFields = /* c8 ignore next */ + (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; for (const field of nodeFields) { var _field$description; fieldConfigMap[field.name.value] = { @@ -36160,10 +35384,12 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } function buildArgumentMap(args) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const argsNodes = /* c8 ignore next */args !== null && args !== void 0 ? args : []; + const argsNodes = /* c8 ignore next */ + args !== null && args !== void 0 ? args : []; const argConfigMap = Object.create(null); for (const arg of argsNodes) { var _arg$description; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36182,10 +35408,13 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const inputFieldMap = Object.create(null); for (const node of nodes) { var _node$fields2; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const fieldsNodes = /* c8 ignore next */(_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; + const fieldsNodes = /* c8 ignore next */ + (_node$fields2 = node.fields) !== null && _node$fields2 !== void 0 ? _node$fields2 : []; for (const field of fieldsNodes) { var _field$description2; + // Note: While this could make assertions to get the correctly typed // value, that would throw immediately while type system validation // with validateSchema() will produce more actionable results. @@ -36205,8 +35434,10 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { const enumValueMap = Object.create(null); for (const node of nodes) { var _node$values; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 - const valuesNodes = /* c8 ignore next */(_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valuesNodes = /* c8 ignore next */ + (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; for (const value of valuesNodes) { var _value$description; enumValueMap[value.name.value] = { @@ -36227,7 +35458,9 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$interfaces$map, _node$interfaces; - return /* c8 ignore next */(_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : []; + return /* c8 ignore next */( + (_node$interfaces$map = (_node$interfaces = node.interfaces) === null || _node$interfaces === void 0 ? void 0 : _node$interfaces.map(getNamedType)) !== null && _node$interfaces$map !== void 0 ? _node$interfaces$map : [] + ); }); } function buildUnionTypes(nodes) { @@ -36239,16 +35472,19 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { // FIXME: https://github.com/graphql/graphql-js/issues/2203 node => { var _node$types$map, _node$types; - return /* c8 ignore next */(_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : []; + return /* c8 ignore next */( + (_node$types$map = (_node$types = node.types) === null || _node$types === void 0 ? void 0 : _node$types.map(getNamedType)) !== null && _node$types$map !== void 0 ? _node$types$map : [] + ); }); } function buildType(astNode) { + var _typeExtensionsMap$na; const name = astNode.name.value; + const extensionASTNodes = (_typeExtensionsMap$na = typeExtensionsMap[name]) !== null && _typeExtensionsMap$na !== void 0 ? _typeExtensionsMap$na : []; switch (astNode.kind) { case _kinds.Kind.OBJECT_TYPE_DEFINITION: { - var _objectExtensions$get2, _astNode$description; - const extensionASTNodes = (_objectExtensions$get2 = objectExtensions.get(name)) !== null && _objectExtensions$get2 !== void 0 ? _objectExtensions$get2 : []; + var _astNode$description; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLObjectType({ name, @@ -36261,8 +35497,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INTERFACE_TYPE_DEFINITION: { - var _interfaceExtensions$2, _astNode$description2; - const extensionASTNodes = (_interfaceExtensions$2 = interfaceExtensions.get(name)) !== null && _interfaceExtensions$2 !== void 0 ? _interfaceExtensions$2 : []; + var _astNode$description2; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInterfaceType({ name, @@ -36275,8 +35510,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.ENUM_TYPE_DEFINITION: { - var _enumExtensions$get2, _astNode$description3; - const extensionASTNodes = (_enumExtensions$get2 = enumExtensions.get(name)) !== null && _enumExtensions$get2 !== void 0 ? _enumExtensions$get2 : []; + var _astNode$description3; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLEnumType({ name, @@ -36288,8 +35522,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.UNION_TYPE_DEFINITION: { - var _unionExtensions$get2, _astNode$description4; - const extensionASTNodes = (_unionExtensions$get2 = unionExtensions.get(name)) !== null && _unionExtensions$get2 !== void 0 ? _unionExtensions$get2 : []; + var _astNode$description4; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLUnionType({ name, @@ -36301,8 +35534,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.SCALAR_TYPE_DEFINITION: { - var _scalarExtensions$get2, _astNode$description5; - const extensionASTNodes = (_scalarExtensions$get2 = scalarExtensions.get(name)) !== null && _scalarExtensions$get2 !== void 0 ? _scalarExtensions$get2 : []; + var _astNode$description5; return new _definition.GraphQLScalarType({ name, description: (_astNode$description5 = astNode.description) === null || _astNode$description5 === void 0 ? void 0 : _astNode$description5.value, @@ -36313,8 +35545,7 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } case _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION: { - var _inputObjectExtension2, _astNode$description6; - const extensionASTNodes = (_inputObjectExtension2 = inputObjectExtensions.get(name)) !== null && _inputObjectExtension2 !== void 0 ? _inputObjectExtension2 : []; + var _astNode$description6; const allNodes = [astNode, ...extensionASTNodes]; return new _definition.GraphQLInputObjectType({ name, @@ -36328,27 +35559,30 @@ function extendSchemaImpl(schemaConfig, documentAST, options) { } } } -const stdTypeMap = new Map([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => [type.name, type])); +const stdTypeMap = (0, _keyMap.keyMap)([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes], type => type.name); /** * Given a field or enum value node, returns the string value for the * deprecation reason. */ + function getDeprecationReason(node) { - const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const deprecated = (0, _values.getDirectiveValues)(_directives.GraphQLDeprecatedDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return deprecated === null || deprecated === void 0 ? void 0 : deprecated.reason; } /** * Given a scalar node, returns the string value for the specifiedByURL. */ + function getSpecifiedByURL(node) { - const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); - // @ts-expect-error validated by `getDirectiveValues` + const specifiedBy = (0, _values.getDirectiveValues)(_directives.GraphQLSpecifiedByDirective, node); // @ts-expect-error validated by `getDirectiveValues` + return specifiedBy === null || specifiedBy === void 0 ? void 0 : specifiedBy.url; } /** * Given an input object node, returns if the node should be OneOf. */ + function isOneOf(node) { return Boolean((0, _values.getDirectiveValues)(_directives.GraphQLOneOfDirective, node)); } @@ -36417,6 +35651,7 @@ function findBreakingChanges(oldSchema, newSchema) { * Given two schemas, returns an Array containing descriptions of all the types * of potentially dangerous changes covered by the other functions down below. */ + function findDangerousChanges(oldSchema, newSchema) { // @ts-expect-error return findSchemaChanges(oldSchema, newSchema).filter(change => change.type in DangerousChangeType); @@ -36685,8 +35920,8 @@ function isChangeSafeForInputObjectFieldOrFieldArg(oldType, newType) { // moving from non-null to nullable of the same underlying type is safe !(0, _definition.isNonNullType)(newType) && isChangeSafeForInputObjectFieldOrFieldArg(oldType.ofType, newType) ); - } - // if they're both named types, see if their names are equivalent + } // if they're both named types, see if their names are equivalent + return (0, _definition.isNamedType)(newType) && oldType.name === newType.name; } function typeKindName(type) { @@ -36710,6 +35945,7 @@ function typeKindName(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function stringifyValue(value, type) { @@ -36912,6 +36148,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * name. If a name is not provided, an operation is only returned if only one is * provided in the document. */ + function getOperationAST(documentAST, operationName) { let operation = null; for (const definition of documentAST.definitions) { @@ -36935,6 +36172,59 @@ function getOperationAST(documentAST, operationName) { /***/ }), +/***/ "../../../node_modules/graphql/utilities/getOperationRootType.mjs": +/*!************************************************************************!*\ + !*** ../../../node_modules/graphql/utilities/getOperationRootType.mjs ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getOperationRootType = getOperationRootType; +var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); +/** + * Extracts the root type of the operation from the schema. + * + * @deprecated Please use `GraphQLSchema.getRootType` instead. Will be removed in v17 + */ +function getOperationRootType(schema, operation) { + if (operation.operation === 'query') { + const queryType = schema.getQueryType(); + if (!queryType) { + throw new _GraphQLError.GraphQLError('Schema does not define the required query root type.', { + nodes: operation + }); + } + return queryType; + } + if (operation.operation === 'mutation') { + const mutationType = schema.getMutationType(); + if (!mutationType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for mutations.', { + nodes: operation + }); + } + return mutationType; + } + if (operation.operation === 'subscription') { + const subscriptionType = schema.getSubscriptionType(); + if (!subscriptionType) { + throw new _GraphQLError.GraphQLError('Schema is not configured for subscriptions.', { + nodes: operation + }); + } + return subscriptionType; + } + throw new _GraphQLError.GraphQLError('Can only have query, mutation and subscription operations.', { + nodes: operation + }); +} + +/***/ }), + /***/ "../../../node_modules/graphql/utilities/index.mjs": /*!*********************************************************!*\ !*** ../../../node_modules/graphql/utilities/index.mjs ***! @@ -36964,6 +36254,12 @@ Object.defineProperty(exports, "TypeInfo", ({ return _TypeInfo.TypeInfo; } })); +Object.defineProperty(exports, "assertValidName", ({ + enumerable: true, + get: function () { + return _assertValidName.assertValidName; + } +})); Object.defineProperty(exports, "astFromValue", ({ enumerable: true, get: function () { @@ -37036,6 +36332,12 @@ Object.defineProperty(exports, "getOperationAST", ({ return _getOperationAST.getOperationAST; } })); +Object.defineProperty(exports, "getOperationRootType", ({ + enumerable: true, + get: function () { + return _getOperationRootType.getOperationRootType; + } +})); Object.defineProperty(exports, "introspectionFromSchema", ({ enumerable: true, get: function () { @@ -37054,18 +36356,18 @@ Object.defineProperty(exports, "isTypeSubTypeOf", ({ return _typeComparators.isTypeSubTypeOf; } })); +Object.defineProperty(exports, "isValidNameError", ({ + enumerable: true, + get: function () { + return _assertValidName.isValidNameError; + } +})); Object.defineProperty(exports, "lexicographicSortSchema", ({ enumerable: true, get: function () { return _lexicographicSortSchema.lexicographicSortSchema; } })); -Object.defineProperty(exports, "printDirective", ({ - enumerable: true, - get: function () { - return _printSchema.printDirective; - } -})); Object.defineProperty(exports, "printIntrospectionSchema", ({ enumerable: true, get: function () { @@ -37122,6 +36424,7 @@ Object.defineProperty(exports, "visitWithTypeInfo", ({ })); var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs */ "../../../node_modules/graphql/utilities/getIntrospectionQuery.mjs"); var _getOperationAST = __webpack_require__(/*! ./getOperationAST.mjs */ "../../../node_modules/graphql/utilities/getOperationAST.mjs"); +var _getOperationRootType = __webpack_require__(/*! ./getOperationRootType.mjs */ "../../../node_modules/graphql/utilities/getOperationRootType.mjs"); var _introspectionFromSchema = __webpack_require__(/*! ./introspectionFromSchema.mjs */ "../../../node_modules/graphql/utilities/introspectionFromSchema.mjs"); var _buildClientSchema = __webpack_require__(/*! ./buildClientSchema.mjs */ "../../../node_modules/graphql/utilities/buildClientSchema.mjs"); var _buildASTSchema = __webpack_require__(/*! ./buildASTSchema.mjs */ "../../../node_modules/graphql/utilities/buildASTSchema.mjs"); @@ -37138,6 +36441,7 @@ var _concatAST = __webpack_require__(/*! ./concatAST.mjs */ "../../../node_modul var _separateOperations = __webpack_require__(/*! ./separateOperations.mjs */ "../../../node_modules/graphql/utilities/separateOperations.mjs"); var _stripIgnoredCharacters = __webpack_require__(/*! ./stripIgnoredCharacters.mjs */ "../../../node_modules/graphql/utilities/stripIgnoredCharacters.mjs"); var _typeComparators = __webpack_require__(/*! ./typeComparators.mjs */ "../../../node_modules/graphql/utilities/typeComparators.mjs"); +var _assertValidName = __webpack_require__(/*! ./assertValidName.mjs */ "../../../node_modules/graphql/utilities/assertValidName.mjs"); var _findBreakingChanges = __webpack_require__(/*! ./findBreakingChanges.mjs */ "../../../node_modules/graphql/utilities/findBreakingChanges.mjs"); /***/ }), @@ -37167,6 +36471,7 @@ var _getIntrospectionQuery = __webpack_require__(/*! ./getIntrospectionQuery.mjs * This is the inverse of buildClientSchema. The primary use case is outside * of the server context, for instance when doing schema comparisons. */ + function introspectionFromSchema(schema, options) { const optionsWithDefaults = { specifiedByUrl: true, @@ -37181,7 +36486,7 @@ function introspectionFromSchema(schema, options) { schema, document }); - result.errors == null && result.data != null || (0, _invariant.invariant)(false); + !result.errors && result.data || (0, _invariant.invariant)(false); return result.data; } @@ -37201,6 +36506,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.lexicographicSortSchema = lexicographicSortSchema; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyValMap = __webpack_require__(/*! ../jsutils/keyValMap.mjs */ "../../../node_modules/graphql/jsutils/keyValMap.mjs"); var _naturalCompare = __webpack_require__(/*! ../jsutils/naturalCompare.mjs */ "../../../node_modules/graphql/jsutils/naturalCompare.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _directives = __webpack_require__(/*! ../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); @@ -37211,12 +36517,13 @@ var _schema = __webpack_require__(/*! ../type/schema.mjs */ "../../../node_modul * * This function returns a sorted copy of the given GraphQLSchema. */ + function lexicographicSortSchema(schema) { const schemaConfig = schema.toConfig(); - const typeMap = new Map(sortByName(schemaConfig.types).map(type => [type.name, sortNamedType(type)])); + const typeMap = (0, _keyValMap.keyValMap)(sortByName(schemaConfig.types), type => type.name, sortNamedType); return new _schema.GraphQLSchema({ ...schemaConfig, - types: Array.from(typeMap.values()), + types: Object.values(typeMap), directives: sortByName(schemaConfig.directives).map(sortDirective), query: replaceMaybeType(schemaConfig.query), mutation: replaceMaybeType(schemaConfig.mutation), @@ -37229,12 +36536,12 @@ function lexicographicSortSchema(schema) { } else if ((0, _definition.isNonNullType)(type)) { // @ts-expect-error return new _definition.GraphQLNonNull(replaceType(type.ofType)); - } - // @ts-expect-error FIXME: TS Conversion + } // @ts-expect-error FIXME: TS Conversion + return replaceNamedType(type); } function replaceNamedType(type) { - return typeMap.get(type.name); + return typeMap[type.name]; } function replaceMaybeType(maybeType) { return maybeType && replaceNamedType(maybeType); @@ -37312,6 +36619,7 @@ function lexicographicSortSchema(schema) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } } @@ -37346,7 +36654,6 @@ function sortBy(array, mapToKey) { Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.printDirective = printDirective; exports.printIntrospectionSchema = printIntrospectionSchema; exports.printSchema = printSchema; exports.printType = printType; @@ -37375,19 +36682,23 @@ function printFilteredSchema(schema, directiveFilter, typeFilter) { return [printSchemaDefinition(schema), ...directives.map(directive => printDirective(directive)), ...types.map(type => printType(type))].filter(Boolean).join('\n\n'); } function printSchemaDefinition(schema) { - const queryType = schema.getQueryType(); - const mutationType = schema.getMutationType(); - const subscriptionType = schema.getSubscriptionType(); - // Special case: When a schema has no root operation types, no valid schema - // definition can be printed. - if (!queryType && !mutationType && !subscriptionType) { + if (schema.description == null && isSchemaOfCommonNames(schema)) { return; } - // Only print a schema definition if there is a description or if it should - // not be omitted because of having default type names. - if (schema.description != null || !hasDefaultRootOperationTypes(schema)) { - return printDescription(schema) + 'schema {\n' + (queryType ? ` query: ${queryType.name}\n` : '') + (mutationType ? ` mutation: ${mutationType.name}\n` : '') + (subscriptionType ? ` subscription: ${subscriptionType.name}\n` : '') + '}'; + const operationTypes = []; + const queryType = schema.getQueryType(); + if (queryType) { + operationTypes.push(` query: ${queryType.name}`); } + const mutationType = schema.getMutationType(); + if (mutationType) { + operationTypes.push(` mutation: ${mutationType.name}`); + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType) { + operationTypes.push(` subscription: ${subscriptionType.name}`); + } + return printDescription(schema) + `schema {\n${operationTypes.join('\n')}\n}`; } /** * GraphQL schema define root types for each type of operation. These types are @@ -37402,16 +36713,23 @@ function printSchemaDefinition(schema) { * } * ``` * - * When using this naming convention, the schema description can be omitted so - * long as these names are only used for operation types. - * - * Note however that if any of these default names are used elsewhere in the - * schema but not as a root operation type, the schema definition must still - * be printed to avoid ambiguity. + * When using this naming convention, the schema description can be omitted. */ -function hasDefaultRootOperationTypes(schema) { - /* eslint-disable eqeqeq */ - return schema.getQueryType() == schema.getType('Query') && schema.getMutationType() == schema.getType('Mutation') && schema.getSubscriptionType() == schema.getType('Subscription'); + +function isSchemaOfCommonNames(schema) { + const queryType = schema.getQueryType(); + if (queryType && queryType.name !== 'Query') { + return false; + } + const mutationType = schema.getMutationType(); + if (mutationType && mutationType.name !== 'Mutation') { + return false; + } + const subscriptionType = schema.getSubscriptionType(); + if (subscriptionType && subscriptionType.name !== 'Subscription') { + return false; + } + return true; } function printType(type) { if ((0, _definition.isScalarType)(type)) { @@ -37434,6 +36752,7 @@ function printType(type) { } /* c8 ignore next 3 */ // Not reachable, all possible types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function printScalar(type) { @@ -37472,9 +36791,9 @@ function printBlock(items) { function printArgs(args, indentation = '') { if (args.length === 0) { return ''; - } - // If every arg does not have a description, print them on one line. - if (args.every(arg => arg.description == null)) { + } // If every arg does not have a description, print them on one line. + + if (args.every(arg => !arg.description)) { return '(' + args.map(printInputValue).join(', ') + ')'; } return '(\n' + args.map((arg, i) => printDescription(arg, ' ' + indentation, !i) + ' ' + indentation + printInputValue(arg)).join('\n') + '\n' + indentation + ')'; @@ -37526,7 +36845,7 @@ function printDescription(def, indentation = '', firstInBlock = true) { block: (0, _blockString.isPrintableAsBlockString)(description) }); const prefix = indentation && !firstInBlock ? '\n' + indentation : indentation; - return prefix + blockString.replaceAll('\n', '\n' + indentation) + '\n'; + return prefix + blockString.replace(/\n/g, '\n' + indentation) + '\n'; } /***/ }), @@ -37551,10 +36870,11 @@ var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node * which contains a single operation as well the fragment definitions it * refers to. */ + function separateOperations(documentAST) { const operations = []; - const depGraph = Object.create(null); - // Populate metadata and build a dependency graph. + const depGraph = Object.create(null); // Populate metadata and build a dependency graph. + for (const definitionNode of documentAST.definitions) { switch (definitionNode.kind) { case _kinds.Kind.OPERATION_DEFINITION: @@ -37563,22 +36883,21 @@ function separateOperations(documentAST) { case _kinds.Kind.FRAGMENT_DEFINITION: depGraph[definitionNode.name.value] = collectDependencies(definitionNode.selectionSet); break; - default: - // ignore non-executable definitions + default: // ignore non-executable definitions } - } - // For each operation, produce a new synthesized AST which includes only what + } // For each operation, produce a new synthesized AST which includes only what // is necessary for completing that operation. + const separatedDocumentASTs = Object.create(null); for (const operation of operations) { const dependencies = new Set(); for (const fragmentName of collectDependencies(operation.selectionSet)) { collectTransitiveDependencies(dependencies, depGraph, fragmentName); - } - // Provides the empty string for anonymous operations. - const operationName = operation.name ? operation.name.value : ''; - // The list of definition nodes to be included for this operation, sorted + } // Provides the empty string for anonymous operations. + + const operationName = operation.name ? operation.name.value : ''; // The list of definition nodes to be included for this operation, sorted // to retain the same order as the original document. + separatedDocumentASTs[operationName] = { kind: _kinds.Kind.DOCUMENT, definitions: documentAST.definitions.filter(node => node === operation || node.kind === _kinds.Kind.FRAGMENT_DEFINITION && dependencies.has(node.name.value)) @@ -37586,6 +36905,7 @@ function separateOperations(documentAST) { } return separatedDocumentASTs; } + // From a dependency graph, collects a list of transitive dependencies by // recursing through a dependency graph. function collectTransitiveDependencies(collected, depGraph, fromName) { @@ -37632,6 +36952,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * * @internal */ + function sortValueNode(valueNode) { switch (valueNode.kind) { case _kinds.Kind.OBJECT: @@ -37739,6 +37060,7 @@ var _tokenKind = __webpack_require__(/*! ../language/tokenKind.mjs */ "../../../ * """Type description""" type Foo{"""Field description""" bar:String} * ``` */ + function stripIgnoredCharacters(source) { const sourceObj = (0, _source.isSource)(source) ? source : new _source.Source(source); const body = sourceObj.body; @@ -37753,6 +37075,7 @@ function stripIgnoredCharacters(source) { * Also prevent case of non-punctuator token following by spread resulting * in invalid token (e.g. `1...` is invalid Float token). */ + const isNonPunctuator = !(0, _lexer.isPunctuatorTokenKind)(currentToken.kind); if (wasLastAddedTokenNonPunctuator) { if (isNonPunctuator || currentToken.kind === _tokenKind.TokenKind.SPREAD) { @@ -37796,28 +37119,29 @@ function isEqualType(typeA, typeB) { // Equivalent types are equal. if (typeA === typeB) { return true; - } - // If either type is non-null, the other must also be non-null. + } // If either type is non-null, the other must also be non-null. + if ((0, _definition.isNonNullType)(typeA) && (0, _definition.isNonNullType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // If either type is a list, the other must also be a list. + } // If either type is a list, the other must also be a list. + if ((0, _definition.isListType)(typeA) && (0, _definition.isListType)(typeB)) { return isEqualType(typeA.ofType, typeB.ofType); - } - // Otherwise the types are not equal. + } // Otherwise the types are not equal. + return false; } /** * Provided a type and a super type, return true if the first type is either * equal or a subset of the second super type (covariant). */ + function isTypeSubTypeOf(schema, maybeSubType, superType) { // Equivalent type is a valid subtype if (maybeSubType === superType) { return true; - } - // If superType is non-null, maybeSubType must also be non-null. + } // If superType is non-null, maybeSubType must also be non-null. + if ((0, _definition.isNonNullType)(superType)) { if ((0, _definition.isNonNullType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37827,8 +37151,8 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isNonNullType)(maybeSubType)) { // If superType is nullable, maybeSubType may be non-null or nullable. return isTypeSubTypeOf(schema, maybeSubType.ofType, superType); - } - // If superType type is a list, maybeSubType type must also be a list. + } // If superType type is a list, maybeSubType type must also be a list. + if ((0, _definition.isListType)(superType)) { if ((0, _definition.isListType)(maybeSubType)) { return isTypeSubTypeOf(schema, maybeSubType.ofType, superType.ofType); @@ -37838,9 +37162,9 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { if ((0, _definition.isListType)(maybeSubType)) { // If superType is not a list, maybeSubType must also be not a list. return false; - } - // If superType type is an abstract type, check if it is super type of maybeSubType. + } // If superType type is an abstract type, check if it is super type of maybeSubType. // Otherwise, the child type is not a valid subtype of the parent type. + return (0, _definition.isAbstractType)(superType) && ((0, _definition.isInterfaceType)(maybeSubType) || (0, _definition.isObjectType)(maybeSubType)) && schema.isSubType(superType, maybeSubType); } /** @@ -37852,6 +37176,7 @@ function isTypeSubTypeOf(schema, maybeSubType, superType) { * * This function is commutative. */ + function doTypesOverlap(schema, typeA, typeB) { // Equivalent types overlap if (typeA === typeB) { @@ -37862,15 +37187,15 @@ function doTypesOverlap(schema, typeA, typeB) { // If both types are abstract, then determine if there is any intersection // between possible concrete types of each. return schema.getPossibleTypes(typeA).some(type => schema.isSubType(typeB, type)); - } - // Determine if the latter type is a possible concrete type of the former. + } // Determine if the latter type is a possible concrete type of the former. + return schema.isSubType(typeA, typeB); } if ((0, _definition.isAbstractType)(typeB)) { // Determine if the former type is a possible concrete type of the latter. return schema.isSubType(typeB, typeA); - } - // Otherwise the types do not overlap. + } // Otherwise the types do not overlap. + return false; } @@ -37923,6 +37248,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.valueFromAST = valueFromAST; var _inspect = __webpack_require__(/*! ../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); var _invariant = __webpack_require__(/*! ../jsutils/invariant.mjs */ "../../../node_modules/graphql/jsutils/invariant.mjs"); +var _keyMap = __webpack_require__(/*! ../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); /** @@ -37945,6 +37271,7 @@ var _definition = __webpack_require__(/*! ../type/definition.mjs */ "../../../no * | NullValue | null | * */ + function valueFromAST(valueNode, type, variables) { if (!valueNode) { // When there is no node, then there is also no value. @@ -37960,10 +37287,10 @@ function valueFromAST(valueNode, type, variables) { const variableValue = variables[variableName]; if (variableValue === null && (0, _definition.isNonNullType)(type)) { return; // Invalid: intentionally return no value. - } - // Note: This does no further checking that this variable is correct. + } // Note: This does no further checking that this variable is correct. // This assumes that this query has been validated and the variable // usage here is of the correct type. + return variableValue; } if ((0, _definition.isNonNullType)(type)) { @@ -38009,10 +37336,10 @@ function valueFromAST(valueNode, type, variables) { return; // Invalid: intentionally return no value. } const coercedObj = Object.create(null); - const fieldNodes = new Map(valueNode.fields.map(field => [field.name.value, field])); + const fieldNodes = (0, _keyMap.keyMap)(valueNode.fields, field => field.name.value); for (const field of Object.values(type.getFields())) { - const fieldNode = fieldNodes.get(field.name); - if (fieldNode == null || isMissingVariable(fieldNode.value, variables)) { + const fieldNode = fieldNodes[field.name]; + if (!fieldNode || isMissingVariable(fieldNode.value, variables)) { if (field.defaultValue !== undefined) { coercedObj[field.name] = field.defaultValue; } else if ((0, _definition.isNonNullType)(field.type)) { @@ -38054,10 +37381,11 @@ function valueFromAST(valueNode, type, variables) { } /* c8 ignore next 3 */ // Not reachable, all possible input types have been considered. + false || (0, _invariant.invariant)(false, 'Unexpected input type: ' + (0, _inspect.inspect)(type)); -} -// Returns true if the provided valueNode is a variable which is not defined +} // Returns true if the provided valueNode is a variable which is not defined // in the set of variables. + function isMissingVariable(valueNode, variables) { return valueNode.kind === _kinds.Kind.VARIABLE && (variables == null || variables[valueNode.name.value] === undefined); } @@ -38094,6 +37422,7 @@ var _kinds = __webpack_require__(/*! ../language/kinds.mjs */ "../../../node_mod * | Null | null | * */ + function valueFromASTUntyped(valueNode, variables) { switch (valueNode.kind) { case _kinds.Kind.NULL: @@ -38192,14 +37521,14 @@ class ASTValidationContext { let fragments = this._recursivelyReferencedFragments.get(operation); if (!fragments) { fragments = []; - const collectedNames = new Set(); + const collectedNames = Object.create(null); const nodesToVisit = [operation.selectionSet]; let node; while (node = nodesToVisit.pop()) { for (const spread of this.getFragmentSpreads(node)) { const fragName = spread.name.value; - if (!collectedNames.has(fragName)) { - collectedNames.add(fragName); + if (collectedNames[fragName] !== true) { + collectedNames[fragName] = true; const fragment = this.getFragment(fragName); if (fragment) { fragments.push(fragment); @@ -38312,24 +37641,6 @@ exports.ValidationContext = ValidationContext; Object.defineProperty(exports, "__esModule", ({ value: true })); -Object.defineProperty(exports, "DeferStreamDirectiveLabelRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnRootFieldRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule; - } -})); -Object.defineProperty(exports, "DeferStreamDirectiveOnValidOperationsRule", ({ - enumerable: true, - get: function () { - return _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule; - } -})); Object.defineProperty(exports, "ExecutableDefinitionsRule", ({ enumerable: true, get: function () { @@ -38462,12 +37773,6 @@ Object.defineProperty(exports, "SingleFieldSubscriptionsRule", ({ return _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule; } })); -Object.defineProperty(exports, "StreamDirectiveOnListFieldRule", ({ - enumerable: true, - get: function () { - return _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule; - } -})); Object.defineProperty(exports, "UniqueArgumentDefinitionNamesRule", ({ enumerable: true, get: function () { @@ -38585,9 +37890,6 @@ Object.defineProperty(exports, "validate", ({ var _validate = __webpack_require__(/*! ./validate.mjs */ "../../../node_modules/graphql/validation/validate.mjs"); var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../../../node_modules/graphql/validation/ValidationContext.mjs"); var _specifiedRules = __webpack_require__(/*! ./specifiedRules.mjs */ "../../../node_modules/graphql/validation/specifiedRules.mjs"); -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -38605,7 +37907,6 @@ var _PossibleFragmentSpreadsRule = __webpack_require__(/*! ./rules/PossibleFragm var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectivesPerLocationRule = __webpack_require__(/*! ./rules/UniqueDirectivesPerLocationRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectivesPerLocationRule.mjs"); var _UniqueFragmentNamesRule = __webpack_require__(/*! ./rules/UniqueFragmentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueFragmentNamesRule.mjs"); @@ -38629,182 +37930,6 @@ var _NoSchemaIntrospectionCustomRule = __webpack_require__(/*! ./rules/custom/No /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs": -/*!****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs ***! - \****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveLabelRule = DeferStreamDirectiveLabelRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directive labels are unique - * - * A GraphQL document is only valid if defer and stream directives' label argument is static and unique. - */ -function DeferStreamDirectiveLabelRule(context) { - const knownLabels = new Map(); - return { - Directive(node) { - if (node.name.value === _directives.GraphQLDeferDirective.name || node.name.value === _directives.GraphQLStreamDirective.name) { - var _node$arguments; - const labelArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'label'); - const labelValue = labelArgument === null || labelArgument === void 0 ? void 0 : labelArgument.value; - if (!labelValue) { - return; - } - if (labelValue.kind !== _kinds.Kind.STRING) { - context.reportError(new _GraphQLError.GraphQLError(`Directive "${node.name.value}"'s label argument must be a static string.`, { - nodes: node - })); - return; - } - const knownLabel = knownLabels.get(labelValue.value); - if (knownLabel != null) { - context.reportError(new _GraphQLError.GraphQLError('Defer/Stream directive label argument must be unique.', { - nodes: [knownLabel, node] - })); - } else { - knownLabels.set(labelValue.value, node); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs": -/*!**********************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs ***! - \**********************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnRootFieldRule = DeferStreamDirectiveOnRootFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Defer and stream directives are used on valid root field - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnRootFieldRule(context) { - return { - Directive(node) { - const mutationType = context.getSchema().getMutationType(); - const subscriptionType = context.getSchema().getSubscriptionType(); - const parentType = context.getParentType(); - if (parentType && node.name.value === _directives.GraphQLDeferDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Defer directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - if (parentType && node.name.value === _directives.GraphQLStreamDirective.name) { - if (mutationType && parentType === mutationType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root mutation type "${parentType.name}".`, { - nodes: node - })); - } - if (subscriptionType && parentType === subscriptionType) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on root subscription type "${parentType.name}".`, { - nodes: node - })); - } - } - } - }; -} - -/***/ }), - -/***/ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs": -/*!****************************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs ***! - \****************************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.DeferStreamDirectiveOnValidOperationsRule = DeferStreamDirectiveOnValidOperationsRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _ast = __webpack_require__(/*! ../../language/ast.mjs */ "../../../node_modules/graphql/language/ast.mjs"); -var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -function ifArgumentCanBeFalse(node) { - var _node$arguments; - const ifArgument = (_node$arguments = node.arguments) === null || _node$arguments === void 0 ? void 0 : _node$arguments.find(arg => arg.name.value === 'if'); - if (!ifArgument) { - return false; - } - if (ifArgument.value.kind === _kinds.Kind.BOOLEAN) { - if (ifArgument.value.value) { - return false; - } - } else if (ifArgument.value.kind !== _kinds.Kind.VARIABLE) { - return false; - } - return true; -} -/** - * Defer And Stream Directives Are Used On Valid Operations - * - * A GraphQL document is only valid if defer directives are not used on root mutation or subscription types. - */ -function DeferStreamDirectiveOnValidOperationsRule(context) { - const fragmentsUsedOnSubscriptions = new Set(); - return { - OperationDefinition(operation) { - if (operation.operation === _ast.OperationTypeNode.SUBSCRIPTION) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentsUsedOnSubscriptions.add(fragment.name.value); - } - } - }, - Directive(node, _key, _parent, _path, ancestors) { - const definitionNode = ancestors[2]; - if ('kind' in definitionNode && (definitionNode.kind === _kinds.Kind.FRAGMENT_DEFINITION && fragmentsUsedOnSubscriptions.has(definitionNode.name.value) || definitionNode.kind === _kinds.Kind.OPERATION_DEFINITION && definitionNode.operation === _ast.OperationTypeNode.SUBSCRIPTION)) { - if (node.name.value === _directives.GraphQLDeferDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Defer directive not supported on subscription operations. Disable `@defer` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } else if (node.name.value === _directives.GraphQLStreamDirective.name) { - if (!ifArgumentCanBeFalse(node)) { - context.reportError(new _GraphQLError.GraphQLError('Stream directive not supported on subscription operations. Disable `@stream` by setting the `if` argument to `false`.', { - nodes: node - })); - } - } - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs": /*!************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs ***! @@ -38880,14 +38005,14 @@ function FieldsOnCorrectTypeRule(context) { if (!fieldDef) { // This field doesn't exist, lets look for suggestions. const schema = context.getSchema(); - const fieldName = node.name.value; - // First determine if there are any suggested types to condition on. - let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); - // If there are no suggested types, then perhaps this was a typo? + const fieldName = node.name.value; // First determine if there are any suggested types to condition on. + + let suggestion = (0, _didYouMean.didYouMean)('to use an inline fragment on', getSuggestedTypeNames(schema, type, fieldName)); // If there are no suggested types, then perhaps this was a typo? + if (suggestion === '') { suggestion = (0, _didYouMean.didYouMean)(getSuggestedFieldNames(type, fieldName)); - } - // Report an error, including helpful suggestions. + } // Report an error, including helpful suggestions. + context.reportError(new _GraphQLError.GraphQLError(`Cannot query field "${fieldName}" on type "${type.name}".` + suggestion, { nodes: node })); @@ -38901,6 +38026,7 @@ function FieldsOnCorrectTypeRule(context) { * they implement. If any of those types include the provided field, suggest them, * sorted by how often the type is referenced. */ + function getSuggestedTypeNames(schema, type, fieldName) { if (!(0, _definition.isAbstractType)(type)) { // Must be an Object type, which does not have possible fields. @@ -38909,18 +38035,18 @@ function getSuggestedTypeNames(schema, type, fieldName) { const suggestedTypes = new Set(); const usageCount = Object.create(null); for (const possibleType of schema.getPossibleTypes(type)) { - if (possibleType.getFields()[fieldName] == null) { + if (!possibleType.getFields()[fieldName]) { continue; - } - // This object type defines this field. + } // This object type defines this field. + suggestedTypes.add(possibleType); usageCount[possibleType.name] = 1; for (const possibleInterface of possibleType.getInterfaces()) { var _usageCount$possibleI; - if (possibleInterface.getFields()[fieldName] == null) { + if (!possibleInterface.getFields()[fieldName]) { continue; - } - // This interface type defines this field. + } // This interface type defines this field. + suggestedTypes.add(possibleInterface); usageCount[possibleInterface.name] = ((_usageCount$possibleI = usageCount[possibleInterface.name]) !== null && _usageCount$possibleI !== void 0 ? _usageCount$possibleI : 0) + 1; } @@ -38930,8 +38056,8 @@ function getSuggestedTypeNames(schema, type, fieldName) { const usageCountDiff = usageCount[typeB.name] - usageCount[typeA.name]; if (usageCountDiff !== 0) { return usageCountDiff; - } - // Suggest super types first followed by subtypes + } // Suggest super types first followed by subtypes + if ((0, _definition.isInterfaceType)(typeA) && schema.isSubType(typeA, typeB)) { return -1; } @@ -38945,12 +38071,13 @@ function getSuggestedTypeNames(schema, type, fieldName) { * For the field name provided, determine if there are any similar field names * that may be the result of a typo. */ + function getSuggestedFieldNames(type, fieldName) { if ((0, _definition.isObjectType)(type) || (0, _definition.isInterfaceType)(type)) { const possibleFieldNames = Object.keys(type.getFields()); return (0, _suggestionList.suggestionList)(fieldName, possibleFieldNames); - } - // Otherwise, must be a Union type, which does not define fields. + } // Otherwise, must be a Union type, which does not define fields. + return []; } @@ -39058,28 +38185,31 @@ function KnownArgumentNamesRule(context) { /** * @internal */ + function KnownArgumentNamesOnDirectivesRule(context) { - const directiveArgs = new Map(); + const directiveArgs = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - directiveArgs.set(directive.name, directive.args.map(arg => arg.name)); + directiveArgs[directive.name] = directive.args.map(arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argsNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - directiveArgs.set(def.name.value, argsNodes.map(arg => arg.name.value)); + directiveArgs[def.name.value] = argsNodes.map(arg => arg.name.value); } } return { Directive(directiveNode) { const directiveName = directiveNode.name.value; - const knownArgs = directiveArgs.get(directiveName); - if (directiveNode.arguments != null && knownArgs != null) { + const knownArgs = directiveArgs[directiveName]; + if (directiveNode.arguments && knownArgs) { for (const argNode of directiveNode.arguments) { const argName = argNode.name.value; if (!knownArgs.includes(argName)) { @@ -39125,30 +38255,30 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Defined */ function KnownDirectivesRule(context) { - const locationsMap = new Map(); + const locationsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - locationsMap.set(directive.name, directive.locations); + locationsMap[directive.name] = directive.locations; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - locationsMap.set(def.name.value, def.locations.map(name => name.value)); + locationsMap[def.name.value] = def.locations.map(name => name.value); } } return { Directive(node, _key, _parent, _path, ancestors) { const name = node.name.value; - const locations = locationsMap.get(name); - if (locations == null) { + const locations = locationsMap[name]; + if (!locations) { context.reportError(new _GraphQLError.GraphQLError(`Unknown directive "@${name}".`, { nodes: node })); return; } const candidateLocation = getDirectiveLocationForASTPath(ancestors); - if (candidateLocation != null && !locations.includes(candidateLocation)) { + if (candidateLocation && !locations.includes(candidateLocation)) { context.reportError(new _GraphQLError.GraphQLError(`Directive "@${name}" may not be used on ${candidateLocation}.`, { nodes: node })); @@ -39157,8 +38287,8 @@ function KnownDirectivesRule(context) { }; } function getDirectiveLocationForASTPath(ancestors) { - const appliedTo = ancestors.at(-1); - appliedTo != null && 'kind' in appliedTo || (0, _invariant.invariant)(false); + const appliedTo = ancestors[ancestors.length - 1]; + 'kind' in appliedTo || (0, _invariant.invariant)(false); switch (appliedTo.kind) { case _kinds.Kind.OPERATION_DEFINITION: return getDirectiveLocationForOperation(appliedTo.operation); @@ -39199,12 +38329,14 @@ function getDirectiveLocationForASTPath(ancestors) { return _directiveLocation.DirectiveLocation.INPUT_OBJECT; case _kinds.Kind.INPUT_VALUE_DEFINITION: { - const parentNode = ancestors.at(-3); - parentNode != null && 'kind' in parentNode || (0, _invariant.invariant)(false); + const parentNode = ancestors[ancestors.length - 3]; + 'kind' in parentNode || (0, _invariant.invariant)(false); return parentNode.kind === _kinds.Kind.INPUT_OBJECT_TYPE_DEFINITION ? _directiveLocation.DirectiveLocation.INPUT_FIELD_DEFINITION : _directiveLocation.DirectiveLocation.ARGUMENT_DEFINITION; } // Not reachable, all possible types have been considered. - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(appliedTo.kind)); } @@ -39286,23 +38418,26 @@ var _scalars = __webpack_require__(/*! ../../type/scalars.mjs */ "../../../node_ * See https://spec.graphql.org/draft/#sec-Fragment-Spread-Type-Existence */ function KnownTypeNamesRule(context) { - var _context$getSchema$ge, _context$getSchema; - const { - definitions - } = context.getDocument(); - const existingTypesMap = (_context$getSchema$ge = (_context$getSchema = context.getSchema()) === null || _context$getSchema === void 0 ? void 0 : _context$getSchema.getTypeMap()) !== null && _context$getSchema$ge !== void 0 ? _context$getSchema$ge : {}; - const typeNames = new Set([...Object.keys(existingTypesMap), ...definitions.filter(_predicates.isTypeDefinitionNode).map(def => def.name.value)]); + const schema = context.getSchema(); + const existingTypesMap = schema ? schema.getTypeMap() : Object.create(null); + const definedTypes = Object.create(null); + for (const def of context.getDocument().definitions) { + if ((0, _predicates.isTypeDefinitionNode)(def)) { + definedTypes[def.name.value] = true; + } + } + const typeNames = [...Object.keys(existingTypesMap), ...Object.keys(definedTypes)]; return { NamedType(node, _1, parent, _2, ancestors) { const typeName = node.name.value; - if (!typeNames.has(typeName)) { + if (!existingTypesMap[typeName] && !definedTypes[typeName]) { var _ancestors$; const definitionNode = (_ancestors$ = ancestors[2]) !== null && _ancestors$ !== void 0 ? _ancestors$ : parent; const isSDL = definitionNode != null && isSDLNode(definitionNode); - if (isSDL && standardTypeNames.has(typeName)) { + if (isSDL && standardTypeNames.includes(typeName)) { return; } - const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? [...standardTypeNames, ...typeNames] : [...typeNames]); + const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, isSDL ? standardTypeNames.concat(typeNames) : typeNames); context.reportError(new _GraphQLError.GraphQLError(`Unknown type "${typeName}".` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node })); @@ -39310,7 +38445,7 @@ function KnownTypeNamesRule(context) { } }; } -const standardTypeNames = new Set([..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name)); +const standardTypeNames = [..._scalars.specifiedScalarTypes, ..._introspection.introspectionTypes].map(type => type.name); function isSDLNode(value) { return 'kind' in value && ((0, _predicates.isTypeSystemDefinitionNode)(value) || (0, _predicates.isTypeSystemExtensionNode)(value)); } @@ -39429,14 +38564,14 @@ function MaxIntrospectionDepthRule(context) { } const fragment = context.getFragment(fragmentName); if (!fragment) { - // Missing fragments checks are handled by the `KnownFragmentNamesRule`. + // Missing fragments checks are handled by `KnownFragmentNamesRule`. return false; - } - // Rather than following an immutable programming pattern which has + } // Rather than following an immutable programming pattern which has // significant memory and garbage collection overhead, we've opted to // take a mutable approach for efficiency's sake. Importantly visiting a // fragment twice is fine, so long as you don't do one visit inside the // other. + try { visitedFragments[fragmentName] = true; return checkDepth(fragment, visitedFragments, depth); @@ -39446,15 +38581,14 @@ function MaxIntrospectionDepthRule(context) { } if (node.kind === _kinds.Kind.FIELD && ( // check all introspection lists - // TODO: instead of relying on field names, check whether the type is a list node.name.value === 'fields' || node.name.value === 'interfaces' || node.name.value === 'possibleTypes' || node.name.value === 'inputFields')) { // eslint-disable-next-line no-param-reassign depth++; if (depth >= MAX_LISTS_DEPTH) { return true; } - } - // handles fields and inline fragments + } // handles fields and inline fragments + if ('selectionSet' in node && node.selectionSet) { for (const child of node.selectionSet.selections) { if (checkDepth(child, visitedFragments, depth)) { @@ -39504,10 +38638,10 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ function NoFragmentCyclesRule(context) { // Tracks already visited fragments to maintain O(N) and to ensure that cycles // are not redundantly reported. - const visitedFrags = new Set(); - // Array of AST nodes used to produce meaningful errors - const spreadPath = []; - // Position in the spread path + const visitedFrags = Object.create(null); // Array of AST nodes used to produce meaningful errors + + const spreadPath = []; // Position in the spread path + const spreadPathIndexByName = Object.create(null); return { OperationDefinition: () => false, @@ -39515,16 +38649,16 @@ function NoFragmentCyclesRule(context) { detectCycleRecursive(node); return false; } - }; - // This does a straight-forward DFS to find cycles. + }; // This does a straight-forward DFS to find cycles. // It does not terminate when a cycle was found but continues to explore // the graph to find all possible cycles. + function detectCycleRecursive(fragment) { - if (visitedFrags.has(fragment.name.value)) { + if (visitedFrags[fragment.name.value]) { return; } const fragmentName = fragment.name.value; - visitedFrags.add(fragmentName); + visitedFrags[fragmentName] = true; const spreadNodes = context.getFragmentSpreads(fragment.selectionSet); if (spreadNodes.length === 0) { return; @@ -39576,21 +38710,28 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variable-Uses-Defined */ function NoUndefinedVariablesRule(context) { + let variableNameDefined = Object.create(null); return { - OperationDefinition(operation) { - var _operation$variableDe; - const variableNameDefined = new Set((_operation$variableDe = operation.variableDefinitions) === null || _operation$variableDe === void 0 ? void 0 : _operation$variableDe.map(node => node.variable.name.value)); - const usages = context.getRecursiveVariableUsages(operation); - for (const { - node - } of usages) { - const varName = node.name.value; - if (!variableNameDefined.has(varName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { - nodes: [node, operation] - })); + OperationDefinition: { + enter() { + variableNameDefined = Object.create(null); + }, + leave(operation) { + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + const varName = node.name.value; + if (variableNameDefined[varName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${varName}" is not defined by operation "${operation.name.value}".` : `Variable "$${varName}" is not defined.`, { + nodes: [node, operation] + })); + } } } + }, + VariableDefinition(node) { + variableNameDefined[node.variable.name.value] = true; } }; } @@ -39619,13 +38760,11 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragments-Must-Be-Used */ function NoUnusedFragmentsRule(context) { - const fragmentNameUsed = new Set(); + const operationDefs = []; const fragmentDefs = []; return { - OperationDefinition(operation) { - for (const fragment of context.getRecursivelyReferencedFragments(operation)) { - fragmentNameUsed.add(fragment.name.value); - } + OperationDefinition(node) { + operationDefs.push(node); return false; }, FragmentDefinition(node) { @@ -39634,9 +38773,15 @@ function NoUnusedFragmentsRule(context) { }, Document: { leave() { + const fragmentNameUsed = Object.create(null); + for (const operation of operationDefs) { + for (const fragment of context.getRecursivelyReferencedFragments(operation)) { + fragmentNameUsed[fragment.name.value] = true; + } + } for (const fragmentDef of fragmentDefs) { const fragName = fragmentDef.name.value; - if (!fragmentNameUsed.has(fragName)) { + if (fragmentNameUsed[fragName] !== true) { context.reportError(new _GraphQLError.GraphQLError(`Fragment "${fragName}" is never used.`, { nodes: fragmentDef })); @@ -39671,24 +38816,32 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-All-Variables-Used */ function NoUnusedVariablesRule(context) { + let variableDefs = []; return { - OperationDefinition(operation) { - var _operation$variableDe; - const usages = context.getRecursiveVariableUsages(operation); - const variableNameUsed = new Set(usages.map(({ - node - }) => node.name.value)); - // FIXME: https://github.com/graphql/graphql-js/issues/2203 - /* c8 ignore next */ - const variableDefinitions = (_operation$variableDe = operation.variableDefinitions) !== null && _operation$variableDe !== void 0 ? _operation$variableDe : []; - for (const variableDef of variableDefinitions) { - const variableName = variableDef.variable.name.value; - if (!variableNameUsed.has(variableName)) { - context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { - nodes: variableDef - })); + OperationDefinition: { + enter() { + variableDefs = []; + }, + leave(operation) { + const variableNameUsed = Object.create(null); + const usages = context.getRecursiveVariableUsages(operation); + for (const { + node + } of usages) { + variableNameUsed[node.name.value] = true; + } + for (const variableDef of variableDefs) { + const variableName = variableDef.variable.name.value; + if (variableNameUsed[variableName] !== true) { + context.reportError(new _GraphQLError.GraphQLError(operation.name ? `Variable "$${variableName}" is never used in operation "${operation.name.value}".` : `Variable "$${variableName}" is never used.`, { + nodes: variableDef + })); + } } } + }, + VariableDefinition(def) { + variableDefs.push(def); } }; } @@ -39714,9 +38867,6 @@ var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../n var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); var _sortValueNode = __webpack_require__(/*! ../../utilities/sortValueNode.mjs */ "../../../node_modules/graphql/utilities/sortValueNode.mjs"); var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ "../../../node_modules/graphql/utilities/typeFromAST.mjs"); -/* eslint-disable max-params */ -// This file contains a lot of such errors but we plan to refactor it anyway -// so just disable it for entire file. function reasonMessage(reason) { if (Array.isArray(reason)) { return reason.map(([responseName, subReason]) => `subfields "${responseName}" conflict because ` + reasonMessage(subReason)).join(' and '); @@ -39732,14 +38882,15 @@ function reasonMessage(reason) { * * See https://spec.graphql.org/draft/#sec-Field-Selection-Merging */ + function OverlappingFieldsCanBeMergedRule(context) { // A memoization for when two fragments are compared "between" each other for // conflicts. Two fragments may be compared many times, so memoizing this can // dramatically improve the performance of this validator. - const comparedFragmentPairs = new PairSet(); - // A cache for the "field map" and list of fragment names found in any given + const comparedFragmentPairs = new PairSet(); // A cache for the "field map" and list of fragment names found in any given // selection set. Selection sets may be asked for this information multiple // times, so this improves the performance of this validator. + const cachedFieldsAndFragmentNames = new Map(); return { SelectionSet(selectionSet) { @@ -39753,6 +38904,7 @@ function OverlappingFieldsCanBeMergedRule(context) { } }; } + /** * Algorithm: * @@ -39812,43 +38964,43 @@ function OverlappingFieldsCanBeMergedRule(context) { // GraphQL Document. function findConflictsWithinSelectionSet(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentType, selectionSet) { const conflicts = []; - const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); - // (A) Find find all conflicts "within" the fields of this selection set. + const [fieldMap, fragmentNames] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet); // (A) Find find all conflicts "within" the fields of this selection set. // Note: this is the *only place* `collectConflictsWithin` is called. + collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap); if (fragmentNames.length !== 0) { // (B) Then collect conflicts between these fields and those represented by // each spread fragment name found. for (let i = 0; i < fragmentNames.length; i++) { - collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); - // (C) Then compare this fragment with all other fragments found in this + collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fieldMap, fragmentNames[i]); // (C) Then compare this fragment with all other fragments found in this // selection set to collect conflicts between fragments spread together. // This compares each item in the list of fragment names to every other // item in that same list (except for itself). + for (let j = i + 1; j < fragmentNames.length; j++) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, false, fragmentNames[i], fragmentNames[j]); } } } return conflicts; -} -// Collect all conflicts found between a set of fields and a fragment reference +} // Collect all conflicts found between a set of fields and a fragment reference // including via spreading in any nested fragments. + function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fragmentName) { const fragment = context.getFragment(fragmentName); if (!fragment) { return; } - const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); - // Do not compare a fragment's fieldMap to itself. + const [fieldMap2, referencedFragmentNames] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment); // Do not compare a fragment's fieldMap to itself. + if (fieldMap === fieldMap2) { return; - } - // (D) First collect any conflicts between the provided collection of fields + } // (D) First collect any conflicts between the provided collection of fields // and the collection of fields represented by the given fragment. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); - // (E) Then collect any conflicts between the provided collection of fields + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, fieldMap2); // (E) Then collect any conflicts between the provided collection of fields // and any fragment names found in the given fragment. + for (const referencedFragmentName of referencedFragmentNames) { // Memoize so two fragments are not compared for conflicts more than once. if (comparedFragmentPairs.has(referencedFragmentName, fragmentName, areMutuallyExclusive)) { @@ -39857,15 +39009,15 @@ function collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFiel comparedFragmentPairs.add(referencedFragmentName, fragmentName, areMutuallyExclusive); collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap, referencedFragmentName); } -} -// Collect all conflicts found between two fragments, including via spreading in +} // Collect all conflicts found between two fragments, including via spreading in // any nested fragments. + function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2) { // No need to compare a fragment to itself. if (fragmentName1 === fragmentName2) { return; - } - // Memoize so two fragments are not compared for conflicts more than once. + } // Memoize so two fragments are not compared for conflicts more than once. + if (comparedFragmentPairs.has(fragmentName1, fragmentName2, areMutuallyExclusive)) { return; } @@ -39876,57 +39028,57 @@ function collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFra return; } const [fieldMap1, referencedFragmentNames1] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment1); - const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); - // (F) First, collect all conflicts between these two collections of fields + const [fieldMap2, referencedFragmentNames2] = getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment2); // (F) First, collect all conflicts between these two collections of fields // (not including any nested fragments). - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (G) Then collect conflicts between the first fragment and any nested + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (G) Then collect conflicts between the first fragment and any nested // fragments spread in the second fragment. + for (const referencedFragmentName2 of referencedFragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, referencedFragmentName2); - } - // (G) Then collect conflicts between the second fragment and any nested + } // (G) Then collect conflicts between the second fragment and any nested // fragments spread in the first fragment. + for (const referencedFragmentName1 of referencedFragmentNames1) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, referencedFragmentName1, fragmentName2); } -} -// Find all conflicts found between two selection sets, including those found +} // Find all conflicts found between two selection sets, including those found // via spreading in fragments. Called when determining if conflicts exist // between the sub-fields of two overlapping fields. + function findConflictsBetweenSubSelectionSets(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, parentType1, selectionSet1, parentType2, selectionSet2) { const conflicts = []; const [fieldMap1, fragmentNames1] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType1, selectionSet1); - const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); - // (H) First, collect all conflicts between these two collections of field. - collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); - // (I) Then collect conflicts between the first collection of fields and + const [fieldMap2, fragmentNames2] = getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType2, selectionSet2); // (H) First, collect all conflicts between these two collections of field. + + collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fieldMap2); // (I) Then collect conflicts between the first collection of fields and // those referenced by each fragment name associated with the second. + for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap1, fragmentName2); - } - // (I) Then collect conflicts between the second collection of fields and + } // (I) Then collect conflicts between the second collection of fields and // those referenced by each fragment name associated with the first. + for (const fragmentName1 of fragmentNames1) { collectConflictsBetweenFieldsAndFragment(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fieldMap2, fragmentName1); - } - // (J) Also collect conflicts between any fragment names by the first and + } // (J) Also collect conflicts between any fragment names by the first and // fragment names by the second. This compares each item in the first set of // names to each item in the second set of names. + for (const fragmentName1 of fragmentNames1) { for (const fragmentName2 of fragmentNames2) { collectConflictsBetweenFragments(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, areMutuallyExclusive, fragmentName1, fragmentName2); } } return conflicts; -} -// Collect all Conflicts "within" one collection of fields. +} // Collect all Conflicts "within" one collection of fields. + function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, fieldMap) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For every response name, if there are multiple fields, they // must be compared to find a potential conflict. - for (const [responseName, fields] of fieldMap.entries()) { + for (const [responseName, fields] of Object.entries(fieldMap)) { // This compares every field in the list to every other field in this list // (except to itself). If the list only has one item, nothing needs to // be compared. @@ -39943,21 +39095,21 @@ function collectConflictsWithin(context, conflicts, cachedFieldsAndFragmentNames } } } -} -// Collect all Conflicts between two collections of fields. This is similar to, +} // Collect all Conflicts between two collections of fields. This is similar to, // but different from the `collectConflictsWithin` function above. This check // assumes that `collectConflictsWithin` has already been called on each // provided collection of fields. This is true because this validator traverses // each individual selection set. + function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, fieldMap1, fieldMap2) { // A field map is a keyed collection, where each key represents a response // name and the value at that key is a list of all fields which provide that // response name. For any response name which appears in both provided field // maps, each field from the first field map must be compared to every field // in the second field map to find potential conflicts. - for (const [responseName, fields1] of fieldMap1.entries()) { - const fields2 = fieldMap2.get(responseName); - if (fields2 != null) { + for (const [responseName, fields1] of Object.entries(fieldMap1)) { + const fields2 = fieldMap2[responseName]; + if (fields2) { for (const field1 of fields1) { for (const field2 of fields2) { const conflict = findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2); @@ -39968,14 +39120,12 @@ function collectConflictsBetween(context, conflicts, cachedFieldsAndFragmentName } } } -} -// Determines if there is a conflict between two particular fields, including +} // Determines if there is a conflict between two particular fields, including // comparing their sub-fields. + function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPairs, parentFieldsAreMutuallyExclusive, responseName, field1, field2) { - var _node1$directives, _node2$directives; const [parentType1, node1, def1] = field1; - const [parentType2, node2, def2] = field2; - // If it is known that two fields could not possibly apply at the same + const [parentType2, node2, def2] = field2; // If it is known that two fields could not possibly apply at the same // time, due to the parent types, then it is safe to permit them to diverge // in aliased field or arguments used as they will not present any ambiguity // by differing. @@ -39983,6 +39133,7 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai // different Object types. Interface or Union types might overlap - if not // in the current state of the schema, then perhaps in some future version, // thus may not safely diverge. + const areMutuallyExclusive = parentFieldsAreMutuallyExclusive || parentType1 !== parentType2 && (0, _definition.isObjectType)(parentType1) && (0, _definition.isObjectType)(parentType2); if (!areMutuallyExclusive) { // Two aliases must refer to the same field. @@ -39990,27 +39141,21 @@ function findConflict(context, cachedFieldsAndFragmentNames, comparedFragmentPai const name2 = node2.name.value; if (name1 !== name2) { return [[responseName, `"${name1}" and "${name2}" are different fields`], [node1], [node2]]; - } - // Two field calls must have the same arguments. + } // Two field calls must have the same arguments. + if (!sameArguments(node1, node2)) { return [[responseName, 'they have differing arguments'], [node1], [node2]]; } - } - // FIXME https://github.com/graphql/graphql-js/issues/2203 - const directives1 = /* c8 ignore next */(_node1$directives = node1.directives) !== null && _node1$directives !== void 0 ? _node1$directives : []; - const directives2 = /* c8 ignore next */(_node2$directives = node2.directives) !== null && _node2$directives !== void 0 ? _node2$directives : []; - if (!sameStreams(directives1, directives2)) { - return [[responseName, 'they have differing stream directives'], [node1], [node2]]; - } - // The return type for each field. + } // The return type for each field. + const type1 = def1 === null || def1 === void 0 ? void 0 : def1.type; const type2 = def2 === null || def2 === void 0 ? void 0 : def2.type; if (type1 && type2 && doTypesConflict(type1, type2)) { return [[responseName, `they return conflicting types "${(0, _inspect.inspect)(type1)}" and "${(0, _inspect.inspect)(type2)}"`], [node1], [node2]]; - } - // Collect and compare sub-fields. Use the same "visited fragment names" list + } // Collect and compare sub-fields. Use the same "visited fragment names" list // for both collections so fields in a fragment reference are never // compared to themselves. + const selectionSet1 = node1.selectionSet; const selectionSet2 = node2.selectionSet; if (selectionSet1 && selectionSet2) { @@ -40027,8 +39172,12 @@ function sameArguments(node1, node2) { if (args2 === undefined || args2.length === 0) { return false; } + /* c8 ignore next */ + if (args1.length !== args2.length) { + /* c8 ignore next */ return false; + /* c8 ignore next */ } const values2 = new Map(args2.map(({ name, @@ -40045,26 +39194,10 @@ function sameArguments(node1, node2) { } function stringifyValue(value) { return (0, _printer.print)((0, _sortValueNode.sortValueNode)(value)); -} -function getStreamDirective(directives) { - return directives.find(directive => directive.name.value === 'stream'); -} -function sameStreams(directives1, directives2) { - const stream1 = getStreamDirective(directives1); - const stream2 = getStreamDirective(directives2); - if (!stream1 && !stream2) { - // both fields do not have streams - return true; - } else if (stream1 && stream2) { - // check if both fields have equivalent streams - return sameArguments(stream1, stream2); - } - // fields have a mix of stream and no stream - return false; -} -// Two types conflict if both types could not apply to a value simultaneously. +} // Two types conflict if both types could not apply to a value simultaneously. // Composite types are ignored as their individual field types will be compared // later recursively. However List and Non-Null types must match. + function doTypesConflict(type1, type2) { if ((0, _definition.isListType)(type1)) { return (0, _definition.isListType)(type2) ? doTypesConflict(type1.ofType, type2.ofType) : true; @@ -40082,24 +39215,24 @@ function doTypesConflict(type1, type2) { return type1 !== type2; } return false; -} -// Given a selection set, return the collection of fields (a mapping of response +} // Given a selection set, return the collection of fields (a mapping of response // name to field nodes and definitions) as well as a list of fragment names // referenced via fragment spreads. + function getFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, parentType, selectionSet) { const cached = cachedFieldsAndFragmentNames.get(selectionSet); if (cached) { return cached; } - const nodeAndDefs = new Map(); - const fragmentNames = new Set(); + const nodeAndDefs = Object.create(null); + const fragmentNames = Object.create(null); _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeAndDefs, fragmentNames); - const result = [nodeAndDefs, [...fragmentNames]]; + const result = [nodeAndDefs, Object.keys(fragmentNames)]; cachedFieldsAndFragmentNames.set(selectionSet, result); return result; -} -// Given a reference to a fragment, return the represented collection of fields +} // Given a reference to a fragment, return the represented collection of fields // as well as a list of nested fragment names referenced via fragment spreads. + function getReferencedFieldsAndFragmentNames(context, cachedFieldsAndFragmentNames, fragment) { // Short-circuit building a type from the node if possible. const cached = cachedFieldsAndFragmentNames.get(fragment.selectionSet); @@ -40120,16 +39253,14 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA fieldDef = parentType.getFields()[fieldName]; } const responseName = selection.alias ? selection.alias.value : fieldName; - let nodeAndDefsList = nodeAndDefs.get(responseName); - if (nodeAndDefsList == null) { - nodeAndDefsList = []; - nodeAndDefs.set(responseName, nodeAndDefsList); + if (!nodeAndDefs[responseName]) { + nodeAndDefs[responseName] = []; } - nodeAndDefsList.push([parentType, selection, fieldDef]); + nodeAndDefs[responseName].push([parentType, selection, fieldDef]); break; } case _kinds.Kind.FRAGMENT_SPREAD: - fragmentNames.add(selection.name.value); + fragmentNames[selection.name.value] = true; break; case _kinds.Kind.INLINE_FRAGMENT: { @@ -40140,9 +39271,9 @@ function _collectFieldsAndFragmentNames(context, parentType, selectionSet, nodeA } } } -} -// Given a series of Conflicts which occurred between two sub-fields, generate +} // Given a series of Conflicts which occurred between two sub-fields, generate // a single Conflict. + function subfieldConflicts(conflicts, responseName, node1, node2) { if (conflicts.length > 0) { return [[responseName, conflicts.map(([reason]) => reason)], [node1, ...conflicts.map(([, fields1]) => fields1).flat()], [node2, ...conflicts.map(([,, fields2]) => fields2).flat()]]; @@ -40151,6 +39282,7 @@ function subfieldConflicts(conflicts, responseName, node1, node2) { /** * A way to keep track of pairs of things when the ordering of the pair does not matter. */ + class PairSet { constructor() { this._data = new Map(); @@ -40161,10 +39293,10 @@ class PairSet { const result = (_this$_data$get = this._data.get(key1)) === null || _this$_data$get === void 0 ? void 0 : _this$_data$get.get(key2); if (result === undefined) { return false; - } - // areMutuallyExclusive being false is a superset of being true, hence if + } // areMutuallyExclusive being false is a superset of being true, hence if // we want to know if this PairSet "has" these two with no exclusivity, // we have to ensure it was added as such. + return areMutuallyExclusive ? true : areMutuallyExclusive === result; } add(a, b, areMutuallyExclusive) { @@ -40270,10 +39402,10 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. */ function PossibleTypeExtensionsRule(context) { const schema = context.getSchema(); - const definedTypes = new Map(); + const definedTypes = Object.create(null); for (const def of context.getDocument().definitions) { if ((0, _predicates.isTypeDefinitionNode)(def)) { - definedTypes.set(def.name.value, def); + definedTypes[def.name.value] = def; } } return { @@ -40286,15 +39418,15 @@ function PossibleTypeExtensionsRule(context) { }; function checkExtension(node) { const typeName = node.name.value; - const defNode = definedTypes.get(typeName); + const defNode = definedTypes[typeName]; const existingType = schema === null || schema === void 0 ? void 0 : schema.getType(typeName); let expectedKind; - if (defNode != null) { + if (defNode) { expectedKind = defKindToExtKind[defNode.kind]; } else if (existingType) { expectedKind = typeToExtKind(existingType); } - if (expectedKind != null) { + if (expectedKind) { if (expectedKind !== node.kind) { const kindStr = extensionKindToTypeName(node.kind); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend non-${kindStr} type "${typeName}".`, { @@ -40302,8 +39434,10 @@ function PossibleTypeExtensionsRule(context) { })); } } else { - var _schema$getTypeMap; - const allTypeNames = [...definedTypes.keys(), ...Object.keys((_schema$getTypeMap = schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) !== null && _schema$getTypeMap !== void 0 ? _schema$getTypeMap : {})]; + const allTypeNames = Object.keys({ + ...definedTypes, + ...(schema === null || schema === void 0 ? void 0 : schema.getTypeMap()) + }); const suggestedTypes = (0, _suggestionList.suggestionList)(typeName, allTypeNames); context.reportError(new _GraphQLError.GraphQLError(`Cannot extend type "${typeName}" because it is not defined.` + (0, _didYouMean.didYouMean)(suggestedTypes), { nodes: node.name @@ -40340,6 +39474,7 @@ function typeToExtKind(type) { } /* c8 ignore next 3 */ // Not reachable. All possible types have been considered + false || (0, _invariant.invariant)(false, 'Unexpected type: ' + (0, _inspect.inspect)(type)); } function extensionKindToTypeName(kind) { @@ -40357,7 +39492,9 @@ function extensionKindToTypeName(kind) { case _kinds.Kind.INPUT_OBJECT_TYPE_EXTENSION: return 'input object'; // Not reachable. All possible types have been considered - /* c8 ignore next 2 */ + + /* c8 ignore next */ + default: false || (0, _invariant.invariant)(false, 'Unexpected kind: ' + (0, _inspect.inspect)(kind)); } @@ -40379,6 +39516,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ProvidedRequiredArgumentsOnDirectivesRule = ProvidedRequiredArgumentsOnDirectivesRule; exports.ProvidedRequiredArgumentsRule = ProvidedRequiredArgumentsRule; var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _printer = __webpack_require__(/*! ../../language/printer.mjs */ "../../../node_modules/graphql/language/printer.mjs"); @@ -40402,7 +39540,8 @@ function ProvidedRequiredArgumentsRule(context) { if (!fieldDef) { return false; } - const providedArgs = new Set( // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const providedArgs = new Set( + // FIXME: https://github.com/graphql/graphql-js/issues/2203 /* c8 ignore next */ (_fieldNode$arguments = fieldNode.arguments) === null || _fieldNode$arguments === void 0 ? void 0 : _fieldNode$arguments.map(arg => arg.name.value)); for (const argDef of fieldDef.args) { @@ -40420,22 +39559,25 @@ function ProvidedRequiredArgumentsRule(context) { /** * @internal */ + function ProvidedRequiredArgumentsOnDirectivesRule(context) { var _schema$getDirectives; - const requiredArgsMap = new Map(); + const requiredArgsMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = (_schema$getDirectives = schema === null || schema === void 0 ? void 0 : schema.getDirectives()) !== null && _schema$getDirectives !== void 0 ? _schema$getDirectives : _directives.specifiedDirectives; for (const directive of definedDirectives) { - requiredArgsMap.set(directive.name, new Map(directive.args.filter(_definition.isRequiredArgument).map(arg => [arg.name, arg]))); + requiredArgsMap[directive.name] = (0, _keyMap.keyMap)(directive.args.filter(_definition.isRequiredArgument), arg => arg.name); } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { var _def$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_def$arguments = def.arguments) !== null && _def$arguments !== void 0 ? _def$arguments : []; - requiredArgsMap.set(def.name.value, new Map(argNodes.filter(isRequiredArgumentNode).map(arg => [arg.name.value, arg]))); + requiredArgsMap[def.name.value] = (0, _keyMap.keyMap)(argNodes.filter(isRequiredArgumentNode), arg => arg.name.value); } } return { @@ -40443,14 +39585,16 @@ function ProvidedRequiredArgumentsOnDirectivesRule(context) { // Validate on leave to allow for deeper errors to appear first. leave(directiveNode) { const directiveName = directiveNode.name.value; - const requiredArgs = requiredArgsMap.get(directiveName); - if (requiredArgs != null) { + const requiredArgs = requiredArgsMap[directiveName]; + if (requiredArgs) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; const argNodeMap = new Set(argNodes.map(arg => arg.name.value)); - for (const [argName, argDef] of requiredArgs.entries()) { + for (const [argName, argDef] of Object.entries(requiredArgs)) { if (!argNodeMap.has(argName)) { const argType = (0, _definition.isType)(argDef.type) ? (0, _inspect.inspect)(argDef.type) : (0, _printer.print)(argDef.type); context.reportError(new _GraphQLError.GraphQLError(`Directive "@${directiveName}" argument "${argName}" of type "${argType}" is required, but it was not provided.`, { @@ -40533,9 +39677,6 @@ exports.SingleFieldSubscriptionsRule = SingleFieldSubscriptionsRule; var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); var _collectFields = __webpack_require__(/*! ../../execution/collectFields.mjs */ "../../../node_modules/graphql/execution/collectFields.mjs"); -function toNodes(fieldGroup) { - return fieldGroup.map(fieldDetails => fieldDetails.node); -} /** * Subscriptions must only include a non-introspection field. * @@ -40560,22 +39701,21 @@ function SingleFieldSubscriptionsRule(context) { fragments[definition.name.value] = definition; } } - const { - groupedFieldSet - } = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node); - if (groupedFieldSet.size > 1) { - const fieldGroups = [...groupedFieldSet.values()]; - const extraFieldGroups = fieldGroups.slice(1); - const extraFieldSelections = extraFieldGroups.flatMap(fieldGroup => toNodes(fieldGroup)); + const fields = (0, _collectFields.collectFields)(schema, fragments, variableValues, subscriptionType, node.selectionSet); + if (fields.size > 1) { + const fieldSelectionLists = [...fields.values()]; + const extraFieldSelectionLists = fieldSelectionLists.slice(1); + const extraFieldSelections = extraFieldSelectionLists.flat(); context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must select only one top level field.` : 'Anonymous Subscription must select only one top level field.', { nodes: extraFieldSelections })); } - for (const fieldGroup of groupedFieldSet.values()) { - const fieldName = toNodes(fieldGroup)[0].name.value; + for (const fieldNodes of fields.values()) { + const field = fieldNodes[0]; + const fieldName = field.name.value; if (fieldName.startsWith('__')) { context.reportError(new _GraphQLError.GraphQLError(operationName != null ? `Subscription "${operationName}" must not select an introspection top level field.` : 'Anonymous Subscription must not select an introspection top level field.', { - nodes: toNodes(fieldGroup) + nodes: fieldNodes })); } } @@ -40587,42 +39727,6 @@ function SingleFieldSubscriptionsRule(context) { /***/ }), -/***/ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs": -/*!*****************************************************************************************!*\ - !*** ../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs ***! - \*****************************************************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.StreamDirectiveOnListFieldRule = StreamDirectiveOnListFieldRule; -var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); -var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../../node_modules/graphql/type/definition.mjs"); -var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../../node_modules/graphql/type/directives.mjs"); -/** - * Stream directives are used on list fields - * - * A GraphQL document is only valid if stream directives are used on list fields. - */ -function StreamDirectiveOnListFieldRule(context) { - return { - Directive(node) { - const fieldDef = context.getFieldDef(); - const parentType = context.getParentType(); - if (fieldDef && parentType && node.name.value === _directives.GraphQLStreamDirective.name && !((0, _definition.isListType)(fieldDef.type) || (0, _definition.isWrappingType)(fieldDef.type) && (0, _definition.isListType)(fieldDef.type.ofType))) { - context.reportError(new _GraphQLError.GraphQLError(`Stream directive cannot be used on non-list field "${fieldDef.name}" on type "${parentType.name}".`, { - nodes: node - })); - } - } - }; -} - -/***/ }), - /***/ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs": /*!********************************************************************************************!*\ !*** ../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs ***! @@ -40647,7 +39751,9 @@ function UniqueArgumentDefinitionNamesRule(context) { return { DirectiveDefinition(directiveNode) { var _directiveNode$argume; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_directiveNode$argume = directiveNode.arguments) !== null && _directiveNode$argume !== void 0 ? _directiveNode$argume : []; return checkArgUniqueness(`@${directiveNode.name.value}`, argumentNodes); @@ -40659,15 +39765,17 @@ function UniqueArgumentDefinitionNamesRule(context) { }; function checkArgUniquenessPerField(typeNode) { var _typeNode$fields; - const typeName = typeNode.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const typeName = typeNode.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_typeNode$fields = typeNode.fields) !== null && _typeNode$fields !== void 0 ? _typeNode$fields : []; for (const fieldDef of fieldNodes) { var _fieldDef$arguments; - const fieldName = fieldDef.name.value; - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + const fieldName = fieldDef.name.value; // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const argumentNodes = (_fieldDef$arguments = fieldDef.arguments) !== null && _fieldDef$arguments !== void 0 ? _fieldDef$arguments : []; checkArgUniqueness(`${typeName}.${fieldName}`, argumentNodes); } @@ -40717,7 +39825,9 @@ function UniqueArgumentNamesRule(context) { }; function checkArgUniqueness(parentNode) { var _parentNode$arguments; + // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const argumentNodes = (_parentNode$arguments = parentNode.arguments) !== null && _parentNode$arguments !== void 0 ? _parentNode$arguments : []; const seenArgs = (0, _groupBy.groupBy)(argumentNodes, arg => arg.name.value); @@ -40752,7 +39862,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined directives have unique names. */ function UniqueDirectiveNamesRule(context) { - const knownDirectiveNames = new Map(); + const knownDirectiveNames = Object.create(null); const schema = context.getSchema(); return { DirectiveDefinition(node) { @@ -40763,13 +39873,12 @@ function UniqueDirectiveNamesRule(context) { })); return; } - const knownName = knownDirectiveNames.get(directiveName); - if (knownName) { + if (knownDirectiveNames[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one directive named "@${directiveName}".`, { - nodes: [knownName, node.name] + nodes: [knownDirectiveNames[directiveName], node.name] })); } else { - knownDirectiveNames.set(directiveName, node.name); + knownDirectiveNames[directiveName] = node.name; } return false; } @@ -40803,20 +39912,20 @@ var _directives = __webpack_require__(/*! ../../type/directives.mjs */ "../../.. * See https://spec.graphql.org/draft/#sec-Directives-Are-Unique-Per-Location */ function UniqueDirectivesPerLocationRule(context) { - const uniqueDirectiveMap = new Map(); + const uniqueDirectiveMap = Object.create(null); const schema = context.getSchema(); const definedDirectives = schema ? schema.getDirectives() : _directives.specifiedDirectives; for (const directive of definedDirectives) { - uniqueDirectiveMap.set(directive.name, !directive.isRepeatable); + uniqueDirectiveMap[directive.name] = !directive.isRepeatable; } const astDefinitions = context.getDocument().definitions; for (const def of astDefinitions) { if (def.kind === _kinds.Kind.DIRECTIVE_DEFINITION) { - uniqueDirectiveMap.set(def.name.value, !def.repeatable); + uniqueDirectiveMap[def.name.value] = !def.repeatable; } } - const schemaDirectives = new Map(); - const typeDirectivesMap = new Map(); + const schemaDirectives = Object.create(null); + const typeDirectivesMap = Object.create(null); return { // Many different AST nodes may contain directives. Rather than listing // them all, just listen for entering any node, and check to see if it @@ -40830,24 +39939,22 @@ function UniqueDirectivesPerLocationRule(context) { seenDirectives = schemaDirectives; } else if ((0, _predicates.isTypeDefinitionNode)(node) || (0, _predicates.isTypeExtensionNode)(node)) { const typeName = node.name.value; - seenDirectives = typeDirectivesMap.get(typeName); + seenDirectives = typeDirectivesMap[typeName]; if (seenDirectives === undefined) { - seenDirectives = new Map(); - typeDirectivesMap.set(typeName, seenDirectives); + typeDirectivesMap[typeName] = seenDirectives = Object.create(null); } } else { - seenDirectives = new Map(); + seenDirectives = Object.create(null); } for (const directive of node.directives) { const directiveName = directive.name.value; - if (uniqueDirectiveMap.get(directiveName) === true) { - const seenDirective = seenDirectives.get(directiveName); - if (seenDirective != null) { + if (uniqueDirectiveMap[directiveName]) { + if (seenDirectives[directiveName]) { context.reportError(new _GraphQLError.GraphQLError(`The directive "@${directiveName}" can only be used once at this location.`, { - nodes: [seenDirective, directive] + nodes: [seenDirectives[directiveName], directive] })); } else { - seenDirectives.set(directiveName, directive); + seenDirectives[directiveName] = directive; } } } @@ -40879,7 +39986,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueEnumValueNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownValueNames = new Map(); + const knownValueNames = Object.create(null); return { EnumTypeDefinition: checkValueUniqueness, EnumTypeExtension: checkValueUniqueness @@ -40887,14 +39994,14 @@ function UniqueEnumValueNamesRule(context) { function checkValueUniqueness(node) { var _node$values; const typeName = node.name.value; - let valueNames = knownValueNames.get(typeName); - if (valueNames == null) { - valueNames = new Map(); - knownValueNames.set(typeName, valueNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownValueNames[typeName]) { + knownValueNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const valueNodes = (_node$values = node.values) !== null && _node$values !== void 0 ? _node$values : []; + const valueNames = knownValueNames[typeName]; for (const valueDef of valueNodes) { const valueName = valueDef.name.value; const existingType = existingTypeMap[typeName]; @@ -40902,15 +40009,12 @@ function UniqueEnumValueNamesRule(context) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: valueDef.name })); - continue; - } - const knownValueName = valueNames.get(valueName); - if (knownValueName != null) { + } else if (valueNames[valueName]) { context.reportError(new _GraphQLError.GraphQLError(`Enum value "${typeName}.${valueName}" can only be defined once.`, { - nodes: [knownValueName, valueDef.name] + nodes: [valueNames[valueName], valueDef.name] })); } else { - valueNames.set(valueName, valueDef.name); + valueNames[valueName] = valueDef.name; } } return false; @@ -40941,7 +40045,7 @@ var _definition = __webpack_require__(/*! ../../type/definition.mjs */ "../../.. function UniqueFieldDefinitionNamesRule(context) { const schema = context.getSchema(); const existingTypeMap = schema ? schema.getTypeMap() : Object.create(null); - const knownFieldNames = new Map(); + const knownFieldNames = Object.create(null); return { InputObjectTypeDefinition: checkFieldUniqueness, InputObjectTypeExtension: checkFieldUniqueness, @@ -40953,29 +40057,26 @@ function UniqueFieldDefinitionNamesRule(context) { function checkFieldUniqueness(node) { var _node$fields; const typeName = node.name.value; - let fieldNames = knownFieldNames.get(typeName); - if (fieldNames == null) { - fieldNames = new Map(); - knownFieldNames.set(typeName, fieldNames); - } - // FIXME: https://github.com/graphql/graphql-js/issues/2203 + if (!knownFieldNames[typeName]) { + knownFieldNames[typeName] = Object.create(null); + } // FIXME: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ + const fieldNodes = (_node$fields = node.fields) !== null && _node$fields !== void 0 ? _node$fields : []; + const fieldNames = knownFieldNames[typeName]; for (const fieldDef of fieldNodes) { const fieldName = fieldDef.name.value; if (hasField(existingTypeMap[typeName], fieldName)) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" already exists in the schema. It cannot also be defined in this type extension.`, { nodes: fieldDef.name })); - continue; - } - const knownFieldName = fieldNames.get(fieldName); - if (knownFieldName != null) { + } else if (fieldNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`Field "${typeName}.${fieldName}" can only be defined once.`, { - nodes: [knownFieldName, fieldDef.name] + nodes: [fieldNames[fieldName], fieldDef.name] })); } else { - fieldNames.set(fieldName, fieldDef.name); + fieldNames[fieldName] = fieldDef.name; } } return false; @@ -41011,18 +40112,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Fragment-Name-Uniqueness */ function UniqueFragmentNamesRule(context) { - const knownFragmentNames = new Map(); + const knownFragmentNames = Object.create(null); return { OperationDefinition: () => false, FragmentDefinition(node) { const fragmentName = node.name.value; - const knownFragmentName = knownFragmentNames.get(fragmentName); - if (knownFragmentName != null) { + if (knownFragmentNames[fragmentName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one fragment named "${fragmentName}".`, { - nodes: [knownFragmentName, node.name] + nodes: [knownFragmentNames[fragmentName], node.name] })); } else { - knownFragmentNames.set(fragmentName, node.name); + knownFragmentNames[fragmentName] = node.name; } return false; } @@ -41055,28 +40155,27 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueInputFieldNamesRule(context) { const knownNameStack = []; - let knownNames = new Map(); + let knownNames = Object.create(null); return { ObjectValue: { enter() { knownNameStack.push(knownNames); - knownNames = new Map(); + knownNames = Object.create(null); }, leave() { const prevKnownNames = knownNameStack.pop(); - prevKnownNames != null || (0, _invariant.invariant)(false); + prevKnownNames || (0, _invariant.invariant)(false); knownNames = prevKnownNames; } }, ObjectField(node) { const fieldName = node.name.value; - const knownName = knownNames.get(fieldName); - if (knownName != null) { + if (knownNames[fieldName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one input field named "${fieldName}".`, { - nodes: [knownName, node.name] + nodes: [knownNames[fieldName], node.name] })); } else { - knownNames.set(fieldName, node.name); + knownNames[fieldName] = node.name; } } }; @@ -41105,18 +40204,17 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * See https://spec.graphql.org/draft/#sec-Operation-Name-Uniqueness */ function UniqueOperationNamesRule(context) { - const knownOperationNames = new Map(); + const knownOperationNames = Object.create(null); return { OperationDefinition(node) { const operationName = node.name; - if (operationName != null) { - const knownOperationName = knownOperationNames.get(operationName.value); - if (knownOperationName != null) { + if (operationName) { + if (knownOperationNames[operationName.value]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one operation named "${operationName.value}".`, { - nodes: [knownOperationName, operationName] + nodes: [knownOperationNames[operationName.value], operationName] })); } else { - knownOperationNames.set(operationName.value, operationName); + knownOperationNames[operationName.value] = operationName; } } return false; @@ -41147,7 +40245,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ */ function UniqueOperationTypesRule(context) { const schema = context.getSchema(); - const definedOperationTypes = new Map(); + const definedOperationTypes = Object.create(null); const existingOperationTypes = schema ? { query: schema.getQueryType(), mutation: schema.getMutationType(), @@ -41159,12 +40257,14 @@ function UniqueOperationTypesRule(context) { }; function checkOperationTypes(node) { var _node$operationTypes; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const operationTypesNodes = (_node$operationTypes = node.operationTypes) !== null && _node$operationTypes !== void 0 ? _node$operationTypes : []; for (const operationType of operationTypesNodes) { const operation = operationType.operation; - const alreadyDefinedOperationType = definedOperationTypes.get(operation); + const alreadyDefinedOperationType = definedOperationTypes[operation]; if (existingOperationTypes[operation]) { context.reportError(new _GraphQLError.GraphQLError(`Type for ${operation} already defined in the schema. It cannot be redefined.`, { nodes: operationType @@ -41174,7 +40274,7 @@ function UniqueOperationTypesRule(context) { nodes: [alreadyDefinedOperationType, operationType] })); } else { - definedOperationTypes.set(operation, operationType); + definedOperationTypes[operation] = operationType; } } return false; @@ -41202,7 +40302,7 @@ var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../ * A GraphQL document is only valid if all defined types have unique names. */ function UniqueTypeNamesRule(context) { - const knownTypeNames = new Map(); + const knownTypeNames = Object.create(null); const schema = context.getSchema(); return { ScalarTypeDefinition: checkTypeName, @@ -41220,13 +40320,12 @@ function UniqueTypeNamesRule(context) { })); return; } - const knownNameNode = knownTypeNames.get(typeName); - if (knownNameNode != null) { + if (knownTypeNames[typeName]) { context.reportError(new _GraphQLError.GraphQLError(`There can be only one type named "${typeName}".`, { - nodes: [knownNameNode, node.name] + nodes: [knownTypeNames[typeName], node.name] })); } else { - knownTypeNames.set(typeName, node.name); + knownTypeNames[typeName] = node.name; } return false; } @@ -41257,7 +40356,9 @@ function UniqueVariableNamesRule(context) { return { OperationDefinition(operationNode) { var _operationNode$variab; + // See: https://github.com/graphql/graphql-js/issues/2203 + /* c8 ignore next */ const variableDefinitions = (_operationNode$variab = operationNode.variableDefinitions) !== null && _operationNode$variab !== void 0 ? _operationNode$variab : []; const seenVariableDefinitions = (0, _groupBy.groupBy)(variableDefinitions, node => node.variable.name.value); @@ -41288,6 +40389,7 @@ Object.defineProperty(exports, "__esModule", ({ exports.ValuesOfCorrectTypeRule = ValuesOfCorrectTypeRule; var _didYouMean = __webpack_require__(/*! ../../jsutils/didYouMean.mjs */ "../../../node_modules/graphql/jsutils/didYouMean.mjs"); var _inspect = __webpack_require__(/*! ../../jsutils/inspect.mjs */ "../../../node_modules/graphql/jsutils/inspect.mjs"); +var _keyMap = __webpack_require__(/*! ../../jsutils/keyMap.mjs */ "../../../node_modules/graphql/jsutils/keyMap.mjs"); var _suggestionList = __webpack_require__(/*! ../../jsutils/suggestionList.mjs */ "../../../node_modules/graphql/jsutils/suggestionList.mjs"); var _GraphQLError = __webpack_require__(/*! ../../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _kinds = __webpack_require__(/*! ../../language/kinds.mjs */ "../../../node_modules/graphql/language/kinds.mjs"); @@ -41326,11 +40428,11 @@ function ValuesOfCorrectTypeRule(context) { if (!(0, _definition.isInputObjectType)(type)) { isValidValueNode(context, node); return false; // Don't traverse further. - } - // Ensure every required field exists. - const fieldNodeMap = new Map(node.fields.map(field => [field.name.value, field])); + } // Ensure every required field exists. + + const fieldNodeMap = (0, _keyMap.keyMap)(node.fields, field => field.name.value); for (const fieldDef of Object.values(type.getFields())) { - const fieldNode = fieldNodeMap.get(fieldDef.name); + const fieldNode = fieldNodeMap[fieldDef.name]; if (!fieldNode && (0, _definition.isRequiredInputField)(fieldDef)) { const typeStr = (0, _inspect.inspect)(fieldDef.type); context.reportError(new _GraphQLError.GraphQLError(`Field "${type.name}.${fieldDef.name}" of required type "${typeStr}" was not provided.`, { @@ -41371,6 +40473,7 @@ function ValuesOfCorrectTypeRule(context) { * Any value literal may be a valid representation of a Scalar, depending on * that scalar type. */ + function isValidValueNode(context, node) { // Report any error at the full type expected by the location. const locationType = context.getInputType(); @@ -41384,11 +40487,12 @@ function isValidValueNode(context, node) { nodes: node })); return; - } - // Scalars and Enums determine if a literal value is valid via parseLiteral(), + } // Scalars and Enums determine if a literal value is valid via parseLiteral(), // which may throw or return an invalid value to indicate failure. + try { - const parseResult = type.parseLiteral(node, undefined /* variables */); + const parseResult = type.parseLiteral(node, undefined + /* variables */); if (parseResult === undefined) { const typeStr = (0, _inspect.inspect)(locationType); context.reportError(new _GraphQLError.GraphQLError(`Expected value of type "${typeStr}", found ${(0, _printer.print)(node)}.`, { @@ -41408,8 +40512,8 @@ function isValidValueNode(context, node) { } } function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDefinitions) { - var _fieldNodeMap$get; - const keys = Array.from(fieldNodeMap.keys()); + var _fieldNodeMap$keys$; + const keys = Object.keys(fieldNodeMap); const isNotExactlyOneField = keys.length !== 1; if (isNotExactlyOneField) { context.reportError(new _GraphQLError.GraphQLError(`OneOf Input Object "${type.name}" must specify exactly one key.`, { @@ -41417,7 +40521,7 @@ function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDef })); return; } - const value = (_fieldNodeMap$get = fieldNodeMap.get(keys[0])) === null || _fieldNodeMap$get === void 0 ? void 0 : _fieldNodeMap$get.value; + const value = (_fieldNodeMap$keys$ = fieldNodeMap[keys[0]]) === null || _fieldNodeMap$keys$ === void 0 ? void 0 : _fieldNodeMap$keys$.value; const isNullLiteral = !value || value.kind === _kinds.Kind.NULL; const isVariable = (value === null || value === void 0 ? void 0 : value.kind) === _kinds.Kind.VARIABLE; if (isNullLiteral) { @@ -41507,11 +40611,11 @@ var _typeFromAST = __webpack_require__(/*! ../../utilities/typeFromAST.mjs */ ". * See https://spec.graphql.org/draft/#sec-All-Variable-Usages-are-Allowed */ function VariablesInAllowedPositionRule(context) { - let varDefMap; + let varDefMap = Object.create(null); return { OperationDefinition: { enter() { - varDefMap = new Map(); + varDefMap = Object.create(null); }, leave(operation) { const usages = context.getRecursiveVariableUsages(operation); @@ -41521,7 +40625,7 @@ function VariablesInAllowedPositionRule(context) { defaultValue } of usages) { const varName = node.name.value; - const varDef = varDefMap.get(varName); + const varDef = varDefMap[varName]; if (varDef && type) { // A var type is allowed if it is the same or more strict (e.g. is // a subtype of) than the expected type. It can be more strict if @@ -41542,7 +40646,7 @@ function VariablesInAllowedPositionRule(context) { } }, VariableDefinition(node) { - varDefMap.set(node.variable.name.value, node); + varDefMap[node.variable.name.value] = node; } }; } @@ -41551,6 +40655,7 @@ function VariablesInAllowedPositionRule(context) { * which includes considering if default values exist for either the variable * or the location at which it is located. */ + function allowedVariableUsage(schema, varType, varDefaultValue, locationType, locationDefaultValue) { if ((0, _definition.isNonNullType)(locationType) && !(0, _definition.isNonNullType)(varType)) { const hasNonNullVariableDefaultValue = varDefaultValue != null && varDefaultValue.kind !== _kinds.Kind.NULL; @@ -41703,9 +40808,6 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); exports.specifiedSDLRules = exports.specifiedRules = exports.recommendedRules = void 0; -var _DeferStreamDirectiveLabelRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveLabelRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveLabelRule.mjs"); -var _DeferStreamDirectiveOnRootFieldRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnRootFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnRootFieldRule.mjs"); -var _DeferStreamDirectiveOnValidOperationsRule = __webpack_require__(/*! ./rules/DeferStreamDirectiveOnValidOperationsRule.mjs */ "../../../node_modules/graphql/validation/rules/DeferStreamDirectiveOnValidOperationsRule.mjs"); var _ExecutableDefinitionsRule = __webpack_require__(/*! ./rules/ExecutableDefinitionsRule.mjs */ "../../../node_modules/graphql/validation/rules/ExecutableDefinitionsRule.mjs"); var _FieldsOnCorrectTypeRule = __webpack_require__(/*! ./rules/FieldsOnCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/FieldsOnCorrectTypeRule.mjs"); var _FragmentsOnCompositeTypesRule = __webpack_require__(/*! ./rules/FragmentsOnCompositeTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/FragmentsOnCompositeTypesRule.mjs"); @@ -41726,7 +40828,6 @@ var _PossibleTypeExtensionsRule = __webpack_require__(/*! ./rules/PossibleTypeEx var _ProvidedRequiredArgumentsRule = __webpack_require__(/*! ./rules/ProvidedRequiredArgumentsRule.mjs */ "../../../node_modules/graphql/validation/rules/ProvidedRequiredArgumentsRule.mjs"); var _ScalarLeafsRule = __webpack_require__(/*! ./rules/ScalarLeafsRule.mjs */ "../../../node_modules/graphql/validation/rules/ScalarLeafsRule.mjs"); var _SingleFieldSubscriptionsRule = __webpack_require__(/*! ./rules/SingleFieldSubscriptionsRule.mjs */ "../../../node_modules/graphql/validation/rules/SingleFieldSubscriptionsRule.mjs"); -var _StreamDirectiveOnListFieldRule = __webpack_require__(/*! ./rules/StreamDirectiveOnListFieldRule.mjs */ "../../../node_modules/graphql/validation/rules/StreamDirectiveOnListFieldRule.mjs"); var _UniqueArgumentDefinitionNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentDefinitionNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentDefinitionNamesRule.mjs"); var _UniqueArgumentNamesRule = __webpack_require__(/*! ./rules/UniqueArgumentNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueArgumentNamesRule.mjs"); var _UniqueDirectiveNamesRule = __webpack_require__(/*! ./rules/UniqueDirectiveNamesRule.mjs */ "../../../node_modules/graphql/validation/rules/UniqueDirectiveNamesRule.mjs"); @@ -41742,14 +40843,7 @@ var _UniqueVariableNamesRule = __webpack_require__(/*! ./rules/UniqueVariableNam var _ValuesOfCorrectTypeRule = __webpack_require__(/*! ./rules/ValuesOfCorrectTypeRule.mjs */ "../../../node_modules/graphql/validation/rules/ValuesOfCorrectTypeRule.mjs"); var _VariablesAreInputTypesRule = __webpack_require__(/*! ./rules/VariablesAreInputTypesRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesAreInputTypesRule.mjs"); var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesInAllowedPositionRule.mjs */ "../../../node_modules/graphql/validation/rules/VariablesInAllowedPositionRule.mjs"); -// Spec Section: "Defer And Stream Directive Labels Are Unique" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Root Field" - -// Spec Section: "Defer And Stream Directives Are Used On Valid Operations" - // Spec Section: "Executable Definitions" - // Spec Section: "Field Selections on Objects, Interfaces, and Unions Types" // Spec Section: "Fragments on Composite Types" @@ -41786,8 +40880,6 @@ var _VariablesInAllowedPositionRule = __webpack_require__(/*! ./rules/VariablesI // Spec Section: "Subscriptions with Single Root Field" -// Spec Section: "Stream Directives Are Used On List Fields" - // Spec Section: "Argument Uniqueness" // Spec Section: "Directives Are Unique Per Location" @@ -41817,10 +40909,12 @@ const recommendedRules = exports.recommendedRules = Object.freeze([_MaxIntrospec * The order of the rules in this list has been adjusted to lead to the * most clear output when encountering multiple validation errors. */ -const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _DeferStreamDirectiveOnRootFieldRule.DeferStreamDirectiveOnRootFieldRule, _DeferStreamDirectiveOnValidOperationsRule.DeferStreamDirectiveOnValidOperationsRule, _DeferStreamDirectiveLabelRule.DeferStreamDirectiveLabelRule, _StreamDirectiveOnListFieldRule.StreamDirectiveOnListFieldRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); + +const specifiedRules = exports.specifiedRules = Object.freeze([_ExecutableDefinitionsRule.ExecutableDefinitionsRule, _UniqueOperationNamesRule.UniqueOperationNamesRule, _LoneAnonymousOperationRule.LoneAnonymousOperationRule, _SingleFieldSubscriptionsRule.SingleFieldSubscriptionsRule, _KnownTypeNamesRule.KnownTypeNamesRule, _FragmentsOnCompositeTypesRule.FragmentsOnCompositeTypesRule, _VariablesAreInputTypesRule.VariablesAreInputTypesRule, _ScalarLeafsRule.ScalarLeafsRule, _FieldsOnCorrectTypeRule.FieldsOnCorrectTypeRule, _UniqueFragmentNamesRule.UniqueFragmentNamesRule, _KnownFragmentNamesRule.KnownFragmentNamesRule, _NoUnusedFragmentsRule.NoUnusedFragmentsRule, _PossibleFragmentSpreadsRule.PossibleFragmentSpreadsRule, _NoFragmentCyclesRule.NoFragmentCyclesRule, _UniqueVariableNamesRule.UniqueVariableNamesRule, _NoUndefinedVariablesRule.NoUndefinedVariablesRule, _NoUnusedVariablesRule.NoUnusedVariablesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _KnownArgumentNamesRule.KnownArgumentNamesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _ValuesOfCorrectTypeRule.ValuesOfCorrectTypeRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsRule, _VariablesInAllowedPositionRule.VariablesInAllowedPositionRule, _OverlappingFieldsCanBeMergedRule.OverlappingFieldsCanBeMergedRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, ...recommendedRules]); /** * @internal */ + const specifiedSDLRules = exports.specifiedSDLRules = Object.freeze([_LoneSchemaDefinitionRule.LoneSchemaDefinitionRule, _UniqueOperationTypesRule.UniqueOperationTypesRule, _UniqueTypeNamesRule.UniqueTypeNamesRule, _UniqueEnumValueNamesRule.UniqueEnumValueNamesRule, _UniqueFieldDefinitionNamesRule.UniqueFieldDefinitionNamesRule, _UniqueArgumentDefinitionNamesRule.UniqueArgumentDefinitionNamesRule, _UniqueDirectiveNamesRule.UniqueDirectiveNamesRule, _KnownTypeNamesRule.KnownTypeNamesRule, _KnownDirectivesRule.KnownDirectivesRule, _UniqueDirectivesPerLocationRule.UniqueDirectivesPerLocationRule, _PossibleTypeExtensionsRule.PossibleTypeExtensionsRule, _KnownArgumentNamesRule.KnownArgumentNamesOnDirectivesRule, _UniqueArgumentNamesRule.UniqueArgumentNamesRule, _UniqueInputFieldNamesRule.UniqueInputFieldNamesRule, _ProvidedRequiredArgumentsRule.ProvidedRequiredArgumentsOnDirectivesRule]); /***/ }), @@ -41840,6 +40934,7 @@ exports.assertValidSDL = assertValidSDL; exports.assertValidSDLExtension = assertValidSDLExtension; exports.validate = validate; exports.validateSDL = validateSDL; +var _devAssert = __webpack_require__(/*! ../jsutils/devAssert.mjs */ "../../../node_modules/graphql/jsutils/devAssert.mjs"); var _GraphQLError = __webpack_require__(/*! ../error/GraphQLError.mjs */ "../../../node_modules/graphql/error/GraphQLError.mjs"); var _visitor = __webpack_require__(/*! ../language/visitor.mjs */ "../../../node_modules/graphql/language/visitor.mjs"); var _validate = __webpack_require__(/*! ../type/validate.mjs */ "../../../node_modules/graphql/type/validate.mjs"); @@ -41866,30 +40961,32 @@ var _ValidationContext = __webpack_require__(/*! ./ValidationContext.mjs */ "../ * Optionally a custom TypeInfo instance may be provided. If not provided, one * will be created from the provided schema. */ + function validate(schema, documentAST, rules = _specifiedRules.specifiedRules, options, /** @deprecated will be removed in 17.0.0 */ typeInfo = new _TypeInfo.TypeInfo(schema)) { var _options$maxErrors; const maxErrors = (_options$maxErrors = options === null || options === void 0 ? void 0 : options.maxErrors) !== null && _options$maxErrors !== void 0 ? _options$maxErrors : 100; - // If the schema used for validation is invalid, throw an error. + documentAST || (0, _devAssert.devAssert)(false, 'Must provide document.'); // If the schema used for validation is invalid, throw an error. + (0, _validate.assertValidSchema)(schema); - const abortError = new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.'); + const abortObj = Object.freeze({}); const errors = []; const context = new _ValidationContext.ValidationContext(schema, documentAST, typeInfo, error => { if (errors.length >= maxErrors) { - throw abortError; + errors.push(new _GraphQLError.GraphQLError('Too many validation errors, error limit reached. Validation aborted.')); // eslint-disable-next-line @typescript-eslint/no-throw-literal + + throw abortObj; } errors.push(error); - }); - // This uses a specialized visitor which runs multiple visitors in parallel, + }); // This uses a specialized visitor which runs multiple visitors in parallel, // while maintaining the visitor skip and break API. - const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); - // Visit the whole document with each instance of all provided rules. + + const visitor = (0, _visitor.visitInParallel)(rules.map(rule => rule(context))); // Visit the whole document with each instance of all provided rules. + try { (0, _visitor.visit)(documentAST, (0, _TypeInfo.visitWithTypeInfo)(typeInfo, visitor)); } catch (e) { - if (e === abortError) { - errors.push(abortError); - } else { + if (e !== abortObj) { throw e; } } @@ -41898,6 +40995,7 @@ typeInfo = new _TypeInfo.TypeInfo(schema)) { /** * @internal */ + function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specifiedSDLRules) { const errors = []; const context = new _ValidationContext.SDLValidationContext(documentAST, schemaToExtend, error => { @@ -41913,6 +41011,7 @@ function validateSDL(documentAST, schemaToExtend, rules = _specifiedRules.specif * * @internal */ + function assertValidSDL(documentAST) { const errors = validateSDL(documentAST); if (errors.length !== 0) { @@ -41925,6 +41024,7 @@ function assertValidSDL(documentAST) { * * @internal */ + function assertValidSDLExtension(documentAST, schema) { const errors = validateSDL(documentAST, schema); if (errors.length !== 0) { @@ -41948,18 +41048,20 @@ Object.defineProperty(exports, "__esModule", ({ exports.versionInfo = exports.version = void 0; // Note: This file is autogenerated using "resources/gen-version.js" script and // automatically updated by "npm version" command. + /** * A string containing the version of the GraphQL.js library */ -const version = exports.version = '17.0.0-alpha.7'; +const version = exports.version = '16.9.0'; /** * An object containing the components of the GraphQL.js version string */ + const versionInfo = exports.versionInfo = Object.freeze({ - major: 17, - minor: 0, + major: 16, + minor: 9, patch: 0, - preReleaseTag: 'alpha.7' + preReleaseTag: null }); /***/ }), @@ -69309,7 +68411,7 @@ function createContextHook(context) { var _a; const value = React.useContext(context); if (value === null && (options == null ? void 0 : options.nonNull)) { - throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || useGivenContext.caller.name}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); + throw new Error(`Tried to use \`${((_a = options.caller) == null ? void 0 : _a.name) || "a component"}\` without the necessary context. Make sure to render the \`${context.displayName}Provider\` component higher up the tree.`); } return value; } diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 5e24ee6250e4ad778886c374c7ca972faf2e3ce6..beee9c5781500ba5781fb0ae7b7640961b293848 100644 GIT binary patch literal 390368 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�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 ybmy3v6MCg!8|D&&z!Xa>z&?S7ZK62@rW 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 literal 390918 zcmcG%YgZe`w)gw~dM$iP!}A?&tTP zv#PpVf~;ik{bY<7b#+~5&3nz7-MX0M3zO-%IGVQB+wD&8@zwAB@xth|w|)3NKbo!_ zjr0CAUsvHz{a852kBc&YGajAiv%ToE8g3xlj}vKlMZLRh}Aj@2zG>qw=^o zxv&oO{Bc}N)tP?(-XC7%-MqNzbcCJ0t-sW^T(SCT0aQQ&*3E2st&w4S>-xH0czjVF zO^Z?4GDr>c>B6{Jpv8qR@?Hcp>mCct7?qK;Z9mfF~<9NZ%^}H~*}>dzVjs z7!59lxeyU3v>?;|#c_%>LVs>FId%@y_}~uRkbO2BR|HC<|(?*xEbYFrk%kJ{b*v&#N~p)6=|c zPYOostTQQroQd_%&xe;z&z+7>lS%q|Uk-Y|_NnN|ot+ufwZ?YDrO@yyfX^8w2pHeD z78kv2rGGZq@Sp9y1Cd5IwDDdmq+ML}l1Mij&BxxfXp4ueoKDX^fiw0OM5pwo(++)3 z^5HQXc~Sa^gVu&hx^W?Kc5U{+$-h?8s>={Dq#t`%qw>|LKj=Qs;FU-DWYYa(nvKft zAkRj}$K8`WL*$&C%(42Rw0>}WWe zNWIIgQjC5eP9I7(`$wnwPVqf4(!lL{hYh zvdqUXc7J%)s=s`e5Brzh)l`&Er^DO}AFgIac{IEjTg3)OOVY2Y`vWow6ci?FUpg8qgcjUmU2G(Hk8rla5(z7#U^TU_ON4m z!*2g1%$J^XF9YaD0E9+UuE<{e6d~B*aQS^Po#x{fub&oWe|))% zNa?l?hoeJwqnK!mck&^PM&oX4@AT7hC_Km(_6GfFf4NrF%Alj&{Oo*)!u5RIKRIJ2 zHVssz(Qx=QKkffssH4f*Xr#FZWOzP0x|je0>Ig*;hK5Q{FDA_GO@G`!vtlOIAO2kA zA9u%n@K}P)dOypjr=!7S_q0F#X_Egm9$J$LAfqSXB1Z7mw|%l*4lmVNaZ--P`ECJH z>Cq?nvYd|8|91Iw1Q}|_0+sKa=SLHpl+nUXcHSRPKtJZEtsP|Vy3@=x&8^>A_0H&G z%vRROJ@FlhkXjuP{?**hA;4}zf4}61JENlyCMhk!UwbG=fy1GQ9Hvd} z{kY=F+Dd(^VL~_A@A=rcLThd1A1iAQTkx9R6{x@K9PUNG91LLsucq1IXmGhXDyRJd z$WQX@s9!!g5_fzxLS5SdN%|*w_b20kyKsfAVJ;l#e#$8t0<51UttZ{fafX)qBw~4Y zq&-iMR;fG94H2A!&b%w@?|zVU?H;N2)~9orju!JX`_p|fR^f}hKVXI3Pxkb(JinNR zX$(RM6D#|}XP|SpZ#^4#V#|wTu@`a7k5)B6#IT`TOx62tf6Tw#%RD=S;YO_Q4l~s1 zliY2PNq6Y4ot9sg$D{6UHX0pjobFbh!IH+8k2Uh953d90mo}J}` z0s;e%%W*b29bF6un|&C^uzN9$_-Y6y(G>7^Ydju}z3@0UMv*xGr2F!Kep@2+=#Zlf~e%L{WIh#mr>={FNJ{hiFB{W!5gFmgm*6Dn{ zmVY5_r{3o5&&CLCKL2_Z&9ym^PF75qI_h+1mz97Z(MJdWo9Lf@&7FOpvsecv4GsMN@C)zurF|+ zz=*19sK|sc{SGUM zwYW`z!4Mu=E;x(wG{=8fFIStn9nim#vsJ`u$Z=6(9a4AP5x>77=^y` zxVPHbK<|Y;w7O+&bISz4pk->BGMsI75%aNP61dPrZSoj4+UE{SU^1caKoF>_)l$u3 zrfSqMLw}z4!wMBI9sO}z@yGn|LovPW&1j}DZikFllxA}txQ<=T z_KBfJ5S$MlwfFkVe;n-n*Zzb3)yMmv9c2*#<0u zVsGtWWjcB_`k0S5`&fbe==WC?=D9j1ez0%sB?en>si3= zD4Np9Ge+#Pd_c6M9_Oz>~-kkVd!EyzO9F;<3Yp^$D8@KX@RGAck*aDPV?X= zGnnb^i!hUb5Dqf8%Ia$y6u+l_?6;s0ES{Vu6FI{XCX!0-B@U~rt31$4fa726F?Lo>?O&RSi9FOTW`M@@bcEx{d;kUH zilsemYdMl2)6uyYq>QoAbUHe#*8k`uVtn)w;+6x%toX&nvOu6$VGc!f4>g6YNKw%g1tP3=>BMN{)AVx`Apk+da*lhCuFGPUV5G5 z{Gc|@inKG&Z8c#fKdy|h_~e2Ev`Ck#3k?o`Lk$|_xD$pe`EW`<>tRB5iv5{g`fNYiaU0c}udPhy2ebf6(3&TtVd`(>f1nO=YIJD)} zip7}fjQN(f(jV0P_?G7HVsp0aoZlV#!goF0b=O^GYIm+w6^jnFN(P62`Amh7VFwx=x?8=uxL@X)m|U6Jiz6xMn4e9w zFTr~49Re>xxq{m7sbis4eL8lM5REXKpp|G|>x0pPNi#PAuCJqAR#jjB$XvvUVGE0k zX2B+6Ym$N)B6M2uhLy?1p-$MbQE-Sxi7WM@PNv_*nJ1o7YsY+jUzYD||2^&NQq_e@ zWC%vlxOxx|-?8MZ_26-OhM!RT1gAWErtZL!R#-8oK_lyy` zZhzb9bPnjQYNB(VRNq)fz5Z9BzSJ+B0k$^wSiXJ*FT_r9sMCaIpL(DA{HNx7SD&~z z@uFYgMpD1=>CgI(byEMo&i4P0+MJ_1g#P1CO;yWrrGgj!BNj_lsMR*r;lQ*J`@d()wbU%#3B}X01M$GfFFntkg@Mv@<_84v8 zHzPkb5UQ~rDN!rWwl{zJVe9qoyEofAFLz&Vzkc`T?bhbjvzM>Gi{yj3e3Sk9-=1xn z=<*u#M!nmjy2|wR{^=kWU6*lw)nlF;iw?x_wY zLN(l=KHU3pT~rFcK!*B+*1-p#g@lzk!zITwG=8=f8w=0KN*qh-h`IsaYz>hWl?8l9 zaV-&h7f$N)2+N+I4*fKygKs2E$7NJ=Mhd17gh2QDj4}tOPe8Lf&wB>baQNg0F6|bF zesba0T4y3b7S6biXrnUM>nm2{Cl5byMqV~!yVLt3Lt?HX}h}7K5XCL zJtZcKvjZI)F0}41VVvD>EsV;A`(}nNIE?baLOEJEbBEzQ94mY0`9ViM%nGz=^oWD< z#x><>MCv@qRSzkt>!g=jLXs`MZuwsw`~V5z36jQ+Dj00|@b$VJ%{Y!basV(lej_j- z_Cp;W=7Y-MYS74`PbL~eFxKQk>c<1IbnGh|(hOb1Pu0Y^pQjO7sA`b4RSDuB)%s}8Wef(_N$u6t+G@kNeTpYbcTqTA{`hJL6|sq0)QTr)Ln zz191fw@aLCM@;Ep$g3+yRCz~b*3XGl{QnVmC&fma9VB2VqL18#W+D#@!U1G{qAr!W z1ZP_Zbc7|O-9<*9 z>4ac{?y$I7$CpfzTa}!lKE)q8&ef)s5nE+m*WOv=trV?Py)G_34}&v4bJMm7XTdq_ z&q=lHQ`89K;6QR`w8&2aK;kRagmnIvbr->i^euX|{q|yr}F4jw(%xfJ?MqJ0Rf6 zD1mJfay5{%EkYWCoo84q5Za)imUirh9TUUO?8te-&TEzRL+4b++7c>jPer2d7%FV- zr{!1^7`+R@h&I@}B4hJ4Sf>K`TLHWyMrt;{4X=O$fQE^0zXLZ#qck5`uTxa2GhZ%dt;GjM`odOCt zpa#5)PHlD)j5>!*c=34EtNB?=bT75;6C$v`f1eJ)7Sn4^6xf{nPaLErEBf`^-!u4;gu=6UZpM!5TWRI8bLD>Bd|^61EC$YVu*?4&b!uohz>b z<6$QW)ve&P?YkLxe65A~A}XPrg2J%Z?Nls#?SFo=4l?)zDoM@D#W=CI1+QbEMbfwS z`WMsDvBI4W%q1QTb-Yb-t~9{{#^BbDIKTp}Vf{>?uaO}H4-B@`YTtb?p!Ld;d=O$! zlR(-!NlaVaI7$3NeEHUOo0I{~r_O9uPm&k3DCt=-W9*Xgz}>BX?Y?`x{cOvSX7=so z_77%ic?Cn1v}J6E!ia0Idl3-1VHeK0{qZ69!0<Ir^KF|q5Y z72$EN_T`mtzEGYXR)ub~trVBUE29F|cpJH-4Pd~8j2kuNxrTsUm4Oj52+N^BI+X!0 zmEc1q+(!Z<>KpZmK50xe=$gzHsveagG;1;sp~maxbQRIUbQ?8nx-8(YTOuAB1n_Fp zsO{bB+onzB5Rizoc8Kpf`Z%i>CQ~`~_mDT^eCbJ)uhVv5wKAFHW-oc5oz-g=)hkDf zPJvgG#YN|djlxPwz<949n^9?T1f%j+kcioMaGdx~>`5AdZs;;}1E3K9m(X$j>TIG7Ef(wHRO8 zdbL&KJh5jxEJXClhESt9AKkj`N9L2R>v!x@#Y{fb;1g$NtQiPZks1LSRkJs@Hk$!n zRsDxss{>{EZ|6Gy*R8c<=M8xKE>#0PyQS%0fB6+}$44J2_XWE>WJ=SLTQemJz^Zh1OIR1{Fo|{guqXTsB;x!HjG6mW~0Owi-8OtU{M*V zT?pLN0JRJjp4aKik~z#zin7%Ob#JfaY$wzLQ~#_M=3T1`dfr~ghO;W*KP1wbj{WEe({KConW<~NCrnRYUZTa>m!6^_-m_C9x+8uEtpwmoPb*m z24bQjiVueSBwVlYP8*j>l3IYhvWj8yC{^Pjj(w`TI(uh~eOfW1TNI>Q-Zm8^@TI2H zq99?yL?z)SoZ`M?)`xBWy}5DELUo;D1A0s=?1D~7x0}6$;oKu&Sxt)nEEJ5=A(?lN zLa^@RurLL9Ilg+}C) zbB>pDk0F-`)yS}_1dJ=Ub(2cHWpk~NRiO?{i&pIBOtb^j^LEVHZS3_onkJ&?sfsOen{i@gD+yc_MhEMO-w zf8;&FHXdZ3dJp#YC)vS+>@!OC-hD=du{ZqegItLG`^N3#^tKtH{9v@3mex9i>qd@_awMYkIKG%uDpH=>e*lMVVVPut4w%Z>=cLAw#vUG1sf zNpoNVnvM-sk4f?q^3)Bzj0*)2*SeOfwZG4mIW=ZVe{HhH&)|cNuF@*OsvGrmn@st! zj_H9K=Rv&M>1ggu*u69H;h0-RIg<^qbV?8&6m~nc1}n7?vs`v^&`gZA%3-7>@3lHt zQsPgGV*;fNdO;emNm*=#1A>K0=fkCnXP|SH-f-^<#8*T!9XZA%%NF7xc4*ZO0r|~< zcoZ}Nox5qrIHy3E>aTjhJY&!?{hKdJA~{Zt*(~*lbnAE|kR}Pe5f#I_l4wub=<^Ui zCqou9eZGb+rbcJ0{9<-Xh>`JN1a>YV6g?92?!n1rIpwNhuG<{A2JLSbznFJ~yBAhr zr}=?L_~Q52B^{Bjv-_|A&-O zpBrpc?2m2j*|h$dcOnC<-YQ_gUw;w;7+V}qd)!Xs94%W=U^WNI{VbeowJLU2*0DUG zF$@hD!RRD02BWJ>Py+r~x#A-nB(Ch`gS~7Y-h1%CBuw9EsU@-Dd&pVf_!1-z7|1na zzkS;B7dPv11W;+^oQrhvZdz~9p6S1n#k%Y24RPUg$_&+8sZ+xN^o;+_k076${e?~= zJIOgI9=F6ciC<3A5E~pPpV3#WT1}OgP;D^Wk!z6|e+hl9OQzZCbPf<#hwRg_!~Fcj zZ*7ja_ifJA9Cgea`GK5Jpq3a}*23-8SU74LRU@(iX$q(aZ!b@B4sPf={O)nGW->Qb zQc$Fr-anl?p^4CJZ_>EOa@#0~s}IBQPgn7acr?ZxD3 zeMDlgAvzsxx4hp|F{ldS6d7PX8S3#QD0oy1M^yf-keBozJ1sp#7XZjvjck~;m4@1? zZ%O-|cq$ReTOiR5%hWo0?+QmK--K{7+W?ME#^QDfI$kHNrqc}#xkayQa!t6*H4U|D zu#FvH#c?wCrvqD+2(s92tSI?EYqobv1`G#%Y{Qj*u1JrDga6zxY!D%YCc)j?JR=UK zqYrrrZ;n91+Y^aUNe6i0biw{kpzpucQ{ovnA1#n9A#G-Jk3%NuCWQcvXisTBWCzzT zCUJ>LR)w$;p37kf!qkq~ou|3+;341gT&W&1I~gy5IaF72*O4vm|Iu(*^N}Gla8!cu z_(Z0_1)i??-CJ-GE&*=rC4ST5r0R^@ST_e=5+wE5CFjNaBpjx8!#XEzBuSMKs9s9#q+xo{67sp^d4QjzEpP{Bvc)(2;6 z@AeQ+4=tB!P<0Ncyhq$*oA`C?4ff?1E}Wfy>Pn(?1K?3SYFnT@8%~Lea!?u&zbTj1 zr-m-X2Gqq;&3ooojiT10NNQawu~2k5%fVKpv;x!hgr*$ug?liH25dZ5f`}tX)>4Di zunsA>Bz@N0oln4Gp9hP#SGv_JMhKs4Jio(3#K566`AeT~zx@FYh%ywSKg91HbI}B3 zG|mo)m$GLU)TJpjR#9vtlynH&HeIg)iI>$=&^shz)>0;~3lNtSg@XaLNoLeq-? z{HWXByVo{&h^~Nfpdp88D06yXgHfUCJ7s`YgexO8$TJdRw%~+%pSHiNRv>fGL8`Iv zv)-R}o)S3mv5y5HtDuyY%1xo+Fxr~l_IeKOuu!YTW8#<<6c@h`C^{gDET~&1WIV?N zu{eoO?Pxk4{xiR{d4Ldoe%Ho;kkqQ*dzS)KpJV#(iRs{Dd%tSFMrb-Lg=g(2PQ)5FMh+6U5WJj&=c945aGRw#ewy_X3Nw{Q7{}hT zdrQ?%bfB0C5Y$_nF}YyQNkDYo=gJ~%n<;Dc7QABbH-$*!@?(w9nPKiSUgZzU+=ysxsSef{~$}5a&CDEz|%~n6`zZX zvrc5`!&Mw{l^pRmqK zi?sv4I38+DbV^0Mt8YOCd9QDR%DIzNP?#}WVes-?46O%J6heR$bDq;=m)faFsRK7K z_?H?bq!A#bGAh7!vzLp|C;_L_>G`BcGpz~u58q5JMo|- zqTX3n%qnw`{8Si-oF~e+SP>7-7YXq6)%?$q1hD> z+gn>*{W@D)U3;j1zBovd2Tpke=2$`t6WNIPkFrD9!&|Sz)wTsczH;h;N-R zkY!KKSN6|Po=mUyVA>!VSBckBJKF{>&bfW09k?6^jcpxlK&yJO_2k*s+Z|z2zc3v% zIvSdBJak-uDM}`F+9#le+pz3%R1RTj;y!J=$LyEwisMT=@XgQ>%@~KhBVT7#L~=mX z3A7v~qTaFN1*g}V9D$}-SKOdv>CGmH)AGVuIQv-3?-);U-Ojga<}$43lk@JOInuP8 zuAGtg3F`P-x?zv(MxR^hIq5DR%IpX*z{%q;pqRmk3*|T5B$05@eRZ+jKo#B)}c)N6kz8vlBY~4ZBZw-wC zCcEFsd2iSop@fRr0w%)K?B2i|)82Hh*cIxaNc)y>;Z3lRZ~3;3fjhCr&aG=iLAXu8 zdXvAmMn}`T#LmzmRtZ>Tx>&wZ64PiML`SE0?;J z%V%h_;S$006p6>gRya>Q6aq3~7~i~q@RiL5GzX{BTL1fALPla-Z;!GejRR;_jKzmD z{52>`_&{~xu(0Fk4cn?0rsFUQqh*Dls_YfngPD7oXbQ@~xH31R?r2-c^qa^^NE>~1 zBcn*iJ6M1s0Dkr2B|v-XbTqAWnB&#bV?7~Xy;>(71}oo(*_;{}{b2jhZj{s_UgfZj z;t6K8%Dt;cIJ<%pI7~{QoLt4;5G4@!p*rfSTUZbm&XYb;Tjly8hQJ35ePgXCLn9wt zM4%boC8n)FAJ5tMTUmp>?%{30z;+CrfZ!QC5e*&fQFHdEU?=F{535UGBL#B zv~|;Sm+2%#lMRo0+vgDQNZydN)VUO6ES8F;?Ct6lZLXH1Bbo+dG*XJJ%U{gSkT9sa z0b<)7^XzCbhY}b!91{a+Zd%UtVNUKwuZ>V%_OBj1;`eK={E#l}3Cgc;wEVO>O(7BT zTtYS}Ce-2&942zDg_n*X5`Sp2jSUf* z)!$j6>IQHu930%2nG6HQxwBHh%2>y12!Nn5Li^mi$o5s-90Dcz6?@D%O`ylg(@RMH zwH+l^S?Uus(1`A+-X`&;6m~FS{%#~7=M0={k-;hx*h4`S*>%PFO=40EHtRV|%!K5) z%CT)HLk9~48zs+SRn)I)WDEV73L($h+z4$siw<9zr1$P5Rijf$|XUt$c8 zOy}dIUhYp6vkmp~@W_iGi|a3IMN}A-^>;ks_6jN)FtZ>Rf80B$sQ8Bl{wqsMJWU8E z^Nn-)v^I7SGI?f=A!v9Zc%$>5r*@pbse^hB)x|Or!}wQYsL<9@aETqvwG}PaT6_H{ zAO6Nf#YvclwPenuHm+`xYv14x*VpwUO*O!Hsgc{TsLTC{~~i&g56UeH1bg>*Ta3a3#+Jh5EHpuDz@smTl~``irQ4} z7Dy63?y5zk#?q344SBl3RwiV3xeDm0#(b_Z5r&MBIJBEv>rckx{v~>l{e??oEWhx4 z<`bDWjRKgd3qey>dvQr}#zl)^KJv4m7iK6O?s*LV3}JMdj-1vpA*1{~$R!0q&H(e2DVnZzdrjCQ7Uc+o51%~*abGgL&pEl|MPz| zM>|PzUdJ4w2P@nZ#ge8lM9RrehVJQ+{Un~7d~S(!2@~(`FYm7$EOk5W6*B0`^UlT* zO)?~{fTI08eX%Y9GaiBHWYP5;*W}4w6PfPug&DngNEQ%(T4E?>wbTQx1iiS9fqgLu z`1;mklT)9-_B#5%cep$;mv0j6Aml3YM42Niy)4Rjcw~_A0IE@AkI15^o!#=r^flK6 zFf&|Qx{TLjCDfwg2mnl@3MU6}#8zkN3&Eda2MS2Y=>{o7A##IcYZ)cfe*r_|5^PMZ zzAB#prc9B9Ix)8>F-7fmy%>?2iaC4Go>(IDwN9uY<(Wz_$=JGHjl@=&!<#Xr?bUU* zcMfePYYDWHHhNnCiA1_HEeo?{O9HhT155`{gd_Mh-Og3G?FiP!)2Z+(bL?;UUi|7( z{V>Xyob8e8!qxddo9w#wy3|AMx~)SbQn$z9S>hJK851P5$A#E2+D1LRsGH34AoeUy z>F?Ot9kQWv1em#yYX%vm?B|lF%FQHC==8U6!%<55zH3jF^&~0D zTM2E8+i=}DdtVnspE*JX;mAJ6Yy}UDU+E4@r@g1!Eu9A^S?ja4<I$=)eTSigxjrJSEltCt<(zDKOLDX2;{1(r+$JEB&ct&1Ww)#cMJ%KH)&P@ z8Cdv91$o9 zs6Xj_Hne$G5`!6C>Ulf(dU0Gegq>`j6;kd5tFQiK#s6&m3Z zAC*2h%VK=Rj;*n9>)$@{^hS<2+)o35#^JDL@%^+q6;F9=(-F33v#l;x{9EB1YQ}EN zM_jZm+=4quu7WLA~w$SI~tRDrkRU7}$$lMUsLO8%jVqp85q*&-Mec|en z&iOU*_|co-&akAvMhDAr4oCVbR+_{OYq5mCNg)BCTNW6Qy25n5yC1YxE|;*`w;83j z^D;_TF2=+SfGFB9)4V`$b{`GF9ex2PuBeBXPT%%YZhUE(cIQ%2y|`Bt^^2F*=1K<% zcp(ZfEK!r?yHl9voM~QRrJoU<$G3r4H_E&1zN@kz7DyMh%R7O)Ub_ZiL)RMVGYD{r z2Iz63-3hO3=0H_$@&E$Qf-IcACBU)1;qmP3s82$EB9&&AcFXOjU!6I!9ruJvftX|` zqWsV7KibdV-+$QBZSE-s44$d9|6yz|j#5iAsR-alpRG`W$)s(me<=;7C9YGY-cjyo40cnobP-c2&lsi7IMdzaYH$)eBqA5VQ@Qs&AzX|M)6KQg# zm5Ktx)V6{HJ%d3}>bu1E>qz2eG#caCoKAm5qNlBkJ@_a378k>FRDpJ;&}y3ya1Ip} z7&qT%g1+LPYeI5rQoH)-1+2<=V(n9Hh&6D$u5XRTC;R4?-^UV$DJ&n_huwO6|FwAV z`QnDcI~)WKcbc+IVI~e-m`KcgnG_ zSTB?TZ%yJ;vKR}-zD)x`R5Va{^+14fCH(7$S1*Y93SX@g^*MIX-KSH_l&Um%ckpA| z5q)n_-arx5io&7Vt?#yW1p-Cqs}Qys`VY6;TQB~#97?z@SGx;)Tg4Ya@DkR90M7q< z!_AAazR0vphI@UD5o~TEo6Wb>AyO|v&V=!lty#hMJiVAa?hzY_qFt3d`jTKtrR@7p zFnMKp=z&XA-^k3aZn%kMH~sB~1xiel@c*)|p|9Xt&xmznXGrQ@)UgiEA0;xF84HGu zP&6e6x5{Sv4jKo18>m=`U*ZPo274m8?mamIS0qXEfU^KTYaXOAaz2E0Ij+lKy8|j= z^CIt&A|L|wZ*{H`3rk|VaSUARHs%ignxpnV$WC=7kOvtm)!uQBSf?5V^qm4E48Twb z^e+ei12fXXg{`#SsO&;6%C~Rdxd7EVz{WR&P1%*Qybj2K7eY%r1GS=+cqCkPY~tXh z7iYG$)B74)hCOi>ygTyz=>Eh)p)=z)e`^O!f5P4h@J&1&MhuRgHa@7j5ynpxG|ojh zO3m4IrcyB(f@#H*0+aDoVkt|3NIOsiVX&gC^Qy8&c(xYnV`YkiI6?|>Px^*`V0Kbf1) zsCLOJfvh1FFA}h#*B82;N&nY4l=aWXh!FslVzR@DpF+{a7XIvD_1G~fXtO9TI`ot~ z!_WNvNgA_-1;n}PB!<0g9T)j<00!WFwy)(Xt!5*BAY2=5lm&;Km&LP5at)j*Sy?wH|qNAe#WvL1>ed8zD zJ)egiZAC)I#SSZg&;gErOcE!SitsXYXAfFB8_g0nA=YMhus1Qkv@^OBVrkg)`_3kN z91GPOg>fl{nht7bUZ>S^BoSfnTGTx-!dV(OuB-+^pcB^X!&5+-Vd_yV#)jPH>Lp#Y zgaG){kl#$z9sT?`<0IC^xjs9?L+vK%4w>dQcNKk4gCB&64Nbz5ua4}qY2C0LsJWb` z)V`^zif119-|u|vSuzmY9-oI-HzfIUx?}_h_*O% z4SLHxS^Pv{Dp<9Nw`=@5964P9jtHb0oEac+GVtnSF&zHv;myFKajl5i$EfGK^ljA#+ar zH~Q?<)Rg$0c1ID|5v~|8iz78O3;qRZC}DTPd4^)NW{->Ukr7mR+Z$Osx0RbLc72tN zt6yC==Uq86Fk;f#{Y`F%relf#0zfW)W*WWN<86a5Hk~Ww?rm=sBY5_@IgmsfBibEi zOiU#}0t~<)3!Kpqj^jcC$?PRq$V>J|MYoMI%j2H@w7a|gdXDwIeEsGpQCPSdJ$DY` zyJN9%^WfJQ3ht#bcpZp)9RlJSW~4SlcQFCN{p*U7eRIB2Dj*wjL?^O&=VSvEe4+1r zp{H$r1nRrKrVSSk=U4(60;-O-W;)ukj-WqNWO2&Vzw}o3&GR8{AnxDQ##dKy_LGVg z!s%?Q#FqF#b5CY==HKy*y5HD7VyrKP|O-y1WD)R8u|IRDIh}ILQ-KNqpr`5{asf$&l+>I^L`NgneP7l-=1yA8tDWE8Zg~j(H--R z*IrDp2UY#5ZsK>HA!I7s4XHP}fu`)k1+^E;3ZH7lw?QJ>drwo(*V+Y7Pie05x|Q!= z0!lWDTuL_)Pu?1m$_~-zM~S`V!{5?sbHFc&yfMTD|d8f+^ARX@^4q_+ap)Qk&2TtY0 zhb6VqOEKBQnSMEn-*bv}z(h22bU*I*w7=}cfCwevZ=ff#ME0nCRFPvpeS#el*dsUs z4p5ytF_AEM=-A^c{=7TCBZ+|>x&tz`cq@jfi1N@8K8z6%L!0;KX*U|5ue56w(n^d> z0p=9TzB)$NtqN8z5t=Sober3{K?bfee0QUpjN!QimTLY?36*ZGV{de|m&`zS)T-Xu z{-%-Km?w;S^mCDa+%65d5Rx;vch8|^NJym2=p(o{(%L{&TRWR-mso`+)fvcY3PZf( zM912qPac?DL#_Ysi+EpBHD~N_fv@j;y@W2D#N>DUd zbu=rD?!~oT=XoPR0^1(jx8Tt-;DD~a`RyX$)n%cSZlG4cBD!cm{Hdn0YYLH%%Qw-u zU)II4z^BDuEbf|`w>c}%;O(nsmhc1H$?rYBV+Nw$>D=`kY_bCz8#i z)f~X_<|?4LQ0~j{w;*VvbiMH;>F!Qc&4s!x`NlZ@D*u%QM`_W%Iz;RF z&}~`7d@DQ5Px-d{Xk5uCU)a-7E-Sw_)L(?r+-S;T@K?sFA(5+Lt`VbrT>;7_YAf;u z$Gn@OfgGxn4!1Z#XP0gX@Rb^a2;;n#ZpANptqbmw;GT^g>0q2wizJ$=yEuVmZm1nK zDtRI+TW;<~Gjb$!Bn*8ktNLG<`$p$p_3ETSM_CrRAwufuTsGwFg>uV zdA4b=svq#*Rq0l%R=9s#pGz%{F<&k};iEoV))2xAHb;%Pp7^quC%xd!wR1*}KU1V2 zznfX+wF)62W~mHK{}_0^X|l6n7b!qOtiwJC9-`-@dfsw8ci11qBfX!-WW5P7K=tnB z>r24ij`mX6c7~a9=&Qvj8QO3dd-G%D2>~xvzrRw1?ZQKWYHA?=ICk|`NoAI@lKdSzHtvP+K_cu$A|i+2@g#qi+hLA zRuB><9x=o+za~V5($W!i!{&Fs3Ll?;J;MD^lsZ{3@qpOyl3<%kg3Cy>k3iqmI*~-; zcgoZlxWHt)99~*4P<#PG|&T8f1_vF7l8` zwo@>E{dH-GS{SsxanUtbF{CDm5pXlHf$-d91p+^=OtFFRzDi5=TbW&!mgsjk&TT}gy}8%#t_-M z#l5ZxJPF(J!Q8x07*ke4Oo_SvA?ybbf=oUzX#sh+Q90$?+)b5tS@Y->;&Hsmw^!QI z9XRam6W=S<5z^X4_^GGo+OD_~PP+L14R^ORF~e^6X*t5wvlRWtRt9*_W7xfWyylpp zBssPLzWc6_IiNtz7&oRX{R-v`w+=9tEI=0w&hqJzkeXnOi#(7-m+#W!hn|@I{+u9B z<_BS<9f}iYOzBkj*5;7G7CS6a?6U9bOV*8KJRhUdiJ@OAjRC!X7q;cF?0pC8tBmi{ zvUga9)IQ{WQC*6pY!jK&+F%I2!y7QeJMU8F_Q`44(dcbDu+K>j$VI3ye)pa^x(vOJ z_DgU1z+n2Gtqjrx>$#+r(z;VDbur8*?4FFpQ#$*wZ;$lY`wyKpSrT&w8+RvgWyI z=$vq_@Gs5HI3nH?IHD2Y1!OiCF}P0OV0iDM)F=rHdi~OP-S4&JXf=#>dTlho89z5o zmu7bZK7J(hw^AH>W^ZD?{ohCxO4f;8%|6ohxqJ7G0qnvJ#Y|swb;yd_l!!A>5XH;A zI=>2y38S^@-PbU}$SEe$IT61W@JrMYK@K6_7Z7lW0MzW1 zD5j(9WD>$bU(hd({{%pO-Vz*YJMg~fVR{C6Fm{%Ky!k$=2Ju8F`?(g)?gD+Xd)lA= zG?BJvKDtTby8x1ti|i#w5q8&}Fq!X*jDY`CwfnO~ZFKB)U-1^vu1^!@gUaF81!B=? zVCNDFW>Gq0q>RRs?q>z@+tX9-O$<0XMU9vspp}*}K3-qHpLtH3Fw+pL`z+@swmJwu zt#SID8itajG0bZUrUo?V%BbQbaOM^Ox{ElVB{uD)8>Dg;@l%V=pcsAzpa`$5P6VXT zmjVZiwv2~5*m=LW_*wL0!dn6**J&Soj!`Btw;uD9>L^ATh~02!r!;S%>mDSD&wed? zJJLO}=k|k)pifmroaSfr6&`+dp7~wbtAEn-6(^7GT7~>q*S|wXwx5;>omxb%KU&>* zT5{MW=(s66l8|-X?G^8TiJvuaOQ!xZU-Lt!_3uA#cagd1q~xqG5eH=@B6=E#Pd@Be+^9O>;7{bki9C)G$I0Auk2Sg9ZmZ~J=+h3Qdu}veF%rvjx7%y zF=_GJr1x{NA*V=}vq9Fwgy7xLXU6I*Y3py$G0J3|J&u~_G8Om23xf}i7088U?jg>W zqN8P7YkZ){7JPKw2OJ3M;3dE9T|3O|&b?#A>`* zM?UrU(UmS1EB9A*SS;8qU)T!Gcc$%7fKQlOc!e{p8O9-Jm~9XqEZd-s) z{e($&$XoA)ak(nz5T|>Fy3(xO=Y&&NbKVsja*fsDfI6%Ki_D}MPqA`+p)QaX7l{u@ zZUS@{S}t?tTCMn`meh#(Mnnl3sDli|YlL-sRrBuua5t{fn~PiF8xJ^<@O0|e*oCOe z-mon$Y$XPvDucH~np0I25uEmzxtWl5*W=EFvncMpX#U3g2x7d|(I{a2be>6ayk`3QjcDMMYUN39nAI&_I1m5a>c6N@_`zCL@BJsJb4MD z2tZR1qt^)8H2*?R9p7Hp4P7K&nBzHwvb*>nZF)q*vVI z7^?MyvGp2qsoco~Kg^$@wJLIT!dL(#?2(4JZuEVh86%@rgN!*BfETrDr5$8d^Ilr@ zv1|==jx&7|XWqoe!)@<^Jp9EQod6?d;HS6vu+w3c4j+Ec!=Yw|OIK-Ssi$9ZjHzRYNdpSqF6Gwo%g z4c`Po#B$BnneAG&@__R$6j_g>;xAu{&4^7nZsX2kvuxw0d;v6x&=JnqgWk60OxIPNs$7 z1xVO*yH^bfePFuYIqjh*RilcW%3fKbtP4 z;qi~xH=f7Djs9fg14Pe2eT?dyKaxLCR*W=nCVs~w+Ip z-vxLq-vuYK*_#3f2}g{H@K1)L!~Re~>bnxi7MDGdvcZ6}@~{fhHgQNdRH_PfqDs!J zIW@lO*l_4i0~Zz-6WcR9Xim&`oKv=2;~Ef#=THYymR}rspA*-BSFSfK*PD{|&xWY0 z=fRHa>(pmNXE!(61>kCz0h(LHA#MF7QGD_eJpmv%l+va|?J;aj<-ux2QM!QWCRN3P z)mYf%t`t$vNzq(tE$F+36xHb}*i|xUU1W0QQn>lAvGj$=R2H5oXO6GwO8F4G@r{^P zc(Gu50ju>GfLaZ4!%#`dUu@fT5EUn0?~S@T|A~EaJp}FcWeLa4jcwMtjg|PqW99)S zvo*Xkc?II|RGkf&{*%#N)2ZAnKPA%@7zz#`r2lA-JK4X+d%Bv;&Inv40^)2Jo~k9E zibMKwx5jH${aR|exN-{PVWOQ z>Vw6wdgrVw`M}4*d@YLc@UF7{dR*Z)+ z%(>LIt!LXmgrm?`=8da;RI78Pmc-^&$o<~;=I3!p)<$Bn!KG-)?&Kfg_|vB8K07h2 ze|bb1BWe5JiGC8}EK0lA`7-9gFpY15uBCi-Hh_+<0G!g_KN-C5A8}y!V)utv?Uvha z?h$=7nO+X_#|yXqM{2Cvcp>4285B#cD?Xliq^r!UH@CK3s5g$D7wG`-koqfj))RTm z_Pe&eQ1SNeLKtp=6gp>a)7M=?Xmwa5B=zY!;>5uY2W_Pz6oQYNZS~Wa>kdg z!{WTYuW#b+S-u8O!RJSpE%I?>6PyKie!AL@G{~& z1_R^vQWbL)CqCV6$4Y)Ak)|jHEGWti9o+@5Rs*;sM5VGwR!@a4wR=viY#0%AzrBtwA7DPbuXh9Tasq?y+ zW1E>;x~Hh^M?hgAMy< zxvCFbXFuKuCO}2d+#2?N?YG-ckFr0GI=#nN6-v;LM6Ud>1U5fCf@6;k-|HhYNrU?1 zs1fzK@yF3h{z)H+oZxPS&xN)acSv5^$BEK|m#y^A1{?kpFkuxl)6mEj!(FWL<``8u zL4$axiI!!3E4!mJrzjhl)oDp_JkYzv;kVrrxi}KZG!z3Qd(zeQLNyn(S**j5=dkX=+(Yz05=B?L2-4i9q@NGvCLS{}Dj+@)hJcU4$3qk|h{^0wSIuLKSi*Pcq zu=*z!Pwj^hocA$+pZDp6<3=2$I9doq5w^FQ&fW-EU8%<|?~cpv5f+uSNMdn{Kk_#| zX~5)=I})N9`wM86v2FhKm1fQX8gxc801K1|@c7t0JHs``4S;G|)upIaDCz^6?Wm>g z0cFkZpvMo-7&Bqa*vQ^>fP4xfWncvY99e379+yM-l9Q=SC2BVAWt{geb~9N`nd8n$Q$6hz3=viyEUjjg$if&O$sMDAexI=%{$CqfRzk9|l=E;=GfadXe{n42eU5-{7#? zFc3J`W7NIFf(x(+b-wQqIqwB>6@j&c1kg}x$n#KSd3iJDf7*(5`(gDBT*&NbNB&Fd5 zN(o{H;tQ!x)Bc#xc99>@ir5vWHnve*w$?`6iMykx#jyZhHPlX~Htghx z`wSY96RN$v)$Hr9zWU;;g9DwKwf6QeR=-$XUDltkpYMNq`VGGxKHai^HxF7Irg0*c zJuiA+;GB@q(xnSN?%i$eUvPZ*CI3EL`>K_#s$lh-%~d|+YwtF{{z{#EwQB#aQEcT; zzWL${ev{Z>|I^mjyjy$zO#g1FbflKlpuhe_`27vPe-FR^VQ-&Oav4gV;ZfDk)wOSZ zpfBt!;_ohUd2KufUtthu_%TzN8xSG6s`nk`NodlfS*H#^gAjIh-n2R%X9`uDEy+bllT(Ln^30}es^U@59W7J92!(%NG z@isr%`gGo|hY)jG5G1F`$m`aUuBx3}!1KQgJeh;)ni;^;31KG~Yg@4T8{LE936$xz zUO)fmGa@Y>!xYJ+a%L*5#FX6THDNF-L6Cokr38oh6}gzDy7bw@$dW*7TzE_33l}+K zK4zh&C&?vg^)sfisWbV=`9D9kZY)3*SWq1p9bg30w{+D6N7S}Q=!*P_;6-x#o!=D+ zt4$vLOL{NiI#wn@a=m199X5Ndv@3VQVBbm(NGbBhfGN6%O?Dm z9>5Uq&Pnz%?OtFPV%2DdoY4y`5l>{spp{_zFojUelu)0|;0*dehO%GV_tt+YI{-67 z8TyQ%$%0*$Vd|gJ!Uo{1k%{VTb699?l3|8NGUpOPUK9&J&!O5mDwqV)Rx6R7>c2Y7 zu2~*enB+9lkyGr(qRwrjv@n(jYGc{N4LXblg#mzNF|k8T)Jyrsj_fzrcH68$TN5FV zw#Jmq!eK!yqI1LZ1eZpeC!ho9Fl>CEmQy=dN!Wa}EcQBT7DV360F&KniBhoIIFyfc zuogGOC^wm)EY(tMvarYP4+dA8`%;fN`4l?HecwQaRkx2>=LTPB235PQ)(y7^>VrUA z;oJ7Eelb8;3MM&oM->wND6c0|d3+%vV@Esur(=FziiC*C4+uo1)WzeqjkWG-TsocA zW^a1{c+kTP=Qh#;@DkO2FZ-uVg}&_ADx3A_u;5?F3#_wkA^KT6V(G|aZ5r!i;m~gY z9IFQtMF*U1hdFD)5i>9~!A99Z=#E$&Slr|3JuSq3U0+j%g<>WAwdXKiG8tT5o-OUj zL0gm;`Fdax^vT^Dq6Anw3##U@X>(xDG>6SFGE5WPvPmp1s?Zi0O6_+rJ^W(oJ&-qS zAA0ZgH7$HIr3Hg1v9Cw5f1>JbWshTlwXyLY#mY7?s}`2qn|N=A;|_-}CuQqQ`kp{% zi;LzLKo1k(x=WmCy_LIBUNqe&!Fy&s2|vu`6aZU2Ym2a}>?O17t=@>|Xb(rCXDj!~ z7?MbY)H`z2NrErFv|imDAybxKt0c74&rne#)~ps`N16&~hEq`A{0Zn+&1J9pnaJz_ z-dvvWjoMr4he~)Exj(>kgw;klFaYrpj^V*0OK!6O93!oTj;^cAFBeB{#U1(1ND3Q|wA`|;}0w2Eu_%;Q;XWpQNwe7dJ z@9JSK!hbEcH}J>yd_OLE<7zXbH%COK@)WSWENhef_Z^dcNk#|XYkt)yyB*l~zv0Z5 zN-vK71+xbvy!VE>h6~(zcB%V|joy1K2nWhpPOv3u%gmmD(yxm)jo2LH+{O=n0i7am zwm6>RF(<@KL9P!rhr;oE*`@Cu+!rsRR?t2j4?|+&-wMH@Xo!Tf-!n{NV^?&|mz@58+qX zK?!ULMsqTB#Q&irIzw~itJ9HQrQT;;o%OB-B*u3aJG>>-!n=uHXU*~dFlSWgll)T% zC*T!aNEBpQd&D;Fbw|uevHhKm)h;Aw^E0n;*tiFYRJ|rUK((db3TXr{iqDw~x2WoH z@ug}JKtzNU9MY_`c9s+YhaP^!j@)bdwdvJBp)Ps`j2qqMY=E}eg01KUX6ypfaiWRXUCS85mzy2*0rH{(r8^4t3L&6O5J5JD(|3_^{e=q<|Yu z+XXDvBc?_D#Lc+z0C$3GClg5cMZIl(8CW8OAAAXzUx}enp#h|i#?xFh(se#>n2>!X z8#Ytn%Tk;^RPu>Yq`H#GX=9%j^mRjkKwJiVd}iHgSGMIhXWewdnrb_PqD|^MLeO_B!>+9&c9&4MqIhM(sF8Ju#_s7mv;hi8 zOaT1&>K7W*^HV`dwD5~HH+sOv|DTgXy^}-@^+FMYOA(3iiq(mt0xri>Q&3L4(V~SG z7vWG+h~DL762H_jZ1vO)Pc;!KbgjZIBJfb(Exbj8xmp8>B$Resy$V2M3+UpriP%I7 zG$UM^U)ttGQ0M_GCIi6im4eH%P=wir5Lw*TXSS^rNKde(Twh0A#)yssz(i4AOjl!L zw2)X`$6t6H5}tU6z_vy!wV8VLwfM12_$U3wvlpT~;2GUGC=s)|n8rPVZflTFjuhl= zWW&zTDx509+aKRH(u4mpVE}Il+x0XF#MK+WTyq=$Ha^Vi2>;OJV5mV%64t`KqP95+4g7z| ziITO1WVowpPmX|;vH8w|J6GYgKZeuLL&NS=Dd|&S=HnPtWLO#^3tWna9l9jVh;j6; z4md$?!wj$pqQU3m10RqB*D8@~9e2?N<+Vm>WNf;?EC^ZDW>4fZHB=NfH`Jw=fXjuH ze>$$Ny3i>RTcnbjzWX>D58fT}&9Fg#T;vjHI1B8)_G)HCq0GlYEMdlFiE0>qrBnj5 z@?_(zB%=y3A9WcU)NwzZXQnv7fTc;?+qP5&2LOsp167bGTb&6rKrGWRK;p9tnn5xoR))n{F@@Ta zIxc^<)vX%EuXwU_tKL!1?z$lHOVaMI;7I>hO^KH>yVwoJ!S;A>n;hvMlLM2~-qiDv zD&RL<-l}S<+K%~HTo!>dG5Aoae28TXO_XJYz-0;`>Huj_rMlk2G|)mxekUU_M5lrt zWH{SAErx?Aq*L!U6-Z?vm$Fmz(RsW=48=#%xN~%L>aWm) zZQD~;Zj!WoWwSUYnm?jfua)j|7V%EVmgV7^E<_d!NqxG{*D&W zaNFDG1b^+}{@R!OYhUeuxq9#b8fwxCP^B?LIVR~lYZOUGqhKb$N7+_vdh_(=jtd=$ zYUjATISKnD^MyHs`tn@kCt#Ao*gi3Stf+(0kAcsIaAPJ|clm_uGfr$~?d7&-H97)9 z)RmP~PW8<`d@I<^ju)t`J&bs6=|Gy)a?V3M4@SL|W|DLWz;!c~S%hlv*42z8J>FHE zH}8EDI3_VbU0>62$-u9PxHBaqU>E9=PmODt#pq%Z=y|6&)UCsHxh`relAW0%j4;z~ z$j@3EnjME40Gec+VW)e7SQtd8yL{D05vjrY6b)D}>>7#r-YZv$Gn{6eveP9NEWxy=pXUR(QwBnNeoY#ET)L0rlXPsBP~ApyV1 zueHdixmX1QvX!$kVb(6;-+&koDFsJj>gt)V`Q3Za<^pALKD{<(*LeWVE5A0?!gmEl z&uS!Zlh!G9zgnrCaEF?Dv-9T3YhCMeu3({FjS)Ld4f4c}ZiP{BNllo_wfTOrab(B0 zazrwT4gqGITZ_(bvR|644J2%cCA-a_ZCa@&+gbN%kv|B90+7VX_(fP@XLMSC=TU=$ z!&Lap@kA4)d0RgyKB8~vtNe2FTW-^P46Gsi%~BULdn+~PWnWu17*}z3&zJHC!_R(ANofR zeA`kbWw9GSIngzf&PGdjQ~sG>5=C}29S`-(F!X)Dmy~JLT$Im~@#x~*f}BG{u+(2} zs!6@diQLHu&JpHrm+p}wSbBm)!#Ri*R&y2dQAjBuUdey+^`ha$xJyn?e|~P+3%y3# zB6Xzig>RR3hg^@I9b%h8uY1=2v>gn9uU0djUdqiG`x)TrQhswnD&*?R24sNJ#UvuP z8JUxrH`t0wb9h8rb`Dak@^-n~Khz_dxq?@{DG69dAGc(u`*^Cr2dJWXb0U*=Kawy3WfrH;gX+@AI5`oURcwmOs$9ZME;uz94g0%JIV&9qKlzr#?G>Bc*;cGM& ziH+N@*kD!N)@lp2K!-{H^vZBzJFG}b{G#;t#s1m(dOhIyk(Caojl#!Pc+xCvS>bON zBNb=A4l6CgbTAZ>T~9X}v=5!9IP(^@6Z~TTK8I^sjEmF@*QKHWO`!A$DtjC3ax4cI zbz%WfY!xejPzq(3E*$?I5uZMe6M^O1abbOKQHq!w%lJ^}A|JRTKA-IA{txUe&L0P_ zPl?Dn#M@2wSzJU=d9@C!A!QZ4{NyAbW5CJ@R25WiKo?&qJ?S!0uq@HTqcw&n2AR!K zA6{)jaH^_)R2DD|M~B~60Hmoi1Tc~>mFp66Z5EtCN)7jbF_yy*oI8iWx850}0t9;6 z4A>M7&FRSbGPJp)_zk|^9?zq--|6L+!g^La%Z>R5H83pP-XbM%*AK< zai1?Ko84=AD>oX?l^wK?pk;7*EJCm?;O> zRlzsGNxZ6$Y*r1;-fHUmsv%T#`}dweu}->HwQfF8lgv{e?RIKn^{ z3vbQ%q%08Uy!-Nf--bqu1cACr(ltz;;vnBADz!64QP( zw5%J&kl4K#q3~vzy(xPHl7vpO4|Z)~Q1;eL7QHVy!BNFmlisH?@Z(o0opI%{{)FQk zn7~Fm*%lvI01&S%m^or;kW9Qw1|ezSW42icd#=}4WmXHb+A8r5WUtDb?B{;3{i)<< zln?azv82dR$;`s7GG>~;*S@y}Ja63A;BYbd!K7{O5d`*H6>xwlmw>}?VP z@%?z_^Yq`3I~(7R-RDY^ZdJFp_x+f89@L9ift_zy&#%kgs|hpjtiLXGce3YyuCG~4 zZR<0N37geh{t&`lszf~B|5*JEBFq`O4(g>+Sxqe+=FD<<< z*?g^%Vvxeu^O~$Q%*AeOveA%Je!QnwOdFG zwS-E~ye@yPuLtGQlFGDB|I=J2$m6r;ZF3!t&u$I*I+!RMp>F7!OyR;7Go;bIGWPfJ z)zAI5ZI(>FbvlSdBa#I_Do;wwKLk0%9qSs{n);(w>dy!TV%H|#%5iuH6+~j?U~eQG z=%!+6wTp|)h*DYCKf;=Y?2-n~L>fTE-y`m`S$2Hk;s*5yMP6u%)k{(N<13zxML2}m zdvJ^4OnWfwgfp-#<4nPoXg3_h=x*V0&=^<~JR!jmqzN+?oU&Yi>7tU8;G)ol_{KeRQxxJw;}Dq|Y>jtjWHf?vf~C|bi-u66 zFm%x(o6e0I^OGbO@=FYmPt9tRcMimNpm5{O zcsgu6TZb?M zbo;_udA>*=*dwQE#V@54q>%2&g6x95)uP1MN9;_FsJMn$=2VAk$y!9Gid%L*;BRte zi>}<{d1=>P#iKAFrlT{*tht-YE%HZjA65>ah5pcz_h5L$TlIs5QMsTI7pQS2_ki7k zN!{7$tPP4@8PbKoCO0kJH(*kVoyEmFUg(_NtWP|Iax~L0erLe8q|N8LLYM->imjom zq6pIr3v%56k;sjMb1QICql!HxG7}5}$;mYGstt0p8YgnsHdR$gjlkLh?4iX65M=cG z+WEIIClRGb5F{WilL;N8AdLCe@8S;>t`)APhnV_6t8&bL4--_E0W-*vQn?CoidRpt zWS-?WQi!_#VwdPwaPrB#*=S9$&5@m57o)fdf?`NTIZ}N4b1r@){{_0?%*)un;9=5u zuA7=a=GLBS?_+23e}~Qti!eMGw(jj*4^!PF!A2F=!}L zN$oq8Z|z>6LMG~?AT4{k9Ab|AH>d@-y|*2S2)9zXNwHMxo3;0*#I*O_PK4z7044%z za1)0r^mlQ-iS2UOKl;G8IK82j?uH|1N)7w5z#!_@qe1ceV}Os{RewYX+nDd%vjy=4 z{~1-Wwy1hvEf??|!t92)pbtl%S_@Ex`8Im3<+ax1`;ze9k74tS1$-o7E!zxciABR= zgmJcWKNey&-<3L9p}g+Dl+0Ji9WRNx6J(LC(S_N`b`)Qsa0^u+6pIRR>gEfyw$|zv z=iuU^HzJl#&9Tht&0U6DFE)+`dhx9m?L!>IJ($N;#2Il$ubN@LCZ(`a z&ndc6wJk>338OEF)?bC z$z{-&w9raN=w@h83Gm&|@4wcn%ii5One#p;c^>IqyLMexty=e5bu{8a15BN%Af-hk z(CBD*aKNogyKg((r9!xqX@`nDX#yXt)a4+HKaG0lLNP_tG$c|gAh(j`sE|4gRRFdz ztDl&a;YlUT{510DuhvvI=xg3g=X_5pD#={Gw<7VNLPgo&#o^(lLT8(v1j z{h-O?3=|K{L?;ma06Wj07>;*#aYDWAP}62Dtf#mBztT9-U>GOG?Qw>3E66d6a|ewT z9t`(h;n3StcG7_B{I@zN!(K4=E|)3oaU;-^#-ln7GH!W&Qr0OqIWe@3zlHP9)b!jd zkpO2I!3MI0x((LhHe?GEZcuY?2}pLFCvo)KI^w8F*V2no2Da0A(vySLlY5caPLQ7A zW)F&0Mo4Vfw3=1;M(SobE)^zGbV#^tc~x^;qL8Nl=qw#5=(tn|AC~Mz*Ty0F+1k^O zrQ!#hKD80U4!t zf4aCQOMz}Y=ykTuwCGZv?iK}qi3dV0Hb_s#E{t32e1?*Yec&9TPL>|OsycNSNL#Dd z|EVYMMmFr!kBei`5e9kvBA`LEomp)HfV!JcObALMwSn0n2x)ue2}vVqbkjZ0{e)J3 ziBlfc4$TPFhy}6%Zfa8^q~yvmD0W)s?eI+AM~Ac3#{B**C5+$K4xCdhTnV~}NI*)} za4}D{BBh>Dld6(2-&{ley}~zMRgkN^@!m*oRl!upTtj1l3M==09>`NYTMZ+H$b|Jm zf-mW0z7qZ}cEdY#CD^9LQ-K=TWMIuAm#IX@>e#O~0NL|+(%{XB;#>j`3_U0B!X*f5 z)?E8c+WH2a&v;t;c@-{YT*_O)^n2@tLAB0}6t09)` z!eqE@9%GRNq3R7wWr9q+F^-#U4>pL@KKhMJP!8u-EraNC`{J07<~Lb} zB=P6kHAJAf?Zv*?)c&<`%c*sI@;upW$j%)3%ll8nzvF>h?A%(T()1fQS9y@2Wna`e zXYaYnyx6hK_87P197+;HSHE>R@}fd5A$3{7k1WR&q5Zi%Rq-UseC%bi6=*@A_XL2m zN9A@ZtB>wH0?D*tM^k%{A;g}tu|@}+0g**!1ny}kQ+R3@LOihx-UkQ1>+D6;7Uhtd zLRAjQaui#`SK~6_L{s)W1*$UNtOzj4PQF3S_>GZ}7cw}=(4-d#Wy$We2)$E``q0wH zd3TfXVu#FA<2P(sTRdVC?9n8D0V8YNNIE=Cmr-spDJ>7|`V>L{F&}Ge;R?p1m-RDV z0Ne;>LB+ko8BJ>>J=VZd(i`1HTrz^l2OHmGs ze^WF~%ASYmrFKZ_)6^!g+VD;YiAXiV4<8-w`0b&639q=!*KfP-X-yU*{Ib_V?OY(GUC;2wZPKKN)cGf z77&tKQhQIs+3!ro56iCV`G!@g?^O>k+F`p`O;!yUN1>DKRQ@a^Jgsb)#nUU7TnL3y zP>HpzA1P2NHU7j9)0&SpFCF;1)I~yx)SSQF%#GR}YBp^C&1QXvex?8{B6d{Hv5^1I4E&dV#2V&^y5r0Ykru${|XhH}n z=@eMVqok%tvNf@Y6Q~k&&4^Z_E`*$HbBJ67j|9kOmP{#qFO7piuAtYZX2-X#S8rgf z6=xG`z=SzWF_Dy|wu_#?J$F^P&LmLh^vJ<9g<2*`L))3&L3X?%eC|})rksr`jj&yy z%S&1Ke^TCYvyzjIIAqwG&`LH2?cIoP94<$Sne1kZcE_%Ss`#J5v~ z(w-Pve8Vt)loDg&F?T?v?ZL6z`(ro#I@DlM01xieDh@_SD&(LdLPs9SC7YmT|0eP9p~;LC%UN(qgEFFvn?jDiLeFB=8LQpoO@4@i7p& zgQ^XXnCo*hEjN>zv5u%Q%5QdY!SDC`quqUjLOmZJkEyyD+09O$P2M`8iKtP3l=q0j z;OZ%v%2h3w&&$x~Bh#uC;uYqX2r^kXn)Jb{ zqtW7b6PN_cq9N9nv!X91VEXQqb4kJFxrbMXeQ(#S(YI4Ao^KTv+D4MLt_zsxgz8At zxUmHTbG@0THa6KTQd9gau0UuSG=n=JOTrgQYNwr(FBXJynN|1v-Uw}?x*7+}@m8f( z_3=1~GI_26NFUiV8(FKFzuFsthW}-E|1@~+4#uJ0w>#d@j9Qk4$w&~cr1Vp^J~sl zJQ~!Dg~>$$WI0EIRf)z^3D>{uh7dG}XQB8kzriMf4{J>$>_+^xBxTuvzy zmUSrI1CaVnbGx*Ln!aiPqMe-B%A6YAq?-G=fpBsEcCctHXwCedbdlNXG!H66@x<))-5kDk^*oDABKByI`djln13B}%j2DM`&DMOiAZt?0k^PJ&aROpV$I+zZ5o%LvhH|sZp!YdhxciLeBR)}BGS8ZCLu~^Ck+$(0O z4ik=1`8W#Wj3a7iD~HRxX>Vl01+Q>0D!v=An#dBM%%BTU8mO|YC+mtJQb0t>T8IyZ zv%C#f7NGKFbb=5?n+iKI$Rg8Ze}Z0SP-$_LL!Gh=?usI}%KY$<1f_~pTVOpRKIihW zY3Obahhi{`z&{_mEC|9o_2;L#f~@QZ%f~At}h=RFMPaFb71PhMQUe zQ_bR}!a4qG&plas^BC(;3bP(*n_s(j!>o>R+6>W4rLY12vbCWJx7Fo>iFu2FJH5Vg zC6RF{gK9lgv7!~av%46c`B=n3ST=8YeQl$4DNYfnWqCvLoSG8rhRbJNsbEy8&=^`I z;wQ5mX)>9C2&HYZ=wZ=gByz)|mqFL`vxHQ&1A}cEiMrN0rgo*ae$`nz-ik|&7s)rv z&qlYHOCltIH)@#zLZ=j9_{mbtCb)SY zt`bI-fE#ZzRni;rGR^lg)A?GvP7C1{MNt8nq6#61k1*PbTJQ?ZZn0C9I!{$ciwGNL zjoKny6xX+Fpx7TIgjCG0sh0p2QHOW35kTE1%3JNSofT0a^_rFJxb+)#+j%-mVLecz zt5iweUD}ft7zcE#pv~BnCQyAmg4r4$iOzeX75nM=+3Z!u)}ju|PVBu0W(9xQ9c^sC z>~AN-_{+7c6C)H%*XP6c((sZ?zUQ8&3G zD6P<3PnFP+Y#ej}Pm>i3Y!Df4M*4~2(W5(wu3bZ}?xa&h%ESuIrrklY0;RZX1tt({ zAnOJ=@(85yxic)x?d|i^agxlb2cLv~R3h0G3AOqE@SW)I*@!4MmhFk+=+rylrL8Bt z!k|L#z*nRc+teR2#e{;H)PaV-{)vp=Hk%-dJNJ40^wY>?lfL>7-@=isgWp z%AF%fV?;4O;2c=XYG&SomeAm%LTF%wZg6#23lG%2a%#^Xm}G>HV9xvxqOwR!7A74A8iN!=Mw393d zU~6)um}w7qpW~Hd~nA_dqK1m`7 zW1}tY?>u8I^~dURy}%rt2}iJPm5g9bEcW6GjT17}NH&WX;=p9}cTQVZb<0O;&k|_yWv0+*8O&Oxcc6J$+ZN4<}2>EP; z!g==&fhugy<0Gn3XCINL@~z~Lx&>*4Rph%Vh9b{N$0tuxz`P;T8i*REK2frMV|o5_ z(-!L220}CN4`iO#mq&GkDp0ZFlgS&75-4;6zfuHPh{Yg&JuI%Kv`+H`=D-<;ybI;w z6}k+5+FsVtwAieyr)0Bob)jK-vB;KY7f!N%Q5>g<6%Cg~beVl~M$wa-jzk?z2bg+q z*m*SbWPl^6NKtxjLvw0Swq%O4=-!g`Wu#4QXGQ+M~Bv>*z5 zqs_7!pm}#gKDC9FGtf?Whm>pyJM5Z}@=9_zJdBhq>>obcCM|&SiPoR%@5LxsBOI2E*H<@#@Wp!?fU^(TAU5Hi}4o|1t5<6TNEadb1C;NjF!aa1Y zP8H2N-+lfAApjDR`(L80TXmJ}3lCXFNO}37|iJ!8D&CduO znW@>dgEg&NU_nHzr5`C(9b!Tpn&m{89iJHOC5ONjxVBlooB$?yaWf^=(16Lp)-qwh zoD^Q*>bnFnZrcQtRP zQOY?iptw_UO;U`7dDS9Gu&n|uHUMYoYkratxE=`Vde8^vRVVxmOB8p&fH(8MuugPo z1kuA<2LoFp9e@mH96tZoX#2z1GI1&qKpZ)Bk&Gkv5AB${cID&ht?vj9!0Ukg>*K*2 zoiWr+F((Tg5YNVWHxGYH42$01k9ygktlmi?>~aUk6Rw;3a-Q1jbH?1x==M35KS?2R zA9M^rJ%4}vl0+M*@N5dZJr1F?TpP!^@&w>*Le4aSE1VD)hspOHambxx=c7Fi&TAFv zLJ@J>Bq30B3NthspD{xc36Z^k$?H3an6Hu!#S79JRJ|zm7QDCsVnstvY&k0vTFtb} zb`MU`N@$g}WP5TTziu@_#Ar1s065#VnamHPshKZ04bkPuTwiGc*nk|3g#c?SZzgFE zmGv7^*!WE}W_Q>oQH|lszXv5(K<}49K*(^|uCZF9ECGm4*m!+D`DGC41=Pm&@jgk- zUaoUGABEuG18K;Hk^s)Yz_mfj&Zn?ZDOV&@(2*IXC>ZHT4f|(2SUzU`s&7XM_P9pO4uMqaT zLuk(s+N7eAtP#8f6`pAtV*!qxud^kDB1c6*nwIIRV@+(`5^X2vFf zyQq~CIos*>y&wm;vgJm<`(H74aVrSyt;a6O}zLToRM%5oMYCBF$?UZ^<@q&f`h3J?_=F#S{~Ue2{n zY%E>yfQP2;4np)aCtqZu)Iu+FS;0w|PAhQ|1;*%b+ic+Z<6-9VZp4| z!sh0y5g>Jw`x8T|G@6JBO0bx=aSa%1+hf(^lu&Dygl@a7z_#rsS9?J*ykvGD-nsb< z!YW@41nYvEHS#!e{*%Abw$;JdA4iOw>^S@z+gHe7{z2Q6NQ8zK<`m->ivc=k^k{5P zHa^vxd9g(pkZ`IUgzO{|L81FLLn5Ilbbre=5eARhgeiuIS;uD}O4JBM;5`eH?jl!7 zb_hBEB|_`yH{*aaJe0eN5{&}|I_N|GrDOzAn2vrm$FChtYCx@}4F|p2%-24Q={8Bo zWK+eJC^kmr8A_X35Oth-!bPc=(?@ty=J;GAVK%H1mZE-ZK^Ity15?`O7gWBq`UTmsxdfKvY`ReN(;)9%A&gEhX9#! zfs%h?Er8}7lMS-9PLjg*&q}PGWFQ>LCSjKrt$K@8?ae* zZ0})JyUKC4B!0xB@B36}jm&I3K`LfoUK<9Rqtb1-po5*I1LzU`5(5JI>Y%v)e8`%J zd4@aOq9s$Jwu|zxD7n3PZ*)$O@)=^$@K%3JEHiV3pa%(#3#>!bUbB0w8Brw7g;%Dj zb8q*GE}o?Z7ev?(Zi+~z=rr#@cLQk9Xm%o#fAxowtfa;W?5PEbEUxW}yr?aAFvhf- z!sg=do&>=73Ab~dzt`EN?q%oY?_D<%AR=fSNoWk=z%W4MX-4A2*U;CwsWn~#)VRq5 z;M`^#8=fQZxx*Y92#zV(U+}Xa%|Ufs)2L0Fnx-f8Jj#N1f~b2q%g)P zD~Sega!mlQ5@=uzji{ks&K2Zm%Sc4i4kMc3$--ILiLhT}UM%fM)`YTmuE1sSLAB@m zBn-Zg1)5+X!@+1(lZ&wN23tbiQ%Sxgp-R2P9`$-bS=v$(-BNpQmsr!a+&x*SH6Tw) z#?8d+>ya7OUYstu{jE0vX1n% z<415owH8_FdOA*R?UU0AMg7i+2M*J?ededGZJ+{JMiQGzUZ~oT=*%B!h3bVKsuQFY zFUw>HApjf|E9XU<u>a!P9JB1OYE|76IQy@+T%KIAmkHSp)M<$)8V0SfJ&{V&5$`AOTh?e8Feu z$OJ0rQP!ArYM$q27#-$4u>eU>v5AwWH>2-D4%z-mvYZH$`6ndXnazvJne328??j^h zEzQ?F!QLY}0@aFzd7f+)0-Z~Q8luc!IR?lGQg-4`Et?DxK$7XqqzV(uVwnk44WvhK zpc<2E2>}XW&1evpX_y3BNi6M+4}G;NJ~NkjJig3k>24 zskY0gczrtd3cV{&B&xdO^@+yXV(ehLdlXh*yJy7+@nmq z2H=Fx*g~*1HgVG;37j{kYI&@DsyNAejdv9oc*j*%z;x5^0AhTBl(tDx<3$o!Saqhr znbsboWaOO0!c{8C#~G86hIv~d=trGbB=sCr&a{)N=NQ+|N?I~HIg45*2Z5wEkl>0S zsXh8}U5)zV(J7?ow4fCJx=aOT&-*}vRdStKtVV>g+}CmW;hyx){5~COi7F{1rBMgN z^xlMYCQ&EFskG{NBHdia9~*UYS{JA|OJUGyRM5szmXkQGlIH-OaJ{%1xNX}MLn@+P zu~={aVHLU4m~x~XXnw2{D2>5jWM2;Pr^EGb@R4M#?9S9P8t+p#e&J4A?Cl9pTA0wr zRGW;Vh74Vxc?Cd*9-2vh?LU0VIrmNZfMBu^xf-fsCM+q+J+y}u++UB|6~LJ?GY@#$W+j!E;G{bM9 z3Y2<2P+znKps57Ne_#4xifyF3^mk=s;WsuMWmxfAWOS6fy6^nCexT59e zbT@G@T=g)AxI7??bI9WAYz}Jt?!9csBAVjLa-g{O$q%!bK-c|Um*~m#1xm=Y5cfT& ze&EZp6GpG8QdG-bdnY_1Y5r^}H!R{aGYjoT7lWIpJR@C&fL*@qay$)EGRuw9Q8df0 z;La=i*;j3ST@Qui0nQ@@jVQmm*0BrayZF9GlG?F*W0@8pc-kAr$akiQK zd9nbAa+htKhU;mBWjlB^**gn^TnIYJ7(nY{Qfz^F5%F3c-qsQJTpo)2akLc4?>svF zH}Lv-m6p3F1*I){@cJ0zq7rg*GWb+-k z)fHl($76iwNdZ!<>ykouT2+w{lNgBYdXH`>0}}q^bJF7m92(tD--o#i+b5{2nN**tUtvx#pb!a6$Y_0zB~F4! z#3EX_S`tx|+`<(%>jtcph$>0*h%K|UE#J3131kut= zkpG8F;5|%bA6Z||bV4T=7c+-5HzafUB@&Oy2~1X#eWt^LpE6{TfgnE3mQE(ah}~P# zg*;*xL8-=9;Z+-3mRR)Ot{27pn=P1JA5;xrIo~sn_#Ucekhc@bdE6d!kZ6K8T~nUR8FG`f9e2vuoyvyU zA0Lo=e{#lTVCA+c?;8-i*+CJem&tB5^Uh+OQq9EsN7G~m2zP8b&XQ8Sq&spzIU8nE zX1NT@LyEp&Fv<8}0k1wYw{>5pjH!8SrK*oEKZ6insR(B|xh-;tn3T1g65jgI%HXLJ zMW&U+Aop@{6ZvOe7m(UwCm0z!wSEiSa+9wA$jD-s6Quz(dzyJ&_Y`*|HFXZ?7G1Ev z>SVw&FlCt|J|hUx1vEE~C;O9cOfO47R z&8b%zHwjGnfsj{nrzBSE{%JbnbFS9l1yF&LL`Y{x+FyB05uW6>A*7&^#OpgOUv8jz zAdH2&m(Y(J5JKJSr}wSg@6q)(Z8+G#1Xg6O6#${t!;0? z&f@^;IW45Y`Ns%W_1Ed8kLx3V5j8~Rko=42Nr*}dG^V#F6M3U~d(**1hDh#nwzf7F zIfHDnY=N&{7<<9iQ;#r+W(=@D=Sw$HG{5ybEc^`#VE3e=5C`d+fkGy5nv1)64Ld0S z{Buaeo6%+R!3G9v@~n{|Y6G{O#Y7Cp2?@a7cfQ;D@lkMWE}lCghydeKlFB$ZWjaQL z%AL34TL9DTb2gL)X>yDGDjU9RIg9*2scM93iSAa4inPHeDHcxF6jNpsNl_}D2zS0roj)cpV^A}d-8DN4rB)+lP;;Pw#3zKWfXI!Lt>eF9l23HL|c(WdO194L$?ju0=G_NEy*0IXMLRzPBVnP81%U@E!V5gqS z1hobYC@F%I!qz1bo`k2DSA+Y#bVCV$U=VyEsf1KLLT&9G+i-WyIlQT4)n#WkIA4$| z;Eo-flxjLGL1ot^Qse?&kK5>>G94&yA@`6_i&4#G?ue-E1GQ{DsE-TmRG%MAzMkfc8l6?X1PERiKEG>@LGa z*lG+)GPE5@sfN`(Z&aBxZf5JH50MSjU?Z%=X45iV07o4Pw)2g?9GANV$9#AJj+!X{ zpxb_(Z&pP4ool04@%t9Zj5{T z(mG``*USV~Ce^vVA`gLqMUpV{n)_#7kJuf;Es>Ai(Hc|LUB;d}Qo(Lrm%%*o=(sv( z26dsL%qU?$f#m)8zi*LN-b|};?M>3qz<$t31JsB;Hq@D|#L$lzYF;CXP~EW>^BZ}; zIeevqPpr@UZ?dgzl_SP59Xlj2(m4vjhz2EINIqrydF8aM3Ve%;F}=SveZZKhD8qzQ zR(`rAB8eMtcs$7z|3y9_c31Tq+(6V&jpXrEHsS%?gx2ge2MFt) zagH+<(99oYw@3HL_jywSp^tv^#vlqL!jx{XJCPe_huQp*Cy2d!uPlH z68pxIEthYK)^a%c3k)*&;6KS-0AFLcegV&>c2PeEfv0PEoNYdvyr2Jm*&5-Z5#2fT zkt+5Mr>cyTAE^?4*UXR`_vQRu5_L65g{IUD+uqwa(lD*YlR&q{3HcO;KZvV$;sT!k7uK&mMDLBQve-d&kQ9``q+7Nv zQOZZ91ZX$GES9%J@icHC`VuxmZMGYi3 z0mlMVEuE6Mc1`cv2VOEoLKKks!6O`$Zngn0^{Zp(($ zf-j2@fK`OxL`sVj2}zKY7l5Rhe$r!x=rFCm79!1un@%MRW+~?ZM<#3lNy_o>97jrK z9GN9}<3I>APpGybLi4tGC~Sp&6_pHA{ri(IQ#r}9Y!;t5iwSBWr!*)_+8|zUS*Cnl ze=YSmV%pkm8<^5(Skq_Z*Zi(Zm|*e_vYK^oLrQeU5PiAIFW0(@d*OzLBWbkU+}aS= zs&b1TE8|TwFr*W7O=E4VCZ&F$_$;kS30fs>-ae0eVHi>bGsL|xT;W1nImrM-3Cs~u zQV;Hyir=U(1<9Z?!Lt1h4DRXRgR<1w2ZC34&2EgrWuXLG$j!{?2fti2i=K_iTB>|c zfc%j*DK4%o`MM}bP8Z*o0$N&9yOOKmV*}@W$RfP9*iObg!<)8TdwcsE5eq=7y$!U& zsv;lIXW>=%A&0sr!z?vKSuU;1*b7Fvt3#8 z&fV!$F>Bnj91&Xm!K>-y;Phm;wxHmq<*)VM(TBAK3vViq9u1{D7i$YgAUtwye`Rd} zRqkZCOwYT+KJ#2#;KsBPUtX)cP&pHRA*Eh0XP33F0K}~94INPCBV=aFxMsK^BII6F5DU zGL%Z70$es;m-x1;s(9m8r$&_@#2YFNSV9EDamPuHtXeb6eS813D)~m@V-J;h$TU)B zO-uIZI|ZodVuA`=f6@@0^Cy`p*L>m-WG(1}V1&?S zo-mYa@pYF46oZds#mXdNjGN^7)J!WuohkTjnmw$AY6uqU+Y?#FmD!fwm#eBXAl+z` zuEsVOCK?|vEK~50~lcHt3w6g#B$H=%;ZivdJ`OaR~ zEz1@DrtK^tVv}$gl6w`9a9;A>B*475;c^34yA3M#y%AOuTtLc}fzi~6ekb&SY*&0{ zfjKOhG!FOgqz&YxL)4P}=9B}%maIN3idXR60C4|~BC?OkbiMP(;N5_D&(YC|xq%i} zx}79C{9U)o=g!bj7T{cFzFzMvuV$;I#qd+pG@Xd*=g}sixch3^lr;Fw1Qt7)jy7*3XGW=~ zU1SZy*%gzMtAyvkg8dm-Wkt=Edwx%xNAwu)ZA8*-lRX1#f7j91S5kCECVG+AmPH$~ zqEe%e5y&T$!e64}n}r_ytASZU0X}PEm`J+WrR~nm0#;izci=a*PLb_|Y)SSOEG1g7 z*g2TfjFb&->ij}6E{8A_?2RRf03S{~)KHfXNobv6QvBGZ90A0NN(W$cC4 zvG{{$zQURqNdhb$4eJp&AV{qpPUX3c6=TSM+c|qsHC8^(`J@~c62;Fq5fib;c$4eKOq33ZZ78q&e?uDo~EXA z8F_yDovWVs_Rxi#)&6OoQb*;V#*O@N=fozxpWesy(s4S802OCrG<0C9B3A>YmZ5-)@#j4yXmgo zj|;;v=D_-T?L@TVTQHN)i=txa{d55A2QvP<+%>aiNurmf(fV$E=9mfzKIc|bhSnB} zW;RjCBMh4$=cGBXVJppHUNe4gldPcYx6^!y%4Y70h)Q2;l$AD7+>P~~Wdvzu1U(Id z9&Mn$PwcGOnjJ&pJ+#%}$|kuxBAedY!-m;>v*lV;K3ST}fUMoTm)O^0o{ZGYvDBU-QBGm_IE?i?x&bno0Gmj2xlJM>=? zg4o6kw7LeO9df3_Wbg|RkKl*|cMMqUkcRYwp|H9^Tnwr?4iYG82rvY{W4s32y!g6PYHT>I;~qs!6apGH#4h zW%znDCP}}CJMA2B<_zBD#B2LpzZwFsoT|r*wo#aOUq4~9ZDLYzb z!uMGA>a)D|Zo2RE4kwNGW;5JLx;tKzk9;0F=L62+RIOX-j&yj`lJ_(|XuM_25^aHPkZr?A8II+r$$g5%%Zl z2Y%UWoKe|08PQO;A8#E!_$)O^V4as;9~|y&1omuqh>RpL|FlE?K8X29l>z%|*kPWIZj*Ut@w?H| zdgr{e^pulym%61hL;wvvGB+(Aj(aC#ttI^KP+7ql_{o?vPTg}pTZ&IEugW^3_NY%+ z67-_zvNw*QibXM)JsWN63s8SILVh^*O5@@Ch38x<3Pd=R`=??GGSqrgufxkFzyl{U zbMoSi#qAeYUo5`pzWB$Br5D#b4Di0cnt;Wi1 zZ$BQrbg>gKaEu&4QEz(s$}@f}lBXzE;L!TdtB{fIkj%dVs+k`=Kc?tW$oS;qPs9*M-TyW%w1{GnDcf5R$%hg`YOXt!5-Uw-k$XJ5R0 z+1ml3wqKmCe73T(tUq7gfAQh&Eq>j+d(ZyeeA!uJ|D29TyM%@8aHuP};5GJpqu!m- z`e(hjk_>xW{M)$!p1(M~x$^nv{Cjiti%xGv1uM5US313cz1#fq3$^{liv7Dvv6bJs z_1S0qCRpRehkIZ0ZuS1R`uCnnC;E~av^O}7-?#YvE`EP)Z|_pVQE2=9ZKwB2KUY@2 z@{T^U-!!%xHSSx%SNwbPvrR_3`qk$gf%b1!S5^Flf#M4Wv-<6d2EFve9Ne*Zl8Y67+-sLxA<~p_3N8hBfX1z28Ayf+?`u@XlnJ_TQ-YZ z8rRJ)skrYIZ_?Dw%`X|~&COc^%*`(W!^rzo@yhCFK=BVR_?$+V5FNku&%dUC&+n+8 z&*_JM0R{ikKRpAG1F!h`O*Qp373qPg@R3)yVSUah?%evy=L~QUy}MgppfP`TANY?| zOtS{9uMLTA(e9mFUsDmVsO0m{1gI}ozQ)B!^$+)L4)<-|Uw}6&H*eY4KBpSvGOr^$W&Kb~`#+S=IO_fgPXU=eJ?U%FUaUA4L@!1GqGE=hhcCqc02qUucY1B)r)uB1brZVx&oN=d5c7qBe!DyHSv1IRSJj( z`_e9Y$He$O9zhq^JCE=G@NEaq0sS1~7a_mPpF?r8-huZJJfqEMV3QAwzMBg5z?lYZ zt{f$l>y=i#HFIPQ?uAJ3|M~y}Q`Z`?G-$o&V`9jY;%6MrOK-7i+}ouQBw)!3oz8 z{i!p#8a5uJ#py_M6T36~;*)~RSIx=gQ0+b)F$fs5W`c+lzq*XBS)OK?S-KeMtLCHz zwosZF(_={#nHG+X3B^cX0mev`cqfNKh+;ysRalvrZ-EHQ-F*LzZN8Nfyjn3I~<$7w+osPXt9nEG= zNK@KZ8Vp0cy+7s;E8XS4-kaPK7WqIdD&;0_uWqd3ZH-ycST!qK8^DGrXSleLC$rcE zmtzo%U19;!y0VfhEaEpOWBz5^fsM9YM`NLn6TIp6pT5JHIQu%fX7*sH_DAnDjadUu zEk89Z6~-WbKBX-sEV!bH*sqHV$_V$f68_qA^p`abm$uub&5MIrPTC|u`ee#pTxUXM z43BIKteM8}D0)T$2Ip)L*RHA1-^otAy2fW$KMi zuU(^v8Qo3=_Ko%TO{#1it4=CNK1Q5e4qr@d-aBBj$tCR#pvM5n3YA7$e`QXsg?Hm~ zj7A9Zr@N@p$xmx78GfL5rsXZqmQ!NI-L#C3?9QS^TEp+O&&_@7gE1uGh1X3h6s6H{ zdTFg@ucG*^rV)B_=Pr{cbEg`u_Qo$7&y*XFpvf8ofTNpkTC4yvH(9wMOzX}Kfp!~4(2rbd(+~=2f(*G0w z1tE71wiU!)*`gpxVxLeU8<~U$Q^~g-0EOp3L*mZR813e)F0#*pmE8j| zm~HDVBSB=+1W(2rrVmo{b2%? z?MZ`w7Q(3%7&;okxx1A9JB;Nw?-?~%awy?@X_S@+nzkF~Ix z8dy!=8~D@rH{tckQ2!{V#K>sP5s{%h1Z=<6gMIG8z|3HO%Y)@tJ=i~j+dhXfTW6{F z&lo)*;k_e?F6RO6Jp0vFKU?qXw*}$YIm;Qg%C?fox~~Z+eL7y`BNoRfx9$9&K_^+N zb*Y{dK*kL>(Dog9wtYLome+?0Tb|hd6vf79h@?k)E0^}Ny zEx%as`u5KwF6;?%P&I{(1ldLk{|?Uo(MYn<`h$_!d3in<>$!+})AfC;!Nt>qBN_kS z3_q+-t>}%+zC@M%h}qzkeU?hV)#>`6E}9&#PvZIH=|F)^-$!cWp)H_jV|x3>DDAQcEq^{vr~qB`YEPkQdplM(DXVxJHzRZlf6@AK_fJX zgoHW7%zQ5oUz<7f*`PN(6{{}h&=d9nI2oqNXM;KB(BWw*+!&r-55wjn-%X- zyl=%{t={U&Ol8IU?2ikEFoNK zmKd*6bM{tcZ0#M^MbC+c&{Jpkltll~+shutt~;YLj4dCAK7~BzA*3G>S1508?SUI{ zz6ZIfW0_*72ymC#(BWRPr^|ZQp&0=e$U<{Wt<@2a$+jais!nO_mbDPYY_nW zZHtRRp;}x@Ju-rkvSeCaz7fgg*y-@N5iS2cFSVYKR6_+l2eC9%m>iK{Pu$JjFvtWy zgBRE$s{Xt)RyL;|NbCbzp3AmZ$zT!|)s4EeFA>y-)=#jzuFQUy^b35_c!KPJc{$ni z1{LmWhMF=G&8H86U)i>ZP*iHaP?jI3$DB~5RR12~9DNU3bzTxJ64^o3nO$cQM;4I~ zG>mTUI6^_yJqwt(Q?CF|&@=nXa9nm0Qk6Dz=l{IYk)9j-!vp14Us#SSq1$tQes=h3 zBJWdzI&P!@hrd#E7~BWO0&J{uX9IIisxIO3Jc-2aSORnUAF1&NytL7Jvt!4lq%*Ly zeF)dC{hK(`kd#O1hy=_tdL%?5%|RHwg3*5d_Bw9ip!&-L3|kh5(#I@uo{FL*Nx6aAtM4js_JLv`TjC2>@O z4B$b?6V1%t#)mT2?G3kpDCOM3XG2pJn-tfNn#k0kyHiC&apwIKWA!O_77#*?M>wB{ z*B74R^<&5yb|(`a+gMN`#Z7l|o}BWTPX%~uKuiraaArWcF=WA+m$^->8*R}3oP*lUh3 zR=EG~6a;H#-kb9&$VY1Y|EC~6{mV4G1&rOWLy0|X3>jl;RzPuuRN6znXFHpNF`1je zpMwLgig%O9puRO8eJFQ<0WP|bmJ{;R3anK&9ao2VSi%>ecdYB9(e@w2bizD`+yoAN zW;?Doo`@@76?0{+Uyt6LdJT?gbqvJ_1)>?Y5;flA(zoxi_kBdRXK+*`Mupz*3wTtCa#cn-FRh?~6#xf!cm(OHS(2WOUCxL0^HZ3dl0XqO zHHAL=&3-`}UkxoanTX?HA&nhT5GzL>Vv1sN!4bA^2D1Fx_DteSeO5uL4TDawL(Rc# zUmz{D2i0B8pr-ol%7k-KVw~77L#ZO5>uCbplh+p)X}A*M&~DQQtj5lcjc#WL4W4C@ z5p<@bcPh%P?>hwYB=O{SGfH8vr!Jj{a|qjoYNiC6!Ko`uN)W(^vHooMT4AxJSVPR5 zRHlSvtq@`ok9Odet5PQqX3O(CX@V7UQ5tAbVb&tMlfhLCEN4A6=`GEx)7^M9>OZzQ z6~Ozm_A$nx%o+<>W==yQ!gkXpmSJxJbAfoktKm>C2tNjerv`~?Dy$>&wyvQKFV2_% zT_d^{K%EDU2L$13r-TqI*lUj@c~@otdvP&SbbY!%I83%zvl2&}AkT+0S}bsI;9Xf+ zt5m#iu_hGU$8+`Eom>`hIn&vqs`s$zr$(6tW_Kd?LnRcBMK`O}0y;(|l*M2&7sofE z6#1ya{GtI@+~JQ3>xl?`xamL3O4!-3Hx|jhra>A-uGrEviH9}FR|_-)c2Ram0zXw`)j4Sxu-}Dhm3nc85{Mf4(%73e&o+RtYQp+zDA<5dO!^6?Z z;%{RVz0=)YI6HQep;RKQi={jJ95XZ|?9H3uaUTiS0@U*n#6nBD=hA_Im7j*~_QKl2 zhR(GY6=9&``*#iwo(;xth8%I$ftUo)2A<9ZYp^SbPEy#Mv&D);0}j}^4FoEv0S8k@ z4TvrQn`k|oGn%pG0$yvRTL5)#H`O==L+hma7-m1=-0KX5Xdow;WAy~1mx;(YUbH@} zaD0Zi{4b3;iE^UexEmqQLJDJh1{z3A9kqz3T$>wEPLC8VtE?)m;s0+b<96&8(_vrA zED#(UVq1((aw(vc$xv|RN^^iFqfb8<{9GG&uLanX`9kgLrkf2QK;ywb_M!uP{hZ$~GsH$_$;`uJdkHQnQd z)(#*T2gO2y7IHjVtED(z9{PZ4u3{fW`67*_ZF?}H#dW^HvkP@qLbc1wF>0JgX|E3u zo5Of<6NhH#vkk5gUeXBVw@ z+B@BkG?8!@_ekD-sKY#_FPn#UUR94lH!0%C&2EVBzQ@YMw?KNVW%(eRb>Wvasfs zqI1XdBFD;674w)DTjI5A(}oSC%EPQz4Qry}*sb6Z$5)yS2R?@wUm)7lMi@e(bd4e4 z^O6#{Juxj{K^sY3yhMX)zR~D5Cn#kmSaSUR+BKXnip`J_WXkp?)-9x5TI8rq?k(iaiQ=oz2MJ<} zci1%L`>kRidp<-kEML0C22;&o!J$=JBF7$snBU6Q{^)paBMC6x4C9fFn@MI$%+AYG z)|jJ;kf^SXlp{|5~tF$$Dw)b^TH-l+rvb}|B6Zu2I*`6#{3BhZ#VLgSkPw&m4 z>CP4A5_GE1Bk2A`P0edKq`um;5aXq8H+Q-NKr*6>9&UYfV2B^{c+G#?`X}ZA`MXSm zS*RB)%>*i)>Aw7fg_qXM+34o#t$L3kC8Ug?96Bl+S{N0iP`M;Ts-E9_bZ>L3)1^46 zAI8qz&zD1UT32QNl1jjt-c~U>%vWt)EZEr82QS10v>v1u#d~col)I$iktH z*ahc9fZU!c0ycgSFWK#SnC$uMG3VuayC)y|2l#T#W+8_TDUcFkGVM7%6+4v73*6GD zE9+F%=O1Ddl5i&N843V*2NA^WBdGrNk!FJT9)-Q`IPQF*$)H5#AY zV{LHdqrV_3a4z$lfc`|ghNDF(cMz?U(e{|63`w@Jr_`wJMwCCVvwj{*3(oO;QgUP; zD3%G#kM|0;svgs3N}Yp!L)dc>iz+p9449Zki7VTvzKSvOK1?c?WihkdIwle?D$DHCNtxRSlU@p*Gvn(wkXkB{9V3K`JGa4TV z3HDDH#|IeHUV|Jz62@aE>vv9jR`3kZycKX_)CzvVTR60m_mpUdJy$r@)QWzdKrT4W zZ4W;TIAnM-@vjHHSGfM4Dhs0d&aLzzx0BeNAi3Ljr%{soJxV2|<5v_-$O(UFjr@wi z5j*}7^5|33seLG;T{}}l+(9+IUnV{06Hg~cERB8te9$Pn%P_6{$J0jnqcrWer(DN$ z0&96fdg<4sXSdqN)1KmZ7l~^8m7hw;E=f|6n?9a@PI|8yrq%e@fUvwh?`C*F)Gn8I z>dRjU{7wsScFKACz0vE@@c1b!8~{Gv70rS z@fmNWVvjHL@%=!dCz5Z>Yjn_4aD{buc*^f^kXgZamkmNVn?3wMATZWSfB11~*OO{e zKaVk`9gi$=N^AWe40`WI!}qedSrhLD=1_IO+&c{{{h1Iu!r3^z&ktXCQUUPWL+N_I z@YAB{dT$1V-GOqQ-oq);xnsVdA{Actek6&o4UcB{$y#ytbC-ycChExSw@%g_9~6g7 zC(2GJfO002>UsX1-h;vV!zr?aote%wB#!mRULBcRKoNM`CmhjU?kou~{_EH2OBg2H zt#>wnnaF>jitLH)Hv@Ryf6;Pka$e&{r|IGyZ7B|%@~jnQZv4u7oQda(+Kn85mVg4P{{i-#eu)QT~Ym{dR2m z12Wt;bU;cfo1|x*lI%9m*ID3xk?F6F?Q{6o2sK<5pv1vka+EkugGHi);bz;xFIbHx z@39OR?}sx|bMl^@`|V_x;EM4{Vjw4Qqm#^Seg;b}F1-E3(?(TT!@H@CNraX*eT3J; zJ%>orI+IPA= zl>AH-pNTKmb5L4&f&HdxR`u7e0BzVhK6%j7exwt%k?aOV#hORd%AqqhK%|7(aaGbK zjDJ7}$eFrnb%S==N)(m*YQ9$4OkdC!D;uQAkid;~sx~Ihg`6^DoCjCn@017z^bqD6 z`C??-0>E$1oDnJR8FJg#UypFs&&y!!rGXOQ3{W#$s6@e7umDvBTb)*dq6X-YpZpo+ zC9M{5_j*WceBFeKYu7&BqE#pj+G9hq`|H?KNuSjaBorg!2}LU0q0o>DeX-SnW1Upp zN;Z>>O%@j)=TuGhhc0eQ3Bmx?ruloOj-3ZpL@PK%_~)RM3=vWfg`l9CBdGmoA*fj{ z5znNZrPwY*P_TIxLFM$|i#94!?1*M@4nI%U&&Lquey5WDNZv5EkWfjsN0L|ii6x+* z9_{yruU{iF^$+*K6;EE*mq+Z7o3uhe>%6S=kq0eyaGg8kaRtLcyVzuH9CxPqtX}Wk zBz}*^y=PH=Jb_>p2J`O;dWNV13}QTZH^SRJIlfLP>hT>;)0`0EGAKmrim{Mu*C0Nx zjye7?#hiY8JUAm0qx}^x@fY2V{8O%g`anxoL0ECCyhK`$B_5C)6{B{U&f_n1y8Ssr zDim=?Ntqo9uH5*a#l?*)yIg<>Uu0;Xi5%6v1>`1 z(&DcOqSvlLWl-cbD#?#a7!u^Rli$gQ{z!uPO1FChWe?3>6`_o?^|m0Fs)iv1-9JrI zU*V$S(TC6Lz_4>qV7)`DHnBdoQjuI-H7-vdj+C4slpJgayw?c(hojyH{c}du%A$GZ zd^?!2Ew-&_hNrCoOscGk12ADc&d~kq99RJxe1VqXq2K7d+#;xu3cG%HL)7!3FGJG2 zqH|j>#i09v^|k4IEv4!}zJrmXF z;+;&1NUWMhGV>Gn#=9X4i*UoFD#?Ird1UaAiGiWv`-iBhc}l9UnHDQpytSlOU_mF- zlejsG$|3x5U^Z$HS_G8F6@kR0WOea;9^2v0!`h?>oW(?&336gpTUzJXd zc%D%gm6a8d}1ysY% z=b75Uh855#C}NYF2M z)`1qvpB4Le>A!CgXMK6UEGXqLWhsI@03PR|x zv*W7(0VeJA5k4zObl04PU%R&L&?N6a{)gsr^HKMk6`~Hb!=bi}f+CFq2@&DVv(QVW z8FQlCodpP3Q(cKWdS};=l^3x|1jQpZ%L&!Nw$z9YE0r&+VbIh2(ZK;JPzZ_Y($_Mn z2t@Q7FMMs3yKU)!)WCNtYPycGfWB=?h*b8mJE!L2ZgMYF}KG0$Y|(wJFgKigt0~c&GUn zT-*!Xu4l{a-6st z;fGA%V=}Oqw(JXUfVL(Q>T)vti@BQYYuoGH{(2fjfFacfHA08wR~;on!jhQ*qJkW= zRi?f3Y))e#{mvFCnMl9rOFgEU+a%bDgBP#BbFDh_;r&Ar^;a_NSxtU~p%6b)WrGn* zh?Y7^acE+ar0BP)_TZFIVKN3zC8>tS6!trbIS9=4h|N_3&PnW-uL8^B595Mo6oY4y zX%0D(y6=}-AhC-nlc`R}T&_&PWc>KSF_CND?L&3gqITbgP)^bfq6ex(?~Ys^+BRpM zji1MTy5oFrF8Oub#|*b+^DsaI?yw`uBeKNE+r_wWmIvm^K@^F%t|sb>9;Z^5ZF99PKBs5j&1E|AR5#a0+`2G@wn*Wt0ZE4(2G^ z5k8gu@k^cWXD{qBzTvSiFGb6=f=E;CxSble3Sv2uC2T@;p~t``VHyQV$S1X?g}^&Z zmrY?Nx#n1uIB7o#+xap_wm9=*h#5&knQw-n!k&6p_~+sRS#GvAgMmCZUf2lW0c;_W ztRDth%alW5o_^`ZNz}`;tX}Rk)Jq>(Y!dRHCe8EV>w6!t%}>!lTPE*@4!YA2dbD|q z4!Y_(=&Sv8Ba&ftcHuo9LVAxU6W{%JMI!EL8MU;=*?sjs1bH~qiUGR4;X9IAK1JXm z92wIMN>31QWNdV*;piVg4P^twManiUtCUnY^W23i*AjvrIf$Z1e|QEZ46>A|p$HQI z;8VBbizbO|nJZ!{`omKahooTf_~z*J4nf-oIy|fsvydT52YUm~Exa3w_V8#*dLm=c z7>c;;K*F7f3l@huh(?w1BiC_U@cceXSjV`S2ve?yEBzI+qDg^J# zOT4dcS9ANnG+c{FlaNMZY#i1mu745s|>` zzaEisJ`D&O3^FW}6-EQHVlc3b$B0uot{2A5VihF_15Cem?bUv__ijv17XXI2mW^Ja zThAA?iGs`&EPOY1EadMQ8_AJoYn(*38PVl*+*>5C5)5Q(y!`-na?ELo6~xDm3J%~X zFuz<-l!f(0mSqlUkutyG>VPgXTkI^|!CiIqp|{Xk+Ol6=8aH)8??28}l5>XAZo@pz1lE`WwmeYLYBw5D#7QYS0 zu86hXy7&~-yfr_f40=ISRkdyP7p-u0`Vu2vQ$T6TnME#0ChT~hjNfTDNSX;Fchu;? zd}fdUL)Lk)5Dn~85^mxx^Cr+si=;rPdNKN#$-Dfg(KH)3VPnp8TnL#NXqk;w`0pp< zpXEsu+FZuYY3+}Vy*L~`1@Dmb1=vd*GR7#ua2#6W|@E=Jc_$6EQn@0ILc6|@o z2nR3X*ZcjRL`jPRQd2)6x+&oaTwceZiwXY2r?#l>9~ls~7P3f^VQp{5H9p#tM)}L; z0=3zhP-@OKlH$t^zF>5z0Zy+9!@f@mj+3=L`y* zC3eNbNfiGRF(y^Vzcy?mb;tJY1z&xnv*)R^1fhj{4LiSEl_kh)Ka(%&S7$=nK~WMJ zq>{ei=>15Z1gtCmv<18x#`pIPNa0LyBW>4xBtC@LC~B#2;E4>_;>t;xi2*VkZ$h#q z2;USBwW-;^E(x0~8auj{jkT{=w2#f2kGgYiq#)!oD1fY~rq7#93cr@cfbnm8bE zzzGCUBI!8|%Y3()3yS5lD0F6tnGcv%qPl2C4XxwR1|zR3n8{9MRW0080&CsacLuN0 zT0Gayc~PsqR48J#E+M&KRe}n@EH8j&l3vYjeQ|;Qa(xeDd>je)^li2%OEJP~>3Bqn?Mg8Hz9s-oBY&^+x8#ngEbYa=BX>yyO$;mg$<68$llz4}+|5w; zYxd!?9TDy_V+7bd5qoCa1?==eYT7)k6OZk-h(_lv90d)9qg`!ab~%$@k44&&7Vcr z{4Vruv-T`x)4kAYu)#7o2Vi@5`*|Q}LXoI|RM_Lv0Wmg7I2WjA+ZMmpED_AXKK*DxLkWh zbne?VtBBvERk3u_sQ5#w*cd2{V~(mD{H3m!XVIt^M=7FXwHIS_86VLKqKs#W*%-jw zxaqpI<37kpEpQ)S(2Q>>U;+PjSo}DpCkt!yKg-Yyd3X$p{-ayZ;MZ3DrH|K7Gs!8M zLCmz_7mhP`oMDR!tP>`gU@eScaatH7ibvel!iqR_epk#!IieEW0io*J=~b~Gy^{TC za4d6Q!*(>XI%{@7;O80LjeZq?F zSk1vfX%HJag?W_R(|Si)0Bqvn?!&51L9Vib30*$6;u5`&+bFw4@0&}M3tHq7l?RT2 ztgpYBY>apN97@1eYkL%zYqAevP^Ks;==jw(j>lN~&Ep1vg(yFOaz7aLADA$p+1>L9 z;D{p0-$sj~LqH0d1VTDqH%49RWcpxsc*w_jF2M@ii*b;}lrs$;980+4D^e#Byu*!1 z=@^TjBf@SEcbgGB%niu&v5=?f?{iphtQ$7WYlHr)tXkXrsr zHT;)*;CUh9sqghyuZ@@*X;lMGW2t68^xl5hbr}G=X%cf?NV_=(tIT!2p|NA1j<=7A zSB^Pa1nHacoCs2kzQ+F^!_a=v`HRA@d8OC}S@nD0@!F1O%)EwZ^zpH*y%}$BjbAQd z58wW7^zt8%vE(IV@|$tl#=BYP{O`9h+a+&3Hfej8v2`g*?rz9DPddT#bF$V>wP7h7 z9B>F|xOWHL;Auh(ZUPDacWlzL0d!6~*Ex%}>%N5BjR%ANgTahE^0vq$e83aihmgN+ zpW`96sXz4vmZ%gf#+Ql{>#p4sr&ZDe8X^``i@bxNAUem^=WScMcqxN+g9tC;pk@dLZUhSHXxl9_NbWs;A%#^U-IIn;%3hIgZHRy; zB9%;&E=wqi!y+bNm5m)G=l=Db>D$p!IYNk72*Sv5eFqQpN9~!0R3}yiyaN$4-No;K z(BOFY8pPAZq)nvb+k~@V8&7F{f`DvDMQ)LBvl^ zkH=&jPr^05Jq&EvfL5^974kl;kXNC%6^|94Ovnp!ZNj4uQqG+>Oi^1D?cdII;Q$5- z?wZN$Ma(FdhQkK;tg=0Gzk__hilA3QUIN|4DpsI{-@x^J`|`j^VxzHmA*u9+!)*{~ zCJMR6=_UfhFF?y_Fp=RFoqcCySQPj%p+6?jLUCRAv>RC1<4rK(VoW$>5y~wvRf2?E z^95>{v#(k&TjLD`RAf(nAkzLkUYi(Izm2~Y;tn;U9*cgJ#kQ?VDn)-(7AikyE%P?l z&e-W_uH|?)e)-M%icC?kI2}!qDDh~hdl@67RO9bdXF+pQR z(ktbbNXGq~%=tbY`qib%o7x`nT^b0?zUx;D^Kr=p&G<>W*D<|;b2@+M`W~_c-&X$M zCHU(dJ(h9|ruP)YOs zR}SIP_L=7d5FsR;;kf^##O+kUIWCeAxa006qosYKtSjsKojC>xsC1&2%z`I0Ek(w_ z274xVLBl0?F=9u1DMFP&$i*h!+U8Jj+J_{S@nuM5`D4A0lT*Akfh>Khc0W|s;cqjM9R0o*s{b@$e$`Jo*%SvamvU6QgL89=B>Xe8mVpRBSLV z5>}Z1=1DS+!hnJ(G}Q}b6Acep2iU@@qFPN7@Bm5_UuUJ<93aVv2UHsb2HA08Q$U7T z2XQEV5h{bNvN8gdff4^`=4_{aCkUkPE; zhI+JLZIT~_E|PPw%o!yDJ6ueX{X?;#KUZ=(b`Qzv%d3z$VFwwT$jq-zRgwzp=D`_# zr^z)q35yvJlNi`jS+TgPV=ZVIF9sI02I7DYgs*jpTkExBRbxDCVo>HxqNF0X%yfcv zqil+|pV}0&GMlE({&X7Cmc+Q*nL8gC3}ZYS%t#xoC&F{uqWh!m9k3H9?+D7i>jJY) z($&r&T9sFs#zNC9i^&J=23fUcFh11SK;=4Cp|x2Jk)s+`Dr6}Q;!~B*xRjjT)~;pI zsDRgm<&2LGp#O}K3Z|@w0@(%+-`05e_){xna`eoQwC$VPIaS(ZEotldRftueR^6$c zmm_xJ57~j;oC%6BC=GqT``GB-O$dhm)c19+5$b=frar8-*N*&Oi%Z!?9BqB}#L>70J

    4^=g`Sff(E@L(RCtwPq+2STBdj%82Kz6K16l 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 ==iNqSOZ?wRQ<+?o@cctb!))0 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 delta 108389 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 diff --git a/netbox/project-static/netbox-graphiql/package.json b/netbox/project-static/netbox-graphiql/package.json index 27257e34c..c5b2f3077 100644 --- a/netbox/project-static/netbox-graphiql/package.json +++ b/netbox/project-static/netbox-graphiql/package.json @@ -1,13 +1,13 @@ { "name": "netbox-graphiql", - "version": "4.1.0", + "version": "4.2.0", "description": "NetBox GraphiQL Custom Front End", "main": "dist/graphiql.js", "license": "Apache-2.0", "private": true, "dependencies": { - "@graphiql/plugin-explorer": "3.2.2", - "graphiql": "3.7.1", + "@graphiql/plugin-explorer": "3.2.3", + "graphiql": "3.7.2", "graphql": "16.9.0", "js-cookie": "3.0.5", "react": "18.3.1", diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 0750f397b..bbc9c6ff7 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -27,11 +27,11 @@ "bootstrap": "5.3.3", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "10.3.1", + "gridstack": "11.1.1", "htmx.org": "1.9.12", "query-string": "9.1.1", - "sass": "1.80.5", - "tom-select": "2.3.1", + "sass": "1.81.0", + "tom-select": "2.4.1", "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" }, diff --git a/netbox/project-static/src/select/classes/dynamicTomSelect.ts b/netbox/project-static/src/select/classes/dynamicTomSelect.ts index 72c9fe518..8e44ce6a7 100644 --- a/netbox/project-static/src/select/classes/dynamicTomSelect.ts +++ b/netbox/project-static/src/select/classes/dynamicTomSelect.ts @@ -1,18 +1,17 @@ -import { RecursivePartial, TomInput, TomOption, TomSettings } from 'tom-select/dist/types/types'; -import { addClasses } from 'tom-select/src/vanilla' +import { RecursivePartial, TomOption, TomSettings } from 'tom-select/dist/types/types'; +import { TomInput } from 'tom-select/dist/cjs/types/core'; +import { addClasses } from 'tom-select/src/vanilla.ts'; import queryString from 'query-string'; import TomSelect from 'tom-select'; import type { Stringifiable } from 'query-string'; import { DynamicParamsMap } from './dynamicParamsMap'; // Transitional -import { QueryFilter, PathFilter } from '../types' +import { QueryFilter, PathFilter } from '../types'; import { getElement, replaceAll } from '../../util'; - // Extends TomSelect to provide enhanced fetching of options via the REST API export class DynamicTomSelect extends TomSelect { - public readonly nullOption: Nullable = null; // Transitional code from APISelect @@ -25,7 +24,7 @@ export class DynamicTomSelect extends TomSelect { * Overrides */ - constructor( input_arg: string|TomInput, user_settings: RecursivePartial ) { + constructor(input_arg: string | TomInput, user_settings: RecursivePartial) { super(input_arg, user_settings); // Glean the REST API endpoint URL from the element @@ -34,7 +33,8 @@ export class DynamicTomSelect extends TomSelect { // Override any field names set as widget attributes this.valueField = this.input.getAttribute('ts-value-field') || this.settings.valueField; this.labelField = this.input.getAttribute('ts-label-field') || this.settings.labelField; - this.disabledField = this.input.getAttribute('ts-disabled-field') || this.settings.disabledField; + this.disabledField = + this.input.getAttribute('ts-disabled-field') || this.settings.disabledField; this.descriptionField = this.input.getAttribute('ts-description-field') || 'description'; this.depthField = this.input.getAttribute('ts-depth-field') || '_depth'; this.parentField = this.input.getAttribute('ts-parent-field') || null; @@ -43,9 +43,9 @@ export class DynamicTomSelect extends TomSelect { // Set the null option (if any) const nullOption = this.input.getAttribute('data-null-option'); if (nullOption) { - let valueField = this.settings.valueField; - let labelField = this.settings.labelField; - this.nullOption = {} + const valueField = this.settings.valueField; + const labelField = this.settings.labelField; + this.nullOption = {}; this.nullOption[valueField] = 'null'; this.nullOption[labelField] = nullOption; } @@ -98,8 +98,8 @@ export class DynamicTomSelect extends TomSelect { .then(response => response.json()) .then(apiData => { const results: Dict[] = apiData.results; - let options: Dict[] = [] - for (let result of results) { + const options: Dict[] = []; + for (const result of results) { const option = self.getOptionFromData(result); options.push(option); } @@ -108,10 +108,10 @@ export class DynamicTomSelect extends TomSelect { // Pass the options to the callback function .then(options => { self.loadCallback(options, []); - }).catch(()=>{ + }) + .catch(() => { self.loadCallback([], []); }); - } /** @@ -155,14 +155,14 @@ export class DynamicTomSelect extends TomSelect { // Compile TomOption data from an API result getOptionFromData(data: Dict) { - let option: Dict = { + const option: Dict = { id: data[this.valueField], display: data[this.labelField], depth: data[this.depthField] || null, description: data[this.descriptionField] || null, }; if (data[this.parentField]) { - let parent: Dict = data[this.parentField] as Dict; + const parent: Dict = data[this.parentField] as Dict; option['parent'] = parent[this.labelField]; } if (data[this.countField]) { @@ -171,7 +171,7 @@ export class DynamicTomSelect extends TomSelect { if (data[this.disabledField]) { option['disabled'] = data[this.disabledField]; } - return option + return option; } /** @@ -218,7 +218,6 @@ export class DynamicTomSelect extends TomSelect { } } - // Parse the `data-url` attribute to add any variables to `pathValues` as keys with empty // values. As those keys' corresponding form fields' values change, `pathValues` will be // updated to reflect the new value. @@ -297,7 +296,8 @@ export class DynamicTomSelect extends TomSelect { // value. For example, if the dependency is the `rack` field, and the `rack` field's value // is `1`, this element's URL would change from `/dcim/racks/{{rack}}/` to `/dcim/racks/1/`. const hasReplacement = - this.api_url.includes(`{{`) && Boolean(this.api_url.match(new RegExp(`({{(${id})}})`, 'g'))); + this.api_url.includes(`{{`) && + Boolean(this.api_url.match(new RegExp(`({{(${id})}})`, 'g'))); if (hasReplacement) { if (element.value) { @@ -349,5 +349,4 @@ export class DynamicTomSelect extends TomSelect { // Load new data. this.load(this.lastValue); } - } diff --git a/netbox/project-static/tsconfig.json b/netbox/project-static/tsconfig.json index 4adcca950..754a15a5b 100644 --- a/netbox/project-static/tsconfig.json +++ b/netbox/project-static/tsconfig.json @@ -1,10 +1,10 @@ { "compilerOptions": { "forceConsistentCasingInFileNames": true, + // Needed for tom-select/src/vanilla.ts + "allowImportingTsExtensions": true, "allowSyntheticDefaultImports": true, "moduleResolution": "node", - // tom-select v2.3.1 raises several TS6133 errors with noUnusedParameters - "noUnusedParameters": false, "esModuleInterop": true, "isolatedModules": true, "noUnusedLocals": true, diff --git a/netbox/project-static/yarn.lock b/netbox/project-static/yarn.lock index 44c9d994d..a57d6dc9b 100644 --- a/netbox/project-static/yarn.lock +++ b/netbox/project-static/yarn.lock @@ -200,17 +200,17 @@ resolved "https://registry.yarnpkg.com/@floating-ui/utils/-/utils-0.2.2.tgz#d8bae93ac8b815b2bd7a98078cf91e2724ef11e5" integrity sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw== -"@graphiql/plugin-explorer@3.2.2": - version "3.2.2" - resolved "https://registry.yarnpkg.com/@graphiql/plugin-explorer/-/plugin-explorer-3.2.2.tgz#973d6015b6db15041902e95c3e4b746473313eb6" - integrity sha512-zeBZJUAX9h+3nXw3GLHZoxi6wwYqDBU2L/xeSXSTagJhcLNW1Hwb/t/wb296hQ1x/9nyGySsTA0DQiiWV3rCBQ== +"@graphiql/plugin-explorer@3.2.3": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@graphiql/plugin-explorer/-/plugin-explorer-3.2.3.tgz#03854d7e62d6e24c6552ae6706e3945b9324fa23" + integrity sha512-yh5WXRqDPuKjVyNxUwXYjx8tImvVOx+2FGanLyjoAJP2LKQu6eDtButyJ8sExk1qW4+HCSrXxJNSPs4W7cYT3g== dependencies: graphiql-explorer "^0.9.0" -"@graphiql/react@^0.26.2": - version "0.26.2" - resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.26.2.tgz#3a1a01a569b624de8141c53eed24a7db9a523668" - integrity sha512-aO4GWf/kJmqrjO+PORT/NPxwGvPGlg+mwye1v8xAlf8Q9j7P0hVtVBawYaSLUCCfJ/QnH7JAP+0VRamyooZZCw== +"@graphiql/react@^0.27.0": + version "0.27.0" + resolved "https://registry.yarnpkg.com/@graphiql/react/-/react-0.27.0.tgz#4475a0f4ddf25d8ebc1bfc538fb21f5f1d435916" + integrity sha512-K9ZKWd+ewodbS/1kewedmITeeKLUQswMOXwIv8XFLPt3Ondodji0vr1XXXsttlyl+V2QG/9tYVV2RJ9Ch5LdrA== dependencies: "@graphiql/toolkit" "^0.11.0" "@headlessui/react" "^1.7.15" @@ -353,17 +353,17 @@ resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== -"@orchidjs/sifter@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@orchidjs/sifter/-/sifter-1.0.3.tgz#43f42519472282eb632d0a1589184f044d64129b" - integrity sha512-zCZbwKegHytfsPm8Amcfh7v/4vHqTAaOu6xFswBYcn8nznBOuseu6COB2ON7ez0tFV0mKL0nRNnCiZZA+lU9/g== +"@orchidjs/sifter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@orchidjs/sifter/-/sifter-1.1.0.tgz#b36154ad0cda4898305d1ac44f318b41048a0438" + integrity sha512-mYwHCfr736cIWWdhhSZvDbf90AKt2xyrJspKFC3qyIJG1LtrJeJunYEqCGG4Aq2ijENbc4WkOjszcvNaIAS/pQ== dependencies: - "@orchidjs/unicode-variants" "^1.0.4" + "@orchidjs/unicode-variants" "^1.1.2" -"@orchidjs/unicode-variants@^1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@orchidjs/unicode-variants/-/unicode-variants-1.0.4.tgz#6d2f812e3b19545bba2d81caffff1204de9a6a58" - integrity sha512-NvVBRnZNE+dugiXERFsET1JlKZfM5lJDEpSMilKW4bToYJ7pxf0Zne78xyXB2ny2c2aHfJ6WLnz1AaTNHAmQeQ== +"@orchidjs/unicode-variants@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@orchidjs/unicode-variants/-/unicode-variants-1.1.2.tgz#1fd71791a67fdd1591ebe0dcaadd3964537a824e" + integrity sha512-5DobW1CHgnBROOEpFlEXytED5OosEWESFvg/VYmH0143oXcijYTprRYJTs+55HzGM4IqxiLFSuqEzu9mPNwVsA== "@parcel/watcher-android-arm64@2.4.1": version "2.4.1" @@ -1883,12 +1883,12 @@ graphiql-explorer@^0.9.0: resolved "https://registry.yarnpkg.com/graphiql-explorer/-/graphiql-explorer-0.9.0.tgz#25f6b990bfc3e04e88c0cf419e28d12abe2c4fbe" integrity sha512-fZC/wsuatqiQDO2otchxriFO0LaWIo/ovF/CQJ1yOudmY0P7pzDiP+l9CEHUiWbizk3e99x6DQG4XG1VxA+d6A== -graphiql@3.7.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-3.7.1.tgz#9fb727e15db443b22823389d13dc5d98c3ce0ff9" - integrity sha512-kmummedOrFYs0BI5evrVY0AerOYlaMt/Sc/e+Sta1x8X6vEMYWNeUUz/kKF2NQT5BcsR3FnNdFt1Gk2QMgueGQ== +graphiql@3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/graphiql/-/graphiql-3.7.2.tgz#6a754256f4f2e6268a64e585b0fe35bf38f1b87d" + integrity sha512-DL+KrX+aQdyzl+KwcqjlmdYdjyKegm7FcZJKkIQ1e56xn6Eoe8lw5F4t65gFex/45fHzv8e8CpaIcljxfJhO7A== dependencies: - "@graphiql/react" "^0.26.2" + "@graphiql/react" "^0.27.0" graphql-language-service@5.3.0, graphql-language-service@^5.3.0: version "5.3.0" @@ -1904,10 +1904,10 @@ graphql@16.9.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.9.0.tgz#1c310e63f16a49ce1fbb230bd0a000e99f6f115f" integrity sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw== -gridstack@10.3.1: - version "10.3.1" - resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-10.3.1.tgz#4ed704279c40094fc1b9e3318f20b573f2fe9f40" - integrity sha512-Ra82k/88gdeiu3ZP40COS4bI4sGhNQlZAaAQ6szfPfr68zVpsXxiyLKr5zYcTpKX4jjcwyNsNNdcV1tDJc71fA== +gridstack@11.1.2: + version "11.1.2" + resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-11.1.2.tgz#e72091e2883f7b37cbd150c218d38eebc9fc4f18" + integrity sha512-6wJ5RffnFchF63/Yhs6tcZcWxRG1EgCnxgejbQsAjQ6Qj8QqKjew73jPq5c1yCAiyEAsXxI2tOJ8lZABOAZxoQ== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" @@ -1970,6 +1970,11 @@ immutable@^4.0.0: resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== +immutable@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-5.0.3.tgz#aa037e2313ea7b5d400cd9298fa14e404c933db1" + integrity sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw== + import-fresh@^3.2.1: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" @@ -2656,15 +2661,16 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -sass@1.80.5: - version "1.80.5" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.80.5.tgz#0ba965223d44df22497f2966b498cf5c453fae8f" - integrity sha512-TQd2aoQl/+zsxRMEDSxVdpPIqeq9UFc6pr7PzkugiTx3VYCFPUaa3P4RrBQsqok4PO200Vkz0vXQBNlg7W907g== +sass@1.82.0: + version "1.82.0" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.82.0.tgz#30da277af3d0fa6042e9ceabd0d984ed6d07df70" + integrity sha512-j4GMCTa8elGyN9A7x7bEglx0VgSpNUG4W4wNedQ33wSMdnkqQCT8HTwOaVSV4e6yQovcu/3Oc4coJP/l0xhL2Q== dependencies: - "@parcel/watcher" "^2.4.1" chokidar "^4.0.0" - immutable "^4.0.0" + immutable "^5.0.2" source-map-js ">=0.6.2 <2.0.0" + optionalDependencies: + "@parcel/watcher" "^2.4.1" sass@^1.71.1: version "1.77.8" @@ -2864,13 +2870,13 @@ toggle-selection@^1.0.6: resolved "https://registry.yarnpkg.com/toggle-selection/-/toggle-selection-1.0.6.tgz#6e45b1263f2017fa0acc7d89d78b15b8bf77da32" integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== -tom-select@2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.3.1.tgz#df338d9082874cd0bceb3bee87ed0184447c47f1" - integrity sha512-QS4vnOcB6StNGqX4sGboGXL2fkhBF2gIBB+8Hwv30FZXYPn0CyYO8kkdATRvwfCTThxiR4WcXwKJZ3cOmtI9eg== +tom-select@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.4.1.tgz#6a0b6df8af3df7b09b22dd965eb75ce4d1c547bc" + integrity sha512-adI8H8+wk8RRzHYLQ3bXSk2Q+FAq/kzAATrcWlJ2fbIrEzb0VkwaXzKHTAlBwSJrhqbPJvhV/0eypFkED/nAug== dependencies: - "@orchidjs/sifter" "^1.0.3" - "@orchidjs/unicode-variants" "^1.0.4" + "@orchidjs/sifter" "^1.1.0" + "@orchidjs/unicode-variants" "^1.1.2" ts-api-utils@^1.3.0: version "1.3.0" diff --git a/netbox/release.yaml b/netbox/release.yaml index fadb01274..f93458475 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.1.7" +version: "4.1.8" edition: "Community" -published: "2024-11-21" +published: "2024-12-12" diff --git a/netbox/translations/cs/LC_MESSAGES/django.mo b/netbox/translations/cs/LC_MESSAGES/django.mo index 2fb886a1ab78217ee732b25af5d87747e9585f23..d5a4db33b04995480ff2dc5c859441221e56be14 100644 GIT binary patch delta 65979 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 KDs%8QmHr3YD1t@+ delta 66320 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 MZOO8QX= 2 && n <= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Klíč" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Zapisování povoleno" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Vytvořeno" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Platnost vyprší" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Naposledy použitý" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "Povolené IP adresy" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Přihlášen jako {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Odhlásili jste se." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Vaše preference byly aktualizovány." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "Uživatelské pověření ověřené LDAP nelze v NetBoxu změnit." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Vaše heslo bylo úspěšně změněno." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Plánované" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Zajišťování" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Aktivní" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Vypnuto" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Zrušení přidělování" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Vyřazeno z provozu" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Primární" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Sekundární" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Terciární" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Neaktivní" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Region (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Region (zkratka)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Skupina stránek (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Skupina stránek (slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Stránky" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Místo (slug)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Poskytovatel (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Poskytovatel (slug)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Účet poskytovatele (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Účet poskytovatele (účet)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Síť poskytovatele (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Typ okruhu (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Typ okruhu (URL zkratka)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Stránky (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Zakončení A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Vyhledávání" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Okruh" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Síť poskytovatele (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Obvod (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Obvod (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Skupina obvodů (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Skupina okruhů (slug)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Popis" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Poskytovatel" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "ID služby" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Barva" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Typ" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Účet poskytovatele" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Stav" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Nájemce" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Datum instalace" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Datum ukončení" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Rychlost odevzdání (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Parametry služby" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Nájem" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Síť poskytovatele" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Rychlost portu (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Odchozí rychlost (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Označit jako zapojené" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Zakončení okruhu" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Podrobnosti o zakončení" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Priorita" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Přiřazený poskytovatel" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Přiřazený účet poskytovatele" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Typ okruhu" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Provozní stav" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Přidělený nájemce" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Zakončení" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Síť poskytovatele" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Lokace" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Kontakty" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Region" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Skupina stránek" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Atributy" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Účet" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Strana termínu" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Přiřazení" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Skupina" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Skupina okruhů" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "barva" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "typ obvodu" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "typy obvodů" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ID obvodu" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Jedinečné ID obvodu" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "stav" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "nainstalován" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "ukončí" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "rychlost odevzdání (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Závazná sazba" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "okruh" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "okruhy" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "skupina obvodů" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "skupiny obvodů" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "přednost" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Přiřazení skupiny obvodů" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Přiřazení skupin obvodů" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "zakončení" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "rychlost portu (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Rychlost fyzického obvodu" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "rychlost proti proudu (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Rychlost proti proudu, pokud se liší od rychlosti portu" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ID křížového připojení" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID místního křížového připojení" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "propojovací panel/port(y)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "ID propojovacího panelu a číslo portu/ů" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "popis" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "zakončení okruhu" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "zakončení okruhů" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Zakončení okruhu se musí připojit buď k místu, nebo k síti poskytovatele." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Zakončení okruhu se nemůže připojit jak k síti webu, tak k síti " "poskytovatele." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "jméno" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Celé jméno poskytovatele" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "slug" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "poskytovatel" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "poskytovatelů" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "ID účtu" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "účet poskytovatele" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "účty poskytovatele" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "ID služby" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "síť poskytovatelů" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "sítě poskytovatelů" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Jméno" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Okruhy" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "ID okruhu" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Strana A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Strana Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Míra odevzdání" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Komentář" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Úkoly" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Účty" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Počet účtů" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Počet ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Pro obvod nebyla definována žádná zakončení {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Vyměněné zakončení pro obvod {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Tento uživatel nemá oprávnění synchronizovat tento zdroj dat." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Nový" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "Ve frontě" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Synchronizace" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Dokončeno" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Neuspěl" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Skripty" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Zprávy" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Čeká" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Naplánováno" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Běh" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Chyba" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "aktualizováno" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Vymazáno" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Dokončeno" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Zahájeno" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Odloženo" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Zastaveno" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Zrušeno" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Místní" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Uživatelské jméno" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Používá se pouze pro klonování pomocí HTTP (S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Heslo" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Větev" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Načítání vzdálených dat se nezdařilo ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "ID přístupového klíče AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Tajný přístupový klíč AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Vytvořený objekt" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Objekt aktualizován" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Objekt odstraněn" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Práce byla zahájena" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Úloha dokončena" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Úloha selhala" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Chyba v úloze" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Zdroj dat (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Zdroj dat (název)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Uživatel (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Uživatelské jméno" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Povoleno" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parametry" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ignorovat pravidla" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Zdroj dat" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Soubor" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Zdroj dat" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Stvoření" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Typ objektu" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Vytvořeno po" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Vytvořeno dříve" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Naplánováno po" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Naplánováno dříve" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Začalo po" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Začalo dříve" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Dokončeno po" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Dokončeno dříve" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Uživatel" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Čas" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Po" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Dříve" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Akce" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Zdroj" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Parametry backendu" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Nahrávání souboru" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "Nelze nahrát soubor a synchronizovat z existujícího souboru" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "Musíte nahrát soubor nebo vybrat datový soubor, který chcete synchronizovat" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Výšky stojanů" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Napájení" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Zabezpečení" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Bannery" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Stránkování" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Validace" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Uživatelské předvolby" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Různé" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Revize konfigurace" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Tento parametr byl definován staticky a nelze jej změnit." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Aktuální hodnota: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (výchozí)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "čas" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "Uživatelské jméno" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "ID požadavku" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "akce" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "údaje před změnou" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "údaje po změně" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "změna objektu" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "změny objektu" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "Protokolování změn není u tohoto typu objektu podporováno ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "vytvořil" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "komentář" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "konfigurační data" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "revize konfigurace" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "revize konfigurace" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Výchozí konfigurace" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Aktuální konfigurace" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Revize konfigurace #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "typ" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "povoleno" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignorovat pravidla" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Vzory (jeden na řádek) odpovídající soubory, které mají být ignorovány při " "synchronizaci" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parametry" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "naposledy synchronizováno" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "zdroj dat" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "datové zdroje" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Neznámý typ backendu: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Synchronizaci nelze spustit; synchronizace již probíhá." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "" "Při inicializaci backendu došlo k chybě. Je třeba nainstalovat závislost: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "naposledy aktualizováno" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "cesta" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Cesta k souboru vzhledem ke kořenovému zdroji dat." -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "velikost" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "hash" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Délka musí být 64 hexadecimálních znaků." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256 hash dat souboru" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "datový soubor" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "datové soubory" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "záznam automatické synchronizace" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "automatická synchronizace záznamů" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "kořenový soubor" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "cesta k souboru" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Cesta k souboru vzhledem k určené kořenové cestě" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "spravovaný soubor" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "spravované soubory" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "naplánováno" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "interval" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Interval opakování (v minutách)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "začal" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "dokončena" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "data" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "chyba" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID úlohy" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "práce" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "pracovní místa" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "K tomuto typu objektu nelze přiřadit úlohy ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "Neplatný stav pro ukončení úlohy. Možnosti jsou: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "enqueue () nelze volat s hodnotami pro schedule_at a instant." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Odstranění brání pravidlo ochrany: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Celé jméno" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objekt" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID požadavku" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Je aktivní" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Cesta" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Naposledy aktualizováno" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Interval" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Verze" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Naposledy aktualizováno" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimální verze NetBoxu" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maximální verze NetBoxu" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Nebyla nalezena žádná data pluginu" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Autor" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Nainstalováno" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certifikováno" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Zveřejněno" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Nainstalovaná verze" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Nejnovější verze" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Nejstarší úkol" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Pracovníci" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Hostitel" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Přístav" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Plánovač PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Nebyly nalezeny žádné fronty" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "Ve frontě" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Ukončeno" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Volatelný" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Nebyly nalezeny žádné úkoly" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "státu" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Narození" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Nebyli nalezeni žádní pracovníci" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Úloha ve frontě #{id} synchronizovat {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Obnovená revize konfigurace #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Práce {job_id} nenalezeno" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Práce {id} byl vymazán." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Chyba při mazání úlohy {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Práce {id} nenalezeno." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Práce {id} byla znovu zařazena do fronty." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Práce {id} byl zařazen do fronty." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Práce {id} byl zastaven." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Nepodařilo se zastavit úlohu {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Katalog pluginů nelze načíst" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} nenalezeno" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Pozice (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ID objektu" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Inscenace" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Vyřazení z provozu" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Důchodce" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2-sloupový rám" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4-sloupový rám" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4-sloupová skříňka" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Nástěnný rám" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Nástěnný rám (vertikální)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Nástěnná skříňka" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Nástěnná skříň (vertikální)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} palců" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Rezervováno" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "K dispozici" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Zastaralé" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Milimetry" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "palce" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Zepředu dozadu" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Zezadu dopředu" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Rodič" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Dítě" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Přední" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Zadní" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Inscenovaný" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventář" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Zleva doprava" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Zprava doleva" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Ze strany dozadu" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Zezadu na stranu" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Zdola nahoru" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Nahoru dolů" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "pasivní" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Smíšené" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (bez blokování)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (zamykání)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Kalifornský styl" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Mezinárodní/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Proprietární" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Ostatní" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Mezinárodní" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fyzické" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuální" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Bezdrátové" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Virtuální rozhraní" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Most" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Agregační skupina (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (pevný)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulární)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (propojovací deska)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Buněčný" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Sériový" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Koaxiální" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Stohování" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Poloviční" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Plný" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Přístup" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Označeno" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Označeno (Vše)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Norma IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Pasivní 24V (2 páry)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Pasivní 24V (4 páry)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Pasivní 48V (2 páry)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Pasivní 48V (4 páry)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "měď" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Optická vlákna" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Vlákno" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Připojeno" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometry" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Metry" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimetry" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Míle" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Stopy" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogramy" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramy" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "libry" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Unce" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundantní" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Jednofázový" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Třífázový" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Neplatný formát MAC adresy: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Neplatný formát WWN: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Nadřazená oblast (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Nadřazená oblast (URL zkratka)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Nadřazená skupina webů (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Nadřazená skupina stránek (slimák)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Skupina (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Skupina (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Nadřazené umístění (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Rodičovské umístění (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Umístění (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Umístění (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Výrobce (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Výrobce (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Typ stojanu (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Typ stojanu (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Role (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Role (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Stojan (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Uživatel (jméno)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Výchozí platforma (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Výchozí platforma (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Má přední obrázek" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Má zadní obrázek" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Má konzolové porty" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Má porty konzolového serveru" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Má napájecí porty" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Má elektrické zásuvky" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Má rozhraní" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Má průchozí porty" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Má pozice pro moduly" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Má pozice pro zařízení" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Má položky inventáře" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Typ zařízení (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Typ modulu (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Napájecí port (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Nadřazená položka inventáře (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Konfigurační šablona (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Typ zařízení (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Rodičovské zařízení (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Platforma (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Platforma (URL zkratka)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Název lokality (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Rodičovská zátoka (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Cluster virtuálních počítačů (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Skupina klastru (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Skupina clusteru (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Model zařízení (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Je plná hloubka" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC adresa" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Má primární IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Má IP mimo pásmo" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Virtuální podvozek (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Je virtuální člen šasi" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Má kontext virtuálního zařízení" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Model zařízení" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Rozhraní (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Typ modulu (model)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Modulová přihrádka (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Zařízení (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Stojan (název)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Zařízení (název)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Typ zařízení (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Role zařízení (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Role zařízení (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Virtuální šasi (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Virtuální šasi" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Modul (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kabel (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Přiřazená VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Přiřazené VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Virtuální rozhraní šasi pro zařízení" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Virtuální rozhraní šasi pro zařízení (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Druh rozhraní" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Rodičovské rozhraní (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Přemostěné rozhraní (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Rozhraní LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Kontext virtuálního zařízení" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Kontext virtuálního zařízení (identifikátor)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Bezdrátová síť LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Bezdrátové spojení" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Pozice nadřazeného modulu (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Instalovaný modul (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Instalované zařízení (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Instalované zařízení (název)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Mistr (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Mistr (jméno)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Nájemce (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Nájemce (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Neukončený" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Napájecí panel (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Značky" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Pozice" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3113,842 +3441,922 @@ msgstr "" "Podporovány jsou alfanumerické rozsahy. (Musí odpovídat počtu vytvořených " "jmen.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Kontaktní jméno" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Kontaktní telefon" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Kontaktní e-mail" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Časové pásmo" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Výrobce" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Tvarový faktor" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Šířka" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Výška (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Sestupné jednotky" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Vnější šířka" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Vnější hloubka" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Vnější jednotka" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Hloubka montáže" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Hmotnost" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Max. hmotnost" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Jednotka hmotnosti" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Typ stojanu" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Vnější rozměry" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Rozměry" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Číslování" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Role" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Typ stojanu" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Sériové číslo" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Inventární číslo" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Proudění vzduchu" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Stojan" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Výchozí platforma" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Číslo dílu" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Výška U pozic" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Vyloučit z využití" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Typ zařízení" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Typ modulu" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Šasi" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Role virtuálního počítače" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Konfigurační šablona" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Typ zařízení" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Role zařízení" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Nástupiště" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Klastr" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Zařízení" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Konfigurace" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualizace" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Typ modulu" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Štítek" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Délka" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Jednotka délky" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Doména" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Napájecí panel" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Zdroj" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fáze" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Napětí" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Proud" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maximální využití" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maximální příkon" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maximální příkon (W)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Přidělený příkon" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Přidělený příkon (W)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Napájecí port" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Napájecí větev" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Pouze správa" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Režim PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Typ PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Bezdrátová role" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modul" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "Agregační skupina" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Kontexty virtuálních zařízení" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Rychlost" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Režim" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Skupina VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Neznačené VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Označené VLAN" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Skupina bezdrátových sítí" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Bezdrátové LAN sítě" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adresování" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operace" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Související rozhraní" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Přepínání 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Pro přiřazení sítí VLAN musí být zadán režim rozhraní" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Přístupovému rozhraní nelze přiřadit označené sítě VLAN." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Název nadřazené oblasti" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Název nadřazené skupiny webů" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Přiřazená oblast" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Přiřazená skupina" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "dostupné možnosti" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Přiřazené místo" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Rodičovská lokalita" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Místo nenalezeno." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Výrobce tohoto typu stojanu" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Nejnižší očíslovaná pozice v regálu" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Šířka kolejnice k kolejnici (v palcích)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Jednotka pro vnější rozměry" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Jednotka pro regálové závaží" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Jméno přiděleného nájemce" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Název přiřazené role" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Směr proudění vzduchu" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Nadřazený web" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Umístění stojanu (pokud existuje)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Jednotky" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Seznam jednotlivých čísel jednotek oddělených čárkami" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Výrobce, který vyrábí tento typ zařízení" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Výchozí platforma pro zařízení tohoto typu (volitelné)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Hmotnost zařízení" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Jednotka pro hmotnost zařízení" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Hmotnost modulu" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Jednotka pro hmotnost modulu" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Omezte přiřazení platformy tomuto výrobci" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Přidělená role" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Výrobce typu zařízení" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Model typu zařízení" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Přiřazená platforma" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Virtuální podvozek" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Virtualizační klastr" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Přiřazené umístění (pokud existuje)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Přiřazený stojan (pokud existuje)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Tvář" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Namontovaná plocha stojanu" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Rodičovské zařízení (pro podřízená zařízení)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Místo pro zařízení" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Místo pro zařízení, ve kterém je toto zařízení nainstalováno (pro podřízená " "zařízení)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Zařízení, ve kterém je tento modul nainstalován" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Modulová přihrádka" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Místo modulu, ve kterém je tento modul nainstalován" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Typ modulu" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Replikace komponent" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3956,262 +4364,269 @@ msgstr "" "Automaticky naplnit komponenty přidružené k tomuto typu modulu (ve výchozím " "nastavení povoleno)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Přijměte komponenty" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Přijměte již existující komponenty" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Typ portu" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Rychlost portu v bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Typ výstupu" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Místní napájecí port, který napájí tuto zásuvku" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Elektrická fáze (pro třífázové obvody)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Nadřazené rozhraní" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Přemostěné rozhraní" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Zpoždění" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Nadřazené rozhraní LAG" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "Názvy VDC oddělené čárkami, uzavřené dvojitými uvozovkami. Příklad:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Fyzické médium" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Dvoupodlažní" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Režim Poe" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Typ Poe" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Provozní režim IEEE 802.1Q (pro rozhraní L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Přiřazené VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rf role" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Bezdrátová role (AP/stanice)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} není přiřazen k zařízení {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Zadní port" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Odpovídající zadní port" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Klasifikace fyzického média" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Nainstalované zařízení" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Dětské zařízení instalované v této pozici" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Dětské zařízení nebylo nalezeno." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Nadřazená položka inventáře" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Typ komponenty" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Typ komponenty" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Název komponenty" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Název komponenty" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Komponenta nebyla nalezena: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Zařízení na straně A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Název zařízení" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Typ strany A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Typ ukončení" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Jméno strany A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Název ukončení" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Zařízení na straně B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Typ strany B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Název strany B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Stav připojení" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Strana {side_upper}: {device} {termination_object} je již připojeno" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "Zakončení strany {side_upper} nebylo nalezeno: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Hlavní" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Hlavní zařízení" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Název nadřazeného webu" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Nadřazený napájecí panel" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primární nebo redundantní" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Typ napájení (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Jednofázové nebo třífázové" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Primární IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4 adresa s maskou, např. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Primární IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6 adresa s délkou předpony, např. 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4220,7 +4635,7 @@ msgstr "" "Označené VLAN ({vlans}) musí patřit ke stejnému webu jako nadřazené " "zařízení/VM rozhraní, nebo musí být globální" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4228,7 +4643,7 @@ msgstr "" "Nelze nainstalovat modul se zástupnými hodnotami do pozice modulu bez " "definované polohy." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4237,187 +4652,198 @@ msgstr "" "Nelze nainstalovat modul se zástupnými hodnotami do stromu modulu {level} na" " stromě, ale {tokens} zadané zástupné symboly." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Nelze adoptovat {model} {name}, protože již patří do modulu" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "{model} pojmenovaný {name} již existuje" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Napájecí panel" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Napájecí zdroj" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Strana" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Stav zařízení" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Nadřazená oblast" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Rodičovská skupina" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Zařízení" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Typ stojanu" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Funkce" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Obrázky" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Komponenty" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Role dílčího zařízení" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Model" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Má IP OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Člen virtuálního šasi" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Má kontexty virtuálních zařízení" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Skupina klastru" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Kabelový" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Obsazeno" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Připojení" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Druh" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Pouze správa" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Bezdrátový kanál" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Frekvence kanálu (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Šířka kanálu (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Vysílací výkon (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kabel" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "objeveno" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Člen virtuálního šasi na pozici {vc_position} již existuje." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Kontaktní informace" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Role stojanu" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "URL zkratka" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Vyberte předdefinovaný typ stojanu nebo nastavte fyzikální vlastnosti níže." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Řízení zásob" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4425,144 +4851,171 @@ msgstr "" "Seznam číselných ID jednotek oddělený čárkami. Rozsah lze zadat pomocí " "pomlčky." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Rezervace" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Role zařízení" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Nejnižší číslovaná pozice obsazená zařízením" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "Poloha ve virtuálním podvozku tohoto zařízení je identifikována" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Priorita zařízení ve virtuálním šasi" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Automaticky naplnit komponenty přidružené k tomuto typu modulu" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Charakteristika" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Šablona portu konzoly" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Šablona portu konzolového serveru" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Šablona předního portu" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Šablona rozhraní" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Šablona elektrické zásuvky" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Šablona napájecího portu" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Šablona zadního portu" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Rozhraní" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Port konzoly" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Port konzolového serveru" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Přední port" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Zadní port" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Napájecí port" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Napájecí zásuvka" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Přiřazení komponent" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "InventoryItem lze přiřadit pouze k jedné komponentě." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Rozhraní LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtrujte sítě VLAN dostupné pro přiřazení podle skupiny." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Podřazené zařízení" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4570,32 +5023,35 @@ msgstr "" "Podřízená zařízení musí být nejprve vytvořena a přiřazena k staveništi a " "stojanu nadřazeného zařízení." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Port konzoly" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Port konzolového serveru" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Přední port" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Napájecí zásuvka" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Položka inventáře" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Role položky inventáře" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4603,7 +5059,7 @@ msgstr "" "Podporovány jsou alfanumerické rozsahy. (Musí odpovídat počtu vytvořených " "objektů.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4612,17 +5068,18 @@ msgstr "" "Poskytnutý vzor určuje {value_count} hodnot, ale očekáváno je " "{pattern_count}." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Zadní porty" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Vyberte jedno přiřazení zadního portu pro každý vytvořený přední port." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4631,16 +5088,7 @@ msgstr "" "Počet šablon předních portů, které mají být vytvořeny ({frontport_count}), " "musí odpovídat zvolenému počtu pozic zadních portů ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Řetězec {module} bude nahrazen polohou přiřazeného modulu, " -"pokud existuje." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4649,81 +5097,84 @@ msgstr "" "Počet předních portů, které mají být vytvořeny ({frontport_count}), musí " "odpovídat zvolenému počtu pozic zadních portů ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Členové" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Počáteční pozice" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "Pozice prvního člena. Zvýší se o jeden pro každého dalšího člena." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Pro prvního člena virtuálnáho šasi musí být specifikována pozice." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "štítek" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "délka" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "jednotka délky" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "kabel" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "kabely" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Při nastavování délky kabelu je nutné zadat jednotku" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Při vytváření nového kabelu je nutné definovat zakončení A a B." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "Nelze připojit různé typy zakončení ke stejnému konci kabelu." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Nekompatibilní typy ukončení: {type_a} a {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Koncovky A a B se nemohou připojit ke stejnému objektu." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "konec" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "zakončení kabelu" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "zakončení kabelů" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4732,37 +5183,37 @@ msgstr "" "Nalezeno duplicitní ukončení pro {app_label}.{model} {termination_id}: kabel" " {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kabely nelze zakončit v {type_display} rozhraní" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Zakončení okruhů připojené k síti poskytovatele nemusí být kabelovány." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "je aktivní" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "je kompletní" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "je rozdělen" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "trasa kabelu" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "trasy kabelů" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4771,23 +5222,23 @@ msgstr "" "{module} je akceptován jako náhrada za pozici modulu, když je připojen k " "typu modulu." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Fyzický popisek" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "Šablony komponent nelze přesunout na jiný typ zařízení." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "" "Šablonu komponenty nelze přidružit zároveň k typu zařízení a k typu modulu." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4795,135 +5246,135 @@ msgstr "" "Šablona komponenty musí být přiřazena buď k typu zařízení, nebo k typu " "modulu." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "šablona portu konzoly" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "šablony portů konzoly" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "šablona portu konzolového serveru" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "šablony portů konzolového serveru" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maximální příkon" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "přidělený příkon" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "šablona napájecího portu" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "šablony napájecích portů" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "Přidělený příkon nesmí překročit maximální příkon ({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "napájecí větev" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fáze (pro třífázové napájení)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "šablona elektrické zásuvky" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "šablony zásuvek" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Rodičovský napájecí port ({power_port}) musí patřit ke stejnému typu " "zařízení" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Rodičovský napájecí port ({power_port}) musí patřit ke stejnému typu modulu" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "pouze řízení" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "rozhraní mostu" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "bezdrátová role" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "šablona rozhraní" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "šablony rozhraní" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Rozhraní nemůže být přemostěno samo od sebe." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Rozhraní můstku ({bridge}) musí patřit ke stejnému typu zařízení" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Rozhraní můstku ({bridge}) musí patřit ke stejnému typu modulu" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "pozice zadního portu" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "šablona předního portu" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "šablony předního portu" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Zadní port ({name}) musí patřit ke stejnému typu zařízení" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4932,48 +5383,48 @@ msgstr "" "Neplatná poloha zadního portu ({position}); zadní port {name} má pouze " "{count} pozice" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "pozice" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "šablona zadního portu" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "šablony zadních portů" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "pozice" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identifikátor, na který se má odkazovat při přejmenování nainstalovaných " "komponent" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "šablona moduární šachty" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "šablony modulárních šachet" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "šablona pozice zařízení" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "šablony rozvaděčů zařízení" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -4982,201 +5433,206 @@ msgstr "" "Role dílčího zařízení typu zařízení ({device_type}) musí být nastaveno na " "„rodič“, aby bylo možné povolit pozice zařízení." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID součásti" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identifikátor součásti přiřazený výrobcem" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "šablona položky inventáře" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "šablony položek inventáře" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Komponenty nelze přesunout do jiného zařízení." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "konec kabelu" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "označit připojený" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Považovat za připojený" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Při připojování kabelu je nutné zadat konec kabelu (A nebo B)." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Konec kabelu nesmí být nastaven bez kabelu." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Nelze označit jako připojený s připojeným kabelem." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} modely musí deklarovat vlastnost parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Fyzický typ portu" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "rychlost" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Rychlost portu v bitech za sekundu" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "konzolový port" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "konzolové porty" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "port konzolového serveru" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "porty konzolového serveru" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "napájecí port" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "napájecí porty" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "elektrická zásuvka" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "elektrické zásuvky" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Rodičovský napájecí port ({power_port}) musí patřit ke stejnému zařízení" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "režim" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Strategie označování IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "nadřazené rozhraní" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "nadřazená MAS" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Toto rozhraní se používá pouze pro správu mimo pásmo" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "Rychlost (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "duplexní" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64bitový celosvětový název" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "bezdrátový kanál" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "frekvence kanálu (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Vyplněno vybraným kanálem (pokud je nastaven)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "vysílací výkon (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "bezdrátové sítě LAN" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "neoznačené VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "označené VLAN" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "rozhraní" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "rozhraní" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} Rozhraní nemůže mít připojený kabel." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} rozhraní nelze označit jako připojená." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Rozhraní nemůže být svým vlastním rodičem." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "K nadřazenému rozhraní lze přiřadit pouze virtuální rozhraní." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5184,7 +5640,7 @@ msgid "" msgstr "" "Vybrané nadřazené rozhraní ({interface}) patří k jinému zařízení ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5193,7 +5649,7 @@ msgstr "" "Vybrané nadřazené rozhraní ({interface}) patří {device}, která není součástí" " virtuálního podvozku {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5201,7 +5657,7 @@ msgid "" msgstr "" "Vybrané rozhraní můstku ({bridge}) patří k jinému zařízení ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5210,21 +5666,21 @@ msgstr "" "Vybrané rozhraní můstku ({interface}) patří {device}, která není součástí " "virtuálního podvozku {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Virtuální rozhraní nemohou mít nadřazené rozhraní LAG." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Rozhraní MAS nemůže být vlastním rodičem." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "Vybrané rozhraní LAG ({lag}) patří k jinému zařízení ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5233,44 +5689,44 @@ msgstr "" "Vybrané rozhraní LAG ({lag}) patří {device}, která není součástí virtuálního" " podvozku {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Virtuální rozhraní nemohou mít režim PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Virtuální rozhraní nemohou mít typ PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Při určování typu PoE musí specifikovat režim PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "Role bezdrátové sítě může být nastavena pouze na bezdrátových rozhraních." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Kanál lze nastavit pouze na bezdrátových rozhraních." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "Frekvence kanálu může být nastavena pouze na bezdrátových rozhraních." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Nelze určit vlastní frekvenci s vybraným kanálem." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "Šířku kanálu lze nastavit pouze na bezdrátových rozhraních." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "Nelze určit vlastní šířku s vybraným kanálem." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5279,24 +5735,24 @@ msgstr "" "Neznačená VLAN ({untagged_vlan}) musí patřit ke stejnému webu jako nadřazené" " zařízení rozhraní, nebo musí být globální." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Mapovaná poloha na odpovídajícím zadním portu" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "přední port" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "přední porty" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Zadní port ({rear_port}) musí patřit ke stejnému zařízení" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5305,19 +5761,19 @@ msgstr "" "Neplatná poloha zadního portu ({rear_port_position}): Zadní port {name} má " "pouze {positions} pozice." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Počet předních portů, které lze mapovat" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "zadní port" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "zadní porty" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5326,147 +5782,150 @@ msgstr "" "Počet pozic nesmí být menší než počet mapovaných předních portů " "({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "přihrádka modulů" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "pozice modulů" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "Pozice modulu nemůže patřit k modulu nainstalovanému v ní." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "pozice zařízení" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "pozice zařízení" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Tento typ zařízení ({device_type}) nepodporuje pozice zařízení." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Nelze nainstalovat zařízení do sebe." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "" "Nelze nainstalovat určené zařízení; zařízení je již nainstalováno {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "role položky inventáře" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "role položek zásob" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "sériové číslo" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "štítek majetku" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Jedinečná značka použitá k identifikaci této položky" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "objeveny" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Tato položka byla automaticky objevena" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "položka inventáře" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "inventární položky" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Nelze přiřadit sebe jako rodiče." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Nadřazená položka inventáře nepatří do stejného zařízení." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Nelze přesunout položku inventáře se závislými podřízenými" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "Nelze přiřadit skladovou položku ke komponentě na jiném zařízení" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "výrobce" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "výrobci" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "modelka" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "výchozí platforma" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "číslo dílu" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Diskrétní číslo dílu (volitelné)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "výška (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "vyloučit z využití" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "Zařízení tohoto typu jsou vyloučena při výpočtu využití stojanu." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "je plná hloubka" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "Zařízení spotřebovává přední i zadní stranu stojanu." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "stav rodiče/dítěte" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5474,24 +5933,24 @@ msgstr "" "Rodičovská zařízení ukládají podřízená zařízení do pozic zařízení. Pokud " "tento typ zařízení není rodičem ani dítětem, ponechte prázdné." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "proud vzduchu" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "typ zařízení" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "typy zařízení" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "Výška U musí být v krocích po 0,5 regálových jednotek." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5500,7 +5959,7 @@ msgstr "" "Zařízení {device} v stojanu {rack} nemá dostatek prostoru pro umístění výšky" " {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5509,7 +5968,7 @@ msgstr "" "Nelze nastavit výšku 0U: Nalezeno {racked_instance_count} " "instancí již namontované v regálech." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5517,155 +5976,155 @@ msgstr "" "Před odtajněním jako nadřazeného zařízení je nutné odstranit všechny šablony" " rozmístění zařízení přidružené k tomuto zařízení." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Typ dětského zařízení musí být 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "typ modulu" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "typy modulů" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Virtuální počítače mohou být přiřazeny k této roli" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "role zařízení" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "role zařízení" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "Volitelně omezit tuto platformu na zařízení určitého výrobce" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "platforma" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "platformy" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Funkce, kterou toto zařízení slouží" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Sériové číslo podvozku přidělené výrobcem" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Jedinečná značka použitá k identifikaci tohoto zařízení" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "poloha (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "plocha stojanu" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "primární IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "primární IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP mimo pásmo" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Pozice VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Virtuální poloha podvozku" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Priorita VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Priorita volby hlavního virtuálního šasi" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "zeměpisná šířka" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Souřadnice GPS v desetinném formátu (xx.rrrrrr)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "zeměpisná délka" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Název zařízení musí být pro každou lokalitu jedinečný." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "zařízení" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "zařízení" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Stojan {rack} nepatří k webu {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Lokace {location} nepatří k webu {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Stojan {rack} nepatří do lokality {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Nelze vybrat plochu stojanu bez přiřazení stojanu." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Bez přiřazení stojanu nelze vybrat polohu stojanu." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Poloha musí být v krocích po 0,5 regálových jednotek." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "Při definování polohy stojanu je nutné zadat plochu stojanu." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "Typ zařízení 0U ({device_type}) nelze přiřadit k poloze stojanu." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5673,7 +6132,7 @@ msgstr "" "Podřízené typy zařízení nelze přiřadit k ploše stojanu. Toto je atribut " "nadřazeného zařízení." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5681,7 +6140,7 @@ msgstr "" "Podřízené typy zařízení nelze přiřadit k poloze stojanu. Toto je atribut " "nadřazeného zařízení." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5690,22 +6149,22 @@ msgstr "" "U{position} je již obsazeno nebo nemá dostatek místa pro umístění tohoto " "typu zařízení: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} Nejedná se o IPv4 adresu." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Zadaná adresa IP ({ip}) není přiřazen k tomuto zařízení." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} Nejedná se o IPv6 adresu." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5714,16 +6173,16 @@ msgstr "" "Přiřazená platforma je omezena na {platform_manufacturer} typy zařízení, ale" " tento typ zařízení patří {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Přiřazený cluster patří do jiné lokality ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "Zařízení přiřazené k virtuálnímu šasi musí mít definovanou polohu." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5732,15 +6191,15 @@ msgstr "" "Zařízení nelze odebrat z virtuálního šasi {virtual_chassis} protože je v " "současné době označen jako jeho pán." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "modul" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "moduly" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5748,22 +6207,22 @@ msgid "" msgstr "" "Modul musí být instalován v modulu patřící přiřazenému zařízení ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "doména" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "virtuální podvozek" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "Vybraný master ({master}) není přiřazena k tomuto virtuálnímu podvozku." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5772,102 +6231,102 @@ msgstr "" "Nelze odstranit virtuální šasi {self}. Existují členská rozhraní, která " "tvoří rozhraní LAG napříč podvozky." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identifikátor" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Numerický identifikátor jedinečný pro nadřazené zařízení" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "komentáře" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "kontext virtuálního zařízení" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "kontexty virtuálních zařízení" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} není IPV{family} adresa." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "Primární IP adresa musí patřit k rozhraní na přiřazeném zařízení." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "váha" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "hmotnostní jednotka" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Při nastavování hmotnosti je nutné zadat jednotku" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "napájecí panel" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "napájecí panely" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "Lokace {location} ({location_site}) je na jiném místě než {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "zásobování" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "fáze" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "napětí" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "proud proudu" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maximální využití" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Maximální přípustné tažení (v procentech)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "dostupný výkon" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "napájecí zdroj" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "napájecí zdroje" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5876,63 +6335,63 @@ msgstr "" "Stojan {rack} ({rack_site}) a napájecí panel {powerpanel} " "({powerpanel_site}) jsou na různých místech." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Napětí nemůže být záporné pro napájení střídavým proudem" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "Šířka" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Šířka kolejnice k kolejnici" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Výška v regálových jednotkách" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "startovací jednotka" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Startovací jednotka pro regál" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "sestupné jednotky" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Jednotky jsou číslovány shora dolů" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "vnější šířka" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Vnější rozměr stojanu (šířka)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "vnější hloubka" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Vnější rozměr stojanu (hloubka)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "vnější jednotka" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "montážní hloubka" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5940,74 +6399,75 @@ msgstr "" "Maximální hloubka namontovaného zařízení v milimetrech. U čtyřsloupkových " "regálů se jedná o vzdálenost mezi přední a zadní kolejnicí." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "max. hmotnost" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Maximální nosnost stojanu" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "tvarový faktor" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "typ stojanu" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "typy stojanů" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "Při nastavování vnější šířky/hloubky musí zadat jednotku" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Při nastavování maximální hmotnosti musí specifikovat jednotku" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "role stojanu" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "role stojanu" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID zařízení" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Lokálně přiřazený identifikátor" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Funkční role" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Jedinečná značka použitá k identifikaci tohoto stojanu" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "nosič" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "regály" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "Přiřazené umístění musí patřit nadřazenému webu ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6016,7 +6476,7 @@ msgstr "" "Stojan musí být alespoň {min_height}U vysoký k uložení aktuálně " "nainstalovaných zařízení." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6025,1154 +6485,1238 @@ msgstr "" "Číslování regálových jednotek musí začínat na {position} nebo méně pro " "umístění aktuálně nainstalovaných zařízení." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Umístění musí být ze stejného místa, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "jednotky" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "rezervace stojanu" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "rezervace stojanů" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Neplatná jednotka (y) pro {height}U stojan: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Následující jednotky již byly rezervovány: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Oblast nejvyšší úrovně s tímto názvem již existuje." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Oblast nejvyšší úrovně s tímto slimákem již existuje." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "region" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regiony" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Skupina webů nejvyšší úrovně s tímto názvem již existuje." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Skupina webů nejvyšší úrovně s tímto slimákem již existuje." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "skupina stránek" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "skupiny webů" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Úplný název webu" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "zařízení" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ID nebo popis místního zařízení" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "fyzická adresa" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Fyzické umístění budovy" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "dodací adresa" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Pokud se liší od fyzické adresy" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "stránky" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "stránky" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Umístění s tímto názvem již existuje v zadaném webu." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Umístění s tímto slimákem již existuje v zadaném webu." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "lokace" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "lokalitách" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "Rodičovská lokalita ({parent}) musí patřit ke stejnému webu ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Ukončení A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Ukončení B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Zařízení A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Zařízení B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Lokalita A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Lokalita B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Stojan A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Stojan B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Stránky A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Místo B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Dosažitelný" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Přístroje" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "Virtuální stroje" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Konfigurační šablona" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Skupina stránek" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP adresa" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4 Adresa" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Adresa IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Pozice VC" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Priorita VC" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Rodičovské zařízení" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Pozice (pole pro zařízení)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Porty konzoly" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Porty konzolového serveru" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Napájecí porty" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Elektrické zásuvky" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Rozhraní" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Přední porty" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Pozice zařízení" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Modulové pozice" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Inventární položky" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Modulová přihrádka" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Inventární položky" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Barva kabelu" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Propojit vrstevníky" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Označit Připojeno" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maximální tažení (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Přidělené losování (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP adresy" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Skupiny FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Pouze správa" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Instalovaný modul" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Sériový modul" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Štítek aktiv modulu" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Stav modulu" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Komponenta" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Položky" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Typy zařízení" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Typy modulů" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Platformy" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Výchozí platforma" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Plná hloubka" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Výška U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instance" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Porty konzoly" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Porty konzolového serveru" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Napájecí porty" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Napájecí zásuvky" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Přední porty" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Zadní porty" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Pozice pro zařízení" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Modulové pozice" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Napájecí zdroje" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Maximální využití" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Dostupný výkon (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Stojany" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Výška" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Vnější šířka" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Vnější hloubka" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Max. hmotnost" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Prostor" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Stránky" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Testovací případ musí nastavit peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Odpojeno {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Rezervace" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Zařízení bez racku" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Kontext konfigurace" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Konfigurace rendrování" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Při vykreslování šablony došlo k chybě: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Virtuální stroje" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Nainstalované zařízení {device} v zátoce {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Odstraněné zařízení {device} od zátoky {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Děti" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Přidán člen {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Nelze odebrat hlavní zařízení {device} z virtuálního podvozku." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Odstraněno {device} z virtuálního šasi {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Neznámý související objekt (y): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Změna typu vlastních polí není podporována." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Plánování není pro tento skript povoleno." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Text" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Text (dlouhý)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Celočíselné" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Desetinné" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Boolean (pravda/nepravda)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Rande" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Datum a čas" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Výběr" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Vícenásobný výběr" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Více objektů" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Zakázané" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Volný" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Přesný" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Vždy" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Pokud je nastaveno" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Skrytý" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Ano" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Ne" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Odkaz" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Nejnovější" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Nejstarší" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Abecedně (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Abecedně (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Informace" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Úspěch" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Varování" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Nebezpečí" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Ladění" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Výchozí" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Porucha" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Hodinová" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 hodin" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Denně" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Týdenní" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 dní" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Vytvořit" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Aktualizovat" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Odstranit" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Modrý" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Nachový" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Růžový" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Červené" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "oranžový" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Žlutá" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Zelená" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Šedozelená" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Azurová" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Šedá" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Černá" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Bílá" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webový háček" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Skript" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Oznámení" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Neznámý operátor: {op}. Musí to být jeden z: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Nepodporovaný typ hodnoty: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Neplatný typ pro {op} Provoz: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Sada pravidel musí být slovník, ne {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Neplatný typ logiky: musí být „AND“ nebo „OR“. Zkontrolujte prosím " "dokumentaci." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Nesprávný klíč (klíče) informován. Zkontrolujte prosím dokumentaci." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Typ widgetu" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Neregistrovaná třída widgetu: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} musí definovat metodu render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Poznámka" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Zobrazí nějaký libovolný vlastní obsah. Markdown je podporován." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Počty objektů" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." msgstr "Zobrazí sadu modelů NetBox a počet objektů vytvořených pro každý typ." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtry, které se použijí při počítání počtu objektů" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "Neplatný formát. Objektové filtry musí být předány jako slovník." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Seznam objektů" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Zobrazí libovolný seznam objektů." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Výchozí počet objektů k zobrazení" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "Neplatný formát. Parametry URL musí být předány jako slovník." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS kanál" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Vložte kanál RSS z externího webu." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "Adresa URL zdroje" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Maximální počet objektů, které se mají zobrazit" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Jak dlouho uložit obsah uložený v mezipaměti (v sekundách)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Záložky" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Zobrazit své osobní záložky" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Neznámý typ akce pro pravidlo události: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Nelze importovat kanál událostí {name} chyba: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Skriptový modul (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Datový soubor (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Skupina (název)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Typ clusteru" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Typ klastru (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Skupina nájemců" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Skupina nájemců (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Značka" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Štítek (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Má místní kontextová data konfigurace" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Název skupiny" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Požadováno" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Musí být jedinečný" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Uživatelské rozhraní viditelné" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Upravitelné uživatelské rozhraní" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Je klonovatelný" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimální hodnota" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maximální hodnota" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Ověření regex" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Chování" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nové okno" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Třída tlačítek" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Typ MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "přípona souboru" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Jako příloha" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Sdílené" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Metoda HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "Adresa URL užitečného zatížení" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Ověření SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Tajemství" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Cesta k souboru CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Typy událostí" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Je aktivní" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Typy objektů" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Jeden nebo více přiřazených typů objektů" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Datový typ pole (např. text, celé číslo atd.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Typ objektu" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Typ objektu (pro pole objektu nebo více objektů)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Sada na výběr" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Sada možností (pro výběrová pole)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Zda je uživatelské pole zobrazeno v uživatelském rozhraní" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Zda je vlastní pole upravitelné v uživatelském rozhraní" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "Základní sada předdefinovaných možností k použití (pokud existují)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7180,183 +7724,199 @@ msgstr "" "Uváděný řetězec možností polí oddělených čárkami s volitelnými popisky " "oddělenými dvojtečkou: „výběr:1: první volba, výběra2:druhá volba“" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "třída tlačítek" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "Třída prvního odkazu ve skupině bude použita pro rozevírací tlačítko" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Typ (y) události, které spustí toto pravidlo" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Akční objekt" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Název nebo skript Webhooku jako tečkovaná cesta module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webový háček {name} nenalezeno" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Skript {name} nenalezeno" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Typ přiřazeného objektu" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Klasifikace vstupu" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Uživatelé" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Uživatelská jména oddělená čárkami, uzavřená dvojitými uvozovkami" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Skupiny" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Názvy skupin oddělené čárkami, uzavřené dvojitými uvozovkami" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Typ souvisejícího objektu" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Typ pole" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Možnosti" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Údaje" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Datový soubor" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Typy obsahu" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Typ obsahu HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Typ události" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Typ akce" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Typ označeného objektu" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Povolený typ objektu" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regiony" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Skupiny webů" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Lokality" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Typy zařízení" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Role" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Typy klastrů" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Skupiny klastrů" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Klastry" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Skupiny nájemců" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Typ (y) objektu, který má toto vlastní pole" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Výchozí hodnota" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Typ souvisejícího objektu (pouze pro pole objektu/více objektů)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Související filtr objektů" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Zadejte parametry dotazu jako objekt JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Vlastní pole" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7364,18 +7924,18 @@ msgstr "" "Typ dat uložených v tomto poli. U polí objekt/více objektů vyberte níže " "související typ objektu." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "" "Zobrazí se jako text nápovědy pro pole formuláře. Je podporován markdown." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Související objekt" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7383,15 +7943,16 @@ msgstr "" "Zadejte jednu volbu na řádek. Pro každou volbu lze zadat volitelný popisek " "přidáním dvojtečky. Příklad:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Vlastní odkaz" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Šablony" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7400,7 +7961,7 @@ msgstr "" "Kód šablony Jinja2 pro text odkazu. Referovat na objekt jako {example}. " "Odkazy, které se vykreslují jako prázdný text, se nezobrazí." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7408,52 +7969,58 @@ msgstr "" "Kód šablony Jinja2 pro adresu URL odkazu. Referovat na objekt jako " "{example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Kód šablony" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Šablona exportu" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Vykreslování" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "Obsah šablony je vyplněn ze vzdáleného zdroje vybraného níže." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Musí zadat místní obsah nebo datový soubor" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Uložený filtr" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Skupina oznámení určuje alespoň jednoho uživatele nebo skupinu." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP požadavek" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Volba akce" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Zadejte podmínky do JSON Formát." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7461,109 +8028,111 @@ msgstr "" "Zadejte parametry, které chcete předat akci v JSON Formát." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Pravidlo události" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Spouštěče" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Skupina oznámení" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Nájemci" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Data jsou vyplněna ze vzdáleného zdroje vybraného níže." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Musí zadat buď lokální data nebo datový soubor" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Obsah" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Plán na" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Naplánujte spuštění sestavy na nastavený čas" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Opakuje se každý" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Interval, ve kterém je tato zpráva znovu spuštěna (v minutách)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (aktuální čas: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Naplánovaný čas musí být v budoucnu." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Odevzdat změny" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "Odevzdat změny do databáze (zrušte zaškrtnutí u suchého spuštění)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Naplánujte spuštění skriptu na nastavený čas" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Interval, ve kterém je tento skript znovu spuštěn (v minutách)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Změny v databázi byly automaticky vráceny." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Skript byl přerušen s chybou: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Došlo k výjimce: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Změny databáze byly vráceny kvůli chybě." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Nebyly nalezeny žádné indexátory!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "kontext konfigurace" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "kontexty konfigurace" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Data JSON musí být ve formě objektu. Příklad:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7571,19 +8140,19 @@ msgstr "" "Lokální kontextová data konfigurace mají přednost před zdrojovými kontexty v" " konečném rendrovaném kontextu konfigurace" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "kód šablony" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Kód šablony Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "parametry prostředí" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7593,39 +8162,39 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">další" " parametry projít při konstrukci prostředí Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "šablona konfigurace" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "konfigurační šablony" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Objekt (objekty), na které se toto pole vztahuje." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Typ dat obsažených v tomto uživatelském poli" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "Typ objektu NetBox, na který se toto pole mapuje (pro objektová pole)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Název interního pole" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Povoleny jsou pouze alfanumerické znaky a podtržítka." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "Dvojité podtržítko není povoleno v názvech vlastních polí." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7633,19 +8202,19 @@ msgstr "" "Název pole zobrazeného uživatelům (pokud není uvedeno, použije se název " "pole)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "název skupiny" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Vlastní pole ve stejné skupině se zobrazí společně" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "požadované" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7653,19 +8222,19 @@ msgstr "" "Toto pole je povinné při vytváření nových objektů nebo při úpravách " "existujícího objektu." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "Musí být unikátní" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Hodnota tohoto pole musí být jedinečná pro přiřazený objekt" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "hmotnost vyhledávání" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7673,11 +8242,11 @@ msgstr "" "Vážení pro vyhledávání. Nižší hodnoty jsou považovány za důležitější. Pole s" " váhou vyhledávání nula budou ignorována." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "filtrační logika" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7685,11 +8254,11 @@ msgstr "" "Loose odpovídá libovolné instanci daného řetězce; přesně odpovídá celému " "poli." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "selhání" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7697,7 +8266,7 @@ msgstr "" "Výchozí hodnota pole (musí být hodnota JSON). Zapouzdřit řetězce s dvojitými" " uvozovkami (např. „Foo“)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7705,35 +8274,35 @@ msgstr "" "Filtrujte volby výběru objektů pomocí dikt query_params (musí být hodnota " "JSON). Zapouzdřete řetězce dvojitými uvozovkami (např. „Foo“)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "hmotnost displeje" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Pole s vyšší hmotností se ve formuláři zobrazují níže." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "minimální hodnota" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Minimální povolená hodnota (pro číselná pole)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maximální hodnota" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Maximální povolená hodnota (pro číselná pole)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "validační regex" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7744,186 +8313,188 @@ msgstr "" "vynucení shody celého řetězce. Například, ^ [A-Z]{3}$ omezí " "hodnoty na přesně tři velká písmena." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "výběrová sada" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "Určuje, zda se uživatelské pole zobrazí v uživatelském rozhraní" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Určuje, zda lze uživatelskou hodnotu pole upravovat v uživatelském rozhraní" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "je klonovatelný" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Replikujte tuto hodnotu při klonování objektů" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "vlastní pole" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "vlastní pole" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Neplatná výchozí hodnota“{value}„: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Minimální hodnota může být nastavena pouze pro číselná pole" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Maximální hodnota může být nastavena pouze pro číselná pole" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Ověření regulárních výrazů je podporováno pouze pro textová pole a pole URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Jedinečnost nelze vynutit u booleovských polí" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Výběrová pole musí specifikovat sadu možností." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Volby lze nastavit pouze na výběrových polích." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Pole objektu musí definovat typ objektu." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} pole nemusí definovat typ objektu." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "Související filtr objektů lze definovat pouze pro pole objektů." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "Filtr musí být definován jako slovník mapující atributy na hodnoty." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Pravda" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Nepravdivé" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Hodnoty se musí shodovat s tímto regexem: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Hodnota musí být řetězec." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Hodnota musí odpovídat regex '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Hodnota musí být celé číslo." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Hodnota musí být alespoň {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Hodnota nesmí překročit {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Hodnota musí být desetinná." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Hodnota musí být pravdivá nebo nepravdivá." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Hodnoty data musí být ve formátu ISO 8601 (RRRR-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Hodnoty data a času musí být ve formátu ISO 8601 (RRRR-MM-DD HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Neplatná volba ({value}) pro volitelnou sadu {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Neplatná volba (y){value}) pro volitelnou sadu {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Hodnota musí být ID objektu, ne {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Hodnota musí být seznam ID objektů, ne {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Nalezeno neplatné ID objektu: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Povinné pole nesmí být prázdné." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Základní sada předdefinovaných možností (volitelné)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Volby jsou automaticky seřazeny abecedně" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "vlastní sada výběru polí" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "vlastní sady výběru polí" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Musí definovat základní nebo další možnosti." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -7932,60 +8503,60 @@ msgstr "" "Nelze odebrat volbu {choice} jak existují {model} objekty, které na něj " "odkazují." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "rozložení" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "konfigurace" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "přístrojová deska" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "řídicí panely" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "typy objektů" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Předmět (objekty), na které se toto pravidlo vztahuje." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Typy událostí, které spustí toto pravidlo." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "podmínky" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Sada podmínek, které určují, zda bude událost generována." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "typ akce" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Další data, která mají být předána objektu akce" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "pravidlo události" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "pravidla události" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -7995,7 +8566,7 @@ msgstr "" "webhooku. Zpracování šablony Jinja2 je podporováno ve stejném kontextu jako " "tělo požadavku." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available tady." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "další záhlaví" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8021,11 +8592,11 @@ msgstr "" "Hodnota. Zpracování šablony Jinja2 je podporováno ve stejném kontextu" " jako tělo požadavku (níže)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "šablona těla" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8038,11 +8609,11 @@ msgstr "" "uživatelské jméno, identifikační číslo požadavku, " "a data." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "tajemství" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8052,15 +8623,15 @@ msgstr "" " hlavička obsahující hexový přehled HMAC těla užitečného zatížení s použitím" " tajemství jako klíče. Tajemství není v žádosti předáno." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Povolit ověření certifikátu SSL. Zakázat s opatrností!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Cesta k souboru CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8068,65 +8639,65 @@ msgstr "" "Specifický soubor certifikátu CA, který se použije pro ověření SSL. Chcete-" "li použít výchozí nastavení systému, ponechte prázdné." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webový háček" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooky" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Pokud je ověřování SSL zakázáno, neurčujte soubor certifikátu certifikační " "autority." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Typ objektu (typy), na které se toto spojení vztahuje." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "text odkazu" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Kód šablony Jinja2 pro text odkazu" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL odkazu" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Kód šablony Jinja2 pro URL odkazu" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Odkazy se stejnou skupinou se zobrazí jako rozbalovací nabídka" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nové okno" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Vynutit otevření odkazu v novém okně" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "vlastní odkaz" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "vlastní odkazy" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Typ (typy) objektu, na které se tato šablona vztahuje." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8134,1080 +8705,1146 @@ msgstr "" "Kód šablony Jinja2. Seznam exportovaných objektů je předán jako kontextová " "proměnná s názvem queryset." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Výchozí hodnota text/prostý; znaková sada = utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "přípona souboru" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Rozšíření pro připojení k rendrovanému názvu souboru" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "jako příloha" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Stáhnout soubor jako přílohu" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "šablona exportu" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "exportovat šablony" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "„{name}„je vyhrazené jméno. Zvolte prosím jiné jméno." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Typ objektu (typy), na které se tento filtr vztahuje." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "sdílené" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "uložený filtr" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "uložené filtry" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Parametry filtru musí být uloženy jako slovník argumentů klíčových slov." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "výška obrazu" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "šířka obrazu" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "příloha obrázku" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "obrazové přílohy" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "K tomuto typu objektu nelze přiřadit přílohy obrázků ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "laskavý" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "zápis do deníku" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "zápisy do deníku" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Žurnálování není pro tento typ objektu podporováno ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "záložka" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "záložky" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "K tomuto typu objektu nelze přiřadit záložky ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "číst" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "událost" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "oznámení" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "oznámení" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objekty tohoto typu ({type}) nepodporují oznámení." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "skupin" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "uživatelé" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "oznamovací skupina" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "skupiny oznámení" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "předplatné" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "předplatné" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "je spustitelný" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "skript" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "skripty" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "skriptový modul" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "skriptové moduly" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "časové razítko" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "pole" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "hodnota" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "hodnota uložená v mezipaměti" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "hodnoty uložené v mezipaměti" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "větev" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "poboček" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "postupná změna" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "postupné změny" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Typ objektu (typy), na které lze tento tag použít." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "štítek" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "tagy" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "označená položka" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "označené položky" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Data skriptu" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parametry spuštění skriptu" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Odmítnout" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Typy objektů" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Ověřte jedinečnost" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Viditelné" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Upravitelné" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Typ souvisejícího objektu" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Sada výběru" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Je klonovatelný" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimální hodnota" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maximální hodnota" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Ověření Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "počítat" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Řadit abecedně" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nové okno" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Jako příloha" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Datový soubor" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Synchronizováno" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Obrázek" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Velikost (bajty)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Číst" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Ověření SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Typy událostí" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Role zařízení" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Komentáře (krátký)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linka" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Úroveň" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Zpráva" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Metoda" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Ujistěte se, že tato hodnota se rovná %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Ujistěte se, že tato hodnota není stejná %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Toto pole musí být prázdné." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Toto pole nesmí být prázdné." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Ověřovací pravidla musí být předána jako slovník" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Vlastní ověření se nezdařilo pro {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Neplatný atribut“{name}„na vyžádání" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Neplatný atribut“{name}„pro {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Váš řídicí panel byl resetován." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Přidán widget: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Aktualizovaný widget: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Odstraněný widget: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Chyba při mazání widgetu: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Nelze spustit skript: Proces RQ Worker není spuštěn." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Zadejte platnou adresu IPv4 nebo IPv6 s volitelnou maskou." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Neplatný formát IP adresy: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Zadejte platnou předponu a masku IPv4 nebo IPv6 v zápisu CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Neplatný formát předpony IP: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Není k dispozici dostatek místa pro umístění požadované velikosti prefixu" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Kontejner" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAK" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Zpětná smyčka" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standardní" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Kontrolní bod" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Prostý text" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Neplatný formát IP adresy: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Cíl importu" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Cíl importu (název)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Cíl exportu" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Cíl exportu (název)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Import VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importovat VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Export VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Export VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Import L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Import L2VPN (identifikátor)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Export L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Export L2VPN (identifikátor)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Předpona" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "V rámci předpony" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "V rámci a včetně prefixu" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Předpony, které obsahují tuto předponu nebo IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Délka masky" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Číslo VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adresa" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Rozsahy, které obsahují tuto předponu nebo IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Nadřazená předpona" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Virtuální počítač (název)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Virtuální počítač (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Rozhraní (název)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Rozhraní virtuálního počítače (název)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Rozhraní virtuálního počítače (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Skupina FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Je přiřazen k rozhraní" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Je přiřazen" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Služba (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT uvnitř IP adresy (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Přiřazené rozhraní" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Přiřazené rozhraní virtuálního počítače" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP adresa (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP adresa" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Primární IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Primární IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Zadejte platnou adresu IPv4 nebo IPv6 (bez masky)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Neplatný formát adresy IPv4/IPv6: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Toto pole vyžaduje IP adresu bez masky." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Zadejte platnou adresu IPv4 nebo IPv6." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Zadejte platnou adresu IPv4 nebo IPv6 (s maskou CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Je vyžadována maska CIDR (např. /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Vzor adresy" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Vynutit jedinečný prostor" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Je soukromý" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Datum přidání" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Skupina VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "WLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Délka předpony" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Je bazén" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Zacházejte jako plně využívané" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Přiřazení VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Název DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "protokolu" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "ID skupiny" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Typ autentizace" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Ověřovací klíč" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Autentizace" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Typ rozsahu" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Rozsah" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Rozsahy ID VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Stránky a skupina" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Přístavy" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importovat cíle trasy" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Exportovat cíle trasy" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Přiřazené RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Skupina VLAN (pokud existuje)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Nadřazené zařízení přiřazeného rozhraní (pokud existuje)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Virtuální stroj" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Nadřazený virtuální počítač přiřazeného rozhraní (pokud existuje)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Je primární" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Nastavte to jako primární IP pro přiřazené zařízení" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Není určeno žádné zařízení ani virtuální počítač; nelze nastavit jako " "primární IP" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "Není určeno žádné rozhraní; nelze nastavit jako primární IP" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Typ autentizace" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Typ rozsahu (aplikace a model)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Přiřazená skupina VLAN" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "Protokol IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Vyžadováno, pokud není přiřazeno k virtuálnímu počítači" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Požadováno, pokud není přiřazeno k zařízení" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} není přiřazen k tomuto zařízení/virtuálnímu počítači." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Cíle trasy" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Importovat cíle" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Cíle exportu" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importováno VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Exportováno VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Soukromé" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Rodina adres" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Rozsah" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Začít" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Konec" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Vyhledávání uvnitř" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Přítomnost ve VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Zařízení/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Nadřazená předpona" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Přiřazené zařízení" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Přiřazený virtuální počítač" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Přiřazeno k rozhraní" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Název DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Obsahuje VLAN ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "ID VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Virtuální stroj" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Cíl trasy" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Agregát" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Řada ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Přiřazení webu/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Rozsah IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Skupina FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Nastavte z něj primární IP pro zařízení/virtuální počítač" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (uvnitř)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP adresu lze přiřadit pouze jednomu objektu." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Nelze znovu přiřadit adresu IP, pokud je určena jako primární IP pro " -"nadřazený objekt" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Jako primární IP adresy lze označit pouze adresy IP přiřazené k rozhraní." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Virtuální IP adresa" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Přiřazení již existuje" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "ID VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Dětské sítě VLAN" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9215,131 +9852,132 @@ msgstr "" "Seznam jednoho nebo více čísel portů oddělený čárkami. Rozsah lze zadat " "pomocí pomlčky." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Šablona služby" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Přístav (y)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Servisní služby" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Šablona služby" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Z šablony" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Zvyk" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Pokud nepoužíváte šablonu služby, musíte zadat název, protokol a port (y)." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "začít" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Řada ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Rozsahy ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Spuštění ASN ({start}) musí být nižší než koncová ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Regionální internetový registr odpovědný za tento číselný prostor AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- nebo 32bitové autonomní systémové číslo" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID skupiny" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protokol" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "typ ověřování" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "ověřovací klíč" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Skupina FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Skupiny FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Přiřazení skupiny FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Skupinové přiřazení FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "soukromá" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "IP prostor spravovaný tímto RIR je považován za soukromý" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Síť IPv4 nebo IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Regionální internetový registr odpovědný za tento IP prostor" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "datum přidání" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "agregát" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "agregáty" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Nelze vytvořit agregát s maskou /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9348,7 +9986,7 @@ msgstr "" "Agregáty se nemohou překrývat. {prefix} je již pokryto stávajícím agregátem " "({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9357,259 +9995,269 @@ msgstr "" "Předpony nemohou překrývat agregáty. {prefix} pokrývá existující agregát " "({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "role" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "rolí" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "předpona" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Síť IPv4 nebo IPv6 s maskou" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Provozní stav této předpony" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Primární funkce této předpony" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "je bazén" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Všechny IP adresy v rámci této prefixy jsou považovány za použitelné" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "použitá značka" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "předpony" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Nelze vytvořit předponu s maskou /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "globální tabulka" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Duplicitní předpona nalezena v {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "Počáteční adresa" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Adresa IPv4 nebo IPv6 (s maskou)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "koncová adresa" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Provozní stav tohoto rozsahu" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Primární funkce tohoto rozsahu" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Rozsah IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Rozsahy IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Počáteční a koncová verze IP adresy se musí shodovat" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Počáteční a koncová maska IP adresy se musí shodovat" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "Koncová adresa musí být větší než počáteční adresa ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Definované adresy se překrývají s rozsahem {overlapping_range} na VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Definovaný rozsah přesahuje maximální podporovanou velikost ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "adresa" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Provozní stav tohoto IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Funkční role tohoto IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (uvnitř)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "IP, pro kterou je tato adresa „vnější“ IP" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Název hostitele nebo FQDN (nerozlišuje velká a malá písmena)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP adresy" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Nelze vytvořit IP adresu s maskou /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} je síťové ID, které nemusí být přiřazeno rozhraní." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "{ip} je vysílací adresa, která nemusí být přiřazena k rozhraní." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Duplicitní adresa IP nalezena v {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Nelze znovu přiřadit adresu IP, pokud je určena jako primární IP pro " +"nadřazený objekt" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Stav SLAAC lze přiřadit pouze adresám IPv6" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "čísla portů" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "šablona služby" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "šablony služeb" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "Konkrétní IP adresy (pokud existují), na které je tato služba vázána" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "služba" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "služby" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "Službu nelze přidružit jak k zařízení, tak k virtuálnímu počítači." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Služba musí být přidružena buď k zařízení, nebo k virtuálnímu počítači." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Skupiny VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Nelze nastavit scope_type bez scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Nelze nastavit scope_id bez scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Rozsahy se nemohou překrývat." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Konkrétní místo, ke kterému je tato VLAN přiřazena (pokud existuje)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Skupina VLAN (volitelné)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerické ID VLAN (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Provozní stav této VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Primární funkce této VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9618,164 +10266,166 @@ msgstr "" "VLAN je přiřazena ke skupině {group} (oblast působnosti: {scope}); nelze " "také přiřadit k webu {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID musí být v rozmezí {ranges} pro sítě VLAN ve skupině {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "rozlišovač trasy" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Jedinečný rozlišovač tras (podle definice v RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "vynutit jedinečný prostor" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Zabraňte duplicitním předponům/IP adresám v tomto VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Cílová hodnota trasy (formátovaná v souladu s RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "cíl trasy" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "cíle trasy" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Počet stránek" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Počet poskytovatelů" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agregáty" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Přidal" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Předpony" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Využití" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Rozsahy IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Předpona (plochá)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Hloubka" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Bazén" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Označeno Využito" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Počáteční adresa" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (uvnitř)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (venku)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Přiřazeno" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Přiřazený objekt" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Typ rozsahu" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Rozsahy VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VIDIO" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Unikátní" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Importovat cíle" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Cíle exportu" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} není platná předpona. Mysleli jste {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Délka předpony musí být menší nebo rovna %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Délka předpony musí být větší nebo rovna %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9783,31 +10433,31 @@ msgstr "" "V názvech DNS jsou povoleny pouze alfanumerické znaky, hvězdičky, pomlčky, " "tečky a podtržítka" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Dětské předpony" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Dětské rozsahy" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Související IP adresy" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Rozhraní zařízení" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Rozhraní virtuálních počítačů" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Toto pole nesmí být prázdné." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9815,325 +10465,338 @@ msgstr "" "Hodnota musí být předána přímo (např. „foo“: 123); nepoužívejte slovník ani " "seznam." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} není platná volba." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Neplatný typ obsahu: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "Neplatná hodnota. Zadejte typ obsahu jako '.„." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Rozsahy musí být specifikovány ve formuláři (dolní, horní)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Hranice rozsahu musí být definovány jako celá čísla." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} musí implementovat get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Neplatné oprávnění {permission} pro model {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Tmavě červená" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "růže" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuchsiová" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Tmavě fialová" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Světle modrá" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Tmavě zelená" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Světle zelená" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Limetka" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Jantar" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Tmavě oranžová" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Hnědý" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Světle šedá" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Šedá" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Tmavě šedá" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Přímo" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Nahrát" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Automatická detekce" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Čárka" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Středník" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Záložka" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Neplatný parametr konfigurace: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Přihlašovací banner" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Další obsah k zobrazení na přihlašovací stránce" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Banner údržby" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Další obsah k zobrazení v režimu údržby" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Horní banner" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Další obsah, který se má zobrazit v horní části každé stránky" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Spodní banner" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Další obsah, který se má zobrazit v dolní části každé stránky" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Globálně jedinečný IP prostor" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Vynutit jedinečné IP adresování v globální tabulce" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Upřednostňujte IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Upřednostňujte IPv4 adresy před IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Výška regálu" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Výchozí výška jednotky pro rendrované výšky stojanu" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Šířka regálu" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Výchozí šířka jednotky pro rendrované výšky stojanu" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Napájecí napětí" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Výchozí napětí pro napájecí zdroje" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Napájecí proud" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Výchozí proud pro napájecí zdroje" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Maximální využití napájecího zdroje" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Výchozí maximální využití pro napájecí zdroje" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Povolená schémata adres URL" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Povolená schémata pro adresy URL v obsahu poskytovaném uživatelem" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Výchozí velikost stránky" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maximální velikost stránky" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Vlastní validátory" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Vlastní ověřovací pravidla (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Pravidla ochrany" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Pravidla ochrany proti mazání (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Výchozí předvolby" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Výchozí předvolby pro nové uživatele" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Režim údržby" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Povolit režim údržby" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL povoleno" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Povolte rozhraní GraphQL API" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Zachování seznamu změn" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "Dny pro uchování historie changelogu (neomezeně nastaveno na nulu)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Zachování výsledků úlohy" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Dny pro uchování historie výsledků úlohy (neomezeně nastaveno na nulu)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL mapy" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Základní adresa URL pro mapování geografických lokalit" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Částečná shoda" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Přesná shoda" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Začíná s" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Končí" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Typ (typy) objektu" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Vyhledávání" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10141,410 +10804,425 @@ msgstr "" "Označte slimáky oddělené čárkami, uzavřené dvojitými uvozovkami (např. " "„tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Přidat štítky" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Odstranit značky" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} musí zadat třídu modelu." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Neznámý název pole '{name}'v datech vlastního pole." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Neplatná hodnota pro vlastní pole '{name}„: {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Vlastní pole '{name}Musí mít jedinečnou hodnotu." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Chybí povinné vlastní pole '{name}„." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Vzdálený zdroj dat" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "datová cesta" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Cesta ke vzdálenému souboru (vzhledem k kořenovému zdroji dat)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "automatická synchronizace povolena" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Povolit automatickou synchronizaci dat při aktualizaci datového souboru" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "datum synchronizováno" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} musí implementovat metodu sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organizace" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Skupiny webů" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Skupiny nájemců" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Skupiny kontaktů" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Kontaktní role" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Kontaktní přiřazení" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Role stojanu" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Nadmořská výška" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Typy stojanů" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Moduly" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Kontexty virtuálních zařízení" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Výrobci" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Komponenty zařízení" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Role položek inventáře" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Spojení" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kabely" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Bezdrátové spoje" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Připojení rozhraní" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Připojení konzoly" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Napájecí připojení" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Skupiny bezdrátových sítí" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Role síťových rozsahů a VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Rozsahy ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Skupiny VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Šablony služeb" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Služby" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunely" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Skupiny tunelů" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Zakončení tunelů" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Zakončení" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Návrhy IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Zásady IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Návrhy IPsec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Zásady protokolu IPsec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Profily IPsec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Virtuální disky" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Typy klastrů" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Skupiny klastrů" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Typy obvodů" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Skupiny obvodů" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Skupinové úkoly" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Ukončení obvodů" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Poskytovatelé" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Účty poskytovatele" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Sítě poskytovatelů" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Napájecí panely" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Konfigurace" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Kontexty konfigurace" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Konfigurační šablony" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Přizpůsobení" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Vlastní pole" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Volby uživatelských polí" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Vlastní odkazy" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Exportovat šablony" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Uložené filtry" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Přílohy obrázků" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operace" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integrace" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Zdroje dat" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Pravidla události" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooky" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Pracovní místa" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Protokolování" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Skupiny oznámení" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Záznamy deníku" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Protokol změn" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Administrátor" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Tokeny API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Oprávnění" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Systém" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Pluginy" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Historie konfigurace" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Úkoly na pozadí" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Oprávnění musí být předána jako dvojice nebo seznam." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Tlačítka musí být předána jako dvojice nebo seznam." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Barva tlačítka musí být volbou z ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10552,7 +11230,7 @@ msgid "" msgstr "" "Třída PluginTemplateExtension {template_extension} byl předán jako instance!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10560,193 +11238,194 @@ msgid "" msgstr "" "{template_extension} není podtřídou Netbox.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} musí být instancí Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} musí být instancí Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} musí být instancí Netbox.Plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context musí být slovník" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Navigace HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Povolit dynamickou navigaci uživatelským rozhraním" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Experimentální funkce" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Jazyk" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Vynucuje překlad uživatelského rozhraní do zadaného jazyka" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Podpora překladu byla lokálně zakázána" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Délka stránky" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Výchozí počet objektů, které se mají zobrazit na stránce" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Umístění stránkování" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Dole" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Nahoře" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Obojí" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Kde budou ovládací prvky stránkování zobrazeny vzhledem k tabulce" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Formát dat" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Preferovaná syntaxe pro zobrazení obecných dat v uživatelském rozhraní" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Neplatné úložiště: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Po inicializaci nelze do registru přidat úložiště" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Nelze odstranit obchody z registru" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Čeština" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Dánština" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Němčina" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Angličtina" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Španělština" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Francouzština" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italština" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japonština" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Holandština" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Polština" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Portugalština" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Ruština" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Turečtina" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ukrajinština" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Čínština" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Vybrat vše" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Přepnout vše" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Přepnout rozevírací nabídku" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Chyba" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} nenalezeno" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Pole" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Hodnota" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Dummy Plugin" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10754,56 +11433,56 @@ msgid "" msgstr "" "Při vykreslování vybrané šablony exportu došlo k chybě ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Řádek {i}: Objekt s ID {id} neexistuje" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Ne {object_type} Byly vybrány." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Přejmenováno {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Vymazáno {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Seznam změn" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "věstníku" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Nelze synchronizovat data: Žádný datový soubor není nastaven." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Synchronizovaná data pro {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Synchronizováno {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} musí implementovat get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10811,702 +11490,744 @@ msgstr "" "Při načítání konfigurace řídicího panelu došlo k chybě. Používá se výchozí " "řídicí panel." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Přístup odepřen" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Nemáte oprávnění k přístupu na tuto stránku" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Stránka nenalezena" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Požadovaná stránka neexistuje" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Chyba serveru" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "Došlo k problému s vaší žádostí. Obraťte se prosím na administrátora" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Úplná výjimka je uvedena níže" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Verze Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Verze NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Není nainstalován" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Pokud je vyžadována další pomoc, pošlete prosím příspěvek na" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox diskusní fórum" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "na GitHubu" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Domovská stránka" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Oznámení" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Předplatné" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Předvolby" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Změnit heslo" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Zrušit" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Uložit" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Konfigurace tabulky" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Vymazat předvolby tabulky" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Přepnout vše" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "tabulka" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Objednávání" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Sloupce" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Žádný nenalezen" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Profil uživatele" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Podrobnosti o účtu" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-mailem" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Účet vytvořený" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Poslední přihlášení" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superuživatel" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Zaměstnanci" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Přiřazené skupiny" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Žádný" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Nedávná aktivita" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Moje tokeny API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Žeton" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Zapisování povoleno" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Naposledy použitý" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Přidání žetonu" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Domov" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox motiv" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox Logo" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Dokumentace" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Dokumentace REST API" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Podpora NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Zdrojový kód" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Komunita" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Datum instalace" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Datum ukončení" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Přiřadit skupinu" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Ukončení výměnných obvodů" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Vyměňte tato zakončení za obvod %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Strana" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Strana Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Přiřadit obvod" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Přiřazení skupiny obvodů" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Přidat obvod" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Typ obvodu" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Přidat" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Upravit" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Výměna" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Označeno jako připojeno" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "do" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Stopa" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Upravit kabel" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Odstraňte kabel" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Odpojit" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Připojit" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Po proudu" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Nad proudem" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Křížové připojení" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Patch panel/port" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Přidat obvod" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Účet poskytovatele" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Konfigurační data" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Komentář" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Obnovit" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parametr" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Aktuální hodnota" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nová hodnota" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Změněno" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Velikost" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bajtů" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synchronizovat" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Naposledy synchronizováno" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Nebyly definovány žádné parametry" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Soubory" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Výšky stojanů" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Výchozí výška jednotky" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Výchozí šířka jednotky" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Napájecí zdroje" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Výchozí napětí" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Výchozí proud" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Výchozí maximální využití" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Vynutit globální jedinečnost" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Počet stránek" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Maximální velikost stránky" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Uživatelské preference" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Zachování pracovních míst" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Práce" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Vytvořil" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Plánování" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "každá %(interval)s minut" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Změna" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Rozdíl" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Předchozí" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Další" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Vytvořený objekt" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objekt odstraněn" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Žádné změny" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Data před změnou" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "Upozornění: Porovnání neatomové změny s předchozím záznamem změny" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Údaje po změně" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Zobrazit vše %(count)s Mění" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Změnit uchovávání protokolu" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "dní" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Neurčitý" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Není nainstalován" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Přehled" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Nainstalovat" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Podrobnosti o pluginu" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Souhrn" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licence" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Historie verzí" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Pokyny k místní instalaci" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Fronty na pozadí" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Konfigurovat tabulku" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Zastavit" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Požadavek" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Zapojte se do fronty" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Fronta" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Časový limit" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Výsledek TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumenty" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argumenty klíčových slov" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Závisí na" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Výjimka" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "úkoly v " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Úlohy ve frontě" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11514,381 +12235,399 @@ msgstr "" "Vybrat všichni %(count)s %(object_type_plural)s " "odpovídající dotaz" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informace o pracovníkovi" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Pracovník" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Fronty" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Aktuální úloha" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Počet úspěšných úloh" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Počet neúspěšných úloh" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Celková pracovní doba" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "sekund" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Pracovníci na pozadí" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Pracovníci v %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Export" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Stav systému" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Vydání NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Verze Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL verze" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Název databáze" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Velikost databáze" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Nedostupné" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Pracovníci RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "výchozí fronta" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Systémový čas" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Aktuální konfigurace" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Jste si jisti, že je chcete odpojit %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Trace kabelů pro %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Stáhnout SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Asymetrická cesta" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "Níže uvedené uzly nemají žádné odkazy a vedou k asymetrické cestě" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Rozdělení cesty" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Chcete-li pokračovat, vyberte uzel níže" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Sledování dokončeno" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Celkem segmentů" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Celková délka" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Nebyly nalezeny žádné cesty" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Související cesty" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Původ" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Cíl" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmenty" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "neúplný" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Přejmenovat vybrané" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Není připojen" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Zvýrazněte zařízení v stojanu" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Není v racku" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS souřadnice" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Mapa" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Značka majetku" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Zobrazit virtuální šasi" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Vytvořit VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Řízení" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT pro" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "THE NIGHT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Využití energie" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Vstup" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Výstupy" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Přiděleno" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "větev" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Přidat službu" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Přidat komponenty" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Přidání portů konzoly" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Přidání portů konzolového serveru" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Přidání pozic zařízení" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Přidat přední porty" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Skrýt Povoleno" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Skrýt Zakázáno" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Skrýt virtuální" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Skrýt odpojeno" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Přidat rozhraní" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Přidat položku inventáře" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Přidat pozice modulů" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Přidejte elektrické zásuvky" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Přidat napájecí port" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Přidat zadní porty" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Konfigurace" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Kontextová data" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Rendrovaná konfigurace" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Ke stažení" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Nebyla nalezena žádná šablona konfigurace" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Mateřská zátoka" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Přegenerovat slug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Odstranit" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Kontextová data místní konfigurace" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Přejmenovat" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Rozložení zařízení" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Nainstalované zařízení" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Odstranit %(device)s od %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11897,430 +12636,449 @@ msgstr "" "Jste si jisti, že chcete odstranit %(device)s od " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Obývat" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Záliv" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Přidat zařízení" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Role virtuálního počítače" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Název modelu" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Číslo dílu" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Vyloučit z využití" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Rodič/Dítě" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Přední obrázek" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Zadní obraz" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Pozice zadního portu" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Označeno jako Připojeno" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Stav připojení" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Strana A" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Strana B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Žádné ukončení" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Označit plánované" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Označit nainstalovaný" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Stav cesty" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Nedostižitelný" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Koncové body cesty" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Není připojen" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Neznačeno" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Nebyly přiřazeny žádné sítě VLAN" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Průhledná" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Vymazat vše" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Hloubka montáže" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Startovací jednotka" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Sestupné jednotky" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Výška stojanu" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Přidat podřízené rozhraní" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Rychlost/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Režim PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Typ PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Režim 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC adresa" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Bezdrátové spojení" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanál" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Frekvence kanálu" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Šířka kanálu" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Členové MAS" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Žádná členská rozhraní" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Přidat IP adresu" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Nadřazená položka" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "ID součásti" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Přidat podřízenou polohu" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Umístění dětí" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Přidání místa" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Přidání zařízení" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Přidat typ zařízení" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Přidat typ modulu" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Připojené zařízení" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Využití (přiděleno" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Elektrické charakteristiky" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Krmná noha" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Přidání napájecích zdrojů" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Maximální losování" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Přidělené losování" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Využití prostoru" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Hmotnost stojanu" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maximální hmotnost" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Celková hmotnost" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Obrázky a štítky" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Pouze obrázky" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Pouze štítky" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Přidat rezervaci" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Zobrazit seznam" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Vyberte zobrazení stojanu" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Seřadit podle" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Nebyly nalezeny žádné stojany" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Zobrazení výšek" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Podrobnosti o rezervaci" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Přidat stojan" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Pozice" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Přidat web" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Dětské regiony" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Přidat region" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Časové pásmo" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Čas webu" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Fyzická adresa" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Doručovací adresa" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Skupiny dětí" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Přidat skupinu webů" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Příloha" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Přidat člena" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Členská zařízení" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Přidání nového člena do virtuálního šasi %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Přidat nového člena" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Akce" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Uložit a přidat další" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Úpravy virtuálního šasi %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Stojan/jednotka" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Odebrat člena virtuálního šasi" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12329,11 +13087,12 @@ msgstr "" "Jste si jisti, že chcete odstranit %(device)s z virtuálního" " šasi %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identifikátor" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12341,11 +13100,11 @@ msgstr "" "Během tohoto požadavku došlo k chybě importu modulu. Mezi běžné příčiny " "patří následující:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Chybí požadované balíčky" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12361,11 +13120,11 @@ msgstr "" "spusťte zmrazení pipů z konzoly a porovnejte výstup se seznamem" " požadovaných balíčků." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Služba WSGI nebyla restartována po upgradu" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12375,7 +13134,7 @@ msgstr "" "restartována služba WSGI (např. gunicorn nebo uWSGi). Tím je zajištěno, že " "nový kód je spuštěn." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12383,11 +13142,11 @@ msgstr "" "Při zpracování tohoto požadavku byla zjištěna chyba oprávnění k souboru. " "Mezi běžné příčiny patří následující:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Nedostatečné oprávnění k zápisu do kořenového adresáře média" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12398,7 +13157,7 @@ msgstr "" "uživatel NetBox běží tak, jak má přístup k zápisu souborů do všech umístění " "v rámci této cesty." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12406,11 +13165,11 @@ msgstr "" "Při zpracování tohoto požadavku byla zjištěna chyba programování databáze. " "Mezi běžné příčiny patří následující:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Chybí migrace databáze" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12420,11 +13179,11 @@ msgstr "" "možné použít všechny nové migrace databáze. Migrace můžete spouštět ručně " "provedením python3 manage.py migrovat z příkazového řádku." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Nepodporovaná verze PostgreSQL" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12434,99 +13193,102 @@ msgstr "" "zkontrolovat připojením k databázi pomocí přihlašovacích údajů NetBoxu a " "zadáním dotazu na VYBERTE VERZI ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Datový soubor přidružený k tomuto objektu byl smazán" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Synchronizovaná data" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Synchronizace dat" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Parametry prostředí" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Šablona" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Název skupiny" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Musí být jedinečný" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Klonovatelný" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Výchozí hodnota" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Hledat Hmotnost" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filtrování logiky" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Hmotnost displeje" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Uživatelské rozhraní viditelné" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Upravitelné uživatelské rozhraní" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Ověřovací pravidla" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Regulární výraz" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Třída tlačítek" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Přiřazené modely" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Text odkazu" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL odkazu" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Obnovit řídicí panel" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12534,7 +13296,7 @@ msgstr "" "Tím se odstraní všichni nakonfigurované widgety a obnovení " "výchozí konfigurace řídicího panelu." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12542,159 +13304,161 @@ msgstr "" "Tato změna se týká pouze váš řídicí panel, a nebude mít vliv na " "ostatní uživatele." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "konfigurace widgetu" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Zavřít widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Přidání widgetu" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Zatím nebyly přidány žádné záložky." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Žádné povolení" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Žádné oprávnění k prohlížení tohoto obsahu" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Nelze načíst obsah. Neplatný název pohledu" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Nebyl nalezen žádný obsah" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Při načítání kanálu RSS došlo k problému" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Podmínky" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Typ MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Přípona souboru" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Naplánováno na" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Doba trvání" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Souhrn testu" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Protokol" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Výstup" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Načítání" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Výsledky čekají na vyřízení" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Zápis do deníku" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Skupina oznámení" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Žádné přiřazení" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Místní kontext konfigurace přepíše všechny zdrojové kontexty" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Zdrojové kontexty" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nová položka deníku" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Zpráva" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Nemáte oprávnění spouštět skripty" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Spustit skript" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Chyba při načítání skriptu" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Skript již ve zdrojovém souboru neexistuje." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Poslední běh" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Skript již není přítomen ve zdrojovém souboru" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Nikdy" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Spustit znovu" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Nenalezeny žádné skripty" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12703,81 +13467,83 @@ msgstr "" "Začít od vytvoření skriptu z nahraného" " souboru nebo zdroje dat." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Výsledky" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Prahová hodnota protokolu" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Vše" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Označené položky" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Povolené typy objektů" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Jakýkoliv" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Typy označených položek" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Označené objekty" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Metoda HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Typ obsahu HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Ověření SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Další záhlaví" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Šablona těla" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Hromadná tvorba" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Vybrané objekty" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "přidat" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Hromadné mazání" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Potvrdit hromadné smazání" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12787,64 +13553,67 @@ msgstr "" "Následující operace bude smazána %(count)s %(type_plural)s." " Pečlivě zkontrolujte vybrané objekty a potvrďte tuto akci." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Editace" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Hromadné úpravy" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Aplikujte" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Hromadný import" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Přímý import" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Nahrát soubor" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Předložit" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Možnosti pole" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Přídavný" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "volby" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Hodnota importu" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Formát: RRRR-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Zadejte pravdivé nebo nepravdivé" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "Povinná pole musí Určeno pro všechny objekty." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12854,15 +13623,15 @@ msgstr "" "Například, %(example)s by identifikoval VRF podle jeho " "rozlišovače tras." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Hromadné odstranění" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Potvrdit hromadné odstranění" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12873,72 +13642,72 @@ msgstr "" "%(parent_obj)s. Pečlivě si prosím přečtěte %(obj_type_plural)s bude " "odstraněn a potvrzen níže." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Odstraňte tyto %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Přejmenování" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Hromadné přejmenování" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Aktuální jméno" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nový název" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Náhled" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Jsi si jistý" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Potvrdit" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Upravit vybrané" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Odstranit vybrané" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Přidat nový %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Zobrazit dokumentaci modelu" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Pomoc" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Vytvořit a přidat další" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtry" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -12947,40 +13716,40 @@ msgstr "" "Vybrat všichni %(count)s " "%(object_type_plural)s odpovídající dotaz" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nová verze k dispozici" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "je k dispozici" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Pokyny k upgradu" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Odemknout řídicí panel" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Uzamknout řídicí panel" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Přidat widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Uložit rozvržení" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Potvrdit odstranění" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -12989,40 +13758,40 @@ msgstr "" "Jsi si jistá, že chceš smazat " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "V důsledku této akce budou odstraněny následující objekty." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "před" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Žádná nepřečtená oznámení" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Všechna oznámení" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Vybrat" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Obnovit" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Povolit tmavý režim" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Povolit světelný režim" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13031,281 +13800,283 @@ msgstr "" "Než budete moci přidat %(model)s Nejprve musíte vytvořit " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Výběr stránky" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Zobrazeno %(start)s-%(end)s z %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Možnosti stránkování" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Na stránku" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Připojit obrázek" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Související objekty" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Žádné tagy nejsou přiřazeny" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Data nejsou synchronizována s upstream souborem" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Rychlé vyhledávání" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Uložený filtr" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Jasné objednávání" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centrum nápovědy" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Správce Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Odhlásit se" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Přihlásit se" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Rodina" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Datum přidání" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Přidat předponu" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Číslo AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Typ ověřování" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Ověřovací klíč" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Virtuální IP adresy" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Přiřadit IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Hromadné vytváření" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Vytvořit skupinu" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Virtuální IP" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Zobrazit přiřazené" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Zobrazit Dostupné" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Zobrazit vše" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globální" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (vnější)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Přiřaďte IP adresu" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Vyberte IP adresu" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Výsledky vyhledávání" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Hromadné přidávání IP adres" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Počáteční adresa" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Koncová adresa" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Označeno plně využito" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Podrobnosti o adresování" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Dětské IP adresy" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Dostupné IP adresy" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "První dostupná IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Podrobnosti o předponě" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Síťová adresa" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Síťová maska" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Zástupná maska" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Adresa vysílání" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Přidat rozsah IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Skrýt indikátory hloubky" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Maximální hloubka" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Maximální délka" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Přidat agregát" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Import souborů VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Export souborů VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Import L2VPN" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Export L2VPN" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Přidání předpony" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Přidat VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Rozlišovač tras" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Unikátní IP prostor" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Chyby" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Přihlásit se" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Nebo" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Selhání statického média - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Selhání statického média" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Následující soubor statického média se nepodařilo načíst" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Zkontrolujte následující" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13315,7 +14086,7 @@ msgstr "" "Tím se nainstaluje nejnovější iterace každého statického souboru do statické" " kořenové cesty." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13326,7 +14097,7 @@ msgstr "" "obsluhovala soubory z STATIC_ROOT cesta. Odkaz na instalační dokumentace pro další vedení." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13335,548 +14106,571 @@ msgstr "" "Soubor %(filename)s existuje ve statickém kořenovém adresáři a " "je čitelný serverem HTTP." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Klepněte na tlačítko tady pokusit se znovu " "načíst NetBox." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Kontaktovat" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Název" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefon" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Kontaktní skupina" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Přidat skupinu kontaktů" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Kontaktní role" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Přidání kontaktu" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Přidat nájemce" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Skupina nájemců" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Přidat skupinu nájemců" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Přiřazená oprávnění" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Povolení" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Pohled" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Omezení" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Přiřazení uživatelé" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Přidělené zdroje" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Virtuální procesory" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Paměť" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Místo na disku" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Přidat virtuální počítač" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Přiřadit zařízení" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Odstranit vybrané" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Přidání zařízení do clusteru %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Výběr zařízení" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Přidat zařízení" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Přidat cluster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Skupina klastru" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Typ clusteru" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Virtuální disk" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Zdroje" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Přidat virtuální disk" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Zásady IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Verze IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Předsdílený klíč" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Zobrazit tajemství" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Návrhy" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Návrh IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Metoda ověřování" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Šifrovací algoritmus" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algoritmus ověřování" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Skupina DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Životnost SA (sekundy)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Zásady IPsec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Skupina PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Profil IPsec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Skupina PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Návrh protokolu IPsec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Životnost SA (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN Atributy" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Přidat ukončení" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Přidat ukončení" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Zapouzdření" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Profil IPsec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "ID tunelu" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Přidat tunel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Skupina tunelů" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Ukončení tunelu" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Mimo IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Ukončení vrstevníků" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Šifra" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Připojená rozhraní" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Přidat bezdrátovou síť LAN" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Skupina bezdrátové sítě LAN" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Přidat skupinu bezdrátové sítě LAN" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Vlastnosti odkazu" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Vzdálenost" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Rodičovská kontaktní skupina (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Rodičovská kontaktní skupina (slimák)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Kontaktní skupina (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Kontaktní skupina (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Kontakt (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Kontaktní role (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Kontaktní role (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Kontaktní skupina" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Nadřazená skupina nájemců (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Nadřazená skupina nájemců (slimák)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Skupina nájemců (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Skupina nájemců (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Skupina nájemců (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Descipace" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Přiřazený kontakt" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "kontaktní skupina" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "kontaktní skupiny" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "kontaktní role" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "kontaktní role" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "titul" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mailem" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "odkaz" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "kontaktovat" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "kontakty" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "přiřazení kontaktů" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "kontaktní přiřazení" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Kontakty nelze přiřadit k tomuto typu objektu ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "skupina nájemců" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "skupiny nájemců" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Název nájemce musí být pro každou skupinu jedinečný." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Slimák nájemce musí být jedinečný pro každou skupinu." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "podnájemník" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "nájemníci" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Název kontaktu" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Kontaktní telefon" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Kontaktní e-mail" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Kontaktní adresa" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Kontakt Odkaz" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Kontakt Popis" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Povolení (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Skupina oznámení (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Křestní jméno" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Příjmení" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Stav zaměstnanců" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Stav superuživatele" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Pokud není zadán žádný klíč, bude vygenerován automaticky." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Je personál" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Je Superuser" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Může zobrazit" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Může přidat" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Může se změnit" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Může smazat" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Uživatelské rozhraní" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13886,7 +14680,7 @@ msgstr "" "klíč před odesláním tohoto formuláře, protože po vytvoření tokenu " "již nemusí být přístupný." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13896,31 +14690,31 @@ msgstr "" "omezení. Příklad: 10.1.1.0/24,192.168.10.16/32,2001: db 8:1: " ":/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Potvrdit heslo" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Pro ověření zadejte stejné heslo jako dříve." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "Hesla se neshodují! Zkontrolujte prosím svůj vstup a zkuste to znovu." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Další akce" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Opatření udělená navíc k výše uvedeným opatřením" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objekty" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -13930,76 +14724,76 @@ msgstr "" "hodnotu null, aby odpovídala všem objektům tohoto typu. Seznam více objektů " "bude mít za následek logickou operaci OR." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Musí být vybrána alespoň jedna akce." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Neplatný filtr pro {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Seznam akcí udělených tímto povolením" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "omezení" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtr Queryset odpovídající použitelným objektům vybraného typu (typů)" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "povolení" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "oprávnění" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "uživatelské preference" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Klíč '{path}'je listový uzel; nelze přiřadit nové klíče" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "Klíč '{path}'je slovník; nelze přiřadit jinou hodnotu než slovník" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "vyprší" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "naposledy použitý" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "klíč" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "zapisování povoleno" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "Povolit vytváření, aktualizace/odstranění operací pomocí tohoto klíče" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "povolené adresy IP" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14007,42 +14801,42 @@ msgstr "" "Povolené sítě IPv4/IPv6, ze kterých lze token použít. Ponechte prázdné bez " "omezení. Příklad: „10.1.1.0/24, 192.168.10.16/32, 2001: DB 8:1: :/64“" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "žeton" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "žetony" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "skupina" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "uživatel" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Uživatel s tímto uživatelským jménem již existuje." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Vlastní akce" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Související objekt nebyl nalezen pomocí poskytnutých atributů: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Více objektů odpovídá zadaným atributům: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14051,42 +14845,42 @@ msgstr "" "Související objekty musí být odkazovány číselným ID nebo slovníkem atributů." " Obdržela nerozpoznanou hodnotu: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "Související objekt nebyl nalezen pomocí zadaného číselného ID: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} má definovaný klíč, ale CHOICES není seznam" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Hmotnost musí být kladné číslo" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Neplatná hodnota '{weight}'pro hmotnost (musí být číslo)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Neznámá jednotka {unit}. Musí to být jedna z následujících položek: " "{valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Délka musí být kladné číslo" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Neplatná hodnota '{length}'pro délku (musí být číslo)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14095,15 +14889,15 @@ msgstr "" "Nelze smazat {objects}. {count} byly nalezeny závislé " "objekty: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Více než 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "RGB barva v hexadecimálním formátu. Příklad: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14112,7 +14906,7 @@ msgstr "" "%s(%r) je neplatný. parametr to_model pro CounterCacheField musí být řetězec" " ve formátu 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14121,36 +14915,36 @@ msgstr "" "%s(%r) je neplatný. parametr to_field pro CounterCacheField musí být řetězec" " ve formátu 'field'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Zadejte objektová data ve formátu CSV, JSON nebo YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Oddělovač CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Znak, který vymezuje pole CSV. Platí pouze pro formát CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "Data formuláře musí být při nahrávání/výběru souboru prázdná." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Neznámý formát dat: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Nelze zjistit formát dat. Prosím upřesněte." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Neplatný oddělovač CSV" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14158,7 +14952,7 @@ msgstr "" "Neplatná data YAML. Údaje musí být ve formě více dokumentů nebo jednoho " "dokumentu obsahujícího seznam slovníků." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14167,7 +14961,7 @@ msgstr "" "Neplatný seznam ({value}). Musí být číselné a rozsahy musí být ve vzestupném" " pořadí." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14175,7 +14969,7 @@ msgstr "" "Určete jeden nebo více číselných rozsahů oddělených čárkami. Příklad: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14183,17 +14977,18 @@ msgstr "" "Neplatné rozsahy ({value}). Musí to být rozsah celých čísel ve vzestupném " "pořadí." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Neplatná hodnota pro pole s více možnostmi volby: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objekt nenalezen: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14201,20 +14996,20 @@ msgid "" msgstr "" "„{value}„není jedinečná hodnota pro toto pole; bylo nalezeno více objektů" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "„{field_name}„je neplatný název pole pro přístup." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Typ objektu musí být zadán jako“.„" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Neplatný typ objektu" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14224,7 +15019,7 @@ msgstr "" "případy a typy v rámci jednoho rozsahu nejsou podporovány (příklad: " "[ge, xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14232,7 +15027,7 @@ msgstr "" "Zadejte číselný rozsah pro vytvoření více adres IP.
    Příklad: " "192,0,2. [1,5100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown Syntaxe je podporována" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Unikátní zkratka vhodná pro URL" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "Zadejte kontextová data do JSON Formát." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC adresa musí být ve formátu EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Používejte regulární výrazy" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Číselné ID existujícího objektu, který se má aktualizovat (pokud nevytvoříte" " nový objekt)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Nerozpoznaná hlavička: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Dostupné sloupce" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Vybrané sloupce" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14285,13 +15080,13 @@ msgstr "" "Tento objekt byl od vykreslování formuláře změněn. Podrobnosti naleznete v " "protokolu změn objektu." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Rozsah“{value}„je neplatný." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14300,68 +15095,68 @@ msgstr "" "Neplatný rozsah: Koncová hodnota ({end}) musí být větší než počáteční " "hodnota ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Duplicitní nebo konfliktní záhlaví sloupce pro“{field}„" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Duplicitní nebo konfliktní záhlaví sloupce pro“{header}„" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Řádek {row}: Očekávané {count_expected} sloupce, ale nalezeny {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Neočekávané záhlaví sloupce“{field}„nalezeno." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Sloupec“{field}„není příbuzný objekt; nelze použít tečky" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Neplatný atribut souvisejícího objektu pro sloupec“{field}„: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Požadovaná záhlaví sloupce“{header}„nenalezeno." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Chybí požadovaná hodnota pro parametr dynamického dotazu: '{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Chybí požadovaná hodnota pro parametr statického dotazu: '{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Heslo musí obsahovat alespoň jednu číslici." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Heslo musí obsahovat alespoň jedno velké písmeno." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Heslo musí obsahovat alespoň jedno malé písmeno." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14369,7 +15164,7 @@ msgstr "" "Vaše heslo musí obsahovat alespoň jednu číslici, jedno velké písmeno a jedno" " malé písmeno." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14378,126 +15173,126 @@ msgstr "" "Neplatný název oprávnění: {name}. Musí být ve formátu " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Neznámý app_label/model_name pro {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Neplatná IP adresa nastavená pro {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Sloupec s názvem {name} je již definován pro tabulku {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Nedefinováno" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Zrušit záložku" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Záložka" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Klon" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Aktuální pohled" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Veškerá data" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Přidat šablonu exportu" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importovat" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Odhlásit" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Přihlásit" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Kopírovat do schránky" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Toto pole je povinné" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Nastavit Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Vymazat vše" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Konfigurace tabulky" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Pohyb nahoru" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Přesuňte se dolů" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Hledat..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Hledat NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Otevřít selektor" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Napsat" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Test musí definovat csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} Není platným regulárním výrazem." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} musí implementovat get_required_permissions ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} musí implementovat get_required_permissions ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14506,61 +15301,63 @@ msgstr "" "{class_name} nemá definovanou sadu dotazů. ObjectPermissionRequiredMixin lze" " použít pouze v pohledech, které definují základní sadu dotazů" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Nadřazená skupina (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Rodičovská skupina (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Typ clusteru (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Klastr (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "VCPU" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Paměť (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Typ clusteru" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Přiřazená skupina clusteru" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Přiřazený cluster" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Přiřazené zařízení v rámci clusteru" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Sériové číslo" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14568,50 +15365,50 @@ msgid "" msgstr "" "{device} patří k jinému webu ({device_site}) než cluster ({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Volitelně připojte tento virtuální počítač ke konkrétnímu hostitelskému " "zařízení v rámci clusteru" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Lokalita/Klastr" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "Velikost disku je spravována připojením virtuálních disků." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disk" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "typ clusteru" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "typy clusterů" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "klastrová skupina" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "klastrové skupiny" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "shluk" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "shluky" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14620,48 +15417,48 @@ msgstr "" "{count} zařízení jsou přiřazena jako hostitelé pro tento cluster, ale nejsou" " na webu {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "Paměť (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disk (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Název virtuálního počítače musí být jedinečný pro každý cluster." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "virtuální stroj" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "virtuální stroje" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Virtuální počítač musí být přiřazen k webu a/nebo clusteru." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "Vybraný cluster ({cluster}) není přiřazen k tomuto webu ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Při přiřazování hostitelského zařízení je nutné zadat cluster." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" "Vybrané zařízení ({device}) není přiřazen k tomuto clusteru ({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14670,17 +15467,17 @@ msgstr "" "Zadaná velikost disku ({size}) musí odpovídat souhrnné velikosti přiřazených" " virtuálních disků ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Musí to být IPV{family} adresa. ({ip} je IPV{version} adresa.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Zadaná adresa IP ({ip}) není přiřazen k tomuto virtuálnímu počítači." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14689,7 +15486,7 @@ msgstr "" "Vybrané nadřazené rozhraní ({parent}) patří k jinému virtuálnímu počítači " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14698,7 +15495,7 @@ msgstr "" "Vybrané rozhraní můstku ({bridge}) patří k jinému virtuálnímu počítači " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14707,392 +15504,415 @@ msgstr "" "Neznačená VLAN ({untagged_vlan}) musí patřit ke stejnému webu jako nadřazený" " virtuální stroj rozhraní, nebo musí být globální." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "velikost (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "virtuální disk" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "virtuální disky" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Přidal {count} zařízení do clusteru {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Odstraněno {count} zařízení z clusteru {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Přeprava" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP v IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GREE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Rozbočovač" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Mluvil" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agresivní" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Hlavní" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Předsdílené klíče" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certifikáty" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Podpisy RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Podpisy DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Skupina {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernetová soukromá síť LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Ethernetová virtuální privátní síť LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernetový soukromý strom" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Virtuální privátní strom Ethernetu" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Skupina tunelů (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Skupina tunelů (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Profil IPsec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Profil IPsec (název)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunel (název)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Vnější IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Zásady IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Zásady IKE (název)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Zásady IPsec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Zásada IPsec (název)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Rozhraní virtuálního počítače (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (název)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Skupina tunelů" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Životnost SA" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Předsdílený klíč" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Zásady IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Zásady IPsec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Zapouzdření tunelu" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Provozní role" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Nadřazené zařízení přiřazeného rozhraní" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Nadřazený VM přiřazeného rozhraní" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Rozhraní zařízení nebo virtuálního stroje" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Návrhy IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Skupina Diffie-Hellman pro Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Návrhy IPsec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protokol IPsec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Typ L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Rodičovské zařízení (pro rozhraní)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Nadřazený virtuální stroj (pro rozhraní)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Přiřazené rozhraní (zařízení nebo VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Nelze importovat zakončení rozhraní zařízení a virtuálního počítače " "současně." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Každé ukončení musí specifikovat rozhraní nebo VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Nelze přiřadit rozhraní i VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE verze" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Návrh" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Typ přiřazeného objektu" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Rozhraní tunelu" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "První ukončení" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Druhé ukončení" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Tento parametr je vyžadován při definování ukončení." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Politika" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Ukončení musí specifikovat rozhraní nebo VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "Ukončení může mít pouze jeden ukončující objekt (rozhraní nebo VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "šifrovací algoritmus" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "ověřovací algoritmus" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ID skupiny Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Životnost asociace zabezpečení (v sekundách)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Návrh IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Návrhy IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "verze" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "návrhy" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "předsdílený klíč" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Zásady IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Režim je vyžadován pro vybranou verzi IKE" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Režim nelze použít pro vybranou verzi IKE" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "šifrování" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "autentizace" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Životnost asociace zabezpečení (v sekundách)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Životnost asociace zabezpečení (v kilobajtech)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Návrh protokolu IPsec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Návrhy IPsec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Musí být definován šifrovací a/nebo ověřovací algoritmus" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Zásady protokolu IPsec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Profily IPsec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Ukončení L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Ukončení L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Ukončení L2VPN je již přiřazeno ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15101,186 +15921,194 @@ msgstr "" "{l2vpn_type} L2VPN nemohou mít více než dvě zakončení; nalezeno " "{terminations_count} již definované." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "tunelová skupina" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "tunelové skupiny" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "zapouzdření" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ID tunelu" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunely" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Objekt může být ukončen pouze v jednom tunelu najednou." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "zakončení tunelu" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "zakončení tunelu" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} je již připojen k tunelu ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Metoda ověřování" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Šifrovací algoritmus" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algoritmus ověřování" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Životnost SA" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Předsdílený klíč" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Životnost SA (sekundy)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Životnost SA (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Nadřazený objekt" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Objektová lokalita" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Přístupový bod" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Stanice" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Otevřeno" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "Osobní WPA (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "Podnikové WPA" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Ověřovací šifra" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Jednotka vzdálenosti" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Přemostěná VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Rozhraní A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Rozhraní B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Strana B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "ověřovací šifra" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "skupina bezdrátových sítí LAN" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "skupiny bezdrátových sítí LAN" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "bezdrátová síť LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "rozhraní A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "rozhraní B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "vzdálenost" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "jednotka vzdálenosti" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "bezdrátové spojení" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "bezdrátové spoje" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "Při nastavování bezdrátové vzdálenosti je nutné zadat jednotku" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} není bezdrátové rozhraní." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Neplatná hodnota kanálu: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Neplatný atribut kanálu: {name}" diff --git a/netbox/translations/da/LC_MESSAGES/django.mo b/netbox/translations/da/LC_MESSAGES/django.mo index 338255ed65af41400b36ff1bff5bad7fc67193f2..ea7f83ac38e0e50b6903fdc9ae8fe0b96ccf6d28 100644 GIT binary patch delta 65979 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 delta 66349 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" msgstr "Nuværende værdi: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (standard)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "tid" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "brugernavn" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "forespørgsels-id" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "handling" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "data forud for ændring" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "data efter ændring" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "objektændring" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "objektændringer" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "Ændringslogføring understøttes ikke for denne objekttype ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "oprettet" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "kommentar" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "konfigurationsdata" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "konfigurationsrevision" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "konfigurationsrevisioner" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Standardkonfiguration" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Nuværende konfiguration" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Konfigurationsrevision #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "type" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "aktiveret" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignorere regler" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Mønstre (en pr. linje), der matcher filer, der skal ignoreres ved " "synkronisering" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parametre" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "sidst synkroniseret" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "datakilde" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "datakilder" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Ukendt backend-type: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Synkronisering kan ikke startes. Synkronisering er allerede i gang." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1894,1221 +2160,1283 @@ msgstr "" "Der opstod en fejl ved initialisering af backend. En afhængighed skal " "installeres: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "sidst opdateret" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "sti" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Filsti i forhold til datakildens rod" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "størrelse" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "hash" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Længden skal være 64 hexadecimale tegn." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256-hash af fildataene" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "datafil" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "datafiler" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "automatisk synkroniseringsrekord" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "automatisk synkronisering af poster" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "root-fil" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "filsti" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Filsti i forhold til den angivne rodsti" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "administreret fil" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "administrerede filer" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "planlagt" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "interval" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Gentagelsesinterval (i minutter)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "startede" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "afsluttet" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "data" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "fejl" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "job-ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "job" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "stillinger" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Job kan ikke tildeles denne objekttype ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "Ugyldig status for opsigelse af job. Valgmulighederne er: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () kan ikke kaldes med værdier for både schedule_at og instant." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Sletning forhindres af en beskyttelsesregel: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Fulde navn" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objekt" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "Anmodnings-ID" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Er aktiv" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Sti" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Sidst opdateret" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervaller" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Udgave" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Senest opdateret" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimum NetBox-version" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maksimal NetBox-version" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Ingen plugin-data fundet" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Forfatter" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Installeret" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certificeret" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Udgivet" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Installeret version" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Seneste version" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Ældste opgave" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Arbejdstagere" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Værten" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Port" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Scheduler PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Ingen køer fundet" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "Stillet i kø" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Afsluttet" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Opkaldbar" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Ingen opgaver fundet" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Tilstand" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Fødsel" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Ingen arbejdere fundet" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Jobnummer i kø{id} at synkronisere {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Gendannet konfigurationsrevision #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Job {job_id} ikke fundet" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Job {id} er blevet slettet." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Fejl ved sletning af job {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Job {id} ikke fundet." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Job {id} er blevet sat i kø igen." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Job {id} er blevet sat i kø." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Job {id} er blevet stoppet." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Det lykkedes ikke at stoppe jobbet {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Plugin-kataloget kunne ikke indlæses" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} ikke fundet" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Position (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Anlægs-id" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Iscenesættelse" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Nedlæggelse" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Pensioneret" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2-stolpe ramme" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4-stolpe ramme" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4-stolpe skab" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Vægmonteret ramme" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Vægmonteret ramme (lodret)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Vægmonteret skab" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Vægmonteret skab (lodret)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} tommer" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Reserveret" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Tilgængelig" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Forældet" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Millimeter" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Tommer" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Foran til bag" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Bagsiden til forsiden" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Forælder" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Barn" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Front" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Bageste" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Iscenesat" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventar" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Venstre mod højre" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Højre til venstre" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Side til bagside" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Bag til side" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Bund til top" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Top til bund" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passiv" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Blandet" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (Ikke-låsende)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (Låsning)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Californiens stil" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "International/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Proprietær" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Andet" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/International" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fysisk" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuel" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Trådløs" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Virtuelle grænseflader" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Bro" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Link Aggregation Group (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fast)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulopbygget)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (bagplan)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Cellulær" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seriel" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Koaksial" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Stabling" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Halvdelen" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Fuld" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Adgang" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Markeret" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Tagget (Alle)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE-standard" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Passiv 24V (2-par)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Passiv 24V (4-par)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Passiv 48V (2-par)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Passiv 48V (4-par)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Kobber" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fiberoptisk" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fiber" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Tilsluttet" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometer" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Meter" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimeter" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Mil" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Fod" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogram" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gram" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "pund" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Ounce" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundant" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Enkeltfase" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Trefaset" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Ugyldigt MAC-adresseformat: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Ugyldigt WWN-format: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Overordnet region (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Forældreregion (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Overordnet områdegruppe (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Overordnet områdegruppe (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Gruppe (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Gruppe (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Overordnet placering (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Forældreplacering (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Placering (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Placering (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Producent (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Producent (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Racktype (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Racktype (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rolle (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rolle (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Rack (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Bruger (navn)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Standardplatform (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Standardplatform (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Har et frontbillede" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Har et bagbillede" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Har konsolporte" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Har konsolserverporte" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Har strømstik" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Har strømudtag" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Har grænseflader" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Har gennemgangsporte" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Har modulpladser" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Har enhedsbugter" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Har lagervarer" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Enhedstype (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Modultype (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Strømstik (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Overordnet beholdningspost (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Konfigurationsskabelon (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Enhedstype (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Overordnet enhed (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Platform (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Platform (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Områdenavn (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Forældrebugt (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "VM-klynge (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Clustergruppe (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Klyngegruppe (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Enhedsmodel (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Er fuld dybde" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC-adresse" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Har en primær IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Har en IP uden for båndet" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Virtuelt kabinet (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Er et virtuelt chassismedlem" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Har virtuel enhedskontekst" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Enhedsmodel" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Grænseflade (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Modultype (model)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Modulplads (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Enhed (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (navn)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Enhed (navn)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Enhedstype (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Enhedsrolle (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Enhedsrolle (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Virtuelt kabinet (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Virtuelt kabinet" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Modul (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kabel (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Tildelt VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Tildelt VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RED.)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Virtuelle chassis-grænseflader til enhed" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Virtuelle chassisgrænseflader til enhed (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Slags grænseflade" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Overordnet grænseflade (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Broet grænseflade (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "LAG-grænseflade (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Virtuel enhedskontekst" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Virtuel enhedskontekst (identifikator)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Trådløst LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Trådløs forbindelse" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Forældremodulplads (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Installeret modul (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Installeret enhed (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Installeret enhed (navn)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Master (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (navn)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Lejer (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Lejer (snegle)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Uafsluttede" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Strømpanel (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Mærker" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Position" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3116,840 +3444,920 @@ msgstr "" "Alfanumeriske intervaller understøttes. (Skal svare til antallet af navne, " "der oprettes.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Kontaktens navn" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Kontakt telefon" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Kontakt E-mail" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Tidszone" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Producent" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Formfaktor" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Bredde" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Højde (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Faldende enheder" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Udvendig bredde" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Ydre dybde" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Ydre enhed" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Monteringsdybde" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Vægt" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maks. Vægt" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Vægtenhed" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Racktype" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Udvendige mål" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensioner" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Nummerering" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rolle" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Racktype" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Serienummer" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Aktivemærke" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Luftstrøm" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Rack" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Standardplatform" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Varenummer" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "U højde" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Ekskluder fra udnyttelse" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Enhedstype" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Modultype" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chassis" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VM-rolle" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Konfigurationsskabelon" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Enhedstype" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Enhedsrolle" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Platformen" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Klynge" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Enhed" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Konfiguration" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualisering" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Modultype" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Mærke" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Længde" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Længdeenhed" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "domæne" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Strømpanel" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Forsyning" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Spænding" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Strømstyrke" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maksimal udnyttelse" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maksimal trækning" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maksimal forbrug (watt)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Tildelt lodtrækning" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Allokeret forbrug (watt)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Strømstik" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Foderben" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Kun ledelse" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE-tilstand" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE-type" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Trådløs rolle" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modul" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "FORSINKELSE" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Virtuelle enhedskontekster" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Hastighed" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Tilstand" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN-gruppe" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Umærket VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Mærkede VLAN'er" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Trådløs LAN-gruppe" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Trådløse LAN" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adressering" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Betjening" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Relaterede grænseflader" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q-skift" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Interfacetilstand skal specificeres for at tildele VLAN'er" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "En adgangsgrænseflade kan ikke have tildelt taggede VLAN'er." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Navn på overordnet region" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Navn på overordnet områdegruppe" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Tildelt region" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Tildelt gruppe" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "tilgængelige muligheder" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Tildelt område" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Forældreplacering" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Placering ikke fundet." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Producenten af denne racktype" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Den laveste nummererede position i racket" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Skinne-til-skinne-bredde (i tommer)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Enhed til udvendige mål" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Enhed til rackvægte" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Navn på tildelt lejer" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Navn på tildelt rolle" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Luftstrømsretning" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Overordnet område" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Rackets placering (hvis nogen)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Enheder" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Kommasepareret liste over individuelle enhedsnumre" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Producenten, der fremstiller denne enhedstype" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Standardplatformen for enheder af denne type (valgfrit)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Enhedsvægt" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Enhed til enhedens vægt" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Modulvægt" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Enhed til modulvægt" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Begræns platformstildelinger til denne producent" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Tildelt rolle" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Producent af enhedstype" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Enhedstypemodel" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Tildelt platform" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Virtuelt kabinet" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Virtualiseringsklynge" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Tildelt placering (hvis nogen)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Tildelt rack (hvis et sådant findes)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Ansigt" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Monteret rackflade" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Overordnet enhed (til underordnede enheder)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Enhedsplads" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "Enhedsplads, hvor denne enhed er installeret (til børneenheder)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Enheden, hvor dette modul er installeret" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Modulplads" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Modulrummet, hvor dette modul er installeret" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Typen af modul" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Replikerer komponenter" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3957,265 +4365,272 @@ msgstr "" "Udfyld automatisk komponenter, der er knyttet til denne modultype (aktiveret" " som standard)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Vedtage komponenter" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Vedtage allerede eksisterende komponenter" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Porttype" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Porthastighed i bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Udtagstype" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Lokalt strømstik, der forsyner dette strømudtag" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Elektrisk fase (til trefasede kredsløb)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Forældregrænseflade" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Brobaseret grænseflade" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Forsinkelse" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Overordnet LAG-grænseflade" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "VDC-navne adskilt af kommaer, indkapslet med dobbelte anførselstegn. " "Eksempel:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Fysisk medium" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Duplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Poe-tilstand" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Poe-type" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q driftstilstand (til L2-grænseflader)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Tildelt VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rf-rolle" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Trådløs rolle (AP/station)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} er ikke tildelt enheden {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Bageste port" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Tilsvarende bagport" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Klassificering af fysisk medium" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Installeret enhed" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Børneenhed installeret i denne bugt" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Børneenhed blev ikke fundet." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Overordnet beholdningspost" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Komponenttype" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Komponenttype" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Komponentnavn" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Komponentnavn" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Komponent ikke fundet: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Side A-enhed" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Enhedsnavn" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Side A type" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Afslutningstype" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Side A navn" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Opsigelsesnavn" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Side B-enhed" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Side B type" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Side B navn" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Forbindelsesstatus" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" "Side {side_upper}: {device} {termination_object} er allerede tilsluttet" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} sideafslutning ikke fundet: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Mester" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Hovedenhed" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Navn på overordnet område" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Hoved strømpanel" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primær eller redundant" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Forsyningstype (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Enkelt- eller trefaset" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Primær IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IP-adresse med maske, fx 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Primær IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6-adresse med præfix-længde, fx 2001:db8::1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4224,7 +4639,7 @@ msgstr "" "De mærkede VLAN'er ({vlans}) skal tilhøre det samme område som grænsefladens" " overordnede enhed/VM, eller de skal være globale" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4232,7 +4647,7 @@ msgstr "" "Kan ikke installere modul med pladsholderværdier i en modulplads uden " "defineret position." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4241,187 +4656,198 @@ msgstr "" "Kan ikke installere modul med pladsholderværdier i et modullaurbærtræ " "{level} i træet, men {tokens} pladsholdere givet." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Kan ikke adoptere {model} {name} da det allerede hører til et modul" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "EN {model} som hedder {name} findes allerede" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Strømpanel" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Strømforsyning" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Side" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Enhedsstatus" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Overordnet region" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Forældregruppe" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Faciliteterne" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Racktype" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Funktion" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Billeder" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Komponenter" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Underenhedsrolle" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modellen" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Har en OOB IP" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Virtuelt chassismedlem" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Har virtuelle enhedskontekster" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Klyngegruppe" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Kablet" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Besat" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Forbindelse" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Venlig" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Kun Mgmt" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Trådløs kanal" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Kanalfrekvens (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Kanalbredde (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Sendeeffekt (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kabel" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Opdaget" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Et virtuelt chassiselement findes allerede på plads {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Kontaktoplysninger" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Rackrolle" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Slug" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Vælg en foruddefineret racktype, eller angiv fysiske egenskaber nedenfor." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Lagerstyring" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4429,145 +4855,172 @@ msgstr "" "Kommasepareret liste over numeriske enheds-id'er. Et interval kan angives " "ved hjælp af en bindestreg." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Reservation" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Enhedsrolle" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Den lavest nummererede enhed, der er besat af enheden" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "Placeringen i det virtuelle chassis, som denne enhed identificeres ved" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Enhedens prioritet i det virtuelle chassis" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Udfyld automatisk komponenter, der er knyttet til denne modultype" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Karakteristika" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Konsolportskabelon" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Konsolserverportskabelon" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Frontportskabelon" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Grænsefladeskabelon" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Skabelon til strømudtag" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Strømstikskabelon" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Bagport skabelon" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Grænseflade" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Konsolport" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Konsolserverport" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Frontport" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Bageste port" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Strømstik" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Strømudtag" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Komponenttildeling" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "En InventoryItem kan kun tildeles til en enkelt komponent." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "LAG-grænseflade" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtrer VLAN'er, der er tilgængelige til tildeling efter gruppe." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Børneenhed" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4575,32 +5028,35 @@ msgstr "" "Underordnede enheder skal først oprettes og tildeles til den overordnede " "enheds område og rack." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Konsolport" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Konsolserverport" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Frontport" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Strømudtag" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Lagergenstand" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Lagervarrolle" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4608,7 +5064,7 @@ msgstr "" "Alfanumeriske intervaller understøttes. (Skal svare til antallet af " "objekter, der oprettes.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4617,16 +5073,17 @@ msgstr "" "Det medfølgende mønster specificerer {value_count} Værdier, men " "{pattern_count} forventes." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Bageste porte" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "Vælg en bagporttildeling for hver frontport, der oprettes." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4635,16 +5092,7 @@ msgstr "" "Antallet af frontportskabeloner, der skal oprettes ({frontport_count}) skal " "matche det valgte antal bageste portpositioner ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Strengen {module} vil blive erstattet med placeringen af det " -"tildelte modul, hvis det er tilfældet." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4653,84 +5101,87 @@ msgstr "" "Antallet af frontporte, der skal oprettes ({frontport_count}) skal matche " "det valgte antal bageste portpositioner ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Medlemmer" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Udgangsposition" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "" "Placering af den første medlemsenhed. Stiges med en for hvert ekstra medlem." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "En stilling skal specificeres for det første VC-medlem." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "etiket" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "længde" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "længdeenhed" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "kabel" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "ledninger" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Skal angive en enhed, når du indstiller en kabellængde" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Skal definere A- og B-afslutninger, når du opretter et nyt kabel." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Kan ikke tilslutte forskellige termineringstyper til samme ende af kablet." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Inkompatible opsigelsestyper: {type_a} og {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "" "A- og B-terminationer kan ikke oprette forbindelse til det samme objekt." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "slutning" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "kabelafslutning" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "kabelafslutninger" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4739,38 +5190,38 @@ msgstr "" "Duplikat opsigelse fundet for {app_label}.{model} {termination_id}: kabel " "{cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kabler kan ikke afsluttes til {type_display} grænseflader" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Kredsløbsterminationer, der er knyttet til et leverandørnetværk, er muligvis" " ikke kablet." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "er aktiv" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "er komplet" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "er splittet" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "kabelbane" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "kabelstier" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4779,16 +5230,16 @@ msgstr "" "{module} accepteres som erstatning for modulpladsens position, når den er " "knyttet til en modultype." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Fysisk etiket" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "Komponentskabeloner kan ikke flyttes til en anden enhedstype." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4796,7 +5247,7 @@ msgstr "" "En komponentskabelon kan ikke knyttes til både en enhedstype og en " "modultype." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4804,134 +5255,134 @@ msgstr "" "En komponentskabelon skal være tilknyttet enten en enhedstype eller en " "modultype." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "skabelon til konsolport" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "konsolportskabeloner" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "skabelon til konsolserverport" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "skabeloner til konsolserverportskabeloner" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maksimal trækning" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "tildelt lodtrækning" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "strømstikskabelon" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "strømstikskabeloner" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Tildelt lodtrækning kan ikke overstige den maksimale trækning " "({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "foderben" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fase (til trefasefoedninger)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "Strømudtag skabelon" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "strømudtagsskabeloner" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "Hovedstrømstik ({power_port}) skal tilhøre samme enhedstype" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "Hovedstrømstik ({power_port}) skal tilhøre samme modultype" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "Kun ledelse" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "brogrænseflade" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "trådløs rolle" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "grænseflade skabelon" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "interface skabeloner" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "En grænseflade kan ikke kobles til sig selv." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Brogrænseflade ({bridge}) skal tilhøre samme enhedstype" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Brogrænseflade ({bridge}) skal tilhøre samme modultype" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "bageste portposition" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "skabelon til frontport" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "frontportskabeloner" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Bageste port ({name}) skal tilhøre samme enhedstype" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4940,47 +5391,47 @@ msgstr "" "Ugyldig bageste portposition ({position}); bageste port {name} har kun " "{count} positioner" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "positioner" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "bagport skabelon" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "bageste portskabeloner" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "position" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identifikator, der skal refereres til, når installerede komponenter omdøbes" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "modulbugtsskabelon" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "modulbugtsskabeloner" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "skabelon til enhedsplads" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "skabeloner til enhedsplads" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -4989,200 +5440,205 @@ msgstr "" "Underenhedsrolle for enhedstypen ({device_type}) skal indstilles til " "„forælder“ for at tillade enhedspladser." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "del-ID" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Producenttildelt artikel-id" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "lagervareskabelon" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "lagervareskabeloner" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Komponenter kan ikke flyttes til en anden enhed." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "kabelende" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "mærke tilsluttet" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Behandl som om et kabel er tilsluttet" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Du skal angive kabelenden (A eller B), når du tilslutter et kabel." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Kabelenden må ikke indstilles uden et kabel." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Kan ikke markere som tilsluttet med et tilsluttet kabel." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} modeller skal erklære en parent_object egenskab" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Fysisk porttype" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "hastighed" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Porthastighed i bit pr. sekund" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "konsolport" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "konsolporte" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "Konsolserverport" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "konsolserverporte" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "strømstik" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "strømstik" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "strømudtag" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "strømudtag" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "Hovedstrømstik ({power_port}) skal tilhøre den samme enhed" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "tilstand" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q-mærkningsstrategi" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "forældregrænseflade" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "forældreLAG" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Denne grænseflade bruges kun til administration uden for båndet" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "hastighed (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "duplex" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-bit verdensomspændende navn" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "trådløs kanal" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "kanalfrekvens (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Udfyldt af valgt kanal (hvis indstillet)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "sendeeffekt (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "trådløse LAN" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "umærket VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "mærkede VLAN'er" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "grænseflade" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "grænseflader" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} grænseflader kan ikke have et kabel tilsluttet." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} grænseflader kan ikke markeres som tilsluttet." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "En grænseflade kan ikke være sin egen forælder." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "Kun virtuelle grænseflader kan tildeles en overordnet grænseflade." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5191,7 +5647,7 @@ msgstr "" "Den valgte overordnede grænseflade ({interface}) tilhører en anden enhed " "({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5200,7 +5656,7 @@ msgstr "" "Den valgte overordnede grænseflade ({interface}) tilhører {device}, som ikke" " er en del af det virtuelle chassis {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5208,7 +5664,7 @@ msgid "" msgstr "" "Den valgte brogrænseflade ({bridge}) tilhører en anden enhed ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5217,22 +5673,22 @@ msgstr "" "Den valgte brogrænseflade ({interface}) tilhører {device}, som ikke er en " "del af det virtuelle chassis {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Virtuelle grænseflader kan ikke have en overordnet LAG-grænseflade." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "En LAG-grænseflade kan ikke være dens egen overordnede." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" "Den valgte LAG-grænseflade ({lag}) tilhører en anden enhed ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5241,43 +5697,43 @@ msgstr "" "Den valgte LAG-grænseflade ({lag}) tilhører {device}, som ikke er en del af " "det virtuelle chassis {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Virtuelle grænseflader kan ikke have en PoE-tilstand." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Virtuelle grænseflader kan ikke have en PoE-type." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Skal angive PoE-tilstand, når du angiver en PoE-type." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "Trådløs rolle kan kun indstilles på trådløse grænseflader." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Kanal kan kun indstilles på trådløse grænseflader." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "Kanalfrekvensen kan kun indstilles på trådløse grænseflader." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Kan ikke angive brugerdefineret frekvens med valgt kanal." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "Kanalbredden kan kun indstilles på trådløse grænseflader." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "Kan ikke angive brugerdefineret bredde med valgt kanal." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5286,24 +5742,24 @@ msgstr "" "Den umærkede VLAN ({untagged_vlan}) skal tilhøre det samme område som " "grænsefladens overordnede enhed, eller det skal være globalt." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Kortlagt position på tilsvarende bageste port" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "Frontport" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "frontporte" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Bageste port ({rear_port}) skal tilhøre den samme enhed" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5312,19 +5768,19 @@ msgstr "" "Ugyldig bageste portposition ({rear_port_position}): Bageste port {name} har" " kun {positions} positioner." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Antal frontporte, der kan kortlægges" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "bageste port" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "bageste porte" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5333,36 +5789,37 @@ msgstr "" "Antallet af positioner kan ikke være mindre end antallet af kortlagte " "frontporte ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "modulplads" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "modulpladser" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "En modulplads kan ikke tilhøre et modul, der er installeret i den." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "enhedsplads" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "enhedsbugter" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Denne type enhed ({device_type}) understøtter ikke enhedsbugter." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Kan ikke installere en enhed i sig selv." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5370,111 +5827,113 @@ msgstr "" "Kan ikke installere den angivne enhed; enheden er allerede installeret i " "{bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "lagervarerolle" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "lagervareroller" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "serienummer" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "aktivmærke" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Et unikt tag, der bruges til at identificere dette element" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "opdaget" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Dette element blev automatisk opdaget" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "lagerpost" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "lagervarer" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Kan ikke tildele mig selv som forælder." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Overordnet lagervare tilhører ikke den samme enhed." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Kan ikke flytte en lagervare med afhængige underordnede" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "Kan ikke tildele lagervare til komponent på en anden enhed" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "fabrikant" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "producenter" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "model" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "standard platform" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "varenummer" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Diskret varenummer (valgfrit)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "højde (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "udelukke fra udnyttelse" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "Enheder af denne type er udelukket ved beregning af rackudnyttelse." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "er fuld dybde" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "Enheden bruger både forreste og bageste rackflader." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "forældre/børns status" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5482,24 +5941,24 @@ msgstr "" "Overordnede enheder huser underordnede enheder i enhedspladser. Lad det stå " "tomt, hvis denne enhedstype hverken er forælder eller barn." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "luftstrøm" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "enhedstype" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "enhedstyper" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "U-højden skal være i trin på 0,5 reoler." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5508,7 +5967,7 @@ msgstr "" "Enhed {device} i rack {rack} har ikke tilstrækkelig plads til at rumme en " "højde på {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5518,7 +5977,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} tilfælde allerede monteret i " "racker." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5526,155 +5985,155 @@ msgstr "" "Du skal slette alle skabeloner til enhedsbugter, der er knyttet til denne " "enhed, før du afklassificerer den som en overordnet enhed." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Børneenhedstyper skal være 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "modultype" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "modultyper" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Virtuelle maskiner kan tildeles denne rolle" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "enhedsrolle" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "enhedsroller" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "Begræns eventuelt denne platform til enheder fra en bestemt producent" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "platform" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "platforme" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Funktionen denne enhed tjener" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Chassisserienummer, tildelt af producenten" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Et unikt tag, der bruges til at identificere denne enhed" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "position (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "rackflade" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "Primær IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "Primær IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP uden for båndet" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "VC position" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Virtuel chassisposition" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC-prioritet" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Virtuelt kabinetthovedvalgsprioritet" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "breddegrad" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS-koordinat i decimalformat (xx.ååååå)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "længde" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Enhedsnavnet skal være entydigt pr. område." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "enhed" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "enheder" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Rack {rack} hører ikke til område {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Lokation {location} hører ikke til området {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Rack {rack} hører ikke til placering {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Kan ikke vælge en rackflade uden at tildele et rack." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Kan ikke vælge en rackposition uden at tildele et rack." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Positionen skal være i trin på 0,5 reoler." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "Skal angive rackflade, når du definerer rackposition." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "En 0U-enhedstype ({device_type}) kan ikke tildeles en rackposition." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5682,7 +6141,7 @@ msgstr "" "Underordnede enhedstyper kan ikke tildeles en rackflade. Dette er en " "attribut for den overordnede enhed." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5690,7 +6149,7 @@ msgstr "" "Underordnede enhedstyper kan ikke tildeles en rackposition. Dette er en " "attribut for den overordnede enhed." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5699,22 +6158,22 @@ msgstr "" "U{position} er allerede besat eller ikke har tilstrækkelig plads til at " "rumme denne enhedstype: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} er ikke en IPv4-adresse." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Den angivne IP-adresse ({ip}) er ikke tildelt denne enhed." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} Det er ikke en IPv6-adresse." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5723,18 +6182,18 @@ msgstr "" "Den tildelte platform er begrænset til {platform_manufacturer} enhedstyper, " "men denne enheds type hører til {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Det tildelte cluster tilhører et andet område ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "En enhed, der er tildelt et virtuelt chassis, skal have sin position " "defineret." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5743,15 +6202,15 @@ msgstr "" "Enheden kan ikke fjernes fra det virtuelle chassis {virtual_chassis} fordi " "det i øjeblikket er udpeget som sin herre." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "modul" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "moduler" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5760,21 +6219,21 @@ msgstr "" "Modulet skal installeres i en modulplads, der tilhører den tildelte enhed " "({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domæne" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "virtuelt chassis" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "Den valgte master ({master}) er ikke tildelt dette virtuelle chassis." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5783,102 +6242,102 @@ msgstr "" "Kan ikke slette virtuelt chassis {self}. Der er medlemsgrænseflader, der " "danner LAG-grænseflader på tværs af chassiserne." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identificere" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Numerisk identifikator, der er unik for den overordnede enhed" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "kommenterer" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "virtuel enhedskontekst" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "virtuelle enhedskontekster" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} er ikke en IPV{family} adresse." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "Primær IP-adresse skal tilhøre en grænseflade på den tildelte enhed." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "vægt" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "vægtenhed" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Skal angive en enhed, når du indstiller en vægt" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "strømpanel" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "strømpaneler" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "Lokation {location} ({location_site}) er i et andet område end {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "levere" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "overgang" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "spænding" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "strømstyrke" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maksimal udnyttelse" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Maksimal tilladt trækning (procent)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "tilgængelig strøm" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "strømforsyning" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "strømforsyninger" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5887,63 +6346,63 @@ msgstr "" "Rack {rack} ({rack_site}) og strømpanel {powerpanel} ({powerpanel_site}) er " "på forskellige områder." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Spænding kan ikke være negativ for vekselstrømsforsyning" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "bredde" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Skinne-til-skinne-bredde" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Højde i reoler" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "startenhed" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Startenhed til rack" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "faldende enheder" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Enhederne er nummereret fra top til bund" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "ydre bredde" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Udvendig dimension af rack (bredde)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "ydre dybde" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Udvendig dimension af rack (dybde)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "ydre enhed" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "monteringsdybde" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5951,74 +6410,75 @@ msgstr "" "Maksimal dybde af en monteret enhed, i millimeter. For stativer med fire " "stolper er dette afstanden mellem for- og bagskinner." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "max vægt" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Maksimal belastningskapacitet for stativet" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "formfaktor" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "racktype" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "racktyper" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "Skal angive en enhed, når der indstilles en ydre bredde/dybde" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Skal angive en enhed, når der indstilles en maksimal vægt" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "rackrolle" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "rackroller" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "facilitets-id" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Lokalt tildelt identifikator" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Funktionel rolle" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Et unikt tag, der bruges til at identificere dette rack" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "rack" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "stativer" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "Den tildelte lokation skal tilhøre det overordnede område ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6027,7 +6487,7 @@ msgstr "" "Rack skal være mindst {min_height}Du er høj til at huse aktuelt installerede" " enheder." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6036,891 +6496,953 @@ msgstr "" "Nummerering af rackenheder skal begynde kl {position} eller mindre til at " "huse aktuelt installerede enheder." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Lokation skal være fra samme område, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "enkeltdele" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "reservation af rack" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "rackreservationer" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Ugyldig enhed (er) for {height}U-stativ: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Følgende enheder er allerede reserveret: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Der findes allerede en region på øverste niveau med dette navn." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Der findes allerede en region på øverste niveau med dette slug." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "område" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regioner" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "" "Der findes allerede en gruppe af områder på øverste niveau med dette navn." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Der findes allerede en områdegruppe på øverste niveau med dette slug." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "områdegruppe" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "områdegrupper" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Områdets fulde navn" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "facilitet" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Lokalt facilitets-id eller beskrivelse" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "Fysisk adresse" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Bygningens fysiske placering" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "leveringsadresse" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Hvis forskellig fra den fysiske adresse" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "Område" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "Områder" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "" "Der findes allerede en lokation med dette navn inden for det angivne område." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "" "En lokation med dette slug findes allerede inden for det angivne område." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "beliggenhed" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "steder" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "Hovedlokation ({parent}) skal tilhøre det samme område ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Opsigelse A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Opsigelse B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Enhed A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Enhed B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Sted A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Sted B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Rack A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Rack B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Område A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Område B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Tilgængelig" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Enheder" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VM'er" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Konfigurationsskabelon" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Områdegruppe" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP adresse" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4-adresse" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6-adresse" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "VC Position" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "VC-prioritet" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Forældreenhed" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Position (enhedsplads)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Konsolporte" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Konsolserverporte" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Strømstik" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Strømudtag" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Grænseflader" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Frontporte" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Enhedsbugter" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Modulpladser" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Lagervarer" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Modulbugt" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Lagervarer" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Kabelfarve" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Link jævnaldrende" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Marker tilsluttet" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maksimal trækkraft (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Tildelt lodtrækning (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP-adresser" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "FHRP Grupper" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Kun ledelse" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC'er" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Installeret modul" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Seriel modul" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Modulaktivmærke" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Modulstatus" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Komponent" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Varer" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Enhedstyper" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Modultyper" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Platforme" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Standardplatform" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Fuld dybde" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "U Højde" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "forekomster" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Konsolporte" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Konsolserverporte" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Strømstik" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Strømudtag" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Frontporte" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Bageste porte" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Enhedsbugter" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Modulbugter" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Strømforsyninger" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Maksimal udnyttelse" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Tilgængelig effekt (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Racker" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Højde" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Udvendig bredde" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Ydre dybde" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Maks. Vægt" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Rummet" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Områder" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Testcase skal indstille peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Afbrudt {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Reservationer" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Enheder uden rack" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Konfigurationskontekst" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Gengivelseskonfiguration" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Der opstod en fejl under gengivelse af skabelonen: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Virtuelle maskiner" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Installeret enhed {device} i bugten {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Fjernet enhed {device} fra bugten {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Børn" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Tilføjet medlem {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Kan ikke fjerne masterenheden {device} fra det virtuelle chassis." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Fjernet {device} fra virtuelt chassis {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Ukendt relateret objekt (er): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Ændring af typen af brugerdefinerede felter understøttes ikke." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Planlægning er ikke aktiveret for dette script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Tekst" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Tekst (lang)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Heltal" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Decimaltal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Boolsk (sandt/falsk)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Dato" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Dato & klokkeslæt" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Udvælgelse" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Flere valg" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Flere objekter" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Handicappede" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Løs" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Præcis" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Altid" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Hvis indstillet" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Skjult" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Ja" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Nej" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Forbindelse" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Nyeste" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Ældste" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabetisk (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabetisk (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Info" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Succes" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Advarsel" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Fare" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Fejlfinding" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Standard" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Fejl" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Hver time" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 timer" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Dagligt" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Ugentlig" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 dage" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Opret" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Opdatere" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Slet" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Blå" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "indigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Lilla" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Lyserød" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Rød" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "orange" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Gul" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Grøn" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "krikand" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Cyan" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Grå" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Sort" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Hvid" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Manuskript" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Meddelelse" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Ukendt operatør: {op}. Skal være en af: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Ikke-understøttet værditype: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Ugyldig type for {op} Betjening: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Regelsæt skal være en ordbog, ikke {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Ugyldig logiktype: skal være 'OG' eller 'OR'. Tjek venligst dokumentationen." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Forkert nøgle (r) informeret. Tjek venligst dokumentationen." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Widgettype" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Uregistreret widget klasse: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} skal definere en render () -metode." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Bemærk" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Vis noget vilkårligt brugerdefineret indhold. Markdown understøttes." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Objekttællinger" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6928,266 +7450,288 @@ msgstr "" "Vis et sæt NetBox-modeller og antallet af objekter, der er oprettet for hver" " type." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtre, der skal anvendes, når antallet af objekter tælles" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "Ugyldigt format. Objektfiltre skal sendes som en ordbog." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Objektliste" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Vis en vilkårlig liste over objekter." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Standardantallet af objekter, der skal vises" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "Ugyldigt format. URL-parametre skal sendes som en ordbog." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS-feed" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Indlejr et RSS-feed fra en ekstern hjemmeside." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "Foderwebadresse" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Det maksimale antal objekter, der skal vises" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Hvor længe det cachelagrede indhold skal gemmes (i sekunder)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Bogmærker" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Vis dine personlige bogmærker" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Ukendt handlingstype for en hændelsesregel: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Kan ikke importere hændelsespipeline {name} fejl: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Script-modul (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Datafil (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Gruppe (navn)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Klyngetype" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Clustertype (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Lejergruppe" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Lejergruppe (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Mærke" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Tag (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Har lokale konfigurationskontekstdata" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Gruppenavn" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Påkrævet" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Skal være unik" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "UI synlig" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Brugergrænseflade redigerbar" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Kan klones" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimumsværdi" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maksimal værdi" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Validering regex" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Adfærd" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nyt vindue" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Knapklasse" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIME-type" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Filudvidelse" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Som vedhæftet fil" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Delt" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP-metode" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "Nyttelast-URL" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL verifikation" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Hemmelighed" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA-filsti" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Begivenhedstyper" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Er aktiv" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Objekttyper" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "En eller flere tildelte objekttyper" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Feltdatatype (f.eks. tekst, heltal osv.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Objekttype" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Objekttype (for objekt- eller flerobjektfelter)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Valgsæt" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Valgsæt (til markeringsfelter)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Om det brugerdefinerede felt vises i brugergrænsefladen" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Om det brugerdefinerede felt kan redigeres i brugergrænsefladen" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "Basissættet af foruddefinerede valg, der skal bruges (hvis nogen)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7195,184 +7739,200 @@ msgstr "" "Citeret streng med kommaseparerede feltvalg med valgfri etiketter adskilt af" " kolon: „Valg1:Første valg, valg2:andet valg“" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "knapklasse" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Klassen for det første link i en gruppe vil blive brugt til rullemenuen" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Hændelsestype (r), der udløser denne regel" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Handlingsobjekt" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Webhook-navn eller script som stiplet sti module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} ikke fundet" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Manuskript {name} ikke fundet" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Tildelt objekttype" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Klassificering af indrejse" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Brugere" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Brugernavne adskilt af kommaer, indkapslet med dobbelte anførselstegn" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Grupper" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Gruppenavne adskilt af kommaer, indkapslet med dobbelte anførselstegn" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Relateret objekttype" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Felttype" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Valg" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Data" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Datafiler" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Indholdstyper" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP-indholdstype" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Begivenhedstype" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Handlingstype" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Tagget objekttype" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Tilladt objekttype" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regioner" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Områdegrupper" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Steder" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Enhedstyper" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Roller" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Klyngetyper" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Klyngegrupper" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Klynger" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Lejergrupper" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Type (r) af objekt, der har dette brugerdefinerede felt" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Standardværdi" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Type af det relaterede objekt (kun for objekt-/flerobjektfelter)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Relateret objektfilter" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Angiv forespørgselsparametre som et JSON-objekt." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Brugerdefineret felt" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7380,18 +7940,18 @@ msgstr "" "Den type data, der er gemt i dette felt. For objekt/flerobjektfelter skal du" " vælge den relaterede objekttype nedenfor." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "" "Dette vises som hjælpetekst til formularfeltet. Markdown understøttes." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Relateret objekt" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7399,15 +7959,16 @@ msgstr "" "Indtast et valg pr. linje. Der kan angives en valgfri etiket for hvert valg " "ved at tilføje det med et kolon. Eksempel:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Brugerdefineret link" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Skabeloner" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7416,60 +7977,66 @@ msgstr "" "Jinja2 skabelonkode til linkteksten. Henvis objektet som {example}. Links, " "der gengives som tom tekst, vises ikke." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "Jinja2 skabelonkode til linket URL. Henvis objektet som {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Skabelonkode" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Eksport skabelon" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Gengivelse" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Skabelonindhold udfyldes fra den fjerntliggende kilde, der er valgt " "nedenfor." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Skal angive enten lokalt indhold eller en datafil" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Gemt filter" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "En meddelelsesgruppe angiver mindst én bruger eller gruppe." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP-anmodning" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Valg af handling" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Indtast betingelser i JSON formatere." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7477,109 +8044,111 @@ msgstr "" "Indtast parametre, der skal overføres til handlingen i JSON formatere." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Begivenhedsregel" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Udløsere" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Meddelelsesgruppe" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Lejere" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Data udfyldes fra den fjerntliggende kilde, der er valgt nedenfor." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Skal angive enten lokale data eller en datafil" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Indhold" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Planlæg kl" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Planlæg udførelse af rapport til et bestemt tidspunkt" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Gentager hver" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Interval, hvor denne rapport genkøres (i minutter)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (Aktuel tid: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Planlagt tid skal være i fremtiden." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Foretag ændringer" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "Send ændringer i databasen (fjern markeringen for en tørkørsel)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Planlæg udførelse af script til et bestemt tidspunkt" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Interval, hvor scriptet køres igen (i minutter)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Databaseændringer er blevet tilbageført automatisk." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Script afbrudt med fejl: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Der opstod en undtagelse: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Databaseændringer er blevet tilbageført på grund af fejl." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Ingen indekser fundet!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "konfigurationskontekst" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "konfigurationskontekster" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON-data skal være i objektform. Eksempel:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7587,19 +8156,19 @@ msgstr "" "Lokale konfigurationskontekstdata har forrang frem for kildekontekster i den" " endelige gengivne konfigurationskontekst" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "skabelonkode" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2 skabelonkode." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "miljøparametre" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7609,41 +8178,41 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">yderligere" " parametre at passere, når man konstruerer Jinja2-miljøet." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "konfigurationsskabelon" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "konfigurationsskabeloner" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Det eller de objekter, som dette felt gælder for." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Den type data, som dette brugerdefinerede felt indeholder" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Typen af NetBox-objekt, som dette felt knytter sig til (for objektfelter)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Internt feltnavn" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Kun alfanumeriske tegn og understregninger er tilladt." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Dobbelte understregninger er ikke tilladt i brugerdefinerede feltnavne." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7651,19 +8220,19 @@ msgstr "" "Navnet på feltet som vist for brugerne (hvis det ikke er angivet, vil " "'feltets navn blive brugt)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "Gruppenavn" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Brugerdefinerede felter inden for samme gruppe vises sammen" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "påkrævet" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7671,19 +8240,19 @@ msgstr "" "Dette felt er påkrævet, når du opretter nye objekter eller redigerer et " "eksisterende objekt." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "skal være unik" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Værdien af dette felt skal være unik for det tildelte objekt" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "søgevægt" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7691,11 +8260,11 @@ msgstr "" "Vægtning til søgning. Lavere værdier betragtes som vigtigere. Felter med en " "søgevægt på nul ignoreres." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "filterlogik" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7703,11 +8272,11 @@ msgstr "" "Loose matcher enhver forekomst af en given streng; nøjagtigt matcher hele " "feltet." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "standard" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7715,7 +8284,7 @@ msgstr "" "Standardværdi for feltet (skal være en JSON-værdi). Indkapsle strenge med " "dobbelte anførselstegn (f.eks. „Foo“)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7723,35 +8292,35 @@ msgstr "" "Filtrer objektvalg ved hjælp af en query_params-dict (skal være en JSON-" "værdi) .Indkapsle strenge med dobbelte anførselstegn (f.eks. „Foo“)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "displayvægt" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Felter med højere vægte vises lavere i en formular." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "minimumsværdi" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Mindste tilladte værdi (for numeriske felter)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maksimal værdi" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Maksimal tilladt værdi (for numeriske felter)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "validering regex" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7762,189 +8331,191 @@ msgstr "" "tvinge matchning af hele strengen. For eksempel ^ [A-Z]{3}$ vil" " begrænse værdierne til nøjagtigt tre store bogstaver." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "valgsæt" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "Angiver, om det brugerdefinerede felt vises i brugergrænsefladen" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Angiver, om den brugerdefinerede feltværdi kan redigeres i " "brugergrænsefladen" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "kan klones" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Repliker denne værdi ved kloning af objekter" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "brugerdefineret felt" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "brugerdefinerede felter" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Ugyldig standardværdi“{value}„: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "En minimumsværdi kan kun indstilles for numeriske felter" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "En maksimumsværdi kan kun indstilles for numeriske felter" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Validering af regulære udtryk understøttes kun for tekst- og URL-felter" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Unikhed kan ikke håndhæves for boolske felter" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Markeringsfelter skal angive et sæt valgmuligheder." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Valg kan kun indstilles i markeringsfelter." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Objektfelter skal definere en objekttype." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} felter definerer muligvis ikke en objekttype." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "Et relateret objektfilter kan kun defineres for objektfelter." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Filter skal defineres som en ordbog, der knytter attributter til værdier." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Sandt" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Falsk" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Værdier skal matche denne regex: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Værdien skal være en streng." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Værdien skal matche regex '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Værdien skal være et heltal." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Værdien skal være mindst {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Værdien må ikke overstige {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Værdien skal være en decimal." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Værdien skal være sand eller falsk." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Datoværdierne skal være i ISO 8601-format (ÅÅÅÅ-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Dato- og klokkeslætsværdierne skal være i ISO 8601-format (ÅÅÅÅÅ-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Ugyldigt valg ({value}) til valgsæt {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Ugyldige valg (er) ({value}) til valgsæt {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Værdien skal være et objekt-id, ikke {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Værdien skal være en liste over objekt-id'er, ikke {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Fundet ugyldigt objekt-id: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Obligatorisk felt kan ikke være tomt." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Basisæt af foruddefinerede valg (valgfrit)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Valg sorteres automatisk alfabetisk" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "brugerdefineret felt valgsæt" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "brugerdefinerede feltvalgssæt" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Skal definere base eller ekstra valg." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -7953,61 +8524,61 @@ msgstr "" "Kan ikke fjerne valg {choice} som der er {model} objekter, der henviser til " "det." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "layout" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "config" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "dashboard" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "dashboards" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "objekttyper" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Det eller de objekter, som denne regel gælder for." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "De typer af begivenheder, der udløser denne regel." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "betingelser" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "" "Et sæt betingelser, der bestemmer, om begivenheden vil blive genereret." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "handlingstype" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Yderligere data, der skal videregives til handlingsobjektet" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "hændelsesregel" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "begivenhedsregler" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8017,7 +8588,7 @@ msgstr "" "webhooken kaldes. Jinja2-skabelonbehandling understøttes med samme kontekst " "som anmodningsorganet." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available her." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "yderligere overskrifter" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8043,11 +8614,11 @@ msgstr "" "Værdi. Jinja2-skabelonbehandling understøttes med samme kontekst som " "anmodningsorganet (nedenfor)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "kropsskabelon" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8060,11 +8631,11 @@ msgstr "" "tidsstempel, brugernavn, forespørgsels-" "id, og data." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "hemmelighed" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8075,15 +8646,15 @@ msgstr "" "nyttelastkroppen ved hjælp af hemmeligheden som nøgle. Hemmeligheden " "overføres ikke i anmodningen." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Aktivér SSL-certifikatbekræftelse. Deaktiver med forsigtighed!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA-filsti" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8091,63 +8662,63 @@ msgstr "" "Den specifikke CA-certifikatfil, der skal bruges til SSL-bekræftelse. Lad " "det være tomt for at bruge systemstandardindstillingerne." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "Angiv ikke en CA-certifikatfil, hvis SSL-bekræftelse er deaktiveret." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Den eller de objekttyper, som dette link gælder for." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "linktekst" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Jinja2 skabelonkode til linktekst" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "Link-URL" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Jinja2 skabelonkode til link URL" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Links med den samme gruppe vises som en rullemenu" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nyt vindue" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Tving link til at åbne i et nyt vindue" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "brugerdefineret link" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "brugerdefinerede links" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Den eller de objekttyper, som denne skabelon gælder for." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8155,1079 +8726,1145 @@ msgstr "" "Jinja2 skabelonkode. Listen over objekter, der eksporteres, sendes som en " "kontekstvariabel med navnet Queryset." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Standard til tekst/almindelig; tegnsæt = utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "filtypenavn" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Udvidelse, der skal tilføjes til det gengivne filnavn" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "som vedhæftet fil" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Download fil som vedhæftet fil" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "eksport skabelon" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "eksport skabeloner" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "„{name}„Det er et reserveret navn. Vælg et andet navn." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Den eller de objekttyper, som dette filter gælder for." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "delt" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "gemt filter" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "gemte filtre" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "Filterparametre skal gemmes som en ordbog med søgeordsargumenter." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "billedets højde" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "billedbredde" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "billed vedhæftet fil" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "billed vedhæftede filer" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "Billedvedhæftede filer kan ikke tildeles denne objekttype ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "venlig" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "journalindtastning" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "journalposter" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Journalføring understøttes ikke for denne objekttype ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "bogmærke" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "bogmærker" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Bogmærker kan ikke tildeles denne objekttype ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "læse" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "event" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "anmeldelse" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "notifikationer" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objekter af denne type ({type}) understøtter ikke underretninger." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "grupperer" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "brugere" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "meddelelsesgruppe" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "meddelelsesgrupper" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "abonnement" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "abonnementer" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "er eksekverbar" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "manuskriptet" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "manuskripter" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "script-modul" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "script-moduler" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "tidsstempel" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "mark" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "værdsætte" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "cachelagret værdi" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "cachelagrede værdier" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "gren" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "grene" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "iscenesat ændring" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "iscenesatte ændringer" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Den eller de objekttyper, som dette mærke kan anvendes på." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "mærke" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "tagger" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "tagget vare" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "mærkede varer" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Scriptdata" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parametre for udførelse af script" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Afvis" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Objekttyper" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Valider unikhed" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Synlig" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Redigerbar" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Relateret objekttype" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Valgsæt" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Kan klones" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimumsværdi" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maksimal værdi" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Validering Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Tælle" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Ordre alfabetisk" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nyt vindue" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Som vedhæftet fil" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Datafiler" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Synkroniseret" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Billede" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Størrelse (byte)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Læs" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL Validering" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Begivenhedstyper" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Enhedsroller" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Kommentarer (kort)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linje" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Niveau" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Besked" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Fremgangsmåde" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Sørg for, at denne værdi er lig med %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Sørg for, at denne værdi ikke er lig %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Dette felt skal være tomt." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Dette felt må ikke være tomt." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Valideringsregler skal godkendes som en ordbog" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Brugerdefineret validering mislykkedes for {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Ugyldig attribut“{name}„på forespørgsel" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Ugyldig attribut“{name}„til {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Dit dashboard er blevet nulstillet." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Tilføjet widget: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Opdateret widget: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Slettet widget: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Fejl ved sletning af widget: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Kan ikke køre script: RQ-arbejderprocessen kører ikke." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Indtast en gyldig IPv4- eller IPv6-adresse med valgfri maske." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Ugyldigt IP-adresseformat: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Indtast et gyldigt IPv4- eller IPv6-præfiks og maske i CIDR-notation." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Ugyldigt IP-præfiksformat: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Der er utilstrækkelig plads til at rumme den ønskede præfiksstørrelse (r)" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Container" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAK" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standard" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Kontrolpunkt" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Almindelig tekst" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Ugyldigt IP-adresseformat: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Importmål" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Importmål (navn)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Eksportmål" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Eksportmål (navn)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importere VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importer VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Eksport af VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Eksport VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importerer L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importerer L2VPN (identifikator)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Eksport af L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Eksport af L2VPN (identifikator)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Præfiks" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Inden for præfiks" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Inden for og med præfiks" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Præfikser, der indeholder dette præfiks eller IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Maskelængde" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN-nummer (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adresse" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Intervaller, der indeholder dette præfiks eller IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Forældrepræfiks" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Virtuel maskine (navn)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Virtuel maskine (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Grænseflade (navn)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM-grænseflade (navn)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM-grænseflade (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP-gruppe (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Tildeles til en grænseflade" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Er tildelt" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Tjeneste (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT inde i IP-adresse (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Tildelt grænseflade" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Tildelt VM grænseflade" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP-adresse (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP adresse" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Primær IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Primær IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Indtast en gyldig IPv4- eller IPv6-adresse (uden maske)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Ugyldigt IPv4/IPv6-adresseformat: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Dette felt kræver en IP-adresse uden maske." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Angiv en gyldig IPv4- eller IPv6-adresse." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Indtast en gyldig IPv4- eller IPv6-adresse (med CIDR-maske)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "CIDR-maske (f.eks. /24) er påkrævet." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Adressemønster" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Håndhæv unikt rum" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Er privat" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Dato tilføjet" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN-gruppen" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Præfikslængde" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Er en pool" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Behandl som fuldt udnyttet" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN-tildeling" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS-navn" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "protokol" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Gruppe-ID" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Autentificeringstype" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Autentificeringsnøgle" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Autentificering" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Områdetype" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Anvendelsesområde" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN-ID-intervaller" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Område & Gruppe" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Havne" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importer rutemål" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Eksporter rutemål" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Tildelt RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLANs gruppe (hvis nogen)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Overordnet enhed med tildelt grænseflade (hvis nogen)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Virtuel maskine" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Overordnet VM for tildelt grænseflade (hvis nogen)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Er primær" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Gør dette til den primære IP for den tildelte enhed" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Ingen enhed eller virtuel maskine angivet; kan ikke indstilles som primær IP" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "Ingen grænseflade angivet; kan ikke indstilles som primær IP" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Autentificeringstype" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Omfangstype (app og model)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Tildelt VLAN-gruppe" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP-protokol" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Påkrævet, hvis den ikke er tildelt en VM" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Påkrævet, hvis den ikke er tildelt en enhed" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} er ikke tildelt denne enhed/VM." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Rutemål" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Importmål" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Eksportmål" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importeret af VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Eksporteret af VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privat" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Adressefamilie" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Rækkevidde" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Start" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Slut" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Søg inden for" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Til stede i VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Enhed/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Forældrepræfiks" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Tildelt enhed" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Tildelt VM" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Tildelt til en grænseflade" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS-navn" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN'er" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Indeholder VLAN ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN-ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Virtuel maskine" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Rutemål" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Aggregeret" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN-rækkevidde" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Område/VLAN-tildeling" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP-rækkevidde" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP-gruppen" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Gør dette til den primære IP for enheden/VM" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (indvendigt)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "En IP-adresse kan kun tildeles et enkelt objekt." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Kan ikke omtildele IP-adresse, mens den er angivet som den primære IP for " -"det overordnede objekt" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Kun IP-adresser, der er tildelt en grænseflade, kan betegnes som primære " "IP'er." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Virtuel IP-adresse" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Opgaven findes allerede" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN-id'er" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "VLAN'er til børn" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9235,132 +9872,133 @@ msgstr "" "Kommasepareret liste over et eller flere portnumre. Et interval kan angives " "ved hjælp af en bindestreg." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Serviceskabelon" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Havn (er)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Serviceydelse" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Serviceskabelon" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Fra skabelon" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Brugerdefineret" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Du skal angive navn, protokol og port (er), hvis du ikke bruger en " "serviceskabelon." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "start" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN rækkevidde" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN intervaller" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Start ASN ({start}) skal være lavere end slutningen af ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Regionalt internetregister, der er ansvarlig for dette AS-nummerrum" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- eller 32-bit autonomt systemnummer" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "Gruppe-ID" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protokol" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "autentificeringstype" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "autentificeringsnøgle" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP-gruppe" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "FHRP-grupper" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "FHRP-gruppeopgave" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "FHRP gruppeopgaver" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privat" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "IP-plads administreret af denne RIR betragtes som privat" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR'er" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4- eller IPv6-netværk" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Regionalt internetregister, der er ansvarlig for dette IP-rum" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "dato tilføjet" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "aggregat" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "aggregater" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Kan ikke oprette aggregat med /0-maske." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9369,7 +10007,7 @@ msgstr "" "Aggregater kan ikke overlappe hinanden. {prefix} er allerede dækket af et " "eksisterende aggregat ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9378,263 +10016,273 @@ msgstr "" "Præfikser kan ikke overlappe aggregater. {prefix} dækker et eksisterende " "aggregat ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "rolle" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "roller" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "præfiks" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "IPv4- eller IPv6-netværk med maske" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Driftsstatus for dette præfiks" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Den primære funktion af dette præfiks" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "er en pool" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Alle IP-adresser inden for dette præfiks betragtes som brugbare" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "brugt mærke" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "præfikser" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Kan ikke oprette præfiks med /0-maske." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "global tabel" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Duplikat præfiks fundet i {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "startadresse" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4- eller IPv6-adresse (med maske)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "slutadresse" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Driftsstatus for denne rækkevidde" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Den primære funktion af dette interval" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP-rækkevidde" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP-intervaller" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Startende og afsluttende IP-adresseversioner skal matche" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Startende og afsluttende IP-adressemasker skal matche" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "Slutadressen skal være større end startadressen ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Definerede adresser overlapper med rækkevidde {overlapping_range} i VRF " "{vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Defineret interval overstiger den maksimale understøttede størrelse " "({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "adresse" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Den operationelle status for denne IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Den funktionelle rolle af denne IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (indvendigt)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "Den IP, som denne adresse er den „eksterne“ IP for" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Værtsnavn eller FQDN (skelner ikke mellem store og små bogstaver)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP-adresser" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Kan ikke oprette IP-adresse med /0-maske." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} er et netværks-id, som muligvis ikke tildeles en grænseflade." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" "{ip} er en udsendelsesadresse, som muligvis ikke tildeles en grænseflade." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Duplikat IP-adresse fundet i {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Kan ikke omtildele IP-adresse, mens den er angivet som den primære IP for " +"det overordnede objekt" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Kun IPv6-adresser kan tildeles SLAAC-status" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "portnumre" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "service skabelon" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "service skabeloner" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "De specifikke IP-adresser (hvis nogen), som denne tjeneste er bundet til" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "tjeneste" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "ydelser" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "En tjeneste kan ikke knyttes til både en enhed og en virtuel maskine." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "En tjeneste skal være tilknyttet enten en enhed eller en virtuel maskine." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN-grupper" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Kan ikke indstille scope_type uden scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Kan ikke indstille scope_id uden scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Intervaller kan ikke overlappe hinanden." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Det specifikke område, som dette VLAN er tildelt (hvis nogen)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN-gruppe (valgfrit)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerisk VLAN-id (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Driftsstatus for dette VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Den primære funktion af denne VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9643,165 +10291,167 @@ msgstr "" "VLAN er tildelt til gruppe {group} (anvendelsesområde: {scope}); kan ikke " "også tildele til området {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "VID skal være inden for intervaller {ranges} til VLAN'er i gruppe {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "ruteadskillelse" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Unik ruteadskillelse (som defineret i RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "håndhæv unikt rum" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Undgå dublerede præfikser/IP-adresser inden for denne VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF'er" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Rutemålværdi (formateret i overensstemmelse med RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "rute mål" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "rutemål" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Antal områder" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Antal leverandøre" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Aggregater" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Tilføjet" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Præfikser" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Udnyttelse" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP-intervaller" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Præfiks (flad)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Dybde" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Svømmebassin" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Markeret Udnyttet" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Startadresse" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (indvendigt)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (udenfor)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Tildelt" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Tildelt objekt" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Områdetype" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID intervaller" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VIDEO" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Unik" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Importmål" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Eksportmål" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} er ikke et gyldigt præfiks. Mente du {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Præfikslængden skal være mindre end eller lig med %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Præfikslængden skal være større end eller lig med %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9809,31 +10459,31 @@ msgstr "" "Kun alfanumeriske tegn, stjerner, bindestreger, punktum og understregninger " "er tilladt i DNS-navne" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Børnepræfikser" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Børneområder" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Relaterede IP'er" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Enhedsgrænseflader" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM-grænseflader" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Dette felt må ikke være tomt." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9841,328 +10491,341 @@ msgstr "" "Værdien skal sendes direkte (f.eks. „foo“: 123); brug ikke en ordbog eller " "liste." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} Det er ikke et gyldigt valg." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Ugyldig indholdstype: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "Ugyldig værdi. Angiv en indholdstype som '.„." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Intervaller skal specificeres i formularen (nedre, øvre)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Områdegrænser skal defineres som heltal." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} skal implementere get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Ugyldig tilladelse {permission} til model {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Mørk rød" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rose" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuchsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Mørk lilla" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Lyseblå" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Mørkegrøn" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Lysegrøn" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Citron" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Rav" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Mørk orange" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Brun" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Lysegrå" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Grå" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Mørkegrå" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Direkte" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Upload" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Automatisk registrering" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Komma" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Semikolon" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "faneblad" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Ugyldig konfigurationsparameter: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Login banner" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Yderligere indhold, der skal vises på login-siden" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Vedligeholdelsesbanner" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "" "Yderligere indhold, der skal vises, når du er i vedligeholdelsestilstand" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Top banner" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Yderligere indhold, der skal vises øverst på hver side" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Nederste banner" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Yderligere indhold, der skal vises nederst på hver side" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Globalt unikt IP-rum" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Håndhæv unik IP-adressering i den globale tabel" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Foretrækker IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Foretrækker IPv4-adresser frem for IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Rackenhedshøjde" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Standard enhedshøjde for renderede rackhøjder" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Rack-enhedens bredde" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Standard enhedsbredde for renderede rackhøjder" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Strømforsyningsspænding" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Standardspænding for strømforsyninger" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Strømforsyning strømstyrke" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Standard strømstyrke for strømforsyninger" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Maksimalt strømforbrug" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Standard maks. forbrug af strømforsyninger" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Tilladte URL-skemaer" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Tilladte ordninger for webadresser i brugerangivet indhold" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Standard sidestørrelse" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maksimal sidestørrelse" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Brugerdefinerede validatorer" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Brugerdefinerede valideringsregler (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Beskyttelsesregler" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Regler for beskyttelse mod sletning (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Standardindstillinger" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Standardindstillinger for nye brugere" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Vedligeholdelsestilstand" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Aktivér vedligeholdelsestilstand" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL aktiveret" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Aktivér GraphQL API" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Opbevaring af ændringslog" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Dage til at bevare changeloghistorik (indstillet til nul for ubegrænset)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Bevaring af jobresultater" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Dage til opbevaring af jobresultathistorik (indstillet til nul for " "ubegrænset)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "Kort URL" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Basis URL til kortlægning af geografiske placeringer" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Delvis kamp" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Præcis match" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Begynder med" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Slutter med" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Objekttype (er)" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Opslag" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10170,409 +10833,424 @@ msgstr "" "Tag slugs adskilt af kommaer, indkapslet med dobbelte anførselstegn (f.eks. " "„tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Tilføj tags" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Fjern tags" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} skal angive en modelklasse." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Ukendt feltnavn '{name}'i brugerdefinerede feltdata." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Ugyldig værdi for brugerdefineret felt '{name}„: {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Brugerdefineret felt '{name}“ skal have en unik værdi." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Mangler påkrævet brugerdefineret felt '{name}„." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Fjerndatakilde" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "datastie" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Sti til fjernfil (i forhold til datakildens rod)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "automatisk synkronisering aktiveret" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "Aktivér automatisk synkronisering af data, når datafilen opdateres" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "dato synkroniseret" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} skal implementere en sync_data () metode." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organisation" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Områdegrupper" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Lejergrupper" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Kontaktgrupper" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Kontaktroller" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Kontaktopgaver" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Rackroller" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Forhøjninger" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Racktyper" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Moduler" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Virtuelle enhedskontekster" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Producenter" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Enhedskomponenter" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Lagervareroller" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Forbindelser" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kabler" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Trådløse links" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Grænsefladeforbindelser" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Konsolforbindelser" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Strømtilslutninger" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Trådløse LAN-grupper" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Præfiks- og VLAN-roller" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN-intervaller" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN Grupper" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Serviceskabeloner" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Serviceydelser" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunneler" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Tunnelgrupper" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Tunnelafslutninger" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN'er" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Opsigelser" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKE-forslag" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE politikker" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPsec-forslag" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPsec-politikker" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPsec-profiler" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Virtuelle diske" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Klyngetyper" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Klyngegrupper" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Kredsløbstyper" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Kredsløbsgrupper" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Gruppeopgaver" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Kredsløbsafslutninger" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Leverandøre" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Leverandørkonti" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Leverandørnetværk" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Strømpaneler" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Konfigurationer" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Konfigurationskontekster" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Konfigurationsskabeloner" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Tilpasning" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Brugerdefinerede felter" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Brugerdefinerede feltvalg" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Brugerdefinerede links" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Eksport skabeloner" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Gemte filtre" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Billedvedhæftede filer" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operationer" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integrationer" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Datakilder" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Begivenhedsregler" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Job" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Logning" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Meddelelsesgrupper" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Journalposter" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Ændringslog" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Administrator" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API-tokens" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Tilladelser" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Systemet" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plugins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Konfigurationshistorik" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Baggrundsopgaver" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Tilladelser skal videregives som en tuple eller liste." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Knapper skal sendes som en tuple eller liste." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Knapfarve skal være et valg inden for ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10581,7 +11259,7 @@ msgstr "" "PluginTemplateExtension klasse {template_extension} blev vedtaget som en " "instans!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10590,194 +11268,195 @@ msgstr "" "{template_extension} er ikke en underklasse af " "Netbox.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} skal være en forekomst af Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} skal være en forekomst af Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} skal være en forekomst af Netbox.Plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context skal være en ordbog" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX Navigation" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Aktivér dynamisk UI navigation" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Eksperimentel funktion" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Sprog" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Tvinger UI oversættelse til det angivne sprog" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Understøttelse af oversættelse er blevet deaktiveret lokalt" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Sidelængde" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Standardantallet af objekter, der skal vises pr. side" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Paginatorplacering" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Nederst" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Øverst" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Begge dele" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Hvor paginatorkontrolelementerne vises i forhold til en tabel" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Dataformat" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Den foretrukne syntaks til visning af generiske data i brugergrænsefladen" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Ugyldig butik: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "" "Kan ikke tilføje butikker til registreringsdatabasen efter initialisering" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Kan ikke slette butikker fra registreringsdatabasen" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Tjekkisk" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "dansk" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Tysk" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "engelsk" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "spansk" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "franskmænd" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italiensk" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japansk" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Hollandsk" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Polere" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "portugisisk" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Russisk" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Tyrkisk" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ukrainsk" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "kinesisk" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Vælg alle" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Skift alle" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Skift rullemenuen" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Fejl" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "Nej {model_name} fundet" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Mark" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Værdi" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Dummy-plugin" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10786,56 +11465,56 @@ msgstr "" "Der opstod en fejl ved gengivelse af den valgte eksportskabelon " "({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Række {i}: Objekt med ID {id} findes ikke" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Nej {object_type} blev udvalgt." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Omdøbt {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Slettet {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Ændringslog" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Tidsskrift" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Kan ikke synkronisere data: Der er ikke angivet nogen datafil." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Synkroniserede data for {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Synkroniseret {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} skal implementere get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10843,703 +11522,745 @@ msgstr "" "Der opstod en fejl ved indlæsning af instrumentbrætkonfigurationen. Et " "standarddashboard er i brug." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Adgang nægtet" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Du har ikke tilladelse til at få adgang til denne side" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Siden blev ikke fundet" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Den ønskede side findes ikke" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Serverfejl" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "Der opstod et problem med din anmodning. Kontakt en administrator" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Den fuldstændige undtagelse er angivet nedenfor" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python-version" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox-version" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Ingen installeret" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Hvis der er behov for yderligere hjælp, bedes du sende til" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox diskussionsforum" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "på GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Hjemmesiden" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Meddelelser" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abonnementer" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Præferencer" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Skift adgangskode" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Annuller" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Gem" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Tabelkonfigurationer" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Ryd tabelindstillinger" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Skift alle" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tabel" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Bestilling" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Kolonner" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Ingen fundet" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Brugerprofil" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Kontooplysninger" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-mail" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Konto oprettet" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Sidste login" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superbruger" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Personale" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Tildelte grupper" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Ingen" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Seneste aktivitet" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Mine API-tokens" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Skriv aktiveret" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Sidst brugt" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Tilføj en token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Hjem" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox Motiv" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox-logoet" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Dokumenter" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST API-dokumentation" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL-API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "NetBox Labs Support" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Kildekode" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Fællesskab" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Installationsdato" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Opsigelsesdato" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Tildel gruppe" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Udskiftningskredsløbsafslutninger" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Byt disse afslutninger til kredsløb %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "En side" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z-siden" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Tildel kredsløb" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Kredsløbsgruppetildeling" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Tilføj kredsløb" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Kredsløbstype" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Tilføj" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Rediger" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Bytte" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Markeret som tilsluttet" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "til" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Spor" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Rediger kabel" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Fjern kablet" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Afbryd forbindelsen" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Forbind" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Nedstrøms" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Opstrøms" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Krydsforbindelse" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Patchpanel/port" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Tilføj kredsløb" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Leverandørkonto" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Konfigurationsdata" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Kommentar" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Gendan" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parameter" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Nuværende værdi" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Ny værdi" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Ændret" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Størrelse" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 Hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synkroniser" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Sidst synkroniseret" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Ingen parametre defineret" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "filer" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Rackhøjder" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Standard enhedshøjde" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Standard enhedsbredde" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Strømforsyninger" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Standard spænding" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Standard strømstyrke" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Standard maksimal udnyttelse" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Håndhæv global unik" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Paginatantal" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Maks. Sidestørrelse" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Brugerpræferencer" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Jobfastholdelse" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Job" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Oprettet af" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Planlægning" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "hver %(interval)s minutter" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Ændre" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Forskel" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Tidligere" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Næste" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Objekt oprettet" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objekt slettet" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Ingen ændringer" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Data før ændring" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Advarsel: Sammenligning af ikke-atomær ændring med tidligere ændringsrekord" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Data efter ændring" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Se alle %(count)s Ændringer" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Ændre logopbevaring" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "dage" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Ubestemt" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Ikke installeret" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Oversigt" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Installere" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Plugin Detaljer" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Resumé" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licens" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Versionshistorik" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Lokale installationsinstruktioner" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Baggrundskøer" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Konfigurer tabel" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Stop" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Requeue" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Kø" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Kø" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Timeout" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Resultat TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumenter" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Søgeordsargumenter" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Afhænger af" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Undtagelse" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "opgaver i " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Jobmuligheder i kø" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11547,382 +12268,400 @@ msgstr "" "Vælg alle %(count)s %(object_type_plural)s matchende " "forespørgsel" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Arbejderinfo" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Arbejdstageren" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Køer" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Nuværende job" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Antal vellykkede job" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Antal mislykkede job" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Samlet arbejdstid" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "sekunder" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Baggrundsarbejdere" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Arbejdere i %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Eksport" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Systemstatus" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox-udgivelse" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Django version" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL-version" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Databasenavn" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Databasestørrelse" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Ikke tilgængelig" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ-arbejdere" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "standardkø" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Systemtid" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Nuværende konfiguration" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" "Er du sikker på, at du vil afbryde disse %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Kabelspor til %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Hent SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Asymmetrisk sti" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "Noderne nedenfor har ingen links og resulterer i en asymmetrisk sti" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Stiopdeling" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Vælg en node nedenfor for at fortsætte" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Sporing afsluttet" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Segmenter i alt" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Samlet længde" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Ingen stier fundet" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Relaterede stier" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Oprindelse" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Bestemmelsessted" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmenter" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Ufuldstændig" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Omdøb markeret" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Ikke tilsluttet" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Fremhæv enhed i rack" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Ikke racket" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS-koordinater" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Kort" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Aktivemærke" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Se virtuelt kabinet" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Opret VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Ledelse" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT til" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NATTO" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Strømforbrug" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Indgang" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Udtag" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Allokeret" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Ben" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Tilføj en tjeneste" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Tilføj komponenter" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Tilføj konsolporte" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Tilføj konsolserverporte" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Tilføj enhedsbugter" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Tilføj frontporte" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Skjul Aktiveret" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Skjul Deaktiveret" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Skjul virtuelt" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Skjul frakoblet" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Tilføj grænseflader" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Tilføj lagervare" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Tilføj modulpladser" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Tilføj strømudtag" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Tilføj strømstik" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Tilføj bageste porte" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Konfiguration" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Kontekstdata" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Renderet konfiguration" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Hent" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Ingen konfigurationsskabelon fundet" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Forældrebugten" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Regenerer slug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Fjern" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Lokale konfigurationskontekstdata" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Omdøb" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Enhedsplads" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Installeret enhed" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Fjern %(device)s fra %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11931,430 +12670,449 @@ msgstr "" "Er du sikker på, at du vil fjerne %(device)s fra " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Befolkning" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Bugt" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Tilføj enhed" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "VM-rolle" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Modelnavn" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Varenummer" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Ekskluder fra udnyttelse" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Forælder/barn" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Frontbillede" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Bagbillede" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Bageste portposition" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Markeret som tilsluttet" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Forbindelsesstatus" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "En side" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B-side" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Ingen opsigelse" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Marker planlagt" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Marker installeret" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Stistatus" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Ikke tilgængelig" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Stiendepunkter" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Ikke tilsluttet" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Umærket" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Ingen VLAN'er tildelt" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Klar" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Ryd alle" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Monteringsdybde" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Startenhed" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Faldende enheder" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Rackhøjde" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Tilføj underordnet grænseflade" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Hastighed/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE-tilstand" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE-type" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q-tilstand" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC-adresse" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Trådløs forbindelse" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "jævnaldrende" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Kanalfrekvens" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Kanalbredde" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "LAG-medlemmer" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Ingen medlemsgrænseflader" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Tilføj IP-adresse" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Overordnet element" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Artikel-ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Tilføj underordnet placering" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Børneplaceringer" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Tilføj en placering" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Tilføj en enhed" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Tilføj enhedstype" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Tilføj modultype" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Tilsluttet enhed" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Udnyttelse (allokeret" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Elektriske egenskaber" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "EN" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Foderben" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Tilføj strømforsyninger" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Maksimal lodtrækning" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Tildelt lodtrækning" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Rumudnyttelse" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Rackvægt" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maksimal vægt" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Samlet vægt" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Billeder og etiketter" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Kun billeder" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Kun etiketter" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Tilføj reservation" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Vis liste" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Vælg rackvisning" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Sorter efter" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Ingen racker fundet" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Se højder" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Reservationsoplysninger" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Tilføj Rack" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Positioner" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Tilføj område" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Børneregioner" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Tilføj region" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Tidszone" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Områdetid" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Fysisk adresse" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Leveringsadresse" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Børnegrupper" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Tilføj områdegruppe" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Vedhæftet fil" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Tilføj medlem" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Medlemsenheder" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Føj nyt medlem til virtuelt kabinet %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Tilføj nyt medlem" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Handlinger" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Gem og tilføj en anden" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Redigering af virtuelt kabinet %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Rack/enhed" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Fjern Virtual Chassis-medlem" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12363,11 +13121,12 @@ msgstr "" "Er du sikker på, at du vil fjerne %(device)s fra virtuelt " "chassis %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identifikator" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12375,11 +13134,11 @@ msgstr "" "Der opstod en modulimportfejl under denne anmodning. Almindelige årsager " "omfatter følgende:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Mangler nødvendige pakker" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12395,11 +13154,11 @@ msgstr "" "installerede pakker, skal du køre pip frysning fra konsollen og" " sammenlign output med listen over nødvendige pakker." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "WSGI-tjenesten genstartes ikke efter opgradering" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12409,7 +13168,7 @@ msgstr "" " at WSGI-tjenesten (f.eks. gunicorn eller uWSGi) er blevet genstartet. Dette" " sikrer, at den nye kode kører." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12417,11 +13176,11 @@ msgstr "" "Der blev registreret en filtilladelsesfejl under behandlingen af denne " "anmodning. Almindelige årsager omfatter følgende:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Utilstrækkelig skrivetilladelse til medieroten" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12432,7 +13191,7 @@ msgstr "" "brugeren NetBox kører som har adgang til at skrive filer til alle " "placeringer inden for denne sti." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12440,11 +13199,11 @@ msgstr "" "Der blev opdaget en databaseprogrammeringsfejl under behandlingen af denne " "anmodning. Almindelige årsager omfatter følgende:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Databasemigreringer mangler" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12455,11 +13214,11 @@ msgstr "" "manuelt ved at udføre python3 manage.py migrere fra " "kommandolinjen." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Ikke-understøttet PostgreSQL-version" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12470,99 +13229,102 @@ msgstr "" "legitimationsoplysninger og sende en forespørgsel til VÆLG VERSION " "()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Datafilen, der er knyttet til dette objekt, er blevet slettet" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Data synkroniseret" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Synkroniser data" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Miljøparametre" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Skabelon" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Gruppenavn" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Skal være unik" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Klonbar" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Standardværdi" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Søg Vægt" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filterlogik" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Skærmvægt" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Brugergrænseflade Synlig" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Brugergrænseflade Redigerbar" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Valideringsregler" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Regelmæssigt udtryk" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Knapklasse" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Tildelte modeller" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Linktekst" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "Link URL" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Nulstil Dashboard" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12570,7 +13332,7 @@ msgstr "" "Dette vil fjerne alle konfigurerede widgets og gendan " "standard instrumentbrætkonfiguration." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12578,159 +13340,161 @@ msgstr "" "Denne ændring påvirker kun dit dashboard, og vil ikke påvirke andre " "brugere." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "widget konfiguration" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Luk widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Tilføj en widget" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Der er endnu ikke tilføjet nogen bogmærker." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Ingen tilladelse" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Ingen tilladelse til at se dette indhold" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Kan ikke indlæse indhold. Ugyldigt visningsnavn" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Intet indhold fundet" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Der opstod et problem med at hente RSS-feedet" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Betingelser" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME-type" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Filendelse" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Planlagt til" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Varighed" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Testoversigt" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Log" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Udgang" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Indlæser" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Resultater afventende" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Journalindtastning" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Meddelelsesgruppe" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Ingen tildelt" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Den lokale konfigurationskontekst overskriver alle kildekontekster" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Kildekontekster" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Ny journalpost" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Rapport" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Du har ikke tilladelse til at køre scripts" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Kør script" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Fejl ved indlæsning af script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Script findes ikke længere i kildefilen." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Sidste løb" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Script findes ikke længere i kildefilen" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Aldrig" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Kør igen" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Ingen scripts fundet" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12739,81 +13503,83 @@ msgstr "" "Kom i gang med Oprettelse af et script" " fra en uploadet fil eller datakilde." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Resultater" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Logtærskel" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Alle" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Mærkede varer" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Tilladte objekttyper" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Enhver" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Mærkede varetyper" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Mærkede objekter" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP-metode" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP-indholdstype" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL Bekræftelse" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Yderligere overskrifter" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Kropsskabelon" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Masseoprettelse" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Markerede objekter" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "at tilføje" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Massesletning" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Bekræft massesletning" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12823,65 +13589,68 @@ msgstr "" "Følgende handling slettes %(count)s %(type_plural)s. " "Gennemgå omhyggeligt de valgte objekter og bekræft denne handling." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Redigering" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Masseredigering" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Anvend" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Masseimport" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Direkte import" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Upload fil" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Indsend" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Feltindstillinger" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Tilbehør" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "valg" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Importværdi" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Format: ÅÅÅÅ-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Angiv sandt eller falsk" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Obligatoriske felter skal specificeres for alle objekter." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12891,15 +13660,15 @@ msgstr "" " For eksempel %(example)s ville identificere en VRF ved dens " "ruteadskillelse." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Massefjernelse" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Bekræft massefjernelse" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12910,72 +13679,72 @@ msgstr "" "%(parent_obj)s. Gennemgå venligst omhyggeligt %(obj_type_plural)s skal " "fjernes og bekræftes nedenfor." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Fjern disse %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Omdøbning" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Masseomdøb" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Nuværende navn" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nyt navn" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Forhåndsvisning" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Er du sikker" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Bekræft" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Rediger markeret" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Slet markeret" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Tilføj en ny %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Se modeldokumentation" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Hjælp" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Opret og tilføj en anden" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtre" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -12984,40 +13753,40 @@ msgstr "" "Vælg alle %(count)s " "%(object_type_plural)s matchende forespørgsel" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Ny udgivelse tilgængelig" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "er tilgængelig" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Opgraderingsinstruktioner" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Lås instrumentbrættet op" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Lås instrumentbrættet" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Tilføj widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Gem layout" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Bekræft sletning" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13026,40 +13795,40 @@ msgstr "" "Er du sikker på, at du vil slet " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Følgende objekter slettes som følge af denne handling." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "siden" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Ingen ulæste meddelelser" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Alle notifikationer" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Vælg" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Nulstil" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Aktivér mørk tilstand" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Aktivér lystilstand" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13068,281 +13837,283 @@ msgstr "" "Før du kan tilføje en %(model)s Du skal først oprette en " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Valg af side" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "udviser %(start)s-%(end)s af %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Pagineringsindstillinger" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Per side" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Vedhæft et billede" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Relaterede objekter" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Ingen tags tildelt" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Data er ude af synkronisering med opstrømsfilen" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Hurtig søgning" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Gemt filter" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Klar bestilling" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Hjælpecenter" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Django Admin" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Log ud" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Log ind" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Familie" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Dato tilføjet" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Tilføj præfiks" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS-nummer" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Autentificeringstype" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Autentificeringsnøgle" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Virtuelle IP-adresser" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Tildel IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Masseoprettelse" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Opret gruppe" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Virtuelle IP'er" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Vis tildelt" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Vis tilgængelig" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Vis alle" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globalt" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (udenfor)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Tildel en IP-adresse" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Vælg IP-adresse" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Søgeresultater" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Massetilføjelse af IP-adresser" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Startadresse" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Slutadresse" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Markeret fuldt udnyttet" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Adresseringsoplysninger" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Børne-IP'er" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Tilgængelige IP'er" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Første tilgængelige IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Præfiksdetaljer" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Netværksadresse" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Netværksmaske" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Jokertegnmaske" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Broadcast-adresse" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Tilføj IP-rækkevidde" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Skjul dybdeindikatorer" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Maks. Dybde" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Maks. Længde" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Tilføj aggregat" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importere VRF'er" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Eksport af VRF'er" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Import af L2VPN'er" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Eksport af L2VPN'er" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Tilføj et præfiks" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Tilføj VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Ruteadskillelse" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Unik IP-plads" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Fejl" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Log ind" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Eller" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Statisk mediefejl - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Statisk mediefejl" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Følgende statiske mediefil kunne ikke indlæses" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Kontroller følgende" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13352,7 +14123,7 @@ msgstr "" "opgradering. Dette installerer den seneste iteration af hver statisk fil i " "den statiske rodsti." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13364,7 +14135,7 @@ msgstr "" "href=\"%(docs_url)s\">installationsdokumentationen for yderligere " "vejledning." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13373,547 +14144,570 @@ msgstr "" "Filen %(filename)s findes i den statiske rodmappe og kan læses " "af HTTP-serveren." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Klik her for at forsøge at indlæse NetBox igen." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Kontakt" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Titel" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefonen" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Kontaktgruppe" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Tilføj kontaktgruppe" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Kontaktrolle" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Tilføj en kontakt" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Tilføj lejer" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Lejergruppe" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Tilføj lejergruppe" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Tildelte tilladelser" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Tilladelse" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Udsigt" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Begrænsninger" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Tildelte brugere" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Tildelte ressourcer" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Virtuelle CPU'er" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Hukommelse" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Diskplads" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Tilføj virtuel maskine" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Tildel enhed" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Fjern markeret" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Føj enhed til klynge %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Valg af enhed" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Tilføj enheder" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Tilføj klynge" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Klyngegruppe" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Klyngetype" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Virtuel disk" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Ressourcer" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Tilføj virtuel disk" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE-politik" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE-udgave" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Foruddelt nøgle" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Vis hemmelighed" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Forslag" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "IKE-forslag" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Autentificeringsmetode" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Krypteringsalgoritme" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Autentificeringsalgoritme" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "DH-gruppen" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "SA levetid (sekunder)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPsec-politik" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS-gruppe" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPsec-profil" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS-gruppen" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPsec-forslag" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "SA-levetid (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN Egenskaber" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Tilføj en opsigelse" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Tilføj opsigelse" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Indkapsling" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPsec-profil" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Tunnel-ID" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Tilføj tunnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Tunnelgruppe" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Tunnelafslutning" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Udenfor IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Peer-opsigelser" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Kryptering" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Vedhæftede grænseflader" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Tilføj trådløst LAN" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Trådløs LAN-gruppe" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Tilføj trådløs LAN-gruppe" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Linkegenskaber" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Afstand" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Forældrekontaktgruppe (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Forældrekontaktgruppe (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Kontaktgruppe (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Kontaktgruppe (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Kontakt (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Kontaktrolle (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Kontaktrolle (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Kontaktgruppe" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Overordnet lejergruppe (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Forældrelejergruppe (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Lejergruppe (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Lejergruppe (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Lejergruppe (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Descipation" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Tildelt kontakt" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "kontaktgruppe" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "kontaktgrupper" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "kontaktrolle" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "kontaktroller" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "titel" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "link" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "kontakt" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "kontakter" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "kontaktopgave" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "kontaktopgaver" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Kontakter kan ikke tildeles denne objekttype ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "lejergruppe" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "lejergrupper" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Lejernavnet skal være entydigt pr. Gruppe." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Lejer-slug skal være unik pr. Gruppe." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "lejer" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "lejere" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Kontakt Titel" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Kontakt Telefon" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Kontakt Email" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Kontaktadresse" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Kontakt Link" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Kontakt Beskrivelse" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Tilladelse (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Meddelelsesgruppe (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Fornavn" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Efternavn" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Medarbejderstatus" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Superbrugerstatus" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Hvis der ikke er angivet nogen nøgle, genereres en automatisk." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Er personale" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Er Superbruger" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Kan se" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Kan tilføje" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Kan ændre sig" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Kan slette" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Brugergrænseflade" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13923,7 +14717,7 @@ msgstr "" "nøgle før indsendelse af denne formular, da den muligvis ikke " "længere er tilgængelig, når tokenet er oprettet." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13933,32 +14727,32 @@ msgstr "" "uden begrænsninger. Eksempel: 10.1.1.0/24.192.168.10.16/32.2001: db " "8:1: :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Bekræft adgangskode" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Indtast den samme adgangskode som før, til bekræftelse." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Adgangskoder stemmer ikke overens! Kontroller dit input, og prøv igen." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Yderligere tiltag" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Foranstaltninger, der er ydet ud over dem, der er anført ovenfor" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objekter" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -13968,77 +14762,77 @@ msgstr "" "Efterlad null for at matche alle objekter af denne type. En liste over flere" " objekter vil resultere i en logisk OR-operation." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Mindst en handling skal vælges." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Ugyldigt filter for {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Listen over handlinger givet ved denne tilladelse" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "restriktioner" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Queryset-filter, der matcher de relevante objekter af den eller de valgte " "type" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "tilladelse" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "tilladelser" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "brugerpræferencer" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Nøgle '{path}'er en bladnode; kan ikke tildele nye nøgler" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "Nøgle '{path}'er en ordbog; kan ikke tildele en ikke-ordbogsværdi" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "udløber" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "sidst brugt" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "nøgle" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "skrive aktiveret" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "Tillad oprette/opdatere/slette handlinger ved hjælp af denne nøgle" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "tilladte IP'er" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14047,43 +14841,43 @@ msgstr "" "uden begrænsninger. Eksempel: „10.1.1.0/24, 192.168.10.16/32, 2001: DB 8:1: " ":/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "symbolet" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "tokens" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "gruppe" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "bruger" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Der findes allerede en bruger med dette brugernavn." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Brugerdefinerede handlinger" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Relateret objekt blev ikke fundet ved hjælp af de angivne attributter: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Flere objekter matcher de angivne attributter: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14092,42 +14886,42 @@ msgstr "" "Relaterede objekter skal refereres med numerisk id eller ved ordbog over " "attributter. Modtaget en ukendt værdi: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Relateret objekt blev ikke fundet ved hjælp af det angivne numeriske ID: " "{id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} har en nøgle defineret, men CHOICES er ikke en liste" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Vægt skal være et positivt tal" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Ugyldig værdi '{weight}'for vægt (skal være et tal)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "Ukendt enhed {unit}. Skal være en af følgende: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Længden skal være et positivt tal" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Ugyldig værdi '{length}'for længden (skal være et tal)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14136,15 +14930,15 @@ msgstr "" "Kan ikke slette {objects}. {count} afhængige objekter blev " "fundet: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Mere end 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "RGB-farve i hexadecimalt. Eksempel: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14153,7 +14947,7 @@ msgstr "" "%s(%r) er ugyldig. to_model parameter til counterCacheField skal være en " "streng i formatet 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14162,36 +14956,36 @@ msgstr "" "%s(%r) er ugyldig. to_field-parameteren til counterCacheField skal være en " "streng i formatet 'felt'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Indtast objektdata i CSV-, JSON- eller YAML-format." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV afgrænser" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Det tegn, der afgrænser CSV-felter. Gælder kun for CSV-format." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "Formulardata skal være tomme, når du uploader eller vælger en fil." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Ukendt dataformat: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Kan ikke registrere dataformat. Angiv venligst." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Ugyldig CSV-afgrænsning" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14199,7 +14993,7 @@ msgstr "" "Ugyldige YAML-data. Data skal være i form af flere dokumenter, eller et " "enkelt dokument, der omfatter en liste over ordbøger." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14208,7 +15002,7 @@ msgstr "" "Ugyldig liste ({value}). Skal være numerisk, og intervaller skal være i " "stigende rækkefølge." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14216,7 +15010,7 @@ msgstr "" "Angiv et eller flere numeriske områder adskilt af kommaer. Eksempel: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14224,17 +15018,18 @@ msgstr "" "Ugyldige intervaller ({value}). Skal være en række heltal i stigende " "rækkefølge." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Ugyldig værdi for et flervalgsfelt: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objektet blev ikke fundet: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14242,20 +15037,20 @@ msgid "" msgstr "" "„{value}„er ikke en unik værdi for dette felt; flere objekter blev fundet" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "„{field_name}„er et ugyldigt adgangsfeltnavn." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Objekttype skal angives som“.„" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Ugyldig objekttype" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14265,7 +15060,7 @@ msgstr "" "og typer inden for et enkelt område understøttes ikke (eksempel: [ge, " "xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14273,7 +15068,7 @@ msgstr "" "Angiv et numerisk interval for at oprette flere IP'er.
    Eksempel: " "192.0.2. [1.5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown Syntaks understøttes" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL-venlig unik stenografi" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "Indtast kontekstdata i JSON formatere." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC-adressen skal være i EUI-48-format" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Brug regulære udtryk" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Numerisk id for et eksisterende objekt, der skal opdateres (hvis der ikke " "oprettes et nyt objekt)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Ikke-genkendt header: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Tilgængelige kolonner" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Udvalgte kolonner" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14326,13 +15121,13 @@ msgstr "" "Dette objekt er blevet ændret, siden formularen blev gengivet. Se objektets " "ændringslog for detaljer." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Rækkevidde“{value}„er ugyldig." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14341,67 +15136,67 @@ msgstr "" "Ugyldigt område: Slutværdi ({end}) skal være større end startværdien " "({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Duplikat eller modstridende kolonneoverskrift for“{field}„" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Duplikat eller modstridende kolonneoverskrift for“{header}„" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Række {row}: Forventet {count_expected} kolonner, men fundet {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Uventet kolonneoverskrift“{field}„fundet." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Kolonne“{field}„er ikke et beslægtet objekt; kan ikke bruge prikker" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "Ugyldig relateret objektattribut for kolonne“{field}„: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Påkrævet kolonneoverskrift“{header}„Ikke fundet." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Mangler påkrævet værdi for dynamisk forespørgselsparam: '{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Mangler påkrævet værdi for statisk forespørgselsparam: '{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Adgangskoden skal have mindst et tal." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Adgangskoden skal have mindst et stort bogstav." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Adgangskoden skal have mindst et lille bogstav." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14409,7 +15204,7 @@ msgstr "" "Din adgangskode skal indeholde mindst et tal, et stort bogstav og et lille " "bogstav." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14418,127 +15213,127 @@ msgstr "" "Ugyldigt tilladelsesnavn: {name}. Skal være i formatet " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Ukendt app_label/modelnavn til {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Ugyldig IP-adresse indstillet til {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" "En kolonne med navnet {name} er allerede defineret for tabel {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Ikke defineret" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Fjern bogmærke" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Bogmærke" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Klon" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Nuværende visning" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Alle data" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Tilføj eksportskabelon" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importere" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Afmeld" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Abonner" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Kopier til udklipsholder" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Dette felt er påkrævet" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Indstil Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Ryd alle" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Tabelkonfiguration" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Flyt op" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Flyt ned" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Søg..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Søg i NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Åbn vælger" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Skrive" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Testen skal definere csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} er ikke et gyldigt regulært udtryk." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} skal implementere get_required_permissions ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} skal implementere get_required_permissions ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14547,61 +15342,63 @@ msgstr "" "{class_name} har intet queryset defineret. ObjectPermissionRequiredMixin må " "kun bruges på visninger, der definerer et basisqueryset" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Forældregruppe (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Forældregruppe (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Klyngetype (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Klynge (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU'er" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Hukommelse (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Type klynge" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Tildelt klyngegruppe" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Tildelt klynge" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Tildelt enhed inden for klynge" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Serienummer" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14610,48 +15407,48 @@ msgstr "" "{device} tilhører et andet område ({device_site}) end cluster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "Fastgør eventuelt denne VM til en bestemt værtsenhed i klyngen" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Område/Cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "Diskstørrelse styres via vedhæftning af virtuelle diske." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disken" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "klyngetype" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "klyngetyper" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "klyngegruppe" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "klyngegrupper" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "klynge" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "klynger" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14660,47 +15457,47 @@ msgstr "" "{count} enheder er tildelt som hostene til dette cluster, men er ikke på " "område {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "hukommelse (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disk (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Navnet på den virtuelle maskine skal være entydigt pr. klynge." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "virtuel maskine" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "virtuelle maskiner" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "En virtuel maskine skal tildeles et område og/eller et cluster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "Det valgte cluster ({cluster}) er ikke tildelt dette område ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Skal angive en klynge, når du tildeler en værtsenhed." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "Den valgte enhed ({device}) er ikke tildelt denne klynge ({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14709,17 +15506,17 @@ msgstr "" "Den angivne diskstørrelse ({size}) skal matche den samlede størrelse af " "tildelte virtuelle diske ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Skal være en IPV{family} adresse. ({ip} er en IPV{version} adresse.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Den angivne IP-adresse ({ip}) er ikke tildelt denne VM." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14728,7 +15525,7 @@ msgstr "" "Den valgte overordnede grænseflade ({parent}) tilhører en anden virtuel " "maskine ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14737,7 +15534,7 @@ msgstr "" "Den valgte brogrænseflade ({bridge}) tilhører en anden virtuel maskine " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14746,392 +15543,415 @@ msgstr "" "Den umærkede VLAN ({untagged_vlan}) skal tilhøre det samme område som " "grænsefladens overordnede virtuelle maskine, eller den skal være global." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "størrelse (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "virtuel disk" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "virtuelle diske" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Tilføjet {count} enheder til klynge {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Fjernet {count} enheder fra klynge {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Transport" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-i-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GREE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Talede" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Aggressiv" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Vigtigste" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Foruddelte nøgler" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certifikater" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA signaturer" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA signaturer" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Gruppe {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernet Privat LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Ethernet virtuelt privat LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernet privat træ" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Ethernet virtuelt privat træ" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Tunnelgruppe (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Tunnelgruppe (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPsec-profil (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPsec-profil (navn)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunnel (navn)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Udenfor IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE-politik (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE-politik (navn)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPsec-politik (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPsec-politik (navn)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "VM-grænseflade (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (navn)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Tunnelgruppe" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "SA levetid" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Foruddelt nøgle" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE-politik" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPsec-politik" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Tunnelindkapsling" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Operationel rolle" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Overordnet enhed til tildelt grænseflade" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Overordnet VM for tildelt grænseflade" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Enheds- eller virtuel maskingrænseflade" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE-forslag" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Diffie-Hellman-gruppe til Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPsec-forslag" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPsec-protokol" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN-type" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Forældreenhed (til grænseflade)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Virtuel forældremaskine (til grænseflade)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Tildelt grænseflade (enhed eller VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "Kan ikke importere enheds- og VM-grænsefladeafslutninger samtidigt." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Hver afslutning skal angive enten en grænseflade eller et VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Kan ikke tildele både en grænseflade og et VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE-udgave" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Forslag" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Tildelt objekttype" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Tunnelgrænseflade" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Første opsigelse" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Anden opsigelse" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Denne parameter er påkrævet, når der defineres en opsigelse." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Politik" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "En opsigelse skal angive en grænseflade eller VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "En terminering kan kun have et afsluttende objekt (en grænseflade eller " "VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "krypteringsalgoritme" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "autentificeringsalgoritme" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Diffie-Hellman gruppe-ID" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Sikkerhedsforeningens levetid (i sekunder)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "IKE-forslag" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKE-forslag" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "udgave" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "forslag" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "foruddelt nøgle" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE politikker" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Tilstand er påkrævet for valgt IKE-version" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Tilstand kan ikke bruges til valgt IKE-version" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "kryptering" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "autentificering" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Sikkerhedsassocieringens levetid (sekunder)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Sikkerhedsassocieringens levetid (i kilobyte)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPsec-forslag" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPsec-forslag" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Kryptering og/eller autentificeringsalgoritme skal defineres" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPsec-politikker" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPsec-profiler" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN-opsigelse" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN-opsigelser" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN-opsigelse er allerede tildelt ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15140,186 +15960,194 @@ msgstr "" "{l2vpn_type} L2VPN'er kan ikke have mere end to terminationer; fundet " "{terminations_count} allerede defineret." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "tunnelgruppe" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "tunnelgrupper" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "indkapsling" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "Tunnel-ID" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunneler" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Et objekt må kun afsluttes til en tunnel ad gangen." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "tunnelafslutning" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "tunnelafslutninger" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} er allerede knyttet til en tunnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Autentificeringsmetode" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Krypteringsalgoritme" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Autentificeringsalgoritme" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA levetid" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Foruddelt nøgle" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "SA levetid (sekunder)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA levetid (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Objektforælder" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Objektområde" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Adgangspunkt" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Stationen" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Åbn" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personlig (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA-virksomhed" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Autentificeringskryptering" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Afstandsenhed" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Broet VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Grænseflade A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Grænseflade B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Side B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "autentificeringskryptering" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "trådløs LAN-gruppe" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "trådløse LAN-grupper" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "trådløst LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "grænseflade A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "grænseflade B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "afstand" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "afstandsenhed" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "trådløst link" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "trådløse links" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "Skal angive en enhed, når du indstiller en trådløs afstand" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} er ikke en trådløs grænseflade." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Ugyldig kanalværdi: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Ugyldig kanalattribut: {name}" diff --git a/netbox/translations/de/LC_MESSAGES/django.mo b/netbox/translations/de/LC_MESSAGES/django.mo index 84659662029e5457eb6bfb4432fdf973ab58d332..1a628bec87937af98a2bc2a07851275a1995b8f0 100644 GIT binary patch delta 68974 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Ŕg*AD_~bdIgBInfN3Wp?9Mgcvcz0;Luebjs|F?CgM~=v8 zKDls{pq1&GcWzm)wYynEcVvt^E;OdU$6aEi@4!ZvbcZ>+^9&2~kTo(obXa6`V)STN zqnL1=;eRueLcR+sTtG)3pAZ`7J7zzn#7Lj^=#t61+6CQBk&P3J3HQWFCBYNTl}qp> zztcG=(w#nF56LNq2Axk8+_7!)h0#GnQ{@N<>45EuBn_GvR5CeiVo;4t-T@p$KM&XW z@2xr{j>y?_Sy$^=cUWvpL}dTOIPL`Q4u5_3{~`H5m%y)*pgSQVHZdk#vf-Yjo%4d~ zr1Vuv`f6TK-oVWy{W348R;GV%Avw+bp!k$YKkW=koiu83ko$ji5w(F(fA`5f76&a1 zN)gk!ZR_NFOM==2hqUE%sx1$y^K!a`;e$Q8p*>N_aUTY)%~jQZ_W%0}%R>~Udplu3 zXbhJ(GRAj#lQVxF)G$wS^7Wu187sI4cq01`NN`6d#wX~Zi}xhxVbo0@KiCr%88O^> zn&Lvk2D#Nj^7#ird2=)l=OO%m&ME8a5*Za978)1sZWS6oh*g}YNg~VS=c$5c*G<~e zI5;_-yCE01Z93C^8#pm%WAq!WFDv*+TsD)ZLi4RG+?I1hK|zj-t2hon!M@Gv-A(t$p~?xZq( zgP%73x2`+l;BI@|)w|BZ_r%Az2k{`fV&=~ve4xWBGyjletLf4;DRH$_s&<={3M z0=JRW<8pA`r1!c9XHKqmIru`VG|paVXy&fqoJp_V49->|kgr#(de)V3sO|_)d_sRu zl&8P{mMfe5qq1gd8|Nw0VE`XS!`&@B!;>;S3$C2p=UMQO)S24z65$=9=adH^`AkU2 z9|a2k`+oUf-I__cs)XcE`_KF9c;S#6xsoEj56Y6l9T}gHRIp}9ouu+LLP{l-s~K|A z7YMHqx7mkNE%HG%pwr&!Mig+u!Qnm&o_> lNq*Qaq(|PK607ffCjP&b{&^)v^G5Upyb`-bhkR7@e*m*x5~2VA delta 66775 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

    N1z?w8p~7BRL_Ynj`h!=0lb1f|28_Z_t1>( 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 diff --git a/netbox/translations/de/LC_MESSAGES/django.po b/netbox/translations/de/LC_MESSAGES/django.po index ed56b2276..37178c46e 100644 --- a/netbox/translations/de/LC_MESSAGES/django.po +++ b/netbox/translations/de/LC_MESSAGES/django.po @@ -8,9 +8,9 @@ # Niklas, 2024 # fepilins, 2024 # Steffen, 2024 +# haagehan, 2024 # Jeremy Stretch, 2024 # Robin Reinhardt, 2024 -# haagehan, 2024 # chbally, 2024 # #, fuzzy @@ -18,7 +18,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: chbally, 2024\n" "Language-Team: German (https://app.transifex.com/netbox-community/teams/178115/de/)\n" @@ -28,1878 +28,2144 @@ msgstr "" "Language: de\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Schlüssel" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Schreibberechtigung" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Erstellt" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Läuft ab" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Zuletzt verwendet" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "Erlaubte IP-Adressen" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Angemeldet als {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Du hast dich abgemeldet." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Ihre Einstellungen wurden aktualisiert." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "Die LDAP Zugangsdaten können nicht innerhalb von NetBox geändert werden." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Dein Passwort wurde erfolgreich geändert." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Geplant" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Provisionierung" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Aktiv" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Offline" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Deprovisionierung" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Stillgelegt" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Primär" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Sekundär" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Tertiär" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Inaktiv" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Region (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Region (URL-Slug)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Standortgruppe (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Standortgruppe (URL-Slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Standort" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Standort (URL-Slug)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Provider (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Provider (URL-Slug)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Providerkonto (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Providerkonto (Konto)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Providernetzwerk (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Transportnetz Typ (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Transportnetz Typ (URL-Slug)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Standort (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Abschlusspunkt A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Suche" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Transportnetz" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Providernetzwerk (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Transportnetz (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Transportnetz (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Transportnetzgruppe (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Transportnetzgruppe (SLUG)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASNs" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Beschreibung" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Provider" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "Dienst ID" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Farbe" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Typ" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Providerkonto" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Status" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Mandant" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Datum der Installation" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Kündigungsdatum" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Vereinbarte Bandbreite (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Service Parameter" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Mandantenverhältnis" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Provider Netzwerk" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Portgeschwindigkeit (Kbit/s)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Upstream Geschwindigkeit (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Als verbunden markieren" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Transportnetzabschlusspunkt" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Einzelheiten zum Abschlusspunkt" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Priorität" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Zugewiesener Provider" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Zugewiesenes Providerkonto" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Transportnetz Typ" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Betriebsstatus" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Zugewiesener Mandant" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Abschlusspunkt" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Providernetzwerk" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Lokation" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Kontakte" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Region" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Standortgruppe" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Attribute" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Konto" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Terminationsseite" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Zuweisung" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Gruppe" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Transportnetzgruppe" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "Farbe" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "Transportnetztyp" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "Transportnetztypen" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "Transportnetz-ID" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Eindeutige Transportnetz-ID" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "Status" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "installiert" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "endet" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "garantierte Bandbreite (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Garantierte Bandbreite" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "Transportnetz" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "Transportnetze" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "Transportnetzgruppe" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "Transportnetzgruppen" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "Priorität" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Transportnetzzuweisung" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Transportnetzzuweisungen" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "Abschlusspunkt" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "Portgeschwindigkeit (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Physikalische Transportnetzgeschwindigkeit" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "Upstream Geschwindigkeit (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "" "Upstream Geschwindigkeit, falls sie von der Portgeschwindigkeit abweicht" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "Cross-Connect-ID" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID des lokalen Cross-Connects" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "Patchpanel/Anschluss" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "Patchpanel-ID und Anschlussnummer(n)" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "Beschreibung" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "Transportnetzabschlusspunkt" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "Transportnetzabschlusspunkte" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Ein Leitungsabschluss muss entweder an einen Standort oder an ein " "Providernetzwerk angeschlossen werden." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Ein Leitungsabschluss kann nicht sowohl an einen Standort als auch an ein " "Providernetzwerk angeschlossen werden." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "Name" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Vollständiger Name des Providers" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "URL-Slug" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "Provider" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "Provider" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "Konto ID" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "Providerkonto" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "Providerkonten" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "Dienst-ID" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "Providernetzwerk" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "Providernetzwerke" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Name" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Transportnetze" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "Transportnetz-ID" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Seite A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Seite Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Garantierte Bandbreite" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Kommentare" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Zuweisungen" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Konten" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Anzahl der Konten" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "ASN-Anzahl" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Keine Terminierung wurde für das Transportnetz {circuit}definiert" -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Tausche Terminierungen für Transportnetz {circuit}" -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "" "Dieser Benutzer ist nicht berechtigt, diese Datenquelle zu synchronisieren." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Neu" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "In der Warteschlange" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Synchronisieren" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Abgeschlossen" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Fehlgeschlagen" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Skripte" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Berichte" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Ausstehend" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Geplant" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Laufend" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Fehlgeschlagen" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Aktualisiert" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Gelöscht" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Fertig" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Gestartet" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Aufgeschoben" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Gestoppt" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Abgebrochen" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Lokal" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Nutzername" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Wird nur für das Klonen über HTTP(S) verwendet" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Passwort" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Branch" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Abrufen der Remotedaten ist fehlgeschlagen ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "AWS-Zugriffsschlüssel-ID" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Geheimer AWS-Zugriffsschlüssel" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Objekt erstellt" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Objekt aktualisiert" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Objekt gelöscht" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Job wurde gestartet" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Job wurde abgeschlossen" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Job fehlgeschlagen" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Job ist fehlerhaft" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Datenquelle (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Datenquelle (Name)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Benutzer (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Benutzername" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Aktiviert" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parameter" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Regeln ignorieren" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Datenquelle" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Datei" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Datenquelle" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Erstellung" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Objekttyp" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Erstellt nach" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Erstellt vor" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Geplant nach" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Geplant vor" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Begonnen nach" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Begonnen vor" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Abgeschlossen nach" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Abgeschlossen vor" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Nutzer" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Zeit" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Nach" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Vorher" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Aktion" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Quelle" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Backendparameter" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Datei hochladen" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "" "Eine Datei kann nicht hochgeladen und aus einer vorhandenen Datei " "synchronisiert werden" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "Lade eine Datei hoch oder wähle eine Datendatei zur Synchronisierung aus" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Rackübersichten" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Stromversorgung" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Sicherheit" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Banner" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Seitenumbruch" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Validierung" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Benutzereinstellungen" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Diverses" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Konfigurationsverlauf" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "" "Dieser Parameter wurde statisch definiert und kann nicht geändert werden." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Aktueller Wert: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (Standard)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "Zeit" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "Benutzername" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "Anfrage-ID" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "Aktion" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "Daten vor der Änderung" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "Daten nach der Änderung" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "Objekt ändern" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "Objektänderungen" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "Die Änderungsprotokollierung wird für diesen Objekttyp nicht unterstützt " "({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "erstellt" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "Kommentar" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "Konfigurationsdaten" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "Konfigurationsrevisionen" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "Konfigurationsrevisionen" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Standardkonfiguration" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Aktuelle Konfiguration" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Konfigurationsrevision #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "Typ" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "aktiviert" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "Regeln ignorieren" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Muster (eines pro Zeile), welche Dateien entsprechen, die beim " "Synchronisieren ignoriert werden sollen" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "Parameter" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "zuletzt synchronisiert" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "Datenquelle" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "Datenquellen" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Unbekannter Backendtyp: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Synchronisierung kann nicht initiiert werden: Läuft bereits." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1907,1224 +2173,1286 @@ msgstr "" "Beim Initialisieren des Backends ist ein Fehler aufgetreten. Eine " "Abhängigkeit muss installiert werden: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "zuletzt aktualisiert" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "Pfad" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Dateipfad relativ zum Stammverzeichnis des Daten Verzeichnisses" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "Größe" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "Prüfsumme" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Die Länge muss 64 Hexadezimalzeichen betragen." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256-Hash des Dateiinhalts" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "Datendatei" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "Datendateien" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "Auto-Sync-Aufnahme" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "Auto-Sync-Aufnahmen" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "Stammverzeichnis der Datei" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "Dateipfad" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Dateipfad relativ zum angegebenen Stammpfad" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "verwaltete Datei" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "verwaltete Dateien" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "geplant" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "Intervall" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Wiederholungsintervall (in Minuten)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "gestartet" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "abgeschlossen" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "Daten" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "Fehler" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "Job-ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "Job" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "Jobs" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Jobs können diesem Objekttyp nicht zugewiesen werden ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Ungültiger Status für die Beendigung des Jobs. Es stehen folgende Optionen " "zur Auswahl: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () kann nicht mit Werten sowohl für schedule_at als auch für " "immediate aufgerufen werden." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Das Löschen wird durch eine Schutzregel verhindert: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Vollständiger Name" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objekt" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "Anfragen-ID" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Ist aktiv" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Pfad" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Letzte Aktualisierung" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervall" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Version" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Zuletzt aktualisiert" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimale Netbox-Version" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maximale NetBox-Version" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Keine Plugin-Daten gefunden" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Autor" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Installiert" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Zertifiziert" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Veröffentlicht" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Installierte Version" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Neuste Version" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Älteste Aufgabe" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Arbeiter" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Host" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Port" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Scheduler-PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Keine Warteschlangen gefunden" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "In Warteschlange eingereiht" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Beendet" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Abrufbar" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Keine Aufgaben gefunden" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Zustand" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Geburt" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Kein Job gefunden" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Warteschlangen Job {id}beim Synchronisieren {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Wiederhergestellte Konfigurationsrevision # {id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Job{job_id} nicht gefunden" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Job {id}wurde gelöscht" -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Fehler beim Job löschen {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Job {id}nicht gefunden" -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Job {id}erneut in Warteschlange eingereiht" -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Job {id}in Warteschlange eingereiht" -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Job {id}wurde gestoppt" -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Fehler beim Stoppen des Job {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Der Plugin-Katalog konnte nicht geladen werden" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} nicht gefunden" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Position (HE)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Einrichtungs-ID" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Bereitstellung" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Außerbetriebnahme" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Ausser Dienst" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Rahmengestell mit 2 Montageschienen" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Rahmengestell mit 4 Montageschienen" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Schrank mit 4 Montageschienen" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Wandhalterung" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Wandhalterung (hochkant)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Wandschrank" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Wandschrank (hochkant)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} Zoll" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Reserviert" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Verfügbar" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Veraltet" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Millimeter" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Zoll" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Front- zu Rückseite" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Rück- zu Frontseite" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Übergeordnet" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Untergeordnet" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Frontseite" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Rückseite" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Vorbereitet" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventar" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Links nach rechts" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Rechts nach links" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Seite nach hinten" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Von hinten zur Seite" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Von unten nach oben" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Von oben nach unten" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passiv" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Gemischt" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (nicht verriegelnd)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (verriegelnd)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Kalifornischer Stil" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "International/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Propritär" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Andere" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/International" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Physikalisch" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuell" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Funknetze" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Virtuelle Schnittstellen" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Bridge" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Link Aggregation Group (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fest)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modular)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (Backplane)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Mobilfunk" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seriell" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Koaxial" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Stapelnd" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Halb" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Voll" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Automatisch" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Untagged" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Tagged" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Tagged (Alle)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE-Standard" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Passiv 24 V (2 Paare)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Passiv 24 V (4 Paare)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Passiv 48 V (2 Paare)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Passiv 48 V (4 Paare)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Kupfer" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Glasfaser" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Faser" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Verbunden" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometer" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Meter" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Zentimeter" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Meilen" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Fuß" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogramm" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramm" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Pfund" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Unzen" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundant" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Einphasig" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Dreiphasig" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Ungültiges MAC-Adressformat: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Ungültiges WWN-Format: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Übergeordnete Region (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Übergeordnete Region (URL-Slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Übergeordnete Standortgruppe (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Übergeordnete Standortgruppe (URL-Slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Gruppe (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Gruppe (URL-Slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Übergeordnete Lokation (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Übergeordnete Lokation (URL-Slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Lokation (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Lokation (URL-Slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Hersteller (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Hersteller (Slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Regaltyp (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Racktyp (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rolle (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rolle (URL-Slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Rack (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Benutzer (Name)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Standard-Betriebssystem (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Standard-Betriebssystem (URL-Slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Hat ein Frontalbild" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Hat ein Rückseitenbild" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Hat Konsolenanschlüsse" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Hat Konsolenserveranschlüsse" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Hat Stromanschlüsse" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Hat Steckdosen" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Hat Schnittstellen" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Hat durchgereichte Anschlüsse" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Hat Moduleinsätze" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Hat Geräteeinsätze" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Hat Inventargegenstände" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Gerätetyp (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Modultyp (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Stromanschluss (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Übergeordneter Inventarartikel (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Konfigurationsvorlage (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Gerätetyp (Slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Übergeordnetes Gerät (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Betriebssystem (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Betriebssystem (URL-Slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Standortname (URL-Slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Übergeordneter Schacht (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "VM-Cluster (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Clustergruppe (URL-Slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Clustergruppe (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Gerätemodell (URL-Slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Hat volle Tiefe" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC-Adresse" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Hat eine primäre IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Hat eine Out-of-Band-IP" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Virtuelles Gehäuse (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Ist ein virtuelles Gehäuse-Mitglied" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Hat Virtual Device Context" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Modell des Geräts" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Schnittstelle (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Modultyp (Modell)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Modulschacht (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Gerät (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (Name)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Gerät (Name)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Gerätetyp (Modell)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Geräterolle (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Geräterolle (URL-Slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Virtuelles Gehäuse (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Virtuelles Gehäuse" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Modul (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kabel (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Zugewiesenes VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Zugewiesene VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Virtuelle Gehäuseschnittstellen für Gerät" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Virtuelle Gehäuseschnittstellen für Gerät (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Art der Schnittstelle" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Übergeordnete Schnittstelle (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Überbrückte Schnittstelle (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "LAG-Schnittstelle (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Virtual Device Context" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Virtual Device Context (Identifier)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "WLAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "WLAN Verbindung" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Hauptmodulschacht (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Installiertes Modul (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Installiertes Gerät (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Installiertes Gerät (Name)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Master (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (Name)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Mandant (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Mandant (URL-Slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Nicht terminiert" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Stromverteiler (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Tags" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Position" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3132,844 +3460,925 @@ msgstr "" "Alphanumerische Bereiche werden unterstützt. (Muss der Anzahl der Namen " "entsprechen, die erstellt werden.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Name des Kontakts" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Telefon des Kontakts" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "E-Mail des Kontakts" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Zeitzone" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Hersteller" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Formfaktor" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Breite" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Höhe (HE)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Absteigende Höheneinheiten (HE)" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Äußere Breite" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Äußere Tiefe" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Äußere Einheit" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Einbautiefe" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Gewicht" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maximales Gewicht" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Gewichtseinheit" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Rack-Typ" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Äußere Abmessungen" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Abmessungen" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Nummerierung" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rolle" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Racktyp" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Seriennummer" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Asset-Tag" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Luftstrom" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Rack" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Standard-Betriebssystem" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Artikelnummer" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Höheneinheit" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Von der Nutzung ausschließen" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Gerätetyp" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Modultyp" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Gehäuse" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VM-Rolle" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Konfigurationsvorlage" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Gerätetyp" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Geräterolle" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Betriebssystem" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Cluster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Gerät" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Konfiguration" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualisierung" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Modultyp" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Label" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Länge" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Längeneinheit" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Domäne" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Stromverteiler" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Versorgung" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Phase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Spannung" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Stromstärke" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Max. Auslastung" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maximale Auslastung" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maximale Leistungsaufnahme (Watt)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Zugewiesene Leistungsaufnahme" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Zugewiesene Leistungsaufnahme (Watt)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Stromanschluss" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Phasenlage" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Nur Management" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE-Modus" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE-Typ" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "WLAN Funktion" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modul" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Virtual Device Contexts" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Geschwindigkeit" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Modus" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN-Gruppe" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Untagged VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Getaggte VLANs" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "Hinzufügen eines getaggten VLANs" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "Getaggte VLANs entfernen" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "WLAN-Gruppe" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "WLANs" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adressierung" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Dienst / Port" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Verwandte Schnittstellen" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q-Switching" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "Hinzufügen/Entfernen" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Der Schnittstellenmodus muss gesetzt werden, um VLANs zuzuweisen" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" "Einer Endgeräteschnittstelle (Access) können keine getaggten VLANs " "zugewiesen sein." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Name der übergeordneten Region" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Name der übergeordneten Standortgruppe" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Zugewiesene Region" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Zugewiesene Gruppe" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "verfügbare Optionen" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Zugewiesener Standort" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Übergeordnete Lokation" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Lokation wurde nicht gefunden." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Der Hersteller dieses Racktyps" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Die Position mit der niedrigsten Nummer im Rack" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Breite von Schiene zu Schiene (in Zoll)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Einheit für Außenmaße" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Einheit für Rackgewichte" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Name des zugewiesenen Mandanten " -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Name der zugewiesenen Rolle" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "Racktyp Modell" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Richtung des Luftstroms" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "Die Breite muss festgelegt werden, wenn kein Racktyp angegeben wird." + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" +"Die Anzahl HE muss festgelegt werden, wenn kein Racktyp angegeben wird." + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Übergeordneter Standort" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Lokation des Racks (falls vorhanden)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Einheiten" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Kommagetrennte Liste einzelner Einheitennummern" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Der Hersteller, der diesen Gerätetyp herstellt" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Das Standard-Betriebssystem für Geräte diesen Typs (optional)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Gewicht des Geräts" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Einheit für das Gerätegewicht" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Gewicht des Moduls" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Einheit für das Modulgewicht" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Betriebssystem-Zuweisungen auf diesen Hersteller beschränken" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Zugewiesene Rolle" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Gerätetyp Hersteller" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Gerätetyp Modell" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Zugewiesenes Betriebssystem" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Virtuelles Gehäuse" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Virtualisierungscluster" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Zugewiesene Lokation (falls vorhanden)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Zugewiesenes Rack (falls vorhanden)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Ausrichtung" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Montierte Rackseite" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Übergeordnetes Gerät (für untergeordnete Geräte)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Geräteeinsatz" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Geräteschacht, in dem dieses Gerät installiert ist (für untergeordnete " "Geräte)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Das Gerät, in dem dieses Modul installiert ist" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Moduleinsatz" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Der Modulschacht, in dem dieses Modul installiert ist" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Der Typ des Moduls" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Komponenten replizieren" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3977,265 +4386,272 @@ msgstr "" "Automatisches Ausfüllen von Komponenten, die diesem Modultyp zugeordnet sind" " (standardmäßig aktiviert)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Komponenten übernehmen" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Übernehmen Sie bereits bestehende Komponenten" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Anschlusstyp" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Anschlussgeschwindigkeit in Bit/s" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Ausgangstyp" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Lokaler Stromanschluss, der diese Steckdose speist" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Elektrische Phase (für dreiphasige Stromkreise)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Übergeordnete Schnittstelle" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Überbrückte Schnittstelle" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Lag" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Übergeordnete LAG-Schnittstelle" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "VDC-Namen, getrennt durch Kommas, umgeben von doppelten Anführungszeichen. " "Beispiel:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Physikalisches Medium" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Duplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "PoE-Modus" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "PoE-Typ" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q-Betriebsmodus (für L2-Schnittstellen)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Zugewiesenes VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rf-Rolle" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "WLAN Rolle (AP/Station)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} ist dem Gerät {device} nicht zugewiesen" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Rückseitenanschluss" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Entsprechender Rückanschluss" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Klassifizierung des physikalischen Mediums" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Installiertes Gerät" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "In diesem Schacht installiertes untergeordnetes Gerät" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Untergeordnetes Gerät wurde nicht gefunden." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Artikel aus dem übergeordneten Inventar" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Komponententyp" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Komponententyp" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Name der Komponente" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Name der Komponente" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Komponente wurde nicht gefunden: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Gerät Seite A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Name des Geräts" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Typ Seite A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Typ des Abschlusspunktes" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Name der Seite A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Name des Abschlusspunktes" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Gerät Seite B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Typ Seite B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Name der Seite B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Status der Verbindung" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" "Seite {side_upper}: {device} {termination_object} ist bereits verbunden" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} Seitlicher Abschluss nicht gefunden: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Master" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Mastergerät" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Name des übergeordneten Standorts" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "vorgeschalteter Stromverteiler" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primär oder redundant" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Versorgungsart (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Ein- oder Dreiphasig" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Primäre IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4-Adresse mit Maske, z. B. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Primäre IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6-Adresse mit Präfixlänge, z. B. 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4245,7 +4661,7 @@ msgstr "" "übergeordnete Gerät/die übergeordnete VM der Schnittstelle, oder sie müssen " "global sein" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4253,7 +4669,7 @@ msgstr "" "Das Modul mit Platzhalterwerten kann nicht in einem Modulschacht ohne " "definierte Position installiert werden." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4262,189 +4678,200 @@ msgstr "" "Modul mit Platzhalterwerten kann nicht in einem Modul-Baytree installiert " "werden {level} in einem Baum, aber {tokens} Platzhalter angegeben." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" "Kann nicht adoptieren {model} {name} da es schon zu einem Modul gehört" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "Ein {model} genannt {name} existiert bereits" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Stromverteiler" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Stromzufuhr" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Seite" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Gerätestatus" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Übergeordnete Region" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Übergeordnete Gruppe" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Einrichtung" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Racktyp" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Funktion" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Bilder" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Komponenten" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Rolle des Untergeräts" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modell" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Hat eine OOB-IP" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Virtuelles Gehäusemitglied" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Hat Virtual Device Contexts" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Clustergruppe" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Verkabelt" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Belegt" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Verbindung" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Art" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Nur Verwaltung" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "WLAN Kanal" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Kanalfrequenz (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Kanalbreite (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Sendeleistung (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kabel" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Erfasst" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Ein virtuelles Chassismitglied ist bereits in Position {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Kontaktinformationen" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Rackrolle" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "URL-Slug" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Wählen Sie einen vordefinierten Racktyp oder legen Sie unten die " "physikalischen Eigenschaften fest." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Inventarsteuerung" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4452,148 +4879,180 @@ msgstr "" "Kommagetrennte Liste numerischer Einheiten-IDs. Ein Bereich kann mit einem " "Bindestrich angegeben werden." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Reservierung" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Rolle des Geräts" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Die HE mit der niedrigsten Nummer, die vom Gerät belegt ist" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "Die Position im virtuellen Gehäuse, durch die dieses Gerät identifiziert " "wird" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Die Priorität des Geräts im virtuellen Gehäuse" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" "Füllen Sie automatisch Komponenten aus, die diesem Modultyp zugeordnet sind" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Charakteristiken" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" +"Alphanumerische Bereiche werden für die Massenerstellung unterstützt. Groß- " +"und Kleinschreibung und Typen innerhalb eines einzigen Bereichs werden nicht" +" unterstützt (Beispiel: [ge, xe] -0/0/ [0-9]). Das Token " +"{module}, falls vorhanden, wird beim Erstellen eines neuen " +"Moduls automatisch durch den Positionswert ersetzt." + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Konsolenanschlussvorlage" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Port-Vorlage für Konsolenserver" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Frontanschluss-Vorlage" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Schnittstellen-Vorlage" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Vorlage für Steckdosen" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Vorlage für Stromverteiler" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Vorlage für den hinteren Anschluss" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Schnittstelle" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Konsolenanschluss" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Konsolenserveranschluss" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Frontanschluss" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Rückanschluss" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Stromanschluss" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Stromabgang" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Komponentenzuweisung" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "" "Ein InventoryItem kann nur einer einzelnen Komponente zugewiesen werden." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "LAG-Schnittstelle" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtern Sie VLANs, die für die Zuweisung nach Gruppen verfügbar sind." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "untergeordnetes Gerät" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4601,32 +5060,35 @@ msgstr "" "Untergeordnete Geräte müssen zuerst erstellt und dem Standort und dem Rack " "des übergeordneten Geräts zugewiesen werden." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Konsolenanschluss" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Konsolenserveranschluss" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Frontanschluss" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Stromabgang" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Inventar-Artikel" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Rolle des Inventarartikels" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4634,7 +5096,7 @@ msgstr "" "Alphanumerische Bereiche werden unterstützt. (Muss der Anzahl der Objekte " "entsprechen, die erstellt werden.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4643,18 +5105,19 @@ msgstr "" "Das bereitgestellte Muster spezifiziert {value_count} Werte, aber " "{pattern_count} werden erwartet." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Rückanschlüsse" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Wählen Sie für jeden zu erstellenden Frontanschluss eine hintere Anschluss-" "Zuweisung aus." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4664,16 +5127,7 @@ msgstr "" "muss mit der ausgewählten Anzahl der hinteren Anschlusspositionen " "übereinstimmen ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Die Zeichenkette {module} wird durch die Position des " -"zugewiesenen Moduls ersetzt, falls vorhanden." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4683,17 +5137,18 @@ msgstr "" "der ausgewählten Anzahl der hinteren Anschlusspositionen übereinstimmen " "({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Mitglieder" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Ausgangsposition" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4701,70 +5156,72 @@ msgstr "" "Position des ersten Mitgliedsgeräts. Erhöht sich für jedes weitere Mitglied " "um eins." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Für das erste VC-Mitglied muss eine Position angegeben werden." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "Label" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "Länge" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "Längeneinheit" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "Kabel" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "Kabel" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Bei der Eingabe einer Kabellänge muss eine Einheit angegeben werden" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" "Beim Erstellen eines neuen Kabels müssen A- und B-Anschlüsse definiert " "werden." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Verschiedene Anschlusstypen können nicht an dasselbe Kabelende angeschlossen" " werden." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Inkompatible Verbindungssarten: {type_a} und {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "" "A- und B-Anschlüsse können nicht mit demselben Objekt verbunden werden." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "Ende" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "Kabelabschlusspunkt" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "Kabelabschlusspunkte" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4773,38 +5230,38 @@ msgstr "" "Doppelte Terminierung gefunden für {app_label}.{model} {termination_id}: " "Kabel {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kabel können nicht an {type_display} Schnittstellen terminiert werden" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Transportnetzabschlüsse, die an ein Provider-Netzwerk angeschlossen sind, " "sind möglicherweise nicht verkabelt." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "ist aktiv" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "ist abgeschlossen" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "ist aufgeteilt" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "Kabelweg" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "Kabelwege" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4813,18 +5270,18 @@ msgstr "" "{module} wird als Ersatz für die Position des Modulschachts akzeptiert, wenn" " es an einen Modultyp angehängt wird." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Physisches Label" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Komponentenvorlagen können nicht auf einen anderen Gerätetyp verschoben " "werden." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4832,7 +5289,7 @@ msgstr "" "Eine Komponentenvorlage kann nicht gleichzeitig einem Gerätetyp und einem " "Modultyp zugeordnet werden." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4840,138 +5297,138 @@ msgstr "" "Eine Komponentenvorlage muss entweder einem Gerätetyp oder einem Modultyp " "zugeordnet sein." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "Vorlage für Konsolenanschluss" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "Vorlagen für Konsolenanschlüsse" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "Portvorlage für Konsolenserver" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "Portvorlagen für Konsolenserver" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maximale Leistungsaufnahme" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "zugewiesene Leistungsaufnahme" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "Vorlage für Stromanschluss" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "Vorlagen für Stromanschlüsse" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Die zugewiesene Leistungsaufnahme darf die maximale Leistung " "({maximum_draw}W) nicht überschreiten." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "Phasenlage" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Phase (bei dreiphasiger Stromzufuhr)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "Vorlage für Stromabgang" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "Vorlagen für Steckdosen" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Übergeordneter Stromanschluss ({power_port}) muss zum gleichen Gerätetyp " "gehören" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Übergeordneter Stromanschluss ({power_port}) muss zum gleichen Modultyp " "gehören" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "Nur Verwaltung" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "Bridge-Schnittstelle" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "WLAN Rolle" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "Schnittstellenvorlage" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "Schnittstellenvorlagen" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Eine Schnittstelle kann nicht zu sich selbst überbrückt werden." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Bridge-Schnittstelle ({bridge}) muss zum gleichen Gerätetyp gehören" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Bridge-Schnittstelle ({bridge}) muss zum gleichen Modultyp gehören" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "Position des Rückanschlusses" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "Frontanschluss-Vorlage" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "Frontanschluss-Vorlagen" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Hinterer Anschluss ({name}) muss zum gleichen Gerätetyp gehören" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4980,47 +5437,47 @@ msgstr "" "Ungültige Position des hinteren Anschlusses ({position}); hinterer Anschluss" " {name} hat nur {count} Positionen" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "Positionen" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "Vorlage für den Rückanschluss" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "Vorlagen für Rückanschlüsse" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "Position" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Bezeichner, auf den beim Umbenennen installierter Komponenten verwiesen wird" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "Vorlage für Moduleinsatz" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "Vorlagen für Moduleinsätze" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "Vorlage für Geräteeinsatz" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "Vorlagen für Geräteeinsätze" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5029,209 +5486,214 @@ msgstr "" "Untergeräterolle des Gerätetyps ({device_type}) muss auf „Übergeordnet“ " "gesetzt sein, um Geräteschächte zuzulassen." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "Teile-ID" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Vom Hersteller zugewiesene Teile-ID" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "Vorlage für Inventarartikel" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "Vorlagen für Inventarartikel" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Komponenten können nicht auf ein anderes Gerät verschoben werden." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "Kabelende" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "als verbunden markieren" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "So behandeln, als ob ein Kabel angeschlossen wäre" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" "Beim Anschließen eines Kabels muss das Kabelende (A oder B) angegeben " "werden." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Das Kabelende darf nicht ohne Kabel verlegt werden." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Mit angeschlossenem Kabel kann nicht als verbunden markiert werden." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "" "{class_name} Modelle müssen eine parent_object-Eigenschaft deklarieren" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Physischer Anschlusstyp" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "Geschwindigkeit" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Anschlussgeschwindigkeit in Bit pro Sekunde" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "Konsolenanschluss" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "Konsolenanschlüsse" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "Konsolenserveranschluss" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "Konsolenserveranschlüsse" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "Stromanschluss" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "Stromanschlüsse" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "Stromabgang" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "Steckdosen" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Übergeordneter Stromanschluss ({power_port}) muss zum selben Gerät gehören" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "Modus" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q-Tagging-Strategie" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "übergeordnete Schnittstelle" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "übergeordnete LAG" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Diese Schnittstelle wird nur für Out-of-Band-Verwaltung verwendet" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "Geschwindigkeit (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "Duplex" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "Weltweiter 64-Bit-Name" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "WLAN Kanal" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "Kanalfrequenz (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Wird vom ausgewählten Kanal aufgefüllt (falls gesetzt)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "Sendeleistung (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "WLANs" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "untagged VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "tagged VLANs" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "Schnittstelle" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "Schnittstellen" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "" "{display_type} An Schnittstellen kann kein Kabel angeschlossen werden." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" "{display_type} Schnittstellen können nicht als verbunden markiert werden." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "" "Eine Schnittstelle kann nicht seine eigene übergeordnete Schnittstelle sein." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Nur virtuelle Schnittstellen können einer übergeordneten Schnittstelle " "zugewiesen werden." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5240,7 +5702,7 @@ msgstr "" "Die ausgewählte übergeordnete Schnittstelle ({interface}) gehört zu einem " "anderen Gerät ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5249,7 +5711,7 @@ msgstr "" "Die ausgewählte übergeordnete Schnittstelle ({interface}) gehört zu " "{device}, das nicht Teil des virtuellen Chassis ist {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5258,26 +5720,26 @@ msgstr "" "Die gewählte Bridge-Schnittstelle ({bridge}) gehört zu einem anderen Gerät " "({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" "Die gewählte Bridge-Schnittstelle ({interface}) gehört zu {device}, das " -"nicht Teil des virtuellen Chassis ist {virtual_chassis}." +"nicht Teil des virtuellen Chassis {virtual_chassis}ist." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" "Virtuelle Schnittstellen können keine übergeordnete LAG-Schnittstelle haben." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "" "Eine LAG-Schnittstelle nicht seine eigene übergeordnete Schnittstelle sein." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5285,59 +5747,59 @@ msgstr "" "Die gewählte LAG-Schnittstelle ({lag}) gehört zu einem anderen Gerät " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" " virtual chassis {virtual_chassis}." msgstr "" "Die gewählte LAG-Schnittstelle ({lag}) gehört zu {device}, das nicht Teil " -"des virtuellen Chassis ist {virtual_chassis}." +"des virtuellen Chassis {virtual_chassis} ist." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Virtuelle Schnittstellen können keinen PoE-Modus haben." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Virtuelle Schnittstellen können keinen PoE-Typ haben." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "" "Bei der Festlegung eines PoE-Typs muss der PoE-Modus angegeben werden." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "Die WLAN-Rolle kann nur auf Funkschnittstellen festgelegt werden." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Der Kanal kann nur an drahtlosen Schnittstellen eingestellt werden." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "Die Kanalfrequenz kann nur an drahtlosen Schnittstellen eingestellt werden." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "Bei ausgewähltem Kanal kann keine benutzerdefinierte Frequenz angegeben " "werden." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "Die Kanalbreite kann nur an drahtlosen Schnittstellen eingestellt werden." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Bei ausgewähltem Kanal kann keine benutzerdefinierte Breite angegeben " "werden." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5346,24 +5808,24 @@ msgstr "" "Das untagged VLAN ({untagged_vlan}) muss zu demselben Standort gehören wie " "das übergeordnete Gerät der Schnittstelle, oder es muss global sein." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Abgebildete Position am entsprechenden hinteren Anschluss" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "Frontanschluss" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "Frontanschlüsse" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Rückanschluss ({rear_port}) muss zum selben Gerät gehören" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5372,19 +5834,19 @@ msgstr "" "Ungültige Position des hinteren Anschlusses ({rear_port_position}): Hinterer" " Anschluss {name} hat nur {positions} Stellungen." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Anzahl der Frontanschlüsse, die zugeordnet werden können" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "Rückanschluss" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "Rückanschlüsse" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5393,37 +5855,38 @@ msgstr "" "Die Anzahl der Positionen darf nicht kleiner sein als die Anzahl der " "zugewiesenen Vorderanschlüsse ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "Moduleinsatz" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "Moduleinsätze" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Ein Modulschacht kann nicht zu einem darin installierten Modul gehören." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "Geräteeinsatz" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "Geräteeinsätze" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Dieser Gerätetyp ({device_type}) unterstützt keine Geräteeinsätze." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Ein Gerät kann nicht in sich selbst installiert werden." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5431,120 +5894,122 @@ msgstr "" "Das angegebene Gerät kann nicht installiert werden; Das Gerät ist bereits " "installiert in {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "Inventarartikelrolle" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "Inventarartikelrollen" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "Seriennummer" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "Asset-Tag" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "" "Ein eindeutiges Etikett, das zur Identifizierung dieses Artikels verwendet " "wird" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "erkannt" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Dieser Artikel wurde automatisch erkannt" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "Inventarartikel" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "Inventarartikel" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Kann sich nicht als übergeordnetes Objekt zuweisen." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Der Artikel im übergeordneten Inventar gehört nicht zum selben Gerät." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "" "Ein Inventargegenstand mit untergeordneten Inventargegenständen kann nicht " "bewegt werden" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Inventargegenstand kann nicht einer Komponente auf einem anderen Gerät " "zugewiesen werden" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "Hersteller" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "Hersteller" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "Modell" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "Standard-Betriebssystem" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "Teilenummer" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Diskrete Teilenummer (optional)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "Höhe (HE)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "von der Auslastung ausschließen" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Geräte diesen Typs sind bei der Berechnung der Rackauslastung " "ausgeschlossen." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "hat volle Tiefe" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "" "Das Gerät verbraucht sowohl die vordere als auch die hintere Rackfront." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "Über-/Untergeordnetenstatus" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5553,25 +6018,25 @@ msgstr "" "untergebracht. Lassen Sie das Feld leer, wenn es sich bei diesem Gerätetyp " "weder um ein übergeordnetes noch um ein untergeordnetes handelt." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "Luftstrom" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "Gerätetyp" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "Gerätetypen" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "" "Die HE-Höhe muss in Schritten von 0,5 Höheneinheiten (HE) angegeben werden." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5580,7 +6045,7 @@ msgstr "" "Gerät {device} im Rack {rack} hat nicht genug Platz für eine Höhe von " "{height}HE" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5590,7 +6055,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} Instanzen bereits in Racks " "montiert." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5598,156 +6063,156 @@ msgstr "" "Alle mit diesem Gerät verknüpften Geräteschachtvorlagen müssen gelöscht " "werden, bevor es als übergeordnetes Gerät freigegeben wird." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Untergeordnete Gerätetypen müssen 0 HE sein." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "Modultyp" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "Modultypen" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Virtuelle Maschinen können dieser Rolle zugewiesen werden" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "Geräterolle" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "Geräterollen" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Beschränken Sie dieses Betriebssystem optional auf Geräte eines bestimmten " "Herstellers" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "Betriebssystem" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "Betriebssysteme" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Die Funktion, die dieses Gerät erfüllt" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "vom Hersteller vergebene Gehäuse-Seriennummer" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "" "Ein eindeutiger Wert, der zur Identifizierung dieses Geräts verwendet wird" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "Position (HE)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "Rackseite" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "primäre IPv4-Adresse" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "primäre IPv6-Adresse" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "Out-of-Band-IP-Adresse" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "VC-Position" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Position des virtuellen Gehäuses" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC-Priorität" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Priorität bei der Masterwahl für virtuelle Gehäuse" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "Breitengrad" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS-Koordinate im Dezimalformat (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "Längengrad" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Der Name des Geräts muss pro Standort eindeutig sein." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "Gerät" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "Geräte" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Rack {rack} gehört nicht zum Standort {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Lokation {location} gehört nicht zum Standort {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Rack {rack} gehört nicht zur Lokation {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "" "Es ist nicht möglich, eine Rackseite auszuwählen, ohne ein Rack zuzuweisen." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "" "Es ist nicht möglich, eine Rackposition auszuwählen, ohne ein Rack " "zuzuweisen." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Die Position muss in Schritten von 0,5 Höheneinheiten erfolgen." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Bei der Definition der Rackposition muss die Rackseite angegeben werden." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5755,7 +6220,7 @@ msgstr "" "Ein 0 HE-Gerätetyp ({device_type}) kann keiner Höheneinheit zugewiesen " "werden." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5763,7 +6228,7 @@ msgstr "" "Untergeordnete Gerätetypen können keiner Rackseite zugewiesen werden. Dies " "ist ein Attribut des übergeordneten Geräts." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5771,7 +6236,7 @@ msgstr "" "Untergeordnete Gerätetypen können keiner Rackposition zugewiesen werden. " "Dies ist ein Attribut des übergeordneten Geräts." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5780,22 +6245,22 @@ msgstr "" "HE{position} ist bereits belegt oder verfügt nicht über ausreichend " "Speicherplatz für diesen Gerätetyp: {device_type} ({u_height}HE)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} ist keine IPv4-Adresse." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Die angegebene IP-Adresse ({ip}) ist diesem Gerät nicht zugewiesen." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} ist keine IPv6-Adresse." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5804,18 +6269,18 @@ msgstr "" "Das zugewiesene Betriebssystem ist beschränkt auf {platform_manufacturer} " "Gerätetypen, aber der Typ dieses Geräts gehört zu {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Der zugewiesene Cluster gehört zu einem anderen Standort ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Die Position eines Geräts, das einem virtuellen Gehäuse zugewiesen ist, muss" " definiert sein." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5824,15 +6289,15 @@ msgstr "" "Gerät kann nicht aus dem virtuellen Gehäuse entfernt werden " "{virtual_chassis} weil es derzeit der Master ist." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "Modul" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "Module" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5841,15 +6306,15 @@ msgstr "" "Das Modul muss in einem Modulschacht installiert werden, der zum " "zugewiesenen Gerät gehört ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "Domäne" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "virtuelles Gehäuse" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." @@ -5857,7 +6322,7 @@ msgstr "" "Der gewählte Master ({master}) ist diesem virtuellen Chassis nicht " "zugewiesen." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5866,63 +6331,63 @@ msgstr "" "Das virtuelle Gehäuse kann nicht gelöscht werden {self}. Es gibt " "Mitgliedsschnittstellen, die gehäuseübergreifende LAG-Schnittstellen bilden." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identifizieren" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Numerische Kennung, die für das übergeordnete Gerät eindeutig ist" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "Kommentare" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "Virtual Device Context" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "Virtual Device Context" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} ist keine IPv{family}-Adresse." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "Die primäre IP-Adresse muss zu einer Schnittstelle auf dem zugewiesenen " "Gerät gehören." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "Gewicht" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "Gewichtseinheit" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "" "Wenn ein Gewicht eingegeben wird, muss auch eine Einheit eingegeben werden." -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "Stromverteiler" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "Stromverteiler" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5930,43 +6395,43 @@ msgstr "" "Lokation {location} ({location_site}) befindet sich auf einem anderen " "Standort als {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "liefern" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "Phase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "Spannung" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "Stromstärke" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maximale Auslastung" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Maximal zulässige Auslastung (in Prozent)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "verfügbare Leistung" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "Stromzufuhr" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "Stromzufuhren" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5975,63 +6440,63 @@ msgstr "" "Rack {rack} ({rack_site}) und Stromverteiler {powerpanel} " "({powerpanel_site}) befinden sich an verschiedenen Sites." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Die Spannung darf für die Wechselstromversorgung nicht negativ sein" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "Breite" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Breite von Schiene zu Schiene" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Höhe in Höheneinheiten (HE)" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "Start HE" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Start HE für Rack" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "absteigende Höheneinheiten" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Die Höheneinheiten sind von oben nach unten nummeriert" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "äußere Breite" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Außenabmessungen des Racks (Breite)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "äußere Tiefe" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Außenabmessung des Racks (Tiefe)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "Maßeinheit" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "Einbautiefe" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6039,78 +6504,79 @@ msgstr "" "Maximale Tiefe eines montierten Geräts in Millimetern. Bei Racks mit vier " "Pfosten ist dies der Abstand zwischen den vorderen und hinteren Schienen." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "maximales Gewicht" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Maximale Tragfähigkeit des Racks" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "Formfaktor" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "Racktyp" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "Racktypen" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Muss eine Einheit angeben, wenn eine äußere Breite/Tiefe eingestellt wird" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "" "Bei der Einstellung eines Höchstgewichts muss eine Einheit angegeben werden" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "Rolle des Rack" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "Rackrollen" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "Einrichtungs-ID" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Lokal zugewiesener Bezeichner" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Funktionelle Rolle" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "" "Ein eindeutiger Wert, das zur Identifizierung dieses Racks verwendet wird" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "Rack" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "Racks" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "" "Die zugewiesene Lokation muss zum übergeordneten Standort gehören ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6119,7 +6585,7 @@ msgstr "" "Das Rack muss mindestens {min_height}HE groß sein, um aktuell installierten " "Geräte unterzubringen." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6128,905 +6594,967 @@ msgstr "" "Die Nummerierung der Höheneinheiten muss bei {position} oder weniger " "beginnen, um die aktuell installierten Geräte unterzubringen." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Die Lokation muss vom selben Standort stammen, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "Einheiten" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "HE-Reservierung" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "Rackreservierungen" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Ungültige Einheit(en) für {height}HE Rack: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Die folgenden Einheiten wurden bereits reserviert: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "" "Eine Region der obersten Ebene mit diesem Namen ist bereits vorhanden." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Eine Top-Level-Region mit dieser URL-Slug existiert bereits." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "Region" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "Regionen" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "" "Eine Standortgruppe auf oberster Ebene mit diesem Namen ist bereits " "vorhanden." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "" "Eine Standortgruppe auf oberster Ebene mit diesem URL-Slug existiert " "bereits." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "Standortgruppe" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "Standortgruppen" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Vollständiger Name des Standorts" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "Einrichtung" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Lokale Einrichtungs-ID oder Beschreibung" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "physische Adresse" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Physischer Standort des Gebäudes" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "Lieferadresse" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Falls anders als die physische Adresse" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "Standort" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "Standorte" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "" "Eine Lokation mit diesem Namen ist bereits in dem angegebenen Standort " "vorhanden." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "" "Ein Lokation mit diesem URL-Slug existiert bereits auf dem angegebenen " "Standort." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "Lokation" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "Lokationen" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Übergeordneter Standort ({parent}) muss zum gleichen Standort gehören " "({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Abschlusspunkt A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Abschlusspunkt B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Gerät A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Gerät B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Standort A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Standort B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Rack A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Rack B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Standort A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Standort B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Erreichbar" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Geräte" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VMs" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Konfigvorlage" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Standortgruppe" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP-Adresse" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4-Adresse" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6-Adresse" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "VC-Position" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "VC-Priorität" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Übergeordnetes Gerät" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Position (Geräteschacht)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Konsolenanschlüsse" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Konsolenserveranschlüsse" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Stromanschlüsse" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Steckdosen" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Schnittstellen" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Frontanschlüsse" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Geräteeinsätze" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Moduleinsätze" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Inventarartikel" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Moduleinsatz" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Inventarartikel" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Farbe des Kabels" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Verbindungsenden" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Als verbunden markieren" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maximaler Stromverbrauch (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Zugewiesener Stromverbrauch (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP-Adressen" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "FHRP-Gruppen" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Nur zur Verwaltung" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDCs" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Installiertes Modul" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Seriennummer des Moduls" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Modul-Asset-Tag" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Status des Moduls" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Komponente" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Artikel" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Gerätetypen" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Modultypen" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Betriebssysteme" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Standard-Betriebssystem" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Volle Tiefe" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Höhe in HE" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instanzen" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Konsolenanschlüsse" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Konsolenserveranschlüsse" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Stromanschlüsse" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Steckdosen" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Frontanschlüsse" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Rückanschlüsse" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Geräteeinsätze" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Moduleinsätze" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Stromzufuhren" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Max. Auslastung" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Verfügbare Leistung (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Racks" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Höhe" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Äußere Breite" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Äußere Tiefe" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Maximales Gewicht" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Platz" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Standorte" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Der Testfall muss peer_termination_type setzen" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Verbindung von {count} {type} unterbrochen" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Rackreservierungen" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Nicht in einem Rack befindliche Geräte" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Konfigurationsvorlage" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Konfiguration rendern" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Ein Fehler ist beim Rendern der Vorlage aufgetreten: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Virtuelle Maschinen" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Gerät {device} im Schacht {device_bay} installiert." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Gerät {device} im Schacht {device_bay} entfernt." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Untergeordnet" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Mitglied hinzugefügt {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Ein Hauptgerät (Master Device) {device} kann von einem virtuellen Gehäuse " "nicht entfernt werden." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "{device} vom virtuellen Gehäuse {chassis} entfernt." -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Unbekanntes verwandtes Objekt (e): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "" "Das Ändern des Typs von benutzerdefinierten Feldern wird nicht unterstützt." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Die Planung ist für dieses Skript nicht aktiviert." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Text" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Text (lang)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Ganzzahl" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Dezimal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Boolean (wahr/falsch)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Datum" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Datum & Uhrzeit" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Auswahl" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Mehrfachauswahl" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Mehrere Objekte" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Deaktiviert" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Lose" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Exakt" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Immer" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Wenn gesetzt" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Versteckt" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Ja" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Nein" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Link" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Neuestes" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Älteste" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alphabetisch (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alphabetisch (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Info" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Erfolg" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Warnung" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Gefahr" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Debug" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Standard" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Fehlschlag" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Stündlich" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 Stunden" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "täglich" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Wöchentlich" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 Tage" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Erstellen" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Aktualisieren" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Löschen" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Blau" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Purpur" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Pink" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Rot" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Orange" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Gelb" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Grün" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Türkis" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Cyanblau" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Grau" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Schwarz" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Weiß" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Skript" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Benachrichtigung" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "" "Unbekannter Operator: {op}. Muss einer von den folgenden sein: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Nicht unterstützter Wertetyp: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Ungültiger Typ für {op} Dienst / Port: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Der Regelsatz muss ein Dictionary sein, nicht {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Ungültiger Logik-Typ: es muss 'AND' oder 'OR' sein. Siehe Dokumentation" -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Inkorrekte Key(s) rückgemeldet. Bitte die Dokumentation checken." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Widget-Typ" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Nicht registrierte Widget-Klasse: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} muss eine render () -Methode definieren." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Hinweis" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Zeigt einige beliebige benutzerdefinierte Inhalte an. Markdown wird " "unterstützt." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Anzahl der Objekte" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -7034,273 +7562,295 @@ msgstr "" "Zeigt eine Reihe von NetBox-Modellen und die Anzahl der für jeden Typ " "erstellten Objekte an." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filter, die beim Zählen der Anzahl der Objekte angewendet werden" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Ungültiges Format. Objektfilter müssen als Wörterbuch übergeben werden." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Liste der Objekte" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Zeigt eine beliebige Liste von Objekten an." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Die Standardanzahl der anzuzeigenden Objekte" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Ungültiges Format. URL-Parameter müssen als Verzeichnis übergeben werden." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS-Feed" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Betten Sie einen RSS-Feed von einer externen Website ein." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "Feed-URL" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Die maximale Anzahl der anzuzeigenden Objekte" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Wie lange soll der Inhalt zwischengespeichert werden (in Sekunden)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Lesezeichen" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Zeige persönliche Lesezeichen an" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Unbekannter Aktionstyp für eine Ereignisregel: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Ereignispipeline kann nicht importiert werden {name} Fehler: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Skriptmodul (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Datei (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Gruppe (Name)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Clustertyp" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Clustertyp (URL-Slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Mandantengruppe" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Mandantengruppe (URL-Slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Schlagwort" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Schlagwort (URL-Slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Hat lokale Konfigurationskontextdaten" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Name der Gruppe" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Erforderlich" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Muss einzigartig sein" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "UI sichtbar" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "UI editierbar" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Ist klonbar" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimaler Wert" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maximaler Wert" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Regex für die Überprüfung" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Verhalten" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Neues Fenster" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Button-Klasse" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIME-Typ" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Dateiendung" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Als Anlage" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Geteilt" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP-Method" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "Payload-URL" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL-Verifizierung" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Secret" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA-Dateipfad" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Ereignistypen" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Ist aktiv" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Typen von Objekten" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Ein oder mehrere zugewiesene Objekttypen" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Felddatentyp (z. B. Text, Integer usw.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Typ des Objekts" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Objekttyp (für Objekt- oder Mehrfachobjektfelder)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Auswahlset" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Auswahlset (für Auswahlfelder)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "" "Ob das benutzerdefinierte Feld in der Benutzeroberfläche angezeigt wird" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "" "Ob das benutzerdefinierte Feld in der Benutzeroberfläche bearbeitet werden " "kann" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "" "Der Basissatz vordefinierter Auswahlmöglichkeiten, die verwendet werden " "sollen (falls vorhanden)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7309,188 +7859,204 @@ msgstr "" "optionalen Bezeichnungen, die durch einen Doppelpunkt getrennt sind: " "„Choice1:First Choice, Choice2:Second Choice“" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "Button-Klasse" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Die Klasse des ersten Links in einer Gruppe wird für den Dropdown-Button " "verwendet" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Ereignistype(n), die diese Regel auslösen" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Aktionsobjekt" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Webhook-Name oder Skript als gepunkteter Pfad module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} nicht gefunden" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Skript {name} nicht gefunden" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Zugewiesener Objekttyp" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Die Klassifizierung des Eintrags" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Benutzer" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Durch Kommas getrennte Benutzernamen, umgeben von doppelten " "Anführungszeichen" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Gruppen" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "" "Gruppennamen, getrennt durch Kommas, umgeben von doppelten Anführungszeichen" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Verwandter Objekttyp" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Feld-Typ" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Auswahlmöglichkeiten" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Daten" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Datei" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Inhaltstypen" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP-Inhaltstyp" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Ereignistyp" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Typ der Aktion" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Typ des markierten Objekts" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Erlaubter Objekttyp" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regionen" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Standortgruppen" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Lokationen" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Gerätetypen" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Prefix und VLAN-Rollen" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Clustertypen" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Clustergruppen" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Cluster" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Mandantengruppen" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Die Objekttypen, die dieses benutzerdefinierte Feld haben" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Vorgabewert" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Typ des zugehörigen Objekts (nur für Objekt-/Mehrfachobjektfelder)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filter für verwandte Objekte" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Geben Sie Abfrageparameter als JSON-Objekt an." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Benutzerdefiniertes Feld" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7498,7 +8064,7 @@ msgstr "" "Die Art der in diesem Feld gespeicherten Daten. Wählen Sie für " "Objekt-/Multiobjekt-Felder unten den zugehörigen Objekttyp aus." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7506,11 +8072,11 @@ msgstr "" "Dies wird als Hilfetext für das Formularfeld angezeigt. Markdown wird " "unterstützt." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Verwandtes Objekt" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7519,15 +8085,16 @@ msgstr "" "Bezeichnung angegeben werden, indem ein Doppelpunkt angehängt wird. " "Beispiel:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Benutzerdefinierter Link" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Vorlagen" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7537,7 +8104,7 @@ msgstr "" "{example}. Links, die als leerer Text dargestellt werden, werden nicht " "angezeigt." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7545,169 +8112,177 @@ msgstr "" "Jinja2-Vorlagencode für die Link-URL. Verweisen Sie auf das Objekt als " "{example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Vorlagencode" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Vorlage exportieren" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Rendern" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Der Vorlageninhalt wird aus der unten ausgewählten Remote-Quelle gefüllt." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Muss entweder lokalen Inhalt oder eine Datendatei angeben" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Gespeicherter Filter" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "" "Eine Benachrichtigungsgruppe muss mindestens einen Benutzer oder eine Gruppe" " haben." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP-Request" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Wahl der Aktion" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "" "Geben Sie die Bedingungen ein in JSON - " "Format." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." msgstr "" -"Geben Sie Parameter ein, die an die Aktion übergeben werden sollen JSON formatieren." +"Geben Sie Parameter ein, die an die Aktion übergeben werden sollen, in JSON formatiert." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Ereignisregel" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Trigger" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Benachrichtigungsgruppe" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Mandanten" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Die Daten werden aus der unten ausgewählten Remote-Quelle gefüllt." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Muss entweder lokale Daten oder eine Datendatei angeben" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Inhalt" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "geplant am" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Planen Sie die Ausführung des Berichts auf eine festgelegte Zeit" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Wiederholt sich alle" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Intervall, in dem dieser Bericht erneut ausgeführt wird (in Minuten)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (aktuelle Uhrzeit: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Die geplante Zeit muss in der Zukunft liegen." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Änderungen übernehmen" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Änderungen in die Datenbank übernehmen (bei einem Probelauf das Häkchen " "entfernen)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Planen Sie die Ausführung des Skripts auf eine festgelegte Zeit" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervall, in dem dieses Skript erneut ausgeführt wird (in Minuten)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Datenbankänderungen wurden automatisch rückgängig gemacht." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Das Skript wurde mit einem Fehler abgebrochen: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Eine Ausnahme ist aufgetreten: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Datenbankänderungen wurden aufgrund eines Fehlers rückgängig gemacht." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Keine Indexer gefunden!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "Konfigurationsvorlage" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "Konfigurationsvorlage" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON-Daten müssen in Objektform vorliegen. Beispiel:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7715,19 +8290,19 @@ msgstr "" "Lokale Konfigurationskontextdaten haben im endgültigen gerenderten " "Konfigurationskontext Vorrang vor Quellkontexten" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "Vorlagen-Code" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2-Vorlagen-Code." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "Umgebungsparameter" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7737,43 +8312,43 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">zusätzliche" " Parameter um beim Aufbau der Jinja2-Umgebung zu bestehen." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "Konfigurationsvorlage" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "Konfigurationsvorlagen" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Objekt(e), für die dieses Feld gilt." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Der Datentyp, den dieses benutzerdefinierte Feld enthält" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Der Typ des NetBox-Objekts, dem dieses Feld zugeordnet ist (für " "Objektfelder)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Interner Feldname" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Nur alphanumerische Zeichen und Unterstriche sind zulässig." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Doppelte Unterstriche sind in den Namen benutzerdefinierter Felder nicht " "zulässig." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7781,21 +8356,21 @@ msgstr "" "Name des Feldes, wie er den Benutzern angezeigt wird (falls nicht angegeben," " wird der Name des Felds verwendet)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "Name der Gruppe" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "" "Benutzerdefinierte Felder innerhalb derselben Gruppe werden zusammen " "angezeigt" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "erforderlich" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7803,20 +8378,20 @@ msgstr "" "Dieses Feld ist erforderlich, wenn Sie neue Objekte erstellen oder ein " "vorhandenes Objekt bearbeiten." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "muss einzigartig sein" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "" "Der Wert dieses Feldes muss für das zugewiesene Objekt eindeutig sein." -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "Gewichtung der Suche" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7824,11 +8399,11 @@ msgstr "" "Gewichtung für die Suche. Niedrigere Werte werden als wichtiger angesehen. " "Felder mit einem Suchgewicht von Null werden ignoriert." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "Filterlogik" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7836,11 +8411,11 @@ msgstr "" "Loose entspricht einer beliebigen Instanz einer bestimmten Zeichenfolge; " "exact entspricht dem gesamten Feld." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "Standard" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7848,7 +8423,7 @@ msgstr "" "Standardwert für das Feld (muss ein JSON-Wert sein). Kapsele Zeichenketten " "mit doppelten Anführungszeichen ein (z. B. „Foo“)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7857,36 +8432,36 @@ msgstr "" "(muss ein JSON-Wert sein). Kapseln Sie Zeichenketten mit doppelten " "Anführungszeichen ein (z. B. „Foo“)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "Gewicht anzeigen" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "" "Felder mit höheren Gewichten werden in einem Formular niedriger angezeigt." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "minimaler Wert" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Zulässiger Mindestwert (für numerische Felder)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maximaler Wert" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Zulässiger Maximalwert (für numerische Felder)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "Regex für die Validierung" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7898,195 +8473,197 @@ msgstr "" "Beispiel ^ [A-Z]{3}$ begrenzt die Werte auf genau drei " "Großbuchstaben." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "Auswahlset" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Gibt an, ob das benutzerdefinierte Feld in der Benutzeroberfläche angezeigt " "wird" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Gibt an, ob der Wert des benutzerdefinierten Felds in der Benutzeroberfläche" " bearbeitet werden kann." -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "ist klonbar" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Replizieren Sie diesen Wert beim Klonen von Objekten" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "benutzerdefiniertes Feld" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "benutzerdefinierte Felder" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Ungültiger Standardwert \"{value}\": {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Ein Mindestwert kann nur für numerische Felder festgelegt werden" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Ein Maximalwert kann nur für numerische Felder festgelegt werden" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Die Überprüfung regulärer Ausdrücke wird nur für Text- und URL-Felder " "unterstützt" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Eindeutigkeit kann für boolesche Felder nicht erzwungen werden" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Auswahlfelder müssen eine Reihe von Auswahlmöglichkeiten enthalten." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Auswahlmöglichkeiten können nur für Auswahlfelder festgelegt werden." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Objektfelder müssen einen Objekttyp definieren." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} Felder definieren möglicherweise keinen Objekttyp." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Ein verwandter Objektfilter kann nur für Objektfelder definiert werden." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Der Filter muss als Wörterbuch definiert werden, das Attributen Werten " "zuordnet." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Wahr" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Falsch" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" "Die Werte müssen mit diesem Regex übereinstimmen: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Der Wert muss eine Zeichenfolge sein." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Wert muss mit Regex '{regex}' übereinstimmen" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Der Wert muss eine Ganzzahl sein." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Wert muss mindestens {minimum} sein" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Wert darf nicht {maximum} überschreiten" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Der Wert muss eine Dezimalzahl sein." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Der Wert muss wahr oder falsch sein." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Datumswerte müssen im ISO 8601-Format (YYYY-MM-DD) vorliegen." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Datums- und Uhrzeitwerte müssen im ISO 8601-Format (YYYY-MM-DD HH:MM:SS) " "vorliegen." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Ungültige Auswahl ({value}) für Auswahlsatz {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Ungültige Auswahl (en) ({value}) für Auswahlsatz {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Der Wert muss eine Objekt-ID sein, nicht {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Der Wert muss eine Liste von Objekt-IDs sein, nicht {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Ungültige Objekt-ID gefunden: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Das erforderliche Feld darf nicht leer sein." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Basissatz vordefinierter Auswahlmöglichkeiten (optional)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Die Auswahlmöglichkeiten werden automatisch alphabetisch sortiert" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "benutzerdefinierter Feldauswahlsatz" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "Benutzerdefinierte Feldoptionen" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Muss Basis- oder zusätzliche Auswahlmöglichkeiten definieren." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8095,61 +8672,61 @@ msgstr "" "Auswahl kann nicht entfernt werden {choice} es gibt {model} Objekte, die " "darauf verweisen." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "Layout" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "Konfiguration" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "Dashboard" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "Dashboards" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "Objekttypen" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Die Objekte, für die diese Regel gilt." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Die Ereignistypen, die diese Regel auslösen." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "Dienste" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "" "Eine Reihe von Bedingungen, die bestimmen, ob das Ereignis generiert wird." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "Aktionstyp" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Zusätzliche Daten, die an das Aktionsobjekt übergeben werden" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "Ereignisregel" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "Ereignisregeln" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8159,7 +8736,7 @@ msgstr "" "definiert wurde. Die Verarbeitung von Jinja2-Vorlagen wird im gleichen " "Kontext wie der Anforderungstext unterstützt." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available hier." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "zusätzliche Kopfzeilen" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8185,11 +8762,11 @@ msgstr "" "definiert werden Name: Wert. Die Jinja2-Vorlagenverarbeitung " "wird im gleichen Kontext wie der Anforderungstext (unten) unterstützt." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "Body Template" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8202,11 +8779,11 @@ msgstr "" "Modell, Zeitstempel, Nutzername, " "Anforderungs_ID, und Daten." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "Geheimer Schlüssel" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8217,16 +8794,16 @@ msgstr "" "Geheimnis als Schlüssel verwendet wird. Das Geheimnis wird in der Anfrage " "nicht übertragen." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" "Aktivieren Sie die SSL-Zertifikatsüberprüfung. Mit Vorsicht deaktivieren!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA-Dateipfad" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8235,65 +8812,65 @@ msgstr "" "werden soll. Lassen Sie das Feld leer, um die Systemstandardwerte zu " "verwenden." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "Webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "Webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Geben Sie keine CA-Zertifikatsdatei an, wenn die SSL-Überprüfung deaktiviert" " ist." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Die Objekttyp(en), für die dieser Link gilt." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "Linktext" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Jinja2-Vorlagencode für Linktext" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "Link-URL" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Jinja2-Vorlagencode für Link-URL" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Links mit derselben Gruppe werden als Drop-down-Menü angezeigt" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "neues Fenster" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Link erzwingen, in einem neuen Fenster zu öffnen" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "benutzerdefinierter Link" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "benutzerdefinierte Links" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Die Objekttyp(en), für die diese Vorlage gilt." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8301,1092 +8878,1168 @@ msgstr "" "Jinja2-Vorlagencode. Die Liste der exportierten Objekte wird als " "Kontextvariable mit dem Namen übergeben Abfragesatz." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Die Standardeinstellung ist text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "Dateierweiterung" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Erweiterung, die an den gerenderten Dateinamen angehängt werden soll" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "als Anlage" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Datei als Anlage herunterladen" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "Vorlage exportieren" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "Exportvorlagen" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "" "„{name}\"ist ein reservierter Name. Bitte wählen Sie einen anderen Namen." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Der/Die Objekttyp (en), für die dieser Filter gilt." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "geteilt" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "gespeicherter Filter" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "gespeicherte Filter" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Filterparameter müssen als Wörterbuch mit Schlüsselwortargumenten " "gespeichert werden." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "Höhe des Bildes" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "Breite des Bildes" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "Bildanhang" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "Bildanhänge" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "Bildanhänge können diesem Objekttyp nicht zugewiesen werden ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "Typ" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "Journaleintrag" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "Journaleinträge" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Journaling wird für diesen Objekttyp nicht unterstützt ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "Lesezeichen" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "Lesezeichen" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Diesem Objekttyp können keine Lesezeichen zugewiesen werden ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "lesen" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "Ereignis" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "Benachrichtigung" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "Benachrichtigungen" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objekte dieses Typs ({type}) unterstützen keine Benachrichtigungen." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "Gruppen" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "Benutzer" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "Benachrichtigungsgruppe" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "Benachrichtigungsgruppen" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "Abonnement" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "Abonnements" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "ist ausführbar" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "Skript" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "Skripte" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "Skriptmodul" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "Skriptmodule" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "Zeitstempel" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "Feld" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "Wert" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "zwischengespeicherter Wert" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "zwischengespeicherte Werte" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "Branch" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "Branches" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "vorbereitete Änderung" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "vorbereitete Änderungen" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Die Objekttyp (en), auf die dieses Tag angewendet werden kann." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "Tag" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "Tags" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "markierter Artikel" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "markierte Artikel" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Skriptdaten" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parameter für die Skriptausführung" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Abweisen" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Objekttypen" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Überprüfen Sie die Eindeutigkeit" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Sichtbar" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Editierbar" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Verwandter Objekttyp" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Auswahlset" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Ist klonbar" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimaler Wert" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maximaler Wert" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Überprüfung Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Anzahl" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Alphabetisch sortieren" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Neues Fenster" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Als Anlage" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Datendatei" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Synchronisiert" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Bild" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Größe (Byte)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Lesen" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL-Validierung" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Ereignistypen" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Geräterollen" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Kommentare (Kurz)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linie" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Stufe" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Nachricht" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Methode" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Stellen Sie sicher, dass dieser Wert gleich ist %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "" "Stellen Sie sicher, dass dieser Wert nicht gleich ist %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Dieses Feld muss leer sein." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Dieses Feld darf nicht leer sein." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Validierungsregeln müssen als Wörterbuch übergeben werden" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "" "Die benutzerdefinierte Überprüfung ist fehlgeschlagen für {attribute}: " "{exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" -msgstr "Ungültiges Attribut“{name}„zur Anfrage" +msgstr "Ungültiges Attribut \"{name}\" zur Anfrage" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" -msgstr "Ungültiges Attribut“{name}„für {model}" +msgstr "Ungültiges Attribut “{name}\" für {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Ihr Dashboard wurde zurückgesetzt." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Hinzugefügtes Widget:" -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Aktualisiertes Widget: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Gelöschtes Widget: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Fehler beim Löschen des Widgets: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "" "Das Skript kann nicht ausgeführt werden: Der RQ-Worker-Prozess läuft nicht." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "" "Geben Sie eine gültige IPv4- oder IPv6-Adresse mit optionaler Maske ein." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Ungültiges IP-Adressformat: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" "Geben Sie ein gültiges IPv4- oder IPv6-Präfix und eine Maske in CIDR-" "Notation ein." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Ungültiges IP-Präfixformat: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Für die angeforderte (n) Präfixgröße (n) ist nicht genügend Speicherplatz " "verfügbar" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Container" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standard" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Checkpoint" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Klartext" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Ungültiges IP-Adressformat: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Ziel importieren" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Importziel (Name)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Ziel exportieren" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Exportziel (Name)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "VRF importieren" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "VRF (RD) importieren" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "VRF exportieren" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "VRF (RD) exportieren" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "L2VPN importieren" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "L2VPN importieren (Identifier)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "L2VPN exportieren" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "L2VPN exportieren (Identifier)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefix" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (URL-Slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Innerhalb des Prefixes" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Innerhalb und einschließlich Präfix" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Präfixe, die dieses Präfix oder diese IP enthalten" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Länge der Maske" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN-Nummer (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adresse" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Bereiche, die dieses Präfix oder diese IP enthalten" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Übergeordnetes Präfix" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Virtuelle Maschine (Name)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Virtuelle Maschine (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Schnittstelle (Name)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM-Schnittstelle (Name)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM-Schnittstelle (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP-Gruppe (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Ist einer Schnittstelle zugewiesen" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Ist zugewiesen" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Dienst (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT innerhalb der IP-Adresse (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Zugewiesene Schnittstelle" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Zugewiesene VM-Schnittstelle" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP-Adresse (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP-Adresse" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Primäre IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Primäre IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Geben Sie eine gültige IPv4- oder IPv6-Adresse (ohne Maske) ein." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Ungültiges IPv4/IPv6-Adressformat: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Dieses Feld erfordert eine IP-Adresse ohne Maske." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Bitte geben Sie eine gültige IPv4- oder IPv6-Adresse an." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Geben Sie eine gültige IPv4- oder IPv6-Adresse (mit CIDR-Maske) ein." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Eine CIDR-Maske (z. B. /24) ist erforderlich." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Adressmuster" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Erzwingen Sie einzigartigen Speicherplatz" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Ist privat" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "hinzugefügt am" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN-Gruppe" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Länge des Prefixes" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Ist ein Pool" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Als voll ausgelastet behandeln" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN-Zuweisung" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS-Name" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protokoll" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Gruppen-ID" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Typ der Authentifizierung" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Authentifizierungsschlüssel" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Authentifizierung" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Art des Geltungsbereichs" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Geltungsbereich" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN-ID-Bereiche" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Standort und Gruppe" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Ports" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Routenziele importieren" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Routenziele exportieren" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Zugewiesenes RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLAN-Gruppe (falls vorhanden)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Übergeordnetes Gerät der zugewiesenen Schnittstelle (falls vorhanden)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Virtuelle Maschine" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Übergeordnete VM der zugewiesenen Schnittstelle (falls vorhanden)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Ist primär" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Machen Sie dies zur primären IP für das zugewiesene Gerät" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "Ist Out-Of-Band" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" +"Geben Sie dies als Out-of-Band-IP-Adresse für das zugewiesene Gerät an" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Kein Gerät oder virtuelle Maschine angegeben; kann nicht als primäre IP " "festgelegt werden" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" +"Kein Gerät angegeben; kann nicht als Out-of-Band-IP eingerichtet werden" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "Out-of-Band-IP für virtuelle Maschinen kann nicht eingerichtet werden" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Keine Schnittstelle angegeben; kann nicht als primäre IP festgelegt werden" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" +"Keine Schnittstelle angegeben; kann nicht als Out-of-Band-IP festgelegt " +"werden" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Authentifizierungstyp" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Art des Umfangs (App und Modell)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Zugewiesene VLAN-Gruppe" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP-Protokoll" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Erforderlich, wenn es keiner VM zugewiesen ist" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Erforderlich, wenn es keinem Gerät zugewiesen ist" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} ist diesem Gerät/dieser VM nicht zugewiesen." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Routenziele" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Ziele importieren" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Ziele exportieren" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importiert von VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Exportiert von VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privat" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Adressfamilie" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Bereich" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Start" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Ende" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Suche innerhalb" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "In VRF präsent" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Gerät/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Übergeordnetes Prefix" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Zugewiesenes Gerät" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Zugewiesene VM" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Einer Schnittstelle zugewiesen" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS-Name" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLANs" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Enthält VLAN-ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN-ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Virtuelle Maschine" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Ziel der Route" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Aggregat" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN-Bereich" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Standort-/VLAN-Zuweisung" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP-Bereich" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP-Gruppe" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Machen Sie dies zur primären IP für das Gerät/die VM" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "Machen Sie dies zur Out-of-Band-IP für das Gerät" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (innen)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Eine IP-Adresse kann nur einem einzigen Objekt zugewiesen werden." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Die IP-Adresse kann nicht neu zugewiesen werden, solange sie als primäre IP " -"für das übergeordnete Objekt festgelegt ist" +"Die primäre IP-Adresse für das übergeordnete Gerät/die virtuelle Maschine " +"kann nicht neu zugewiesen werden" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" +"Out-of-Band-IP-Adresse für das übergeordnete Gerät kann nicht neu zugewiesen" +" werden" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Nur IP-Adressen, die einer Schnittstelle zugewiesen sind, können als primäre" " IPs festgelegt werden." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" +"Nur IP-Adressen, die einer Geräteschnittstelle zugewiesen sind, können als " +"Out-of-Band-IP für ein Gerät festgelegt werden." + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Virtuelle IP-Adresse" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Zuweisung ist bereits vorhanden" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN-IDs" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Untergeordnete VLANs" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9394,136 +10047,137 @@ msgstr "" "Kommagetrennte Liste mit einer oder mehreren Portnummern. Ein Bereich kann " "mit einem Bindestrich angegeben werden." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Vorlage für den Service" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Port(s)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Dienst / Port" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Dienstevorlagen (Ports)" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Aus Vorlage" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Benutzerdefiniert" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Muss Name, Protokoll und Port(s) angeben, wenn keine Dienstevorlage " "verwendet wird." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "Start" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN-Bereich" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN-Bereiche" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" "ASN wird gestartet ({start}) muss niedriger sein als das Ende der ASN " "({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" "Regionale Internetregistrierung, die für diesen AS-Nummernraum zuständig ist" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- oder 32-Bit-Autonome Systemnummer" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "Gruppen-ID" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "Protokoll" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "Authentifizierungstyp" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "Authentifizierungsschlüssel" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP-Gruppe" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "FHRP-Gruppen" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "FHRP-Gruppenzuweisung" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "FHRP-Gruppenaufgaben" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "Privat" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "Der von diesem RIR verwaltete IP-Bereich gilt als privat" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIRs" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4- oder IPv6-Netzwerk" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "" "Regionale Internetregistrierung, die für diesen IP-Bereich zuständig ist" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "Datum hinzugefügt" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "Aggregat" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "Aggregate" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Ein Aggregat mit der Maske /0 kann nicht erstellt werden." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9532,7 +10186,7 @@ msgstr "" "Aggregate können sich nicht überschneiden. {prefix} wird bereits von einem " "vorhandenen Aggregat abgedeckt ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9541,161 +10195,163 @@ msgstr "" "Präfixe können Aggregate nicht überlappen. {prefix} deckt ein vorhandenes " "Aggregat ab ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "Rolle" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "Rollen" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "Prefix" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "IPv4- oder IPv6-Netzwerk mit Maske" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Betriebsstatus dieses Prefixes" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Die Hauptfunktion dieses Prefixes" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "ist ein Pool" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Alle IP-Adressen innerhalb dieses Prefixes werden als nutzbar betrachtet" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "als verwendet markieren" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "Prefixe" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Prefix mit der Maske /0 kann nicht erstellt werden." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "globale Tabelle" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Doppeltes Prefix gefunden in {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "Startadresse" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4- oder IPv6-Adresse (mit Maske)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "Endadresse" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Betriebsstatus dieses Bereichs" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Die Hauptfunktion dieses Bereichs" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP-Bereich" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP-Bereiche" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Die Versionen der Anfangs- und Endadresse müssen übereinstimmen" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Die Masken für Start- und Endadressen müssen übereinstimmen" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "Die Endadresse muss größer als die Startadresse sein ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Definierte Adressen überschneiden sich mit dem Bereich {overlapping_range} " "im VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Der definierte Bereich überschreitet die maximal unterstützte Größe " "({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "Adresse" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Der Betriebsstatus dieser IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Die funktionale Rolle dieser IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (innen)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "Die IP, für die diese Adresse die „externe“ IP ist" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Hostname oder FQDN (Groß- und Kleinschreibung nicht beachten)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP-Adressen" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Die IP-Adresse mit der Maske /0 kann nicht erstellt werden." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} ist eine Netzwerk-ID, die keiner Schnittstelle zugewiesen werden darf." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." @@ -9703,110 +10359,122 @@ msgstr "" "{ip} ist eine Broadcast-Adresse, die keiner Schnittstelle zugewiesen werden " "darf." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Doppelte IP-Adresse gefunden in {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Die IP-Adresse kann nicht neu zugewiesen werden, solange sie als primäre IP " +"für das übergeordnete Objekt festgelegt ist" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Nur IPv6-Adressen kann der SLAAC-Status zugewiesen werden" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "Portnummern" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "Servicevorlage" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "Servicevorlagen" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Die spezifischen IP-Adressen (falls vorhanden), an die dieser Dienst " "gebunden ist" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "Dienst / Port" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "Dienste (Ports)" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Ein Dienst kann nicht gleichzeitig einem Gerät und einer virtuellen Maschine" " zugeordnet werden." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Ein Dienst muss entweder einem Gerät oder einer virtuellen Maschine " "zugeordnet sein." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN-Gruppen" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "scope_type kann nicht ohne scope_id gesetzt werden." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "scope_id kann nicht ohne scope_type gesetzt werden." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" +"Start-VLAN-ID im Bereich ({value}) darf nicht kleiner sein als {minimum}" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" +"Ende der VLAN-ID im Bereich ({value}) darf {maximum}nicht überschreiten " -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" +"Die End-VLAN-ID im Bereich muss größer oder gleich der Start-VLAN-ID sein " +"({range})" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Bereiche dürfen sich nicht überschneiden." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" "Der spezifische Standort, der dieses VLAN zugewiesen ist (falls vorhanden)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN-Gruppe (optional)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerische VLAN-ID (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Betriebsstatus dieses VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Die Hauptfunktion dieses VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9815,165 +10483,167 @@ msgstr "" "VLAN ist der Gruppe {group} (Scope: {scope}) zugewiesen; kann nicht auch dem" " Standort {site} zugewiesen werden." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "VID muss in Bereichen liegen {ranges} für VLANs in einer Gruppe {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "Routenunterscheidungsmerkmal" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Eindeutiger Routenbezeichner (wie in RFC 4364 definiert)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "einzigartigen Raum erzwingen" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Vermeiden Sie doppelte Präfixe/IP-Adressen in diesem VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRFs" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Routenzielwert (formatiert gemäß RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "Ziel der Route" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "Routenziele" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ALS PUNKT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Anzahl der Standorte" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Anzahl der Provider" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Aggregate" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Hinzugefügt" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Prefixe" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Auslastung" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP-Bereiche" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Prefix (flach)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Tiefe" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Pool" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Als ausgenutzt markiert" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Startadresse" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (Innen)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (Außen)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Zugewiesen" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Zugewiesenes Objekt" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Art des Geltungsbereichs" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID-Bereiche" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Einzigartig" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Ziele importieren" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Ziele exportieren" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} ist kein gültiges Präfix. Meinten Sie {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Die Präfixlänge muss kleiner oder gleich sein %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Die Präfixlänge muss größer oder gleich sein %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9981,31 +10651,31 @@ msgstr "" "In DNS-Namen sind nur alphanumerische Zeichen, Sternchen, Bindestriche, " "Punkte und Unterstriche zulässig" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "untergeordnete Prefixe" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "untergeordnete Bereiche" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Verwandte IPs" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Geräteschnittstellen" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM-Schnittstellen" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Dieses Feld darf nicht leer sein." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -10013,330 +10683,343 @@ msgstr "" "Der Wert muss direkt übergeben werden (z. B. „foo“: 123); verwende kein " "Wörterbuch oder keine Liste." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} ist keine gültige Auswahl." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Ungültiger Inhaltstyp: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Ungültiger Wert. Geben Sie einen Inhaltstyp an'.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Bereiche müssen in der Form (unten, oben) angegeben werden." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Bereichsgrenzen müssen als ganze Zahlen (Integer) definiert werden." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} muss get_view_name () implementieren" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Ungültige Erlaubnis {permission} für Modell {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Dunkelrot" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rose" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuchsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Dunkles Violett" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Hellblau" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aquamarin" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Dunkelgrün" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Hellgrün" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Limette" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Bernstein" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Dunkles Orange" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Braun" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Hellgrau" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Grau" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Dunkelgrau" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Direkt" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Hochladen" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Auto-Erkennung" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Komma" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Semikolon" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Tab" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Ungültiger Konfigurationsparameter: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Login-Banner" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Zusätzliche Inhalte zur Anzeige auf der Anmeldeseite" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Banner zur Wartung" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Zusätzliche Inhalte, die im Wartungsmodus angezeigt werden" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Oberes Banner" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Zusätzliche Inhalte, die oben auf jeder Seite angezeigt werden" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Unteres Banner" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Zusätzliche Inhalte, die am Ende jeder Seite angezeigt werden" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Weltweit einzigartiger IP-Raum" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "" "Erzwingen Sie eine eindeutige IP-Adressierung innerhalb der globalen Tabelle" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "IPv4 bevorzugen" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Bevorzugen Sie IPv4-Adressen gegenüber IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Höhe der Rackeinheit in HE" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Standardhöhe für gerenderte Rackhöhen" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Breite der Rackeinheit" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Standardbreite für gerenderte Rackhöhen" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Spannung der Stromzufuhr" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Standardspannung der Stromzufuhr" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Stromstärke der Stromzufuhr" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Standardstromstärke für Stromzufuhren" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Maximale Auslastung der Stromzufuhr" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Standardwert für die maximale Auslastung der Stromzufuhr" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Zulässige URL-Schemata" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Zulässige Schemata für URLs in vom Benutzer bereitgestellten Inhalten" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Standard-Seitengröße" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maximale Seitengröße" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Benutzerdefinierte Validatoren" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Benutzerdefinierte Validierungsregeln (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Schutzregeln" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Löschschutzregeln (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Standardeinstellungen" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Standardeinstellungen für neue Benutzer" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Wartungsmodus" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Wartungsmodus aktivieren" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL aktiviert" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Aktiviere die GraphQL API" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Aufbewahrung des Changelogs" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Tage zur Aufbewahrung des Changelog-Verlaufs (für unbegrenzt auf Null zu " "setzen)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Beibehaltung der Arbeitsergebnisse" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Tage zur Aufbewahrung des Auftragsergebnisverlaufs (für unbegrenzt auf Null " "gesetzt)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "Landkarten-URL" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Basis-URL für die Kartierung geografischer Standorte" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Teilweise Übereinstimmung" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Exakte Übereinstimmung" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Beginnt mit" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Endet mit" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Objekttyp(en)" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Suchen" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10344,413 +11027,428 @@ msgstr "" "Tag-URL-Slugs, getrennt durch Kommas, umgeben von doppelten " "Anführungszeichen (z. B. „tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Tags hinzufügen" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Tags entfernen" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} muss eine Modellklasse angeben." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Unbekannter Feldname '{name}'in benutzerdefinierten Felddaten." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Ungültiger Wert für das benutzerdefinierte Feld '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Benutzerdefiniertes Feld '{name}'muss einen eindeutigen Wert haben." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Erforderliches benutzerdefiniertes Feld fehlt '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Entfernte Datenquelle" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "Datenpfad" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Pfad zur Remote-Datei (relativ zum Stammverzeichnis)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "Auto-Sync aktiviert" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Automatische Synchronisation von Daten aktivieren, wenn die Datendatei " "aktualisiert wird" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "Datum der Synchronisierung " -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} muss eine sync_data () -Methode implementieren." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organisation" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Standortgruppen" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Mandantengruppen" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Kontaktgruppen" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Kontaktrollen" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Kontaktzuweisungen" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Rackrollen" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Rackübersichten" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Racktypen" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Module" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Virtual Device Context" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Hersteller" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Gerätekomponenten" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Inventarartikelrollen" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Verbindungen" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kabel" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Funkverbindungen" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Schnittstellenverbindungen" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Konsolenverbindungen" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Stromverbindungen" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "WLAN-Gruppen" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Prefix- und VLAN-Rollen" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN-Bereiche" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN-Gruppen" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Dienstevorlagen (Ports)" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Dienste (Ports)" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunnel" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Tunnelgruppen" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Tunnelabschlusspunkte" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPNs" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Abschlusspunkte" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKE-Vorschläge" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE-Richtlinien" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPSec-Vorschläge" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPSec-Richtlinien" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPSec-Profile" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Virtuelle Festplatten" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Clustertypen" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Clustergruppen" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Transportnetztypen" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Transportnetzgruppe" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Gruppenzuweisung" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Transportnetzabschlusspunkt" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Provider" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Providerkonten" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Provider Netzwerke" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Stromverteiler" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Konfigurationen" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Konfigurationsvorlage" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Config-Vorlagen" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Personalisierung" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Benutzerdefinierte Felder" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Benutzerdefinierte Feldoptionen" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Benutzerdefinierte Links" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Exportvorlagen" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Gespeicherte Filter" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Bildanhänge" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operationen" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integrationen" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Datenquellen" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Ereignisregeln" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Jobs" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Protokollierung" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Benachrichtigungsgruppen" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Journaleinträge" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Änderungsprotokoll" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Admin" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API-Token" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Berechtigungen" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "System" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plugins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Konfigurationsverlauf" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Hintergrundaufgaben" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Berechtigungen müssen als Tupel oder Liste übergeben werden." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Schaltflächen müssen als Tupel oder Liste übergeben werden." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "" "Die Farbe der Schaltfläche muss innerhalb von ButtonColorChoices ausgewählt " "werden." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10759,7 +11457,7 @@ msgstr "" "PluginTemplateExtension-Klasse {template_extension} wurde als Instanz " "übergeben!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10768,198 +11466,199 @@ msgstr "" "{template_extension} ist keine Unterklasse von " "NetBox.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} muss eine Instanz von NetBox.Plugins.PluginMenuItem sein" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} muss eine Instanz von NetBox.Plugins.PluginMenuItem sein" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} muss eine Instanz von NetBox.Plugins.PluginMenuButton sein" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context muss ein Dictionary sein" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX-Navigation" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Dynamische UI-Navigation aktivieren" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Experimentelle Funktion" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Sprache" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "" "Erzwingt die Übersetzung der Benutzeroberfläche in die angegebene Sprache" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Die Unterstützung für Übersetzungen wurde lokal deaktiviert" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Länge der Seite" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Die Standardanzahl der pro Seite anzuzeigenden Objekte" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Platzierung des Paginators" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Unten" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Oben" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Beide" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Wo die Seiten-Steuerelemente relativ zu einer Tabelle angezeigt werden" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Datenformat" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Die bevorzugte Syntax für die Anzeige generischer Daten in der " "Benutzeroberfläche" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Ungültiger Shop: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "" "Stores können nach der Initialisierung nicht zur Registrierung hinzugefügt " "werden" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Stores können nicht aus der Registrierung gelöscht werden" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Tschechisch" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Dänisch" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Deutsch" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Englisch" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Spanisch" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Französisch" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italenisch" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japanisch" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Niederländisch" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Polnisch" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Portugiesisch" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Russisch" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Türkisch" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ukrainisch" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Chinesisch" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Alles auswählen" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Alles umschalten" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Dropdown umschalten" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Fehler" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "Kein {model_name} gefunden" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Feld" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Wert" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Dummy-Plugin" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10968,56 +11667,56 @@ msgstr "" "Beim Rendern der ausgewählten Exportvorlage ist ein Fehler aufgetreten " "({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Reihe {i}: Objekt mit ID {id} existiert nicht" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Kein {object_type}ausgewählt" -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Umbenannt {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Gelöscht {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Changelog" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Journal" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Synchronisation nicht möglich: Keine Datei ausgewählt bzw. gesetzt." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Daten synchronisiert für {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Synchronisiert {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} muss get_children () implementieren" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -11025,707 +11724,749 @@ msgstr "" "Beim Laden der Dashboardkonfiguration ist ein Fehler aufgetreten. Ein " "Standarddashboard wird verwendet." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Zugriff verweigert" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Sie sind nicht berechtigt, auf diese Seite zuzugreifen" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Seite wurde nicht gefunden" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Die angeforderte Seite existiert nicht" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Serverfehler" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Bei Ihrer Anfrage ist ein Problem aufgetreten. Bitte kontaktieren Sie einen " "Administrator" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Die vollständige Ausnahme finden Sie unten." -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python-Version" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox-Version" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Keine installiert" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "" "Wenn Sie weitere Unterstützung benötigen, senden Sie bitte eine E-Mail an" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox-Diskussionsforum" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "auf GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Startseite" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Benachrichtigungen" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abos" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Einstellungen" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Passwort ändern" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Abbrechen" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Speichern" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Tabellenkonfigurationen" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Tabelleneinstellungen löschen" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Alles umschalten" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tabelle" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Sortierung" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Spalten" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Keine gefunden" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Benutzerprofil" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Kontodetails" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-Mail" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Konto erstellt" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Letzte Anmeldung" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superuser" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Mitarbeiter" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Zugewiesene Gruppen" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Keine" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Letzte Aktivität" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Meine API-Token" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "API-Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Schreiben aktiviert" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Zuletzt benutzt" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Einen API-Token hinzufügen" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Home" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox-Motiv" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox-Logo" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Doku" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST-API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST-API-Dokumentation" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL-API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "NetBox Labs Support" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Quellcode" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Community" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Datum der Installation" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Kündigungsdatum" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Gruppe zuweisen" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Transportnetzabschlüsse austauschen" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Tauschen Sie diese Abschlüsse gegen Tranportnetz aus: %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "A Seite" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z-Seite" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Zugewiesenes Transportnetz" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Zugewiesene Transportnetzgruppe" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Transportnetz hinzufügen" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Transportnetz Typ" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Hinzufügen" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Bearbeiten" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Tauschen" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Als verbunden markiert" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "zu" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Trace" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Kabel bearbeiten" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Kabel entfernen" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Trennen" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Verbinden" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Downstream" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Upstream" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Cross-Connect" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Patchpanel/Anschluss" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Transportnetz hinzufügen" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Providerkonto" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Daten zur Konfiguration" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Kommentar" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Wiederherstellen" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parameter" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Aktueller Wert" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Neuer Wert" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Geändert" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Größe" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "Bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256-Hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synchronisieren" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Zuletzt synchronisiert" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Keine Parameter definiert" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Dateien" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Rackübersichten" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Standardhöhe der Einheit" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Standardbreite der Einheit" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Stromzufuhren" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Standardspannung" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Standardstromstärke" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Maximale Standardauslastung" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Weltweit einzigartig durchsetzen" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Anzahl der Seiten" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Max. Seitengröße" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Benutzereinstellungen" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Beibehaltung der Arbeitsplätze" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Job" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Erstellt von" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Terminplanung" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "jeden %(interval)s Minuten" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Änderung" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Unterschied" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Vorherige" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Nächste" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Objekt erstellt" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objekt gelöscht" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Keine Änderungen" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Daten vor der Änderung" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Warnung: Vergleich nichtatomarer Änderungen mit dem vorherigen " "Änderungsdatensatz" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Daten nach der Änderung" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Alles ansehen %(count)s Änderungen" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Aufbewahrung von Protokollen ändern" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "Tage" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Unbestimmt" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Nicht installiert" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Überblick" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Installieren" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Plugin Details" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Zusammenfassung" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Lizenz" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Versionshistorie" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Lokale Installationsanweisungen" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Hintergrundaufgaben" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Tabelle konfigurieren" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Stopp" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Warteschlange" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Warteschlange" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Warteschlange" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Auszeit" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Ergebnis TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumente" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Stichwort-Argumente" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Hängt davon ab" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Ausnahme" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "Aufgaben in " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Jobs in der Warteschlange" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11733,383 +12474,401 @@ msgstr "" "Wählen alles %(count)s %(object_type_plural)s passende " "Abfrage" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informationen zum Arbeitnehmer" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Arbeiter" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Warteschlangen" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Aktuelle Jobs" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Erfolgreiche Jobzählung" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Anzahl fehlgeschlagener Jobs" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Gesamtarbeitszeit" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "Sekunden" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Berufstätige im Hintergrund" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Arbeiter in %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Exportieren" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Systemstatus" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox-Release" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Django-Version" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL-Version" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Datenbankname" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Datenbankgröße" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Nicht verfügbar" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ-Mitarbeiter" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "Standardwarteschlange" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Systemzeit" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Aktuelle Konfiguration" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Möchten Sie diese wirklich trennen? %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Cable Trace für %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "SVG herunterladen" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Asymmetrischer Pfad" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Die darunter liegenden Knoten haben keine Links und führen zu einem " "asymmetrischen Pfad" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Pfad geteilt" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Wählen Sie unten einen Knoten aus, um fortzufahren" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Ablaufverfolgung abgeschlossen" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Gesamtzahl der Segmente" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Gesamtlänge" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Keine Pfade gefunden" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Verwandte Pfade" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Herkunft" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Ziel" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmente" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Unvollständig" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Ausgewählte umbenennen" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Nicht verbunden" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Gerät im Rack hervorheben" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Nicht eingebaut" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS-Koordinaten" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Karte" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Asset-Tag" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Virtuelles Gehäuse anzeigen" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "VDC erstellen" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Management" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT für" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Energienutzung" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Eingabe" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Abgänge" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Zugeteilt" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Bein" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Einen Dienst hinzufügen" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Komponenten hinzufügen" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Konsolenanschlüsse hinzufügen" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Konsolenserveranschlüsse hinzufügen" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Geräteeinsätze hinzufügen" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Frontanschlüsse hinzufügen" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Aktivierte ausblenden" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Deaktivierte ausblenden" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Virtuelle ausblenden" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Getrennte ausblenden" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Schnittstellen hinzufügen" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Inventargegenstand hinzufügen" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Moduleinsätze hinzufügen" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Steckdosen hinzufügen" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Stromanschluss hinzufügen" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Rückanschlüsse hinzufügen" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Konfig" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Kontextdaten" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Gerenderte Konfiguration" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Herunterladen" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Keine Konfigurationsvorlage gefunden" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "Fehler beim Rendern der Vorlage" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "Diesem Gerät wurde keine Konfigurationsvorlage zugewiesen." + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Übergeordneter Einsatz" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "URL-Slug regenerieren" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "entfernen" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Lokale Konfigurationskontextdaten" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Umbenennen" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Geräteeinsatz" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Installiertes Gerät" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "entferne %(device)s von %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12118,430 +12877,449 @@ msgstr "" "Sind Sie sicher, dass Sie entfernen möchten %(device)s von " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Bestücken" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Einsatz" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Gerät hinzufügen" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "VM-Rolle" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Name des Modells" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Teilnummer" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Von der Auslastung ausschließen" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Übergeordnet/Untergeordnet" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Vorderes Bild" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Hinteres Bild" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Position des Rück-Anschlusses" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Als verbunden markiert" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Status der Verbindung" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "A-Seite" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B-Seite" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Kein Abschlusspunkt" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Als geplant markieren" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Als installiert markieren" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Pfadstatus" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Nicht erreichbar" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Pfadendpunkte" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Nicht verbunden" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Untagged" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Keine VLANs zugewiesen" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Lösche" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Alles löschen" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Einbautiefe" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Start HE" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Absteigende HE's" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Höhe des Racks" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Untergeordnete Schnittstelle hinzufügen" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Geschwindigkeit/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE-Modus" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE-Typ" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q-Modus" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC-Adresse" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Funkverbindung" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Kanal-Frequenz" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Kanal-Breite" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "LAG-Mitglieder" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Keine Mitgliederschnittstellen" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "IP-Adresse hinzufügen" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Übergeordneter Artikel" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Teile-ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Untergeordnete Lokation hinzufügen" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Untergeordnete Lokationen" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Einen Lokation hinzufügen" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Ein Gerät hinzufügen" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Gerätetyp hinzufügen" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Modultyp hinzufügen" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Verbundenes Gerät" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Auslastung (zugewiesen)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Elektrische Eigenschaften" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Phasenlage" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Stromzufuhr hinzufügen" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "maximale Auslastung" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "zugewiesene Auslastung" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Höheneinheitennutzung" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Gewicht des Racks" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maximales Gewicht" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Gesamtgewicht" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Bilder und Beschriftungen" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Nur Bilder" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Nur Beschriftungen" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Reservierung hinzufügen" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Liste ansehen" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Wählen Sie eine Rackansicht" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Sortieren nach" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Keine Racks gefunden" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Höhen anzeigen" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Einzelheiten der Reservierung" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Rack hinzufügen" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Positionen" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Standort hinzufügen" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Untergeordnete Regionen" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Region hinzufügen" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Zeitzone" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Uhrzeit am Standort" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Physische Adresse" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Lieferadresse" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Untergeordnete Gruppen" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Standortgruppe hinzufügen" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Anlage" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Mitglied hinzufügen" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Mitgliedsgeräte" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Neues Mitglied zu virtuellem Gehäuse hinzufügen %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Neues Mitglied hinzufügen" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Aktionen" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Speichern & weiteres hinzufügen" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Virtuelles Gehäuse %(name)s bearbeiten" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Rack/Einheit" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Virtuelles Gehäusemitglied entfernen" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12550,11 +13328,12 @@ msgstr "" "Sind Sie sicher, dass Sie entfernen möchten %(device)s aus " "dem virtuellen Gehäuse %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identifier" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12562,11 +13341,11 @@ msgstr "" "Während dieser Anfrage ist ein Modulimportfehler aufgetreten. Zu den " "häufigsten Ursachen gehören die folgenden:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Erforderliche Pakete fehlen" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12583,11 +13362,11 @@ msgstr "" " aus einfrieren von der Konsole aus und vergleichen Sie die " "Ausgabe mit der Liste der benötigten Pakete." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Der WSGI-Dienst wurde nach dem Upgrade nicht neu gestartet" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12597,7 +13376,7 @@ msgstr "" "WSGI-Dienst (z. B. gunicorn oder uWSGI) neu gestartet wurde. Dadurch wird " "sichergestellt, dass der neue Code ausgeführt wird." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12605,11 +13384,11 @@ msgstr "" "Bei der Verarbeitung dieser Anfrage wurde ein Dateiberechtigungsfehler " "festgestellt. Zu den häufigsten Ursachen gehören die folgenden:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Ungenügende Schreibrechte im Medienverzeichnis" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12620,7 +13399,7 @@ msgstr "" " Sie sicher, dass der Benutzer NetBox ausgeführt wird und Zugriff hat, um " "Dateien innerhalb dieses Pfads zu schreiben." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12628,11 +13407,11 @@ msgstr "" "Bei der Verarbeitung dieser Anfrage wurde ein Datenbankprogrammierfehler " "festgestellt. Zu den häufigsten Ursachen gehören die folgenden:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Datenbankmigrationen fehlen" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12643,11 +13422,11 @@ msgstr "" "Migrationen manuell anwenden, indem Sie python3 manage.py " "migrate von der Befehlszeile aus ausführen." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "PostgreSQL-Version wird nicht unterstützt" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12658,99 +13437,102 @@ msgstr "" "NetBox eine Verbindung zur Datenbank herstellen und eine Abfrage mit " "SELECT VERSION()ausführen." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Die mit diesem Objekt verknüpfte Datei wurde gelöscht" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Daten synchronisiert" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Daten synchronisieren" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Umgebungsparameter" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Vorlage" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Name der Gruppe" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Muss einzigartig sein" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Klonbar" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Standardwert" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Gewichtung in Suche" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filterlogik" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Gewicht anzeigen" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "UI Sichtbar" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "UI editierbar" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Validierungsregeln" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Regulärer Ausdruck" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Button-Klasse" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Zugewiesene Modelle" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Linktext" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "Link-URL" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Dashboard zurücksetzen" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12758,7 +13540,7 @@ msgstr "" "Das werden alle konfigurierte Widgets entfernt und die " "Standard-Dashboard-Konfiguration wieder hergestellt." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12766,159 +13548,161 @@ msgstr "" "Diese Änderung betrifft nur dein Dashboard und hat keine Auswirkungen" " auf andere Benutzer." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "Wiget Konfiguration" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Schließe Widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Ein Widget hinzufügen" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Es wurden noch keine Lesezeichen hinzugefügt." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Keine Berechtigung" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Keine Berechtigung, diesen Inhalt anzusehen" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Inhalt kann nicht geladen werden. Ungültiger Name des Views" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Kein Inhalt gefunden" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Beim Abrufen des RSS-Feeds ist ein Problem aufgetreten" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Dienst" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME-Typ" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Dateiendung" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Geplant für" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Dauer" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Zusammenfassung des Tests" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Log" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Ausgabe" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Wird geladen" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Ergebnisse ausstehend" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Journaleintrag" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Benachrichtigungsgruppe" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Keine zugewiesen" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Der lokale Config-Kontext überschreibt alle Quellkontexte" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Quellkontexte" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Neuer Journaleintrag" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Bericht" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Sie sind nicht berechtigt, Skripts auszuführen" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Skript ausführen" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Fehler beim Laden des Skripts" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Das Skript ist in der Quelldatei nicht mehr vorhanden." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Letzter Lauf" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Das Skript ist in der Quelldatei nicht mehr vorhanden" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Niemals" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Nochmal ausführen" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "Skripte konnten nicht aus dem Modul geladen werden %(module)s" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Keine Skripte gefunden" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12927,81 +13711,83 @@ msgstr "" "Fangen Sie an mit ein Skript erstellen" " aus einer hochgeladenen Datei oder Datenquelle." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Ergebnisse" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Schwellenwert protokollieren" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Alle" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Getaggte Artikel" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Erlaubte Objekttypen" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Irgendein" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Artikeltypen mit Tags" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Getaggte Objekte" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP-Methode" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP-Inhaltstyp" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL-Verifizierung" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Zusätzliche Header" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Body Template" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Massenerstellung" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Ausgewählte Objekte" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "hinzufügen" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Massenlöschung" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Massenlöschung bestätigen" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -13012,66 +13798,69 @@ msgstr "" "%(type_plural)s. Bitte überprüfen Sie die ausgewählten Objekte sorgfältig " "und bestätigen Sie diese Aktion." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Bearbeitung" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Massenbearbeitung" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Anwenden" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Massenimport" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Direkter Import" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Datei hochladen" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Einreichen" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Feldeigenschaften" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Datentyp" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "Auswahlmöglichkeiten" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Wert importieren" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Format: YYYY-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Geben Sie wahr oder falsch an" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Erforderliche Felder müssen für alle Objekte angegeben " "werden." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -13081,15 +13870,15 @@ msgstr "" "werden. Zum Beispiel %(example)s würde ein VRF anhand seines " "Routenunterscheiders identifizieren." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Massen-Entfernung" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Bestätigen Sie die Massenentfernung" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13100,72 +13889,72 @@ msgstr "" "%(parent_obj)s. Bitte überprüfen Sie sorgfältig die %(obj_type_plural)s muss" " entfernt werden und unten bestätigt werden." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Entferne diese %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Umbenennen" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Massen-Umbenennung" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Aktueller Name" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Neuer Name" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Vorschau" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Bist du sicher" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Bestätigen" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Ausgewählte bearbeiten" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Ausgewählte löschen" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Füge ein neues %(object_type)s hinzu" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Modelldokumentation anzeigen" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Hilfe" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Erstellen & Neues hinzufügen" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filter" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13174,40 +13963,40 @@ msgstr "" "Wählen alles %(count)s " "%(object_type_plural)s passende Abfrage" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Neue Version verfügbar" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "ist verfügbar" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Anweisungen zum Upgrade" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Dashboard entsperren" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Dashboard sperren" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Widget hinzufügen" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Layout speichern" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Löschen bestätigen" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13216,40 +14005,40 @@ msgstr "" "Bist du sicher, dass du %(object_type)s %(object)s löschen willst?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Die folgenden Objekte werden als Ergebnis dieser Aktion gelöscht." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "vor" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Keine ungelesenen Benachrichtigungen" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Alle Benachrichtigungen" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Auswählen" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Zurücksetzen" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Dunkle Ansicht aktivieren" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Helle Ansicht aktivieren" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13258,281 +14047,283 @@ msgstr "" "Bevor Sie ein %(model)s hinzufügen können, müssen Sie zunächst ein " "%(prerequisite_model)s erstellen." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Auswahl der Seite" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Zeige %(start)s-%(end)s von %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Optionen für die Seitennummerierung" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "pro Seite" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Ein Bild anhängen" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Verwandte Objekte" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Keine Tags zugewiesen" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Die Daten sind nicht mit der Upstream-Datei synchronisiert" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Schnellsuche" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Gespeicherte Filter" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Reihenfolge löschen" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Hilfecenter" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Django-Admin" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Abmelden" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Anmelden" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Familie" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "hinzugefügt am" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Prefix hinzufügen" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS-Nummer" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Art der Authentifizierung" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Authentifizierungsschlüssel" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Virtuelle IP-Adressen" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "IP zuweisen" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Massen-Erstellung" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Gruppe erstellen" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Virtuelle IPs" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Zugewiesene anzeigen" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Verfügbare anzeigen" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Alles anzeigen" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Weltweit" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (außen)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Eine IP-Adresse zuweisen" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Wählen Sie die IP-Adresse" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Suchergebnisse" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "IP-Adressen massenweise hinzufügen" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Startadresse" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Endadresse" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Als voll belegt markiert" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Angaben zur Adressierung" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "untergeordnete IPs" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Verfügbare IPs" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Erste verfügbare IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Präfix-Details" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Netzwerkadresse" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Netzwerkmaske" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Wildcardmaske" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Broadcast-Adresse" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "IP-Bereich hinzufügen" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Tiefenindikatoren ausblenden" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Max. Tiefe" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Max. Länge" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Aggregat hinzufügen" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "VRFs importieren" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "VRFs exportieren" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "L2VPNs importieren" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "L2VPNs exportieren" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Präfix hinzufügen" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "VLAN hinzufügen" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Routenunterscheidungsmerkmal" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Einzigartiger IP-Raum" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Fehler" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Anmelden" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Oder" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Statischer Medienfehler - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Statischer Medienfehler" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Die folgende statische Mediendatei konnte nicht geladen werden" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Überprüfe das Folgende" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13542,7 +14333,7 @@ msgstr "" "Upgrades ausgeführt. Dadurch wird die neueste Iteration jeder statischen " "Datei im statischen Stammpfad installiert." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13554,7 +14345,7 @@ msgstr "" "href=\"%(docs_url)s\">the installation documentation für weitere " "Anleitungen." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13563,550 +14354,574 @@ msgstr "" "Die Datei%(filename)s existiert im statischen Stammverzeichnis " "und ist für den HTTP-Server lesbar." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Klicken Sie hier um erneut zu versuchen, NetBox" " zu laden." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Kontakt" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Titel" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefon" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Kontaktgruppe" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Kontaktgruppe hinzufügen" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Kontaktrolle" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Einen Kontakt hinzufügen" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Mandant hinzufügen" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Mandantengruppe" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Mandantengruppe hinzufügen" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Zugewiesene Berechtigungen" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Berechtigung" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Ansicht" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Einschränkungen" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Zugewiesene Benutzer" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Zugewiesene Ressourcen" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Virtuelle CPUs" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Arbeitsspeicher" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Speicherplatz" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Virtuelle Maschine hinzufügen" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Gerät zuweisen" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Ausgewähltes entfernen" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Gerät zum Cluster hinzufügen %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Geräte-Auswahl" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Geräte hinzufügen" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Cluster hinzufügen" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Clustergruppe" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Cluster-Typ" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Virtuelle Festplatte" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Ressourcen" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Virtuelles Laufwerk hinzufügen" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" +"Für diese virtuelle Maschine wurde keine Konfigurationsvorlage zugewiesen." + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE-Richtlinie" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE-Version" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" -msgstr "Vorab geteilter Schlüssel" +msgstr "Pre-Shared Key" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Secret anzeigen" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Vorschläge" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "IKE-Vorschlag" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Authentifizierungsmethode" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Verschlüsselungsalgorithmus" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Authentifizierungsalgorithmus" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "DH-Gruppe" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "SA-Lebensdauer (Sekunden)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPSec-Richtlinie" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS-Gruppe" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPSec-Profil" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS-Gruppe" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPSec-Vorschlag" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "SA-Lebensdauer (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN-Attribute" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Abschlusspunkt hinzufügen" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Abschlusspunkt hinzufügen" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Verkapselung" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPSec-Profil" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Tunnel-ID" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Tunnel hinzufügen" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Tunnelgruppe" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Tunnelabschlusspunkt" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Öffentliche / Outside IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Peer-Abschlusspunkt" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Chiffre" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Angehängte Schnittstellen" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "WLAN hinzufügen" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "WLAN-Gruppe" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "WLAN-Gruppe hinzufügen" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Link-Eigenschaften" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Entfernung" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Übergeordnete Kontaktgruppe (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Übergeordnete Kontaktgruppe (URL-Slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Kontaktgruppe (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Kontaktgruppe (URL-Slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Kontakt (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Kontaktrolle (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Kontaktrolle (URL-Slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Kontaktgruppe" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Übergeordnete Mandantengruppe (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Übergeordnete Mandantengruppe (URL-Slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Mandantengruppe (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Mandantengruppe (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Mandantengruppe (URL-Slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Beschreibung" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Zugewiesener Kontakt" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "Kontaktgruppe" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "Kontaktgruppen" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "Kontaktrolle" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "Kontaktrollen" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "Titel" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "Telefon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "E-Mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "Link" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "Kontakt" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "Kontakte" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "Kontaktzuweisung" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "Kontaktzuweisungen" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Kontakte können diesem Objekttyp nicht zugewiesen werden ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "Mandantengruppe" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "Mandantengruppen" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Der Mandantenname muss pro Gruppe eindeutig sein." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "" "Die URL-freundliche Mandantenbezeichnung (URL-Slug) muss pro Gruppe " "einzigartig sein." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "Mandant" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "Mandanten" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Kontakt-Titel" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Kontakt-Telefon" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Kontakt-E-Mail" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Kontakt-Adresse" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Kontakt-Link" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Kontakt-Beschreibung" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Berechtigung (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Benachrichtigungsgruppe (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Vorname" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Nachname" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Mitarbeiter-Status" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Superuser-Status" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Wenn kein Schlüssel angegeben wird, wird automatisch einer generiert." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Ist Mitarbeiter" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Ist Superuser" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Kann ansehen" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Kann hinzufügen" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Kann ändern" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Kann löschen" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Benutzeroberfläche" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14117,7 +14932,7 @@ msgstr "" "da er möglicherweise nicht mehr zugänglich ist, sobald das Token erstellt " "wurde." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14128,33 +14943,33 @@ msgstr "" "möchten. Beispiel: 10.1.1.0/24, 192.168.10.16/32.2001:db 8:1: " ":/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Passwort bestätigen" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Geben Sie zur Überprüfung dasselbe Passwort wie zuvor ein." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Passwörter stimmen nicht überein! Bitte überprüfen Sie Ihre Eingabe und " "versuchen Sie es erneut." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Zusätzliche Aktionen" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Zusätzlich zu den oben aufgeführten Maßnahmen gewährte Maßnahmen" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objekte" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14165,82 +14980,82 @@ msgstr "" "entsprechen. Eine Liste mehrerer Objekte führt zu einer logischen ODER-" "Operation." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Es muss mindestens eine Aktion ausgewählt werden." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Ungültiger Filter für {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Die Liste der Aktionen, die durch diese Berechtigung gewährt wurden" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "Einschränkungen" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Queryset-Filter, der den entsprechenden Objekten der ausgewählten Typen " "entspricht" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "Berechtigung" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "Berechtigungen" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "Benutzereinstellungen" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "" "Schlüssel '{path}'ist ein Blattknoten; es können keine neuen Schlüssel " "zugewiesen werden" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Schlüssel '{path}'ist ein Wörterbuch; es kann kein Wert zugewiesen werden, " "der nicht aus dem Wörterbuch stammt" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "läuft ab" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "zuletzt benutzt" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "Schlüssel" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "Schreiben aktiviert" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Lasse Erstellen/Aktualisieren/Löschen Vorgänge mit diesem Schlüssel zu" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "erlaubte IPs" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14249,43 +15064,43 @@ msgstr "" "kann. Lassen Sie das Feld leer, wenn Sie keine Einschränkungen haben " "möchten. Beispiel: „10.1.1.0/24, 192.168.10.16/32, 2001:DB 8:1: :/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "Token" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "Token" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "Gruppe" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "Benutzer" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Ein Benutzer mit diesem Benutzernamen existiert bereits." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Benutzerdefinierte Aktionen" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Verwandtes Objekt wurde mit den angegebenen Attributen nicht gefunden: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Mehrere Objekte entsprechen den angegebenen Attributen: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14295,43 +15110,43 @@ msgstr "" "Attributverzeichnisses referenziert werden. Es wurde ein unbekannter Wert " "empfangen: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Verwandtes Objekt wurde mit der angegebenen numerischen ID nicht gefunden: " "{id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} hat einen Schlüssel definiert, aber CHOICES ist keine Liste" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Das Gewicht muss eine positive Zahl sein" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Ungültiger Wert '{weight}'für Gewicht (muss eine Zahl sein)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Unbekannte Einheit {unit}. Es muss eine der folgenden sein: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Die Länge muss eine positive Zahl sein" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Ungültiger Wert '{length}' für die Länge (muss eine Zahl sein)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14340,15 +15155,15 @@ msgstr "" "Löschen von {objects} nicht möglich. {count} abhängige " "Objekte wurden gefunden: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Mehr als 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "RGB Farbe in hexadezimaler Form. Beispiel:" -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14357,7 +15172,7 @@ msgstr "" "%s(%r) ist ungültig. Der to_model-Parameter für CounterCacheField muss eine " "Zeichenfolge im Format 'app.model' sein" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14366,37 +15181,37 @@ msgstr "" "%s(%r) ist ungültig. Der to_field-Parameter für CounterCacheField muss eine " "Zeichenfolge im Format 'field' sein" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Geben Sie Objektdaten im CSV-, JSON- oder YAML-Format ein." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV-Trennzeichen" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Das Zeichen, das CSV-Felder begrenzt. Gilt nur für das CSV-Format." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "Formulardaten müssen leer sein, wenn eine Datei hochladen/ausgewählt wird." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Unbekanntes Datenformat: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Das Datenformat konnte nicht erkannt werden. Bitte spezifizieren Sie." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Ungültiges CSV-Trennzeichen" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14404,7 +15219,7 @@ msgstr "" "Ungültige YAML-Daten. Die Daten müssen in Form mehrerer Dokumente oder eines" " einzelnen Dokuments vorliegen, das eine Liste von Wörterbüchern umfasst." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14413,7 +15228,7 @@ msgstr "" "Ungültige Liste ({value}). Muss numerisch sein und Bereiche müssen in " "aufsteigender Reihenfolge sein." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14421,7 +15236,7 @@ msgstr "" "Geben Sie einen oder mehrere numerische Bereiche an, die durch Kommas " "getrennt sind. Beispiel: 1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14429,17 +15244,18 @@ msgstr "" "Ungültige Bereiche ({value}). Muss ein Bereich von ganzen Zahlen in " "aufsteigender Reihenfolge sein." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Ungültiger Wert für ein Multiple-Choice-Feld: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objekt wurde nicht gefunden: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14448,20 +15264,20 @@ msgstr "" "„{value}\"ist kein eindeutiger Wert für dieses Feld; es wurden mehrere " "Objekte gefunden" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "„{field_name}\"ist ein ungültiger Zugriffs-Feldname." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Der Objekttyp muss als \".“ angegeben werden." -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Ungültiger Objekttyp" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14471,7 +15287,7 @@ msgstr "" "und Kleinschreibung und Typen innerhalb eines einzigen Bereichs werden nicht" " unterstützt (Beispiel: [ge, xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14479,7 +15295,7 @@ msgstr "" "Geben Sie einen numerischen Bereich an, um mehrere IPs zu erstellen.
    Beispiel: 192,0,2. [1.5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown Syntax wird unterstützt" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL-freundliche, einzigartige Kurzschrift" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Geben Sie Kontextdaten im JSON Format ein." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "Die MAC-Adresse muss im EUI-48-Format sein" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Verwenden Sie reguläre Ausdrücke" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Numerische ID eines vorhandenen Objekts, das aktualisiert werden soll (wenn " "kein neues Objekt erstellt wird)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Unbekannter Header: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Verfügbare Spalten" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Ausgewählte Spalten" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14533,13 +15349,13 @@ msgstr "" "Dieses Objekt wurde seit dem Rendern des Formulars geändert. Einzelheiten " "entnehmen Sie bitte dem Änderungsprotokoll des Objekts." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Bereich “{value}\" ist ungültig." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14548,71 +15364,71 @@ msgstr "" "Ungültiger Bereich: Der Endwert ({end}) muss größer als der Anfangswert " "({begin}) sein." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Doppelte oder widersprüchliche Spaltenüberschrift für“{field}“" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Doppelte oder widersprüchliche Spaltenüberschrift für“{header}“" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Reihe {row}: {count_expected} Spalten erwartet, aber {count_found} gefunden" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Unerwartete Spaltenüberschrift“{field}„gefunden." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "" "Spalte“{field}\"ist kein verwandtes Objekt; Punkte können nicht verwendet " "werden" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" -msgstr "Ungültiges verwandtes Objektattribut für Spalte“{field}„: {to_field}" +msgstr "Ungültiges verwandtes Objektattribut für Spalte“{field}\": {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Erforderliche Spaltenüberschrift“{header}„nicht gefunden." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Fehlender erforderlicher Wert für den dynamischen Abfrageparameter: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Fehlender erforderlicher Wert für den statischen Abfrageparameter: " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Das Passwort muss mindestens eine Ziffer enthalten." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Das Passwort muss mindestens einen Großbuchstaben enthalten." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Das Passwort muss mindestens einen Kleinbuchstaben enthalten." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14620,7 +15436,7 @@ msgstr "" "Ihr Passwort muss mindestens eine Ziffer, einen Großbuchstaben und einen " "Kleinbuchstaben enthalten." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14629,128 +15445,128 @@ msgstr "" "Ungültiger Berechtigungsname: {name}. Muss im Format " "._ sein." -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Unbekanntes app_label/model_name für {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Ungültige IP-Adresse gesetzt für {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" "Eine Spalte mit dem Namen {name} ist bereits für die Tabelle {table_name} " "definiert" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Nicht definiert" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Lesezeichen aufheben" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Lesezeichen setzen" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Klonen" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Aktuelle Ansicht" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Alle Daten" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Exportvorlage hinzufügen" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importieren" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Nicht abonnieren" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Abonnieren" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "In die Zwischenablage kopieren" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Dieses Feld ist erforderlich" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Auf Null setzen" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Alles löschen" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Tabellenkonfiguration" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Nach oben bewegen" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Nach unten bewegen" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Suchen..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Suche NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Selektor öffnen" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Schreiben" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Der Test muss csv_update_data definieren." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} ist kein gültiger regulärer Ausdruck." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} muss get_required_permission() implementieren" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} muss get_required_permission() implementieren" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14760,61 +15576,63 @@ msgstr "" "darf nur für Ansichten verwendet werden, die einen Basis-Abfragesatz " "definieren" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Übergeordnete Gruppe (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Übergeordnete Gruppe (URL-Slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Clustertyp (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Cluster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPUs" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Speicher (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "Festplatte (MB)" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "Größe (MB)" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Art des Clusters" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Zugewiesene Clustergruppe" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Zugewiesener Cluster" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Zugewiesenes Gerät innerhalb des Clusters" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Seriennummer" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14823,52 +15641,52 @@ msgstr "" "{device} gehört zu einerm anderen Standort ({device_site}) als das Cluster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" -"Pinnen Sie diese VM optional an ein bestimmtes Host-Gerät innerhalb des " +"Verbinden Sie diese VM optional an ein bestimmtes Host-Gerät innerhalb des " "Clusters an" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Standort/Cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "Die Festplattengröße wird durch das Anhängen virtueller Festplatten " "verwaltet." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Festplatte" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "Clustertyp" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "Clustertypen" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "Clustergruppe" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "Clustergruppen" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "Cluster" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "Cluster" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14877,33 +15695,33 @@ msgstr "" "{count} Geräte sind als Hosts für diesen Cluster zugewiesen, befinden sich " "aber nicht an dem Standort {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "Speicher (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "Festplatte (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Der Name der virtuellen Maschine muss pro Cluster eindeutig sein." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "virtuelle Maschine" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "virtuelle Maschinen" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" "Eine virtuelle Maschine muss einem Standort und/oder einem Cluster " "zugewiesen werden." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." @@ -14911,11 +15729,11 @@ msgstr "" "Das ausgewählte Cluster ({cluster}) ist diesem Standort nicht zugeordnet " "({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Bei der Zuweisung eines Hostgeräts muss ein Cluster angegeben werden." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14923,7 +15741,7 @@ msgstr "" "Das gewählte Gerät ({device}) ist diesem Cluster nicht zugewiesen " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14932,18 +15750,18 @@ msgstr "" "Die angegebene Festplattengröße ({size}) muss der Gesamtgröße der " "zugewiesenen virtuellen Laufwerke entsprechen ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" "Muss eine IPv{family} Adresse sein. ({ip} ist eine IPv{version} Adresse.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Die angegebene IP-Adresse ({ip}) ist dieser VM nicht zugewiesen." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14952,7 +15770,7 @@ msgstr "" "Die ausgewählte übergeordnete Schnittstelle ({parent}) gehört zu einer " "anderen virtuellen Maschine ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14961,7 +15779,7 @@ msgstr "" "Die gewählte Bridge-Schnittstelle ({bridge}) gehört zu einer anderen " "virtuellen Maschine ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14971,400 +15789,423 @@ msgstr "" "wie die übergeordnete virtuelle Maschine der Schnittstelle, oder sie muss " "global sein." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "Größe (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "virtuelle Festplatte" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "virtuelle Festplatten" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Füge {count} Geräte zum Cluster {cluster}hinzu " -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Entferne {count}Geräte vom Cluster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPSec - Transport" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPSec-Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-in-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "WireGuard" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "OpenVPN" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "L2TP" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "PPTP" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Spoke" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Aggressiv" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Haupt" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Vorab geteilte Schlüssel (Preshared Keys)" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Zertifikate" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA-Signaturen" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA-Signaturen" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Gruppe {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Privates Ethernet-LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Virtuelles privates Ethernet-LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Privater Ethernet-Baum" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Virtueller privater Ethernet-Baum" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Tunnelgruppe (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Tunnelgruppe (URL-Slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPSec-Profil (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPSec-Profil (Name)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunnel (Name)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Externe IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE-Richtlinie (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE-Richtlinie (Name)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPSec-Richtlinie (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPSec-Richtlinie (Name)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (URL-Slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "VM-Schnittstelle (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (Name)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Tunnelgruppe" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "SA-Lebendauer" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Vorab geteilter Schlüssel (Pre-shared key)" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE-Richtlinie" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPSec-Richtlinie" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Tunnelkapselung" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Operative Rolle" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Übergeordnetes Gerät der zugewiesenen Schnittstelle" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Übergeordnete VM der zugewiesenen Schnittstelle" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Geräte- oder VM-Schnittstelle" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE-Vorschlag (e)" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Diffie-Hellman-Gruppe für Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPSec-Vorschlag (e)" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPSec-Protokoll" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN-Typ" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Übergeordnetes Gerät (für Schnittstelle)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Übergeordnete virtuelle Maschine (für Schnittstelle)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Zugewiesene Schnittstelle (Gerät oder VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Geräte- und VM-Schnittstellenabschlüsse können nicht gleichzeitig importiert" " werden." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "" "Bei jeder Terminierung muss entweder eine Schnittstelle oder ein VLAN " "angegeben werden." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "" "Es kann nicht sowohl eine Schnittstelle als auch ein VLAN zugewiesen werden." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE-Ausführung" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Vorschlag" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Zugewiesener Objekttyp" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Tunnelschnittstelle" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Erster Endpunkt" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Zweiter Endpunkt" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "" "Dieser Parameter ist erforderlich, wenn ein Abschlusspunkt definiert wird." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Richtlinie" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Eine Terminierung muss eine Schnittstelle oder ein VLAN angeben." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Eine Terminierung kann nur ein Terminierungsobjekt haben (eine Schnittstelle" " oder ein VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "Verschlüsselungsalgorithmus" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "Authentifizierungsalgorithmus" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Diffie-Hellman-Gruppen-ID" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Lebensdauer der Sicherheitsverbindung (in Sekunden)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "IKE-Vorschlag" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKE-Vorschläge" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "Version" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "Vorschläge" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "vorab geteilter Schlüssel" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE-Richtlinien" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Der Modus ist für die ausgewählte IKE-Version erforderlich" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Der Modus kann nicht für die ausgewählte IKE-Version verwendet werden" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "Verschlüsselung" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "Authentifizierung" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Lebensdauer der Sicherheitsverbindung (Sekunden)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Lebensdauer der Sicherheitsverbindung (in Kilobyte)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPSec-Vorschlag" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPSec-Vorschläge" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" "Der Verschlüsselungs- und/oder Authentifizierungsalgorithmus muss definiert " "werden" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPSec-Richtlinien" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPSec-Profile" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN-Abschlusspunkt" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN-Abschlusspunkte" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN-Terminierung wurde bereits zugewiesen ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15373,187 +16214,195 @@ msgstr "" "{l2vpn_type} L2VPNs können nicht mehr als zwei Terminierungen haben; " "gefunden {terminations_count} bereits definiert." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "Tunnelgruppe" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "Tunnelgruppen" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "Encapsulation" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "Tunnel-ID" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "Tunnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "Tunnel" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Ein Objekt kann jeweils nur an einem Tunnel terminiert werden." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "Tunnelabschlusspunkt" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "Tunnelabschlusspunkte" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} ist bereits an einen Tunnel angeschlossen ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Authentifizierungsmethode" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Verschlüsselungsalgorithmus" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Authentifizierungsalgorithmus" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA-Lebensdauer" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Vorab geteilter Schlüssel" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "SA-Lebensdauer (Sekunden)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA-Lebensdauer (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Übergeordnetes Objekt" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Objektstandort" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Accesspoint" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Client" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Offen" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Persönlich (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Enterprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Authentifizierungchiffre" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Entfernungseinheit" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Bridged VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Schnittstelle A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Schnittstelle B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Seite B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "Authentifizierungchiffre" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "WLAN-Gruppe" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "WLAN-Gruppen" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "WLAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "Schnittstelle A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "Schnittstelle B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "Entfernung" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "Entfernungseinheit" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "Funkverbindung" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "Funkverbindungen" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "Beim Einstellen einer Funkentfernung muss eine Einheit angegeben werden" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} ist keine Funkschnittstelle." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Ungültiger Kanalwert: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Ungültiges Kanalattribut: {name}" diff --git a/netbox/translations/es/LC_MESSAGES/django.mo b/netbox/translations/es/LC_MESSAGES/django.mo index 5c7e126e0709d9121ca0dc893f83a3ef7b4a27c4..47dfa187f918eafc011ba460956e196e9fd9cd6b 100644 GIT binary patch delta 65964 zcmXusci_#{|G@G4`52YGGD1G~-ZLwE?_IL8iAYpRH-!coh@_~9Z<0bvB&AX+iHxX3 zl!lg2B>kSxd(Q9s&*Pl)KJPPLXWV-~_5FVDU6<>nwYic<@@0NJ!GA7gPb7+Aj=_n< zzqu2Mi`y(sB!2%dktmOUU^Xn0NK4ejGT0dVU`L#fL+~3Mj?L535|`sDEQhaP4m^mL z;R(!@NF)=d;)8#%AP+82PfIYCL?Y3jI(A> zOD#!_Xg{?49&CZD(WUtX%VMP*X{n{_hK9aBUV%d~nT5nS5}9xkx@Nb<3im`GLf3vl z%rA@i7cevBuVP+&1Fyu7@hUuqSK~!2j74*Xnb*Obu@1_k-B4%$H5 zXisF9CI+E19FNZAo|s>ZM&?Cypsz)DU`g@^(Dwe0<(YGb_6ne

    #49)IbMtE!toY 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 diff --git a/netbox/translations/es/LC_MESSAGES/django.po b/netbox/translations/es/LC_MESSAGES/django.po index 480eb9f0f..7bedaedaa 100644 --- a/netbox/translations/es/LC_MESSAGES/django.po +++ b/netbox/translations/es/LC_MESSAGES/django.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2024\n" "Language-Team: Spanish (https://app.transifex.com/netbox-community/teams/178115/es/)\n" @@ -21,1875 +21,2141 @@ msgstr "" "Language: es\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Llave" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Escritura habilitada" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Creado" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Caduca" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Utilizado por última vez" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "IPs permitidas" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Ha iniciado sesión como {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Has cerrado sesión." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Se han actualizado tus preferencias." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "Las credenciales de usuario autenticadas por LDAP no se pueden cambiar en " "NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "La contraseña se ha cambiado correctamente." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Planificado" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Aprovisionamiento" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Activo" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Desconectado" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Desaprovisionamiento" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Desmantelado" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Primaria" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Secundaria" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Terciario" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Inactivo" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Región (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Región (slug)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Grupo de sitios (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Grupo de sitios (slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Sitio" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Sitio (babosa)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Proveedor (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Proveedor (babosa)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Cuenta de proveedor (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Cuenta de proveedor (cuenta)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Red de proveedores (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Tipo de circuito (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Tipo de circuito (slug)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Sitio (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Terminación A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Búsqueda" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Circuito" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Red de proveedores (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Circuito (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Circuito (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Grupo de circuitos (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Grupo de circuitos (slug)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASNs" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Descripción" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Proveedor" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "ID de servicio" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Color" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Tipo" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Cuenta de proveedor" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Estado" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Inquilino" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Fecha de instalación" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Fecha de terminación" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Velocidad de confirmación (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Parámetros de servicio" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Arrendamiento" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Red de proveedores" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Velocidad del puerto (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Velocidad de subida (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Marcar conectado" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Terminación del circuito" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Detalles de terminación" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Prioridad" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Proveedor asignado" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Cuenta de proveedor asignada" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Tipo de circuito" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Estado operativo" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Inquilino asignado" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Terminación" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Red de proveedores" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Ubicación" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Contactos" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Región" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Grupo de sitios" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Atributos" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Cuenta" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Lado del término" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Asignación" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Grupo" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Grupo de circuitos" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "color" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "tipo de circuito" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "tipos de circuitos" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ID de circuito" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "ID de circuito único" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "estado" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "instalada" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "termina" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "velocidad de confirmación (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Tarifa comprometida" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "circuito" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "circuitos" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "grupo de circuitos" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "grupos de circuitos" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "prioridad" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Asignación de grupos de circuitos" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Asignaciones de grupos de circuitos" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "terminación" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "velocidad de puerto (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Velocidad del circuito físico" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "velocidad de subida (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Velocidad ascendente, si es diferente de la velocidad del puerto" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ID de conexión cruzada" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID de la conexión cruzada local" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "panel de parche/puerto(s)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "ID del panel de conexiones y números de puerto" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "descripción" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "terminación de circuito" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "terminaciones de circuitos" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Una terminación de circuito debe conectarse a un sitio o a una red de " "proveedores." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Una terminación de circuito no puede conectarse tanto a un sitio como a una " "red de proveedores." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "nombre" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Nombre completo del proveedor" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "pegar" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "proveedora" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "proveedores" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "ID de cuenta" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "cuenta de proveedor" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "cuentas de proveedores" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "ID de servicio" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "red de proveedores" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "redes de proveedores" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Nombre" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Circuitos" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "ID de circuito" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Lado A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Lado Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Tasa de compromiso" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Comentarios" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Asignaciones" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Cuentas" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Recuento de cuentas" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Recuento de ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "No se han definido terminaciones para el circuito {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Terminaciones intercambiadas por circuito {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Este usuario no tiene permiso para sincronizar esta fuente de datos." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Nuevo" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "En cola" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Sincronización" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Completado" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Falló" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Guiones" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Informes" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Pendiente" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Programado" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Corriendo" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Erróneo" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Actualizado" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Eliminado" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Terminado" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Empezado" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Aplazado" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Detenido" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Cancelado" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Local" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Nombre de usuario" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Solo se usa para clonar con HTTP (S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Contraseña" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Rama" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Fallo al obtener datos remotos ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "ID de clave de acceso de AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Clave de acceso secreta de AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Objeto creado" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Objeto actualizado" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Objeto eliminado" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Trabajo iniciado" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Trabajo completado" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Fallo en el trabajo" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Error en el trabajo" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Fuente de datos (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Fuente de datos (nombre)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Usuario (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Nombre de usuario" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Habilitado" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parámetros" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ignorar las reglas" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Fuente de datos" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Expediente" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Fuente de datos" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Creación" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Tipo de objeto" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Creado después" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Creado antes" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Programado después" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Programado antes" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Comenzó después" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Comenzó antes" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Completado después" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Completado antes" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "usuario" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Hora" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Después" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Antes" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Acción" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Fuente" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Parámetros de backend" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Carga de archivos" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "" "No se puede cargar un archivo y sincronizarlo desde un archivo existente" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "Debe cargar un archivo o seleccionar un archivo de datos para sincronizarlo" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Elevaciones de estanterías" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Potencia" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Seguridad" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Banners" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Paginación" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Validación" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Preferencias de usuario" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Misceláneo" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Revisión de configuración" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Este parámetro se ha definido estáticamente y no se puede modificar." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Valor actual: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (predeterminado)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "tiempo" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "nombre de usuario" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "ID de solicitud" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "acción" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "datos de cambio previo" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "datos posteriores al cambio" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "cambio de objeto" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "cambios de objetos" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "El registro de cambios no es compatible con este tipo de objeto ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "creado" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "comentario" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "datos de configuración" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "revisión de configuración" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "revisiones de configuración" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Configuración predeterminada" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Configuración actual" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Revisión de configuración #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "tipo" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "habilitado" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignorar reglas" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Patrones (uno por línea) que coinciden con los archivos para ignorarlos al " "sincronizar" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parámetros" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "sincronizado por última vez" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "fuente de datos" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "fuentes de datos" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Tipo de backend desconocido: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "" "No se puede iniciar la sincronización; la sincronización ya está en curso." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1897,1224 +2163,1286 @@ msgstr "" "Se ha producido un error al inicializar el backend. Es necesario instalar " "una dependencia: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "última actualización" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "ruta" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Ruta del archivo relativa a la raíz de la fuente de datos" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "tamaño" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "picadillo" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "La longitud debe ser de 64 caracteres hexadecimales." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Hash SHA256 de los datos del archivo" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "archivo de datos" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "archivos de datos" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "registro de sincronización automática" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "sincronización automática de registros" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "raíz del archivo" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "ruta del archivo" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Ruta del archivo relativa a la ruta raíz designada" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "archivo gestionado" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "archivos gestionados" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "programado" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "intervalo" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Intervalo de recurrencia (en minutos)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "iniciado" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "completado" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "dato" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "error" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID de trabajo" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "trabajo" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "trabajos" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "No se pueden asignar trabajos a este tipo de objeto ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Estado no válido para la terminación del trabajo. Las opciones son: " "{choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "no se puede llamar a enqueue () con valores tanto para schedule_at como para" " immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "La eliminación se impide mediante una regla de protección: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Nombre completo" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objeto" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID de solicitud" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Está activo" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Ruta" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Última actualización" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervalo" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Versión" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Última actualización" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Versión mínima de NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Versión máxima de NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "No se han encontrado datos de complementos" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "autor" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Instalado" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certificado" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Publicado" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Versión instalada" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Versión más reciente" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Tarea más antigua" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Trabajadores" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Anfitrión" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Puerto" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "PID del planificador" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "No se han encontrado colas" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "En cola" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Finalizado" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Invocable" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "No se ha encontrado ninguna tarea" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Estado" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Nacimiento" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PAGADO" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "No se encontró ningún trabajador" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "N.º de trabajo en cola{id} sincronizar {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Revisión de la configuración restaurada #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Trabajo {job_id} no se encontró" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Trabajo {id} se ha eliminado." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Error al eliminar el trabajo {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Trabajo {id} no se encontró." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Trabajo {id} se ha vuelto a poner en cola." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Trabajo {id} ha sido puesto en cola." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Trabajo {id} se ha detenido." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "No se pudo detener el trabajo {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "No se pudo cargar el catálogo de complementos" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} no se encontró" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Posición (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ID de la instalación" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Puesta en escena" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Desmantelamiento" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Retirado" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Marco de 2 postes" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Marco de 4 postes" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Armario de 4 postes" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Marco de pared" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Marco de pared (vertical)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Armario de pared" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Armario de pared (vertical)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} pulgadas" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Reservado" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Disponible" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Obsoleto" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Milímetros" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Pulgadas" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "De adelante hacia atrás" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "De atrás hacia adelante" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Padre" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Niño" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Delantera" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Trasera" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Escenificado" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventario" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "De izquierda a derecha" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "De derecha a izquierda" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "De lado a atrás" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "De atrás hacia los lados" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "De abajo hacia arriba" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "De arriba a abajo" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Pasivo" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Mezclado" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (sin bloqueo)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (Bloqueo)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Estilo californiano" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Internacional/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Proprietario" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Otros" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Internacional" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Físico" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtual" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "inalámbrico" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfaces virtuales" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "puente" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Grupo de agregación de enlaces (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fijo)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modular)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (placa base)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Celular" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "serie" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Coaxial" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Apilamiento" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Mitad" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Lleno" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Acceso" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Etiquetado" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Etiquetado (Todos)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Estándar IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Pasivo 24 V (2 pares)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Pasivo de 24 V (4 pares)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Pasivo 48 V (2 pares)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Pasivo de 48 V (4 pares)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Cobre" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fibra óptica" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fibra" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Conectado" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilómetros" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Medidores" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centímetros" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Millas" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Pies" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogramos" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramos" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Libras" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Onzas" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundante" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Monofásico" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Trifásico" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Formato de dirección MAC no válido: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Formato WWN no válido: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Región principal (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Región principal (babosa)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Grupo de sitio principal (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Grupo de sitios principal (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Grupo (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Grupo (babosa)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "COMO (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Ubicación principal (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Ubicación principal (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Ubicación (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Ubicación (babosa)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Fabricante (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Fabricante (babosa)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Tipo de bastidor (babosa)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Tipo de bastidor (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Función (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rol (babosa)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Rack (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Usuario (nombre)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Plataforma predeterminada (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Plataforma predeterminada (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Tiene una imagen frontal" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Tiene una imagen trasera" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Tiene puertos de consola" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Tiene puertos de servidor de consola" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Tiene puertos de alimentación" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Tiene tomas de corriente" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Tiene interfaces" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Tiene puertos de paso" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Tiene compartimentos para módulos" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Tiene compartimentos para dispositivos" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Tiene artículos de inventario" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Tipo de dispositivo (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Tipo de módulo (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Puerto de alimentación (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Artículo del inventario principal (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Plantilla de configuración (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Tipo de dispositivo (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Dispositivo principal (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Plataforma (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Plataforma (babosa)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Nombre del sitio (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Bahía principal (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Clúster de máquinas virtuales (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Grupo de racimos (babosa)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Grupo de clústeres (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Modelo de dispositivo (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Es de profundidad total" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "Dirección MAC" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Tiene una IP principal" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Tiene una IP fuera de banda" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Chasis virtual (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Es un miembro del chasis virtual" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "LOB VIP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Tiene contexto de dispositivo virtual" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (IDENTIFICACIÓN)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Modelo de dispositivo" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interfaz (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Tipo de módulo (modelo)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Bahía de módulos (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Dispositivo (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (nombre)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Dispositivo (nombre)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Tipo de dispositivo (modelo)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Función del dispositivo (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Función del dispositivo (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Chasis virtual (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Chasis virtual" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Módulo (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Cable (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "VLAN asignada" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "VID asignado" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (ROJO)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Interfaces de chasis virtuales para dispositivos" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Interfaces de chasis virtuales para dispositivos (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Tipo de interfaz" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Interfaz principal (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Interfaz puenteada (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Interfaz LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Contexto de dispositivo virtual" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Contexto de dispositivo virtual (identificador)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "LAN inalámbrica" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Enlace inalámbrico" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Compartimento del módulo principal (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Módulo instalado (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Dispositivo instalado (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Dispositivo instalado (nombre)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Maestro (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Maestro (nombre)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Inquilino (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Inquilino (babosa)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Inacabado" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Panel de alimentación (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Etiquetas" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Posición" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3122,843 +3450,923 @@ msgstr "" "Se admiten los rangos alfanuméricos. (Debe coincidir con el número de " "nombres que se están creando)." -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Nombre de contacto" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Teléfono de contacto" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Correo electrónico de contacto" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Zona horaria" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "fabricante" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Factor de forma" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Anchura" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Altura (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Unidades descendentes" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Anchura exterior" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Profundidad exterior" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Unidad exterior" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Profundidad de montaje" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Peso" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Peso máximo" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Unidad de peso" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Tipo de bastidor" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dimensiones exteriores" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensiones" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numeración" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rol" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Tipo de bastidor" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Número de serie" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Etiqueta de activo" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Flujo de aire" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Estante" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Plataforma predeterminada" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Número de pieza" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Altura en U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Excluir de la utilización" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Tipo de dispositivo" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Tipo de módulo" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chasis" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Función de máquina virtual" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Plantilla de configuración" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Tipo de dispositivo" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Función del dispositivo" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Plataforma" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Clúster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Dispositivo" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configuración" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualización" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Tipo de módulo" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Etiqueta" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Longitud" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Unidad de longitud" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Dominio" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Panel de alimentación" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Suministro" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Tensión" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Amperaje" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Utilización máxima" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Sorteo máximo" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Consumo máximo de energía (vatios)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Sorteo asignado" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Consumo de energía asignado (vatios)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Puerto de alimentación" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Pierna de alimentación" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Solo administración" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Modo PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Tipo de PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Función inalámbrica" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Módulo" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "DESFASE" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Contextos de dispositivos virtuales" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Velocidad" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Modo" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Grupo de VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN sin etiquetar" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLAN etiquetadas" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Grupo LAN inalámbrico" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "LAN inalámbricas" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Dirigiéndose" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operación" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Interfaces relacionadas" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Conmutación 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Se debe especificar el modo de interfaz para asignar las VLAN" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Una interfaz de acceso no puede tener asignadas VLAN etiquetadas." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Nombre de la región principal" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Nombre del grupo de sitios principal" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Región asignada" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Grupo asignado" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "opciones disponibles" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Sitio asignado" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Ubicación de los padres" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "No se encontró la ubicación." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "El fabricante de este tipo de bastidor" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "La posición con el número más bajo del estante" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Ancho de raíl a raíl (en pulgadas)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Unidad para dimensiones exteriores" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Unidad para pesas de cremallera" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Nombre del inquilino asignado" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Nombre de la función asignada" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Dirección del flujo de aire" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Sitio para padres" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Ubicación del bastidor (si existe)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Unidades" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Lista separada por comas de números de unidades individuales" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "El fabricante que produce este tipo de dispositivo" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "" "La plataforma predeterminada para dispositivos de este tipo (opcional)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Peso del dispositivo" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Unidad para el peso del dispositivo" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Peso del módulo" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Unidad para el peso del módulo" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Limite las asignaciones de plataforma a este fabricante" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Función asignada" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Fabricante del tipo de dispositivo" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Modelo de tipo de dispositivo" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Plataforma asignada" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Chasis virtual" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Clúster de virtualización" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Ubicación asignada (si la hay)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Bastidor asignado (si lo hay)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Cara" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Cara de bastidor montada" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Dispositivo principal (para dispositivos infantiles)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Compartimento para dispositivos" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Compartimento de dispositivos en el que está instalado este dispositivo " "(para dispositivos infantiles)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "El dispositivo en el que está instalado este módulo" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Compartimento de módulos" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "El compartimiento del módulo en el que está instalado este módulo" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "El tipo de módulo" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Replicar componentes" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3966,264 +4374,271 @@ msgstr "" "Rellenar automáticamente los componentes asociados a este tipo de módulo " "(activado de forma predeterminada)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Adopte componentes" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Adopte los componentes ya existentes" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Tipo de puerto" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Velocidad de puerto en bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Tipo de toma" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Puerto de alimentación local que alimenta esta toma" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Fase eléctrica (para circuitos trifásicos)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interfaz principal" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Interfaz puenteada" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Retraso" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Interfaz LAG principal" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "VDC" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Los nombres de los VDC están separados por comas y entre comillas dobles. " "Ejemplo:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Medio físico" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Dúplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Modo Poe" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Tipo de Poe" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Modo operativo IEEE 802.1Q (para interfaces L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "VRF asignado" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rol RF" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Función inalámbrica (AP/estación)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} no está asignado al dispositivo {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Puerto trasero" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Puerto trasero correspondiente" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Clasificación de medios físicos" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Dispositivo instalado" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Dispositivo infantil instalado en esta bahía" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "No se encontró el dispositivo infantil." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Artículo del inventario principal" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Tipo de componente" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Tipo de componente" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Nombre del componente" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Nombre del componente" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "No se encontró el componente: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Dispositivo del lado A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Nombre del dispositivo" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Tipo de lado A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Tipo de terminación" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Nombre de la cara A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Nombre de terminación" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Dispositivo Side B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Tipo de lado B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Nombre de la cara B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Estado de conexión" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Lado {side_upper}: {device} {termination_object} ya está conectado" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} no se encontró la terminación lateral: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Maestro" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Dispositivo maestro" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Nombre del sitio principal" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Panel de alimentación ascendente" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primario o redundante" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Tipo de alimentación (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Monofásico o trifásico" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "IPv4 principal" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Dirección IPv4 con máscara, p. ej. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "IPv6 principal" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Dirección IPv6 con longitud de prefijo, por ejemplo, 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MUT" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4232,7 +4647,7 @@ msgstr "" "Las VLAN etiquetadas ({vlans}) deben pertenecer al mismo sitio que el " "dispositivo o máquina virtual principal de la interfaz o deben ser globales" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4240,7 +4655,7 @@ msgstr "" "No se puede instalar el módulo con valores de marcador de posición en un " "compartimento de módulos sin una posición definida." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4250,188 +4665,199 @@ msgstr "" "árbol de compartimentos de módulos {level} en un árbol, pero {tokens} " "marcadores de posición dados." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "No puede adoptar {model} {name} porque ya pertenece a un módulo" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "UN {model} llamado {name} ya existe" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Panel de alimentación" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Alimentación eléctrica" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Lado" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Estado del dispositivo" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Región principal" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Grupo de padres" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Instalación" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Tipo de bastidor" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Función" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Imágenes" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Componentes" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Función de subdispositivo" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "modelo" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Tiene una IP OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Miembro del chasis virtual" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Tiene contextos de dispositivos virtuales" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Grupo de clústeres" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Cableado" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Ocupado" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Conexión" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Amable" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Solo administración" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Canal inalámbrico" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Frecuencia de canal (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Ancho de canal (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Potencia de transmisión (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Cable" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Descubierto" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Ya existe un miembro del chasis virtual en posición {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Información de contacto" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Rol de bastidor" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Babosa" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Seleccione un tipo de bastidor predefinido o defina las características " "físicas a continuación." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Control de inventario" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4439,146 +4865,173 @@ msgstr "" "Lista de identificadores de unidades numéricas separados por comas. Se puede" " especificar un rango mediante un guión." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Reservación" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Función del dispositivo" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "La unidad con el número más bajo ocupado por el dispositivo" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "La posición en el chasis virtual por la que se identifica este dispositivo" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "La prioridad del dispositivo en el chasis virtual" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" "Rellenar automáticamente los componentes asociados a este tipo de módulo" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Características" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Plantilla de puerto de consola" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Plantilla de puerto de servidor de consola" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Plantilla de puerto frontal" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Plantilla de interfaz" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Plantilla de toma de corriente" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Plantilla de puerto de alimentación" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Plantilla de puerto trasero" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interfaz" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Puerto de consola" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Puerto de servidor de consola" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Puerto frontal" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Puerto trasero" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Puerto de alimentación" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Toma de corriente" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Asignación de componentes" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Un InventoryItem solo se puede asignar a un único componente." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Interfaz LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtre las VLAN disponibles para la asignación por grupo." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Dispositivo infantil" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4586,32 +5039,35 @@ msgstr "" "Los dispositivos secundarios primero deben crearse y asignarse al sitio y al" " rack del dispositivo principal." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Puerto de consola" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Puerto de servidor de consola" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Puerto frontal" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "toma de corriente" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Artículo de inventario" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Función del artículo de inventario" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4619,7 +5075,7 @@ msgstr "" "Se admiten los rangos alfanuméricos. (Debe coincidir con el número de " "objetos que se están creando)." -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4628,18 +5084,19 @@ msgstr "" "El patrón proporcionado especifica {value_count} valores, pero " "{pattern_count} se esperan." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Puertos traseros" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Seleccione una asignación de puerto posterior para cada puerto frontal que " "se vaya a crear." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4649,16 +5106,7 @@ msgstr "" "({frontport_count}) debe coincidir con el número seleccionado de posiciones " "de los puertos traseros ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"La cadena {module} se sustituirá por la posición del módulo " -"asignado, si lo hubiera." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4668,17 +5116,18 @@ msgstr "" "coincidir con el número seleccionado de posiciones de los puertos traseros " "({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Miembros" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Posición inicial" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4686,67 +5135,69 @@ msgstr "" "Posición del primer dispositivo miembro. Aumenta en uno por cada miembro " "adicional." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Se debe especificar un puesto para el primer miembro del VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "etiqueta" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "longitud" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "unidad de longitud" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "cable" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "cables" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Debe especificar una unidad al configurar la longitud de un cable" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Debe definir las terminaciones A y B al crear un cable nuevo." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "No se pueden conectar diferentes tipos de terminaciones al mismo extremo del" " cable." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Tipos de terminación incompatibles: {type_a} y {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Las terminaciones A y B no pueden conectarse al mismo objeto." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "fin" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "terminación de cable" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "terminaciones de cables" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4755,38 +5206,38 @@ msgstr "" "Se encontró una terminación duplicada para {app_label}.{model} " "{termination_id}: cable {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Los cables no se pueden terminar en {type_display} interfaz" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Es posible que las terminaciones de circuito conectadas a la red de un " "proveedor no estén cableadas." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "está activo" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "está completo" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "está dividido" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "ruta de cable" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "rutas de cable" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4795,18 +5246,18 @@ msgstr "" "{module} se acepta como sustituto de la posición del compartimiento del " "módulo cuando se conecta a un tipo de módulo." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Etiqueta física" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Las plantillas de componentes no se pueden mover a un tipo de dispositivo " "diferente." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4814,7 +5265,7 @@ msgstr "" "Una plantilla de componente no se puede asociar a un tipo de dispositivo ni " "a un tipo de módulo." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4822,138 +5273,138 @@ msgstr "" "Una plantilla de componente debe estar asociada a un tipo de dispositivo o a" " un tipo de módulo." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "plantilla de puerto de consola" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "plantillas de puertos de consola" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "plantilla de puerto de servidor de consola" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "plantillas de puertos de servidor de consola" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "sorteo máximo" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "sorteo asignado" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "plantilla de puerto de alimentación" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "plantillas de puertos de alimentación" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "El sorteo asignado no puede superar el sorteo máximo ({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "pierna de alimentación" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fase (para alimentaciones trifásicas)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "plantilla de toma de corriente" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "plantillas de tomas de corriente" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " "tipo de dispositivo" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " "tipo de módulo" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "solo administración" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "interfaz de puente" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "función inalámbrica" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "plantilla de interfaz" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "plantillas de interfaz" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Una interfaz no se puede conectar a sí misma." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Interfaz de puente ({bridge}) debe pertenecer al mismo tipo de dispositivo" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Interfaz de puente ({bridge}) debe pertenecer al mismo tipo de módulo" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "posición del puerto trasero" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "plantilla de puerto frontal" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "plantillas de puertos frontales" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Puerto trasero ({name}) debe pertenecer al mismo tipo de dispositivo" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4962,48 +5413,48 @@ msgstr "" "Posición del puerto trasero no válida ({position}); puerto trasero {name} " "solo tiene {count} posiciones" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "posiciones" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "plantilla de puerto trasero" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "plantillas de puertos traseros" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "posición" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identificador al que se debe hacer referencia al cambiar el nombre de los " "componentes instalados" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "plantilla de bahía de módulos" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "plantillas de compartimentos de módulos" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "plantilla de compartimento de dispositivos" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "plantillas de compartimentos de dispositivos" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5013,202 +5464,207 @@ msgstr "" "configurarse como «principal» para permitir compartimentos para " "dispositivos." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID de pieza" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identificador de pieza asignado por el fabricante" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "plantilla de artículos de inventario" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "plantillas de artículos de inventario" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Los componentes no se pueden mover a un dispositivo diferente." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "extremo del cable" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "marcar conectado" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Tratar como si hubiera un cable conectado" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Debe especificar el extremo del cable (A o B) al conectar un cable." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "El extremo del cable no se debe colocar sin cable." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "No se puede marcar como conectado con un cable conectado." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} los modelos deben declarar una propiedad parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Tipo de puerto físico" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "velocidad" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Velocidad de puerto en bits por segundo" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "puerto de consola" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "puertos de consola" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "puerto de servidor de consola" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "puertos de servidor de consola" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "puerto de alimentación" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "puertos de alimentación" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "toma de corriente" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "tomas de corriente" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Puerto de alimentación principal ({power_port}) debe pertenecer al mismo " "dispositivo" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "modo" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Estrategia de etiquetado IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "interfaz principal" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "LAG principal" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Esta interfaz se usa solo para la administración fuera de banda" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "velocidad (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "dúplex" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "Nombre mundial de 64 bits" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "canal inalámbrico" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "frecuencia de canal (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Se rellena por el canal seleccionado (si está configurado)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "potencia de transmisión (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "LAN inalámbricas" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN sin etiquetar" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLAN etiquetadas" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interfaz" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfaz" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} las interfaces no pueden tener un cable conectado." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} las interfaces no se pueden marcar como conectadas." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Una interfaz no puede ser su propia interfaz principal." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "Solo se pueden asignar interfaces virtuales a una interfaz principal." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5217,7 +5673,7 @@ msgstr "" "La interfaz principal seleccionada ({interface}) pertenece a un dispositivo " "diferente ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5226,7 +5682,7 @@ msgstr "" "La interfaz principal seleccionada ({interface}) pertenece a {device}, que " "no forma parte del chasis virtual {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5235,7 +5691,7 @@ msgstr "" "La interfaz de puente seleccionada ({bridge}) pertenece a un dispositivo " "diferente ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5244,15 +5700,15 @@ msgstr "" "La interfaz de puente seleccionada ({interface}) pertenece a {device}, que " "no forma parte del chasis virtual {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Las interfaces virtuales no pueden tener una interfaz LAG principal." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Una interfaz LAG no puede ser su propia interfaz principal." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5260,7 +5716,7 @@ msgstr "" "La interfaz LAG seleccionada ({lag}) pertenece a un dispositivo diferente " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5269,51 +5725,51 @@ msgstr "" "La interfaz LAG seleccionada ({lag}) pertenece a {device}, que no forma " "parte del chasis virtual {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Las interfaces virtuales no pueden tener un modo PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Las interfaces virtuales no pueden tener un tipo PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Debe especificar el modo PoE al designar un tipo de PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "La función inalámbrica solo se puede configurar en las interfaces " "inalámbricas." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "El canal solo se puede configurar en las interfaces inalámbricas." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "La frecuencia del canal solo se puede configurar en las interfaces " "inalámbricas." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "No se puede especificar la frecuencia personalizada con el canal " "seleccionado." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "El ancho del canal solo se puede establecer en las interfaces inalámbricas." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "No se puede especificar un ancho personalizado con el canal seleccionado." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5322,24 +5778,24 @@ msgstr "" "La VLAN sin etiquetar ({untagged_vlan}) debe pertenecer al mismo sitio que " "el dispositivo principal de la interfaz o debe ser global." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Posición mapeada en el puerto trasero correspondiente" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "puerto frontal" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "puertos frontales" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Puerto trasero ({rear_port}) debe pertenecer al mismo dispositivo" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5348,19 +5804,19 @@ msgstr "" "Posición del puerto trasero no válida ({rear_port_position}): puerto trasero" " {name} solo tiene {positions} posiciones." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Número de puertos frontales que se pueden mapear" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "puerto trasero" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "puertos traseros" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5369,39 +5825,40 @@ msgstr "" "El número de posiciones no puede ser inferior al número de puertos frontales" " mapeados ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "compartimiento de módulos" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "compartimentos de módulos" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Una bahía de módulos no puede pertenecer a un módulo instalado en ella." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "compartimiento de dispositivos" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "compartimentos para dispositivos" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Este tipo de dispositivo ({device_type}) no admite compartimentos para " "dispositivos." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "No se puede instalar un dispositivo en sí mismo." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5409,116 +5866,118 @@ msgstr "" "No se puede instalar el dispositivo especificado; el dispositivo ya está " "instalado en {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "rol de artículo de inventario" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "roles de artículos de inventario" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "número de serie" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "etiqueta de activo" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Una etiqueta única que se utiliza para identificar este artículo" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "descubierto" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Este artículo se descubrió automáticamente" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "artículo de inventario" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "artículos de inventario" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "No se puede asignar a sí mismo como padre." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "" "El artículo del inventario principal no pertenece al mismo dispositivo." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "No se puede mover un artículo del inventario con hijos a cargo" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "No se puede asignar un artículo de inventario a un componente de otro " "dispositivo" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "fabricante" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "fabricantes" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "modelo" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "plataforma predeterminada" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "número de pieza" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Número de pieza discreto (opcional)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "altura (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "excluir de la utilización" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Los dispositivos de este tipo se excluyen al calcular la utilización de los " "racks." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "es de profundidad total" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "El dispositivo consume las caras delantera y trasera del bastidor." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "estado de padre/hijo" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5527,24 +5986,24 @@ msgstr "" "compartimentos para dispositivos. Déjelo en blanco si este tipo de " "dispositivo no es para padres ni para niños." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "flujo de aire" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "tipo de dispositivo" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "tipos de dispositivos" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "La altura en U debe ser en incrementos de 0,5 unidades de bastidor." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5553,7 +6012,7 @@ msgstr "" "Dispositivo {device} en un estante {rack} no tiene espacio suficiente para " "acomodar una altura de {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5563,7 +6022,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} instancias ya está montado dentro" " de bastidores." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5572,155 +6031,155 @@ msgstr "" "asociadas a este dispositivo antes de desclasificarlo como dispositivo " "principal." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Los tipos de dispositivos secundarios deben ser 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "tipo de módulo" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "tipos de módulos" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Se pueden asignar máquinas virtuales a esta función" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "rol del dispositivo" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "funciones del dispositivo" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Si lo desea, limite esta plataforma a dispositivos de un fabricante " "determinado." -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "plataforma" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "plataformas" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "La función que cumple este dispositivo" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Número de serie del chasis, asignado por el fabricante" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Una etiqueta única que se utiliza para identificar este dispositivo" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "posición (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "cara del estante" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "IPv4 principal" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "IPv6 principal" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP fuera de banda" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Posición VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Posición virtual del chasis" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Prioridad VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Prioridad de elección del maestro del chasis virtual" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "latitud" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Coordenada GPS en formato decimal (xx.aaaaa)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "longitud" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "El nombre del dispositivo debe ser único por sitio." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "dispositivo" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "dispositivos" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Estante {rack} no pertenece al sitio {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Ubicación {location} no pertenece al sitio {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Estante {rack} no pertenece a la ubicación {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "No se puede seleccionar una cara de bastidor sin asignar un bastidor." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "" "No se puede seleccionar una posición de cremallera sin asignar una " "cremallera." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "La posición debe estar en incrementos de 0,5 unidades de estante." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Debe especificar la cara de la cremallera al definir la posición de la " "cremallera." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5728,7 +6187,7 @@ msgstr "" "Un tipo de dispositivo 0U ({device_type}) no se puede asignar a una posición" " de estantería." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5736,7 +6195,7 @@ msgstr "" "Los tipos de dispositivos secundarios no se pueden asignar a la cara de un " "bastidor. Este es un atributo del dispositivo principal." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5744,7 +6203,7 @@ msgstr "" "Los tipos de dispositivos secundarios no se pueden asignar a una posición de" " bastidor. Este es un atributo del dispositivo principal." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5753,23 +6212,23 @@ msgstr "" "U{position} ya está ocupado o no tiene espacio suficiente para este tipo de " "dispositivo: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} no es una dirección IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" "La dirección IP especificada ({ip}) no está asignado a este dispositivo." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} no es una dirección IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5779,17 +6238,17 @@ msgstr "" "dispositivos, pero el tipo de este dispositivo pertenece a " "{devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "El clúster asignado pertenece a un sitio diferente ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Un dispositivo asignado a un chasis virtual debe tener su posición definida." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5798,15 +6257,15 @@ msgstr "" "El dispositivo no se puede extraer del chasis virtual {virtual_chassis} " "porque actualmente está designado como su maestro." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "módulo" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "módulos" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5815,22 +6274,22 @@ msgstr "" "El módulo debe instalarse en un compartimiento de módulos que pertenezca al " "dispositivo asignado ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "dominio" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "chasis virtual" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "El maestro seleccionado ({master}) no está asignado a este chasis virtual." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5839,105 +6298,105 @@ msgstr "" "No se puede eliminar el chasis virtual {self}. Hay interfaces miembros que " "forman interfaces LAG entre chasis." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identificador" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Identificador numérico exclusivo del dispositivo principal" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "comentarios" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "contexto de dispositivo virtual" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "contextos de dispositivos virtuales" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} no es un IPv{family} dirección." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "La dirección IP principal debe pertenecer a una interfaz del dispositivo " "asignado." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "peso" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "unidad de peso" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Debe especificar una unidad al establecer un peso" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "panel de alimentación" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "paneles de alimentación" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "" "Ubicación {location} ({location_site}) está en un sitio diferente al {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "suministrar" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "fase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "voltaje" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "amperaje" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "utilización máxima" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Consumo máximo permitido (porcentaje)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "potencia disponible" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "alimentación" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "fuentes de alimentación" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5946,64 +6405,64 @@ msgstr "" "Estante {rack} ({rack_site}) y panel de alimentación {powerpanel} " "({powerpanel_site}) están en diferentes sitios." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "" "La tensión no puede ser negativa para el suministro de corriente alterna" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "anchura" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Ancho de riel a riel" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Altura en unidades de estantería" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "unidad de arranque" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Unidad de arranque para bastidor" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "unidades descendentes" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Las unidades están numeradas de arriba a abajo" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "ancho exterior" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Dimensión exterior del estante (ancho)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "profundidad exterior" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Dimensión exterior del bastidor (profundidad)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "unidad exterior" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "profundidad de montaje" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6012,76 +6471,77 @@ msgstr "" "los estantes de cuatro postes, esta es la distancia entre los rieles " "delantero y trasero." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "peso máximo" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Capacidad de carga máxima del bastidor" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "factor de forma" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "tipo de bastidor" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "tipos de estanterías" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Debe especificar una unidad al establecer una anchura o profundidad " "exteriores" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Debe especificar una unidad al establecer un peso máximo" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "rol de bastidor" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "roles de seguimiento" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID de la instalación" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Identificador asignado localmente" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Función funcional" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Una etiqueta única que se utiliza para identificar este estante" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "estante" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "bastidores" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "La ubicación asignada debe pertenecer al sitio principal ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6090,7 +6550,7 @@ msgstr "" "El estante debe tener al menos {min_height}Hablo para alojar los " "dispositivos instalados actualmente." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6099,893 +6559,955 @@ msgstr "" "La numeración de las unidades del bastidor debe comenzar en {position} o " "menos para alojar los dispositivos actualmente instalados." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "La ubicación debe ser del mismo sitio, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "unidades" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "reserva de seguimiento" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "Seguimiento de reservas" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" "Unidad (es) no válida (s) para {height}Rack de Reino Unido: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Ya se han reservado las siguientes unidades: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Ya existe una región de nivel superior con este nombre." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Ya existe una región de alto nivel con esta babosa." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "región" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regiones" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Ya existe un grupo de sitio de nivel superior con este nombre." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Ya existe un grupo de sitios de nivel superior con este slug." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "grupo de sitios" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "grupos de sitios" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Nombre completo del sitio" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "instalaciones" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ID o descripción de la instalación local" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "dirección física" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Ubicación física del edificio" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "dirección de envío" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Si es diferente de la dirección física" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "sitio" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "sitios" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Ya existe una ubicación con este nombre en el sitio especificado." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Ya existe una ubicación con esta babosa en el sitio especificado." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "ubicación" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "ubicaciones" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Ubicación de los padres ({parent}) debe pertenecer al mismo sitio ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Terminación A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Terminación B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Dispositivo A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Dispositivo B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Ubicación A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Ubicación B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Bastidor A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Estante B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Sitio A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Sitio B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Accesible" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Dispositivos" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VM" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Plantilla de configuración" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Grupo de sitios" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "Dirección IP" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Dirección IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Dirección IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Posición VC" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Prioridad VC" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Dispositivo principal" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Posición (bahía de dispositivos)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Puertos de consola" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Puertos de servidor de consola" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Puertos de alimentación" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "tomas de corriente" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfaces" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Puertos frontales" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Compartimentos para dispositivos" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Bahías de módulos" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Artículos de inventario" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Bahía de módulos" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Artículos de inventario" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Color del cable" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Vincula a tus compañeros" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Marcar conectado" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Consumo máximo (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Sorteo asignado (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "Direcciones IP" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Grupos FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Túnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Solo administración" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Módulo instalado" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Serie del módulo" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Etiqueta de activo del módulo" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Estado del módulo" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Componente" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Artículos" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Tipos de dispositivos" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Tipos de módulos" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Plataformas" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Plataforma predeterminada" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Profundidad total" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Altura en U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instancias" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Puertos de consola" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Puertos de servidor de consola" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Puertos de alimentación" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Tomas de corriente" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Puertos frontales" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Puertos traseros" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Bahías de dispositivos" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Bahías de módulos" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Fuentes de alimentación" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Utilización máxima" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Potencia disponible (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Bastidores" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Altura" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Anchura exterior" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Profundidad exterior" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Peso máximo" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Espacio" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Sitios" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "El caso de prueba debe establecer peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Desconectado {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Reservaciones" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Dispositivos no rakeados" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Contexto de configuración" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Configuración de renderizado" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Se ha producido un error al renderizar la plantilla: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Máquinas virtuales" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Dispositivo instalado {device} en la bahía {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Dispositivo eliminado {device} desde la bahía {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Niños" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Miembro agregado {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "No se puede eliminar el dispositivo maestro {device} desde el chasis " "virtual." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Eliminado {device} desde un chasis virtual {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Objeto (s) relacionado (s) desconocido (s): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "No se admite cambiar el tipo de campos personalizados." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "La programación no está habilitada para este script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Texto" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Texto (largo)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Número entero" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Decimal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Booleano (verdadero o falso)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Fecha" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Fecha y hora" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Selección" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Selección múltiple" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Objetos múltiples" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Discapacitado" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Suelto" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Exacto" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Siempre" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Si está configurado" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Oculto" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Sí" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "No" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Enlace" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "El más reciente" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "El más antiguo" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabético (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabético (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Información" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Éxito" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Advertencia" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Peligro" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Depurar" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Predeterminado" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Fracaso" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Cada hora" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 horas" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Diariamente" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Semanal" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 días" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Crear" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Actualización" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Eliminar" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Azul" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "añil" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Morado" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Rosado" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "rojo" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "naranja" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Amarillo" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Verde" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Verde azulado" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Cian" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Gris" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Negro" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "blanco" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Guión" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Notificación" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Operador desconocido: {op}. Debe ser uno de: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Tipo de valor no admitido: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Tipo no válido para {op} operación: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "El conjunto de reglas debe ser un diccionario, no {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Tipo de lógica no válido: debe ser «AND» u «OR». Consulte la documentación." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "" "Se informó de claves incorrectas. Por favor, consulte la documentación." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Tipo de widget" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Clase de widget no registrada: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} debe definir un método render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Nota" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Muestra contenido personalizado arbitrario. Markdown es compatible." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Recuentos de objetos" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6993,270 +7515,292 @@ msgstr "" "Muestre un conjunto de modelos de NetBox y el número de objetos creados para" " cada tipo." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtros para aplicar al contar el número de objetos" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Formato no válido. Los filtros de objetos se deben pasar como un " "diccionario." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Lista de objetos" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Muestra una lista arbitraria de objetos." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "El número predeterminado de objetos que se van a mostrar" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Formato no válido. Los parámetros de URL se deben pasar como un diccionario." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "Fuente RSS" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Inserte una fuente RSS desde un sitio web externo." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL del feed" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "El número máximo de objetos que se van a mostrar" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Cuánto tiempo se debe almacenar el contenido en caché (en segundos)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Marcadores" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Muestra tus marcadores personales" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Tipo de acción desconocido para una regla de evento: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "No se puede importar la canalización de eventos {name} error: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Módulo de script (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Archivo de datos (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Grupo (nombre)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Tipo de clúster" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Tipo de clúster (babosa)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Grupo de inquilinos" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Grupo de inquilinos (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Etiqueta" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Etiqueta (babosa)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Tiene datos de contexto de configuración local" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Nombre del grupo" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Obligatorio" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Debe ser único" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Interfaz de usuario visible" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Interfaz de usuario editable" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Es clonable" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Valor mínimo" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Valor máximo" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Regex de validación" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Comportamiento" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Ventana nueva" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Clase de botones" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Tipo MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Extensión de archivo" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Como archivo adjunto" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Compartido" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Método HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL de carga" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Verificación SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Secreto" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Ruta del archivo CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Tipos de eventos" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Está activo" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Tipos de objetos" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Uno o más tipos de objetos asignados" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Tipo de datos de campo (por ejemplo, texto, entero, etc.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Tipo de objeto" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Tipo de objeto (para campos de objetos o de varios objetos)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Set de elección" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Conjunto de opciones (para campos de selección)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Si el campo personalizado se muestra en la interfaz de usuario" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Si el campo personalizado se puede editar en la interfaz de usuario" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "" "El conjunto base de opciones predefinidas que se van a utilizar (si las hay)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7265,184 +7809,200 @@ msgstr "" " opcionales separadas por dos puntos: «Choice1:First Choice, Choice2:Second " "Choice»" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "clase de botones" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "La clase del primer enlace de un grupo se usará para el botón desplegable" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Los tipos de eventos que activarán esta regla" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Objeto de acción" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Nombre o script del webhook como ruta punteada module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} no se encontró" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Guión {name} no se encontró" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Tipo de objeto asignado" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "La clasificación de entrada" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "usuarios" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Nombres de usuario separados por comas y entre comillas dobles" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Grupos" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Nombres de grupos separados por comas y entre comillas" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Tipo de objeto relacionado" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Tipo de campo" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Opciones" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Datos" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Archivo de datos" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Tipos de contenido" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Tipo de contenido HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Tipo de evento" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Tipo de acción" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Tipo de objeto etiquetado" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Tipo de objeto permitido" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regiones" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Grupos de sitios" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Ubicaciones" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Tipos de dispositivos" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Funciones" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Tipos de clústeres" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Grupos de clústeres" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Clústers" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Grupos de inquilinos" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Los tipos de objeto que tienen este campo personalizado" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Valor predeterminado" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Tipo del objeto relacionado (solo para campos de objeto/multiobjeto)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filtro de objetos relacionados" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Especifique los parámetros de consulta como un objeto JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Campo personalizado" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7450,7 +8010,7 @@ msgstr "" "El tipo de datos almacenados en este campo. Para los campos de objetos o " "multiobjetos, seleccione el tipo de objeto relacionado a continuación." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7458,11 +8018,11 @@ msgstr "" "Esto se mostrará como texto de ayuda para el campo del formulario. Markdown " "es compatible." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Objeto relacionado" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7470,15 +8030,16 @@ msgstr "" "Introduzca una opción por línea. Se puede especificar una etiqueta opcional " "para cada elección añadiendo dos puntos. Ejemplo:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Vínculo personalizado" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Plantillas" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7488,7 +8049,7 @@ msgstr "" "objeto como {example}. Los enlaces que se muestren como texto vacío no se " "mostrarán." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7496,56 +8057,62 @@ msgstr "" "Código de plantilla Jinja2 para la URL del enlace. Haga referencia al objeto" " como {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Código de plantilla" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Plantilla de exportación" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Renderización" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "El contenido de la plantilla se rellena desde la fuente remota seleccionada " "a continuación." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Debe especificar el contenido local o un archivo de datos" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Filtro guardado" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Un grupo de notificaciones especifica al menos un usuario o grupo." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Solicitud HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Elección de acción" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "" "Introduzca las condiciones en JSON " "formato." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7553,112 +8120,114 @@ msgstr "" "Introduzca los parámetros para pasar a la acción en JSON formato." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Regla del evento" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Disparadores" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Grupo de notificaciones" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Inquilinos" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "" "Los datos se rellenan desde la fuente remota seleccionada a continuación." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Debe especificar datos locales o un archivo de datos" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Contenido" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Programe en" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Programe la ejecución del informe a una hora determinada" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Se repite cada" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Intervalo en el que se vuelve a ejecutar este informe (en minutos)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (hora actual: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "La hora programada debe estar en el futuro." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Confirmar cambios" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Confirme los cambios en la base de datos (desactive la casilla para una " "ejecución en seco)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Programe la ejecución del script a una hora determinada" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervalo en el que se vuelve a ejecutar este script (en minutos)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Los cambios en la base de datos se han revertido automáticamente." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Secuencia de comandos abortada con un error: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Se ha producido una excepción: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Los cambios en la base de datos se han revertido debido a un error." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "¡No se encontró ningún indexador!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "contexto de configuración" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "contextos de configuración" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Los datos JSON deben estar en forma de objeto. Ejemplo:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7666,19 +8235,19 @@ msgstr "" "Los datos del contexto de configuración local tienen prioridad sobre los " "contextos de origen en el contexto de configuración renderizado final." -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "código de plantilla" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Código de plantilla Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "parámetros ambientales" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7688,43 +8257,43 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">parámetros" " adicionales para pasar al construir el entorno Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "plantilla de configuración" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "plantillas de configuración" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Los objetos a los que se aplica este campo." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "El tipo de datos que contiene este campo personalizado" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "El tipo de objeto NetBox al que se asigna este campo (para campos de " "objetos)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Nombre del campo interno" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Solo se permiten caracteres alfanuméricos y guiones bajos." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "No se permiten los guiones dobles de subrayado en los nombres de campo " "personalizados." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7732,19 +8301,19 @@ msgstr "" "Nombre del campo tal como se muestra a los usuarios (si no se proporciona, " "se usará el nombre del campo)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "nombre del grupo" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Los campos personalizados del mismo grupo se mostrarán juntos" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "requerido" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7752,19 +8321,19 @@ msgstr "" "Este campo es obligatorio para crear objetos nuevos o editar un objeto " "existente." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "debe ser único" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "El valor de este campo debe ser único para el objeto asignado" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "peso de búsqueda" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7772,11 +8341,11 @@ msgstr "" "Ponderación para la búsqueda. Los valores más bajos se consideran más " "importantes. Los campos con un peso de búsqueda de cero se ignorarán." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "lógica de filtros" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7784,11 +8353,11 @@ msgstr "" "Loose coincide con cualquier instancia de una cadena determinada; exact " "coincide con todo el campo." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "predeterminado" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7796,7 +8365,7 @@ msgstr "" "Valor predeterminado para el campo (debe ser un valor JSON). Encapsula " "cadenas con comillas dobles (por ejemplo, «Foo»)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7805,35 +8374,35 @@ msgstr "" "query_params (debe ser un valor JSON). Encapsula cadenas con comillas dobles" " (por ejemplo, «Foo»)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "peso de la pantalla" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Los campos con pesos más altos aparecen más abajo en un formulario." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "valor mínimo" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Valor mínimo permitido (para campos numéricos)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "valor máximo" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Valor máximo permitido (para campos numéricos)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "expresión regular de validación" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7844,196 +8413,198 @@ msgstr "" "y $ para forzar la coincidencia de toda la cadena. Por ejemplo, ^ " "[A-Z]{3}$ limitará los valores a exactamente tres letras mayúsculas." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "conjunto de opciones" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Especifica si el campo personalizado se muestra en la interfaz de usuario" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Especifica si el valor del campo personalizado se puede editar en la " "interfaz de usuario" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "es clonable" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Replique este valor al clonar objetos" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "campo personalizado" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "campos personalizados" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Valor predeterminado no válido»{value}«: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Solo se puede establecer un valor mínimo para los campos numéricos" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Solo se puede establecer un valor máximo para los campos numéricos" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "La validación de expresiones regulares solo se admite para campos de texto y" " URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "La unicidad no se puede aplicar a los campos booleanos" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Los campos de selección deben especificar un conjunto de opciones." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Las elecciones solo se pueden establecer en los campos de selección." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Los campos de objeto deben definir un tipo de objeto." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} es posible que los campos no definan un tipo de objeto." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Un filtro de objetos relacionados solo se puede definir para los campos de " "objetos." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "El filtro debe definirse como un diccionario que asigna atributos a valores." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Cierto" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Falso" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" "Los valores deben coincidir con esta expresión regular: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "El valor debe ser una cadena." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "El valor debe coincidir con la expresión regular '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "El valor debe ser un número entero." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "El valor debe ser al menos {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "El valor no debe superar {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "El valor debe ser decimal." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "El valor debe ser verdadero o falso." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Los valores de fecha deben estar en formato ISO 8601 (AAAA-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Los valores de fecha y hora deben estar en formato ISO 8601 (AAAA-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "" "Elección no válida ({value}) para el conjunto de opciones {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "" "Elecciones no válidas ({value}) para el conjunto de opciones {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "El valor debe ser un ID de objeto, no {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "El valor debe ser una lista de identificadores de objetos, no {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Se encontró un ID de objeto no válido: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "El campo obligatorio no puede estar vacío." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Conjunto básico de opciones predefinidas (opcional)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Las opciones se ordenan alfabéticamente automáticamente" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "conjunto de opciones de campo personalizadas" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "conjuntos de opciones de campo personalizadas" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Debe definir opciones básicas o adicionales." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8042,60 +8613,60 @@ msgstr "" "No se puede eliminar la opción {choice} como los hay {model} objetos que " "hacen referencia a él." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "diseño" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "configuración" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "salpicadero" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "tableros" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "tipos de objetos" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Los objetos a los que se aplica esta regla." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Los tipos de eventos que activarán esta regla." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "condiciones" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Conjunto de condiciones que determinan si se generará el evento." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "tipo de acción" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Datos adicionales para pasar al objeto de acción" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "regla de evento" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "reglas del evento" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8105,7 +8676,7 @@ msgstr "" "webhook. El procesamiento de plantillas de Jinja2 se admite en el mismo " "contexto que el cuerpo de la solicitud." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available aquí." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "encabezados adicionales" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8132,11 +8703,11 @@ msgstr "" " Jinja2 se admite en el mismo contexto que el cuerpo de la solicitud (a " "continuación)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "plantilla corporal" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8149,11 +8720,11 @@ msgstr "" "marca de tiempo, nombre de usuario, " "id_solicitud, y dato." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "secreto" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8164,16 +8735,16 @@ msgstr "" "carga utilizando el secreto como clave. El secreto no se transmite en la " "solicitud." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" "Habilita la verificación del certificado SSL. ¡Desactívala con precaución!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Ruta del archivo CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8182,65 +8753,65 @@ msgstr "" "verificación SSL. Déjelo en blanco para usar los valores predeterminados del" " sistema." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "No especifique un archivo de certificado de CA si la verificación SSL está " "deshabilitada." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Los tipos de objeto a los que se aplica este enlace." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "texto de enlace" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Código de plantilla Jinja2 para texto de enlace" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL del enlace" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Código de plantilla Jinja2 para la URL del enlace" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Los enlaces con el mismo grupo aparecerán en un menú desplegable" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "ventana nueva" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Forzar que el enlace se abra en una ventana nueva" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "enlace personalizado" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "enlaces personalizados" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Los tipos de objeto a los que se aplica esta plantilla." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8248,1088 +8819,1154 @@ msgstr "" "Código de plantilla Jinja2. La lista de objetos que se exportan se pasa como" " una variable de contexto denominada conjunto de consultas." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "El valor predeterminado es texto/plano; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "extensión de archivo" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Extensión para añadir al nombre de archivo renderizado" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "como adjunto" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Descargar archivo como archivo adjunto" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "plantilla de exportación" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "plantillas de exportación" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "«{name}\"es un nombre reservado. Elija un nombre diferente." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Los tipos de objeto a los que se aplica este filtro." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "compartido" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "filtro guardado" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "filtros guardados" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Los parámetros de filtro se deben almacenar como un diccionario de " "argumentos de palabras clave." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "altura de la imagen" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "ancho de imagen" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "adjunto de imagen" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "archivos adjuntos de imágenes" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Los archivos adjuntos de imágenes no se pueden asignar a este tipo de objeto" " ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "amable" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "entrada de diario" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "entradas de diario" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "No se admite el registro en diario para este tipo de objeto ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "marcalibros" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "marcapáginas" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "No se pueden asignar marcadores a este tipo de objeto ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "leer" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "acto" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "notificación" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "notificaciones" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objetos de este tipo ({type}) no admiten notificaciones." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "grupos" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "usuarios" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "grupo de notificaciones" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "grupos de notificaciones" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "suscripción" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "suscripciones" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "es ejecutable" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "secuencia de comandos" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "scripts" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "módulo de script" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "módulos de script" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "marca de tiempo" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "campo" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "valor" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "valor almacenado en caché" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "valores en caché" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "sucursal" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "sucursales" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "cambio por etapas" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "cambios por etapas" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Los tipos de objeto a los que se puede aplicar esta etiqueta." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "etiqueta" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "etiquetas" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "artículo etiquetado" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "artículos etiquetados" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Datos del script" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parámetros de ejecución del script" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Descartar" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Tipos de objetos" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Valide la singularidad" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Visible" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Editable" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Tipo de objeto relacionado" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Set de elección" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Se puede clonar" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Valor mínimo" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Valor máximo" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Regex de validación" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Contar" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Ordenar alfabéticamente" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Ventana nueva" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Como archivo adjunto" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Archivo de datos" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Sincronizado" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Imagen" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Tamaño (bytes)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Leer" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Validación SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Tipos de eventos" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Funciones del dispositivo" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Comentarios (cortos)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Línea" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Nivel" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Mensaje" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Método" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Asegúrese de que este valor sea igual a %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Asegúrese de que este valor no sea igual %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Este campo debe estar vacío." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Este campo no debe estar vacío." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Las reglas de validación se deben pasar como un diccionario" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Fallo en la validación personalizada para {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Atributo no válido»{name}«para solicitar" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Atributo no válido»{name}«para {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Tu panel de control se ha restablecido." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Widget añadido: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Widget actualizado: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Widget eliminado: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Error al eliminar el widget: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "" "No se puede ejecutar el script: el proceso de trabajo de RQ no se está " "ejecutando." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Introduzca una dirección IPv4 o IPv6 válida con máscara opcional." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Formato de dirección IP no válido: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" "Introduzca un prefijo y una máscara IPv4 o IPv6 válidos en notación CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Formato de prefijo IP no válido: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "No hay suficiente espacio disponible para los tamaños de prefijo solicitados" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Contenedor" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLACO" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Bucle invertido" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Estándar" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Punto de control" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Texto plano" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Formato de dirección IP no válido: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Objetivo de importación" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Destino de importación (nombre)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Objetivo de exportación" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Destino de exportación (nombre)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importación de VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importar VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Exportación de VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Exportar VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importación de L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importación de L2VPN (identificador)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Exportación de L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Exportación de L2VPN (identificador)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefijo" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (babosa)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Dentro del prefijo" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Dentro del prefijo e incluído" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Prefijos que contienen este prefijo o IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Longitud de la máscara" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Número de VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Dirección" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Intervalos que contienen este prefijo o IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Prefijo principal" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Máquina virtual (nombre)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Máquina virtual (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interfaz (nombre)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interfaz VM (nombre)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interfaz de máquina virtual (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Grupo FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Está asignado a una interfaz" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Está asignado" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Servicio (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "Dirección IP interna de NAT (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interfaz asignada" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Interfaz VM asignada" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "Dirección IP (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "dirección IP" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "IPv4 principal (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "IPv6 principal (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Introduzca una dirección IPv4 o IPv6 válida (sin máscara)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Formato de dirección IPv4/IPv6 no válido: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Este campo requiere una dirección IP sin máscara." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Especifique una dirección IPv4 o IPv6 válida." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Introduzca una dirección IPv4 o IPv6 válida (con máscara CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Se requiere una máscara CIDR (por ejemplo, /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Patrón de direcciones" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Haga valer un espacio único" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Es privado" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Fecha añadida" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Grupo VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Longitud del prefijo" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Es una piscina" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Tratar como si se hubiera utilizado por completo" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Asignación de VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Nombre DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protocolo" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "ID de grupo" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Tipo de autenticación" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Clave de autenticación" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "AUTENTICACIÓN" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Tipo de ámbito" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Alcance" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Intervalos de ID de VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Sitio y grupo" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Puertos" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importar destinos de ruta" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Exportar destinos de ruta" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "RIR asignado" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Grupo de VLAN (si lo hay)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Dispositivo principal de la interfaz asignada (si existe)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Máquina virtual" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "VM principal de la interfaz asignada (si existe)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Es primaria" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Conviértase en la IP principal del dispositivo asignado" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "No se especificó ningún dispositivo o máquina virtual; no se puede " "establecer como IP principal" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "No se especificó ninguna interfaz; no se puede establecer como IP principal" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Tipo de autenticación" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Tipo de ámbito (aplicación y modelo)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Grupo de VLAN asignado" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "Protocolo IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Obligatorio si no está asignado a una VM" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Obligatorio si no está asignado a un dispositivo" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} no está asignado a este dispositivo/máquina virtual." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Objetivos de ruta" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Importar objetivos" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Objetivos de exportación" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importado por VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Exportado por VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privada" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Familia de direcciones" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Alcance" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Comenzar" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Fin" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Busca dentro" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Presente en VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Dispositivo/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Prefijo principal" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Dispositivo asignado" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "VM asignada" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Asignado a una interfaz" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Nombre DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Contiene el identificador de VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "IDENTIFICADOR DE VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Máquina virtual" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Objetivo de ruta" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Agregado" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Gama ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Asignación de sitio/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Rango de IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Grupo FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Haga que esta sea la IP principal del dispositivo/VM" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (interior)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Solo se puede asignar una dirección IP a un único objeto." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"No se puede reasignar la dirección IP mientras esté designada como la IP " -"principal del objeto principal" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Solo las direcciones IP asignadas a una interfaz se pueden designar como IP " "principales." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Dirección IP virtual" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "La asignación ya existe" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "ID de VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "VLAN secundarias" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9337,132 +9974,133 @@ msgstr "" "Lista separada por comas de uno o más números de puerto. Se puede " "especificar un rango mediante un guión." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Plantilla de servicio" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Puerto (s)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Servicio" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Plantilla de servicio" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Desde plantilla" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Personalizado" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Debe especificar el nombre, el protocolo y los puertos si no utiliza una " "plantilla de servicio." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "comienzo" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Gama ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Gamas de ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Iniciar ASN ({start}) debe ser inferior al ASN final ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Registro regional de Internet responsable de este espacio numérico AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "Número de sistema autónomo de 16 o 32 bits" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID de grupo" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protocolo" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "tipo de autenticación" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "clave de autenticación" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Grupo FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Grupos FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Asignación grupal de FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Tareas grupales de FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privado" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "El espacio IP administrado por este RIR se considera privado" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Red IPv4 o IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Registro regional de Internet responsable de este espacio IP" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "fecha añadida" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "agregado" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "agregados" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "No se puede crear un agregado con la máscara /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9471,7 +10109,7 @@ msgstr "" "Los agregados no pueden superponerse. {prefix} ya está cubierto por un " "agregado existente ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9480,159 +10118,161 @@ msgstr "" "Los prefijos no pueden superponerse a los agregados. {prefix} cubre un " "agregado existente ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "papel" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "papeles" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "prefijo" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Red IPv4 o IPv6 con máscara" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Estado operativo de este prefijo" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "La función principal de este prefijo" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "es una piscina" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Todas las direcciones IP incluidas en este prefijo se consideran " "utilizables." -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "marca utilizada" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "prefijos" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "No se puede crear un prefijo con la máscara /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "tabla global" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Se encuentra un prefijo duplicado en {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "dirección de inicio" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Dirección IPv4 o IPv6 (con máscara)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "dirección final" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Estado operativo de esta gama" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "La función principal de esta gama" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Rango IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Intervalos de IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Las versiones de la dirección IP inicial y final deben coincidir" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Las máscaras de direcciones IP iniciales y finales deben coincidir" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "La dirección final debe ser mayor que la dirección inicial ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Las direcciones definidas se superponen con el rango {overlapping_range} en " "VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "El rango definido supera el tamaño máximo admitido ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "dirección" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "El estado operativo de esta IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "La función funcional de esta propiedad intelectual" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (interior)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "La IP para la que esta dirección es la IP «externa»" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Nombre de host o FQDN (no distingue mayúsculas de minúsculas)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "direcciones IP" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "No se puede crear una dirección IP con la máscara /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} es un ID de red, que no puede asignarse a una interfaz." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." @@ -9640,108 +10280,116 @@ msgstr "" "{ip} es una dirección de transmisión, que puede no estar asignada a una " "interfaz." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Se encontró una dirección IP duplicada en {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"No se puede reasignar la dirección IP mientras esté designada como la IP " +"principal del objeto principal" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Solo a las direcciones IPv6 se les puede asignar el estado SLAAC" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "números de puerto" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "plantilla de servicio" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "plantillas de servicio" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Las direcciones IP específicas (si las hay) a las que está vinculado este " "servicio" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "servicio" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "servicios" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "No se puede asociar un servicio tanto a un dispositivo como a una máquina " "virtual." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Un servicio debe estar asociado a un dispositivo o a una máquina virtual." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Grupos de VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "No se puede establecer scope_type sin scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "No se puede establecer scope_id sin scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Los rangos no se pueden superponer." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "El sitio específico al que está asignada esta VLAN (si existe)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Grupo de VLAN (opcional)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID de VLAN numérico (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Estado operativo de esta VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "La función principal de esta VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9750,164 +10398,166 @@ msgstr "" "La VLAN está asignada al grupo {group} (alcance: {scope}); no se puede " "asignar también al sitio {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "El VID debe estar en rangos {ranges} para VLAN en grupo {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "distinguidor de rutas" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Distintor de ruta único (tal como se define en el RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "reforzar un espacio único" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Evite la duplicación de prefijos/direcciones IP en este VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRFs" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Valor objetivo de ruta (formateado de acuerdo con el RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "destino de ruta" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "objetivos de ruta" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "COMO PUNTO" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Recuento de sitios" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Recuento de proveedores" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agregados" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Añadido" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Prefijos" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Utilización" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Intervalos de IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Prefijo (plano)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Profundidad" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Piscina" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Marcado como utilizado" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Dirección de inicio" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (interior)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (exterior)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Asignado" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Objeto asignado" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Tipo de ámbito" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Gamas VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VÍDEO" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "ROJO" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Único" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Objetivos de importación" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Objetivos de exportación" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} no es un prefijo válido. ¿Querías decir {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "La longitud del prefijo debe ser inferior o igual a %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "La longitud del prefijo debe ser mayor o igual a %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9915,31 +10565,31 @@ msgstr "" "Solo se permiten caracteres alfanuméricos, asteriscos, guiones, puntos y " "guiones bajos en los nombres DNS" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Prefijos infantiles" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Rangos infantiles" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "IPs relacionadas" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfaces de dispositivos" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Interfaces de VM" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Es posible que este campo no esté en blanco." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9947,336 +10597,349 @@ msgstr "" "El valor debe pasarse directamente (por ejemplo, «foo»: 123); no utilice un " "diccionario o una lista." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} no es una opción válida." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Tipo de contenido no válido: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Valor no válido. Especifique un tipo de contenido como " "'.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "" "Los rangos se deben especificar en el formulario (inferior, superior)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Los límites del rango se deben definir como números enteros." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} debe implementar get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Permiso no válido {permission} para modelo {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "rojo oscuro" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rosa" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fucsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Púrpura oscuro" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Azul claro" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aguamarina" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Verde oscuro" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Verde claro" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Lima" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Ámbar" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Naranja oscuro" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Marrón" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Gris claro" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Gris" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Gris oscuro" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Directo" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Cargar" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Detección automática" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Coma" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Punto y coma" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Pestaña" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Parámetro de configuración no válido: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "banner de inicio de sesión" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Contenido adicional para mostrar en la página de inicio de sesión" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Banner de mantenimiento" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Contenido adicional para mostrar en modo de mantenimiento" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Banner superior" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Contenido adicional para mostrar en la parte superior de cada página" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Banner inferior" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Contenido adicional para mostrar en la parte inferior de cada página" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Espacio IP único a nivel mundial" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Imponga un direccionamiento IP único dentro de la tabla global" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Prefiero IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Prefiere las direcciones IPv4 en lugar de IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Altura de la unidad de estantería" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "" "Altura unitaria predeterminada para elevaciones de estanterías renderizadas" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Ancho de la unidad de bastidor" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "" "Ancho de unidad predeterminado para las elevaciones de estanterías " "renderizadas" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Tensión de alimentación" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Tensión predeterminada para las alimentaciones" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Amperaje de alimentación" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Amperaje predeterminado para las alimentaciones" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Utilización máxima de Powerfeed" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Utilización máxima predeterminada de las fuentes de alimentación" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Esquemas de URL permitidos" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" "Esquemas permitidos para las URL en el contenido proporcionado por el " "usuario" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Tamaño de página predeterminado" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Tamaño máximo de página" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Validadores personalizados" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Reglas de validación personalizadas (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Normas de protección" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Reglas de protección contra eliminaciones (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Preferencias predeterminadas" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Preferencias predeterminadas para usuarios nuevos" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Modo de mantenimiento" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Habilitar el modo de mantenimiento" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL habilitado" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Habilita la API de GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Retención del registro de cambios" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Días para conservar el historial de cambios (se establece en cero de forma " "ilimitada)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Retención de resultados laborales" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Días para conservar el historial de resultados del trabajo (establecido en " "cero para un número ilimitado)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL de mapas" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "URL base para mapear ubicaciones geográficas" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Coincidencia parcial" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Coincidencia exacta" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Empieza con" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Termina con" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Tipo(s) de objeto(s)" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Búsqueda" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10284,411 +10947,426 @@ msgstr "" "Etiquete las babosas separadas por comas y entre comillas dobles (por " "ejemplo, «tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Añadir etiquetas" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Eliminar etiquetas" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} debe especificar una clase modelo." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Nombre de campo desconocido '{name}'en datos de campo personalizados." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Valor no válido para el campo personalizado '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Campo personalizado '{name}'debe tener un valor único." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Falta el campo personalizado obligatorio '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Fuente de datos remota" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "ruta de datos" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Ruta al archivo remoto (relativa a la raíz de la fuente de datos)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "sincronización automática habilitada" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Habilitar la sincronización automática de datos cuando se actualiza el " "archivo de datos" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "fecha sincronizada" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} debe implementar un método sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organización" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Grupos de sitios" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Grupos de inquilinos" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Grupos de contactos" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Funciones de contacto" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Asignaciones de contactos" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Roles de bastidor" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Elevaciones" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Tipos de estanterías" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Módulos" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Contextos de dispositivos virtuales" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "fabricantes" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Componentes del dispositivo" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Funciones de los artículos de inventario" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Conexiones" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Cables" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Vínculos inalámbricos" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Conexiones de interfaz" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Conexiones de consola" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Conexiones de alimentación" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Grupos de LAN inalámbrica" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Funciones de prefijo y VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Rangos de ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Grupos de VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Plantillas de servicio" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Servicios" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Túneles" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Grupos de túneles" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Terminaciones de túneles" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "VPNs L2" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Terminaciones" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Propuestas IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Políticas de IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Propuestas de IPSec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Políticas IPSec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Perfiles IPSec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Discos virtuales" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Tipos de clústeres" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Grupos de clústeres" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Tipos de circuitos" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Grupos de circuitos" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Tareas grupales" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Terminaciones de circuitos" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Proveedores" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Cuentas de proveedores" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Redes de proveedores" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Paneles de alimentación" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Configuraciones" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Contextos de configuración" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Plantillas de configuración" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Personalización" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Campos personalizados" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Opciones de campo personalizadas" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Vínculos personalizados" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Plantillas de exportación" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Filtros guardados" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Adjuntos de imágenes" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operaciones" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integraciones" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Fuentes de datos" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Reglas del evento" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Trabajos" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Explotación" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Grupos de notificaciones" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Entradas del diario" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Registro de cambios" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Admin" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Tokens de API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Permisos" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Sistema" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plugins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Historial de configuración" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Tareas en segundo plano" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Los permisos se deben pasar en forma de tupla o lista." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Los botones se deben pasar como una tupla o una lista." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "El color del botón debe ser una opción dentro de ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10697,7 +11375,7 @@ msgstr "" "Clase PluginTemplateExtension {template_extension} ¡se aprobó como " "instancia!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10706,194 +11384,195 @@ msgstr "" "{template_extension} ¡no es una subclase de " "NetBox.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} debe ser una instancia de netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} debe ser una instancia de netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} debe ser una instancia de netbox.plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context debe ser un diccionario" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Navegación HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Habilitar la navegación dinámica por interfaz de usuario" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Función experimental" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Idioma" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Fuerza la traducción de la interfaz de usuario al idioma especificado" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "La compatibilidad con la traducción se ha desactivado localmente" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Longitud de página" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "El número predeterminado de objetos que se mostrarán por página" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Colocación del paginador" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Parte inferior" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Parte superior" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Ambos" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Dónde se mostrarán los controles del paginador en relación con una tabla" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Formato de datos" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "La sintaxis preferida para mostrar datos genéricos en la interfaz de usuario" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Tienda no válida: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "No se pueden agregar tiendas al registro después de la inicialización" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "No se pueden eliminar las tiendas del registro" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "checa" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "danés" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "alemán" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Inglés" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "española" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "francesa" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "italiano" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "japonés" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "holandesa" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "polaco" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "portugués" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "rusa" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "turca" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "ucraniana" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "chino" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Selecciona todo" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Alternar todo" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Alternar menú desplegable" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Error" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "No {model_name} encontrado" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Campo" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Valor" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Plugin ficticio" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10902,58 +11581,58 @@ msgstr "" "Se ha producido un error al procesar la plantilla de exportación " "seleccionada ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Fila {i}: Objeto con ID {id} no existe" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "No {object_type} fueron seleccionados." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Renombrado {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Eliminado {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Registro de cambios" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "diario" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "" "No se pueden sincronizar los datos: no hay ningún archivo de datos " "establecido." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Datos sincronizados para {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Sincronizado {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} debe implementar get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10961,706 +11640,748 @@ msgstr "" "Se ha producido un error al cargar la configuración del panel. Se está " "utilizando un panel predeterminado." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Acceso denegado" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "No tienes permiso para acceder a esta página" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "No se encontró la página" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "La página solicitada no existe" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Error de servidor" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Ha surgido un problema con tu solicitud. Póngase en contacto con un " "administrador" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "La excepción completa se proporciona a continuación" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Versión de Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Versión NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "No hay ninguno instalado" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Si necesita más ayuda, envíela por correo a" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Foro de discusión de NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "en GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Página de inicio" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Perfil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Notificaciones" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Suscripciones" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Preferencias" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Cambiar contraseña" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Cancelar" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Guardar" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Configuraciones de tablas" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Borrar preferencias de mesa" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Alternar todo" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tabla" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Pedido" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Columnas" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "No se encontró ninguno" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Perfil de usuario" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Detalles de la cuenta" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "Correo electrónico" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Cuenta creada" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Último inicio de sesión" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superusuario" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Personal" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Grupos asignados" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Ninguna" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Actividad reciente" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Mis fichas de API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Símbolo" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Escritura habilitada" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Utilizado por última vez" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Añadir un token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Inicio" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Motivo NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Logotipo de NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Documentos" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "API DE DESCANSO" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Documentación de la API REST" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "API de GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Soporte de NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Código fuente" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Comunidad" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Fecha de instalación" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Fecha de terminación" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Asignar grupo" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Intercambiar terminaciones de circuitos" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Cambie estas terminaciones por circuito %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Un lado" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Lado Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Asignar circuito" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Asignación de grupos de circuitos" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Agregar circuito" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Tipo de circuito" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Añadir" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Editar" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Intercambiar" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Marcado como conectado" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "a" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Rastrear" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Editar cable" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Quitar el cable" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Desconectar" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Conectar" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Río abajo" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Aguas arriba" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Conexión cruzada" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Panel de conexión/puerto" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Añadir circuito" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Cuenta de proveedor" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Datos de configuración" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Comentar" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Restaurar" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parámetro" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Valor actual" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nuevo valor" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Cambiado" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Tamaño" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Hash SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Sincronizar" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Última sincronización" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "No hay parámetros definidos" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Expedientes" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Elevaciones de estanterías" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Altura por defecto de la unidad" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Ancho de unidad predeterminado" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Fuentes de alimentación" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Tensión predeterminada" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Amperaje predeterminado" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Utilización máxima predeterminada" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Imponga la exclusividad global" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Recuento de paginaciones" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Tamaño máximo de página" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Preferencias de usuario" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Retención de empleo" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Trabajo" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Creado por" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Programación" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "cada %(interval)s minutos" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Cambiar" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Diferencia" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Anterior" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Próxima" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Objeto creado" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objeto eliminado" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Sin cambios" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Datos previos al cambio" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Advertencia: comparación del cambio no atómico con el registro de cambios " "anterior" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Datos posteriores al cambio" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Ver todos %(count)s Cambios" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Cambiar la retención de registros" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "días" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Indefinido" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "No instalado" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Visión general" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Instalar" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Detalles del plugin" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Resumen" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licencia" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Historial de versiones" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Instrucciones de instalación local" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Colas en segundo plano" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Configurar tabla" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Parar" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Rehacer cola" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Lista" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Fila" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Tiempo de espera" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Resultado TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumentos" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argumentos de palabras" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Depende de" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Excepción" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "tareas en " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Trabajos en cola" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11668,384 +12389,402 @@ msgstr "" "Seleccione todo %(count)s %(object_type_plural)s consulta " "coincidente" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Información del trabajador" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Trabajador" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Colas" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Empleo actual" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Recuento de trabajos exitoso" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Recuento de trabajos fallidos" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Tiempo total de trabajo" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "segundos" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Trabajadores en segundo plano" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Trabajadores en %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Exportación" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Estado del sistema" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Lanzamiento de NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Versión Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Versión PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Nombre de base de datos" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Tamaño de base de datos" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "No disponible" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Trabajadores de RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "cola predeterminada" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Hora del sistema" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Configuración actual" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" "¿Está seguro de que desea desconectarlos? %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Cable Trace para %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Descargar SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Ruta asimétrica" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Los nodos siguientes no tienen enlaces y dan como resultado una ruta " "asimétrica" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Ruta dividida" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Seleccione un nodo de los siguientes para continuar" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Rastreo completado" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Total de segmentos" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Longitud total" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "No se encontró ninguna ruta" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Rutas relacionadas" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Origen" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Destino" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmentos" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Incompleto" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Cambiar nombre seleccionado" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "No conectado" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Resalte el dispositivo en el estante" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "No está atormentado" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Coordenadas GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Mapa" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Etiqueta de activo" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Ver chasis virtual" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Crear VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Administración" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT para" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NATA" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Utilización de energía" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Entrada" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Puntos de venta" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Asignado" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Pierna" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Añadir un servicio" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Agregar componentes" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Agregar puertos de consola" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Agregar puertos de servidor de consola" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Agregar compartimentos de dispositivos" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Agregar puertos frontales" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Ocultar activado" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Ocultar desactivado" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Ocultar virtual" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Ocultar desconectado" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Agregar interfaces" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Añadir artículo de inventario" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Agregar compartimentos de módulos" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Añadir tomas de corriente" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Agregar puerto de alimentación" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Agregar puertos traseros" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Configuración" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Datos de contexto" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Configuración renderizada" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Descargar" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "No se encontró ninguna plantilla de configuración" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Bahía para padres" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Regenera a Slug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Eliminar" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Datos de contexto de configuración local" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Cambiar nombre" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Bahía de dispositivos" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Dispositivo instalado" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Eliminar %(device)s de %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12054,430 +12793,449 @@ msgstr "" "¿Estás seguro de que quieres eliminar? %(device)s de " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Poblar" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Bahía" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Agregar dispositivo" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Función de máquina virtual" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Nombre del modelo" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Número de pieza" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Excluir de la utilización" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Padre/hijo" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Imagen frontal" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Imagen trasera" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Posición del puerto trasero" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Marcado como conectado" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Estado de conexión" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Un lado" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Lado B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Sin rescisión" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Marcar como planificado" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Marcar como instalado" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Estado de la ruta" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "No accesible" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Puntos finales de ruta" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "No conectado" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Sin etiquetar" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "No hay VLAN asignadas" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Borrar" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Borrar todo" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Profundidad de montaje" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Unidad inicial" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Unidades descendentes" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Elevación del bastidor" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Agregar interfaz secundaria" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Velocidad/dúplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Modo PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Tipo de PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Modo 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "Dirección MAC" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Enlace inalámbrico" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Par" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Canal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Frecuencia de canal" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "megahercio" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Ancho de canal" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Miembros del LAG" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Sin interfaces de miembros" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Agregar dirección IP" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Artículo principal" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "ID de pieza" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Agregar ubicación infantil" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Ubicaciones para niños" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Agregar una ubicación" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Agregar un dispositivo" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Agregar tipo de dispositivo" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Agregar tipo de módulo" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Dispositivo conectado" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Utilización (asignada)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Características eléctricas" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "UN" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Pierna de alimentación" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Añadir fuentes de alimentación" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Sorteo máximo" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Sorteo asignado" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Utilización del espacio" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Peso del estante" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Peso máximo" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Peso total" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Imágenes y etiquetas" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Solo imágenes" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Solo etiquetas" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Añadir reserva" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Ver lista" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Seleccione la vista de estantería" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Ordenar por" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "No se encontró ningún estante" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Ver elevaciones" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Detalles de la reserva" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Añadir estante" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Posiciones" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Agregar sitio" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Regiones infantiles" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Agregar región" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Zona horaria" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Hora del sitio" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Dirección física" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Dirección de envío" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Grupos de niños" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Agregar grupo de sitios" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Fijación" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Agregar miembro" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Dispositivos de los miembros" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Agregar un nuevo miembro al chasis virtual %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Agregar nuevo miembro" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Acciones" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Guardar y añadir otro" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Edición de chasis virtuales %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Bastidor/unidad" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Eliminar miembro del chasis virtual" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12486,11 +13244,12 @@ msgstr "" "¿Estás seguro de que quieres eliminar? %(device)s desde un " "chasis virtual %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identificador" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12498,11 +13257,11 @@ msgstr "" "Se ha producido un error de importación del módulo durante esta solicitud. " "Entre las causas más frecuentes se incluyen las siguientes:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Faltan paquetes requeridos" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12519,11 +13278,11 @@ msgstr "" "congelada desde la consola y compare el resultado con la lista de " "paquetes necesarios." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "El servicio WSGI no se reinicia después de la actualización" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12533,7 +13292,7 @@ msgstr "" "WSGI (por ejemplo, gunicorn o uWSGI) se haya reiniciado. Esto garantiza que " "el nuevo código se esté ejecutando." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12541,11 +13300,11 @@ msgstr "" "Se detectó un error de permisos de archivos al procesar esta solicitud. " "Entre las causas más frecuentes se incluyen las siguientes:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Permisos de escritura insuficientes en la raíz multimedia" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12556,7 +13315,7 @@ msgstr "" "que el usuario NetBox se ejecute con acceso para escribir archivos en todas " "las ubicaciones de esta ruta." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12564,11 +13323,11 @@ msgstr "" "Se detectó un error de programación de la base de datos al procesar esta " "solicitud. Entre las causas más frecuentes se incluyen las siguientes:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Faltan migraciones de bases de datos" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12579,11 +13338,11 @@ msgstr "" "Puede ejecutar las migraciones manualmente mediante la ejecución " "python3 manage.py migre desde la línea de comandos." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Versión de PostgreSQL no compatible" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12593,99 +13352,102 @@ msgstr "" "comprobarlo, conéctese a la base de datos utilizando las credenciales de " "NetBox y emitiendo una consulta para SELECCIONE LA VERSIÓN ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Se ha eliminado el archivo de datos asociado a este objeto" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Datos sincronizados" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Sincronizar datos" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Parámetros del entorno" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "plantilla" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Nombre del grupo" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Debe ser único" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Clonable" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Valor predeterminado" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Peso de búsqueda" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Lógica de filtros" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Peso de la pantalla" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Interfaz de usuario visible" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Interfaz de usuario editable" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Reglas de validación" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Expresión regular" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Clase de botones" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Modelos asignados" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Texto del enlace" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL del enlace" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Restablecer panel" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12693,7 +13455,7 @@ msgstr "" "Esto eliminará todo configuró los widgets y restauró la " "configuración predeterminada del panel de control." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12701,160 +13463,162 @@ msgstr "" "Este cambio solo afecta vuestro panel de control, y no afectará a " "otros usuarios." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "configuración de widgets" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Cerrar widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Añadir un widget" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Aún no se ha añadido ningún marcador." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Sin permiso" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Sin permiso para ver este contenido" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "No se puede cargar el contenido. Nombre de vista no válido" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "No se ha encontrado contenido" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Se ha producido un problema al obtener la fuente RSS" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Condiciones" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Tipo MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Extensión de archivo" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Programado para" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Duración" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Resumen de la prueba" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Registro" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Salida" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Cargando" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Resultados pendientes" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Entrada de diario" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Grupo de notificaciones" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "No se ha asignado ninguno" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "" "El contexto de configuración local sobrescribe todos los contextos fuente" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Contextos de origen" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nueva entrada de diario" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Informe" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "No tiene permiso para ejecutar scripts" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Ejecutar script" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Error al cargar el script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "El script ya no existe en el archivo fuente." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Última ejecución" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "La secuencia de comandos ya no está presente en el archivo fuente" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Nunca" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Corre otra vez" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "No se encontró ningún script" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12863,81 +13627,83 @@ msgstr "" "Comience por crear un guion desde un " "archivo o fuente de datos cargados." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Resultados" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Umbral de registro" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Todas" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Artículos etiquetados" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Tipos de objetos permitidos" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Cualquier" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Tipos de artículos etiquetados" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Objetos etiquetados" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Método HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Tipo de contenido HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Verificación SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Encabezados adicionales" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Plantilla corporal" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Creación masiva" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Objetos seleccionados" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "añadir" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Eliminación masiva" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Confirme la eliminación masiva" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12947,66 +13713,69 @@ msgstr "" "La siguiente operación eliminará %(count)s %(type_plural)s." " Revise cuidadosamente los objetos seleccionados y confirme esta acción." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Edición" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Edición masiva" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Aplica" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Importación masiva" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Importación directa" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Cargar archivo" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Enviar" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Opciones de campo" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Accesor" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "opciones" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Valor de importación" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Formato: AAAA-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Especifique verdadero o falso" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Campos obligatorios mosto especificarse para todos los " "objetos." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -13016,15 +13785,15 @@ msgstr "" "atributo único. Por ejemplo, %(example)s identificaría un VRF " "por su identificador de ruta." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Eliminación masiva" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Confirme la eliminación masiva" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13035,72 +13804,72 @@ msgstr "" "%(parent_obj)s. Por favor, revise detenidamente el %(obj_type_plural)s para " "eliminarlo y confirmarlo a continuación." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Elimine estos %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Cambiar el nombre" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Cambio de nombre masivo" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Nombre actual" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nombre nuevo" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Vista previa" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "¿Estás seguro" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Confirmar" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Editar seleccionado" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Eliminar seleccionado" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Añadir una nueva %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Ver la documentación del modelo" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Ayuda" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Crear y agregar otro" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtros" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13109,40 +13878,40 @@ msgstr "" "Seleccione todo %(count)s " "%(object_type_plural)s consulta coincidente" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nueva versión disponible" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "está disponible" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Instrucciones de actualización" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Desbloquear panel" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Panel de control de bloqueo" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Agregar widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Guardar diseño" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Confirme la eliminación" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13151,40 +13920,40 @@ msgstr "" "¿Estás seguro de que quieres eliminar" " %(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Como resultado de esta acción, se eliminarán los siguientes objetos." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "hace" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "No hay notificaciones sin leer" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Todas las notificaciones" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Seleccione" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Restablecer" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Activar el modo oscuro" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Activar el modo de luz" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13193,281 +13962,283 @@ msgstr "" "Antes de poder añadir un %(model)s primero debes crear un " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Selección de páginas" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Mostrando %(start)s-%(end)s de %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Opciones de paginación" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Por página" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Adjunta una imagen" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Objetos relacionados" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "No hay etiquetas asignadas" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Los datos no están sincronizados con el archivo anterior" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Búsqueda rápida" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Filtro guardado" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Pedido claro" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centro de ayuda" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Administrador de Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Cerrar sesión" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Iniciar sesión" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Familia" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Fecha añadida" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Agregar prefijo" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Número AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Tipo de autenticación" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Clave de autenticación" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Direcciones IP virtuales" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Asignar IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Creación masiva" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Crear grupo" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "IP virtuales" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Mostrar asignado" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Mostrar disponible" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Mostrar todo" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Global" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (exterior)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Asignar una dirección IP" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Seleccione la dirección IP" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Resultados de la búsqueda" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Agregar direcciones IP de forma masiva" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Dirección inicial" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Dirección final" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Marcado como totalmente utilizado" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Detalles de direccionamiento" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "IP para niños" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "IPs disponibles" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Primera IP disponible" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Detalles del prefijo" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Dirección de red" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Máscara de red" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Máscara Wildcard" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Dirección de transmisión" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Agregar rango de IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Ocultar indicadores de profundidad" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Profundidad máxima" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Longitud máxima" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Agregar agregado" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importación de VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Exportación de VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Importación de VPNs L2" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Exportación de VPNs L2" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Agregar un prefijo" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Agregar VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Distinguidor de rutas" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Espacio IP único" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Errores" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Iniciar sesión" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "O" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Fallo de medios estáticos - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Fallo de medios estáticos" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "No se pudo cargar el siguiente archivo multimedia estático" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Compruebe lo siguiente" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13477,7 +14248,7 @@ msgstr "" " más reciente. Esto instala la iteración más reciente de cada archivo " "estático en la ruta raíz estática." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13489,7 +14260,7 @@ msgstr "" "href=\"%(docs_url)s\">la documentación de instalación para obtener más " "información." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13498,548 +14269,571 @@ msgstr "" "El archivo %(filename)s existe en el directorio raíz estático y" " el servidor HTTP lo puede leer." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Haga clic aquí para intentar cargar NetBox de " "nuevo." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Contacto" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Título" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Teléfono" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Grupo de contacto" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Agregar grupo de contactos" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Función de contacto" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Añadir un contacto" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Agregar inquilino" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Grupo de inquilinos" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Agregar grupo de inquilinos" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Permisos asignados" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Permiso" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Ver" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Restricciones" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Usuarios asignados" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Recursos asignados" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "CPUs virtuales" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Memoria" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Espacio en disco" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Agregar máquina virtual" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Asignar dispositivo" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Eliminar seleccionado" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Agregar dispositivo al clúster %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Selección de dispositivos" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Agregar dispositivos" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Agregar clúster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Grupo de clústeres" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Tipo de clúster" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Disco virtual" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Recursos" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Agregar disco virtual" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Política de IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Versión IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Clave previamente compartida" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Mostrar secreto" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Propuestas" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Propuesta IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Método de autenticación" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Algoritmo de cifrado" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algoritmo de autenticación" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Grupo DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Una vida útil (segundos)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Política IPSec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Grupo PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Perfil IPSec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Grupo PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Propuesta de IPSec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Una vida útil (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "Atributos de L2VPN" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Agregar una terminación" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Agregar terminación" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Encapsulación" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Perfil IPSec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "ID de túnel" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Añadir túnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Grupo Tunnel" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Terminación del túnel" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "IP externa" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Terminaciones de pares" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Cifrar" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "megahercio" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Interfaces conectadas" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Agregar LAN inalámbrica" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Grupo de LAN inalámbrica" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Agregar grupo de LAN inalámbrica" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Propiedades del enlace" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Distancia" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Grupo de contacto de padres (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Grupo de contacto para padres (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Grupo de contactos (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Grupo de contacto (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Contacto (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Rol de contacto (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Rol de contacto (babosa)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Grupo de contactos" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Grupo de padres e inquilinos (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Grupo de padres e inquilinos (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Grupo de inquilinos (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Grupo de inquilinos (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Grupo de inquilinos (babosa)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Descripción" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Contacto asignado" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "grupo de contacto" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "grupos de contacto" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "rol de contacto" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "roles de contacto" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "título" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "llamar por teléfono" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "correo electrónico" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "eslabón" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "contacto" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "contactos" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "asignación de contactos" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "asignaciones de contactos" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "No se pueden asignar contactos a este tipo de objeto ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "grupo de inquilinos" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "grupos de inquilinos" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "El nombre del inquilino debe ser único por grupo." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "La babosa del inquilino debe ser única por grupo." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "inquilino" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "inquilinos" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Título del contacto" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Teléfono de contacto" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Correo electrónico de contacto" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Dirección de contacto" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Enlace de contacto" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Descripción del contacto" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Permiso (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Grupo de notificaciones (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Nombre de pila" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Apellido" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Situación del personal" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Estado de superusuario" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Si no se proporciona ninguna clave, se generará una automáticamente." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Es personal" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Es superusuario" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Puede ver" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Puede agregar" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Puede cambiar" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Puede eliminar" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Interfaz de usuario" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14049,7 +14843,7 @@ msgstr "" "su clave antes de enviar este formulario, ya que es posible que ya " "no se pueda acceder a él una vez que se haya creado el token." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14059,33 +14853,33 @@ msgstr "" "blanco para que no haya restricciones. Ejemplo: 10.1.1.0/24, " "192.168.10.16/32, 2001:db 8:1: :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Confirme la contraseña" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Introduce la misma contraseña que antes para verificarla." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "¡Las contraseñas no coinciden! Compruebe los datos introducidos e inténtelo " "de nuevo." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Acciones adicionales" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Acciones concedidas además de las enumeradas anteriormente" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objetos" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14096,80 +14890,80 @@ msgstr "" "este tipo. Una lista de varios objetos dará como resultado una operación OR " "lógica." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Debe seleccionarse al menos una acción." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Filtro no válido para {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "La lista de acciones concedidas por este permiso" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "restricciones" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtro Queryset que coincide con los objetos aplicables de los tipos " "seleccionados" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "permiso" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "permisos" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "preferencias de usuario" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Clave '{path}'es un nodo de hoja; no se pueden asignar claves nuevas" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Clave '{path}'es un diccionario; no puede asignar un valor que no sea de " "diccionario" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "caduca" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "utilizado por última vez" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "clave" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "escritura habilitada" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Permitir operaciones de creación/actualización/eliminación con esta clave" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "IP permitidas" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14178,43 +14972,43 @@ msgstr "" "blanco para que no haya restricciones. Por ejemplo: «10.1.1.0/24, " "192.168.10.16/32, 2001:DB 8:1: :/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "simbólico" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "fichas" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "grupo" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "usuario" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Ya existe un usuario con este nombre de usuario." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Acciones personalizadas" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "No se encontró el objeto relacionado con los atributos proporcionados: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Varios objetos coinciden con los atributos proporcionados: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14224,43 +15018,43 @@ msgstr "" "identificador numérico o un diccionario de atributos. Recibió un valor no " "reconocido: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "No se encontró el objeto relacionado con el identificador numérico " "proporcionado: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} tiene una clave definida, pero CHOICES no es una lista" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "El peso debe ser un número positivo" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Valor no válido '{weight}'para el peso (debe ser un número)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Unidad desconocida {unit}. Debe ser uno de los siguientes: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "La longitud debe ser un número positivo" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Valor no válido '{length}'para la longitud (debe ser un número)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14269,15 +15063,15 @@ msgstr "" "No se puede eliminar {objects}. {count} se encontraron " "objetos dependientes: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Más de 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Color RGB en hexadecimal. Ejemplo: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14286,7 +15080,7 @@ msgstr "" "%s(%r) no es válido. El parámetro to_model de CounterCacheField debe ser una" " cadena con el formato 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14295,39 +15089,39 @@ msgstr "" "%s(%r) no es válido. El parámetro to_field de CounterCacheField debe ser una" " cadena con el formato 'campo'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Introduzca los datos del objeto en formato CSV, JSON o YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Delimitador CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "El carácter que delimita los campos CSV. Se aplica solo al formato CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "Los datos del formulario deben estar vacíos al cargar o seleccionar un " "archivo." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Formato de datos desconocido: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "No se pudo detectar el formato de los datos. Especifique." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Delimitador CSV no válido" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14335,7 +15129,7 @@ msgstr "" "Datos YAML no válidos. Los datos deben estar en forma de varios documentos o" " de un solo documento que contenga una lista de diccionarios." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14344,7 +15138,7 @@ msgstr "" "Lista no válida ({value}). Debe ser numérico y los rangos deben estar en " "orden ascendente." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14352,7 +15146,7 @@ msgstr "" "Especifique uno o más rangos numéricos separados por comas. Ejemplo: " "1-5, 20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14360,17 +15154,18 @@ msgstr "" "Intervalos no válidos ({value}). Debe ser un rango de números enteros en " "orden ascendente." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Valor no válido para un campo de opción múltiple: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objeto no encontrado: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14379,20 +15174,20 @@ msgstr "" "«{value}\"no es un valor único para este campo; se han encontrado varios " "objetos" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "«{field_name}\"es un nombre de campo de acceso no válido." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "El tipo de objeto debe especificarse como».»" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Tipo de objeto no válido" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14402,7 +15197,7 @@ msgstr "" "admiten casos y tipos mixtos dentro de un único rango (por ejemplo: " "[Edad, sexo] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14410,7 +15205,7 @@ msgstr "" "Especifique un rango numérico para crear varias direcciones IP.
    Ejemplo: 192.0.2. [1,5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown se admite la sintaxis" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Abreviatura única compatible con URL" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Introduzca los datos de contexto en JSON " "formato." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "La dirección MAC debe estar en formato EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Usa expresiones regulares" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "ID numérico de un objeto existente que se va a actualizar (si no se está " "creando un objeto nuevo)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Encabezado no reconocido: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Columnas disponibles" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Columnas seleccionadas" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14465,13 +15260,13 @@ msgstr "" "Este objeto se ha modificado desde que se renderizó el formulario. Consulte " "el registro de cambios del objeto para obtener más información." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Gama»{value}«no es válido." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14480,72 +15275,72 @@ msgstr "" "Intervalo no válido: valor final ({end}) debe ser mayor que el valor inicial" " ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Cabecera de columna duplicada o conflictiva para»{field}»" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Cabecera de columna duplicada o conflictiva para»{header}»" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Fila {row}: Esperado {count_expected} columnas pero encontradas " "{count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Encabezado de columna inesperado»{field}«encontrado." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Columna»{field}\"no es un objeto relacionado; no puede usar puntos" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Atributo de objeto relacionado no válido para la columna»{field}«: " "{to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Encabezado de columna obligatorio»{header}«no se encontró." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Falta el valor requerido para el parámetro de consulta dinámica: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Falta el valor requerido para el parámetro de consulta estática: " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "La contraseña debe tener al menos un número." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "La contraseña debe tener al menos una letra mayúscula." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "La contraseña debe tener al menos una letra minúscula." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14553,7 +15348,7 @@ msgstr "" "La contraseña debe contener al menos un número, una letra mayúscula y una " "minúscula." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14562,126 +15357,126 @@ msgstr "" "Nombre de permiso no válido: {name}. Debe estar en el formato " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "App_label/model_name desconocido para {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Dirección IP no válida establecida para {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" "Una columna denominada {name} ya está definido para la tabla {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "No definido" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Desmarcar" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Marcador" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Clon" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Vista actual" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Todos los datos" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Añadir plantilla de exportación" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importar" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Cancelar suscripción" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Suscríbase" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Copiar al portapapeles" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Este campo es obligatorio" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Establecer nulo" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Borrar todo" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Configuración de tablas" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Muévete hacia arriba" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Muévete hacia abajo" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Buscar..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Buscar en NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Selector abierto" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Escribe" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "La prueba debe definir csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} no es una expresión regular válida." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__} debe implementar get_required_permission ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} debe implementar get_required_permission ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14691,61 +15486,63 @@ msgstr "" "ObjectPermissionRequiredMixin solo se puede usar en vistas que definan un " "conjunto de consultas base" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Grupo de padres (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Grupo de padres (babosas)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Tipo de clúster (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Clúster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "CPU virtuales" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Memoria (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Tipo de clúster" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Grupo de clústeres asignado" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Clúster asignado" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Dispositivo asignado dentro del clúster" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Número de serie" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14754,51 +15551,51 @@ msgstr "" "{device} pertenece a un sitio diferente ({device_site}) que el clúster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Si lo desea, puede anclar esta máquina virtual a un dispositivo host " "específico dentro del clúster" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Sitio/Clúster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "El tamaño del disco se administra mediante la conexión de discos virtuales." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disco" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "tipo de clúster" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "tipos de clústeres" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "grupo de clústeres" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "grupos de clústeres" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "racimo" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "racimos" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14807,42 +15604,42 @@ msgstr "" "{count} los dispositivos se asignan como hosts para este clúster, pero no " "están en el sitio {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "memoria (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disco (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "El nombre de la máquina virtual debe ser único por clúster." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "máquina virtual" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "máquinas virtuales" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Se debe asignar una máquina virtual a un sitio o clúster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "El clúster seleccionado ({cluster}) no está asignado a este sitio ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Debe especificar un clúster al asignar un dispositivo host." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14850,7 +15647,7 @@ msgstr "" "El dispositivo seleccionado ({device}) no está asignado a este clúster " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14859,19 +15656,19 @@ msgstr "" "El tamaño de disco especificado ({size}) debe coincidir con el tamaño " "agregado de los discos virtuales asignados ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" "Debe ser un IPv{family} dirección. ({ip} es un IPv{version} dirección.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "" "La dirección IP especificada ({ip}) no está asignado a esta máquina virtual." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14880,7 +15677,7 @@ msgstr "" "La interfaz principal seleccionada ({parent}) pertenece a una máquina " "virtual diferente ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14889,7 +15686,7 @@ msgstr "" "La interfaz de puente seleccionada ({bridge}) pertenece a una máquina " "virtual diferente ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14898,394 +15695,417 @@ msgstr "" "La VLAN sin etiquetar ({untagged_vlan}) debe pertenecer al mismo sitio que " "la máquina virtual principal de la interfaz o debe ser global." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "tamaño (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "disco virtual" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "discos virtuales" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Añadido {count} dispositivos para agrupar {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Eliminado {count} dispositivos del clúster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPSec - Transporte" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPSec - Túnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP en IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRIS" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Habló" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agresivo" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Principal" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Claves previamente compartidas" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certificados" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Firmas RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Firmas de la DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Grupo {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "LAN privada Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "LAN privada virtual Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Árbol privado de Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Árbol privado virtual de Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Grupo de túneles (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Grupo de túneles (babosas)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Perfil IPSec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Perfil IPSec (nombre)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Túnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Túnel (nombre)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "IP externa (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Política de IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Política IKE (nombre)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Política IPSec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Política IPSec (nombre)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "VPN L2 (babosa)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Interfaz VM (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (nombre)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Grupo de túneles" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Toda una vida" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Clave previamente compartida" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Política de IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Política IPSec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Encapsulación de túneles" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Función operativa" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Dispositivo principal de la interfaz asignada" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "VM principal de la interfaz asignada" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interfaz de dispositivo o máquina virtual" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Propuesta (s) de IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Grupo Diffie-Hellman para Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Propuestas de IPSec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protocolo IPSec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Tipo L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Dispositivo principal (para interfaz)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Máquina virtual principal (para interfaz)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Interfaz asignada (dispositivo o máquina virtual)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "No se pueden importar las terminaciones de la interfaz de máquina virtual y " "del dispositivo de forma simultánea." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Cada terminación debe especificar una interfaz o una VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "No se puede asignar una interfaz y una VLAN a la vez." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Versión IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Propuesta" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Tipo de objeto asignado" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Interfaz de túnel" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Primera rescisión" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Segunda terminación" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Este parámetro es obligatorio para definir una terminación." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Política" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Una terminación debe especificar una interfaz o VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Una terminación solo puede tener un objeto de terminación (una interfaz o " "VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "algoritmo de cifrado" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "algoritmo de autenticación" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ID de grupo Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Duración de la asociación de seguridad (en segundos)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Propuesta IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Propuestas de IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "versión" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "propuestas" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "clave previamente compartida" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Políticas de IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "El modo es necesario para la versión IKE seleccionada" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "El modo no se puede usar para la versión IKE seleccionada" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "cifrado" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "autenticación" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Duración de la asociación de seguridad (segundos)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Duración de la asociación de seguridad (en kilobytes)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Propuesta de IPSec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Propuestas de IPSec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Debe definirse un algoritmo de cifrado y/o autenticación" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Políticas IPSec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Perfiles IPSec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Terminación de L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Terminaciones de L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "La terminación de L2VPN ya está asignada ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15294,186 +16114,194 @@ msgstr "" "{l2vpn_type} Las VPN de nivel 2 no pueden tener más de dos terminaciones; se" " encuentran {terminations_count} ya definido." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "grupo de túneles" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "grupos de túneles" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "encapsulamiento" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ID de túnel" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "túnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "túneles" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Un objeto solo puede terminar en un túnel a la vez." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "terminación de túnel" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "terminaciones de túneles" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} ya está conectado a un túnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Método de autenticación" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Algoritmo de cifrado" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algoritmo de autenticación" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Toda una vida" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Clave previamente compartida" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Una vida útil (segundos)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA Lifetime (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Objeto principal" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Sitio del objeto" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Punto de acceso" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Estación" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Abrir" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "Empresa WPA" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Cifrado de autenticación" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Unidad de distancia" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "VLAN puenteada" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interfaz A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interfaz B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Lado B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "cifrado de autenticación" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "grupo LAN inalámbrico" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "grupos LAN inalámbricos" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "LAN inalámbrica" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interfaz A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interfaz B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "distancia" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "unidad de distancia" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "enlace inalámbrico" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "enlaces inalámbricos" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "Debe especificar una unidad al configurar una distancia inalámbrica" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} no es una interfaz inalámbrica." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Valor de canal no válido: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Atributo de canal no válido: {name}" diff --git a/netbox/translations/fr/LC_MESSAGES/django.mo b/netbox/translations/fr/LC_MESSAGES/django.mo index 4e3ff8a09766e66583d301dca5dac4754f5e43c7..b7f504a167594d61fe95511ea85dcb2c725429d6 100644 GIT binary patch delta 65982 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" msgstr "Valeur actuelle : {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (par défaut)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "temps" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "nom d'utilisateur" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "ID de demande" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "action" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "données de pré-modification" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "données après modification" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "changement d'objet" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "modifications d'objets" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "La journalisation des modifications n'est pas prise en charge pour ce type " "d'objet ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "créé" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "commentaire" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "données de configuration" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "révision de configuration" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "révisions de configuration" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Configuration par défaut" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Configuration actuelle" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Révision de configuration #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "type" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "activé" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignorer les règles" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Modèles (un par ligne) correspondant aux fichiers à ignorer lors de la " "synchronisation" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "paramètres" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "dernière synchronisation" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "source de données" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "sources de données" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Type de backend inconnu : {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "" "Impossible de lancer la synchronisation ; la synchronisation est déjà en " "cours." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1910,1224 +2176,1286 @@ msgstr "" "Une erreur s'est produite lors de l'initialisation du backend. Une " "dépendance doit être installée : " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "dernière mise à jour" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "chemin" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Chemin du fichier par rapport à la racine de la source de données" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "taille" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "hachage" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "La longueur doit être de 64 caractères hexadécimaux." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Hachage SHA256 des données du fichier" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "fichier de données" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "fichiers de données" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "enregistrement de synchronisation automatique" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "enregistrements de synchronisation automatique" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "racine du fichier" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "chemin du fichier" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Chemin du fichier par rapport au chemin racine désigné" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "fichier géré" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "fichiers gérés" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "prévu" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "intervalle" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Intervalle de récurrence (en minutes)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "commencé" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "terminé" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "données" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "erreur" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID de tâche" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "emploi" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "emplois" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Les tâches ne peuvent pas être attribuées à ce type d'objet ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Statut invalide pour l'arrêt de la tâche. Les choix sont les suivants : " "{choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () ne peut pas être appelée avec des valeurs à la fois pour " "schedule_at et immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "La suppression est empêchée par une règle de protection : {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Nom complet" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objet" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID de demande" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Est actif" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Sentier" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Dernière mise à jour" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "IDENTIFIANT" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervalle" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Version" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Dernière mise à jour" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Version minimale de NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Version maximale de NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Aucune donnée de plug-in trouvée" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Auteur" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Installé" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certifié" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Publié" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Version installée" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Dernière version" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "La tâche la plus ancienne" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Travailleurs" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Hôte" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Port" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "PID du planificateur" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Aucune file d'attente trouvée" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "En file d'attente" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Terminé" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Appelable" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Aucune tâche trouvée" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "État" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Naissance" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Aucun travailleur n'a été trouvé" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Tâche en file d'attente #{id} pour synchroniser {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Révision de configuration restaurée #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Poste {job_id} introuvable" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Poste {id} a été supprimé." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Erreur lors de la suppression du job {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Poste {id} introuvable." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Poste {id} a été replacé dans la file d'attente." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Poste {id} a été mis en file d'attente." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Poste {id} a été arrêté." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Impossible d'arrêter la tâche {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Le catalogue des plugins n'a pas pu être chargé" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plug-in {name} introuvable" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Position (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ID de l'établissement" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Mise en scène" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Démantèlement" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Supprimé" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Châssis à 2 montants" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Châssis à 4 montants" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Armoire à 4 montants" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Châssis mural" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Châssis mural (vertical)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Armoire murale" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Armoire murale (verticale)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} pouces" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Réservé" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Disponible" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Obsolète" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Millimètres" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Pouces" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "De l'avant vers l'arrière" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "De l'arrière vers l'avant" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Parent" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Enfant" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Avant" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Arrière" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Mis en scène" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventaire" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "De gauche à droite" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "De droite à gauche" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "D'un côté à l'arrière" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "De l'arrière vers le côté" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "De bas en haut" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "De haut en bas" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passif" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Mixte" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (non verrouillable)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (verrouillage)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Style californien" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "International/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Propriétaire" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Autres" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/International" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Physique" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuel" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Sans fil" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfaces virtuelles" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Passerelle" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Groupe d'agrégation de liens (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fixe)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulaire)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (panneau arrière)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Cellulaire" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Série" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Coaxiale" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Empilage" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "La moitié" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Complet" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Automatique" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Accès" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Tagué" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Tagué (Tous)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Norme IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "24 V passif (2 paires)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "24 V passif (4 paires)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "48 V passif (2 paires)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "48 V passif (4 paires)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Cuivre" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "fibre optique" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fibre" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Connecté" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilomètres" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Compteurs" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimètres" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Miles" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Pieds" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogrammes" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Grammes" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Livres" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Onces" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redondant" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Monophasé" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Triphasé" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Format d'adresse MAC non valide : {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Format WWN non valide : {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Région parente (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Région parente (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Groupe de sites parent (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Groupe de sites parents (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Groupe (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Groupe (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "COMME (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Lieu de résidence du parent (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Localisation du parent (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Lieu (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Emplacement (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Fabricant (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Fabricant (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Type de rack (limace)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Type de rack (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rôle (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rôle (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Baie (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Utilisateur (nom)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Plateforme par défaut (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Plateforme par défaut (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Possède une image frontale" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Possède une image arrière" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Possède des ports de console" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Possède des ports de serveur de console" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Possède des ports d'alimentation" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Dispose de prises de courant" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Possède des interfaces" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Possède des ports d'intercommunication" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Dispose de baies pour modules" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Dispose de baies pour appareils" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Possède des articles en inventaire" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Type d'appareil (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Type de module (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Port d'alimentation (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Article d'inventaire parent (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Modèle de configuration (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Type d'appareil (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Appareil parent (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Plateforme (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Plateforme (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Nom du site (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Enfant parent (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Cluster de machines virtuelles (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Groupe de clusters (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Groupe de clusters (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Modèle d'appareil (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Est en pleine profondeur" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "Adresse MAC" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Possède une adresse IP principale" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Possède une adresse IP hors bande" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Châssis virtuel (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Est un membre virtuel du châssis" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "ASTUCE SUR L'EMPLOI (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Possède un contexte de périphérique virtuel" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (IDENTIFIANT)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Modèle d'appareil" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interface (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Type de module (modèle)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Baie modulaire (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Appareil (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Baie (nom)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Appareil (nom)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Type d'appareil (modèle)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Rôle de l'appareil (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Rôle de l'appareil (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Châssis virtuel (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Châssis virtuel" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Module (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Câble (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "VLAN attribué" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "VID attribué" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (IDENTIFIANT)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Interfaces de châssis virtuelles pour appareils" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Interfaces de châssis virtuel pour le périphérique (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Type d'interface" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Interface parent (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Interface pontée (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Interface LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Contexte du périphérique virtuel" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Contexte du périphérique virtuel (identifiant)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "LAN sans fil" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Liaison sans fil" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Baie du module parent (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Module installé (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Appareil installé (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Appareil installé (nom)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Maître (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (nom)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Locataire (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Locataire (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Non terminé" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Panneau d'alimentation (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Balises" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Position" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3135,843 +3463,923 @@ msgstr "" "Les plages alphanumériques sont prises en charge. (Doit correspondre au " "nombre de noms en cours de création.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Nom du contact" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Téléphone de contact" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Adresse électronique de contact" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Fuseau horaire" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Fabricant" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Facteur de forme" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Largeur" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Hauteur (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Unités décroissantes" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Largeur extérieure" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Profondeur extérieure" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Unité extérieure" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Profondeur de montage" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Poids" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Poids maximum" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Unité de poids" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Type de rack" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dimensions extérieures" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensions" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numérotation" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rôle" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Type de baie" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Numéro de série" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Étiquette d'actif" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Débit d'air" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Baie" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Matériel" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Plateforme par défaut" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Numéro de pièce" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Hauteur en U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Exclure de l'utilisation" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Type d'appareil" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Type de module" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Châssis" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "rôle de machine virtuelle" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Modèle de configuration" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Type d'appareil" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Rôle de l'appareil" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Plateforme" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Cluster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Appareil" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configuration" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualisation" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Type de module" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Libellé" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Longueur" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Unité de longueur" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Domaine" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "panneau d'alimentation" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Approvisionnement" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Phase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "tension" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Ampérage" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Utilisation maximale" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Tirage maximum" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Consommation électrique maximale (watts)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Tirage au sort attribué" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Consommation électrique allouée (watts)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "port d'alimentation" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Patte d'alimentation" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Gestion uniquement" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Mode PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Type PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Rôle sans fil" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modules" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "DÉCALAGE" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Contextes des appareils virtuels" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Vitesse" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Mode" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "groupe VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN non balisé" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLAN balisés" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Groupe LAN sans fil" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Réseaux locaux sans fil" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adressage" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Fonctionnement" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Interfaces associées" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Commutation 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Le mode d'interface doit être spécifié pour attribuer des VLAN" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" "Des tags de VLAN ne peuvent pas être associés à une interface d'accès." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Nom de la région mère" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Nom du groupe de sites parent" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Région associé" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Groupe associé" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "options disponibles" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Site associé" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Emplacement du parent" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Emplacement introuvable." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Le fabricant de ce type de rack" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "La position la plus basse du rack" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Largeur rail à rail (en pouces)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Unité pour les dimensions extérieures" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Unité poids de la baie" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Nom du locataire associé" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Nom du rôle attribué" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Direction du flux d'air" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Site parent" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Emplacement de la baie (le cas échéant)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Unités" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Liste de numéros d'unités individuels séparés par des virgules" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Le fabricant qui produit ce type d'appareil" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Plateforme par défaut pour les appareils de ce type (facultatif)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Poids de l'appareil" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Unité de poids de l'appareil" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Poids du module" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Unité pour le poids du module" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Limiter les affectations de plateforme à ce fabricant" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Rôle attribué" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Fabricant du type d'appareil" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Type d'appareil et modèle" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Plateforme attribuée" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Châssis virtuel" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Cluster de virtualisation" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Emplacement attribué (le cas échéant)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Baie attribuée (le cas échéant)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Visage" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Face montée en baie" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Appareil parent (pour les appareils pour enfants)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Baie pour appareils" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Baie d'appareils dans laquelle cet appareil est installé (pour les appareils" " pour enfants)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "L'appareil sur lequel ce module est installé" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Baie modulaire" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "La baie du module dans laquelle ce module est installé" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Le type de module" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Répliquer les composants" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3979,263 +4387,270 @@ msgstr "" "Remplir automatiquement les composants associés à ce type de module (activé " "par défaut)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Adoptez des composants" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Adoptez des composants déjà existants" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Type de port" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Vitesse du port en bits/s" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Type de prise" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Port d'alimentation local qui alimente cette prise" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Phase électrique (pour circuits triphasés)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interface pour les parents" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Interface pontée" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Retard" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Interface LAG parent" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "VDC" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Noms de VDC séparés par des virgules, entre guillemets doubles. Exemple :" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Support physique" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Duplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Mode PoE" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Type de poteau" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Mode de fonctionnement IEEE 802.1Q (pour interfaces L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "VRF attribué" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rôle RF" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Rôle sans fil (AP/station)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} n'est pas attribué à l'appareil {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Port arrière" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Port arrière correspondant" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Classification des supports physiques" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Appareil installé" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Appareil pour enfant installé dans cette baie" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Appareil pour enfant introuvable." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Article d'inventaire parent" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Type de composant" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Type de composant" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Nom du composant" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Nom du composant" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Composant introuvable : {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Appareil côté A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Nom de l'appareil" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Côté A type" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Type de terminaison" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Nom de la face A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Nom de terminaison" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Appareil Side B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Type de face B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Nom de la face B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "État de la connexion" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Côté {side_upper}: {device} {termination_object} est déjà connecté" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} terminaison latérale introuvable : {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Maître" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Appareil principal" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Nom du site parent" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Panneau d'alimentation en amont" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Principal ou redondant" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Type d'alimentation (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Monophasé ou triphasé" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "IPv4 principal" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Adresse IPv4 avec masque, par exemple 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "IPv6 principal" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Adresse IPv6 avec longueur de préfixe, par exemple 2001:db8 : :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4244,7 +4659,7 @@ msgstr "" "Les VLAN balisés ({vlans}) doivent appartenir au même site que l'appareil/la" " machine virtuelle parent de l'interface, ou ils doivent être globaux" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4252,7 +4667,7 @@ msgstr "" "Impossible d'installer le module avec des valeurs d'espace réservé dans une " "baie de modules dont aucune position n'est définie." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4262,189 +4677,200 @@ msgstr "" "arborescence de modules {level} dans un arbre mais {tokens} espaces réservés" " donnés." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" "Impossible d'adopter {model} {name} car il appartient déjà à un module" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "UN {model} nommé {name} existe déjà" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Panneau d'alimentation" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Alimentation" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Côté" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "État de l'appareil" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Région parente" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Groupe de parents" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Datacentre" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Type de baie" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Fonction" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Des images" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Composantes" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Rôle du sous-appareil" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modèle" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Possède une adresse IP OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Membre virtuel du châssis" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Possède des contextes de périphériques virtuels" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Groupe de clusters" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "câblé" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Occupé" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Connexion" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Type" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Gestion uniquement" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Canal sans fil" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Fréquence du canal (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Largeur du canal (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Puissance de transmission (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "câble" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Découvert" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Un élément de châssis virtuel existe déjà en place {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Informations de contact" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Role de la baie" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Identifiant" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Sélectionnez un type de rack prédéfini ou définissez les caractéristiques " "physiques ci-dessous." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Contrôle des stocks" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4452,145 +4878,172 @@ msgstr "" "Liste d'identifiants d'unités numériques séparés par des virgules. Une plage" " peut être spécifiée à l'aide d'un trait d'union." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Réservation" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Rôle de l'appareil" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "L'unité la moins numérotée occupée par l'appareil" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "La position dans le châssis virtuel par laquelle cet appareil est identifié" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "La priorité de l'appareil dans le châssis virtuel" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Remplir automatiquement les composants associés à ce type de module" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Caractéristiques" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Modèle de port de console" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Modèle de port de serveur de console" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Modèle de port avant" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Modèle d'interface" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Modèle de prise de courant" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Modèle de port d'alimentation" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Modèle de port arrière" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interface" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Port de console" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Port du serveur de consoles" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Port avant" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Port arrière" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Port d'alimentation" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Prise de courant" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Affectation des composants" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Un item d'inventaire ne peut être attribué qu'à un seul composant." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Interface LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtrez les VLAN disponibles pour une attribution par groupe." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Appareil pour enfants" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4598,32 +5051,35 @@ msgstr "" "Les appareils enfants doivent d'abord être créés et affectés au site et à la" " baie de l'appareil parent." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Port de console" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Port du serveur de console" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Port avant" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "prise de courant" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Article d'inventaire" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Rôle de l'article d'inventaire" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4631,7 +5087,7 @@ msgstr "" "Les plages alphanumériques sont prises en charge. (Doit correspondre au " "nombre d'objets en cours de création.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4640,16 +5096,17 @@ msgstr "" "Le modèle fourni spécifie {value_count} des valeurs, mais {pattern_count} " "sont attendus." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Ports arrière" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "Associer un port arrière à chaque port avant en cours de création." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4659,16 +5116,7 @@ msgstr "" "correspondre au nombre sélectionné de positions des ports arrière " "({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"La chaîne {module} sera remplacée par la position du module " -"attribué si nécessaire." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4677,17 +5125,18 @@ msgstr "" "Le nombre de ports frontaux à créer ({frontport_count}) doit correspondre au" " nombre sélectionné de positions des ports arrière ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Membres" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Position initiale" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4695,70 +5144,72 @@ msgstr "" "Position du premier dispositif membre. Augmente d'une unité pour chaque " "membre supplémentaire." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Une position doit être spécifiée pour le premier membre du VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "étiquette" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "longueur" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "unité de longueur" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "câble" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "câbles" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "" "Vous devez spécifier une unité lors du réglage de la longueur du câble" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" "Vous devez définir les terminaisons A et B lors de la création d'un nouveau " "câble." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Impossible de connecter différents types de terminaisons à la même extrémité" " du câble." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Types de terminaison incompatibles : {type_a} et {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Les terminaisons A et B ne peuvent pas se connecter au même objet." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "fin" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "terminaison de câble" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "terminaisons de câble" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4767,38 +5218,38 @@ msgstr "" "Un doublon de terminaison a été trouvé pour {app_label}.{model} " "{termination_id}: câble {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Les câbles ne peuvent pas être raccordés à {type_display} interfaces" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Les terminaisons de circuit connectées au réseau d'un fournisseur peuvent ne" " pas être câblées." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "est actif" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "est terminé" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "est divisé" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "chemin de câble" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "chemins de câbles" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4807,18 +5258,18 @@ msgstr "" "{module} est accepté en remplacement de la position de la baie du module " "lorsqu'il est fixé à un type de module." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Etiquette physique" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Les modèles de composants ne peuvent pas être déplacés vers un autre type " "d'appareil." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4826,7 +5277,7 @@ msgstr "" "Un modèle de composant ne peut pas être associé à la fois à un type " "d'appareil et à un type de module." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4834,137 +5285,137 @@ msgstr "" "Un modèle de composant doit être associé à un type d'appareil ou à un type " "de module." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "modèle de port de console" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "modèles de ports de console" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "modèle de port de serveur de console" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "modèles de ports de serveur de console" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "tirage maximum" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "tirage au sort alloué" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "modèle de port d'alimentation" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "modèles de ports d'alimentation" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Le tirage alloué ne peut pas dépasser le tirage maximum ({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "patte d'alimentation" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Phase (pour les alimentations triphasées)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "modèle de prise de courant" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "modèles de prises de courant" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Port d'alimentation parent ({power_port}) doit appartenir au même type " "d'appareil" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Port d'alimentation parent ({power_port}) doit appartenir au même type de " "module" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "gestion uniquement" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "interface de pont" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "rôle sans fil" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "modèle d'interface" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "modèles d'interface" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Une interface ne peut pas être reliée à elle-même." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Interface de pont ({bridge}) doit appartenir au même type d'appareil" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Interface de pont ({bridge}) doit appartenir au même type de module" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "position du port arrière" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "modèle de port avant" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "modèles de port avant" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Port arrière ({name}) doit appartenir au même type d'appareil" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4973,47 +5424,47 @@ msgstr "" "Position du port arrière non valide ({position}) ; port arrière {name} n'a " "que {count} positions" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "positions" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "modèle de port arrière" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "modèles de port arrière" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "position" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identifiant à référencer lors du changement de nom des composants installés" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "modèle de baie modulaire" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "modèles de baies de modules" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "modèle de baie pour appareils" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "modèles de baies d'appareils" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5022,206 +5473,211 @@ msgstr "" "Rôle du sous-appareil du type d'appareil ({device_type}) doit être défini " "sur « parent » pour autoriser les baies de périphériques." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID de pièce" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identifiant de pièce attribué par le fabricant" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "modèle d'article d'inventaire" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "modèles d'articles d'inventaire" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Les composants ne peuvent pas être déplacés vers un autre appareil." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "extrémité du câble" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "marque connectée" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Traitez comme si un câble était connecté" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" "Doit spécifier l'extrémité du câble (A ou B) lors de la fixation d'un câble." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "L'extrémité du câble ne doit pas être réglée sans câble." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Impossible de marquer comme connecté avec un câble branché." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} les modèles doivent déclarer une propriété parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Type de port physique" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "vitesse" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Vitesse du port en bits par seconde" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "port de console" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "ports de console" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "port du serveur de console" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "ports du serveur de console" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "port d'alimentation" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "ports d'alimentation" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "prise de courant" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "prises de courant" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Port d'alimentation parent ({power_port}) doit appartenir au même appareil" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "mode" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Stratégie de marquage IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "interface parente" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "GAL parent" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Cette interface est utilisée uniquement pour la gestion hors bande" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "vitesse (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "duplex" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "Nom mondial 64 bits" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "canal sans fil" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "fréquence du canal (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Rempli par la chaîne sélectionnée (si définie)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "puissance de transmission (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "réseaux locaux sans fil" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN non balisé" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLAN étiquetés" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interface" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfaces" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "" "{display_type} les interfaces ne peuvent pas être connectées à un câble." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" "{display_type} les interfaces ne peuvent pas être marquées comme connectées." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Une interface ne peut pas être son propre parent." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Seules les interfaces virtuelles peuvent être attribuées à une interface " "parent." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5230,7 +5686,7 @@ msgstr "" "L'interface parent sélectionnée ({interface}) appartient à un autre appareil" " ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5239,7 +5695,7 @@ msgstr "" "L'interface parent sélectionnée ({interface}) appartient à {device}, qui ne " "fait pas partie du châssis virtuel {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5248,7 +5704,7 @@ msgstr "" "L'interface de pont sélectionnée ({bridge}) appartient à un autre appareil " "({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5257,16 +5713,16 @@ msgstr "" "L'interface de pont sélectionnée ({interface}) appartient à {device}, qui ne" " fait pas partie du châssis virtuel {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" "Les interfaces virtuelles ne peuvent pas avoir d'interface LAG parente." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Une interface LAG ne peut pas être son propre parent." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5274,7 +5730,7 @@ msgstr "" "L'interface LAG sélectionnée ({lag}) appartient à un autre appareil " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5283,48 +5739,48 @@ msgstr "" "L'interface LAG sélectionnée ({lag}) appartient à {device}, qui ne fait pas " "partie du châssis virtuel {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Les interfaces virtuelles ne peuvent pas avoir de mode PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Les interfaces virtuelles ne peuvent pas avoir de type PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Doit spécifier le mode PoE lors de la désignation d'un type de PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "Le rôle sans fil ne peut être défini que sur les interfaces sans fil." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Le canal ne peut être défini que sur les interfaces sans fil." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "La fréquence des canaux ne peut être réglée que sur les interfaces sans fil." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "Impossible de spécifier une fréquence personnalisée avec le canal " "sélectionné." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "La largeur de canal ne peut être réglée que sur les interfaces sans fil." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Impossible de spécifier une largeur personnalisée avec le canal sélectionné." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5333,24 +5789,24 @@ msgstr "" "Le VLAN non balisé ({untagged_vlan}) doit appartenir au même site que " "l'appareil parent de l'interface, ou il doit être global." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Position cartographiée sur le port arrière correspondant" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "port avant" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "ports avant" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Port arrière ({rear_port}) doit appartenir au même appareil" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5359,19 +5815,19 @@ msgstr "" "Position du port arrière non valide ({rear_port_position}) : Port arrière " "{name} n'a que {positions} positions." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Nombre de ports frontaux pouvant être mappés" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "port arrière" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "ports arrière" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5380,39 +5836,40 @@ msgstr "" "Le nombre de positions ne peut pas être inférieur au nombre de ports " "frontaux mappés ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "baie modulaire" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "baies de modules" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Une baie de modules ne peut pas appartenir à un module qui y est installé." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "baie pour appareils" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "baies pour appareils" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Ce type d'appareil ({device_type}) ne prend pas en charge les baies pour " "appareils." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Impossible d'installer un appareil sur lui-même." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5420,114 +5877,116 @@ msgstr "" "Impossible d'installer le périphérique spécifié ; le périphérique est déjà " "installé dans {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "rôle des articles d'inventaire" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "rôles des articles d'inventaire" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "numéro de série" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "étiquette d'actif" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Une étiquette unique utilisée pour identifier cet article" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "découvert" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Cet objet a été découvert automatiquement" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "article d'inventaire" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "articles d'inventaire" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Impossible de s'attribuer le statut de parent." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "L'article d'inventaire parent n'appartient pas au même appareil." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Impossible de déplacer un article en stock avec des enfants à charge" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Impossible d'attribuer un article d'inventaire à un composant sur un autre " "appareil" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "fabricant" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "fabricants" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "modèle" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "plateforme par défaut" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "numéro de pièce" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Numéro de pièce discret (facultatif)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "hauteur (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "exclure de l'utilisation" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Les appareils de ce type sont exclus du calcul de l'utilisation des baies." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "est en pleine profondeur" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "L'appareil consomme à la fois les faces avant et arrière de la baie." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "statut parent/enfant" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5536,24 +5995,24 @@ msgstr "" "pour appareils. Laissez ce champ vide si ce type d'appareil n'est ni un " "parent ni un enfant." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "débit d'air" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "type d'appareil" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "types d'appareils" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "La hauteur en U doit être exprimée par incréments de 0,5 unité baie." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5562,7 +6021,7 @@ msgstr "" "Appareil {device} en baie {rack} ne dispose pas de suffisamment d'espace " "pour accueillir une hauteur de {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5572,7 +6031,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} les instances déjà monté dans des" " baies." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5580,156 +6039,156 @@ msgstr "" "Vous devez supprimer tous les modèles de baies d'appareils associés à cet " "appareil avant de le déclassifier en tant qu'appareil parent." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Les types d'appareils pour enfants doivent être 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "type de module" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "types de modules" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Des machines virtuelles peuvent être affectées à ce rôle" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "rôle de l'appareil" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "rôles des appareils" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Limitez éventuellement cette plate-forme aux appareils d'un certain " "fabricant" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "plateforme" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "plateformes" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "La fonction de cet appareil" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Numéro de série du châssis attribué par le fabricant" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Un tag unique utilisé pour identifier cet appareil" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "position (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "face de la baie" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "IPv4 principal" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "IPv6 principal" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP hors bande" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Position en VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Position virtuelle du châssis" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Priorité VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Priorité d'élection principale du châssis virtuel" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "latitude" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Coordonnées GPS au format décimal (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "longitude" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Le nom de l'appareil doit être unique par site." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "appareil" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "appareils" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "La baie {rack} n'appartient pas au site {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Emplacement {location} n'appartient pas au site {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "La baie {rack} n'appartient pas au lieu {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "" "Impossible de sélectionner la face de baie sans d'abord attribuer une baie." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "" "Impossible de sélectionner une position en baie sans l'attribuer en premier " "dans une baie." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "La position doit être exprimée par incréments de 0,5 unité de baie." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Doit spécifier la face de la baie lors de la définition de la position en " "baie." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5737,7 +6196,7 @@ msgstr "" "Un appareil de type 0U ({device_type}) ne peut pas être attribué à une " "position en baie." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5745,7 +6204,7 @@ msgstr "" "Les appareils de type enfant ne peuvent pas être attribués à une face de " "baie. Il s'agit d'un attribut de l'appareil parent." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5753,7 +6212,7 @@ msgstr "" "Les appareils de type enfant ne peuvent pas être affectés à une position en " "baie. Il s'agit d'un attribut de l'appareil parent." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5762,22 +6221,22 @@ msgstr "" "U{position} est déjà occupé ou ne dispose pas de suffisamment d'espace pour " "accueillir ce type d'appareil : {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} n'est pas une adresse IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "L'adresse IP spécifiée ({ip}) n'est pas attribué à cet appareil." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} n'est pas une adresse IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5787,17 +6246,17 @@ msgstr "" "d'appareils, mais le type de cet appareil appartient à " "{devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Le cluster attribué appartient à un autre site ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "La position d'un appareil affecté à un châssis virtuel doit être définie." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5806,15 +6265,15 @@ msgstr "" "Le périphérique ne peut pas être retiré du châssis virtuel {virtual_chassis}" " car il est actuellement désigné comme son maître." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "module" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "modules" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5823,22 +6282,22 @@ msgstr "" "Le module doit être installé dans une baie de modules appartenant au " "périphérique attribué ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domaine" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "châssis virtuel" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "Le master sélectionné ({master}) n'est pas attribué à ce châssis virtuel." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5847,62 +6306,62 @@ msgstr "" "Impossible de supprimer le châssis virtuel {self}. Il existe des interfaces " "membres qui forment des interfaces LAG inter-châssis." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identificateur" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Identifiant numérique propre à l'appareil parent" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "commentaires" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "contexte du périphérique virtuel" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "contextes de périphériques virtuels" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} n'est pas un IPV{family} adresse." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "L'adresse IP principale doit appartenir à une interface sur l'appareil " "attribué." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "poids" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "unité de poids" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Doit spécifier une unité lors de la définition d'un poids" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "panneau d'alimentation" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "panneaux d'alimentation" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5910,43 +6369,43 @@ msgstr "" "Emplacement {location} ({location_site}) se trouve sur un site différent de " "{site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "fourniture" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "phase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "tension" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "ampérage" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "utilisation maximale" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Tirage maximum autorisé (pourcentage)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "puissance disponible" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "alimentation" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "alimentations" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5955,65 +6414,65 @@ msgstr "" "Baie {rack} ({rack_site}) et panneau d'alimentation {powerpanel} " "({powerpanel_site}) se trouvent sur des sites différents." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "" "La tension ne peut pas être négative pour l'alimentation en courant " "alternatif" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "largeur" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Largeur rail à rail" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Hauteur en U de la baie" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "unité de départ" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Unité de départ pour baie" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "unités décroissantes" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Les unités sont numérotées de haut en bas" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "largeur extérieure" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Dimension extérieure de la baie (largeur)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "profondeur extérieure" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Dimension extérieure de la baie (profondeur)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "unité extérieure" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "profondeur de montage" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6021,75 +6480,76 @@ msgstr "" "Profondeur maximale d'un appareil monté, en millimètres. Pour les supports à" " quatre montants, il s'agit de la distance entre les rails avant et arrière." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "poids maximum" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Capacité de charge maximale de la baie" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "facteur de forme" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "type de rack" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "types de rayonnages" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Doit spécifier une unité lors du réglage d'une largeur/profondeur extérieure" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Doit spécifier une unité lors de la définition d'un poids maximum" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "rôle de la baie" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "rôles de la baie" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID de l'établissement" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Identifiant attribué localement" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Rôle fonctionnel" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Une étiquette unique utilisée pour identifier cette baie" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "baie" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "baies" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "L'emplacement attribué doit appartenir au site parent ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6098,7 +6558,7 @@ msgstr "" "La baie doit être au moins {min_height} pour héberger les appareils " "actuellement installés." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6107,895 +6567,957 @@ msgstr "" "La numérotation des unités de baie doit commencer à {position} ou moins pour" " héberger les appareils actuellement installés." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "L'emplacement doit provenir du même site, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "des unités" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "réservation de baie" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "réservations de baies" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Unité(s) non valide(s) pour une baie à {height}U : {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Les unités suivantes ont déjà été réservées : {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Une région de niveau supérieur portant ce nom existe déjà." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Une région de niveau supérieur contenant ce slug existe déjà." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "région" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "régions" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Un groupe de sites de niveau supérieur portant ce nom existe déjà." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Un groupe de sites de niveau supérieur contenant ce slug existe déjà." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "groupe de sites" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "groupes de sites" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Nom complet du site" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "installation" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Identifiant ou description de l'établissement local" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "adresse physique" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Emplacement physique du bâtiment" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "adresse de livraison" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Si elle est différente de l'adresse physique" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "site" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "sites" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Un emplacement portant ce nom existe déjà au sein du site spécifié." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Un emplacement contenant ce slug existe déjà dans le site spécifié." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "emplacement" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "les lieux" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Lieu de résidence du parent ({parent}) doit appartenir au même site " "({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Terminaison A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Terminaison B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Appareil A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Appareil B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Lieu A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Lieu B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Baie A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Baie B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Site A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Site B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Joignable" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Appareils" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "machines virtuelles" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Modèle de configuration" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Groupe de sites" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "Adresse IP" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Adresse IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Adresse IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Position en VC" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Priorité VC" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Appareil parent" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Position (baie de l'appareil)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Ports de console" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Ports du serveur de consoles" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Ports d'alimentation" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Prises de courant" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfaces" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Ports avant" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Baies pour appareils" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Baies pour modules" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Articles d'inventaire" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Module Bay" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Articles d'inventaire" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Couleur du câble" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Lier les pairs" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Marquer comme connecté" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Tirage maximal (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Tirage alloué (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "Adresses IP" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Groupes FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Gestion uniquement" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Module installé" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Série du module" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Étiquette d'actif du module" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "État du module" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Composant" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Objets" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Types d'appareils" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Types de modules" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Plateformes" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Plateforme par défaut" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Pleine profondeur" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Hauteur en U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instances" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Ports de console" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Ports du serveur de consoles" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Ports d'alimentation" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Prises de courant" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Ports avant" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Ports arrière" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Baies pour appareils" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Baies pour modules" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Alimentations" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Utilisation maximale" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Puissance disponible (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Baies" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Hauteur" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Largeur extérieure" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Profondeur extérieure" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Poids maximum" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Espace" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Sites" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Le scénario de test doit définir peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Déconnecté {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Réservations" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Appareils non rackés" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Contexte de configuration" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Configuration du rendu" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Une erreur s'est produite lors du rendu du modèle : {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Machines virtuelles" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Appareil installé {device} dans la baie {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Appareil retiré {device} depuis la baie {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Enfants" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Membre ajouté {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Impossible de supprimer le périphérique principal {device} depuis le châssis" " virtuel." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Supprimé {device} depuis un châssis virtuel {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Objet associé inconnu: {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "" "La modification du type de champs personnalisés n'est pas prise en charge." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "La planification n'est pas activée pour ce script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Texte" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Texte (long)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Entier" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Décimal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Booléen (vrai/faux)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Date" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Date et heure" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Sélection" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Sélection multiple" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Objets multiples" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Désactivé" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Relaxé" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Exact" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Toujours" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Si défini" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Caché" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Oui" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Non" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Lien" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Le plus récent" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Le plus ancien" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alphabétique (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alphabétique (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Infos" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Succès" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Avertissement" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Danger" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Déboguer" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Par défaut" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Défaillance" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Toutes les heures" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 heures" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Tous les jours" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Hebdo" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 jours" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Créez" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Mise à jour" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Supprimer" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Bleu" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Violet" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Rose" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Rouge" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Orange" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Jaune" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Vert" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Sarcelle" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Cyan" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Gris" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Noir" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Blanc" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Scénario" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Notification" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Opérateur inconnu : {op}. Doit être l'un des suivants : {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Type de valeur non pris en charge : {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Type non valide pour {op} opération : {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "L'ensemble de règles doit être un dictionnaire, pas {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Logique invalide : doit être \"AND\" ou \"OR\". Merci de consulter la " "documentation." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Clé(s) incorrecte(s). Merci de consulter la documentation." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Type de widget" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Classe de widget non enregistrée : {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} doit définir une méthode render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Remarque" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Affichez du contenu personnalisé arbitraire. Markdown est pris en charge." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Nombre d'objets" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -7003,271 +7525,293 @@ msgstr "" "Affichez un ensemble de modèles NetBox et le nombre d'objets créés pour " "chaque type." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtres à appliquer lors du comptage du nombre d'objets" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Format non valide. Les filtres d'objets doivent être transmis sous forme de " "dictionnaire." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Liste d'objets" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Afficher une liste arbitraire d'objets." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Le nombre d'objets à afficher par défaut" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Format non valide. Les paramètres d'URL doivent être transmis sous forme de " "dictionnaire." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "Fil RSS" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Intégrez un flux RSS provenant d'un site Web externe." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL du flux" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Le nombre maximum d'objets à afficher" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Durée de conservation du contenu mis en cache (en secondes)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Signets" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Afficher vos favoris personnels" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Type d'action inconnu pour une règle d'événement : {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "" "Impossible d'importer le pipeline d'événements {name} erreur : {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Module de script (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Fichier de données (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Groupe (nom)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Type de cluster" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Type de cluster (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Groupe de locataires" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Groupe de locataires (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Balise" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Tag (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Possède des données contextuelles de configuration locales" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Nom du groupe" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Obligatoire" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Doit être unique" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Interface utilisateur visible" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Interface utilisateur modifiable" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Est cloneable" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Valeur minimale" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Valeur maximale" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Regex de validation" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Comportement" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nouvelle fenêtre" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Classe de boutons" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Type MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Extension de fichier" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "En pièce jointe" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Partagé" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Méthode HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL de charge utile" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Vérification SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Secret" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "chemin du fichier CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Types d'événements" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Est actif" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Types d'objets" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Un ou plusieurs types d'objets attribués" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Type de données de champ (par exemple texte, entier, etc.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Type d'objet" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Type d'objet (pour les champs d'objets ou multi-objets)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Coffret Choice" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Set de choix (pour les champs de sélection)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Si le champ personnalisé est affiché dans l'interface utilisateur" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Si le champ personnalisé est modifiable dans l'interface utilisateur" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "L'ensemble de base de choix prédéfinis à utiliser (le cas échéant)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7276,186 +7820,202 @@ msgstr "" "virgules avec des libellés facultatifs séparés par deux points : " "« Choice1:First Choice, Choice2:Second Choice »" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "classe de boutons" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "La classe du premier lien d'un groupe sera utilisée pour le bouton déroulant" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Le ou les types d'événements qui déclencheront cette règle" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Objet d'action" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Nom du webhook ou script sous forme de chemin pointillé module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} introuvable" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Scénario {name} introuvable" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Type d'objet attribué" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "La classification de l'entrée" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Utilisateurs" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Noms d'utilisateur séparés par des virgules, encadrés par des guillemets" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Groupes" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Noms de groupes séparés par des virgules, entre guillemets doubles" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Type d'objet associé" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Type de champ" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Choix" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Données" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Fichier de données" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Types de contenu" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Type de contenu HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Type d'événement" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Type d'action" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Type d'objet balisé" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Type d'objet autorisé" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Régions" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Groupes de sites" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Localisations" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Types d'appareils" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Rôles" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Types de clusters" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Groupes de clusters" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Clusters" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Groupes de locataires" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Le ou les types d'objets dotés de ce champ personnalisé" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Valeur par défaut" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" "Type de l'objet associé (pour les champs objet/multi-objets uniquement)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filtre d'objets associés" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Spécifiez les paramètres de requête sous la forme d'un objet JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Champ personnalisé" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7463,7 +8023,7 @@ msgstr "" "Le type de données stockées dans ce champ. Pour les champs objet/multi-" "objets, sélectionnez le type d'objet associé ci-dessous." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7471,11 +8031,11 @@ msgstr "" "Cela sera affiché sous forme de texte d'aide pour le champ du formulaire. " "Markdown est pris en charge." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Objet associé" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7483,15 +8043,16 @@ msgstr "" "Entrez un choix par ligne. Une étiquette facultative peut être spécifiée " "pour chaque choix en l'ajoutant par deux points. Exemple :" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Lien personnalisé" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Modèles" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7501,62 +8062,68 @@ msgstr "" "{example}. Les liens qui s'affichent sous forme de texte vide ne seront pas " "affichés." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "" "Code modèle Jinja2 pour l'URL du lien. Référencez l'objet comme {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Code du modèle" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Modèle d'exportation" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Rendu" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Le contenu du modèle est renseigné à partir de la source distante " "sélectionnée ci-dessous." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Doit spécifier un contenu local ou un fichier de données" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Filtre enregistré" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "" "Un groupe de notifications spécifie au moins un utilisateur ou un groupe." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Requête HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SLL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Choix de l'action" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Entrez les conditions dans JSON format." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7564,117 +8131,119 @@ msgstr "" "Entrez les paramètres à transmettre à l'action dans JSON format." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Règle de l'événement" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "éléments déclencheurs" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Groupe de notifications" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Locataires" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "" "Les données sont renseignées à partir de la source distante sélectionnée ci-" "dessous." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Doit spécifier des données locales ou un fichier de données" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Contenu" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Horaire à" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Planifier l'exécution du rapport à une heure définie" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Récurrent chaque fois" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Intervalle auquel ce rapport est réexécuté (en minutes)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (heure actuelle : {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "L'heure prévue doit se situer dans le futur." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Valider les modifications" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Validez les modifications apportées à la base de données (décochez cette " "case pour une exécution à sec)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Planifier l'exécution du script à une heure définie" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervalle auquel ce script est réexécuté (en minutes)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "" "Les modifications apportées à la base de données ont été annulées " "automatiquement." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Le script a été abandonné avec une erreur : " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Une exception s'est produite : " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "" "Les modifications apportées à la base de données ont été annulées en raison " "d'une erreur." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Aucun indexeur n'a été trouvé !" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "contexte de configuration" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "contextes de configuration" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Les données JSON doivent être sous forme d'objet. Exemple :" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7682,19 +8251,19 @@ msgstr "" "Les données du contexte de configuration local ont priorité sur les " "contextes source dans le contexte de configuration final rendu" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "code du modèle" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Code du modèle Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "paramètres d'environnement" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7705,44 +8274,44 @@ msgstr "" " supplémentaires à passer lors de la construction de l'environnement " "Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "modèle de configuration" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "modèles de configuration" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Le ou les objets auxquels ce champ s'applique." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Le type de données que contient ce champ personnalisé" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Le type d'objet NetBox auquel ce champ correspond (pour les champs d'objets)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Nom du champ interne" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "" "Seuls les caractères alphanumériques et les traits de soulignement sont " "autorisés." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Les doubles soulignements ne sont pas autorisés dans les noms de champs " "personnalisés." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7750,19 +8319,19 @@ msgstr "" "Nom du champ tel qu'il est affiché aux utilisateurs (s'il n'est pas fourni, " "« le nom du champ sera utilisé) »" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "nom du groupe" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Les champs personnalisés d'un même groupe seront affichés ensemble" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "requis" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7770,19 +8339,19 @@ msgstr "" "Ce champ est obligatoire lors de la création de nouveaux objets ou de la " "modification d'un objet existant." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "doit être unique" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "La valeur de ce champ doit être unique pour l'objet attribué" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "poids de recherche" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7791,11 +8360,11 @@ msgstr "" "comme plus importantes. Les champs dont le poids de recherche est nul seront" " ignorés." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "logique de filtrage" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7803,11 +8372,11 @@ msgstr "" "Loose correspond à n'importe quelle instance d'une chaîne donnée ; " "correspond exactement à l'ensemble du champ." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "défaut" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7815,7 +8384,7 @@ msgstr "" "Valeur par défaut pour le champ (doit être une valeur JSON). Encapsulez des " "chaînes avec des guillemets doubles (par exemple, « Foo »)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7824,37 +8393,37 @@ msgstr "" "(doit être une valeur JSON). Encapsulez les chaînes avec des guillemets " "doubles (par exemple « Foo »)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "poids de l'écran" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "" "Les champs dont le poids est plus élevé apparaissent plus bas dans un " "formulaire." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "valeur minimale" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Valeur minimale autorisée (pour les champs numériques)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "valeur maximale" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Valeur maximale autorisée (pour les champs numériques)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "regex de validation" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7866,197 +8435,199 @@ msgstr "" "exemple, ^ [DE A À Z]{3}$ limitera les valeurs à exactement " "trois lettres majuscules." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "set de choix" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Indique si le champ personnalisé est affiché dans l'interface utilisateur" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Indique si la valeur du champ personnalisé peut être modifiée dans " "l'interface utilisateur" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "est clonable" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Répliquez cette valeur lors du clonage d'objets" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "champ personnalisé" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "champs personnalisés" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Valeur par défaut non valide »{value}« : {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "" "Une valeur minimale ne peut être définie que pour les champs numériques" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "" "Une valeur maximale ne peut être définie que pour les champs numériques" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "La validation des expressions régulières est prise en charge uniquement pour" " les champs de texte et d'URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "L'unicité ne peut pas être appliquée aux champs booléens" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Les champs de sélection doivent spécifier un ensemble de choix." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Les choix ne peuvent être définis que sur les champs de sélection." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Les champs d'objet doivent définir un type d'objet." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} les champs ne peuvent pas définir de type d'objet." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Un filtre d'objet associé ne peut être défini que pour les champs d'objets." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Le filtre doit être défini comme un dictionnaire faisant correspondre les " "attributs aux valeurs." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Vrai" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Faux" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" "Les valeurs doivent correspondre à cette expression régulière : " "{regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "La valeur doit être une chaîne." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "La valeur doit correspondre à « regex »{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "La valeur doit être un entier." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "La valeur doit être d'au moins {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "La valeur ne doit pas dépasser {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "La valeur doit être une décimale." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "La valeur doit être vraie ou fausse." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Les valeurs de date doivent être au format ISO 8601 (AAAA-MM-JJ)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Les valeurs de date et d'heure doivent être au format ISO 8601 (YYYY-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Choix non valide ({value}) pour le set de choix {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Choix (s) non valide ({value}) pour le set de choix {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "La valeur doit être un identifiant d'objet, et non {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "La valeur doit être une liste d'identifiants d'objets, et non {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "ID d'objet non valide trouvé : {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Le champ obligatoire ne peut pas être vide." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Ensemble de base de choix prédéfinis (facultatif)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Les choix sont automatiquement classés par ordre alphabétique" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "ensemble de choix de champs personnalisés" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "ensembles de choix de champs personnalisés" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Doit définir des choix de base ou supplémentaires." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8065,60 +8636,60 @@ msgstr "" "Impossible de supprimer le choix {choice} comme il y en a {model} objets qui" " y font référence." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "disposition" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "config" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "tableau de bord" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "tableaux de bord" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "types d'objets" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Le ou les objets auxquels cette règle s'applique." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Les types d'événements qui déclencheront cette règle." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "conditions" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Un ensemble de conditions qui déterminent si l'événement sera généré." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "type d'action" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Données supplémentaires à transmettre à l'objet d'action" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "règle de l'événement" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "règles de l'événement" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8128,7 +8699,7 @@ msgstr "" "du webhook. Le traitement du modèle Jinja2 est pris en charge dans le même " "contexte que le corps de la requête." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available ici." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "en-têtes supplémentaires" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8154,11 +8725,11 @@ msgstr "" "Nom : Value. Le traitement du modèle Jinja2 est pris en charge " "dans le même contexte que le corps de la requête (ci-dessous)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "modèle de carrosserie" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8172,11 +8743,11 @@ msgstr "" "d'utilisateur, identifiant_demande, et " "données." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "secret" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8187,16 +8758,16 @@ msgstr "" "charge utile en utilisant le secret comme clé. Le secret n'est pas transmis " "dans la demande." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" "Activez la vérification des certificats SSL. Désactivez avec précaution !" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Chemin du fichier CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8204,65 +8775,65 @@ msgstr "" "Le fichier de certificat CA spécifique à utiliser pour la vérification SSL. " "Laissez ce champ vide pour utiliser les paramètres par défaut du système." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Ne spécifiez pas de fichier de certificat CA si la vérification SSL est " "désactivée." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Le ou les types d'objets auxquels ce lien s'applique." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "texte du lien" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Code modèle Jinja2 pour le texte du lien" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL du lien" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Code modèle Jinja2 pour l'URL du lien" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Les liens avec le même groupe apparaîtront dans un menu déroulant" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nouvelle fenêtre" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Forcer l'ouverture du lien dans une nouvelle fenêtre" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "lien personnalisé" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "liens personnalisés" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Le ou les types d'objets auxquels ce modèle s'applique." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8270,1095 +8841,1161 @@ msgstr "" "Code du modèle Jinja2. La liste des objets exportés est transmise sous forme" " de variable de contexte nommée ensemble de requêtes." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "" "La valeur par défaut est texte/plain ; jeu de caractères = " "utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "extension de fichier" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Extension à ajouter au nom de fichier affiché" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "en pièce jointe" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Télécharger le fichier en pièce jointe" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "modèle d'exportation" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "modèles d'exportation" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "«{name}« est un nom réservé. Veuillez choisir un autre nom." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Le ou les types d'objets auxquels ce filtre s'applique." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "partagé" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "filtre enregistré" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "filtres enregistrés" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Les paramètres de filtre doivent être stockés sous la forme d'un " "dictionnaire d'arguments de mots-clés." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "hauteur de l'image" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "largeur de l'image" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "image en pièce jointe" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "images jointes" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Les images jointes ne peuvent pas être attribuées à ce type d'objet " "({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "sorte" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "entrée de journal" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "entrées de journal" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "" "La journalisation n'est pas prise en charge pour ce type d'objet ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "signet" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "signets" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Les signets ne peuvent pas être affectés à ce type d'objet ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "lire" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "événement" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "notification" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "notifications" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "" "Les objets de ce type ({type}) ne prennent pas en charge les notifications." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "groupes" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "utilisateurs" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "groupe de notifications" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "groupes de notifications" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "abonnement" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "abonnements" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "est exécutable" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "script" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "scripts" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "module de script" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "modules de script" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "horodatage" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "champ" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "valeur" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "valeur mise en cache" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "valeurs mises en cache" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "succursale" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "branches" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "changement par étapes" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "modifications échelonnées" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Le ou les types d'objets auxquels cette balise peut être appliquée." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "étiquette" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "balises" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "article étiqueté" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "articles étiquetés" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Données de script" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Paramètres d'exécution du script" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Rejeter" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Types d'objets" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Valider le caractère" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Visible" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Modifiable" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Type d'objet associé" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Coffret Choice" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Est clonable" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Valeur minimale" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Valeur maximale" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Regex de validation" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Compter" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Ordre alphabétique" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nouvelle fenêtre" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "En tant que pièce jointe" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Fichier de données" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Synchronisé" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Image" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Taille (octets)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Lisez" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Validation SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Types d'événements" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Rôles des appareils" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Commentaires (courts)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Ligne" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Niveau" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Message" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Méthode" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Assurez-vous que cette valeur est égale à %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Assurez-vous que cette valeur n'est pas égale %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Ce champ doit être vide." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Ce champ ne doit pas être vide." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "" "Les règles de validation doivent être transmises sous forme de dictionnaire" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "La validation personnalisée a échoué pour {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Attribut non valide »{name}« pour demande" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Attribut non valide »{name}« pour {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Votre tableau de bord a été réinitialisé." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Widget ajouté : " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Widget mis à jour : " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Widget supprimé : " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Erreur lors de la suppression du widget : " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "" "Impossible d'exécuter le script : le processus de travail RQ n'est pas en " "cours d'exécution." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Entrez une adresse IPv4 ou IPv6 valide avec un masque facultatif." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Format d'adresse IP non valide : {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Entrez un préfixe IPv4 ou IPv6 valide et un masque en notation CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Format de préfixe IP non valide : {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "L'espace disponible est insuffisant pour prendre en charge la ou les tailles" " de préfixe demandées" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Récipient" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Bouclage" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Norme" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Point de contrôle" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Texte brut" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Format d'adresse IP non valide : {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Objectif d'importation" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Cible d'importation (nom)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Objectif d'exportation" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Cible d'exportation (nom)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importation de VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importer VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Exportation de fichiers VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Exporter VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importation de L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importation de L2VPN (identifiant)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Exportation de L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Exportation de L2VPN (identifiant)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Préfixe" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIRE (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Dans le préfixe" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Dans le préfixe et y compris" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Préfixes contenant ce préfixe ou cette adresse IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Longueur du masque" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (IDENTIFIANT)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Numéro de VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adresse" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Plages contenant ce préfixe ou cette adresse IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Préfixe parent" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Machine virtuelle (nom)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Machine virtuelle (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interface (nom)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interface de machine virtuelle (nom)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interface de machine virtuelle (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Groupe FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Est affecté à une interface" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Est attribué" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Service (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "Adresse IP intérieure NAT (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interface attribuée" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Interface de machine virtuelle attribuée" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "Adresse IP (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "Adresse IP" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "IPv4 principal (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "IPv6 principal (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Entrez une adresse IPv4 ou IPv6 valide (sans masque)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Format d'adresse IPv4/IPv6 non valide : {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Ce champ nécessite une adresse IP sans masque." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Spécifiez une adresse IPv4 ou IPv6 valide." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Entrez une adresse IPv4 ou IPv6 valide (avec masque CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Un masque CIDR (par exemple /24) est requis." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Modèle d'adresse" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Forcer l'unicité des préfixes IP" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Est privé" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Date d'ajout" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Groupe VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Longueur du préfixe" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "C'est une piscine" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Traiter comme s'il avait été pleinement utilisé" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Attribution de VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Nom DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protocole" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "ID de groupe" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Type d'authentification" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Clé d'authentification" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Authentification" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Type de portée" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Champ" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Plages d'ID VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Site et groupe" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Ports" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importer des cibles d'itinéraire" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Cibles d'itinéraire d'exportation" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "RIR attribué" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Le groupe du VLAN (le cas échéant)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Appareil parent auquel est attribuée l'interface (le cas échéant)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Machine virtuelle" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "VM parent de l'interface attribuée (le cas échéant)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Est principal" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Faites-en l'adresse IP principale de l'appareil attribué" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Aucun périphérique ou machine virtuelle spécifié ; impossible de le définir " "comme adresse IP principale" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Aucune interface spécifiée ; impossible de définir comme adresse IP " "principale" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Type d'authentification" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Type de scope (application et modèle)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Groupe VLAN attribué" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "Protocole IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Obligatoire s'il n'est pas attribué à une machine virtuelle" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Obligatoire s'il n'est pas attribué à un appareil" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} n'est pas attribué à cet appareil/à cette machine virtuelle." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Cibles de l'itinéraire" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Cibles d'importation" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Objectifs d'exportation" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importé par VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Exporté par VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privé" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Famille d'adresses" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Plage" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Démarrer" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Fin" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Rechercher dans" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Présent en VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Appareil/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Préfixe parent" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Appareil attribué" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Machine virtuelle attribuée" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Affecté à une interface" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Nom DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Contient un ID de VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "IDENTIFIANT DE VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Machine virtuelle" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Cible de l'itinéraire" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Agrégat" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Plage ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Affectation de site/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Plage IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Groupe FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "" "Faites-en l'adresse IP principale de l'appareil/de la machine virtuelle" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "IP NAT (interne)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Une adresse IP ne peut être attribuée qu'à un seul objet." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Impossible de réattribuer l'adresse IP lorsqu'elle est désignée comme " -"adresse IP principale pour l'objet parent" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Seules les adresses IP attribuées à une interface peuvent être désignées " "comme adresses IP principales." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Adresse IP virtuelle" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "L'affectation existe déjà" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "ID de VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "VLAN pour enfants" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9366,133 +10003,134 @@ msgstr "" "Liste séparée par des virgules d'un ou de plusieurs numéros de port. Une " "plage peut être spécifiée à l'aide d'un trait d'union." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Modèle de service" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Port (x)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Service" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Modèle de service" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "À partir du modèle" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Personnalisé" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Vous devez spécifier le nom, le protocole et le ou les ports si vous " "n'utilisez pas de modèle de service." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "démarrer" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Plage ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Plages ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" "Démarrage de l'ASN ({start}) doit être inférieur à l'ASN final ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Registre Internet régional responsable de cet espace numérique AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "Numéro de système autonome 16 ou 32 bits" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID de groupe" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protocole" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "type d'authentification" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "clé d'authentification" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Groupe FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Groupes FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Affectation au groupe FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Missions du groupe FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privé" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "L'espace IP géré par ce RIR est considéré comme privé" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "IR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Réseau IPv4 ou IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Registre Internet régional responsable de cet espace IP" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "date d'ajout" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "global" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "agrégats" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Impossible de créer un agrégat avec le masque /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9501,7 +10139,7 @@ msgstr "" "Les agrégats ne peuvent pas se chevaucher. {prefix} est déjà couvert par un " "agrégat existant ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9510,163 +10148,165 @@ msgstr "" "Les préfixes ne peuvent pas chevaucher des agrégats. {prefix} couvre un " "agrégat existant ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "rôle" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "rôles" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "préfixe" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Réseau IPv4 ou IPv6 avec masque" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "État opérationnel de ce préfixe" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "La fonction principale de ce préfixe" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "est une piscine" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Toutes les adresses IP comprises dans ce préfixe sont considérées comme " "utilisables" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "marque utilisée" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "préfixes" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Impossible de créer un préfixe avec le masque /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "tableau global" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Préfixe dupliqué trouvé dans {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "adresse de départ" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Adresse IPv4 ou IPv6 (avec masque)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "adresse finale" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "État opérationnel de cette gamme" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "La principale fonction de cette gamme" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "plage IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Plages IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Les versions des adresses IP de début et de fin doivent correspondre" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Les masques d'adresse IP de début et de fin doivent correspondre" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "L'adresse de fin doit être supérieure à l'adresse de début ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Les adresses définies se chevauchent avec la plage {overlapping_range} en " "VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "La plage définie dépasse la taille maximale prise en charge ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "adresse" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "L'état opérationnel de cette adresse IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Le rôle fonctionnel de cette propriété intellectuelle" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (intérieur)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "" "L'adresse IP pour laquelle cette adresse est l'adresse IP « extérieure »" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Nom d'hôte ou FQDN (pas de distinction majuscules/minuscules)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "Adresses IP" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Impossible de créer une adresse IP avec le masque /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} est un identifiant réseau, qui ne peut pas être attribué à une " "interface." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." @@ -9674,109 +10314,117 @@ msgstr "" "{ip} est une adresse de diffusion, qui ne peut pas être attribuée à une " "interface." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Adresse IP dupliquée trouvée dans {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Impossible de réattribuer l'adresse IP lorsqu'elle est désignée comme " +"adresse IP principale pour l'objet parent" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "" "Seules les adresses IPv6 peuvent être de type SLAAC (Configuration " "automatique des adresses sans état)" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "numéros de port" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "modèle de service" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "modèles de services" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Les adresses IP spécifiques (le cas échéant) auxquelles ce service est lié" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "service" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "services" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Un service ne peut pas être associé à la fois à un appareil et à une machine" " virtuelle." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Un service doit être associé à un appareil ou à une machine virtuelle." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "groupes VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Impossible de définir scope_type sans scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Impossible de définir scope_id sans scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Les plages ne peuvent pas se chevaucher." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Le site spécifique auquel ce VLAN est associé (le cas échéant)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Groupe VLAN (facultatif)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID VLAN numérique (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "État opérationnel de ce VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "La principale fonction de ce VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9785,168 +10433,170 @@ msgstr "" "Le VLAN est associé au groupe {group} (champ d'application : {scope}) ; ne " "peut pas également être associé au site {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "Le VID doit être compris dans des plages {ranges} pour les VLAN en groupe " "{group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "Distincteur d'itinéraire" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Distincteur d'itinéraire unique (tel que défini dans la RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "renforcer un espace unique" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Empêchez les préfixes/adresses IP dupliqués dans ce VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Valeur cible de l'itinéraire (formatée conformément à la RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "cible de l'itinéraire" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "cibles de l'itinéraire" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Nombre de sites" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Nombre de fournisseurs" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agrégats" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Ajouté" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Préfixes" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Utilisation" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Plages d'adresses IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Préfixe (plat)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Profondeur" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Piscine" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Marqué comme utilisé" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Adresse de départ" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (intérieur)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (extérieur)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Attribué" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Objet attribué" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Type de portée" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Gammes VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Unique" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Cibles d'importation" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Objectifs d'exportation" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} n'est pas un préfixe valide. Vouliez-vous dire {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "" "La longueur du préfixe doit être inférieure ou égale à %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "" "La longueur du préfixe doit être supérieure ou égale à %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9954,31 +10604,31 @@ msgstr "" "Seuls les caractères alphanumériques, les astérisques, les tirets, les " "points et les traits de soulignement sont autorisés dans les noms DNS" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Préfixes pour enfants" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Plages pour enfants" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "IP associées" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfaces des appareils" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Interfaces de machines virtuelles" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Ce champ n'est peut-être pas vide." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9986,337 +10636,350 @@ msgstr "" "La valeur doit être transmise directement (par exemple « foo » : 123) ; " "n'utilisez pas de dictionnaire ni de liste." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} n'est pas un choix valable." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Type de contenu non valide : {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Valeur non valide. Spécifiez un type de contenu comme " "«.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "" "Les plages doivent être spécifiées dans le formulaire (inférieur, " "supérieur)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "" "Les limites des plages doivent être définies sous forme de nombres entiers." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} doit implémenter get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Autorisation non valide {permission} pour modèle {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Rouge foncé" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rose" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuchsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Violet foncé" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Bleu clair" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Vert foncé" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Vert clair" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Citron" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Ambre" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Orange foncé" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Marron" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "gris clair" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "gris" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "gris foncé" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Directement" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Téléverser" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Détection automatique" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Virgule" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Point-virgule" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Onglet" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Paramètre de configuration non valide : {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Bannière de connexion" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Contenu supplémentaire à afficher sur la page de connexion" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Bannière de maintenance" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Contenu supplémentaire à afficher en mode maintenance" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Bannière supérieure" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Contenu supplémentaire à afficher en haut de chaque page" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Bannière inférieure" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Contenu supplémentaire à afficher au bas de chaque page" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Un espace IP unique au monde" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Appliquez un adressage IP unique dans le tableau global" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Préférez IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Préférez les adresses IPv4 à IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Hauteur de la baie" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "" "Valeur par défaut du nombre d'unités pour les élévations des baies affichées" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Largeur de l'unité de la baie" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "" "Valeur par défaut de la largeur des unités pour les élévations des baies " "affichées" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Tension d'alimentation" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Tension par défaut pour les alimentations" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Ampérage d'alimentation" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Ampérage par défaut pour les alimentations" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Utilisation maximale de Powerfeed" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Utilisation maximale par défaut pour les alimentations" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Schémas d'URL autorisés" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" "Schémas autorisés pour les URL dans le contenu fourni par l'utilisateur" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Taille de page par défaut" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Taille de page maximale" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Validateurs personnalisés" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Règles de validation personnalisées (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Règles de protection" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Règles de protection contre la suppression (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Préférences par défaut" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Préférences par défaut pour les nouveaux utilisateurs" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Mode de maintenance" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Activer le mode maintenance" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL activé" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Activez l'API GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Conservation du journal des modifications" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Jours pendant lesquels l'historique des modifications est conservé (défini à" " zéro pour un nombre illimité)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Maintien des résultats professionnels" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Jours pendant lesquels vous conservez l'historique des résultats du travail " "(défini sur zéro pour une durée illimitée)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL des cartes" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "URL de base pour cartographier les emplacements géographiques" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Match partiel" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Correspondance exacte" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Commence par" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Se termine par" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Type (s) d'objet" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Chercher" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10324,415 +10987,430 @@ msgstr "" "Slugs de balises séparés par des virgules, encadrés par des guillemets " "doubles (par exemple « tag1, tag2, tag3 »)" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Ajouter des tags" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Supprimer les tags" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} doit spécifier une classe de modèle." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "" "Nom de champ inconnu '{name}'dans les données de champs personnalisés." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Valeur non valide pour le champ personnalisé '{name}« : {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Champ personnalisé '{name}'doit avoir une valeur unique." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Champ personnalisé obligatoire manquant '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Source de données distante" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "chemin de données" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "" "Chemin vers le fichier distant (par rapport à la racine de la source de " "données)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "synchronisation automatique activée" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Activer la synchronisation automatique des données lors de la mise à jour du" " fichier de données" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "date de synchronisation" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} doit implémenter une méthode sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organisation" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Groupes de sites" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Groupes de locataires" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Groupes de contacts" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Rôles de contact" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Associer des contacts" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Rôles des baies" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Élévations" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Types de rayonnages" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Modules" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Contextes des appareils virtuels" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Fabricants" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Composants de l'appareil" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Rôles des articles d'inventaire" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Connexions" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Câbles" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Liaisons sans fil" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Connexions d'interface" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Connexions à la console" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Connexions électriques" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Groupes réseaux sans fil" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Préfixes et rôles VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Plages ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Groupes VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Modèles de services" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Des services" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunnels" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Groupes de tunnels" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Terminaisons de tunnels" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "VPN L2" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Terminaisons" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Propositions IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Politiques IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Propositions IPSec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Politiques IPSec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Profils IPSec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Disques virtuels" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Types de clusters" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Groupes de clusters" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Types de circuits" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Groupes de circuits" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Devoirs de groupe" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Terminaisons de circuits" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Prestataires" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Comptes des fournisseurs" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Réseaux de fournisseurs" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Panneaux d'alimentation" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Configurations" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Contextes de configuration" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Modèles de configuration" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Personnalisation" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Champs personnalisés" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Choix de champs personnalisés" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Liens personnalisés" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Modèles d'exportation" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Filtres enregistrés" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Pièces jointes à des images" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Opérations" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Intégrations" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Sources de données" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Règles de l'événement" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Emplois" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Journalisation" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Groupes de notifications" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Entrées de journal" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Journal des modifications" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Administrateur" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Jetons d'API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Autorisations" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Système" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plug-ins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Historique de configuration" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Tâches d'arrière-plan" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "" "Les autorisations doivent être transmises sous forme de tuple ou de liste." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Les boutons doivent être transmis sous forme de tuple ou de liste." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "La couleur du bouton doit être sélectionnée dans ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10741,7 +11419,7 @@ msgstr "" "Classe PluginTemplateExtension {template_extension} a été transmis en tant " "qu'instance !" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10750,196 +11428,197 @@ msgstr "" "{template_extension} n'est pas une sous-classe de " "Netbox.Plugins.PluginTemplateExtension !" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} doit être une instance de Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} doit être une instance de Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} doit être une instance de Netbox.Plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context doit être un dictionnaire" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Navigation HTML" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Activer la navigation dynamique dans l'interface utilisateur" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Fonctionnalité expérimentale" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Langue" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "" "Force la traduction de l'interface utilisateur dans la langue spécifiée" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "La prise en charge de la traduction a été désactivée localement" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Longueur de page" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Le nombre d'objets par défaut à afficher par page" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Emplacement du paginateur" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "En bas" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Haut" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Les deux" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Où les commandes du paginateur seront affichées par rapport à un tableau" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Format des données" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Syntaxe préférée pour afficher des données génériques dans l'interface " "utilisateur" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Boutique non valide : {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Impossible d'ajouter des magasins au registre après l'initialisation" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Impossible de supprimer des magasins du registre" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "tchèque" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "danois" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "allemand" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Anglais" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "espagnol" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "français" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "italien" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "japonais" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "néerlandais" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "polonais" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "portugais" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "russe" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Turc" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ukrainien" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "chinois" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Tout sélectionner" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Tout afficher" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Basculer vers le menu déroulant" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Erreur" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} non trouvé" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Champ" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Valeur" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Plugin Dummy" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10948,58 +11627,58 @@ msgstr "" "Une erreur s'est produite lors de l'affichage du modèle d'exportation " "sélectionné ({template}) : {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Rangée {i}: Objet avec identifiant {id} n'existe pas" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Non {object_type} ont été sélectionnés." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Renommé {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Supprimé {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Journal des modifications" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Journal" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "" "Impossible de synchroniser les données : aucun fichier de données n'est " "défini." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Données synchronisées pour {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Synchronisé {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} doit implémenter get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -11007,707 +11686,749 @@ msgstr "" "Une erreur s'est produite lors du chargement de la configuration du tableau " "de bord. Un tableau de bord par défaut est utilisé." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Accès refusé" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Vous n'êtes pas autorisé à accéder à cette page" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Page non trouvée" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "La page demandée n'existe pas" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Erreur du serveur" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Il y a eu un problème avec votre demande. Veuillez contacter un " "administrateur" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "L'exception complète est fournie ci-dessous" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Version Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Version NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Aucun n'est installé" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "" "Si une assistance supplémentaire est requise, veuillez envoyer un message au" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Forum de discussion NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "sur GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Page d'accueil" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Notifications" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abonnements" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Préférences" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Modifier le mot de passe" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Annuler" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Sauvegarder" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Configurations des tables" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Effacer les préférences du tableau" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Tout afficher" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tableau" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Commander" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Colonnes" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Aucun n'a été trouvé" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Profil utilisateur" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Détails du compte" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "Courrier électronique" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Compte créé" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Dernière connexion" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superutilisateur" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Le personnel" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Groupes associés" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Aucune" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Activité récente" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Mes jetons d'API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Jeton" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Écriture activée" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Dernière utilisation" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Ajouter un jeton" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Accueil" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Motif NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Logo NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Docs" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "API REST" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Documentation de l'API REST" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "API GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Assistance NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Code source" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Communauté" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Date d'installation" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Date de résiliation" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Associer un groupe" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Échanger les terminaisons du circuit" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Échanger les terminaisons du circuit %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Coté A" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Côté Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Attribuer un circuit" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Affectation de groupes de circuits" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Ajouter un circuit" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Type de circuit" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Ajouter" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Modifier" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Échange" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Marqué comme connecté" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "pour" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Trace" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Modifier le câble" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Retirez le câble" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Déconnectez" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Connecter" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "En aval" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "En amont" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Connexion croisée" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Panneau de raccordement et port" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Ajouter un circuit" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Compte du fournisseur" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Données de configuration" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Commentaire" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Restaurer" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Paramètre" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Valeur actuelle" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nouvelle valeur" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Modifié" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Taille" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "octets" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Hachage SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synchroniser" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Dernière synchronisation" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Aucun paramètre défini" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Dossiers" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Élévations des rayonnages" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Hauteur de l'unité par défaut" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Largeur de l'unité par défaut" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Alimentations" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Tension par défaut" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Ampérage par défaut" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Utilisation maximale par défaut" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Appliquez une approche unique au monde" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Nombre de pages" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Taille de page maximale" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Préférences de l'utilisateur" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Maintien de l'emploi" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Emploi" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Créé par" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Planification" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "chaque %(interval)s minutes" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Changer" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Différence" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Précédent" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Suivant" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Objet créé" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objet supprimé" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Aucune modification" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Données avant modification" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Attention : modification non-atomique vis à vis de la modification " "précédente" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Données après modification" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Voir toutes les %(count)s modifications" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Modifier la durée de conservation des logs" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "jours" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Indéfini" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Non installé" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Vue d'ensemble" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Installer" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Détails du plugin" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Résumé" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licence" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Historique des versions" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Instructions d'installation locales" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Files d'attente en arrière-plan" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Configurer le tableau" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Arrête" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "File d'attente" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "File d'attente" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "File d'attente" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Délai d'attente" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Résultat TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Méta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Arguments" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Arguments relatifs aux" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Cela dépend de" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Exception" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "tâches dans " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Jobs en file d'attente" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11715,383 +12436,401 @@ msgstr "" "Sélectionnez tous %(count)s %(object_type_plural)s requête " "correspondante" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informations sur les travailleurs" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Travailleur" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Files d'attente" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Emplois actuels" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Nombre d'emplois réussis" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Nombre de tâches échouées" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Temps de travail total" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "secondes" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Travailleurs de fond" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Travailleurs en %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Exporter" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "État du système" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Version de NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Version de Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Version de PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Nom de base de données" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Taille de base de données" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Non disponible" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Travailleurs de RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "file d'attente par défaut" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Heure du système" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Configuration actuelle" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" "Êtes-vous sûr de vouloir les déconnecter %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Cable Trace pour %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Télécharger SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Trajectoire asymétrique" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Les nœuds ci-dessous n'ont aucun lien et génèrent un chemin asymétrique" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Parcours divisé" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Sélectionnez un nœud ci-dessous pour continuer" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Trace terminée" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Nombre total de segments" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Longueur totale" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Aucun chemin trouvé" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Chemins associés" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Origine" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Destination" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segments" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Incomplet" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Renommer la sélection" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Non connecté" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Surligner l'appareil dans le rack" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Pas mis en baie" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Coordonnées GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Carte" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Étiquette d'actif" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Afficher le châssis virtuel" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Créer un VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Gestion" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT pour" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Utilisation de l'énergie" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Entrée" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Prises" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Alloué" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Jambe" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Ajouter un service" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Ajouter des composants" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Ajouter des ports de console" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Ajouter des ports au serveur de consoles" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Ajouter des baies pour appareils" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Ajouter des ports frontaux" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Masquer activé" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Masquer les désactivés" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Masquer le virtuel" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Masquer les déconnectés" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Ajouter des interfaces" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Ajouter un article d'inventaire" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Ajouter des baies de modules" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Ajouter des prises de courant" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Ajouter un port d'alimentation" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Ajouter des ports arrière" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Configuration" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Données de contexte" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Configuration rendue" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Télécharger" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Aucun modèle de configuration trouvé" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Baie Parent" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Régénérez le slug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Supprimer" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Données contextuelles de configuration locales" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Renommer" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Baie pour appareils" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Appareil installé" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Supprimer %(device)s de %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12100,430 +12839,449 @@ msgstr "" "Êtes-vous sûr de vouloir supprimer %(device)s de " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Peupler" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Baie" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Ajouter un appareil" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Rôle de la machine virtuelle" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Nom du modèle" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Numéro de pièce" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Exclure de l'utilisation" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Parent/Enfant" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Image avant" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Image arrière" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Position du port arrière" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Marqué comme connecté" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "État de la connexion" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Côté A" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Côté B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Pas de terminaison" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Marquer comme prévu" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Marquer comme installé" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "État du chemin" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Non joignable" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Points de terminaison du chemin" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Non connecté" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Non taggé" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Aucun VLAN associé" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Effacer" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Tout effacer" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Profondeur de montage" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "U initial" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Unités décroissantes" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Élévation du rack" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Ajouter une interface enfant" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Vitesse/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Mode PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Type de PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Mode 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "Adresse MAC" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Liaison sans fil" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Canal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Fréquence du canal" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Largeur du canal" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Membres de l'aggrégat (LAG)" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Aucune interface membre" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Ajouter une adresse IP" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Objet parent" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Identifiant de la pièce" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Ajouter la localisation de l'enfant" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Localisations des enfants" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Ajouter un lieu" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Ajouter un appareil" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Ajouter un type d'appareil" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Ajouter un type de module" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Appareil connecté" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Utilisation (allouée)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Caractéristiques électriques" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Circuit" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Ajouter des sources d'alimentation" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Consommation maximale" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Puissance alloué" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Espace utilisé" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Poids de la baie" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Poids maximum" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Poids total" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Images et étiquettes" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Images uniquement" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Étiquettes uniquement" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Ajouter une réservation" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Afficher la liste" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Sélectionnez la vue du rack" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Trier par" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Aucune baie trouvée" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Afficher les élévations" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Détails de la réservation" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Ajouter un baie" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Positions" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Ajouter un site" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Régions enfants" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Ajouter une région" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Fuseau horaire" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC (Temps universel coordonné)" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Heure du site" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Adresse physique" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Adresse de livraison" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Groupes enfants" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Ajouter un groupe de sites" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Pièce jointe" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Ajouter un membre" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Appareils membres" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Ajouter un nouveau membre à Virtual Chassis %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Ajouter un nouveau membre" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Actions" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Enregistrer et ajouter un autre" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Édition d'un châssis virtuel %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Baie/U" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Supprimer un membre du châssis virtuel" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12532,11 +13290,12 @@ msgstr "" "Êtes-vous sûr de vouloir supprimer %(device)s du châssis " "virtuel %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identifiant" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12544,11 +13303,11 @@ msgstr "" "Une erreur d'importation de module s'est produite lors de cette requête. Les" " causes les plus courantes sont les suivantes :" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Paquets requis manquants" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12565,11 +13324,11 @@ msgstr "" "Freeze
    depuis la console et comparez la sortie à la liste des paquets" " requis." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Le service WSGI n'a pas redémarré après la mise à jour" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12579,7 +13338,7 @@ msgstr "" "WSGI (par exemple gunicorn ou uWSGI) a été redémarré. Cela permet de " "garantir que le nouveau code est en cours d'exécution." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12587,11 +13346,11 @@ msgstr "" "Une erreur d'autorisation de fichier a été détectée lors du traitement de " "cette requête. Les causes les plus courantes sont les suivantes :" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Autorisation d'écriture insuffisante pour la racine du média" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12602,7 +13361,7 @@ msgstr "" "Assurez-vous que l'utilisateur sous lequel NetBox s'exécute a accès en " "écriture à l'ensemble des répertoires de ce chemin." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12610,11 +13369,11 @@ msgstr "" "Une erreur de base de données a été détectée lors du traitement de cette " "requête. Les causes les plus courantes sont les suivantes :" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Migration de base de données manquante" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12626,11 +13385,11 @@ msgstr "" "exécutant python3 manage.py migrate à partir de la ligne de " "commande." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Version de PostgreSQL non prise en charge" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12641,99 +13400,102 @@ msgstr "" "des identifiants de base de données paramétrés dans NetBox et en exécutant " "la requête SELECT VERSION()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Le fichier de données associé à cet objet a été supprimé" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Données synchronisées" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Synchroniser les données" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Paramètres de l'environnement" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Modèle" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Nom du groupe" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Doit être unique" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Clonable" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Valeur par défaut" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Poids de recherche" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Logique de recherche du filtre" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Poids de l'écran" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Interface utilisateur visible" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Interface utilisateur modifiable" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Règles de validation" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Expression rationnelle" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Classe de boutons" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Modèles associés" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Texte du lien" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL du lien" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Réinitialisation du tableau de bord" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12741,7 +13503,7 @@ msgstr "" "Cela supprimera tous les widgets configurés et rétablira la" " configuration par défaut du tableau de bord." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12749,159 +13511,161 @@ msgstr "" "Ce changement concerne uniquement votre tableau de bord, et n'aura " "aucun impact sur les autres utilisateurs." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "configuration du widget" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Fermer le widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Ajouter un widget" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Aucun favori n'a encore été ajouté." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Aucun droit" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Aucun droit de voir ce contenu" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Impossible de charger le contenu. Nom de vue invalide" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Aucun contenu trouvé" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Un problème s'est produit lors de la récupération du flux RSS" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Les conditions" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Type MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Extension de fichier" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Planifié le" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Durée" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Résumé du test" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Journal" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "sortie" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Chargement" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Résultats en attente" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Entrée de journal" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Groupe de notifications" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Aucune assignée" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Le contexte de configuration local remplace tous les contextes source" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Contextes sources" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nouvelle entrée de journal" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Rapport" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Vous n'avez pas le droit d'exécuter des scripts" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Exécuter le script" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Erreur de chargement du script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Le script n'existe plus dans le fichier source." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Dernière exécution" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Le script n'est plus présent dans le fichier source" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Jamais" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Exécutez à nouveau" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Aucun script trouvé" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12910,81 +13674,83 @@ msgstr "" "Pour démarrer, créer un script à " "partir d'un fichier ou d'une source de données chargé." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Résultats" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Seuil de journalisation" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Tous" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Articles taggés" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Types d'objets autorisés" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "N'importe lequel" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Types d'articles taggés" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Objets taggés" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Méthode HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Type de contenu HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Vérification SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "En-têtes supplémentaires" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Modèle du corps du message" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Création en masse" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Objets sélectionnés" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "à ajouter" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Suppression de masse" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Confirmer la suppression de masse" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12994,66 +13760,69 @@ msgstr "" "L'opération suivante supprimera %(count)s %(type_plural)s. " "Vérifiez attentivement les objets sélectionnés et confirmez cette action." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Édition" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Modifier en masse" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Appliquer" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Importation en masse" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Importation directe" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Charger un fichier" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Soumettre" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Options de champ" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Accesseur" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "choix" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Valeur d'importation" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Format : AAAA-MM-JJ" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Spécifiez vrai ou faux" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Les champs obligatoires doivent être saisis pour tous les " "objets." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -13063,15 +13832,15 @@ msgstr "" "unique. Par exemple, %(example)s identifie une VRF par son " "\"Route Distinguisher\"." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Supprimer en masse" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Confirmer la suppression de masse" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13082,72 +13851,72 @@ msgstr "" "%(parent_obj)s. Veuillez vérifier attentivement les %(obj_type_plural)s à " "supprimer et à confirmer ci-dessous." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Supprimez-les %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Renommer" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Renommer en masse" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Nom actuel" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nouveau nom" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Aperçu" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Êtes-vous sûr ?" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Confirmer" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Modifier la sélection" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Supprimer la sélection" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Ajouter un nouveau %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Afficher la documentation du modèle" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Aide" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Créer et en ajouter un autre" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtres" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13157,40 +13926,40 @@ msgstr "" "count\">%(count)s %(object_type_plural)squi correspondent à" " la requête" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nouvelle version disponible" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "est disponible" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Instructions de mise à jour" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Déverrouiller le tableau de bord" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Tableau de bord verrouillé" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Ajouter un widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Enregistrer la mise en page" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Confirmer la suppression" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13199,40 +13968,40 @@ msgstr "" "Es-tu sûr de vouloir supprimer " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Les objets suivants seront supprimés à la suite de cette action." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "depuis" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Aucune notification non lue" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Toutes les notifications" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Sélectionner" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Réinitialiser" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Activer le mode sombre" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Activer le mode éclairage" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13241,281 +14010,283 @@ msgstr "" "Avant de pouvoir ajouter un %(model)s vous devez d'abord créer un " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Sélection de page" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Montrant %(start)s-%(end)s de %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Options de pagination" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Par page" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Joindre une image" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Objets associés" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Aucune étiquette associée" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Les données ne sont pas synchronisées avec le fichier en amont" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Recherche rapide" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Filtre enregistré" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Commande claire" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centre d'aide" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Administrateur Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Déconnexion" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Connexion" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Famille" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Date d'ajout" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Ajouter un préfixe" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Numéro d'AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Type d'authentification" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Clé d'authentification" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Adresses IP virtuelles" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Associer une IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Création en masse" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Créer un groupe" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "IP virtuelles" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Afficher les affectations" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Afficher disponible" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Afficher tout" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globale" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (externe)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Attribuer une adresse IP" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Sélectionnez l'adresse IP" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Résultats de recherche" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Ajouter des adresses IP en masse" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Adresse de début" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Adresse de fin" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Marqué comme entièrement utilisé" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Détails du préfixe" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "IP enfants" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "IP disponibles" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Première adresse IP disponible" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Détails du préfixe" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Adresse réseau" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Masque de sous-réseau" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Masque Wildcard" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Adresse de diffusion" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Ajouter une plage d'adresses IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Masquer les indicateurs de profondeur" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Profondeur maximale" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Longueur maximale" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Ajouter un agrégat" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importer des VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Exporter des VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Importer des L2VPN" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Exporter des L2VPN" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Ajouter un préfixe" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Ajouter un VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Route Distinguisher" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Espace IP unique" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Erreurs" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Connexion" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Ou" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Erreur d'accès aux fichiers statiques - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Erreur d'accès aux fichiers statiques" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Le fichier statique suivant n'a pas pu être chargé" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Vérifiez les points suivants" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13525,7 +14296,7 @@ msgstr "" "à jour. Cela installe la version la plus récente de chaque fichier statique " "dans le repertoire STATIC_ROOT." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13537,7 +14308,7 @@ msgstr "" "Reportez-vous à la documentation d'installation" " pour de plus amples informations." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13546,547 +14317,570 @@ msgstr "" "Le dossier %(filename)s existe dans le répertoire racine " "statique et est lisible par le serveur HTTP." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Cliquez ici pour essayer de recharger NetBox." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Contacter" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Titre" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Téléphone" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Groupe de contact" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Ajouter un groupe de contacts" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Rôle du contact" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Ajouter un contact" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Ajouter un locataire" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Groupe de locataires" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Ajouter un groupe de locataires" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Permissions attribuées" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Autorisation" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Afficher" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Contraintes" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Utilisateurs associés" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Ressources allouées" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Processeurs virtuels" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Mémoire" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Espace disque" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Ajouter une machine virtuelle" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Attribuer un appareil" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Supprimer la sélection" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Ajouter un appareil au cluster %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Sélection de l'appareil" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Ajouter des appareils" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Ajouter un cluster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Groupe Cluster" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Type de cluster" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Disque virtuel" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Ressources" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Ajouter un disque virtuel" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Politique IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Version IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Clé pré-partagée" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Afficher le secret" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Propositions" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Proposition IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Méthode d'authentification" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Algorithme de chiffrement" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algorithme d'authentification" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "groupe DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Durée de vie de l'association de sécurité (secondes)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Politique IPSec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "groupe PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Profil IPSec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Groupe PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Proposition IPSec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Durée de vie de l'association de sécurité (Ko)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "Attributs L2VPN" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Ajouter une terminaison" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Ajouter une terminaison" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Encapsulation" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "profil IPSec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Identifiant du tunnel" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Ajouter un tunnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Groupe de Tunnel" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Terminaison du tunnel" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "IP externe" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Terminaisons des pairs" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Chiffrer" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Interfaces attachées" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Ajouter un réseau sans fil" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Groupe LAN sans fil" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Ajouter un groupe de réseau local sans fil" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Propriétés du lien" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Distance" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Groupe de contact pour les parents (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Groupe de contact avec les parents (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Groupe de contacts (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Groupe de contact (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Contact (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Rôle du contact (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Rôle de contact (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Groupe de contact" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Groupe de parents locataires (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Groupe de parents locataires (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Groupe de locataires (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Groupe de locataires (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Groupe de locataires (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Description" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Contact associé" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "groupe de contacts" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "groupes de contacts" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "rôle du contact" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "rôles du contact" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "titre" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "téléphone" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "courriel" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "lien" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "contacter" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "contacts" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "Associer un contact" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "Contacts associés" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Les contacts ne peuvent pas être affectés à ce type d'objet ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "groupe de locataires" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "groupes de locataires" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Le nom du locataire doit être unique par groupe." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Le slug tenant doit être unique par groupe." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "locataire" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "locataires" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Titre du contact" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Téléphone de contact" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Email de contact" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Adresse de contact" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Lien de contact" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Description du contact" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Permission (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Groupe de notifications (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Prénom" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Nom de famille" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Statut équipe" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Statut de superutilisateur" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Si aucune clé n'est fournie, une clé sera générée automatiquement." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Est dans l'équipe" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Est un superutilisateur" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Peut voir" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Peut ajouter" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Peut changer" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Peut supprimer" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Interface utilisateur" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14096,7 +14890,7 @@ msgstr "" "d'enregistrer votre clé avant de soumettre ce formulaire, car il se" " peut qu'il ne soit plus accessible une fois le jeton créé." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14106,33 +14900,33 @@ msgstr "" "Laissez ce champ vide pour éviter toute restriction. Exemple : " "10.1.1.0/24 192.168.10,16/32 2001 : db 8:1 : /64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Confirmer mot de passe" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "" "Entrez le même mot de passe que précédemment, à des fins de vérification." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Les mots de passe ne correspondent pas ! Vérifiez votre saisie et réessayez." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Actions supplémentaires" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Actions accordées en plus de celles énumérées ci-dessus" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objets" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14142,82 +14936,82 @@ msgstr "" "autorisés. Laissez null pour chercher tous les objets de ce type. Une liste " "de plusieurs termes correspond à un OU logique." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Au moins une action doit être sélectionnée." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Filtre non valide pour {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "La liste des actions accordées par cette permission" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "contraintes" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtre Queryset correspondant aux objets applicables du ou des types " "sélectionnés" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "permission" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "permissions" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "préférences de l'utilisateur" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "" "Clé '{path}'est un nœud feuille ; impossible d'attribuer de nouvelles clés" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "La clé '{path}'est un dictionnaire ; impossible d'attribuer une valeur autre" " que dictionnaire" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "expire" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "utilisé pour la dernière fois" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "clé" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "écriture activée" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Autoriser les opérations de création/mise à jour/suppression à l'aide de " "cette clé" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "adresses IP autorisées" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14226,41 +15020,41 @@ msgstr "" "Laissez ce champ vide pour éviter toute restriction. Par exemple : " "« 10.1.1.0/24, 192.168.10.16/32, 2001 : DB 8:1 : /64 »" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "jeton" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "jetons" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "groupe" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "utilisateur" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Un utilisateur avec ce nom d'utilisateur existe déjà." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Actions personnalisées" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "Objet associé introuvable à l'aide des attributs fournis : {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Plusieurs objets correspondent aux attributs fournis : {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14269,41 +15063,41 @@ msgstr "" "Les objets associés doivent être référencés par un identifiant numérique ou " "par un dictionnaire d'attributs. Valeur non reconnue : {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Objet associé introuvable à l'aide de l'identifiant numérique fourni : {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} a une clé définie mais CHOICES n'est pas une liste" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Le poids doit être un nombre positif" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Valeur non valide '{weight}'pour le poids (doit être un chiffre)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "Unité inconnue {unit}. Doit être l'un des suivants : {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "La longueur doit être un nombre positif" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Valeur non valide '{length}'pour la longueur (doit être un chiffre)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14312,15 +15106,15 @@ msgstr "" "Impossible de supprimer {objects} car {count} objets en " "dépendent : " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Plus de 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Couleur RVB en hexadécimal. Exemple :" -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14329,7 +15123,7 @@ msgstr "" "%s(%r) n'est pas valide. Le paramètre to_model de CounterCacheField doit " "être une chaîne au format « app.model »" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14338,41 +15132,41 @@ msgstr "" "%s(%r) n'est pas valide. Le paramètre to_field de CounterCacheField doit " "être une chaîne au format « field »" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Entrez les données de l'objet au format CSV, JSON ou YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Délimiteur CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "Le caractère qui délimite les champs CSV. S'applique uniquement au format " "CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "Les données du formulaire doivent être vides lors du chargement/de la " "sélection d'un fichier." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Format de données inconnu : {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "" "Impossible de détecter le format des données. Veuillez préciser le format." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Délimiteur CSV non valide" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14381,7 +15175,7 @@ msgstr "" "plusieurs documents ou d'un seul document comprenant une liste de " "dictionnaires." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14390,7 +15184,7 @@ msgstr "" "Liste non valide ({value}). Doit être numérique et les plages doivent être " "classées par ordre croissant." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14398,7 +15192,7 @@ msgstr "" "Spécifiez une ou plusieurs plages numériques séparées par des virgules. " "Exemple : 1 à 5, 20 à 30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14406,17 +15200,18 @@ msgstr "" "Plages non valides ({value}). Il doit s'agir d'une plage d'entiers classés " "par ordre croissant." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Valeur invalide pour un champ à choix multiples : {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objet introuvable : %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14425,20 +15220,20 @@ msgstr "" "«{value}» n'est pas une valeur unique pour ce champ ; plusieurs objets ont " "été trouvés" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "«{field_name}« est un nom de champ d'accès non valide." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Le type d'objet doit être spécifié comme «.»" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Type d'objet non valide" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14448,7 +15243,7 @@ msgstr "" "Les cas et les types mixtes au sein d'une même plage ne sont pas pris en " "charge (exemple : [ge, xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14456,7 +15251,7 @@ msgstr "" "Spécifiez une plage numérique pour créer plusieurs adresses IP.
    Exemple : 192,0,2. [1 500 -254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown est prise en charge" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Identifiant unique utilisable dans les URL" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "Entrez les données de contexte en JSON." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "L'adresse MAC doit être au format EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Utiliser des expressions rationnelles" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Identifiant numérique d'un objet existant à mettre à jour (si aucun nouvel " "objet n'est créé)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "En-tête non reconnu : {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Colonnes disponibles" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Colonnes sélectionnées" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14509,13 +15304,13 @@ msgstr "" "Cet objet a été modifié depuis le rendu du formulaire. Consultez le journal " "des modifications de l'objet pour plus de détails." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "La plage «{value}» n'est pas valide." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14524,73 +15319,73 @@ msgstr "" "Plage non valide : la valeur de fin ({end}) doit être supérieur à la valeur " "de départ ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "En-tête de colonne en double ou en conflit : «{field}»" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "En-tête de colonne en double ou en conflit : «{header}»" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Rangée {row}: il devrait y avoir {count_expected} colonnes mais il y en a " "{count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "En-tête de colonne non prévu : «{field}»." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "" "Colonne »{field}« n'est pas un objet apparenté ; ne peut pas utiliser de " "points" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Attribut d'objet associé non valide pour la colonne »{field}« : {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "En-tête de colonne obligatoire «{header}» introuvable." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Valeur requise manquante pour le paramètre de requête dynamique : " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Valeur requise manquante pour le paramètre de requête statique : " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Le mot de passe doit comporter au moins un chiffre." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Le mot de passe doit comporter au moins une lettre majuscule." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Le mot de passe doit comporter au moins une lettre minuscule." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14598,7 +15393,7 @@ msgstr "" "Votre mot de passe doit contenir au moins un chiffre, une lettre majuscule " "et une lettre minuscule." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14607,125 +15402,125 @@ msgstr "" "Nom de permission invalide : {name}. Doit être dans le format " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "App_label/model_name inconnu pour {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Adresse IP non valide définie pour {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Une colonne nommée {name} est déjà défini pour la table {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Non défini" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Enlever des favoris" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Marque-page" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Cloner" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Vue actuelle" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Toutes les données" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Ajouter un modèle d'exportation" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importer" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Désabonnement" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Souscrire" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Copier dans le presse-papiers" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Ce champ est obligatoire" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Définir à Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Tout effacer" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Configuration de la table" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Déplacer vers le haut" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Déplacer vers le bas" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Rechercher..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Rechercher dans NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Ouvrir le sélecteur" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Écrire" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Le test doit définir csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} n'est pas une expression rationnelle valide." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__} doit implémenter get_required_permission()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} doit implémenter get_required_permission()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14735,61 +15530,63 @@ msgstr "" "ne peut être utilisé que sur les vues qui définissent un objet QuerySet de " "base" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Groupe de parents (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Groupe de parents (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Type de cluster (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Cluster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "processeurs virtuels" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Mémoire (Mo)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Type de cluster" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Groupe de clusters attribué" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Cluster attribué" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Appareil attribué au sein du cluster" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Numéro de série" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14798,50 +15595,50 @@ msgstr "" "{device} appartient à un autre site ({device_site}) puis le cluster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Épinglez éventuellement cette machine virtuelle à un périphérique hôte " "spécifique au sein du cluster" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Site/Cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "La taille du disque est gérée via la connexion de disques virtuels." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disque" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "type de cluster" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "types de clusters" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "groupe de clusters" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "groupes de clusters" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "cluster" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "clusters" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14850,44 +15647,44 @@ msgstr "" "{count} les appareils sont affectés en tant qu'hôtes à ce cluster mais ne " "sont pas sur le site {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "mémoire (Mo)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disque (Mo)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Le nom de la machine virtuelle doit être unique par cluster." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "machine virtuelle" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "machines virtuelles" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" "Une machine virtuelle doit être attribuée à un site et/ou à un cluster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "Le cluster sélectionné ({cluster}) n'est pas attribué à ce site ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "" "Il faut indiquer un cluster lors de l'attribution d'un périphérique hôte." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14895,7 +15692,7 @@ msgstr "" "L'appareil sélectionné ({device}) n'est pas affecté à ce cluster " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14904,19 +15701,19 @@ msgstr "" "La taille de disque indiquée ({size}) doit correspondre à la taille agrégée " "des disques virtuels assignés ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" "Doit être une address IPv{family}. ({ip} est une addresse IPv{version}.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "" "L'adresse IP indiquée ({ip}) n'est pas attribué à cette machine virtuelle." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14925,7 +15722,7 @@ msgstr "" "L'interface parent sélectionnée ({parent}) appartient à une autre machine " "virtuelle ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14934,7 +15731,7 @@ msgstr "" "L'interface de pont sélectionnée ({bridge}) appartient à une autre machine " "virtuelle ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14943,395 +15740,418 @@ msgstr "" "Le VLAN non taggé ({untagged_vlan}) doit appartenir au même site que la " "machine virtuelle parente de l'interface, ou il doit être global." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "taille (Mo)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "disque virtuel" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "disques virtuels" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Ajouté {count} appareils à mettre en cluster {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Supprimé {count} appareils du cluster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPSec - Transport" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP dans IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Spoke" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agressif" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Principal" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Clés pré-partagées" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certificats" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Signatures RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Signatures DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Groupe {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Réseau local privé Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Réseau local privé virtuel Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Arbre privé Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Arbre privé virtuel Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Groupe de tunnels (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Groupe de tunnels (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "profil IPSec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Profil IPSec (nom)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunnel (nom)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "IP externe (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Politique IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Politique IKE (nom)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Politique IPSec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Politique IPSec (nom)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Interface de machine virtuelle (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (nom)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Groupe de tunnels" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Durée de vie de l'association de sécurité (SA)" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Clé pré-partagée" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Politique IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Politique IPSec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Encapsulation du tunnel" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Rôle opérationnel" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Appareil parent à l'interface attribuée" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Machine virtuelle parente de l'interface attribuée" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interface de périphérique ou de machine virtuelle" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Proposition(s) de l'IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Groupe Diffie-Hellman PFS (Perfect Forward Secrecy)" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Proposition(s) IPSec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protocole IPSec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Type de VPN L2" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Appareil parent (pour interface)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Machine virtuelle parente (pour l'interface)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Interface attribuée (appareil ou machine virtuelle)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Impossible d'importer simultanément les terminaisons de l'interface du " "périphérique et de la machine virtuelle." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Chaque terminaison doit spécifier une interface ou un VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Impossible d'attribuer à la fois une interface et un VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Version IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Proposition" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Type d'objet attribué" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Interface de tunnel" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Première extrémité" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Deuxième extrémité" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Ce paramètre est obligatoire lors de la définition d'une terminaison." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Politique" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Une terminaison doit spécifier une interface ou un VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Une terminaison ne peut avoir qu'un seul objet de terminaison (une interface" " ou un VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "algorithme de chiffrement" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "algorithme d'authentification" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ID de groupe Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Durée de vie de l'association de sécurité (en secondes)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Proposal IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Proposals IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "version" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "propositions" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "clé pré-partagée" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Politiques IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Le mode est requis pour la version IKE sélectionnée" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Le mode ne peut pas être utilisé pour la version IKE sélectionnée" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "chiffrement" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "authentification" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Durée de vie de l'association de sécurité (secondes)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Durée de vie de l'association de sécurité (en kilo-octets)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Proposal IPSec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Proposals IPSec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" "Un algorithme de chiffrement et/ou d'authentification doit être défini" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Politiques IPSec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Profils IPSec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Terminaison L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Terminaisons L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Terminaison L2VPN déjà attribuée ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15340,187 +16160,195 @@ msgstr "" "{l2vpn_type} Les L2VPN ne peuvent pas avoir plus de deux terminaisons ; " "trouvé {terminations_count} déjà défini." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "groupe de tunnels" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "groupes de tunnels" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "encapsulation" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ID du tunnel" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunnels" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Un objet ne peut être l'extrémité que d'un seul tunnel." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "terminaison du tunnel" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "terminaisons de tunnels" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} est déjà rattaché à un tunnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Méthode d'authentification" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Algorithme de chiffrement" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algorithme d'authentification" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Durée de vie du SA" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Clé pré-partagée" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Durée de vie de l'association de sécurité (secondes)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Durée de vie de l'association de sécurité (Ko)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Parent de l'objet" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Site de l'objet" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Point d'accès" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Appareil sans-fil" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Ouvert" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personnel (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Entreprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Algorithme de chiffrement pour l'authentification" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Unité de distance" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "VLAN bridgé" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interface A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interface B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Côté B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "algorithme de chiffrement pour l'authentification" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "groupe réseaux sans fil" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "groupes réseaux sans fil" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "Réseau sans fil" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interface A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interface B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "distance" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "unité de distance" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "liaison sans fil" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "liaisons sans fil" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "Vous devez spécifier une unité lors du réglage d'une distance sans fil" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} n'est pas une interface sans fil." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Valeur de canal non valide : {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Attribut de canal non valide : {name}" diff --git a/netbox/translations/it/LC_MESSAGES/django.mo b/netbox/translations/it/LC_MESSAGES/django.mo index 3e357f35d37e0476407cddcfe9fd629ba015ba34..01dc8e853d56c94c280475ccbde0ba7dcae6a248 100644 GIT binary patch delta 65979 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 R)xTq~|MnV1!~CrE{{Z-|%Nzgz diff --git a/netbox/translations/it/LC_MESSAGES/django.po b/netbox/translations/it/LC_MESSAGES/django.po index 6020afea5..21a038c55 100644 --- a/netbox/translations/it/LC_MESSAGES/django.po +++ b/netbox/translations/it/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2024\n" "Language-Team: Italian (https://app.transifex.com/netbox-community/teams/178115/it/)\n" @@ -24,1878 +24,2144 @@ msgstr "" "Language: it\n" "Plural-Forms: nplurals=3; plural=n == 1 ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Chiave" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Scrittura abilitata" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Creato" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Scade" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Ultimo utilizzo" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "IP consentiti" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Effettuato l'accesso come {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Ti sei disconnesso." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Le tue preferenze sono state aggiornate." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "Le credenziali utente autenticate con LDAP non possono essere modificate " "all'interno di NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "La tua password è stata cambiata con successo." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Pianificato" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Approvvigionamento" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Attivo" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Offline" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Deprovisioning" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Dismesso" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Primaria" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Secondario" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Terziario" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Inattivo" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Regione (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Regione (slug)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Gruppo del sito (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Gruppo del sito (slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Sito" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Sito (slug)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Provider (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Provider (slug)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Provider account (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Provider account (account)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Provider network (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Tipo di circuito (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Tipo di circuito (slug)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Sito (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Terminazione A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Cerca" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Circuito" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Provider network (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Circuito (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Circuito (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Gruppo di circuiti (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Gruppo di circuiti (slug)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Descrizione" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Provider " -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "ID del servizio" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Colore" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Tipo" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Provider account " -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Status" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Tenant" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Data di installazione" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Data di dismissione" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Commit ratet (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Parametri del servizio" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Tenancy" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Provider Network" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Port speed (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Upstream speed (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Segna connesso" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Terminazione del circuito" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Dettagli sulla cessazione" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Priorità" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Provider assegnato" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Account provider assegnato" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Tipo di circuito" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Stato operativo" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Tenant assegnato" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Cessazione" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Provider network" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Locazione" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Contatti" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Regione" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Gruppo del sito" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Attributi" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Account" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Lato del termine" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Assegnazione" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Gruppo" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Gruppo Circuit" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "colore" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "tipo di circuito" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "tipi di circuiti" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ID del circuito" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "ID univoco del circuito" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "stato" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "installato" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "termina" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "tasso di commit (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Tariffa impegnata" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "circuito" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "circuiti" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "gruppo di circuiti" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "gruppi di circuiti" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "priorità" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Assegnazione di gruppi di circuiti" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Assegnazioni di gruppi di circuiti" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "fine" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "velocità della porta (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Velocità fisica del circuito" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "velocità upstream (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Velocità upstream, se diversa dalla velocità della porta" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ID di connessione incrociata" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID della connessione incrociata locale" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "pannello di permutazione/porte" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "ID del patch panel e numero/i di porta" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "descrizione" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "terminazione del circuito" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "terminazioni del circuito" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Una terminazione di circuito deve essere collegata a un sito o alla rete di " "un provider." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Una terminazione di circuito non può essere collegata sia a un sito che alla" " rete di un provider." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "nome" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Nome completo del fornitore" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "pallottola" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "fornitore" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "fornitori" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "ID dell'account" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "account del fornitore" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "account del fornitore" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "ID di servizio" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "rete di fornitori" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "reti di fornitori" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Nome" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Circuiti" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "ID circuito" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Lato A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Lato Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Tasso di impegno" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Commenti" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Incarichi" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Account" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Numero di account" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Numero ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Non sono state definite terminazioni per il circuito {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Terminazioni sostituite per circuito {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "" "Questo utente non dispone dell'autorizzazione per sincronizzare questa " "origine dati." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Nuovo" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "In coda" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Sincronizzazione" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Completato" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Fallito" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Script" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Rapporti" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "In sospeso" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Pianificato" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Correre" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Errore" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Aggiornato" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Eliminato" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Finito" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Iniziato" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Differito" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Fermato" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Annullato" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Locale" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Nome utente" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Utilizzato solo per la clonazione con HTTP (S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Password" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Ramo" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Recupero dati remoti non riuscito ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "ID chiave di accesso AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Chiave di accesso segreta AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Oggetto creato" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Oggetto aggiornato" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Oggetto eliminato" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Lavoro iniziato" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Lavoro completato" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Lavoro fallito" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Lavoro errato" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Fonte dati (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Fonte dati (nome)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Utente (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Nome utente" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Abilitato" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parametri" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ignora le regole" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Fonte dati" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "File" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Fonte dati" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Creazione" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Tipo di oggetto" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Creato dopo" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Creato prima" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Pianificato dopo" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Pianificato prima" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Iniziato dopo" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Iniziato prima" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Completato dopo" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Completato prima" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Utente" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Ora" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Dopo" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Prima" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Azione" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Fonte" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Parametri del backend" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Caricamento di file" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "Impossibile caricare un file e sincronizzarlo da un file esistente" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "È necessario caricare un file o selezionare un file di dati da sincronizzare" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Elevazioni dei rack" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Energia" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Sicurezza" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Banner" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Impaginazione" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Validazione" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Preferenze utente" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Varie" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Revisione della configurazione" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "" "Questo parametro è stato definito staticamente e non può essere modificato." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Valore attuale: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (impostazione predefinita)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "tempo" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "nome utente" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "ID della richiesta" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "azione" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "dati precedenti alla modifica" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "dati post-modifica" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "cambio di oggetto" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "modifiche agli oggetti" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "La registrazione delle modifiche non è supportata per questo tipo di oggetto" " ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "creato" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "commento" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "dati di configurazione" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "revisione della configurazione" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "revisioni della configurazione" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Configurazione predefinita" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Configurazione attuale" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Revisione della configurazione #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "tipo" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "abilitato" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignora le regole" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Schemi (uno per riga) corrispondenti ai file da ignorare durante la " "sincronizzazione" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parametri" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "ultima sincronizzazione" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "origine dati" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "fonti di dati" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Tipo di backend sconosciuto: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "" "Impossibile avviare la sincronizzazione. La sincronizzazione è già in corso." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1903,1224 +2169,1286 @@ msgstr "" "Si è verificato un errore durante l'inizializzazione del backend. È " "necessario installare una dipendenza: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "ultimo aggiornamento" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "sentiero" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Percorso del file relativo alla radice dell'origine dati" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "taglia" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "cancelletto" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "La lunghezza deve essere di 64 caratteri esadecimali." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Hash SHA256 dei dati del file" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "file di dati" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "file di dati" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "registrazione di sincronizzazione automatica" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "sincronizzazione automatica dei record" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "radice del file" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "percorso del file" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Percorso del file relativo al percorso principale designato" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "file gestito" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "file gestiti" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "pianificata" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "intervallo" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Intervallo di ricorrenza (in minuti)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "iniziato" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "completato" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "dato" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "errore" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID lavoro" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "occupazione" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "lavori" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "" "I lavori non possono essere assegnati a questo tipo di oggetto ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Stato non valido per la cessazione del lavoro. Le scelte sono: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () non può essere chiamato con valori sia per schedule_at che per " "immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "L'eliminazione è impedita da una regola di protezione: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Nome completo" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Oggetto" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID della richiesta" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "È attivo" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Sentiero" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Ultimo aggiornamento" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervallo" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Versione" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Ultimo aggiornamento" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Versione minima di NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Versione massima di NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Nessun dato del plugin trovato" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Autore" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Installato" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certificato" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Pubblicato" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Versione installata" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Ultima versione" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Attività più vecchia" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Lavoratori" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Ospite" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Porto" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "PID dello scheduler" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Nessuna coda trovata" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "In coda" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Conclusa" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Richiamabile" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Nessuna attività trovata" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Stato" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Nascita" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Nessun lavoratore trovato" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Lavoro in coda #{id} da sincronizzare {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Revisione della configurazione ripristinata #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Lavoro {job_id} non trovato" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Lavoro {id} è stato eliminato." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Errore durante l'eliminazione del lavoro {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Lavoro {id} non trovato." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Lavoro {id} è stato nuovamente accodato." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Lavoro {id} è stato messo in coda." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Lavoro {id} è stato fermato." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Interruzione del lavoro non riuscita {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Impossibile caricare il catalogo dei plugin" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} non trovato" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Posizione (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ID struttura" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Messa in scena" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Smantellamento" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Ritirato" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Telaio a 2 montanti" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Telaio a 4 montanti" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Armadio a 4 montanti" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Telaio a parete" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Telaio a parete (verticale)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Armadio a parete" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Armadio a parete (verticale)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} pollici" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Riservato" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Disponibile" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Obsoleto" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Millimetri" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Pollici" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Da anteriore a posteriore" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Posteriore/anteriore" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Genitore" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Bambino" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Anteriore" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Posteriore" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Messo in scena" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventario" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Da sinistra a destra" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Da destra a sinistra" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Da lato a retro" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Da dietro a lato" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Dal basso verso l'alto" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Dall'alto verso il basso" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passivo" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Misto" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (non bloccante)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (bloccaggio)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Stile californiano" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Internazionale/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Proprietario" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Altro" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Internazionale" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fisico" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtuale" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Wireless" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfacce virtuali" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "ponte" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Link Aggregation Group (GAL)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fisso)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulare)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (backplane)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Cellulare" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seriale" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Coassiale" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "impilamento" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Metà" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Completo" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Accesso" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Taggato" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Contrassegnati (tutti)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Norma IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "24V passivo (2 coppie)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "24V passivo (4 coppie)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "48V passivo (2 coppie)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "48V passivo (4 coppie)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Rame" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fibra ottica" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fibra" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Connesso" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Chilometri" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Metri" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimetri" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Miglia" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Piedi" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Chilogrammi" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Grammi" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Sterline" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Once" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Ridondante" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Monofase" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Trifase" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Formato dell'indirizzo MAC non valido: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Formato WWN non valido: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Regione principale (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Regione madre (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Gruppo del sito principale (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Gruppo del sito principale (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Gruppo (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Gruppo (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "COME (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Sede principale (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Sede principale (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Ubicazione (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Posizione (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Produttore (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Produttore (lumaca)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Tipo di rack (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Tipo di rack (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Ruolo (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Ruolo (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Cremagliera (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Utente (nome)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Piattaforma predefinita (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Piattaforma predefinita (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Ha un'immagine frontale" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Ha un'immagine posteriore" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Dispone di porte per console" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Dispone di porte console server" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Dispone di porte di alimentazione" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Dispone di prese di corrente" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Dispone di interfacce" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Dispone di porte pass-through" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Dispone di alloggiamenti per moduli" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Dispone di alloggiamenti per dispositivi" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Ha articoli di inventario" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Tipo di dispositivo (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Tipo di modulo (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Porta di alimentazione (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Articolo di inventario principale (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Modello di configurazione (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Tipo di dispositivo (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Dispositivo principale (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Piattaforma (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Piattaforma (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Nome del sito (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Bambino per genitori (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Cluster VM (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Gruppo Cluster (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Gruppo cluster (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Modello del dispositivo (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "È a piena profondità" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "Indirizzo MAC" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Ha un IP primario" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Ha un IP fuori banda" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Chassis virtuale (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "È un membro virtuale dello chassis" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Ha un contesto di dispositivo virtuale" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Modello del dispositivo" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interfaccia (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Tipo di modulo (modello)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Alloggiamento per moduli (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Dispositivo (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (nome)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Dispositivo (nome)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Tipo di dispositivo (modello)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Ruolo del dispositivo (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Ruolo del dispositivo (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Chassis virtuale (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Chassis virtuale" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Modulo (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Cavo (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "VLAN assegnata" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "VID assegnato" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (ROSSO)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Interfacce virtuali dello chassis per dispositivi" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Interfacce virtuali dello chassis per dispositivi (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Tipo di interfaccia" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Interfaccia principale (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Interfaccia con ponte (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Interfaccia LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Contesto del dispositivo virtuale" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Contesto del dispositivo virtuale (identificatore)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "LAN senza fili" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Collegamento wireless" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Alloggiamento del modulo principale (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Modulo installato (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Dispositivo installato (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Dispositivo installato (nome)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Maestro (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (nome)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Inquilino (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Inquilino (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Interminato" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Pannello di alimentazione (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Etichette" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Posizione" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3128,844 +3456,924 @@ msgstr "" "Sono supportati gli intervalli alfanumerici. (Deve corrispondere al numero " "di nomi da creare.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Nome del contatto" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Telefono di contatto" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "E-mail di contatto" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Fuso orario" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Produttore" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Fattore di forma" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Larghezza" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Altezza (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Unità discendenti" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Larghezza esterna" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Profondità esterna" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Unità esterna" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Profondità di montaggio" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Peso" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Peso massimo" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Unità di peso" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Tipo di rack" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dimensioni esterne" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensioni" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numerazione" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Ruolo" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Tipo di rack" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Numero di serie" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Etichetta dell'asset" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Flusso d'aria" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "cremagliera" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Piattaforma predefinita" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Numero del pezzo" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Altezza U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Escludi dall'utilizzo" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Tipo di dispositivo" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Tipo di modulo" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Telaio" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Ruolo VM" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Modello di configurazione" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Tipo di dispositivo" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Ruolo del dispositivo" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "piattaforma" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Grappolo" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Dispositivo" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configurazione" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualizzazione" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Tipo di modulo" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Etichetta" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Lunghezza" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Unità di lunghezza" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Dominio" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Pannello di alimentazione" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Fornitura" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Voltaggio" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Amperaggio" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Utilizzo massimo" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Pareggio massimo" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Potenza massima assorbita (watt)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Pareggio assegnato" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Potenza assorbita allocata (watt)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Porta di alimentazione" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Gamba di alimentazione" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Solo gestione" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "modalità PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Tipo PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Ruolo wireless" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modulo" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "RITARDO" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Contesti dei dispositivi virtuali" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Velocità" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "modalità" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Gruppo VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN senza tag" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Taggato VLAN" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Gruppo LAN wireless" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "LAN wireless" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Indirizzamento" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operazione" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Interfacce correlate" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Commutazione 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "" "La modalità di interfaccia deve essere specificata per assegnare le VLAN" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" "A un'interfaccia di accesso non possono essere assegnate VLAN con tag." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Nome della regione madre" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Nome del gruppo del sito principale" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Regione assegnata" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Gruppo assegnato" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "opzioni disponibili" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Sito assegnato" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Sede del genitore" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Posizione non trovata." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Il produttore di questo tipo di rack" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "La posizione con il numero più basso nel rack" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Larghezza da rotaia a rotaia (in pollici)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Unità per dimensioni esterne" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Unità per pesi a scaffale" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Nome dell'inquilino assegnato" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Nome del ruolo assegnato" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Direzione del flusso d'aria" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Sito principale" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Posizione del rack (se presente)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Unità" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Elenco separato da virgole di numeri di unità individuali" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Il produttore che produce questo tipo di dispositivo" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "La piattaforma predefinita per dispositivi di questo tipo (opzionale)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Peso del dispositivo" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Unità per il peso del dispositivo" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Peso del modulo" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Unità per il peso del modulo" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Limita le assegnazioni delle piattaforme a questo produttore" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Ruolo assegnato" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Produttore del tipo di dispositivo" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Tipo di dispositivo modello" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Piattaforma assegnata" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Chassis virtuale" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Cluster di virtualizzazione" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Posizione assegnata (se presente)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Rack assegnato (se presente)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Viso" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Faccia del rack montata" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Dispositivo principale (per dispositivi per bambini)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Alloggiamento per dispositivi" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Alloggiamento del dispositivo in cui è installato questo dispositivo (per " "dispositivi per bambini)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Il dispositivo in cui è installato questo modulo" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "alloggiamento per moduli" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "L'alloggiamento del modulo in cui è installato questo modulo" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Il tipo di modulo" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Componenti replicati" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3973,264 +4381,271 @@ msgstr "" "Compila automaticamente i componenti associati a questo tipo di modulo " "(abilitato per impostazione predefinita)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Adotta i componenti" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Adotta componenti già esistenti" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Tipo di porta" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Velocità della porta in bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Tipo di presa" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Porta di alimentazione locale che alimenta questa presa" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Fase elettrica (per circuiti trifase)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interfaccia principale" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Interfaccia con ponte" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Ritardo" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Interfaccia LAG principale" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdc" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Nomi VDC separati da virgole, racchiusi tra virgolette doppie. Esempio:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Supporto fisico" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Duplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "modalità Poe" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Tipo Poe" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Modalità operativa IEEE 802.1Q (per interfacce L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "VRF assegnato" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Ruolo Rf" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Ruolo wireless (AP/stazione)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} non è assegnato al dispositivo {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Porta posteriore" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Porta posteriore corrispondente" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Classificazione del mezzo fisico" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Dispositivo installato" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "" "Dispositivo per bambini installato all'interno di questo alloggiamento" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Dispositivo secondario non trovato." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Articolo di inventario principale" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Tipo di componente" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Tipo di componente" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Nome del componente" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Nome del componente" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Componente non trovato: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Dispositivo lato A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Nome del dispositivo" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Tipo Lato A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Tipo di terminazione" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Nome del lato A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Nome della cessazione" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Dispositivo lato B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Tipo B laterale" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Nome lato B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Stato della connessione" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Lato {side_upper}: {device} {termination_object} è già connesso" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} terminazione laterale non trovata: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Maestro" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Dispositivo master" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Nome del sito principale" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Pannello di alimentazione upstream" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primario o ridondante" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Tipo di alimentazione (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Monofase o trifase" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "IPv4 primario" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Indirizzo IPv4 con maschera, ad esempio 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "IPv6 primario" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Indirizzo IPv6 con lunghezza del prefisso, ad esempio 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4240,7 +4655,7 @@ msgstr "" "dispositivo/macchina virtuale principale dell'interfaccia oppure devono " "essere globali" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4248,7 +4663,7 @@ msgstr "" "Impossibile installare un modulo con valori segnaposto in un alloggiamento " "per moduli senza una posizione definita." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4257,189 +4672,200 @@ msgstr "" "Impossibile installare un modulo con valori segnaposto in un albero di " "alloggiamento del modulo {level} in un albero ma {tokens} segnaposto dati." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Non può adottare {model} {name} in quanto appartiene già a un modulo" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "UN {model} denominato {name} esiste già" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Pannello di alimentazione" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Alimentazione" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Lato" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Stato del dispositivo" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Regione principale" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Gruppo di genitori" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Struttura" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Tipo di rack" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Funzione" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Immagini" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Componenti" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Ruolo del dispositivo secondario" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modello" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Ha un IP OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Membro virtuale dello chassis" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Dispone di contesti di dispositivi virtuali" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Gruppo Cluster" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "cablato" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Occupato" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Connessione" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Gentile" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Solo gestione" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Canale wireless" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Frequenza del canale (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Larghezza del canale (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Potenza di trasmissione (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Cavo" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Scoperto" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "" "Un membro virtuale dello chassis esiste già in posizione {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Informazioni di contatto" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Ruolo del rack" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "lumaca" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Seleziona un tipo di rack predefinito o imposta le caratteristiche fisiche " "di seguito." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Controllo dell'inventario" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4447,147 +4873,174 @@ msgstr "" "Elenco separato da virgole di ID di unità numeriche. È possibile specificare" " un intervallo utilizzando un trattino." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Prenotazione" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Ruolo del dispositivo" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "L'unità con il numero più basso occupata dal dispositivo" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "La posizione nello chassis virtuale da cui viene identificato questo " "dispositivo" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "La priorità del dispositivo nello chassis virtuale" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" "Compila automaticamente i componenti associati a questo tipo di modulo" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Caratteristiche" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Modello di porta console" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Modello di porta del server console" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Modello di porta anteriore" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Modello di interfaccia" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Modello di presa di corrente" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Modello di porta di alimentazione" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Modello di porta posteriore" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interfaccia" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Porta console" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Porta Console Server" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Porta anteriore" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Porta posteriore" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Porta di alimentazione" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Presa di corrente" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Assegnazione dei componenti" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Un InventoryItem può essere assegnato solo a un singolo componente." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Interfaccia LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtra le VLAN disponibili per l'assegnazione per gruppo." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Dispositivo per bambini" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4595,32 +5048,35 @@ msgstr "" "I dispositivi secondari devono prima essere creati e assegnati al sito e al " "rack del dispositivo principale." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Porta console" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Porta console server" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Porta anteriore" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Presa di corrente" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Articolo di inventario" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Ruolo dell'articolo di inventario" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4628,7 +5084,7 @@ msgstr "" "Sono supportati gli intervalli alfanumerici. (Deve corrispondere al numero " "di oggetti da creare.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4637,18 +5093,19 @@ msgstr "" "Il modello fornito specifica {value_count} valori, ma {pattern_count} sono " "attesi." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Porte posteriori" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Seleziona un'assegnazione della porta posteriore per ogni porta anteriore da" " creare." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4658,16 +5115,7 @@ msgstr "" "corrispondere al numero selezionato di posizioni delle porte posteriori " "({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"La corda {module} verrà sostituita dalla posizione del modulo " -"assegnato, se presente." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4677,17 +5125,18 @@ msgstr "" " al numero selezionato di posizioni delle porte posteriori " "({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Membri" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Posizione iniziale" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4695,69 +5144,71 @@ msgstr "" "Posizione del primo dispositivo membro. Aumenta di uno per ogni membro " "aggiuntivo." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "È necessario specificare una posizione per il primo membro VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "etichetta" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "lunghezza" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "unità di lunghezza" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "cavo" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "cavi" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "" "È necessario specificare un'unità quando si imposta la lunghezza del cavo" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" "È necessario definire le terminazioni A e B quando si crea un nuovo cavo." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Non è possibile collegare tipi di terminazione diversi alla stessa estremità" " del cavo." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Tipi di terminazione incompatibili: {type_a} e {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Le terminazioni A e B non possono connettersi allo stesso oggetto." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "fine" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "terminazione del cavo" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "terminazioni dei cavi" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4766,38 +5217,38 @@ msgstr "" "È stata rilevata una terminazione duplicata per {app_label}.{model} " "{termination_id}: cavo {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "I cavi non possono essere terminati {type_display} interfacce" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Le terminazioni dei circuiti collegate alla rete di un provider potrebbero " "non essere cablate." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "è attivo" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "è completo" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "è diviso" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "percorso via cavo" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "percorsi via cavo" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4806,18 +5257,18 @@ msgstr "" "{module} è accettato come sostituto della posizione dell'alloggiamento del " "modulo quando è collegato a un tipo di modulo." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Etichetta fisica" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "I modelli di componente non possono essere spostati su un tipo di " "dispositivo diverso." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4825,7 +5276,7 @@ msgstr "" "Un modello di componente non può essere associato sia a un tipo di " "dispositivo che a un tipo di modulo." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4833,142 +5284,142 @@ msgstr "" "Un modello di componente deve essere associato a un tipo di dispositivo o a " "un tipo di modulo." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "modello di porta console" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "modelli di porte per console" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "modello di porta console server" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "modelli di porte per console server" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "pareggio massimo" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "pareggio assegnato" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "modello di porta di alimentazione" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "modelli di porte di alimentazione" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Il pareggio assegnato non può superare il pareggio massimo " "({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "gamba di alimentazione" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fase (per alimentazioni trifase)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "modello di presa di corrente" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "modelli di prese di corrente" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Porta di alimentazione principale ({power_port}) deve appartenere allo " "stesso tipo di dispositivo" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Porta di alimentazione principale ({power_port}) deve appartenere allo " "stesso tipo di modulo" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "solo gestione" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "interfaccia bridge" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "ruolo wireless" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "modello di interfaccia" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "modelli di interfaccia" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Un'interfaccia non può essere collegata a se stessa." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Interfaccia bridge ({bridge}) deve appartenere allo stesso tipo di " "dispositivo" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "" "Interfaccia bridge ({bridge}) deve appartenere allo stesso tipo di modulo" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "posizione della porta posteriore" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "modello di porta anteriore" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "modelli di porte anteriori" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "" "Porta posteriore ({name}) deve appartenere allo stesso tipo di dispositivo" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4977,48 +5428,48 @@ msgstr "" "Posizione della porta posteriore non valida ({position}); porta posteriore " "{name} ha solo {count} posizioni" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "posizioni" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "modello di porta posteriore" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "modelli di porte posteriori" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "posizione" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identificatore a cui fare riferimento quando si rinominano i componenti " "installati" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "modello di alloggiamento del modulo" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "modelli module bay" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "modello di alloggiamento per dispositivi" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "modelli di alloggiamento per dispositivi" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5027,208 +5478,213 @@ msgstr "" "Ruolo del tipo di dispositivo secondario ({device_type}) deve essere " "impostato su «principale» per consentire gli alloggiamenti dei dispositivi." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID della parte" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identificativo del pezzo assegnato dal produttore" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "modello di articolo di inventario" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "modelli di articoli di inventario" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "I componenti non possono essere spostati su un dispositivo diverso." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "estremità del cavo" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "contrassegnare connesso" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Tratta come se fosse collegato un cavo" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" "È necessario specificare l'estremità del cavo (A o B) quando si collega un " "cavo." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "L'estremità del cavo non deve essere impostata senza un cavo." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Non è possibile contrassegnare come connesso con un cavo collegato." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} i modelli devono dichiarare una proprietà parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Tipo di porta fisica" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "velocità" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Velocità della porta in bit al secondo" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "porta console" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "porte console" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "porta console server" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "porte console server" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "porta di alimentazione" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "porte di alimentazione" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "presa di corrente" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "prese di corrente" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Porta di alimentazione principale ({power_port}) deve appartenere allo " "stesso dispositivo" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "modalità" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Strategia di etichettatura IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "interfaccia principale" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "GAL capogruppo" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Questa interfaccia viene utilizzata solo per la gestione fuori banda" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "velocità (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "bifamiliare" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "Nome mondiale a 64 bit" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "canale wireless" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "frequenza del canale (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Popolato dal canale selezionato (se impostato)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "potenza di trasmissione (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "LAN wireless" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN senza tag" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLAN contrassegnate" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interfaccia" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfacce" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} alle interfacce non è possibile collegare un cavo." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" "{display_type} le interfacce non possono essere contrassegnate come " "connesse." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Un'interfaccia non può essere la propria madre." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Solo le interfacce virtuali possono essere assegnate a un'interfaccia " "principale." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5237,7 +5693,7 @@ msgstr "" "L'interfaccia principale selezionata ({interface}) appartiene a un " "dispositivo diverso ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5246,7 +5702,7 @@ msgstr "" "L'interfaccia principale selezionata ({interface}) appartiene a {device}, " "che non fa parte dello chassis virtuale {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5255,7 +5711,7 @@ msgstr "" "L'interfaccia bridge selezionata ({bridge}) appartiene a un dispositivo " "diverso ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5264,16 +5720,16 @@ msgstr "" "L'interfaccia bridge selezionata ({interface}) appartiene a {device}, che " "non fa parte dello chassis virtuale {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" "Le interfacce virtuali non possono avere un'interfaccia LAG principale." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Un'interfaccia LAG non può essere la propria interfaccia principale." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5281,7 +5737,7 @@ msgstr "" "L'interfaccia LAG selezionata ({lag}) appartiene a un dispositivo diverso " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5290,51 +5746,51 @@ msgstr "" "L'interfaccia LAG selezionata ({lag}) appartiene a {device}, che non fa " "parte dello chassis virtuale {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Le interfacce virtuali non possono avere una modalità PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Le interfacce virtuali non possono avere un tipo PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "" "È necessario specificare la modalità PoE quando si designa un tipo PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "Il ruolo wireless può essere impostato solo sulle interfacce wireless." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Il canale può essere impostato solo su interfacce wireless." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "La frequenza del canale può essere impostata solo sulle interfacce wireless." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "Impossibile specificare una frequenza personalizzata con il canale " "selezionato." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "La larghezza del canale può essere impostata solo sulle interfacce wireless." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Impossibile specificare una larghezza personalizzata con il canale " "selezionato." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5343,25 +5799,25 @@ msgstr "" "La VLAN senza tag ({untagged_vlan}) deve appartenere allo stesso sito del " "dispositivo principale dell'interfaccia o deve essere globale." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Posizione mappata sulla porta posteriore corrispondente" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "porta anteriore" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "porte anteriori" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "" "Porta posteriore ({rear_port}) deve appartenere allo stesso dispositivo" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5370,19 +5826,19 @@ msgstr "" "Posizione della porta posteriore non valida ({rear_port_position}): Porta " "posteriore {name} ha solo {positions} posizioni." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Numero di porte anteriori che possono essere mappate" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "porta posteriore" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "porte posteriori" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5391,40 +5847,41 @@ msgstr "" "Il numero di posizioni non può essere inferiore al numero di porte frontali " "mappate ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "alloggiamento per moduli" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "alloggiamenti per moduli" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Un alloggiamento per moduli non può appartenere a un modulo installato al " "suo interno." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "alloggiamento per dispositivi" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "alloggiamenti per dispositivi" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Questo tipo di dispositivo ({device_type}) non supporta gli alloggiamenti " "per dispositivi." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Impossibile installare un dispositivo su se stesso." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5432,118 +5889,120 @@ msgstr "" "Impossibile installare il dispositivo specificato; il dispositivo è già " "installato in {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "ruolo dell'articolo di inventario" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "ruoli degli articoli di inventario" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "numero di serie" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "etichetta dell'asset" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Un tag univoco utilizzato per identificare questo articolo" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "scoperto" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Questo articolo è stato scoperto automaticamente" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "articolo di inventario" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "articoli di inventario" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Non può assegnarsi come genitore." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "" "L'articolo dell'inventario principale non appartiene allo stesso " "dispositivo." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Impossibile spostare un articolo dell'inventario con figli a carico" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Impossibile assegnare un articolo di inventario a un componente su un altro " "dispositivo" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "produttore" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "produttori" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "modello" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "piattaforma predefinita" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "numero del pezzo" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Numero di parte discreto (opzionale)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "altezza (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "escludere dall'utilizzo" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "I dispositivi di questo tipo sono esclusi dal calcolo dell'utilizzo del " "rack." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "è a piena profondità" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "" "Il dispositivo consuma entrambe le facce del rack anteriore e posteriore." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "stato genitore/figlio" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5552,24 +6011,24 @@ msgstr "" "alloggiamenti dei dispositivi. Lascia vuoto se questo tipo di dispositivo " "non è né un genitore né un bambino." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "flusso d'aria" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "tipo di dispositivo" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "tipi di dispositivi" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "L'altezza U deve essere espressa in incrementi di 0,5 unità rack." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5578,7 +6037,7 @@ msgstr "" "Dispositivo {device} nella cremagliera {rack} non dispone di spazio " "sufficiente per ospitare un'altezza di {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5588,7 +6047,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} casi già montato all'interno di " "rack." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5597,155 +6056,155 @@ msgstr "" "associati a questo dispositivo prima di declassificarlo come dispositivo " "principale." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "I tipi di dispositivi per bambini devono essere 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "tipo di modulo" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "tipi di moduli" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Le macchine virtuali possono essere assegnate a questo ruolo" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "ruolo del dispositivo" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "ruoli dei dispositivi" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Facoltativamente, limita questa piattaforma ai dispositivi di un determinato" " produttore" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "piattaforma" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "piattaforme" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "La funzione utilizzata da questo dispositivo" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Numero di serie del telaio, assegnato dal produttore" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Un tag univoco utilizzato per identificare questo dispositivo" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "posizione (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "faccia cremagliera" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "IPv4 primario" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "IPv6 primario" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP fuori banda" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Posizione VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Posizione virtuale dello chassis" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Priorità VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Priorità di elezione del master dello chassis virtuale" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "latitudine" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Coordinate GPS in formato decimale (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "longitudine" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Il nome del dispositivo deve essere univoco per sito." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "dispositivo" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "dispositivi" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "cremagliera {rack} non appartiene al sito {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Posizione {location} non appartiene al sito {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "cremagliera {rack} non appartiene alla località {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "" "Non è possibile selezionare una faccia del rack senza assegnare un rack." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "" "Non è possibile selezionare una posizione del rack senza assegnare un rack." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "La posizione deve essere in incrementi di 0,5 unità rack." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "È necessario specificare la faccia del rack quando si definisce la posizione" " del rack." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5753,7 +6212,7 @@ msgstr "" "Un tipo di dispositivo 0U ({device_type}) non può essere assegnato a una " "posizione nel rack." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5761,7 +6220,7 @@ msgstr "" "I tipi di dispositivi per bambini non possono essere assegnati a un rack. " "Questo è un attributo del dispositivo principale." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5769,7 +6228,7 @@ msgstr "" "I tipi di dispositivi per bambini non possono essere assegnati a una " "posizione rack. Questo è un attributo del dispositivo principale." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5778,23 +6237,23 @@ msgstr "" "U{position} è già occupato o non dispone di spazio sufficiente per ospitare " "questo tipo di dispositivo: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} non è un indirizzo IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" "L'indirizzo IP specificato ({ip}) non è assegnato a questo dispositivo." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} non è un indirizzo IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5804,18 +6263,18 @@ msgstr "" "dispositivo, ma il tipo di questo dispositivo appartiene a " "{devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Il cluster assegnato appartiene a un sito diverso ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "La posizione di un dispositivo assegnato a uno chassis virtuale deve essere " "definita." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5824,15 +6283,15 @@ msgstr "" "Il dispositivo non può essere rimosso dallo chassis virtuale " "{virtual_chassis} perché attualmente è designato come suo padrone." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "modulo" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "moduli" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5841,22 +6300,22 @@ msgstr "" "Il modulo deve essere installato all'interno di un vano del modulo " "appartenente al dispositivo assegnato ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "dominio" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "chassis virtuale" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "Il master selezionato ({master}) non è assegnato a questo chassis virtuale." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5865,105 +6324,105 @@ msgstr "" "Impossibile eliminare lo chassis virtuale {self}. Esistono interfacce tra i " "membri che formano interfacce GAL trasversali." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identificatore" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Identificatore numerico univoco per il dispositivo principale" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "commenti" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "contesto del dispositivo virtuale" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "contesti dei dispositivi virtuali" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} non è un IPv{family} indirizzo." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "L'indirizzo IP primario deve appartenere a un'interfaccia sul dispositivo " "assegnato." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "peso" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "unità di peso" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "È necessario specificare un'unità quando si imposta un peso" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "pannello di alimentazione" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "pannelli di alimentazione" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "" "Posizione {location} ({location_site}) si trova in un sito diverso da {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "approvvigionamento" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "fase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "voltaggio" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "amperaggio" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "utilizzo massimo" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Estrazione massima consentita (percentuale)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "potenza disponibile" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "alimentazione" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "alimentazioni" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5972,63 +6431,63 @@ msgstr "" "cremagliera {rack} ({rack_site}) e pannello di alimentazione {powerpanel} " "({powerpanel_site}) si trovano in siti diversi." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "La tensione non può essere negativa per l'alimentazione AC" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "larghezza" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Larghezza da rotaia a rotaia" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Altezza nelle unità rack" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "unità di partenza" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Unità di partenza per cremagliera" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "unità discendenti" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Le unità sono numerate dall'alto verso il basso" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "larghezza esterna" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Dimensione esterna del rack (larghezza)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "profondità esterna" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Dimensione esterna del rack (profondità)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "unità esterna" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "profondità di montaggio" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6036,76 +6495,77 @@ msgstr "" "Profondità massima di un dispositivo montato, in millimetri. Per i rack a " "quattro montanti, questa è la distanza tra le guide anteriore e posteriore." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "peso massimo" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Capacità di carico massima per il rack" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "fattore di forma" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "tipo di rack" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "tipi di rack" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "È necessario specificare un'unità quando si imposta una larghezza/profondità" " esterna" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "È necessario specificare un'unità quando si imposta un peso massimo" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "ruolo rack" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "ruoli rack" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID struttura" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Identificatore assegnato localmente" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Ruolo funzionale" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Un tag univoco utilizzato per identificare questo rack" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "scaffale" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "griglie" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "La posizione assegnata deve appartenere al sito principale ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6114,7 +6574,7 @@ msgstr "" "Il rack deve essere almeno {min_height}Parlo per ospitare i dispositivi " "attualmente installati." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6123,895 +6583,957 @@ msgstr "" "La numerazione delle unità rack deve iniziare da {position} o meno per " "ospitare i dispositivi attualmente installati." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "La posizione deve provenire dallo stesso sito, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "unità" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "prenotazione del rack" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "Tieni traccia delle prenotazioni" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Unità non valide per {height}Rack U: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Le seguenti unità sono già state prenotate: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Esiste già una regione di primo livello con questo nome." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Esiste già una regione di primo livello con questo slug." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "regione" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regioni" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Esiste già un gruppo del sito principale con questo nome." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Esiste già un gruppo del sito di primo livello con questo slug." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "gruppo del sito" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "gruppi del sito" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Nome completo del sito" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "servizio, struttura" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ID o descrizione della struttura locale" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "indirizzo fisico" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Ubicazione fisica dell'edificio" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "indirizzo di spedizione" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Se diverso dall'indirizzo fisico" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "sito" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "siti" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "" "Una posizione con questo nome esiste già all'interno del sito specificato." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "" "Una posizione con questo slug esiste già all'interno del sito specificato." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "posizione" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "posizioni" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Sede principale ({parent}) deve appartenere allo stesso sito ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Terminazione A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Terminazione B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Dispositivo A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Dispositivo B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Ubicazione A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Luogo B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Cremagliera A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Cremagliera B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Sito A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Sito B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Raggiungibile" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Dispositivi" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VM" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Modello di configurazione" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Gruppo del sito" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "Indirizzo IP" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Indirizzo IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Indirizzo IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Posizione VC" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Priorità VC" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Dispositivo principale" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Posizione (vano dispositivo)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Porte console" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Porte console server" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Porte di alimentazione" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Prese di corrente" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfacce" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Porte anteriori" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Alloggiamenti per dispositivi" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Alloggiamenti per moduli" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Articoli di inventario" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Modulo Bay" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Articoli di inventario" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Colore del cavo" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Collegamento tra colleghi" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Contrassegna connesso" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Assorbimento massimo (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Pareggio assegnato (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "Indirizzi IP" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Gruppi FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Solo gestione" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Modulo installato" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Modulo seriale" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Tag delle risorse del modulo" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Stato del modulo" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Componente" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Oggetti" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Tipi di dispositivi" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Tipi di moduli" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "piattaforme" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Piattaforma predefinita" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Profondità completa" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Altezza U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Istanze" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Porte console" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Porte Console Server" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Porte di alimentazione" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Prese di corrente" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Porte anteriori" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Porte posteriori" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Alloggiamenti per dispositivi" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Baie per moduli" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Alimenti di alimentazione" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Utilizzo massimo" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Potenza disponibile (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Scaffali" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Altezza" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Larghezza esterna" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Profondità esterna" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Peso massimo" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Spazio" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Siti" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Il test case deve impostare peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Disconnesso {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Prenotazioni" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Dispositivi non montati su rack" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Contesto di configurazione" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Configurazione del rendering" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Si è verificato un errore durante il rendering del modello: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Macchine virtuali" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Dispositivo installato {device} nella baia {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Dispositivo rimosso {device} dalla baia {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Bambini" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Membro aggiunto {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Impossibile rimuovere il dispositivo master {device} dallo chassis virtuale." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Rimosso {device} da chassis virtuale {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Oggetti correlati sconosciuti: {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "La modifica del tipo di campi personalizzati non è supportata." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "La pianificazione non è abilitata per questo script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Testo" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Testo (lungo)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Numero intero" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Decimale" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Booleano (vero/falso)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Data" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Data e ora" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Selezione" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Selezione multipla" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Oggetti multipli" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Disabili" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Sciolto" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Esatto" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Sempre" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Se impostato" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Nascosto" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "sì" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "No" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Link" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Più recente" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Il più vecchio" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabetico (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabetico (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Informazioni" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Successo" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Avvertenza" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Pericolo" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Eseguire il debug" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Predefinito" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Fallimento" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Ogni ora" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 ore" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Quotidiano" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Settimanale" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 giorni" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Crea" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Aggiornamento" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Elimina" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Blu" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indaco" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Viola" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Rosa" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Rosso" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "arancia" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Giallo" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Verde" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "color tè blu" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Ciano" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Grigio" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Nero" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "bianco" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Sceneggiatura" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Notifica" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "" "Operatore sconosciuto: {op}. Deve essere uno dei seguenti: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Tipo di valore non supportato: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Tipo non valido per {op} operazione: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Il set di regole deve essere un dizionario, non {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Tipo di logica non valido: deve essere 'AND' o 'OR'. Controlla la " "documentazione." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Chiavi errate comunicate. Si prega di controllare la documentazione." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Tipo di widget" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Classe widget non registrata: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} deve definire un metodo render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Nota" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Visualizza alcuni contenuti personalizzati arbitrari. Markdown è supportato." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Conteggi oggetti" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -7019,271 +7541,293 @@ msgstr "" "Visualizza un set di modelli NetBox e il numero di oggetti creati per ogni " "tipo." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtri da applicare durante il conteggio del numero di oggetti" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Formato non valido. I filtri degli oggetti devono essere passati come " "dizionario." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Elenco oggetti" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Visualizza un elenco arbitrario di oggetti." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Il numero predefinito di oggetti da visualizzare" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Formato non valido. I parametri URL devono essere passati come dizionario." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "Feed RSS" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Incorpora un feed RSS da un sito Web esterno." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL del feed" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Il numero massimo di oggetti da visualizzare" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "" "Per quanto tempo conservare il contenuto memorizzato nella cache (in " "secondi)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Segnalibri" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Mostra i tuoi segnalibri personali" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Tipo di azione sconosciuto per una regola di evento: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Impossibile importare la pipeline di eventi {name} errore: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Modulo script (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "File di dati (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Gruppo (nome)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Tipo di cluster" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Tipo di cluster (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Gruppo di inquilini" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Gruppo di inquilini (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Etichetta" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Etichetta (lumaca)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Dispone di dati di contesto di configurazione locali" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Nome del gruppo" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Richiesto" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Deve essere unico" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Interfaccia utente visibile" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Interfaccia utente modificabile" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "È clonabile" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Valore minimo" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Valore massimo" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Regex di convalida" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Comportamento" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nuova finestra" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Classe Button" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Tipo MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Estensione del file" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Come allegato" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Condiviso" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Metodo HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL del payload" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Verifica SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Segreto" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Percorso del file CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Tipi di eventi" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "È attivo" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Tipi di oggetti" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Uno o più tipi di oggetti assegnati" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Tipo di dati del campo (ad esempio testo, numero intero, ecc.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Tipo di oggetto" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Tipo di oggetto (per campi oggetto o multioggetto)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Set a scelta" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Set di scelte (per i campi di selezione)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Se il campo personalizzato viene visualizzato nell'interfaccia utente" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Se il campo personalizzato è modificabile nell'interfaccia utente" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "L'insieme base di scelte predefinite da utilizzare (se presenti)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7292,185 +7836,201 @@ msgstr "" "opzionali separate da due punti: «Scelta 1:prima scelta, scelta 2: seconda " "scelta»" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "classe di pulsanti" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "La classe del primo link di un gruppo verrà utilizzata per il pulsante a " "discesa" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "I tipi di evento che attiveranno questa regola" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Oggetto d'azione" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Nome o script del webhook come percorso punteggiato module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} non trovato" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Sceneggiatura {name} non trovato" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Tipo di oggetto assegnato" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "La classificazione degli ingressi" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Utenti" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Nomi utente separati da virgole, racchiusi tra virgolette" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Gruppi" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Nomi di gruppo separati da virgole, racchiusi tra virgolette doppie" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Tipo di oggetto correlato" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Tipo di campo" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Scelte" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Dati" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "File di dati" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Tipi di contenuto" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Tipo di contenuto HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Tipo di evento" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Tipo di azione" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Tipo di oggetto con tag" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Tipo di oggetto consentito" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regioni" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Gruppi del sito" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Sedi" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Tipi di dispositivi" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Ruoli" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Tipi di cluster" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Gruppi di cluster" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Cluster" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Gruppi di inquilini" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "I tipi di oggetto che hanno questo campo personalizzato" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Valore predefinito" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Tipo di oggetto correlato (solo per i campi oggetto/multioggetto)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filtro oggetto correlato" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Specifica i parametri della query come oggetto JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Campo personalizzato" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7478,7 +8038,7 @@ msgstr "" "Il tipo di dati memorizzati in questo campo. Per i campi " "oggetti/multioggetto, seleziona il tipo di oggetto correlato di seguito." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7486,11 +8046,11 @@ msgstr "" "Questo verrà visualizzato come testo di aiuto per il campo del modulo. " "Markdown è supportato." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Oggetto correlato" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7498,15 +8058,16 @@ msgstr "" "Inserisci una scelta per riga. È possibile specificare un'etichetta " "opzionale per ciascuna scelta aggiungendola con i due punti. Esempio:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Link personalizzato" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Modelli" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7516,7 +8077,7 @@ msgstr "" "come {example}. I link che vengono visualizzati come testo vuoto non " "verranno visualizzati." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7524,55 +8085,61 @@ msgstr "" "Codice modello Jinja2 per l'URL del link. Fai riferimento all'oggetto come " "{example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Codice modello" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Modello di esportazione" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Rendering" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Il contenuto del modello viene compilato dalla fonte remota selezionata di " "seguito." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "È necessario specificare il contenuto locale o un file di dati" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Filtro salvato" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Un gruppo di notifiche specifica almeno un utente o un gruppo." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Richiesta HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Scelta dell'azione" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "" "Inserisci le condizioni in JSON formato." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7580,111 +8147,113 @@ msgstr "" "Inserisci i parametri da passare all'azione in JSON formato." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Regola dell'evento" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Trigger" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Gruppo di notifiche" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Inquilini" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "I dati vengono compilati dalla fonte remota selezionata di seguito." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "È necessario specificare dati locali o un file di dati" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Contenuto" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Programma a" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Pianifica l'esecuzione del rapporto a un orario prestabilito" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Ricorre ogni" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Intervallo di ripetizione del rapporto (in minuti)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (ora corrente: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "L'orario programmato deve essere futuro." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Effettua modifiche" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Effettua il commit delle modifiche al database (deseleziona l'opzione «dry " "run»)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Pianifica l'esecuzione dello script a un orario prestabilito" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervallo di riesecuzione dello script (in minuti)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Le modifiche al database sono state annullate automaticamente." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Script interrotto con errore: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Si è verificata un'eccezione: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Le modifiche al database sono state annullate a causa di un errore." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Nessun indicizzatore trovato!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "contesto di configurazione" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "contesti di configurazione" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "I dati JSON devono essere in forma oggetto. Esempio:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7692,19 +8261,19 @@ msgstr "" "I dati del contesto di configurazione locale hanno la precedenza sui " "contesti di origine nel contesto di configurazione finale renderizzato" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "codice modello" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Codice modello Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "parametri ambientali" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7714,43 +8283,43 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">parametri" " aggiuntivi da superare durante la costruzione dell'ambiente Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "modello di configurazione" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "modelli di configurazione" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Gli oggetti a cui si applica questo campo." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Il tipo di dati che contiene questo campo personalizzato" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Il tipo di oggetto NetBox a cui questo campo è associato (per i campi " "oggetto)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Nome del campo interno" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Sono consentiti solo caratteri alfanumerici e trattini bassi." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "I doppi caratteri di sottolineatura non sono consentiti nei nomi dei campi " "personalizzati." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7758,21 +8327,21 @@ msgstr "" "Nome del campo visualizzato agli utenti (se non fornito, «verrà utilizzato " "il nome del campo)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "nome del gruppo" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "" "I campi personalizzati all'interno dello stesso gruppo verranno visualizzati" " insieme" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "necessario" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7780,19 +8349,19 @@ msgstr "" "Questo campo è obbligatorio quando si creano nuovi oggetti o si modifica un " "oggetto esistente." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "deve essere unico" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Il valore di questo campo deve essere univoco per l'oggetto assegnato" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "peso di ricerca" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7800,11 +8369,11 @@ msgstr "" "Ponderazione per la ricerca. I valori più bassi sono considerati più " "importanti. I campi con un peso di ricerca pari a zero verranno ignorati." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "logica di filtro" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7812,11 +8381,11 @@ msgstr "" "Loose corrisponde a qualsiasi istanza di una determinata stringa; exact " "corrisponde all'intero campo." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "predefinito" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7824,7 +8393,7 @@ msgstr "" "Valore predefinito per il campo (deve essere un valore JSON). Incapsula le " "stringhe con virgolette doppie (ad esempio «Foo»)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7833,35 +8402,35 @@ msgstr "" "(deve essere un valore JSON). Incapsula le stringhe con virgolette doppie " "(ad esempio «Foo»)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "peso dello schermo" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "I campi con pesi più alti appaiono più bassi in un modulo." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "valore minimo" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Valore minimo consentito (per campi numerici)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "valore massimo" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Valore massimo consentito (per campi numerici)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "regex di convalida" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7872,194 +8441,196 @@ msgstr "" "per forzare la corrispondenza dell'intera stringa. Ad esempio ^ " "[A-Z]{3}$ limiterà i valori a esattamente tre lettere maiuscole." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "set di scelta" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Specifica se il campo personalizzato viene visualizzato nell'interfaccia " "utente" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Specifica se il valore del campo personalizzato può essere modificato " "nell'interfaccia utente" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "è clonabile" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Replica questo valore durante la clonazione di oggetti" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "campo personalizzato" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "campi personalizzati" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Valore predefinito non valido»{value}«: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "È possibile impostare un valore minimo solo per i campi numerici" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "È possibile impostare un valore massimo solo per i campi numerici" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "La convalida delle espressioni regolari è supportata solo per i campi di " "testo e URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "L'unicità non può essere applicata per i campi booleani" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "I campi di selezione devono specificare una serie di scelte." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Le scelte possono essere impostate solo nei campi di selezione." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "I campi oggetto devono definire un tipo di oggetto." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} i campi non possono definire un tipo di oggetto." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Un filtro oggetto correlato può essere definito solo per i campi oggetto." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Il filtro deve essere definito come un dizionario che associa gli attributi " "ai valori." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Vero" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Falso" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "I valori devono corrispondere a questa regex: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Il valore deve essere una stringa." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Il valore deve corrispondere a regex '{regex}»" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Il valore deve essere un numero intero." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Il valore deve essere almeno {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Il valore non deve superare {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Il valore deve essere decimale." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Il valore deve essere vero o falso." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "I valori della data devono essere in formato ISO 8601 (AAAA-MM-GG)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "I valori di data e ora devono essere in formato ISO 8601 (AAAA-MM-GG " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Scelta non valida ({value}) per il set a scelta {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Scelte non valide ({value}) per il set a scelta {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Il valore deve essere un ID oggetto, non {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Il valore deve essere un elenco di ID oggetto, non {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "È stato trovato un ID oggetto non valido: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Il campo obbligatorio non può essere vuoto." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Set base di scelte predefinite (opzionale)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Le scelte vengono ordinate automaticamente alfabeticamente" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "set di scelta dei campi personalizzati" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "set di scelte di campi personalizzati" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "È necessario definire scelte di base o extra." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8068,60 +8639,60 @@ msgstr "" "Impossibile rimuovere la scelta {choice} come ce ne sono {model} oggetti che" " vi fanno riferimento." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "disposizione" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "config" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "cruscotto" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "cruscotti" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "tipi di oggetti" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "L'oggetto o gli oggetti a cui si applica questa regola." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "I tipi di evento che attiveranno questa regola." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "condizioni" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Una serie di condizioni che determinano se l'evento verrà generato." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "tipo di azione" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Dati aggiuntivi da passare all'oggetto azione" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "regola dell'evento" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "regole dell'evento" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8131,7 +8702,7 @@ msgstr "" "chiamato il webhook. L'elaborazione dei modelli Jinja2 è supportata nello " "stesso contesto del corpo della richiesta." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available qui." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "intestazioni aggiuntive" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8157,11 +8728,11 @@ msgstr "" "Nome: Value. L'elaborazione dei modelli Jinja2 è supportata " "nello stesso contesto del corpo della richiesta (sotto)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "modello di corpo" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8174,11 +8745,11 @@ msgstr "" "timestamp, nome utente, id_richiesta," " e dato." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "segreto" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8189,15 +8760,15 @@ msgstr "" "che utilizza il segreto come chiave. Il segreto non viene trasmesso nella " "richiesta." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Abilita la verifica del certificato SSL. Disabilita con cautela!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Percorso del file CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8205,66 +8776,66 @@ msgstr "" "Il file di certificato CA specifico da utilizzare per la verifica SSL. " "Lascia vuoto per utilizzare le impostazioni predefinite del sistema." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhook" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Non specificare un file di certificato CA se la verifica SSL è disabilitata." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "I tipi di oggetto a cui si applica questo link." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "testo del link" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Codice modello Jinja2 per il testo del link" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL del collegamento" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Codice modello Jinja2 per l'URL del collegamento" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "" "I collegamenti con lo stesso gruppo verranno visualizzati come menu a " "discesa" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nuova finestra" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Forza l'apertura del link in una nuova finestra" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "link personalizzato" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "link personalizzati" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "I tipi di oggetto a cui si applica questo modello." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8272,1091 +8843,1157 @@ msgstr "" "Codice modello Jinja2. L'elenco degli oggetti da esportare viene passato " "come variabile di contesto denominata set di interrogazioni." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Il valore predefinito è testo/semplice; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "estensione del file" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Estensione da aggiungere al nome del file renderizzato" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "come allegato" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Scarica il file come allegato" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "modello di esportazione" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "modelli di esportazione" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "«{name}\"è un nome riservato. Scegli un nome diverso." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "I tipi di oggetto a cui si applica questo filtro." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "condiviso" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "filtro salvato" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "filtri salvati" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "I parametri del filtro devono essere memorizzati come dizionario degli " "argomenti delle parole chiave." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "altezza dell'immagine" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "larghezza dell'immagine" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "allegato immagine" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "allegati di immagini" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Gli allegati di immagini non possono essere assegnati a questo tipo di " "oggetto ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "gentile" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "voce nel diario" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "voci di diario" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Il journaling non è supportato per questo tipo di oggetto ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "segnalibro" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "segnalibri" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "" "I segnalibri non possono essere assegnati a questo tipo di oggetto ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "leggere" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "evento" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "notifica" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "notifiche" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Oggetti di questo tipo ({type}) non supportano le notifiche." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "gruppi" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "utenti" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "gruppo di notifiche" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "gruppi di notifica" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "sottoscrizione" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "sottoscrizioni" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "è eseguibile" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "sceneggiatura" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "copioni" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "modulo script" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "moduli di script" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "timestamp" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "campo" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "valore" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "valore memorizzato nella cache" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "valori memorizzati nella cache" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "filiale" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "rami" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "cambiamento graduale" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "modifiche graduali" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "I tipi di oggetto a cui è possibile applicare questo tag." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "tag" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "tag" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "articolo etichettato" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "articoli etichettati" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Dati dello script" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parametri di esecuzione dello script" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Ignora" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Tipi di oggetti" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Convalida l'unicità" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Visibile" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Modificabile" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Tipo di oggetto correlato" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Set di scelta" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "È clonabile" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Valore minimo" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Valore massimo" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Validazione Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Conta" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Ordina alfabeticamente" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nuova finestra" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Come allegato" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "File di dati" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Sincronizzato" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Immagine" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Dimensione (byte)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Leggi" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Validazione SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Tipi di eventi" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Ruoli dei dispositivi" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Commenti (brevi)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linea" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Livello" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Messaggio" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Metodo" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Assicurati che questo valore sia uguale a %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Assicurati che questo valore non sia uguale %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Questo campo deve essere vuoto." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Questo campo non deve essere vuoto." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Le regole di convalida devono essere passate come dizionario" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Convalida personalizzata non riuscita per {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Attributo non valido»{name}\"per richiesta" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Attributo non valido»{name}\"per {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "La tua dashboard è stata reimpostata." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Widget aggiunto: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Widget aggiornato: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Widget eliminato: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Errore durante l'eliminazione del widget: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "" "Impossibile eseguire lo script: processo di lavoro RQ non in esecuzione." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Inserisci un indirizzo IPv4 o IPv6 valido con maschera opzionale." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Formato dell'indirizzo IP non valido: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" "Inserisci un prefisso e una maschera IPv4 o IPv6 validi nella notazione " "CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Formato del prefisso IP non valido: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Lo spazio disponibile è insufficiente per contenere le dimensioni del " "prefisso richieste" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Contenitore" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standard" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "CheckPoint" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Testo in chiaro" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Formato dell'indirizzo IP non valido: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Obiettivo di importazione" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Obiettivo di importazione (nome)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Obiettivo di esportazione" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Destinazione di esportazione (nome)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importazione di VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importa VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Esportazione di VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Esporta VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importazione di L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importazione di L2VPN (identificatore)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Esportazione di L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Esportazione di L2VPN (identificatore)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefisso" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (lumaca)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "All'interno del prefisso" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "All'interno e incluso il prefisso" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Prefissi che contengono questo prefisso o IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Lunghezza della maschera" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Numero VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Indirizzo" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Intervalli che contengono questo prefisso o IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Prefisso principale" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Macchina virtuale (nome)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Macchina virtuale (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interfaccia (nome)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interfaccia VM (nome)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interfaccia VM (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Gruppo FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "È assegnato a un'interfaccia" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "È assegnato" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Servizio (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "Indirizzo IP interno (ID) NAT" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interfaccia assegnata" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Interfaccia VM assegnata" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "Indirizzo IP (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "indirizzo IP" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "IPv4 (ID) primario" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "IPv6 primario (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Inserisci un indirizzo IPv4 o IPv6 valido (senza maschera)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Formato indirizzo IPv4/IPv6 non valido: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Questo campo richiede un indirizzo IP senza maschera." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Specifica un indirizzo IPv4 o IPv6 valido." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Inserisci un indirizzo IPv4 o IPv6 valido (con maschera CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "È richiesta la mascherina CIDR (ad es. /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Schema di indirizzo" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Applica uno spazio unico" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "È privato" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Data aggiunta" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Gruppo VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Lunghezza del prefisso" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "È una piscina" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Trattare come completamente utilizzato" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Assegnazione VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Nome DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protocollo" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "ID gruppo" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Tipo di autenticazione" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Chiave di autenticazione" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Autenticazione" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Tipo di ambito" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Ambito" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Intervalli di ID VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Sito e gruppo" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Porte" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importa gli obiettivi del percorso" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Obiettivi del percorso di esportazione" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "RIR assegnato" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Gruppo VLAN (se presente)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Dispositivo principale dell'interfaccia assegnata (se presente)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Macchina virtuale" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "VM principale dell'interfaccia assegnata (se presente)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "È primario" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Imposta questo indirizzo IP primario per il dispositivo assegnato" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Nessun dispositivo o macchina virtuale specificato; non può essere impostato" " come IP primario" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Nessuna interfaccia specificata; non può essere impostato come IP primario" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Tipo di autenticazione" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Tipo di ambito (app e modello)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Gruppo VLAN assegnato" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "Protocollo IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Obbligatorio se non assegnato a una VM" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Obbligatorio se non assegnato a un dispositivo" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} non è assegnato a questo dispositivo/macchina virtuale." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Obiettivi del percorso" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Obiettivi di importazione" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Obiettivi di esportazione" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importato da VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Esportato da VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privato" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Famiglia di indirizzi" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Intervallo" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Inizio" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Fine" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Cerca all'interno" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Presente in VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Dispositivo/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Prefisso principale" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Dispositivo assegnato" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "VM assegnata" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Assegnata a un'interfaccia" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Nome DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Contiene l'ID VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "ID VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Macchina virtuale" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Obiettivo del percorso" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Aggregato" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Gamma ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Assegnazione sito/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Intervallo IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Gruppo FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "" "Imposta questo indirizzo IP primario per il dispositivo/macchina virtuale" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (interno)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Un indirizzo IP può essere assegnato a un solo oggetto." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Impossibile riassegnare l'indirizzo IP mentre è designato come IP primario " -"per l'oggetto padre" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Solo gli indirizzi IP assegnati a un'interfaccia possono essere designati " "come IP primari." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Indirizzo IP virtuale" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "L'assegnazione esiste già" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "ID VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "VLAN per bambini" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9364,133 +10001,134 @@ msgstr "" "Elenco separato da virgole di uno o più numeri di porta. È possibile " "specificare un intervallo utilizzando un trattino." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Modello di servizio" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Porta/e" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Servizio" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Modello di servizio" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Da modello" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Personalizzato" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "È necessario specificare nome, protocollo e porte se non si utilizza un " "modello di servizio." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "inizio" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Serie ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Intervalli ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" "Avvio dell'ASN ({start}) deve essere inferiore all'ASN finale ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Registro Internet regionale responsabile di questo spazio numerico AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "Numero di sistema autonomo a 16 o 32 bit" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID gruppo" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protocollo" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "tipo di autenticazione" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "chiave di autenticazione" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Gruppo FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Gruppi FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Assegnazione del gruppo FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Incarichi del gruppo FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privato" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "Lo spazio IP gestito da questo RIR è considerato privato" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Rete IPv4 o IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Registro Internet regionale responsabile di questo spazio IP" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "data aggiunta" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "aggregare" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "aggregati" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Impossibile creare un aggregato con la maschera /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9499,7 +10137,7 @@ msgstr "" "Gli aggregati non possono sovrapporsi. {prefix} è già coperto da un " "aggregato esistente ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9508,103 +10146,105 @@ msgstr "" "I prefissi non possono sovrapporsi agli aggregati. {prefix} copre un " "aggregato esistente ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "ruolo" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "ruoli" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "prefisso" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Rete IPv4 o IPv6 con maschera" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Stato operativo di questo prefisso" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "La funzione principale di questo prefisso" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "è una piscina" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Tutti gli indirizzi IP all'interno di questo prefisso sono considerati " "utilizzabili" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "marchio utilizzato" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "prefissi" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Impossibile creare un prefisso con la maschera /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "tabella globale" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Prefisso duplicato trovato in {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "indirizzo iniziale" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Indirizzo IPv4 o IPv6 (con maschera)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "indirizzo finale" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Stato operativo di questa gamma" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "La funzione principale di questa gamma" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Intervallo IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Intervalli IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Le versioni iniziali e finali degli indirizzi IP devono corrispondere" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Le maschere di indirizzo IP iniziale e finale devono corrispondere" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" @@ -9612,57 +10252,57 @@ msgstr "" "L'indirizzo finale deve essere maggiore dell'indirizzo iniziale " "({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Gli indirizzi definiti si sovrappongono all'intervallo {overlapping_range} " "in VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "L'intervallo definito supera la dimensione massima supportata ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "indirizzo" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Lo stato operativo di questo IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Il ruolo funzionale di questo IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (interno)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "L'IP per il quale questo indirizzo è l'IP «esterno»" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Nome host o FQDN (senza distinzione tra maiuscole e minuscole)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "Indirizzi IP" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Impossibile creare un indirizzo IP con la maschera /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} è un ID di rete, che non può essere assegnato a un'interfaccia." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." @@ -9670,108 +10310,116 @@ msgstr "" "{ip} è un indirizzo di trasmissione, che non può essere assegnato a " "un'interfaccia." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Indirizzo IP duplicato trovato in {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Impossibile riassegnare l'indirizzo IP mentre è designato come IP primario " +"per l'oggetto padre" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Solo agli indirizzi IPv6 può essere assegnato lo stato SLAAC" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "numeri di porta" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "modello di servizio" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "modelli di servizio" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Gli indirizzi IP specifici (se presenti) a cui è associato questo servizio" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "servizio" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "servizi" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Un servizio non può essere associato sia a un dispositivo che a una macchina" " virtuale." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Un servizio deve essere associato a un dispositivo o a una macchina " "virtuale." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Gruppi VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Impossibile impostare scope_type senza scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Impossibile impostare scope_id senza scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Gli intervalli non possono sovrapporsi." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Il sito specifico a cui è assegnata questa VLAN (se presente)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Gruppo VLAN (opzionale)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID VLAN numerico (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Stato operativo di questa VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "La funzione principale di questa VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9780,168 +10428,170 @@ msgstr "" "La VLAN è assegnata al gruppo {group} (scopo: {scope}); non può essere " "assegnato anche al sito {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "Il VID deve essere compreso negli intervalli {ranges} per le VLAN in gruppo " "{group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "identificatore di percorso" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Distinguitore di percorso univoco (come definito in RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "imporre uno spazio unico" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Impedire prefissi/indirizzi IP duplicati all'interno di questo VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Valore target del percorso (formattato secondo RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "destinazione del percorso" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "obiettivi del percorso" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Numero siti" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Numero di fornitori" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Aggregati" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Aggiunto" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Prefissi" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Utilizzo" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Intervalli IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Prefisso (piatto)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Profondità" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Piscina" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Contrassegnato Utilizzato" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Indirizzo iniziale" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (interno)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (esterno)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Assegnata" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Oggetto assegnato" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Tipo di ambito" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Gamme VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "ROSSO" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Unico" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Obiettivi di importazione" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Obiettivi di esportazione" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} non è un prefisso valido. Volevi dire {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "" "La lunghezza del prefisso deve essere inferiore o uguale a %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "" "La lunghezza del prefisso deve essere maggiore o uguale a %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9949,31 +10599,31 @@ msgstr "" "Nei nomi DNS sono consentiti solo caratteri alfanumerici, asterischi, " "trattini, punti e trattini bassi" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Prefissi per bambini" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Gamme per bambini" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "IP correlati" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfacce dei dispositivi" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Interfacce VM" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Questo campo non può essere vuoto." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9981,335 +10631,348 @@ msgstr "" "Il valore deve essere passato direttamente (ad esempio «foo»: 123); non " "utilizzare un dizionario o un elenco." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} non è una scelta valida." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Tipo di contenuto non valido: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Valore non valido Specifica un tipo di contenuto come " "'.»." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "" "Gli intervalli devono essere specificati nel modulo (inferiore, superiore)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "I limiti dell'intervallo devono essere definiti come numeri interi." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} deve implementare get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Autorizzazione non valida {permission} per modello {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Rosso scuro" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rosa" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fucsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Viola scuro" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Azzurro chiaro" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "acqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Verde scuro" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Verde chiaro" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Calce" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Ambra" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Arancio scuro" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Marrone" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Grigio chiaro" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Grigio" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Grigio scuro" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Diretto" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Carica" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Rilevamento automatico" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Virgola" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Punto e virgola" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Tab" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Parametro di configurazione non valido: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Banner di accesso" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Contenuti aggiuntivi da visualizzare nella pagina di accesso" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Banner di manutenzione" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Contenuti aggiuntivi da visualizzare in modalità manutenzione" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Banner superiore" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "" "Contenuti aggiuntivi da visualizzare nella parte superiore di ogni pagina" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Banner inferiore" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "" "Contenuti aggiuntivi da visualizzare nella parte inferiore di ogni pagina" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Spazio IP unico a livello globale" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Applica un indirizzo IP univoco all'interno della tabella globale" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Preferisci IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Preferisci gli indirizzi IPv4 rispetto a IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Altezza dell'unità rack" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "" "Altezza dell'unità predefinita per le elevazioni dei rack renderizzate" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Larghezza dell'unità rack" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "" "Larghezza dell'unità predefinita per le elevazioni dei rack renderizzate" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Tensione di alimentazione" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Tensione predefinita per gli alimentatori" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Amperaggio di alimentazione" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Amperaggio predefinito per i powerfeed" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Utilizzo massimo di Powerfeed" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Utilizzo massimo predefinito per i powerfeed" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Schemi URL consentiti" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Schemi consentiti per gli URL nei contenuti forniti dagli utenti" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Dimensioni di pagina predefinite" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Dimensione massima della pagina" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Validatori personalizzati" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Regole di convalida personalizzate (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Regole di protezione" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Regole di protezione dalla cancellazione (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Preferenze predefinite" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Preferenze predefinite per i nuovi utenti" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Modalità di manutenzione" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Abilita la modalità di manutenzione" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL abilitato" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Abilita l'API GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Conservazione del changelog" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Giorni per conservare la cronologia delle modifiche (impostati a zero per un" " numero illimitato)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Conservazione dei risultati lavorativi" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Giorni per conservare la cronologia dei risultati del lavoro (impostati a " "zero per un numero illimitato)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL delle mappe" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "URL di base per la mappatura delle posizioni geografiche" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Partita parziale" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Corrispondenza esatta" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Inizia con" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Termina con" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Tipo/i di oggetto" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Cercare" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10317,413 +10980,428 @@ msgstr "" "Slug di tag separati da virgole, racchiusi tra virgolette doppie (ad esempio" " «tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Aggiungi tag" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Rimuovi tag" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} deve specificare una classe del modello." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Nome di campo sconosciuto '{name}'nei dati dei campi personalizzati." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Valore non valido per il campo personalizzato '{name}»: {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Campo personalizzato '{name}'deve avere un valore univoco." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Campo personalizzato obbligatorio mancante '{name}»." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Fonte dati remota" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "percorso dati" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Percorso del file remoto (relativo alla radice dell'origine dati)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "sincronizzazione automatica abilitata" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Abilita la sincronizzazione automatica dei dati quando il file di dati viene" " aggiornato" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "data sincronizzata" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} deve implementare un metodo sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organizzazione" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Gruppi del sito" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Gruppi di inquilini" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Gruppi di contatti" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Ruoli di contatto" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Assegnazioni di contatto" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Ruoli Rack" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Elevazioni" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Tipi di rack" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Moduli" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Contesti dei dispositivi virtuali" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Produttori" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Componenti del dispositivo" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Ruoli degli articoli di inventario" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Connessioni" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Cavi" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Collegamenti wireless" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Connessioni di interfaccia" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Connessioni alla console" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Connessioni di alimentazione" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Gruppi LAN wireless" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Prefisso e ruoli VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Intervalli ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Gruppi VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Modelli di servizio" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Servizi" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunnel" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Gruppi di tunnel" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Terminazioni dei tunnel" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "VPN L2" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Terminazioni" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Proposte IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Politiche IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Proposte IPSec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Criteri IPSec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Profili IPSec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Dischi virtuali" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Tipi di cluster" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Gruppi di cluster" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Tipi di circuiti" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Gruppi di circuiti" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Assegnazioni di gruppo" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Terminazioni del circuito" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Fornitori" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Account dei fornitori" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Reti di fornitori" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Pannelli di alimentazione" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Configurazioni" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Contesti di configurazione" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Modelli di configurazione" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Personalizzazione" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Campi personalizzati" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Scelte di campo personalizzate" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Link personalizzati" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Modelli di esportazione" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Filtri salvati" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Allegati di immagini" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operazioni" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integrazioni" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Fonti di dati" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Regole dell'evento" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhook" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Offerte di lavoro" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Registrazione" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Gruppi di notifiche" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Voci di diario" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Registro delle modifiche" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Amministratore" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Token API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Autorizzazioni" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Sistema" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plugin" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Cronologia della configurazione" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Attività in background" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Le autorizzazioni devono essere passate come tupla o elenco." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "I pulsanti devono essere passati come tupla o lista." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "" "Il colore del pulsante deve essere una scelta all'interno di " "ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10732,7 +11410,7 @@ msgstr "" "classe PluginTemplateExtension {template_extension} è stato approvato come " "istanza!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10741,196 +11419,197 @@ msgstr "" "{template_extension} non è una sottoclasse di " "Netbox.plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} deve essere un'istanza di Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} deve essere un'istanza di Netbox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} deve essere un'istanza di Netbox.plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context deve essere un dizionario" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Navigazione HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Abilita la navigazione dinamica dell'interfaccia utente" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Funzione sperimentale" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Lingua" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Forza la traduzione dell'interfaccia utente nella lingua specificata" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Il supporto per la traduzione è stato disabilitato localmente" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Lunghezza della pagina" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Il numero predefinito di oggetti da visualizzare per pagina" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Posizionamento dell'impaginatore" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Parte inferiore" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Top" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Entrambi" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Dove verranno visualizzati i controlli dell'impaginatore rispetto a una " "tabella" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Formato dati" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "La sintassi preferita per la visualizzazione di dati generici all'interno " "dell'interfaccia utente" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Negozio non valido: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Impossibile aggiungere negozi al registro dopo l'inizializzazione" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Impossibile eliminare i negozi dal registro" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "cechi" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "danese" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Tedesco" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Inglese" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "spagnolo" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Francese" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italiano" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Giapponese" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Olandese" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Polacco" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "portoghese" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Russo" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "turco" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "ucraino" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Cinese" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Seleziona tutto" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Attiva tutto" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Attiva il menu a discesa" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Errore" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "No {model_name} trovato" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Campo" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Valore" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Plugin fittizio" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10939,56 +11618,56 @@ msgstr "" "Si è verificato un errore durante il rendering del modello di esportazione " "selezionato ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Fila {i}: Oggetto con ID {id} non esiste" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "No {object_type} sono stati selezionati." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Rinominato {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Eliminato {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Registro delle modifiche" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "rivista" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Impossibile sincronizzare i dati: nessun file di dati impostato." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Dati sincronizzati per {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Sincronizzato {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} deve implementare get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10996,705 +11675,747 @@ msgstr "" "Si è verificato un errore durante il caricamento della configurazione del " "dashboard. È in uso un pannello di controllo predefinito." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Accesso negato" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Non sei autorizzato ad accedere a questa pagina" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Pagina non trovata" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "La pagina richiesta non esiste" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Errore del server" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "C'è stato un problema con la tua richiesta. Contatta un amministratore" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "L'eccezione completa è riportata di seguito" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Versione Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Versione NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Nessuno installato" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Se è necessaria ulteriore assistenza, invia un messaggio al" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Forum di discussione NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "su GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Pagina iniziale" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profilo" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Notifiche" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abbonamenti" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Preferenze" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Cambia password" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Annulla" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Salva" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Configurazioni della tabella" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Cancella le preferenze della tabella" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Attiva tutto" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tavolo" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Ordinazione" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Colonne" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Nessuno trovato" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Profilo utente" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Dettagli dell'account" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-mail" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Account creato" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Ultimo accesso" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superutente" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Personale" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Gruppi assegnati" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Nessuna" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Attività recente" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "I miei token API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Scrittura abilitata" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Usato per ultimo" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Aggiungi un token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Home" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Motivo NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Logo NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Documenti" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "API REST" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Documentazione API REST" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "API GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Supporto NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Codice sorgente" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Comunità" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Data di installazione" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Data di cessazione" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Assegna gruppo" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Terminazioni del circuito di scambio" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Sostituisci queste terminazioni con un circuito %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Un lato" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Lato Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Assegna circuito" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Assegnazione del gruppo di circuiti" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Aggiungi circuito" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Tipo di circuito" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Inserisci" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Modifica" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Scambia" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Contrassegnata come connessa" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "a" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Traccia" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Modifica cavo" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Rimuovere il cavo" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Disconnetti" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Connetti" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "A valle" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "A monte" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Connessione incrociata" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Pannello di permutazione/porta" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Aggiungi circuito" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Account fornitore" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Dati di configurazione" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Commento" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Ripristina" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parametro" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Valore attuale" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nuovo valore" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Modificato" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Taglia" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "byte" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Hash SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "sincronizzazione" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Ultima sincronizzazione" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Nessun parametro definito" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "File" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Elevazioni dei rack" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Altezza predefinita dell'unità" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Larghezza dell'unità predefinita" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Alimentatori" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Tensione predefinita" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Amperaggio predefinito" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Utilizzo massimo predefinito" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Applica l'unicità globale" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Conteggio delle pagine" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Dimensione massima della pagina" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Preferenze utente" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Conservazione del lavoro" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Lavoro" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Creato da" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Pianificazione" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "ogni %(interval)s verbale" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Cambia" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Differenza" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Precedente" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Prossimo" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Oggetto creato" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Oggetto eliminato" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Nessuna modifica" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Dati precedenti alla modifica" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Avvertenza: confronto delle modifiche non atomiche con il record di " "modifiche precedente" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Dati successivi alla modifica" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Vedi tutto %(count)s Modifiche" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Conservazione del registro delle modifiche" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "giorni" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Indefinito" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Non installato" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Panoramica" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Installare" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Dettagli del plugin" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Riepilogo" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licenza" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Cronologia delle versioni" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Istruzioni per l'installazione locale" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Code in background" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Configura tabella" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Fermare" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Coda" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Accodare" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Coda" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Timeout" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Risultato TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argomenti" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argomenti delle parole" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Dipende da" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Eccezione" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "attività in " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Lavori in coda" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11702,382 +12423,400 @@ msgstr "" "Seleziona tutti %(count)s %(object_type_plural)s domanda " "corrispondente" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informazioni sul lavoratore" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Lavoratore" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Code" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Lavori attuali" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Numero di lavori riusciti" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Numero di lavori non riusciti" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Orario di lavoro totale" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "secondi" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Lavoratori di background" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Lavoratori in %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Esporta" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Stato del sistema" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Versione NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Versione Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Versione PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Nome del database" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Dimensioni del database" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Non disponibile" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Lavoratori RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "coda predefinita" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Ora del sistema" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Configurazione attuale" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Sei sicuro di volerli disconnettere? %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Cable Trace per %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Scarica SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Percorso asimmetrico" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "I nodi sottostanti non hanno collegamenti e generano un percorso asimmetrico" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Divisione del percorso" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Seleziona un nodo qui sotto per continuare" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Traccia completata" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Segmenti totali" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Lunghezza totale" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Nessun percorso trovato" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Percorsi correlati" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Origine" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Destinazione" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmenti" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Incompleto" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Rinomina selezionato" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Non connesso" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Evidenzia il dispositivo nel rack" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Non rastrellato" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Coordinate GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Mappa" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Etichetta dell'asset" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Visualizza lo chassis virtuale" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Crea VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Direzione" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT per" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Utilizzo dell'energia" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Ingresso" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Punti vendita" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Assegnata" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Gamba" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Aggiungi un servizio" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Aggiungi componenti" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Aggiungi porte console" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Aggiungi porte Console Server" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Aggiungi alloggiamenti per dispositivi" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Aggiungi porte frontali" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Nascondi abilitato" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Nascondi disattivato" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Nascondi virtuale" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Nascondi disconnesso" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Aggiungi interfacce" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Aggiungi articolo di inventario" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Aggiungi alloggiamenti per moduli" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Aggiungi prese di corrente" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Aggiungi porta di alimentazione" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Aggiungi porte posteriori" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Configurazione" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Dati contestuali" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Configurazione renderizzata" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Scarica" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Nessun modello di configurazione trovato" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Baia dei genitori" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Rigenera la lumaca" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Rimuovi" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Dati di contesto di configurazione locale" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Rinomina" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Vano per dispositivi" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Dispositivo installato" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Rimuovi %(device)s da %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12086,430 +12825,449 @@ msgstr "" "Sei sicuro di voler rimuovere %(device)s da " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Popola" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Baia" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Aggiungi dispositivo" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Ruolo VM" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Nome del modello" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Numero del pezzo" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Escludi dall'utilizzo" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Genitore/figlio" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Immagine frontale" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Immagine posteriore" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Posizione porta posteriore" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Contrassegnato come connesso" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Stato della connessione" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Un lato" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Lato B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Nessuna risoluzione" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Segna pianificato" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Contrassegna installato" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Stato del percorso" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Non raggiungibile" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Punti finali del percorso" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Non connesso" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Senza tag" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Nessuna VLAN assegnata" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Trasparente" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Cancella tutto" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Profondità di montaggio" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Unità di partenza" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Unità discendenti" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Elevazione del rack" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Aggiungi interfaccia figlio" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Velocità/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Modalità PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Tipo PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Modalità 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "Indirizzo MAC" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Collegamento wireless" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Pari" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Canale" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Frequenza del canale" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Larghezza del canale" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Membri del GAL" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Nessuna interfaccia membro" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Aggiungi indirizzo IP" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Elemento principale" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "ID della parte" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Aggiungi la posizione del bambino" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Sedi per bambini" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Aggiungi una posizione" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Aggiungi un dispositivo" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Aggiungi tipo di dispositivo" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Aggiungi tipo di modulo" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Dispositivo connesso" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Utilizzo (allocato)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Caratteristiche elettriche" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "UN" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Feed Leg" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Aggiungi alimentatori" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Estrazione massima" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Pareggio assegnato" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Utilizzo dello spazio" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Peso dello scaffale" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Peso massimo" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Peso totale" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Immagini ed etichette" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Solo immagini" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Solo etichette" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Aggiungi prenotazione" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Visualizza elenco" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Seleziona la vista del rack" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Ordina per" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Nessun rack trovato" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Visualizza elevazioni" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Dettagli della prenotazione" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Aggiungi rack" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Posizioni" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Aggiungi sito" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Regioni per bambini" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Aggiungi regione" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Fuso orario" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Ora del sito" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Indirizzo fisico" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Indirizzo di spedizione" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Gruppi di bambini" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Aggiungi gruppo di siti" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Allegato" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Aggiungi membro" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Dispositivi per i membri" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Aggiungi nuovo membro allo chassis virtuale %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Aggiungi nuovo membro" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Azioni" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Salva e aggiungine un altro" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Modifica dello chassis virtuale %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Rack/unità" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Rimuovi membro dello chassis virtuale" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12518,11 +13276,12 @@ msgstr "" "Sei sicuro di voler rimuovere %(device)s da chassis " "virtuale %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identificatore" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12530,11 +13289,11 @@ msgstr "" "Durante questa richiesta si è verificato un errore di importazione del " "modulo. Le cause più comuni sono le seguenti:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Pacchetti obbligatori mancanti" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12551,11 +13310,11 @@ msgstr "" "congelamento dei tubi dalla console e confronta l'output con " "l'elenco dei pacchetti richiesti." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Il servizio WSGI non è stato riavviato dopo l'aggiornamento" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12565,7 +13324,7 @@ msgstr "" "servizio WSGI (ad esempio gunicorn o uWSGI) sia stato riavviato. Questo " "assicura che il nuovo codice sia in esecuzione." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12573,12 +13332,12 @@ msgstr "" "È stato rilevato un errore di autorizzazione del file durante l'elaborazione" " di questa richiesta. Le cause più comuni sono le seguenti:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "" "Autorizzazione di scrittura insufficiente per il file multimediale root" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12589,7 +13348,7 @@ msgstr "" " che l'utente che esegue NetBox abbia accesso per scrivere file in tutte le " "posizioni all'interno di questo percorso." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12597,11 +13356,11 @@ msgstr "" "È stato rilevato un errore di programmazione del database durante " "l'elaborazione di questa richiesta. Le cause più comuni sono le seguenti:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Migrazioni del database mancanti" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12612,11 +13371,11 @@ msgstr "" " migrazioni del database. È possibile eseguire le migrazioni manualmente " "eseguendo python3 manage.py migrare dalla riga di comando." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Versione PostgreSQL non supportata" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12626,99 +13385,102 @@ msgstr "" "verificarlo connettendoti al database utilizzando le credenziali di NetBox " "ed eseguendo una richiesta per SELEZIONA LA VERSIONE ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Il file di dati associato a questo oggetto è stato eliminato" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Dati sincronizzati" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Sincronizzazione dati" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Parametri ambientali" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Modello" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Nome del gruppo" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Deve essere unico" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Clonabile" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Valore predefinito" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Cerca peso" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Logica del filtro" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Peso dello schermo" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Interfaccia utente visibile" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Interfaccia utente modificabile" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Regole di convalida" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Espressione regolare" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Classe Button" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Modelli assegnati" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Testo del link" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL del collegamento" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Reimposta dashboard" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12726,7 +13488,7 @@ msgstr "" "Questo rimuoverà tutti widget configurati e ripristina la " "configurazione predefinita del dashboard." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12734,160 +13496,162 @@ msgstr "" "Questa modifica riguarda solo tuo dashboard e non avrà alcun impatto " "sugli altri utenti." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "configurazione del widget" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Chiudi widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Aggiungi un widget" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Nessun segnalibro è stato ancora aggiunto." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Nessuna autorizzazione" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Nessuna autorizzazione per visualizzare questo contenuto" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Impossibile caricare il contenuto. Nome di visualizzazione non valido" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Nessun contenuto trovato" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Si è verificato un problema durante il recupero del feed RSS" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Condizioni" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Tipo MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Estensione del file" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Previsto per" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Durata" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Riepilogo del test" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Registro" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Uscita" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Caricamento" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Risultati in sospeso" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Inserimento nel diario" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Gruppo di notifiche" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Nessuno assegnato" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "" "Il contesto di configurazione locale sovrascrive tutti i contesti di origine" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Contesti di origine" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nuova voce nel diario" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Rapporto" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Non si dispone dell'autorizzazione per eseguire gli script" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Esegui script" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Errore durante il caricamento dello script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Lo script non esiste più nel file sorgente." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Ultima corsa" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Lo script non è più presente nel file sorgente" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Mai" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Corri ancora" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Nessuno script trovato" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12896,81 +13660,83 @@ msgstr "" "Inizia da creazione di uno script da " "un file o da una fonte di dati caricati." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Risultati" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Soglia di log" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Tutti" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Oggetti con tag" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Tipi di oggetti consentiti" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Qualsiasi" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Tipi di articoli con tag" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Oggetti taggati" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Metodo HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Tipo di contenuto HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Verifica SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Intestazioni aggiuntive" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Modello di corpo" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Creazione in blocco" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Oggetti selezionati" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "da aggiungere" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Eliminazione in blocco" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Conferma l'eliminazione in blocco" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12980,66 +13746,69 @@ msgstr "" "La seguente operazione eliminerà %(count)s %(type_plural)s." " Esamina attentamente gli oggetti selezionati e conferma questa azione." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Redazione" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Modifica in blocco" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Applica" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Importazione in blocco" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Importazione diretta" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Carica file" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Invia" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Opzioni di campo" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Accessor" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "scelte" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Valore di importazione" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Formato: AAAA-MM-GG" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Specifica vero o falso" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Campi obbligatori dovere essere specificato per tutti gli " "oggetti." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -13049,15 +13818,15 @@ msgstr "" "univoco. Ad esempio %(example)s identificherebbe un VRF tramite" " il suo identificatore di percorso." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Rimuovi in blocco" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Conferma la rimozione in blocco" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13068,72 +13837,72 @@ msgstr "" "%(parent_obj)s. Si prega di rivedere attentamente il %(obj_type_plural)s da " "rimuovere e confermare qui sotto." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Rimuovi questi %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Ridenominazione" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Rinomina in blocco" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Nome attuale" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nuovo nome" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Anteprima" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Sei sicuro?" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Confermare" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Modifica selezionato" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Elimina selezionati" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Aggiungi un nuovo %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Visualizza la documentazione del modello" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Aiuto" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Crea e aggiungi un altro" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtri" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13142,40 +13911,40 @@ msgstr "" "Seleziona tutti %(count)s " "%(object_type_plural)s domanda corrispondente" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nuova versione disponibile" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "è disponibile" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Istruzioni per l'aggiornamento" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Sblocca dashboard" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Blocca dashboard" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Aggiungi widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Salva layout" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Conferma l'eliminazione" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13184,41 +13953,41 @@ msgstr "" "Sei sicuro di volerlo eliminare " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "" "I seguenti oggetti verranno eliminati come risultato di questa azione." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "fa" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Nessuna notifica non letta" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Tutte le notifiche" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Seleziona" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Reimposta" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Abilita la modalità oscura" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Abilita la modalità luce" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13227,281 +13996,283 @@ msgstr "" "Prima di poter aggiungere un %(model)s devi prima creare un " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Selezione della pagina" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Mostrando %(start)s-%(end)s di %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Opzioni di impaginazione" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Per pagina" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Allega un'immagine" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Oggetti correlati" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Nessun tag assegnato" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "I dati non sono sincronizzati con il file upstream" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Ricerca rapida" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Filtro salvato" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Ordinazione chiara" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centro assistenza" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Amministratore Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Esci" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Effettua il login" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Famiglia" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Data aggiunta" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Aggiungi prefisso" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Numero AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Tipo di autenticazione" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Chiave di autenticazione" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Indirizzi IP virtuali" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Assegna IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Creazione in blocco" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Crea gruppo" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "IP virtuali" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Mostra assegnato" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Mostra disponibile" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Mostra tutto" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globale" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (esterno)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Assegna un indirizzo IP" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Seleziona indirizzo IP" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Risultati della ricerca" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Aggiungi indirizzi IP in blocco" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Indirizzo di partenza" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Indirizzo finale" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Contrassegnato come completamente utilizzato" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Dettagli di indirizzamento" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "IP per bambini" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "IP disponibili" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Primo IP disponibile" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Dettagli del prefisso" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Indirizzo di rete" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Maschera di rete" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Maschera Wildcard" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Indirizzo di trasmissione" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Aggiungi intervallo IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Nascondi indicatori di profondità" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Profondità massima" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Lunghezza massima" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Aggiungi aggregato" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importazione di VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Esportazione di VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Importazione di VPN L2" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Esportazione di VPN L2" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Aggiungere un prefisso" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Aggiungi VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Distinguitore del percorso" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Spazio IP unico" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Errori" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Accedi" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Oppure" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Errore multimediale statico - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Errore multimediale statico" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Il seguente file multimediale statico non è stato caricato" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Controlla quanto segue" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13511,7 +14282,7 @@ msgstr "" "l'aggiornamento più recente. Questo installa l'iterazione più recente di " "ogni file statico nel percorso radice statico." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13523,7 +14294,7 @@ msgstr "" "href=\"%(docs_url)s\">la documentazione di installazione per ulteriori " "indicazioni." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13532,550 +14303,573 @@ msgstr "" "Il fascicolo %(filename)s esiste nella directory principale " "statica ed è leggibile dal server HTTP." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Fare clic qui per provare a caricare nuovamente" " NetBox." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Contatto" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Titolo" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefono" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Gruppo di contatto" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Aggiungi gruppo di contatti" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Ruolo di contatto" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Aggiungere un contatto" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Aggiungi inquilino" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Gruppo di inquilini" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Aggiungi gruppo di inquilini" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Autorizzazioni assegnate" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Autorizzazione" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Visualizza" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Vincoli" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Utenti assegnati" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Risorse allocate" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "CPU virtuali" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Memoria" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Spazio su disco" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Aggiungi macchina virtuale" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Assegna dispositivo" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Rimuovi selezionato" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Aggiungi dispositivo al cluster %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Selezione del dispositivo" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Aggiungi dispositivi" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Aggiungi cluster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Gruppo Cluster" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Tipo di cluster" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Disco virtuale" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Risorse" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Aggiungi disco virtuale" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Politica IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Versione IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Chiave precondivisa" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Mostra segreto" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Proposte" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Proposta IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Metodo di autenticazione" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Algoritmo di crittografia" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algoritmo di autenticazione" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Gruppo DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Durata SA (secondi)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Politica IPSec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Gruppo PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Profilo IPSec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Gruppo PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Proposta IPSec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Durata SA (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "Attributi L2VPN" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Aggiungi una terminazione" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Aggiungi terminazione" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Incapsulamento" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Profilo IPSec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "ID del tunnel" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Aggiungi tunnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Gruppo Tunnel" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Terminazione del tunnel" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "IP esterno" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Terminazioni tra pari" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Cifrario" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Interfacce collegate" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Aggiungi LAN wireless" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Gruppo LAN wireless" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Aggiungi gruppo LAN wireless" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Proprietà dei link" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Distanza" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Gruppo di contatto dei genitori (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Gruppo di contatto con i genitori (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Gruppo di contatti (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Gruppo di contatti (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Contatto (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Ruolo di contatto (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Ruolo di contatto (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Gruppo di contatti" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Gruppo di inquilini principali (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Gruppo di inquilini principali (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Gruppo di inquilini (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Gruppo di inquilini (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Gruppo di inquilini (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Descrizione" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Contatto assegnato" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "gruppo di contatti" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "gruppi di contatti" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "ruolo di contatto" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "ruoli di contatto" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "titolo" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefono" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "collegamento" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "contatto" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "contatta" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "assegnazione dei contatti" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "assegnazioni di contatto" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "" "I contatti non possono essere assegnati a questo tipo di oggetto ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "gruppo di inquilini" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "gruppi di inquilini" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Il nome del tenant deve essere univoco per gruppo." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Lo slug del tenant deve essere unico per gruppo." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "inquilino" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "inquilini" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Titolo del contatto" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Telefono di contatto" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Email di contatto" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Indirizzo di contatto" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Link di contatto" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Descrizione del contatto" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Autorizzazione (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Gruppo di notifica (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Nome" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Cognome" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Status del personale" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Stato di utente avanzato" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "" "Se non viene fornita alcuna chiave, ne verrà generata una automaticamente." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "È personale" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "È Superuser" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Può visualizzare" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Può aggiungere" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Può cambiare" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Può eliminare" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Interfaccia utente" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14085,7 +14879,7 @@ msgstr "" "registrare la tua chiave prima di inviare questo modulo, poiché " "potrebbe non essere più accessibile una volta creato il token." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14095,31 +14889,31 @@ msgstr "" "vuoto per non avere restrizioni. Esempio: " "10.1.1.0/24,192.168.10.16/32,2001: db 8:1: :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Conferma la password" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Inserisci la stessa password di prima, per la verifica." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "Le password non corrispondono! Controlla i dati inseriti e riprova." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Azioni aggiuntive" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Azioni concesse in aggiunta a quelle sopra elencate" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Oggetti" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14129,81 +14923,81 @@ msgstr "" "consentiti. Lascia null in modo che corrisponda a tutti gli oggetti di " "questo tipo. Un elenco di più oggetti risulterà in un'operazione OR logica." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "È necessario selezionare almeno un'azione." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Filtro non valido per {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "L'elenco delle azioni concesse da questa autorizzazione" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "limiti" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtro Queryset che corrisponde agli oggetti applicabili dei tipi " "selezionati" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "autorizzazione" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "autorizzazioni" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "preferenze utente" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Chiave '{path}'è un nodo foglia; non può assegnare nuove chiavi" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Chiave '{path}'è un dizionario; non può assegnare un valore diverso dal " "dizionario" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "scade" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "usato per ultimo" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "chiave" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "scrittura abilitata" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Consenti operazioni di creazione/aggiornamento/eliminazione utilizzando " "questa chiave" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "IP consentiti" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14212,42 +15006,42 @@ msgstr "" "vuoto per non avere restrizioni. Es: «10.1.1.0/24, 192.168.10.16/32, 2001:DB" " 8:1: :/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "gettone" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "gettoni" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "gruppo" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "utente" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Esiste già un utente con questo nome utente." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Azioni personalizzate" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Oggetto correlato non trovato utilizzando gli attributi forniti: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Più oggetti corrispondono agli attributi forniti: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14256,40 +15050,40 @@ msgstr "" "Gli oggetti correlati devono essere referenziati tramite ID numerico o " "dizionario di attributi. Ha ricevuto un valore non riconosciuto: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "Oggetto correlato non trovato utilizzando l'ID numerico fornito: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} ha una chiave definita ma CHOICES non è una lista" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Il peso deve essere un numero positivo" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Valore non valido '{weight}'per il peso (deve essere un numero)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "Unità sconosciuta {unit}. Deve essere uno dei seguenti: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "La lunghezza deve essere un numero positivo" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Valore non valido '{length}'per la lunghezza (deve essere un numero)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14298,15 +15092,15 @@ msgstr "" "Impossibile eliminare {objects}. {count} sono stati trovati" " oggetti dipendenti: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Più di 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Colore RGB in formato esadecimale. Esempio: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14315,7 +15109,7 @@ msgstr "" "%s(%r) non è valido. Il parametro to_model di CounterCacheField deve essere " "una stringa nel formato 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14324,39 +15118,39 @@ msgstr "" "%s(%r) non è valido. Il parametro to_field di CounterCacheField deve essere " "una stringa nel formato 'field'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Inserisci i dati dell'oggetto in formato CSV, JSON o YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Delimitatore CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "Il carattere che delimita i campi CSV. Si applica solo al formato CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "I dati del modulo devono essere vuoti durante il caricamento/selezione di un" " file." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Formato dati sconosciuto: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Impossibile rilevare il formato dei dati. Si prega di specificare." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Delimitatore CSV non valido" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14364,7 +15158,7 @@ msgstr "" "Dati YAML non validi. I dati devono avere la forma di più documenti o di un " "singolo documento comprendente un elenco di dizionari." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14373,7 +15167,7 @@ msgstr "" "Elenco non valido ({value}). Deve essere numerico e gli intervalli devono " "essere in ordine crescente." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14381,7 +15175,7 @@ msgstr "" "Specifica uno o più intervalli numerici separati da virgole. Esempio: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14389,17 +15183,18 @@ msgstr "" "Intervalli non validi ({value}). Deve essere un intervallo di numeri interi " "in ordine crescente." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Valore non valido per un campo a scelta multipla: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Oggetto non trovato: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14408,20 +15203,20 @@ msgstr "" "«{value}\"non è un valore univoco per questo campo; sono stati trovati più " "oggetti" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "«{field_name}\"è un nome di campo di accesso non valido." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Il tipo di oggetto deve essere specificato come».»" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Tipo di oggetto non valido" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14431,7 +15226,7 @@ msgstr "" "casi e i tipi misti all'interno di un unico intervallo non sono supportati " "(esempio: [età, ex] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14439,7 +15234,7 @@ msgstr "" "Specifica un intervallo numerico per creare più IP.
    Esempio: " "192.0.2. [1.500-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown la sintassi è supportata" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Abbreviazione univoca compatibile con gli URL" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Inserisci i dati contestuali in JSON " "formato." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "L'indirizzo MAC deve essere in formato EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Usare espressioni regolari" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "ID numerico di un oggetto esistente da aggiornare (se non si crea un nuovo " "oggetto)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Intestazione non riconosciuta: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Colonne disponibili" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Colonne selezionate" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14494,13 +15289,13 @@ msgstr "" "Questo oggetto è stato modificato dopo il rendering del modulo. Per i " "dettagli, consulta il registro delle modifiche dell'oggetto." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Gamma»{value}\"non è valido." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14509,70 +15304,70 @@ msgstr "" "Intervallo non valido: valore finale ({end}) deve essere maggiore del valore" " iniziale ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Intestazione di colonna duplicata o in conflitto per»{field}»" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Intestazione di colonna duplicata o in conflitto per»{header}»" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Fila {row}: Previsto {count_expected} colonne ma trovate {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Intestazione di colonna inaspettata»{field}«trovato." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Colonna»{field}\"non è un oggetto correlato; non può usare punti" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Attributo oggetto correlato non valido per la colonna»{field}«: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Intestazione di colonna obbligatoria»{header}\"non trovato." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Valore obbligatorio mancante per il parametro di interrogazione dinamica: " "'{dynamic_params}»" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Valore obbligatorio mancante per il parametro di query statica: " "'{static_params}»" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "La password deve contenere almeno un numero." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "La password deve contenere almeno una lettera maiuscola." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "La password deve contenere almeno una lettera minuscola." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14580,7 +15375,7 @@ msgstr "" "La password deve contenere almeno un numero, una lettera maiuscola e una " "lettera minuscola." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14589,127 +15384,127 @@ msgstr "" "Nome di autorizzazione non valido: {name}. Deve essere nel formato " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "app_label/model_name sconosciuto per {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Indirizzo IP non valido impostato per {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" "Una colonna denominata {name} è già definito per la tabella {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Non definito" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Annulla segnalibro" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Segnalibro" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Clona" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Visualizzazione corrente" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Tutti i dati" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Aggiungi modello di esportazione" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importa" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Annulla l'iscrizione" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Abbonati" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Copia negli appunti" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Questo campo è obbligatorio" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Imposta Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Cancella tutto" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Configurazione della tabella" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Sposta verso l'alto" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Sposta verso il basso" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Cerca..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Cerca NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Apri selettore" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Scrivere" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Il test deve definire csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} non è un'espressione regolare valida." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} deve implementare get_required_permission ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} deve implementare get_required_permission ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14718,61 +15513,63 @@ msgstr "" "{class_name} non ha un set di query definito. ObjectPermissionRequiredMixin " "può essere utilizzato solo su viste che definiscono un set di query di base" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Gruppo padre (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Gruppo principale (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Tipo di cluster (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Cluster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Memoria (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Tipo di cluster" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Gruppo di cluster assegnato" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Cluster assegnato" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Dispositivo assegnato all'interno del cluster" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Numero di serie" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14781,52 +15578,52 @@ msgstr "" "{device} appartiene a un sito diverso ({device_site}) rispetto al cluster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Facoltativamente, aggiungi questa VM a un dispositivo host specifico " "all'interno del cluster" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Sito/cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "La dimensione del disco viene gestita tramite il collegamento di dischi " "virtuali." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disco" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "tipo di cluster" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "tipi di cluster" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "gruppo di cluster" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "gruppi di cluster" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "grappolo" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "grappoli" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14835,44 +15632,44 @@ msgstr "" "{count} i dispositivi vengono assegnati come host per questo cluster ma non " "si trovano nel sito {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "memoria (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disco (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Il nome della macchina virtuale deve essere univoco per cluster." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "macchina virtuale" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "macchine virtuali" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" "Una macchina virtuale deve essere assegnata a un sito e/o a un cluster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "Il cluster selezionato ({cluster}) non è assegnato a questo sito ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "" "È necessario specificare un cluster quando si assegna un dispositivo host." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14880,7 +15677,7 @@ msgstr "" "Il dispositivo selezionato ({device}) non è assegnato a questo cluster " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14889,18 +15686,18 @@ msgstr "" "La dimensione del disco specificata ({size}) deve corrispondere alla " "dimensione aggregata dei dischi virtuali assegnati ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" "Deve essere un IPV{family} indirizzo. ({ip} è un IPv{version} indirizzo.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "L'indirizzo IP specificato ({ip}) non è assegnato a questa VM." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14909,7 +15706,7 @@ msgstr "" "L'interfaccia principale selezionata ({parent}) appartiene a una macchina " "virtuale diversa ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14918,7 +15715,7 @@ msgstr "" "L'interfaccia bridge selezionata ({bridge}) appartiene a una macchina " "virtuale diversa ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14927,394 +15724,417 @@ msgstr "" "La VLAN senza tag ({untagged_vlan}) deve appartenere allo stesso sito della " "macchina virtuale principale dell'interfaccia o deve essere globale." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "dimensione (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "disco virtuale" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "dischi virtuali" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Aggiunto {count} dispositivi da raggruppare {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Rimosso {count} dispositivi dal cluster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPSec - Trasporto" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPSec - Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP in IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Ha parlato" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agressivo" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Principale" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Chiavi precondivise" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certificati" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Firme RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Firme DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Gruppo {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "LAN privata Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "LAN privata virtuale Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Albero privato Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Albero privato virtuale Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Gruppo Tunnel (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Gruppo tunnel (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Profilo IPSec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Profilo IPSec (nome)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunnel (nome)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "IP esterno (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Politica IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Politica IKE (nome)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Politica IPSec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Politica IPSec (nome)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Interfaccia VM (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (nome)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Gruppo Tunnel" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Una vita" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Chiave precondivisa" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Politica IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Politica IPSec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Incapsulamento del tunnel" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Ruolo operativo" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Dispositivo principale dell'interfaccia assegnata" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "VM principale dell'interfaccia assegnata" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interfaccia dispositivo o macchina virtuale" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE proposal(s)" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Gruppo Diffie-Hellman per Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPSec proposal(s)" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protocollo IPSec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Tipo L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Dispositivo principale (per interfaccia)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Macchina virtuale principale (per interfaccia)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Interfaccia assegnata (dispositivo o VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Non è possibile importare contemporaneamente le terminazioni del dispositivo" " e dell'interfaccia VM." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Ogni terminazione deve specificare un'interfaccia o una VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Non è possibile assegnare sia un'interfaccia che una VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Versione IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Proposta" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Tipo di oggetto assegnato" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Interfaccia tunnel" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Prima cessazione" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Seconda cessazione" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Questo parametro è obbligatorio per definire una terminazione." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Politica" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Una terminazione deve specificare un'interfaccia o una VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Una terminazione può avere un solo oggetto di terminazione (un'interfaccia o" " VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "algoritmo di crittografia" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "algoritmo di autenticazione" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ID del gruppo Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Durata dell'associazione di sicurezza (in secondi)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Proposta IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Proposte IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "versione" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "proposte" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "chiave precondivisa" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Politiche IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "La modalità è richiesta per la versione IKE selezionata" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "La modalità non può essere utilizzata per la versione IKE selezionata" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "cifratura" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "autenticazione" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Durata dell'associazione di sicurezza (secondi)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Durata dell'associazione di sicurezza (in kilobyte)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Proposta IPSec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Proposte IPSec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "È necessario definire un algoritmo di crittografia e/o autenticazione" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Criteri IPSec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Profili IPSec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Terminazione L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Terminazioni L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Terminazione L2VPN già assegnata ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15323,187 +16143,195 @@ msgstr "" "{l2vpn_type} Le L2VPN non possono avere più di due terminazioni; trovato " "{terminations_count} già definito." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "gruppo tunnel" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "gruppi di tunnel" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "incapsulamento" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ID del tunnel" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunnels" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Un oggetto può terminare in un solo tunnel alla volta." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "terminazione del tunnel" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "terminazioni dei tunnel" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} è già collegato a un tunnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Metodo di autenticazione" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Algoritmo di crittografia" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algoritmo di autenticazione" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA Lifetime" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Pre-shared Key" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Durata SA (secondi)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA Lifetime (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Genitore dell'oggetto" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Sito oggetto" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Punto di accesso" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Stazione" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Aperta" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Enterprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Cifrario di autenticazione" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Unità di distanza" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "VLAN con bridge" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interfaccia A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interfaccia B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Lato B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "cifrario di autenticazione" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "gruppo LAN wireless" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "gruppi LAN wireless" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "LAN senza fili" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interfaccia A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interfaccia B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "distanza" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "unità di distanza" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "collegamento wireless" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "collegamenti wireless" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "È necessario specificare un'unità quando si imposta una distanza wireless" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} non è un'interfaccia wireless." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Valore del canale non valido: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Attributo del canale non valido: {name}" diff --git a/netbox/translations/ja/LC_MESSAGES/django.mo b/netbox/translations/ja/LC_MESSAGES/django.mo index a3ce9ca9a1ad2faccdc85d1ef56d565248e6ced2..f5dc65ae6652d8be288969d591d70deb979e0be0 100644 GIT binary patch delta 63022 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 delta 63314 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 Nv0;0RP{*rX{vWqh%_RT; diff --git a/netbox/translations/ja/LC_MESSAGES/django.po b/netbox/translations/ja/LC_MESSAGES/django.po index 511e6a7ea..c44f05c79 100644 --- a/netbox/translations/ja/LC_MESSAGES/django.po +++ b/netbox/translations/ja/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: teapot, 2024\n" "Language-Team: Japanese (https://app.transifex.com/netbox-community/teams/178115/ja/)\n" @@ -23,4195 +23,4610 @@ msgstr "" "Language: ja\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Key" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "書き込み可能" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "作成" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "有効期限" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "最終使用日" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "許可された IP" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "としてログイン {user}。" -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "ログアウトしました。" -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "設定が更新されました。" -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "LDAP認証されたユーザー資格情報は、NetBox内で変更することはできません。" -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "パスワードは正常に変更されました。" -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "計画中" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "プロビジョニング" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "アクティブ" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "オフライン" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "デプロビジョニング" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "廃止" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "プライマリ" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "セカンダリ" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "三次" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "非アクティブ" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "リージョン (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "リージョン (slug)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "サイトグループ (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "サイトグループ (slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "サイト" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "サイト (slug)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "プロバイダ (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "プロバイダ (slug)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "プロバイダアカウント (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "プロバイダーアカウント (アカウント)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "プロバイダネットワーク (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "回線タイプ (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "回線タイプ (slug)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "サイト (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "ターミネーション A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "検索" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "回線" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "プロバイダネットワーク (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "回線 (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "回線 (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "回路グループ (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "回線グループ (slug)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "説明" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "プロバイダ" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "サービス ID" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "色" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "タイプ" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "プロバイダアカウント" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "ステータス" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "テナント" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "開通日" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "終了日" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "保証帯域 (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "サービス情報" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "テナンシー" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "プロバイダネットワーク" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "ポートスピード (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "アップストリーム速度 (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "接続済みにする" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "回線終端" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "終了詳細" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "優先度" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "割当プロバイダ" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "割当プロバイダアカウント" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "回線のタイプ" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "運用状況" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "割当テナント" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "終了" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "プロバイダネットワーク" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "ロケーション" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "連絡先" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "リージョン" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "サイトグループ" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "属性" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "アカウント" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "タームサイド" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "割当" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "グループ" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "回線グループ" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "色" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "回線タイプ" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "回線タイプ" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "回線 ID" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "一意な回線 ID" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "状態" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "開通済" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "終端" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "保証帯域 (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "保証帯域" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "回線" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "回線" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "回線グループ" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "回線グループ" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "優先度" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "割当回線グループ" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "割当回線グループ" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "終端" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "ポート速度 (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "物理回線速度" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "アップストリーム速度 (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "アップストリーム速度 (ポート速度と異なる場合)" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "クロスコネクト ID" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ローカル・クロスコネクトの ID" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "パッチパネル/ポート" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "パッチパネル ID とポート番号" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "説明" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "回線終端" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "回線終端" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "回線終端は、サイトまたはプロバイダーネットワークに接続する必要があります。" -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "回線終端をサイトとプロバイダーネットワークの両方に接続することはできません。" -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "名前" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "プロバイダのフルネーム" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "slug" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "プロバイダ" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "プロバイダ" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "アカウント ID" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "プロバイダアカウント" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "プロバイダアカウント" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "サービス ID" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "プロバイダネットワーク" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "プロバイダネットワーク" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "名前" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "回線" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "回線 ID" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "サイド A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "サイド Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "保証帯域" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "コメント" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "アサイメント" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "アカウント" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "アカウント数" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "ASN 数" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "回路には終端が定義されていません {circuit}。" -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "回路のスワップ端子 {circuit}。" -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "このユーザーには、このデータソースを同期する権限がありません。" -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "新規" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "処理待ち" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "同期中" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "完了" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "失敗" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "スクリプト" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "レポート" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "保留中" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "予定済" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "実行中" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "エラー" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "更新" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "削除" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "終了しました" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "開始日時" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "延期" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "停止しました" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "キャンセルされました" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "ローカル" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "ユーザ名" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "HTTP (S) でのcloneに使用されます" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "パスワード" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "ブランチ" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "リモートデータの取得に失敗しました ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "AWS アクセスキー ID" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "AWS シークレットアクセスキー" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "オブジェクトの作成" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "オブジェクトの更新" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "オブジェクトの削除" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "ジョブの開始" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "ジョブの完了" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "ジョブの失敗" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "ジョブのエラー" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "データソース (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "データソース (名前)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "ユーザ (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "ユーザ名" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "有効" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "パラメータ" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "ignoreルール" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "データソース" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "ファイル" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "データソース" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "作成" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "オブジェクトタイプ" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "以降に作成" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "以前に作成" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "以降に予定" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "以前に予定" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "以降に開始" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "以前に開始" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "以降に完了" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "以前に完了" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "ユーザ" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "時間" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "以降" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "以前" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "アクション" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "ソース" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "バックエンド設定" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "ファイルのアップロード" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "ファイルをアップロードして既存のファイルから同期することはできません" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "同期するファイルをアップロードするか、データファイルを選択する必要があります" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "ラック図" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "電源" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "セキュリティ" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "バナー" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "ページネーション" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "バリデーション" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "ユーザ設定" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "その他" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "設定履歴" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "このパラメータは静的に定義されており、変更できません。" -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "現在の値: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (デフォルト)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "時刻" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "ユーザ名" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "リクエスト ID" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "アクション" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "変更前データ" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "変更後データ" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "オブジェクト変更" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "オブジェクト変更" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "このオブジェクトタイプ ({type}) では変更ログはサポートされていません。" -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "作成日時" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "コメント" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "設定データ" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "設定履歴" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "設定履歴" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "デフォルト設定" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "現在の設定" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "設定履歴 #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "タイプ" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "有効" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignoreルール" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "同期時に除外するファイル名のパターン (1 行に 1 つ)" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "パラメータ" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "最終同期日時" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "データソース" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "データソース" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "不明なバックエンドタイプ: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "同期を開始できません。同期はすでに進行中です。" -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "バックエンドの初期化中にエラーが発生しました。依存関係をインストールする必要があります。 " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "最終更新日時" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "パス" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "データソースのルートを基準にしたファイルパス" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "サイズ" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "ハッシュ" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "64 桁の 16 進数でなければなりません。" -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "ファイルデータの SHA256 ハッシュ" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "データファイル" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "データファイル" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "自動同期レコード" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "自動同期レコード" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "ファイルルート" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "ファイルパス" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "指定されたルートパスからの相対パス" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "管理対象ファイル" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "管理対象ファイル" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "予定日時" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "間隔" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "繰り返し間隔 (分)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "開始日時" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "完了日時" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "データ" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "エラー" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ジョブ ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "ジョブ" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "ジョブ" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "このオブジェクトタイプにはジョブを割り当てられません ({type})。" -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "ジョブ終了のステータスが無効です。選択肢は以下のとおりです。 {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "enqueue () は schedule_at と immediate の両方の値を指定して呼び出すことはできません。" -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "削除は保護ルールによって禁止されています。 {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "フルネーム" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "オブジェクト" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "リクエスト ID" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "有効" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "パス" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "最終更新日" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "間隔" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "バージョン" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "最終更新日" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "NetBox の最小バージョン" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "NetBoxの最大バージョン" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "プラグインデータが見つかりません" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "著者" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "インストール済" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "認定済" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "公開済" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "インストール済バージョン" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "最新バージョン" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "最も古いタスク" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "労働者" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "ホスト" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "ポート" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "デシベル" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "スケジューラー PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "キューが見つかりません" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "エンキュー" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "終了しました" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "呼び出し可能" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "タスクが見つかりません" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "状態" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "誕生" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "作業者が見つかりませんでした" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "キューに入っているジョブ #{id} 同期するには {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "復元された設定リビジョン #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "ジョブ {job_id} 見つかりません" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "ジョブ {id} が削除されました。" -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "ジョブの削除中にエラーが発生しました {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "ジョブ {id} 見つかりません。" -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "ジョブ {id} が再エンキューされました。" -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "ジョブ {id} キューに追加されました。" -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "ジョブ {id} 停止されました。" -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "ジョブを停止できませんでした {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "プラグインカタログを読み込めませんでした" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "プラグイン {name} が見つかりません" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "ポジション (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ファシリティ ID" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "ステージング" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "廃止" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "撤退済" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2 ポストラック" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4ポストラック" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4 ポストキャビネット" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "ウォールマウントラック" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "ウォールマウントラック (垂直)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "ウォールマウントキャビネット" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "ウォールマウントキャビネット (垂直)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} インチ" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "予約済" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "利用可能" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "廃止済" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "ミリメートル" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "インチ" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "前面から背面" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "背面から前面" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "親" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "子" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "前面" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "背面" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "検証" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "在庫" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "左から右" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "右から左" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "側面から背面" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "背面から側面" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "下から上へ" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "上から下へ" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "パッシブ" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "混合" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (ロック無)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (ロック有)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "California Style" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "International/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "独自規格" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "その他" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/International" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "物理" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "仮想" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "無線" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "仮想インタフェース" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "ブリッジ" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "リンクアグリゲーション (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "イーサネット (固定)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "イーサネット (モジュール)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "イーサネット (バックプレーン)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "セルラー" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "シリアル" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "同軸" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "スタック" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "半二重" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "全二重" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "自動" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "アクセス" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "タグ付き" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "タグ付き (全て)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE スタンダード" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "パッシブ 24V (2 ペア)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "パッシブ 24V (4ペア)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "パッシブ 48V (2 ペア)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "パッシブ 48V (4ペア)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "カッパー" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "光ファイバー" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "ファイバー" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "接続済" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "キロメートル" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "メートル" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "センチメートル" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "マイル" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "フィート" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "キログラム" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "グラム" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "ポンド" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "オンス" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "冗長" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "単相" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "三相" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "MAC アドレス形式が無効です: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "WWN 形式が無効です: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "親リージョン (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "親リージョン (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "親サイトグループ (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "親サイトグループ (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "グループ (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "グループ (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "親の場所 (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "親の場所 (スラッグ)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "ロケーション (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "ロケーション (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "メーカ (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "メーカ (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "ラックタイプ (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "ラックタイプ (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "ロール (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "ロール (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "ラック (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "ユーザ (名前)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "デフォルトプラットフォーム (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "デフォルトプラットフォーム (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "正面画像がある" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "背面画像がある" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "コンソールポートがある" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "コンソールサーバポートがある" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "電源ポートがある" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "電源コンセントがある" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "インタフェースがある" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "パススルーポートがある" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "モジュールベイがある" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "デバイスベイがある" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "在庫品目がある" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "デバイスタイプ (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "モジュールタイプ (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "電源ポート (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "親在庫品目 (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "設定テンプレート (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "デバイスタイプ (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "親デバイス (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "プラットフォーム (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "プラットフォーム (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "サイト名 (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "ペアレントベイ (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "VM クラスタ (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "クラスタグループ (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "クラスタグループ (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "デバイスモデル (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "奥行きをすべて使うか" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC アドレス" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "プライマリ IP がある" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "帯域外 IP がある" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "バーチャルシャーシ (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "バーチャルシャーシのメンバーか" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "仮想デバイスコンテキストあり" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "デバイスモデル" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "インタフェース (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "モジュールタイプ (モデル)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "モジュールベイ (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "デバイス (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "ラック (名前)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "デバイス (名前)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "デバイスタイプ (モデル)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "デバイスロール (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "デバイスロール (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "バーチャルシャーシ (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "バーチャルシャーシ" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "モジュール (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "ケーブル (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "割当 VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "割当 VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "バーチャルシャーシインタフェース" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "バーチャルシャーシインタフェース (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "インタフェースの種類" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "親インタフェース (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "ブリッジインタフェース (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "LAG インタフェース (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "仮想デバイスコンテキスト" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "仮想デバイスコンテキスト (識別子)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "無線 LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "無線リンク" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "親モジュールベイ (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "インストール済みモジュール (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "インストール済みデバイス (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "インストール済みデバイス (名前)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "マスター (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "マスター (名前)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "テナント (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "テナント (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "未終端" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "電源盤 (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "タグ" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "ポジション" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" msgstr "英数字の範囲が使用できます。(作成する名前の数と一致する必要があります)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "連絡先名" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "連絡先電話番号" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "連絡先電子メール" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "タイムゾーン" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "メーカ" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "フォームファクタ" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "幅" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "高さ (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "降順" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "外形の幅" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "外形の奥行" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "外形の単位" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "取り付け奥行き" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "重量" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "最大重量" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "重量単位" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "ラックタイプ" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "外形寸法" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "寸法" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "ナンバリング" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "ロール" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "ラックタイプ" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "シリアル番号" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "アセットタグ" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "エアフロー" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "ラック" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "ハードウェア" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "デフォルトプラットフォーム" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "パーツ番号" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "ユニット数" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "ラック利用率に含めない" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "デバイスタイプ" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "モジュールタイプ" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "シャーシ" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VMのロール" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "設定テンプレート" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "デバイスタイプ" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "デバイスロール" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "プラットフォーム" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "クラスタ" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "デバイス" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "設定" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "仮想化" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "モジュールタイプ" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "ラベル" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "長さ" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "長さの単位" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "ドメイン" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "電源盤" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "供給電源" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "電力相" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "電圧" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "アンペア数" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "最大使用率" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "最大消費電力" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "最大消費電力 (ワット)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "割当電力" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "割当消費電力 (ワット)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "電源ポート" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "供給端子" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "管理のみ" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE モード" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE タイプ" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "無線ロール" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "モジュール" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "仮想デバイスコンテキスト" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "速度" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "モード" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN グループ" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "タグなし VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "タグ付き VLAN" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "タグ付 VLAN の追加" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "タグ付 VLAN の削除" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "無線 LAN グループ" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "無線 LAN" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "アドレス" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "オペレーション" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "関連インタフェース" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q スイッチング" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "追加/削除" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "VLAN を割り当てるには、インタフェースモードを指定する必要があります" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "アクセスインタフェースにはタグ付き VLAN を割り当てることはできません。" -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "親リージョン名" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "親サイトグループ名" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "割当リージョン" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "割当グループ" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "使用可能なオプション" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "割当サイト" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "親ロケーション" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "ロケーションが見つかりません。" -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "このラックタイプのメーカ" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "ラック内の一番小さい番号の位置" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "レール間の幅 (インチ)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "外形寸法の単位" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "重量の単位" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "割当テナント名" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "割当ロール名" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "エアフロー" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "親サイト" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "ラックのロケーション (存在する場合)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "単位" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "カンマ区切りのユニット番号" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "製造メーカ" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "デフォルトのプラットフォーム (オプション)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "デバイス重量" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "デバイス重量の単位" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "モジュール重量" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "モジュール重量の単位" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "プラットフォーム割り当てをこのメーカに限定する" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "割当ロール" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "デバイスタイプメーカ" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "デバイスタイプモデル" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "割当プラットフォーム" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "バーチャルシャーシ" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "仮想化クラスタ" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "割当ロケーション (存在する場合)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "割当ラック (存在する場合)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "面" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "ラック取付面" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "親デバイス (子デバイス用)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "デバイスベイ" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "取付られているデバイスベイ (子デバイス用)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "取付られているデバイス" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "モジュールベイ" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "取付られているモジュールベイ" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "モジュールタイプ" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "構成要素を複製" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" msgstr "関連する構成要素を自動的に登録 (デフォルト)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "既存の構成要素を採用" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "既存の構成要素を採用" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "ポートタイプ" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "ポート速度 (bps)" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "コンセントタイプ" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "このコンセントに給電する電源ポート" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "電気位相 (三相回路用)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "親インタフェース" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "ブリッジインタフェース" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Lag" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "親 LAG インタフェース" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "VDC" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "VDC 名をコンマで区切り、二重引用符で囲みます。例:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "物理媒体" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "デュプレックス" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "PoEモード" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "PoEタイプ" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q モード(L2 インタフェース用)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "割当 VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "RF ロール" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "無線ロール (AP/ステーション)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} デバイスには割り当てられていません {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "背面ポート" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "対応する背面ポート" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "物理媒体の分類" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "取付済みデバイス" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "このベイ内に取付された子デバイス" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "子デバイスが見つかりません。" -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "親在庫品目" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "構成要素タイプ" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "構成要素タイプ" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "コンポーネント名" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "構成要素名" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "コンポーネントが見つかりません: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "サイド A デバイス" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "デバイス名" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "サイド A タイプ" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "終了タイプ" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "サイド A 名" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "終端名" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "サイド B デバイス" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "サイド B タイプ" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "サイド B 名" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "接続ステータス" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "サイド {side_upper}: {device} {termination_object} は既に接続されています" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} サイドターミネーションが見つかりません: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "マスター" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "マスターデバイス" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "親サイトの名前" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "上流電源盤" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "プライマリまたは冗長" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "電源タイプ (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "単相または三相" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "プライマリ IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "マスク付きの IPv4 アドレス (例:1.2.3.4/24)" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "プライマリ IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "プレフィックス長のある IPv6 アドレス、例:2001: db8:: 1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" msgstr "タグ付き VLAN ({vlans}) はインタフェースの親デバイス/VMと同サイトに属しているか、グローバルである必要があります" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." msgstr "位置が定義されていないモジュールベイには、プレースホルダー値のあるモジュールを挿入できません。" -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4220,382 +4635,424 @@ msgstr "" "モジュールベイツリーの{level}レベルにはプレースホルダ値のあるモジュールをインストールできませんが、 " "{tokens}個のプレースホルダが与えられています。" -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr " {model} {name} は既にモジュールに属しているので採用できません" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "{model} {name} は既に存在しています" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "電源盤" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "電源タップ" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "サイド" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "デバイスステータス" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "親リージョン" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "親グループ" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "ファシリティ" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "ラックタイプ" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "機能" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "画像" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "構成要素" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "サブデバイスロール" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "モデル" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "OOB IP アドレスを持っている" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "バーチャルシャーシメンバー" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "仮想デバイスコンテキストがある" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "クラスタグループ" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "ケーブル接続済" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "専有済" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "接続" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "種類" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "管理のみ" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "無線チャネル" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "チャネル周波数 (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "チャネル幅 (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "送信出力 (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "ケーブル" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "自動検出" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "バーチャルシャーシメンバーはすでに{vc_position}に存在します 。" -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "連絡先情報" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "ラックロール" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Slug" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "定義済みのラックタイプを選択するか、以下で物理特性を設定してください。" -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "在庫管理" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." msgstr "カンマ区切りのユニット ID 。範囲はハイフンを使用して指定できます。" -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "予約" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "デバイスロール" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "デバイスが使用している最も小さいユニット番号" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "仮想シャーシ内の位置" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "仮想シャーシ内の優先度" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "このモジュールタイプに関連する構成要素を自動的に入力する" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "特性" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "コンソールポートテンプレート" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "コンソールサーバポートテンプレート" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "全面ポートテンプレート" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "インタフェーステンプレート" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "電源コンセントテンプレート" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "電源ポートテンプレート" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "背面ポートテンプレート" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "インタフェース" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "コンソールポート" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "コンソールサーバポート" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "前面ポート" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "背面ポート" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "電源ポート" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "電源コンセント" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "構成要素割り当て" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "在庫品目は1つの構成要素にのみ割り当てることができます。" -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "LAG インタフェース" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "割り当て可能な VLAN をグループ別にフィルタリングします。" -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "子デバイス" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." msgstr "まず子デバイスを作成し、親デバイスのサイトとラックに割り当てる必要があります。" -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "コンソールポート" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "コンソールサーバポート" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "前面ポート" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "電源コンセント" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "在庫品目" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "在庫品目ロール" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" msgstr "英数字の範囲がサポートされています。(作成するオブジェクトの数と一致する必要があります)。" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" " expected." msgstr "パターンは {value_count} 個の値を示す範囲を指定しますが、 {pattern_count} 個の値が必要です。" -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "背面ポート" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "前面ポートごとに背面ポート 1 つ割り当てます。" -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4604,14 +5061,7 @@ msgstr "" "前面ポートテンプレートの数 ({frontport_count}) " "は選択した背面ポートの数({rearport_count})と一致する必要があります。" -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "文字列 {module} は(存在する場合)割当モジュールの位置に置き換えられます。" - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4619,316 +5069,319 @@ msgid "" msgstr "" "前面ポートの数 ({frontport_count}) は選択した背面ポートの数 ({rearport_count}) と一致する必要があります。" -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "メンバー" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "初期ポジション" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "最初のメンバーのポジション。メンバーが増えるごとに 1 ずつ増えます。" -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "最初の VC メンバーのポジションを指定する必要があります。" -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "ラベル" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "長さ" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "長さの単位" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "ケーブル" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "ケーブル" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "ケーブル長を設定するときは単位を指定する必要があります" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "新しいケーブルを作成するときは、A 終端と B 終端を定義する必要があります。" -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "ケーブルの同じ端に異なる終端タイプを接続することはできません。" -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "互換性のない終端タイプ: {type_a} そして {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "A 端子と B 端子を同じオブジェクトに接続することはできません。" -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "端" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "ケーブル終端" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "ケーブル終端" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " "{cable_pk}" msgstr "の重複終了が見つかりました {app_label}。{model} {termination_id}: ケーブル {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "ケーブルは終端できません {type_display} インターフェース" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "プロバイダーネットワークに接続されている回線終端はケーブル接続できない場合があります。" -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "アクティブ" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "完了" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "分割" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "ケーブル経路" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "ケーブル経路" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " "attached to a module type." msgstr "{module} は、モジュールタイプに取り付けられる場合、モジュールベイ位置の代わりとして使用できます。" -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "物理ラベル" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "構成要素テンプレートを別のデバイスタイプに移動することはできません。" -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "構成要素テンプレートをデバイスタイプとモジュールタイプの両方に関連付けることはできません。" -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "構成要素テンプレートは、デバイスタイプまたはモジュールタイプのいずれかに関連付ける必要があります。" -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "コンソールポートテンプレート" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "コンソールポートテンプレート" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "コンソールサーバポートテンプレート" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "コンソールサーバポートテンプレート" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "最大消費電力" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "割当消費電力" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "電源ポートテンプレート" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "電源ポートテンプレート" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "割当消費電力は最大消費電力 ({maximum_draw}W) を超えることはできません。" -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "供給端子" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "電力相 (三相電源用)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "電源コンセントテンプレート" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "電源コンセントテンプレート" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "親電源ポート ({power_port}) は同じデバイスタイプに属している必要があります" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "親電源ポート ({power_port}) は同じモジュールタイプに属している必要があります" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "管理のみ" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "ブリッジインタフェース" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "無線ロール" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "インタフェーステンプレート" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "インタフェーステンプレート" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "インタフェースを自分自身にブリッジすることはできません。" -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "ブリッジインタフェース ({bridge}) は同じデバイスタイプに属している必要があります" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "ブリッジインタフェース ({bridge}) は同じモジュールタイプに属している必要があります" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "背面ポート位置" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "前面ポートテンプレート" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "前面ポートテンプレート" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "背面ポート ({name}) は同じデバイスタイプに属している必要があります" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " "positions" msgstr "背面ポートの位置 ({position}) が無効です; 背面ポート {name} は{count}箇所しかありません" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "位置" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "背面ポートテンプレート" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "背面ポートテンプレート" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "位置" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "取付済み構成要素名を変更する際に参照する識別子" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "モジュールベイテンプレート" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "モジュールベイテンプレート" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "デバイスベイテンプレート" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "デバイスベイテンプレート" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -4936,207 +5389,212 @@ msgid "" msgstr "" "デバイスベイを許可するためには、デバイスタイプ ({device_type}) のサブデバイスロールを「parent」に設定する必要があります。" -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "パーツ ID" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "メーカ指定の部品識別子" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "在庫品目テンプレート" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "在庫品目テンプレート" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "構成要素を別のデバイスに移動することはできません。" -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "ケーブル端" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "接続済みとしてマークする" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "ケーブルが接続されているかのように扱う" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "ケーブルを接続するときは、ケーブルの端 (A または B) を指定する必要があります。" -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "ケーブルの端はケーブルなしでセットしないでください。" -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "ケーブルが接続されている状態では接続済みとマークできません。" -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} モデルは親オブジェクトプロパティを宣言しなければなりません" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "物理ポートタイプ" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "速度" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "ポート速度 (bps)" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "コンソールポート" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "コンソールポート" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "コンソールサーバポート" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "コンソールサーバポート" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "電源ポート" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "電源ポート" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "電源コンセント" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "電源コンセント" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "親電源ポート ({power_port}) は同じデバイスに属している必要があります" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "モード" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q タギング戦略" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "親インタフェース" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "親ラグ" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "このインタフェースは帯域外管理にのみ使用されます。" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "速度 (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "デュプレックス" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64 ビットのWWN (World Wide Name)" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "無線チャネル" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "チャネル周波数 (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "選択したチャンネルによって設定されます (設定されている場合)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "送信パワー (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "無線 LAN" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "タグなし VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "タグ付き VLAN" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "インタフェース" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "インタフェース" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} インタフェースにはケーブルを接続できません。" -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} インタフェースは接続済みとしてマークできません。" -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "インタフェースを自身の親にすることはできません。" -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "親インタフェースに割り当てることができるのは仮想インタフェースだけです。" -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " "({device})" msgstr "選択した親インタフェース ({interface}) は別のデバイス ({device}) に属しています" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5145,14 +5603,14 @@ msgstr "" "選択した親インタフェース ({interface}) が属する {device} " "は、バーチャルシャーシ{virtual_chassis}には含まれていません。 。" -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "選択したブリッジインタフェース ({bridge}) は別のデバイス ({device}) に属しています。" -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5161,21 +5619,21 @@ msgstr "" "選択したブリッジインタフェース ({interface}) が属する " "{device}は、バーチャルシャーシ{virtual_chassis}には含まれていません。 " -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "仮想インタフェースは親 LAG インタフェースを持つことはできません。" -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "LAG インタフェースを自身の親にすることはできません。" -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "選択した LAG インタフェース ({lag}) は別のデバイス ({device}) に属しています。" -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5184,43 +5642,43 @@ msgstr "" "選択した LAG インタフェース ({lag}) が属する {device}は、バーチャルシャーシには含まれていません " "{virtual_chassis}。" -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "仮想インタフェースには PoE モードを設定できません。" -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "仮想インタフェースに PoE タイプを設定することはできません。" -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "PoE タイプを指定するときは、PoE モードを指定する必要があります。" -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "無線ロールは無線インタフェースでのみ設定できます。" -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "チャネルは無線インタフェースでのみ設定できます。" -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "チャネル周波数は、無線インタフェースでのみ設定できます。" -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "選択したチャンネルではカスタム周波数を指定できません。" -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "チャネル幅は無線インタフェースでのみ設定できます。" -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "選択したチャンネルではカスタム幅を指定できません。" -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5228,24 +5686,24 @@ msgid "" msgstr "" "タグ無し VLAN ({untagged_vlan}) はインタフェースの親デバイスと同じサイトに属しているか、グローバルである必要があります。" -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "対応する背面ポートのマップ位置" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "前面ポート" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "前面ポート" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "背面ポート ({rear_port}) は同じデバイスに属している必要があります" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5253,195 +5711,198 @@ msgid "" msgstr "" "背面ポートの位置 ({rear_port_position}) が無効です: 背面ポート {name} は {positions} 箇所しかありません。" -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "マップできる前面ポートの数" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "背面ポート" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "背面ポート" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" " ({frontport_count})" msgstr "ポジションの数は、マップされた前面ポートの数より少なくすることはできません ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "モジュールベイ" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "モジュールベイ" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "モジュールベイは、その中に取り付けられているモジュールに属することはできません。" -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "デバイスベイ" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "デバイスベイ" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "このタイプ ({device_type}) のデバイスは、デバイスベイをサポートしていません。" -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "デバイスをそれ自体に挿入することはできません。" -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "指定されたデバイスは取付できません。デバイスは既に {bay} に取付られています 。" -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "在庫品目ロール" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "在庫品目ロール" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "シリアル番号" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "アセットタグ" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "この部品を識別するために使用される一意のタグ" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "自動検出" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "このアイテムは自動的に検出されました" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "在庫品目" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "在庫品目" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "自分を親として割り当てることはできません。" -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "親在庫品目は同じデバイスに属していません。" -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "子を持つ在庫品目は移動できません" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "在庫品目を別のデバイスの構成要素に割り当てることはできません" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "メーカ" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "メーカ" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "型" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "デフォルトプラットフォーム" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "パーツ番号" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "個別の部品番号 (オプション)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "高さ (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "使用率から除外" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "このタイプのデバイスは、ラック使用率の計算時に除外されます。" -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "奥行きをすべて利用する" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "デバイスは前面と背面の両方のラック面を使用します。" -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "親/子のステータス" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." msgstr "親デバイスはデバイスベイに子デバイスを収納します。このデバイスタイプが親でも子供でもない場合は、空白のままにしてください。" -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "エアフロー" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "デバイスタイプ" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "デバイスタイプ" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "U の高さは 0.5 ラック単位でなければなりません。" -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" " a height of {height}U" msgstr "ラック内 {rack} のデバイス {device} は高さ{height}Uに対応する十分なスペースが有りません " -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5450,173 +5911,173 @@ msgstr "" "高さは 0U にできません: {racked_instance_count} インスタンス " "がラックに取り付け済みです。" -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." msgstr "このデバイスを親デバイスとして分類解除する前に、このデバイスに関連付けられているすべてのデバイスベイテンプレートを削除する必要があります。" -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "子デバイスタイプは 0U でなければなりません。" -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "モジュールタイプ" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "モジュールタイプ" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "仮想マシンをこのロールに割り当てることができます" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "デバイスロール" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "デバイスロール" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "オプションで、このプラットフォームを特定のメーカのデバイスに限定できます" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "プラットフォーム" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "プラットフォーム" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "このデバイスが果たす機能" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "製造元によって割当られた、シャーシのシリアル番号" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "このデバイスを識別するために使用される一意のタグ" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "ポジション (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "ラックフェイス" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "プライマリ IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "プライマリ IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "out-of-band IP" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "VCポジション" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "バーチャルシャーシポジション" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC プライオリティ" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "バーチャルシャーシのマスター選択優先順位" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "緯度" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "10 進数形式の GPS 座標 (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "経度" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "デバイス名はサイトごとに一意である必要があります。" -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "デバイス" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "デバイス" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "ラック {rack} はサイト{site}に属していません 。" -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "ロケーション {location} はサイト{site}に属していません 。" -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "ラック {rack} はロケーション{location}に属していません 。" -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "ラックを割り当てないとラックフェースは選択できません。" -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "ラックを割り当てないとラックポジションを選択できません。" -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "ポジションは 0.5 ラックユニット単位で入力する必要があります。" -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "ラックの位置を定義するときは、ラックの面を指定する必要があります。" -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "0U デバイスタイプ ({device_type}) をラックポジションに割り当てることはできません。" -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "子デバイスタイプをラックフェースに割り当てることはできません。これは親デバイスの属性です。" -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." msgstr "子デバイスタイプをラックポジションに割り当てることはできません。これは親デバイスの属性です。" -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5625,22 +6086,22 @@ msgstr "" "U{position} が既に占有されているか、このデバイスタイプを収容するのに十分なスペースがありません: {device_type} " "({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} は IPv4 アドレスではありません。" -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "指定された IP アドレス ({ip}) はこのデバイスに割り当てられていません。" -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} IPv6 アドレスではありません。" -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5649,154 +6110,154 @@ msgstr "" "割当られたプラットフォームは{platform_manufacturer} のデバイスタイプに限定されます 。しかし、このデバイスのタイプは " "{devicetype_manufacturer}に属します。" -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "割当クラスタは別のサイトに属しています ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "仮想シャーシに割当られたデバイスには、その位置が定義されている必要があります。" -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " "is currently designated as its master." msgstr "デバイスを仮想シャーシから削除できない {virtual_chassis} 現在マスターとして指定されているからです。" -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "モジュール" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "モジュール" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "モジュールは、割当デバイスに属するモジュールベイ内に取り付ける必要があります ({device})。" -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "ドメイン" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "バーチャルシャーシ" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "選択したマスター ({master}) はこの仮想シャーシに割り当てられていません。" -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "バーチャルシャーシ{self}を削除できません 。クロスシャーシ LAG インタフェースを形成するメンバーインタフェースがあります。" -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "識別子" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "親デバイスに固有の数値識別子" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "コメント" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "仮想デバイスコンテキスト" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "仮想デバイスコンテキスト" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip}は IPv{family}アドレスではありません。" -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "プライマリ IP アドレスは、割当デバイスのインタフェースに属している必要があります。" -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "重量" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "重量単位" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "重量を設定するときは単位を指定する必要があります" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "電源盤" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "電源盤" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "ロケーション {location} ({location_site}) は{site}とは別のサイトにあります " -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "供給" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "電力相" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "電圧" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "アンペア数" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "最大使用率" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "最大許容電力 (パーセンテージ)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "使用可能な電力" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "電源タップ" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "電源タップ" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5804,1295 +6265,1380 @@ msgid "" msgstr "" "ラック {rack} ({rack_site}) と電源盤 {powerpanel} ({powerpanel_site}) は別のサイトにあります。" -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "AC 電源の電圧を負にすることはできません" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "幅" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "レール間の幅" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "ラックユニットの高さ" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "開始ユニット" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "ラック用開始ユニット" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "降順" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "ユニットには上から下に番号が付けられています" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "外形の幅" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "ラックの外形寸法(幅)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "外形の奥行" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "ラックの外形寸法(奥行き)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "外形の単位" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "取り付け奥行き" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." msgstr "マウントされたデバイスの最大奥行き (mm)。4 支柱ラックの場合、これは前面レールと背面レールの間の距離です。" -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "最大重量" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "ラックの最大積載量" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "フォームファクタ" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "ラックタイプ" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "ラックタイプ" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "外形の幅/奥行きを設定する場合は単位を指定する必要があります" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "最大重量を設定する場合は単位を指定する必要があります" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "ラックロール" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "ラックロール" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ファシリティ ID" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "ローカル識別子" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "機能的ロール" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "このラックの識別に使用される固有のタグ" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "ラック" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "ラック" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "割当ロケーションは親サイト ({site}) に属している必要があります。" -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "現在取付られているデバイスを収納するには、ラックは少なくとも{min_height} U 必要です 。" -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "現在取付られているデバイスを収納するには、ラックユニット番号は {position} 以下で始まる必要があります 。" -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "ロケーションは同じサイト {site} のものでなければなりません。 。" -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "単位" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "ラック予約" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "ラック予約" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr " {height}U ラックのユニットが無効です: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "次のユニットはすでに予約されています: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "同名のトップレベルリージョンが存在します。" -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "このslugを含むトップレベルリージョンは存在します。" -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "領域" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "リージョン" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "同名のトップレベルサイトグループが存在します。" -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "このslugを含むトップレベルサイトグループが存在します。" -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "サイトグループ" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "サイトグループ" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "サイトのフルネーム" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "施設" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ローカルファシリティ ID または説明" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "物理アドレス" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "建物の物理的位置" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "配送先住所" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "実際の住所と異なる場合" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "サイト" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "サイト" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "この名前のロケーションは、サイト内に存在します。" -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "このslugのロケーションは、サイト内に存在します。" -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "ロケーション" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "ロケーション" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "親のロケーション ({parent}) は同じサイト ({site}) に属している必要があります。" -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "終端 A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "終端 B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "デバイス A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "デバイス B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "ロケーション A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "ロケーション B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "ラック A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "ラック B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "サイト A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "サイト B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "到達可能" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "デバイス" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VM" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "設定テンプレート" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "サイトグループ" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP アドレス" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4 アドレス" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6 アドレス" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "VC ポジション" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "VC プライオリティ" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "親デバイス" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "位置 (デバイスベイ)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "コンソールポート" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "コンソールサーバポート" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "電源ポート" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "電源コンセント" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "インタフェース" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "前面ポート" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "デバイスベイ" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "モジュールベイ" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "在庫品目" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "モジュールベイ" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "在庫品目" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "ケーブル色" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "対向" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "接続済みとしてマークする" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "最大電力 (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "割当電力 (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP アドレス" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "FHRP グループ" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "トンネル" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "管理のみ" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "取付済みモジュール" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "モジュールシリアル番号" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "モジュール資産タグ" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "モジュールステータス" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "構成要素" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "アイテム" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "デバイスタイプ" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "モジュールタイプ" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "プラットフォーム" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "デフォルトプラットフォーム" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "奥行きをすべて利用する" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "U 高さ" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "インスタンス" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "コンソールポート" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "コンソールサーバポート" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "電源ポート" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "電源コンセント" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "前面ポート" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "背面ポート" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "デバイスベイ" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "モジュールベイ" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "電源タップ" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "最大使用率" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "使用可能な電力 (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "ラック" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "高さ" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "外形幅" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "外形奥行" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "最大重量" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "スペース" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "サイト" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "テストケースは peer_termination_type を設定する必要があります" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "切断されました {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "予約" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "ラック搭載でないデバイス" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "コンフィグコンテキスト" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "レンダーコンフィグ" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "テンプレートをレンダリング中にエラーが発生しました: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "仮想マシン" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "インストール済みデバイス {device} イン・ベイ {device_bay}。" -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "削除されたデバイス {device} ベイから {device_bay}。" -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "子ども" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "メンバー追加 {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "マスターデバイスを削除できません {device} バーチャルシャーシから。" -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "削除済み {device} バーチャルシャーシから {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "不明な関連オブジェクト: {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "カスタムフィールドのタイプの変更はサポートされていません。" -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "このスクリプトではスケジューリングが有効になっていません。" -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "テキスト" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "テキスト (長い)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "整数" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "実数" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "真偽値 (true/false)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "日付" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "日付と時刻" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "選択" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "複数選択" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "複数オブジェクト" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "無効" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "緩い" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "正確" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "常に" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "設定されている場合" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "非表示" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "はい" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "いいえ" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "リンク" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "最新" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "最古" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "アルファベット順 (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "アルファベット順 (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "情報" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "成功" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "警告" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "危険" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "デバッグ" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "デフォルト" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "失敗" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "毎時" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 時間毎" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "毎日" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "毎週" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 日毎" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "作成" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "更新" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "削除" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "青" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "藍" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "紫" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "桃" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "赤" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "橙" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "黄" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "緑" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "青緑" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "水" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "灰" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "黒" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "白" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "スクリプト" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "通知" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "不明なオペレータ: {op}。次のいずれかでなければなりません。 {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "サポートされていない値のタイプ: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "のタイプが無効です {op} オペレーション: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "ルールセットは辞書でなければならず、辞書であってはなりません {ruleset}。" -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "論理型が無効です。'AND' または 'OR' でなければなりません。ドキュメントを確認してください。" -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "誤ったキーが通知されました。ドキュメントを確認してください。" -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "ウィジェットタイプ" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "未登録のウィジェットクラス: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} render () メソッドを定義する必要があります。" -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "メモ" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "任意のカスタムコンテンツを表示します。Markdown がサポートされています。" -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "オブジェクト数" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." msgstr "NetBox モデルのセットと、各タイプで作成されたオブジェクトの数を表示します。" -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "オブジェクトの数をカウントするときに適用するフィルタ" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "形式が無効です。オブジェクトフィルタはディクショナリとして渡さなければなりません。" -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "オブジェクトリスト" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "任意のオブジェクトリストを表示します。" -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "デフォルトで表示するオブジェクト数" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "形式が無効です。URL パラメータはディクショナリとして渡さなければなりません。" -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS フィード" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "外部 Web サイトの RSS フィードを埋め込みます。" -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "フィード URL" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "表示するオブジェクトの最大数" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "キャッシュされたコンテンツを保存する時間 (秒)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "ブックマーク" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "個人用のブックマークを表示する" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "イベントルールのアクションタイプが不明です: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "イベントパイプラインをインポートできません {name} エラー: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "スクリプトモジュール (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "データファイル (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "グループ (名前)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "クラスタタイプ" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "クラスタタイプ (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "テナントグループ" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "テナントグループ (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "タグ" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "タグ (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "ローカル設定コンテキストがある" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "グループ名" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "必須" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "一意でなければならない" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "UI で表示される" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "UI で編集可能" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "複製可能" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "最小値" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "最大値" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "検証正規表現" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "動作" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "新しいウィンドウ" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "ボタンクラス" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIMEタイプ" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "ファイル拡張子" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "添付ファイルとして" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "共有" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP メソッド" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "ペイロード URL" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL 検証" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "シークレット" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA ファイルパス" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "イベントタイプ" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "有効" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "オブジェクトタイプ" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "1 つ以上の割当オブジェクトタイプ" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "フィールドデータタイプ (テキスト、整数など)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "オブジェクトタイプ" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "オブジェクトタイプ (オブジェクトフィールドまたはマルチオブジェクトフィールド用)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "選択肢" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "選択肢 (選択フィールド用)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "カスタムフィールドが UI上に表示されるかどうか" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "カスタムフィールドが UI上で編集可能かどうか" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "定義済みの選択肢の基本セット (存在する場合)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7100,213 +7646,230 @@ msgstr "" "引用符で囲んだ、カンマ区切りの選択肢。コロン区切りでラベル設定可能: \"choice1:First Choice,choice2:Second " "Choice\"" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "ボタンクラス" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "グループ内の最初のリンクのクラスがドロップダウンボタンに使用されます" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "このルールをトリガーするイベントタイプ" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "アクションオブジェクト" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "ドットパス形式 (module.Class) のウェブフック名またはスクリプト" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "ウェブフック {name} 見つかりません" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "スクリプト {name} 見つかりません" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "割当オブジェクトタイプ" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "エントリの分類" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "ユーザ" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "二重引用符で囲まれたカンマ区切りユーザ名" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "グループ" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "二重引用符で囲まれたカンマで区切りグループ名" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "関連オブジェクトタイプ" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "フィールドタイプ" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "選択肢" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "データ" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "データファイル" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "コンテンツタイプ" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP content type" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "イベントタイプ" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "アクションタイプ" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "タグ付きオブジェクトタイプ" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "許可されるオブジェクトタイプ" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "リージョン" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "サイトグループ" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "ロケーション" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "デバイスタイプ" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "ロール" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "クラスタタイプ" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "クラスタグループ" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "クラスタ" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "テナントグループ" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "このカスタムフィールドを持つオブジェクトのタイプ" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "既定値" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "関連オブジェクトのタイプ (オブジェクト/マルチオブジェクトフィールドのみ)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "関連オブジェクトフィルタ" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "クエリパラメータを JSON オブジェクトとして指定します。" -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "カスタムフィールド" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." msgstr "このフィールドのタイプ。オブジェクト/マルチオブジェクトフィールドの場合は、関連するオブジェクトタイプを以下から選択してください。" -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "これはフォームフィールドのヘルプテキストとして表示されます。Markdown がサポートされています。" -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "関連オブジェクト" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" msgstr "1 行に 1 つの選択肢を入力します。必要に応じて、各選択肢にコロンを付けることで、ラベルを指定できます。例:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "カスタムリンク" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "テンプレート" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7315,184 +7878,192 @@ msgstr "" "リンクテキストの Jinja2 テンプレートコード。オブジェクトを次のように参照します。 " "{example}。空のテキストとしてレンダリングされるリンクは表示されません。" -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "リンク URL の Jinja2 テンプレートコード。オブジェクトを次のように参照します。 {example}。" -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "テンプレートコード" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "テンプレートをエクスポート" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "レンダリング" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "選択したリモートソースから、テンプレートコンテンツが入力されます。" -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "ローカルコンテンツまたはデータファイルのいずれかを指定する必要があります" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "保存済みフィルタ" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "通知グループには、少なくとも 1 人のユーザまたはグループを指定します。" -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP リクエスト" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "スクリプト" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "JSON フォーマットで条件を入力。" -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." msgstr "JSON フォーマットでアクションに渡すパラメータを入力してください。" -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "イベントルール" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "トリガー" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "通知グループ" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "テナント" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "データは、以下で選択したリモートソースから入力されます。" -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "ローカルデータまたはデータファイルのいずれかを指定する必要があります" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "コンテンツ" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "スケジュール" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "レポートの実行をスケジュールする" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "繰り返す" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "実行される間隔 (分)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (現在時刻: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "予定時刻は将来の時刻でなければなりません。" -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "変更をコミット" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "変更をDBにコミットする (dry runの場合はチェックを外す)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "スクリプトの実行をスケジュールする" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "実行される間隔 (分単位)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "データベースの変更は自動的に元に戻されました。" -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "スクリプトがエラーで中止されました: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "例外が発生しました: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "エラーにより、データベースの変更が元に戻されました。" -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "indexerが見つかりません" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "コンフィグコンテキスト" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "コンフィグコンテキスト" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON データはオブジェクト形式である必要があります。例:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" msgstr "最終的なコンフィグコンテキストでは、ローカルコンフィグコンテキストが優先されます。" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "テンプレートコード" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2 テンプレートコード。" -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "環境パラメータ" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7502,101 +8073,101 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">追加パラメータ" " はJinja2 環境を構築するときに渡されます。" -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "設定テンプレート" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "設定テンプレート" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "このフィールドが適用されるオブジェクト。" -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "このカスタムフィールドが保持するデータのタイプ" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "このフィールドがマップされる NetBox オブジェクトのタイプ (オブジェクトフィールド用)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "内部フィールド名" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "英数字とアンダースコアのみ使用できます。" -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "カスタムフィールド名には二重アンダースコアを使用できません。" -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" msgstr "表示されるフィールド名 (指定しない場合は、フィールド名が使用されます)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "グループ名" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "同じグループ内のカスタムフィールドは一緒に表示されます" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "必須" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." msgstr "このフィールドは、オブジェクトを作成・編集に必要です。" -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "ユニークでなければならない" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "このフィールドの値は、割当オブジェクトで一意である必要があります" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "検索優先度" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." msgstr "検索用の重み付け。値が小さいほど優先されます。検索優先度が 0 のフィールドは無視されます。" -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "フィルタロジック" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." msgstr "Loose は指定した文字列が含まれる場合に一致し、exact はフィールド全体と一致します。" -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "デフォルト" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." msgstr "フィールドのデフォルト値 (JSON 値である必要があります)。文字列を二重引用符で囲みます (例:「Foo」)。" -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7604,35 +8175,35 @@ msgstr "" "query_params dict (JSON 値である必要があります) " "を使用してオブジェクト選択の選択肢をフィルタリングします。文字列を二重引用符で囲みます (例:「Foo」)。" -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "表示優先度" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "値が大きいフィールドは、フォームの下に表示されます。" -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "最小値" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "最小許容値 (数値フィールド用)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "最大値" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "最大許容値 (数値フィールド用)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "バリデーション正規表現" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7642,243 +8213,245 @@ msgstr "" "テキストフィールド値に適用する正規表現。^ と $ を使用して文字列全体を強制的に一致させます。例えば、 ^ " "[A-Z]{3}$ は値を3 字の大文字に制限します。" -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "選択肢" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "カスタムフィールドを UI に表示するかどうかを指定します" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "カスタムフィールド値を UI で編集できるかどうかを指定します" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "複製可能" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "オブジェクトの複製時にこの値を複製する" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "カスタムフィールド" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "カスタムフィールド" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "デフォルト値が無効です \"{value}\": {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "最小値は数値フィールドにのみ設定できます" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "最大値は数値フィールドにのみ設定できます" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "正規表現の検証は、テキストフィールドと URL フィールドでのみサポートされます。" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "ブーリアン型フィールドには一意性を強制できない" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "選択フィールドには選択肢のセットを指定する必要があります。" -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "選択肢は選択フィールドにのみ設定できます。" -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "オブジェクトフィールドはオブジェクトタイプを定義する必要があります。" -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} フィールドはオブジェクトタイプを定義できません。" -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "関連オブジェクトフィルターはオブジェクトフィールドにのみ定義できます。" -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "フィルタは、属性を値にマッピングするディクショナリとして定義する必要があります。" -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "真" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "偽" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "値は次の正規表現とマッチする必要があります。 {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "値は文字列でなければなりません。" -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "値は正規表現 '{regex}'と一致する必要があります" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "値は {minimum} 以上でなければなりません" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "値は {maximum} を超えてはいけません" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "値は実数でなければなりません。" -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "値は true または false でなければなりません。" -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "日付値は ISO 8601 フォーマット (YYYY-MM-DD) である必要があります。" -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "日付と時刻の値は ISO 8601 フォーマット (YYYY-MM-DD HH:MM:SS) である必要があります。" -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "{value}は選択肢 {choiceset} に含まれていません。" -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "{value}は選択肢 {choiceset} に含まれていません。" -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "{type}ではなく、オブジェクトIDを指定してください" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "{type} ではなくオブジェクト ID のリストを入力してください" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "無効なオブジェクト ID が見つかりました: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "必須フィールドを空にすることはできません。" -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "定義済みの選択肢の基本セット (オプション)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "選択肢は自動的にアルファベット順に並べられます" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "カスタムフィールド選択肢" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "カスタムフィールド選択肢" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "基本選択肢または追加選択肢を定義する必要があります。" -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " "it." msgstr "選択肢を削除できません {choice} あるように {model} それを参照するオブジェクト。" -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "レイアウト" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "設定" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "ダッシュボード" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "ダッシュボード" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "オブジェクトタイプ" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "このルールが適用されるオブジェクト。" -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "このルールをトリガーするイベントのタイプ。" -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "条件" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "イベントを生成するかどうかを決定する一連の条件。" -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "アクションタイプ" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "アクションオブジェクトに渡す追加データ" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "イベントルール" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "イベントルール" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -7887,7 +8460,7 @@ msgstr "" "この URL は、Webhook が呼び出されたときに定義された HTTP メソッドを使用して呼び出されます。Jinja2 " "テンプレート処理はリクエストボディと同じコンテキストでサポートされています。" -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available ここに。" -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "追加ヘッダー" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -7910,11 +8483,11 @@ msgstr "" "HTTP コンテンツタイプに加えて、リクエストとともに送信されるユーザ指定の HTTP ヘッダー。ヘッダーは次の形式で定義する必要があります。 " "名前:値。Jinja2 テンプレート処理はリクエストボディ (下記) と同じコンテキストでサポートされています。" -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "ボディテンプレート" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -7926,11 +8499,11 @@ msgstr "" "model, timestamp, username, " "request_id, and data." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "シークレット" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -7939,77 +8512,77 @@ msgstr "" "提供された場合、リクエストにはシークレットをキーとして使用したペイロード本体のHMAC 16 進ダイジェストを含むX-Hook-" "Signature ヘッダー が含まれます 。シークレットはリクエストでは送信されません。" -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "SSL 証明書検証を有効にします。注意して無効にしてください。" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA ファイルパス" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." msgstr "SSL 検証に使用する特定の CA 証明書ファイル。システムデフォルトを使用するには空白のままにしておきます。" -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "ウェブフック" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "ウェブフック" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "SSL 検証が無効になっている場合は、CA 証明書ファイルを指定しないでください。" -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "このリンクが適用されるオブジェクトタイプ。" -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "リンクテキスト" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "リンクテキストの Jinja2 テンプレートコード" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "リンク URL" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "リンク URL の Jinja2 テンプレートコード" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "同じグループのリンクはドロップダウンメニューとして表示されます" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "新しいウィンドウ" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "リンクを強制的に新しいウィンドウで開く" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "カスタムリンク" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "カスタムリンク" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "このテンプレートが適用されるオブジェクトタイプ。" -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8017,2397 +8590,2504 @@ msgstr "" "Jinja2 テンプレートコード。エクスポートされるオブジェクトのリストは、 " "クエリーセットという名前のコンテキスト変数として渡されます。" -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "デフォルトは text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "ファイル拡張子" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "レンダリングされたファイル名に追加する拡張子" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "添付ファイルとして" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "ファイルを直接ダウンロードする" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "エクスポートテンプレート" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "エクスポートテンプレート" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "\"{name}\"は予約されています。別の名前を選択してください。" -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "このフィルタが適用されるオブジェクトタイプ。" -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "共有した" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "保存済みフィルタ" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "保存済みフィルタ" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "フィルタパラメータは、キーワード引数の辞書として保存する必要があります。" -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "画像高さ" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "画像幅" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "添付画像" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "添付画像" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "このオブジェクトタイプ ({type})には添付画像を割り当てることができません。" -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "種類" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "ジャーナルエントリ" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "ジャーナルエントリ" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "このオブジェクトタイプ({type})ではジャーナリングはサポートされていません 。" -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "ブックマーク" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "ブックマーク" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "このオブジェクトタイプ ({type})にはブックマークを割り当てられません。" -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "読む" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "出来事" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "通知" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "通知" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "このタイプのオブジェクト ({type}) 通知はサポートしていません。" -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "グループ" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "ユーザ" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "通知グループ" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "通知グループ" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "サブスクリプション" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "サブスクリプション" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "実行可能" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "スクリプト" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "スクリプト" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "スクリプトモジュール" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "スクリプトモジュール" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "タイムスタンプ" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "フィールド" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "値" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "キャッシュ値" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "キャッシュ値" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "ブランチ" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "ブランチ" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "段階的変更" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "段階的変更" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "このタグを適用できるオブジェクトタイプ。" -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "タグ" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "タグ" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "タグ付きアイテム" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "タグ付きアイテム" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "スクリプトデータ" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "スクリプト実行パラメータ" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "却下" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "オブジェクトタイプ" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "一意性を検証" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "可視" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "編集可能" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "関連オブジェクトタイプ" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "チョイスセット" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "複製可能" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "最小値" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "最大値" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "検証正規表現" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "カウント" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "アルファベット順に並べる" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "新規ウィンドウ" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "添付ファイルとして" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "データファイル" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "同期済み" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "画像" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "サイズ (バイト)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "読む" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL バリデーション" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "イベントタイプ" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "デバイスロール" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "コメント (ショート)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "ライン" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "レベル" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "メッセージ" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "メソッド" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "%(limit_value)sと等しいことを確認する 。" -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "%(limit_value)sと等しくないことを確認する。" -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "このフィールドは空でなければなりません。" -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "このフィールドは空であってはなりません。" -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "検証ルールはディクショナリとして渡さなければなりません" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "のカスタム検証が失敗しました {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "属性が無効です」{name}「」(リクエスト用)" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "{model}において{name}属性は無効です" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "ダッシュボードがリセットされました。" -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "ウィジェットの追加: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "ウィジェットの更新: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "削除したウィジェット: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "ウィジェットの削除中にエラーが発生しました: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "スクリプトを実行できません:RQ ワーカープロセスが実行されていません。" -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "有効な IPv4 または IPv6 アドレスを入力してください。(サブネットマスクが使用可能)" -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "IP アドレス形式が無効です: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "有効な IPv4 または IPv6 プレフィックスとマスクを CIDR 表記で入力します。" -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "IP プレフィックス形式が無効です: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "要求されたプレフィックスサイズを収容するにはスペースが足りません" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "コンテナ" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "ループバック" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "エニーキャスト" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "スタンダード" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "チェックポイント" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "シスコ" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "プレーンテキスト" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "IP アドレス形式が無効です: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "インポート対象" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "インポート対象 (名前)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "エクスポート対象" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "エクスポート対象 (名前)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "VRF のインポート" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "VRF (RD) をインポート" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "VRF のエクスポート" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "VRF (RD) をエクスポート" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "L2VPN のインポート" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "L2VPN (識別子) のインポート" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "L2VPN のエクスポート" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "L2VPN (識別子) のエクスポート" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "プレフィックス" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "プレフィックス内" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "プレフィックス内およびプレフィックスを含む" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "このプレフィックス / IP を含むプレフィックス" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "マスクの長さ" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN 番号 (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "アドレス" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "このプレフィックス / IP を含む範囲" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "親プレフィックス" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "仮想マシン (名前)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "仮想マシン (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "インタフェース (名前)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM インタフェース (名前)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM インタフェース (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP グループ (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "インタフェースに割り当てられているか" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "割当済みか" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "サービス (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT 内部の IP アドレス (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "割当インタフェース" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "割り当てられた VM インターフェイス" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP アドレス (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP アドレス" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "プライマリ IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "プライマリ IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "有効な IPv4 または IPv6 アドレス (マスクなし) を入力します。" -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "IPv4/IPv6 アドレスの形式が無効です: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "このフィールドには、マスクなしの IP アドレスが必要です。" -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "有効な IPv4 または IPv6 アドレスを指定してください。" -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "有効な IPv4 または IPv6 アドレス (CIDR マスク付き) を入力します。" -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "CIDR マスク (例:/24) が必要です。" -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "アドレスパターン" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "重複を禁止する" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "非公開です" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "追加日" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN グループ" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "プレフィックス長" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "プールです" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "すべて使用済として扱う" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN アサイメント" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS ネーム" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "プロトコル" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "グループ ID" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "認証タイプ" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "認証キー" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "認証" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "スコープタイプ" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "スコープ" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN ID の範囲" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "サイトとグループ" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "ポート" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "インポートルートターゲット" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "エクスポートルートターゲット" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "割当 RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLAN のグループ (存在する場合)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "割当インタフェースの親デバイス (存在する場合)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "仮想マシン" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "割当インタフェースの親VM (存在する場合)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "プライマリか" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "割当デバイスのプライマリ IP アドレスにする" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "デバイスまたは仮想マシンが指定されていないため、プライマリ IP として設定できません" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "インタフェースが指定されていないため、プライマリ IP として設定できません" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "認証タイプ" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "スコープの種類 (アプリとモデル)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "割当 VLAN グループ" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP プロトコル" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "VM に割り当てられていない場合は必須" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "デバイスに割り当てられていない場合は必須" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} はこのデバイス/VM には割り当てられていません。" -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "ルートターゲット" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "インポートターゲット" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "エクスポートターゲット" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "VRF によるインポート" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "VRF によるエクスポート" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "プライベート" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "アドレスファミリー" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "レンジ" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "開始" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "終了" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "範囲内を検索" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "VRF 内に存在する" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "デバイス/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "親プレフィックス" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "割当デバイス" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "割当VM" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "インタフェースに割当済" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS名" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "VLAN ID が含まれています" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "仮想マシン" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "ルートターゲット" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "集約" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN レンジ" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "サイト/VLAN 割り当て" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP アドレス範囲" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP グループ" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "デバイス/VMのプライマリIPにする" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (インサイド)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP アドレスは 1 つのオブジェクトにのみ割り当てることができます。" -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" -msgstr "親オブジェクトのプライマリ IP として指定されている間は IP アドレスを再割り当てできません" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" +msgstr "" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "プライマリ IP として指定できるのは、インタフェースに割り当てられた IP アドレスのみです。" -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "仮想 IP アドレス" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "既に割り当てられています" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN ID" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "子 VLAN" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." msgstr "カンマ区切りのポート番号のリスト。範囲はハイフンを使用して指定できます。" -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "サービステンプレート" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "ポート (s)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "サービス" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "サービステンプレート" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "テンプレートから" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "カスタム" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "サービステンプレートを使用しない場合は、名前、プロトコル、およびポートを指定する必要があります。" -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "開始" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN レンジ" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN レンジ" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "開始ASN ({start}) は終了ASN ({end}) より小さくなければなりません)。" -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "この AS 番号空間を担当する地域インターネットレジストリ" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16 または 32 ビットのAS番号" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "グループ ID" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "プロトコル" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "認証タイプ" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "認証キー" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP グループ" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "FHRP グループ" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "FHRP グループ割当" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "FHRP グループ割当" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "プライベート" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "この RIR が管理する IP スペースはプライベートと見なされます" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4 または IPv6 ネットワーク" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "この IP スペースを管理する地域インターネットレジストリ" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "追加日" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "集約" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "集約" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "/0 マスクを使用して集約を作成することはできません。" -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " "aggregate ({aggregate})." msgstr "集約は重複できません。{prefix} は既存の集約({aggregate}) に含まれます。" -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " "({aggregate})." msgstr "プレフィックスは集約と重複できません。 {prefix} は既存の集約 ({aggregate}) に含まれます。" -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "ロール" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "ロール" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "プレフィックス" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "マスク付きの IPv4 または IPv6 ネットワーク" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "このプレフィックスの動作ステータス" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "このプレフィックスの主な機能" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "プールか" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "このプレフィックス内のすべての IP アドレスが使用可能と見なされます。" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "使用済み" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "プレフィックス" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "/0 マスクではプレフィックスを作成できません。" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "グローバルテーブル" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "重複したプレフィックスが見つかりました {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "開始アドレス" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4 または IPv6 アドレス (マスク付き)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "終了アドレス" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "この範囲の動作状況" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "この範囲の主な機能" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP アドレス範囲" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP アドレス範囲" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "開始・終了 IP アドレスのバージョンが一致している必要があります" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "開始・終了 IP アドレスマスクは一致する必要があります" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "終了アドレスは開始アドレスより大きくなければなりません ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "VRF{vrf}において、定義されたアドレスが範囲{overlapping_range}と重複しています " -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "定義された範囲がサポートされている最大サイズを超えています ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "アドレス" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "この IP の動作ステータス" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "この IP の役割" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (インサイド)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "このアドレスが「アウトサイド」IPであるIP" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "ホスト名または FQDN (大文字と小文字は区別されません)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP アドレス" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "/0 マスクで IP アドレスを作成することはできません。" -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} はネットワーク ID のため、インタフェースに割り当てることはできません。" -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "{ip} はブロードキャストアドレスのため、インタフェースに割り当てることはできません。" -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "重複した IP アドレスが見つかりました {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "親オブジェクトのプライマリ IP として指定されている間は IP アドレスを再割り当てできません" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "SLAAC ステータスを割り当てることができるのは IPv6 アドレスのみです" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "ポート番号" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "サービステンプレート" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "サービステンプレート" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "このサービスがバインドされている IP アドレス (存在する場合)" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "サービス" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "サービス" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "サービスをデバイスと仮想マシンの両方に関連付けることはできません。" -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "サービスは、デバイスまたは仮想マシンのいずれかに関連付ける必要があります。" -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN グループ" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "scope_id なしでscope_typeを設定することはできません。" -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "scope_typeなしでscope_idを設定することはできません。" -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "範囲は重複できません。" -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "この VLAN が割り当てられているサイト (存在する場合)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN グループ (オプション)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "数値によるVLAN ID (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "この VLAN の動作ステータス" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "この VLAN の主な機能" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " "site {site}." msgstr "VLANはグループ{group}に割り当てられています (スコープ: {scope}) サイト{site}への割り当てはできません 。" -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID は範囲内にある必要があります {ranges} グループ内の VLAN 用 {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "ルート識別子(RD)" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "一意のルート識別子 (RFC 4364 におけるRoute Distinguisher)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "重複を禁止する" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "この VRF 内のプレフィックス/IP アドレスの重複を防ぐ" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "ルートターゲット値 (RFC 4360 に従ってフォーマットされています)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "ルートターゲット" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "ルートターゲット" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "サイト数" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "プロバイダ数" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "集約" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "追加日" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "プレフィックス" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "使用率" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP アドレス範囲" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "プレフィックス (フラット)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "階層" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "プール" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "使用済み" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "開始アドレス" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (インサイド)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (アウトサイド)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "割当済み" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "割当オブジェクト" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "スコープタイプ" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID レンジ" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "ユニーク" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "インポートターゲット" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "エクスポートターゲット" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} は有効なプレフィックスではありません。もしかして{suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "プレフィックス長は%(limit_value)s以下でなければなりません 。" -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "プレフィックス長は%(limit_value)s以上でなければなりません 。" -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" msgstr "DNS 名に使用できるのは、英数字、アスタリスク、ハイフン、ピリオド、アンダースコアのみです。" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "子プレフィックス" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "子レンジ" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "関連IPアドレス" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "デバイスインタフェース" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM インタフェース" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "このフィールドは空白であってはなりません。" -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." msgstr "値は直接渡す必要があります (例: \"foo\": 123)。辞書やリストは使用しないでください。" -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} は有効な選択肢ではありません。" -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "コンテントタイプが無効です: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "値が無効です。コンテントタイプを '.'として指定してください。" -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "範囲は (下限、上部) の形式で指定する必要があります。" -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "範囲の境界は整数として定義する必要があります。" -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} get_view_name () を実装する必要があります" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "モデル{model}において権限{permission}が無効です " -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "ダークレッド" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "ローズ" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "フクシア" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "ダークパープル" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "ライトブルー" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "アクア" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "ダークグリーン" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "ライトグリーン" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "ライム" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "アンバー" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "ダークオレンジ" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "ブラウン" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "ライトグレー" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "グレー" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "ダークグレー" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "直接" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "アップロード" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "自動検出" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "カンマ" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "セミコロン" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "タブ" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "設定パラメータが無効です: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "ログインバナー" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "ログインページに表示する追加コンテンツ" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "メンテナンスバナー" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "メンテナンスモード時に表示する追加コンテンツ" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "トップバナー" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "各ページの上部に表示する追加コンテンツ" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "ボトムバナー" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "各ページの下部に表示する追加コンテンツ" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "グローバルに一意なIP空間" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "グローバルテーブル内で一意の IP アドレスを強制する" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "IPv4 を優先する" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "IPv6よりもIPv4アドレスを優先する" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "ラックユニットの高さ" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "ラック図を描画する際の、ユニットの高さのデフォルト値" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "ラックユニット幅" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "ラック図を描画する際の、ユニットの幅のデフォルト値" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "給電電圧" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "電源タップのデフォルト電圧" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "給電アンペア数" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "電源タップのデフォルトアンペア数" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "電源タップの最大使用率" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "電源タップのデフォルト最大使用率" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "許可された URL スキーム" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "ユーザ提供コンテンツの URL に許可されているスキーム" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "デフォルトページサイズ" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "最大ページサイズ" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "カスタムバリデータ" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "カスタム検証ルール (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "保護ルール" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "削除保護ルール (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "デフォルト設定" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "新規ユーザのデフォルト設定" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "メンテナンスモード" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "メンテナンスモードを有効にする" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQLの有効化" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "GraphQL API を有効にする" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "変更履歴の保存" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "変更履歴の保存日数 (無制限の場合は0)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "ジョブ結果の保存" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "ジョブの結果履歴を保存する日数 (無制限の場合は0)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "マップ URL" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "地理的位置をマッピングするためのベース URL" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "部分一致" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "完全一致" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "で始まる" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "で終わる" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "正規表現" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "オブジェクトタイプ" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "検索" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" msgstr "二重引用符で囲まれたカンマ区切りのタグslug (例:\"tag1,tag2,tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "タグを追加" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "タグを削除" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} はモデルクラスを指定する必要があります。" -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "カスタムフィールドデータに、不明なフィールド名 '{name}'が存在します。" -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "カスタムフィールドの値が無効です。'{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "カスタムフィールド '{name}'には一意の値が必要です。" -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "必須カスタムフィールド'{name}'が見つかりません。" -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "リモートデータソース" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "データパス" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "リモートファイルへのパス (データソースルートからの相対パス)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "自動同期が有効" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "データファイルの更新時にデータの自動同期を有効にする" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "同期日付" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} はsync_data () メソッドを実装する必要があります。" -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "組織" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "サイトグループ" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "テナントグループ" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "連絡先グループ" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "連絡先のロール" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "連絡先の割り当て" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "ラックロール" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "ラック図" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "ラックタイプ" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "モジュール" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "仮想デバイスコンテキスト" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "メーカ" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "デバイス構成要素" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "在庫品目のロール" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "接続" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "ケーブル" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "無線リンク" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "インタフェース接続" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "コンソール接続" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "電源接続" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "無線 LAN グループ" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "プレフィックスと VLAN のロール" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN レンジ" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN グループ" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "サービステンプレート" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "サービス" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "トンネル" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "トンネルグループ" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "トンネルターミネーション" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2 VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "終端" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKEプロポザール" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE ポリシ" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPsec プロポーザル" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPsec ポリシ" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPsec プロファイル" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "仮想ディスク" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "クラスタタイプ" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "クラスタグループ" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "回線タイプ" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "回路グループ" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "グループ課題" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "回路終端" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "プロバイダ" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "プロバイダアカウント" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "プロバイダネットワーク" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "電源盤" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "コンフィギュレーション" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "コンフィグコンテキスト" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "設定テンプレート" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "カスタマイズ" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "カスタムフィールド" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "カスタムフィールド選択肢" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "カスタムリンク" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "エクスポートテンプレート" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "保存済みフィルタ" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "画像添付ファイル" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "オペレーション" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "インテグレーション" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "データソース" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "イベントルール" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "ウェブフック" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "ジョブ" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "ロギング" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "通知グループ" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "ジャーナルエントリ" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "変更ログ" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "管理者" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API トークン" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "権限" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "システム" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "プラグイン" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "設定履歴" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "バックグラウンドタスク" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "権限はタプルまたはリストとして渡す必要があります。" -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "ボタンはタプルまたはリストとして渡す必要があります。" -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "ボタンの色はButtonColorChoicesから選択する必要があります。" -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " "instance!" msgstr "PluginTemplateExtension クラス {template_extension} がインスタンスとして渡されました!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10416,1329 +11096,1390 @@ msgstr "" "{template_extension} はnetbox.plugins.Plugins.PluginTemplate Extension " "のサブクラスではありません!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} はnetbox.Plugins.PluginMenuItem のインスタンスでなければなりません" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} はnetbox.plugins.PluginMenuItem のインスタンスでなければなりません" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} netbox.plugins.Plugin.MenuButton のインスタンスでなければなりません" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_contextはディクショナリでなければなりません" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX ナビゲーション" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "動的 UI ナビゲーションを有効にする" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "実験的機能" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "言語" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "UI を指定された言語に強制的に翻訳します" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "翻訳のサポートはローカルで無効になっています" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "ページの長さ" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "1 ページに表示するデフォルトのオブジェクト数" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "ページネータの配置" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "下部" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "上部" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "両方" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "テーブルを基とした、ページネータが表示される場所" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "データ形式" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "UI 内で汎用データを表示するための推奨構文" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "ストアが無効です: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "初期化後にストアをレジストリに追加できません" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "レジストリからストアを削除できません" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "チェコ語" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "デンマーク語" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "ドイツ人" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "英語" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "スペイン語" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "フランス語" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "イタリア語" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "日本語" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "オランダ語" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "ポーランド語" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "ポルトガル語" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "ロシア語" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "トルコ語" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "ウクライナ語" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "中国語" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "すべて選択" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "すべて切り替え" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "ドロップダウンを切り替え" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "エラー" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} が見つかりません" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "フィールド" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "値" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "ダミープラグイン" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " "{error}" msgstr "選択したエクスポートテンプレートをレンダリング中にエラーが発生しました ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "行 {i}: ID {id}のオブジェクトは存在しません" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "いいえ {object_type} が選ばれました。" -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "名前が変更されました {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "削除済み {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "変更ログ" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "ジャーナル" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "データを同期できません:データファイルが設定されていません。" -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "の同期データ {object_type} {object}。" -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "同期済み {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} はget_children () を実装する必要があります" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." msgstr "ダッシュボード設定の読込中にエラーが発生しました。デフォルトのダッシュボードが使用中です。" -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "アクセス拒否" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "このページにアクセスする権限がありません" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "ページが見つかりません" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "要求されたページは存在しません" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "サーバエラー" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "リクエストに問題がありました。管理者に問い合わせてください。" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "The complete exception is provided below" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python version" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox version" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "None installed" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "さらにサポートが必要な場合は、以下サイトに投稿してください。" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox ディスカッションフォーラム" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "(GitHub)" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "ホームページ" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "プロフィール" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "通知" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "サブスクリプション" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "環境設定" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "パスワードを変更" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "キャンセル" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "保存" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "テーブル設定" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "テーブル設定をクリア" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "すべて切り替え" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "テーブル" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "注文" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "列" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "何も見つかりませんでした" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "ユーザプロフィール" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "アカウント詳細" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "メール" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "アカウント作成日時" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "最終ログイン" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "スーパーユーザ" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "スタッフ" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "割当グループ" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "なし" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "最近のアクティビティ" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "マイ API トークン" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "トークン" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "書き込み可能" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "最終使用日" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "トークンを追加" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "ホーム" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "ネットボックスモチーフ" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBoxロゴ" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "ドキュメント" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST API ドキュメント" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "ネットボックスラボサポート" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "ソースコード" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "コミュニティ" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "インストール日" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "終端日" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "グループを割り当て" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "回線終端を交換する" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "回線%(circuit)sの終端を交換しますか?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Aサイド" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z サイド" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "回路を割り当て" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "回路グループ割り当て" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "回線を追加" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "回線タイプ" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "追加" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "編集" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "スワップ" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "接続済みとしてマークされています" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "に" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "トレース" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "ケーブル編集" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "ケーブルを取り外す" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "接続解除" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "接続" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "ダウンストリーム" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "アップストリーム" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "クロスコネクト" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "パッチパネル/ポート" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "回線を追加" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "プロバイダアカウント" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "設定データ" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "コメント" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "復元" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "パラメータ" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "現在の値" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "新しい値" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "変更日" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "サイズ" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "バイト" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 ハッシュ" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "同期" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "最終同期" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "バックエンド" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "パラメータが定義されていません" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "ファイル" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "ラック図" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "既定のユニット高さ" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "既定のユニット幅" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "電源タップ" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "既定の電圧" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "既定のアンペア数" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "既定の最大使用率" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "グローバルユニークを強制" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "ページ分割数" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "最大ページサイズ" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "ユーザープリファレンス" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "仕事の維持" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "ジョブ" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "作成者" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "スケジューリング" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "ごと %(interval)s 分" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "変更" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "差分" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "前へ" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "次へ" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "オブジェクトが作成されました" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "オブジェクトは削除されました" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "変更なし" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "変更前データ" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "警告:非アトミックな変更と以前の変更レコードの比較" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "変更後のデータ" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "すべて表示 %(count)s 変更点" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "変更ログの保存" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "日々" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "無期限" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "未インストール" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "概要" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "インストール" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "プラグイン詳細" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "サマリー" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "ライセンス" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "バージョン履歴" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "ローカルインストール手順" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "バックグラウンドキュー" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "テーブルを設定" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "ストップ" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "リキュー" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "エンキュー" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "キュー" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "タイムアウト" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "結果 TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "メタ" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "引数" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "キーワード引数" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "によって異なります" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "例外" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "のタスク " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "キューに入っているジョブ" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" msgstr "選択 すべて %(count)s %(object_type_plural)s マッチングクエリ" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "労働者情報" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "ワーカー" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "キュー" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "現在の仕事" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "成功したジョブ数" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "失敗したジョブ数" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "総作業時間" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "秒" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "バックグラウンドワーカー" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "の労働者 %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "エクスポート" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "システムステータス" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "ネットボックスリリース" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "ジャンゴバージョン" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL バージョン" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "データベース名" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "データベースサイズ" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "ご利用いただけません" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ ワーカー" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "デフォルトキュー" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "システムタイム" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "現在の構成" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "これらを切断してもよろしいですか %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "用ケーブルトレース %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "SVG をダウンロード" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "非対称パス" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "以下のノードにはリンクがなく、パスが非対称になっています" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "パススプリット" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "続行するには以下のノードを選択してください" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "トレース完了" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "合計セグメント" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "全長" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "パスが見つかりません" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "関連パス" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "オリジン" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "目的地" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "セグメント" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "不完全" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "選択項目の名前を変更" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "未接続" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "ラック内のデバイスを強調表示" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "ラックなし" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS 座標" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "マップ" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "アセットタグ" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "バーチャルシャーシを見る" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "VDC の作成" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "マネジメント" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "用の NAT" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "ナット" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "電力使用率" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "入力" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "アウトレット" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "割り当て済み" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "レッグ" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "サービスを追加" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "構成要素を追加" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "コンソールポートの追加" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "コンソールサーバポートの追加" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "デバイスベイの追加" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "前面ポートを追加" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "非表示有効" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "非表示無効" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "バーチャルを非表示" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "接続解除を非表示" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "インタフェースを追加" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "在庫品目の追加" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "モジュールベイの追加" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "電源コンセントの追加" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "電源ポートを追加" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "背面ポートを追加" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "コンフィグ" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "コンテキストデータ" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "レンダリング設定" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "ダウンロード" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "設定テンプレートが見つかりません" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "ペアレントベイ" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "リジェネレートslug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "削除" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "ローカル設定コンテキストデータ" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "名前を変更" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "デバイスベイ" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "取付済みデバイス" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "削除 %(device)s から %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11747,451 +12488,471 @@ msgstr "" "本当に削除してもよろしいですか %(device)s から " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "住む" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "ベイ" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "デバイスを追加" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "VMのロール" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "モデル名" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "パーツ番号" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "利用から除外" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "親/子" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "前面イメージ" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "背面画像" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "背面ポート位置" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "接続済みとしてマークされています" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "接続ステータス" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Aサイド" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B サイド" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "終了なし" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "マーク・プランド" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "取付済みとマークする" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "パスステータス" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "アクセス不可" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "パスエンドポイント" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "接続されていません" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "タグなし" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "VLAN が割り当てられていません" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "クリア" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "すべてクリア" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "取り付け奥行き" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "起動ユニット" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "降順単位" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "ラックの高さ" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "子インタフェースの追加" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "スピード/デュプレックス" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE モード" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE タイプ" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q モード" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC アドレス" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "無線リンク" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "ピア" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "チャネル" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "チャンネル周波数" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "メガヘルツ" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "チャンネル幅" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "言った" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "LAG メンバー" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "メンバーインタフェースなし" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "IP アドレスを追加" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "親アイテム" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "パーツ ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "子所在地を追加" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "子ロケーション" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "ロケーションを追加" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "デバイスを追加" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "デバイスタイプを追加" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "モジュールタイプを追加" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "接続デバイス" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "使用率 (割り当て済み)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "電気的特性" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "供給端子" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "電源タップの追加" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "最大消費電力" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "割り当てられた抽選" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "スペース活用" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "ラック重量" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "最大重量" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "合計重量" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "画像とラベル" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "画像のみ" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "ラベルのみ" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "予約を追加" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "リストを表示" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "ラックビューを選択" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "並び替え" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "ラックが見つかりません" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "ラック図を表示" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "予約詳細" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "ラックを追加" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "ポジション" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "サイトを追加" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "子リージョン" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "リージョンを追加" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "タイムゾーン" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "サイトタイム" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "物理アドレス" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "配送先住所" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "子・グループ" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "サイトグループを追加" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "アタッチメント" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "メンバーを追加" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "メンバーデバイス" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "バーチャルシャーシへの新規メンバーの追加 %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "新しいメンバーを追加" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "アクション" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "保存して別のものを追加" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "バーチャルシャーシの編集 %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "ラック/ユニット" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "バーチャルシャーシメンバーの削除" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " "chassis %(name)s?" msgstr "本当に削除してもよろしいですか %(device)s バーチャルシャーシから %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "識別子" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" msgstr "このリクエスト中にモジュールインポートエラーが発生しました。一般的な原因には次のものがあります。" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "必要なパッケージが見つかりません" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12205,11 +12966,11 @@ msgstr "" "local_requirements.txt、通常は取付またはアップグレードプロセスの一部として取付されます。取付されたパッケージを確認するには、以下を実行します。" " ピップフリーズ コンソールから、出力を必要なパッケージのリストと比較します。" -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "アップグレード後に WSGI サービスが再起動されない" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12218,17 +12979,17 @@ msgstr "" "このインストールが最近アップグレードされた場合は、WSGI サービス (gunicorn や uWSGI など) " "が再起動されていることを確認してください。これにより、新しいコードが確実に実行されていることを確認できます。" -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" msgstr "このリクエストの処理中に、ファイル権限エラーが検出されました。一般的な原因には次のものがあります。" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "メディアルートへの書き込み権限が不十分です" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12238,17 +12999,17 @@ msgstr "" "設定されているメディアルートは %(media_root)s。NetBox " "を実行するユーザに、このパス内のすべてのロケーションにファイルを書き込む権限があることを確認してください。" -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" msgstr "この要求の処理中に、データベースプログラミングエラーが検出されました。一般的な原因には次のものがあります。" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "データベースマイグレーションが見つかりません" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12258,11 +13019,11 @@ msgstr "" "の新しいリリースにアップグレードする場合、新しいデータベースマイグレーションを適用するには、アップグレードスクリプトを実行する必要があります。マイグレーションは以下を実行することで手動で実行できます。" " python3 manage.py マイグレーション コマンドラインから。" -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "サポートされていない PostgreSQL バージョン" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12271,263 +13032,268 @@ msgstr "" "PostgreSQL バージョン 12 以降が使用されていることを確認してください。これを確認するには、NetBox " "の認証情報を使用してデータベースに接続し、次のクエリを実行します。 バージョンを選択 ()。" -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "このオブジェクトに関連するデータファイルは削除されました" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "データ同期済み" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "データを同期" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "環境パラメータ" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "テンプレート" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "グループ名" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "ユニークでなければならない" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "クローン可能" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "既定値" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "検索重量" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "フィルタロジック" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "ディスプレイ重量" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "UI が表示される" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "UI 編集可能" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "検証ルール" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "正規表現" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "ボタンクラス" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "割当モデル" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "リンクテキスト" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "リンク URL" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "ダッシュボードをリセット" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." msgstr "これにより削除されます すべて ウィジェットを構成し、デフォルトのダッシュボード設定を復元しました。" -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." msgstr "この変更の影響を受けるのは きみの ダッシュボード。他のユーザには影響しません。" -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "ウィジェット構成" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "ウィジェットを閉じる" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "ウィジェットを追加" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "ブックマークはまだ追加されていません。" -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "許可なし" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "このコンテンツを閲覧する権限がありません" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "コンテンツを読み込めません。ビュー名が無効です。" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "コンテンツが見つかりません" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "RSS フィードの取得中に問題が発生しました" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "条件" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "マイムタイプ" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "ファイル拡張子" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "予定日" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "所要時間" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "テスト概要" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "ログ" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "出力" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "読み込み中" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "結果は保留中です" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "ジャーナルエントリ" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "通知グループ" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "割り当てなし" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "ローカル設定コンテキストはすべてのソースコンテキストを上書きします" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "ソースコンテキスト" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "新しいジャーナルエントリ" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "報告書" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "スクリプトを実行する権限がありません" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "スクリプトを実行" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "スクリプトのロード中にエラーが発生しました" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "スクリプトはソースファイルに存在しなくなりました。" -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "ラストラン" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "スクリプトはソースファイルに存在しなくなりました" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "決して" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "もう一度実行" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "モジュール%(module)sからスクリプトを読み込めませんでした " -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "スクリプトが見つかりません" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12536,81 +13302,83 @@ msgstr "" "始めてみよう スクリプトの作成 " "アップロードされたファイルまたはデータソースから。" -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "結果" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "ログ閾値" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "[すべて]" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "タグ付きアイテム" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "許可されるオブジェクトタイプ" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "任意" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "タグ付きアイテムタイプ" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "タグ付きオブジェクト" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP メソッド" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP コンテンツタイプ" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL 検証" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "その他のヘッダー" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "ボディテンプレート" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "一括作成" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "選択オブジェクト" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "追加するには" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "一括削除" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "一括削除を確認" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12620,64 +13388,67 @@ msgstr "" "次の操作で削除されます %(count)s " "%(type_plural)s。選択したオブジェクトを注意深く確認し、この操作を確認してください。" -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "編集" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "一括編集" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "申し込む" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "一括インポート" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "直接インポート" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "ファイルをアップロード" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "送信" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "フィールドオプション" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "アクセサ" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "選択肢" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "インポート値" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "フォーマット:YYYY-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "真/偽を指定してください" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "必須フィールド しなければならない すべてのオブジェクトに指定してください。" -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12685,15 +13456,15 @@ msgid "" msgstr "" "関連オブジェクトは、任意の一意の属性で参照できます。たとえば、 %(example)s VRF はルート識別子で識別されます。" -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "一括削除" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "一括削除を確認" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12703,72 +13474,72 @@ msgstr "" "次の操作で削除されます %(count)s %(obj_type_plural)s から %(parent_obj)s。よく確認してください " "%(obj_type_plural)s 削除する予定。以下で確認する。" -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "これらを削除 %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "名前変更" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "一括名前変更" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "現在の名前" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "新しい名前" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "プレビュー" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "よろしいですか" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "確認" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "選択項目を編集" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "選択項目を削除" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "新規追加 %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "モデルドキュメンテーションを見る" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "ヘルプ" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "作成して別のものを追加" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "フィルタ" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -12777,40 +13548,40 @@ msgstr "" "選択 すべて %(count)s " "%(object_type_plural)s マッチングクエリ" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "新しいリリースが入手可能" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "利用可能です" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "アップグレード手順" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "ダッシュボードのロック解除" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "ロックダッシュボード" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "ウィジェットを追加" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "レイアウトを保存" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "削除を確認" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -12819,40 +13590,40 @@ msgstr "" "本当にしたいですか 削除する %(object_type)s " "%(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "このアクションの結果、次のオブジェクトが削除されます。" -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "前に" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "未読通知なし" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "すべての通知" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "選択" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "リセット" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "ダークモードを有効にする" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "ライトモードを有効にする" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -12860,281 +13631,283 @@ msgid "" msgstr "" "追加する前に %(model)s 最初に作成する必要があります %(prerequisite_model)s。" -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "ページ選択" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "表示中 %(start)s-%(end)s の %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "ページネーションオプション" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "1 ページあたり" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "画像を添付" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "関連オブジェクト" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "タグが割り当てられていません" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "データはアップストリームファイルと同期していません" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "簡易検索" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "保存済みフィルタ" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "注文をクリア" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "ヘルプセンター" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "ジャンゴ管理者" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "ログアウト" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "ログイン" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "ファミリー" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "追加日" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "プレフィックスを追加" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS 番号" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "認証タイプ" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "認証キー" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "仮想 IP アドレス" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "IP アドレスを割り当てる" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "一括作成" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "グループを作成" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "仮想 IP" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "割り当て済みを表示" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "ショー利用可能" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "すべて表示" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "グローバル" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (アウトサイド)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "IP アドレスを割り当てる" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "IP アドレスを選択" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "検索結果" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "IP アドレスを一括追加" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "開始アドレス" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "終了アドレス" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "「完全使用済み」とマークされています" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "アドレス詳細" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "子供 IP" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "使用可能な IP" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "最初に利用可能な IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "プレフィックスの詳細" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "ネットワークアドレス" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "ネットワークマスク" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "ワイルドカードマスク" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "ブロードキャストアドレス" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "IP アドレス範囲を追加" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "深度インジケーターを非表示" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "最大深度" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "最大長" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "集約を追加" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "VRF のインポート" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "VRF のエクスポート" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "L2VPN のインポート" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "L2VPN のエクスポート" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "プレフィックスを追加" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "VLAN の追加" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "ルート識別子" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "ユニークな IP スペース" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "エラー" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "サインイン" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "または" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "スタティックメディア障害-NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "スタティックメディア障害" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "次の静的メディアファイルを読み込めませんでした" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "以下を確認してください" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13143,7 +13916,7 @@ msgstr "" "manage.py コレクトスタティック " "最新のアップグレード時に実行されました。これにより、各静的ファイルの最新のイテレーションが静的ルートパスにインストールされます。" -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13154,7 +13927,7 @@ msgstr "" "スタティック・ルート パス。を参照してください。 インストールドキュメント さらなるガイダンスについて。" -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13162,546 +13935,569 @@ msgid "" msgstr "" "このファイル %(filename)s 静的ルートディレクトリに存在し、HTTP サーバーから読み取ることができます。" -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "クリック ここに NetBox をもう一度ロードしてみます。" -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "連絡" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "タイトル" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "電話" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "コンタクトグループ" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "連絡先グループを追加" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "連絡先のロール" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "連絡先を追加" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "テナントを追加" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "テナントグループ" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "テナントグループの追加" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "割当権限" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "許可" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "ビュー" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "制約" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "割当ユーザ" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "割り当てられたリソース" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "バーチャル CPU" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "メモリー" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "ディスク容量" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "バーチャルマシンを追加" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "デバイスを割り当て" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "選択項目を削除" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "クラスタにデバイスを追加 %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "デバイス選択" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "デバイスを追加" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "クラスタを追加" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "クラスタグループ" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "クラスタタイプ" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "仮想ディスク" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "リソース" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "仮想ディスクを追加" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE ポリシー" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE バージョン" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "事前共有キー" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "シークレットを表示" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "提案" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "イケアの提案" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "認証方法" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "暗号化アルゴリズム" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "認証アルゴリズム" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "ディーエイチグループ" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "SA ライフタイム (秒)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPsec ポリシー" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS グループ" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPsec プロファイル" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS グループ" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPsec プロポーザル" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "SA ライフタイム (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN アトリビュート" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "終了を追加" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "終了を追加" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "カプセル化" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPsec プロファイル" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "トンネル ID" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "トンネルを追加" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "トンネルグループ" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "トンネル終端" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "外部IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "ピアターミネーション" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "暗号" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "メガヘルツ" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "接続インタフェース" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "無線 LAN の追加" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "無線 LAN グループ" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "無線 LAN グループの追加" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "リンクプロパティ" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "距離" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "親連絡先グループ (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "親連絡先グループ (スラッグ)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "連絡先グループ (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "コンタクトグループ (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "連絡先 (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "連絡先ロール (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "コンタクトロール (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "連絡先グループ" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "親テナントグループ (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "親テナントグループ (スラッグ)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "テナントグループ (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "テナントグループ (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "テナントグループ (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "説明" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "割当連絡先" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "連絡先グループ" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "連絡先グループ" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "連絡先のロール" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "連絡先のロール" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "タイトル" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "電話" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "Eメール" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "リンク" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "接触" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "連絡先" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "連絡先割り当て" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "連絡先の割り当て" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "このオブジェクトタイプには連絡先を割り当てられません ({type})。" -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "テナントグループ" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "テナントグループ" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "テナント名はグループごとに一意である必要があります。" -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "テナントslugはグループごとにユニークでなければなりません。" -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "テナント" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "テナント" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "連絡先のタイトル" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "連絡先電話番号" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "連絡先電子メール" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "連絡先住所" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "連絡先リンク" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "連絡先の説明" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "パーミッション (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "通知グループ (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "ファーストネーム" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "苗字" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "スタッフステータス" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "スーパーユーザステータス" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "キーが指定されていない場合は、キーが自動的に生成されます。" -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "スタッフですか" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "スーパーユーザですか" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "閲覧可能" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "追加可能" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "変更可能" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "削除可能" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "ユーザインタフェース" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13710,7 +14506,7 @@ msgstr "" "キーの長さは 40 文字以上でなければなりません。 キーは必ず記録してください。 " "このフォームを送信する前に。トークンが作成されるとアクセスできなくなる可能性があるためです。" -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13719,31 +14515,31 @@ msgstr "" "トークンを使用できる許可された IPv4/IPv6 ネットワーク。制限がない場合は空白のままにしてください。例: " "10.1.1.0/24,192.168.10.16/32,2001: db 8:1:: /64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "パスワードを確認" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "確認のため、以前と同じパスワードを入力します。" -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "パスワードが一致しません!入力内容を確認して、もう一度試してください。" -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "その他のアクション" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "上記以外に付与されたアクション" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "オブジェクト" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -13752,75 +14548,75 @@ msgstr "" "許可されたオブジェクトのみを返すクエリセットフィルタの JSON 式。null " "のままにしておくと、このタイプのすべてのオブジェクトに一致します。複数のオブジェクトのリストでは、論理 OR 演算が行われます。" -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "少なくとも 1 つのアクションを選択する必要があります。" -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "のフィルタが無効です {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "この権限によって付与されたアクションのリスト" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "制約" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "選択したタイプの該当するオブジェクトに一致するクエリーセットフィルタ" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "許可" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "権限" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "ユーザプリファレンス" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "キー '{path}'はリーフノードです。新しいキーを割り当てることはできません" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "キー '{path}'はディクショナリです。ディクショナリ以外の値は割り当てられません" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "期限切れ" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "最終使用日" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "キー" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "書き込み有効" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "このキーを使用して作成/更新/削除操作を許可する" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "許可された IP" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -13829,96 +14625,96 @@ msgstr "" "ネットワーク。制限がない場合は空白のままにしてください。例:10.1.1.0/24、192.168.10.16/32、2001: DB 8:1:: " "/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "トークン" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "トークン" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "グループ" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "ユーザ" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "このユーザ名のユーザはすでに存在します。" -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "カスタムアクション" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "指定された属性を使用しても関連オブジェクトが見つかりません: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "複数のオブジェクトが、指定された属性に一致します。 {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " "attributes. Received an unrecognized value: {value}" msgstr "関連オブジェクトは、数値 ID または属性の辞書で参照する必要があります。認識できない値を受け取りました: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "指定された数値 ID を使用しても関連オブジェクトが見つかりません: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} キーは定義されているが、CHOICES はリストではない" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "重量は正の数でなければなりません" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "値 'が無効です{weight}'は重みを表す (数字でなければならない)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "不明なユニット {unit}。次のいずれかである必要があります。 {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "長さは正の数でなければなりません" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "値 'が無効です{length}'は長さを表す (数字でなければならない)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " "found: " msgstr "削除できません {objects}。 {count} 依存オブジェクトが見つかりました: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "50 個以上" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "16 進 RGB カラー。例: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -13927,7 +14723,7 @@ msgstr "" "%s(%r) は無効です。CounterCacheField の to_model パラメータは 'app.model' " "形式の文字列でなければなりません" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -13935,92 +14731,93 @@ msgid "" msgstr "" "%s(%r) は無効です。CounterCacheField の to_field パラメータは 'field' 形式の文字列でなければなりません" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "オブジェクトデータを CSV、JSON、または YAML 形式で入力します。" -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV デリミター" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "CSV フィールドを区切る文字。CSV 形式にのみ適用されます。" -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "ファイルをアップロード/選択するときは、フォームデータを空にする必要があります。" -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "不明なデータ形式: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "データ形式を検出できません。指定してください。" -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "CSV 区切り文字が無効です" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." msgstr "" "YAML データが無効です。データは複数のドキュメント、またはディクショナリのリストから構成される 1 つのドキュメントの形式である必要があります。" -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " "order." msgstr "リストが無効です ({value})。数値でなければならず、範囲は昇順でなければなりません。" -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" msgstr "1 つまたは複数の数値範囲をカンマで区切って指定します。例: 1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." msgstr "範囲が無効です ({value})。昇順の整数の範囲でなければなりません。" -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "複数選択フィールドの値が無効です: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "オブジェクトが見つかりません: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " "found" msgstr "「{value}「」はこのフィールドにとって一意の値ではありません。複数のオブジェクトが見つかりました" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "「{field_name}「」は無効なアクセサーフィールド名です。" -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "オブジェクトタイプは「」として指定する必要があります」" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "オブジェクトタイプが無効です" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14029,14 +14826,14 @@ msgstr "" "英数字の範囲は一括作成でサポートされています。1 つの範囲内で大文字と小文字と文字が混在することはサポートされていません (例: [年齢, " "性別] -0/0/ [0-9])。" -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" msgstr "" "複数の IP を作成するには、数値範囲を指定します。
    例: 192.0.2。[1,5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    マークダウン シンタックスはサポートされています" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL に対応したユニークな省略記法" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "にコンテキストデータを入力してください JSON フォーマット。" -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC アドレスは EUI-48 形式である必要があります" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "正規表現を使う" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "更新する既存のオブジェクトの数値 ID (新しいオブジェクトを作成しない場合)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "認識できないヘッダー: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "使用可能な列" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "選択した列" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." msgstr "このオブジェクトは、フォームがレンダリングされてから変更されました。詳細については、オブジェクトの変更ログを参照してください。" -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "レンジ」{value}「は無効です。" -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " "({begin})." msgstr "範囲が無効です:終了値 ({end}) は開始値 () より大きくなければなりません{begin})。" -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "「」の列ヘッダーが重複しているか、重複しています{field}」" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "「」の列ヘッダーが重複しているか、重複しています{header}」" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "行 {row}: 期待 {count_expected} 列が見つかりましたが {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "予期しない列ヘッダー」{field}「が見つかりました。" -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "コラム」{field}\"は関連オブジェクトではありません。ドットは使用できません" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "列 \"の関連オブジェクト属性が無効です{field}「: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "必須の列ヘッダー」{header}「が見つかりません。" -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "動的クエリパラメータに必要な値が見つかりません:'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "静的クエリパラメータに必要な値が見つかりません:'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "パスワードには少なくとも 1 つの数字が必要です。" -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "パスワードには少なくとも 1 つの大文字が必要です。" -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "パスワードには少なくとも 1 つの小文字が必要です。" -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." msgstr "パスワードには、少なくとも1つの数字、1つの大文字、1つの小文字が含まれている必要があります。" -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " "._" msgstr "権限名が無効です: {name}。次の形式である必要があります _" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "のアプリケーションラベル/モデル名が不明です {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "に設定された IP アドレスが無効です {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "という名前の列 {name} テーブルには既に定義されています {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "未定義" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "ブックマーク解除" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "ブックマーク" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "クローン" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "現在のビュー" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "すべてのデータ" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "エクスポートテンプレートを追加" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "インポート" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "購読解除" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "購読" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "クリップボードにコピー" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "このフィールドは必須です" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "NULL を設定" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "すべてクリア" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "テーブル構成" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "上へ移動" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "下に移動" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "検索..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "NetBoxを検索" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "セレクターを開く" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "書き込み" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "テストでは csv_update_data を定義する必要があります。" -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} は有効な正規表現ではありません。" -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__} get_required_permission () を実装する必要があります" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} get_required_permission () を実装する必要があります" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14295,187 +15092,189 @@ msgstr "" "{class_name} クエリセットが定義されていません。ObjectPermissionRequiredMixin " "は、基本クエリセットを定義するビューでのみ使用できます。" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "親グループ (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "親グループ (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "クラスタタイプ (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "クラスタ (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "メモリ (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "ディスク (MB)" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "サイズ (MB)" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "クラスタのタイプ" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "割当クラスタグループ" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "割り当て済みクラスタ" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "クラスタ内の割り当て済みデバイス" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "シリアル番号" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " "({cluster_site})" msgstr "{device} 別のサイトに属している ({device_site}) よりもクラスタ ({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "オプションで、この VM をクラスタ内の特定のホストデバイスにピン留めできます。" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "サイト/クラスタ" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "ディスクサイズは、仮想ディスクのアタッチメントによって管理されます。" -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "ディスク" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "クラスタタイプ" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "クラスタタイプ" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "クラスタグループ" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "クラスタグループ" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "クラスタ" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "クラスタ" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " "{site}" msgstr "{count} デバイスはこのクラスタのホストとして割り当てられているが、サイトにはない {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "メモリ (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "ディスク (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "仮想マシン名はクラスタごとに一意である必要があります。" -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "仮想マシン" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "仮想マシン" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "仮想マシンをサイトまたはクラスタに割り当てる必要があります。" -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "選択したクラスタ ({cluster}) はこのサイトに割り当てられていません ({site})。" -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "ホストデバイスを割り当てるときは、クラスタを指定する必要があります。" -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "選択したデバイス ({device}) はこのクラスタに割り当てられていません ({cluster})。" -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " "virtual disks ({total_size})." msgstr "指定されたディスクサイズ ({size}) は割当仮想ディスクの合計サイズと一致する必要がある ({total_size})。" -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "IPvである必要があります{family} 住所。({ip} は IPv です{version} 住所。)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "指定された IP アドレス ({ip}) はこの VM に割り当てられていません。" -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "選択した親インタフェース ({parent}) は別の仮想マシンに属しています ({virtual_machine})。" -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "選択したブリッジインタフェース ({bridge}) は別の仮想マシンに属しています ({virtual_machine})。" -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14484,390 +15283,413 @@ msgstr "" "タグが付いていない VLAN ({untagged_vlan}) " "はインタフェースの親仮想マシンと同じサイトに属しているか、またはグローバルである必要があります。" -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "サイズ (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "仮想ディスク" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "仮想ディスク" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "追加しました {count} デバイスをクラスタに {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "削除済み {count} クラスターのデバイス {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec-トランスポート" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec-トンネル" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-in-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "ハブ" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "スポーク" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "アグレッシブ" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "メイン" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "事前共有キー" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "証明書" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA シグネチャ" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA シグネチャ" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "グループ {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "イーサネットプライベート LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "イーサネット仮想プライベート LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "イーサネットプライベートツリー" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "イーサネット仮想プライベートツリー" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "トンネルグループ (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "トンネルグループ (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPsec プロファイル (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPsec プロファイル (名前)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "トンネル (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "トンネル (名前)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "外部IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE ポリシー (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE ポリシー (名前)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPsec ポリシー (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPsec ポリシー (名前)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "VM インタフェース (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (名前)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "トンネルグループ" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "SA ライフタイム" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "事前共有キー" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE ポリシー" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPsec ポリシー" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "トンネルカプセル化" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "運用上のロール" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "割当インタフェースの親デバイス" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "割当インタフェースの親VM" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "デバイスまたは仮想マシンのインタフェース" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE プロポーザル" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "パーフェクト・フォワード・シークレシのディフィー・ヘルマン・グループ" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPsec プロポーザル" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPsec プロトコル" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN タイプ" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "親デバイス (インタフェース用)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "親仮想マシン (インタフェース用)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "割当インタフェース (デバイスまたは VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "デバイスと VM インタフェースの終端を同時にインポートすることはできません。" -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "各終端には、インタフェースまたは VLAN のいずれかを指定する必要があります。" -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "インタフェースと VLAN の両方を割り当てることはできません。" -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE バージョン" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "提案" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "割当オブジェクトタイプ" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "トンネルインターフェイス" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "1 回目の解約" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "2 回目の終了" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "このパラメータは、終端を定義する場合に必要です。" -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "ポリシー" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "終端にはインタフェースまたは VLAN を指定する必要があります。" -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "終端には、1 つの終端オブジェクト(インタフェースまたは VLAN)しか設定できません。" -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "暗号化アルゴリズム" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "認証アルゴリズム" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ディフィー・ヘルマングループ ID" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "セキュリティアソシエーションの有効期間 (秒単位)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "イケアの提案" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKEの提案" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "版" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "提案" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "事前共有キー" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE ポリシー" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "選択した IKE バージョンにはモードが必要です" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "モードは選択された IKE バージョンでは使用できません" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "暗号化" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "認証" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "セキュリティアソシエーションの有効期間 (秒)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "セキュリティアソシエーションの有効期間 (KB 単位)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPsec プロポーザル" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPsec プロポーザル" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "暗号化および/または認証アルゴリズムを定義する必要があります" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPsec ポリシー" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPsec プロファイル" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2 VPN ターミネーション" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2 VPN ターミネーション" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN ターミネーションはすでに割り当てられています({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -14875,186 +15697,194 @@ msgid "" msgstr "" "{l2vpn_type} L2VPN のターミネーションは 3 つまでです。見つかりました {terminations_count} 定義済みです。" -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "トンネルグループ" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "トンネルグループ" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "カプセル化" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "トンネル ID" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "トンネル" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "トンネル" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "オブジェクトは一度に 1 つのトンネルにしか終端できません。" -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "トンネル終端" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "トンネル終端" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} すでにトンネルに接続されています ({tunnel})。" -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "認証方法" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "暗号化アルゴリズム" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "認証アルゴリズム" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA ライフタイム" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "事前共有キー" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "SA ライフタイム (秒)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA ライフタイム (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "オブジェクト親" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "オブジェクトサイト" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "アクセスポイント" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "ステーション" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "開く" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA パーソナル (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA エンタープライズ" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "認証暗号" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "距離単位" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "ブリッジド VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "インタフェース A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "インタフェース B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "サイド B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "認証暗号" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "無線 LAN グループ" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "無線 LAN グループ" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "無線 LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "インタフェース A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "インタフェース B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "距離" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "距離単位" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "無線リンク" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "無線リンク" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "ワイヤレス距離を設定するときは単位を指定する必要があります" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} 無線インタフェースではありません。" -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "チャンネル値が無効です: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "チャンネル属性が無効です: {name}" diff --git a/netbox/translations/nl/LC_MESSAGES/django.mo b/netbox/translations/nl/LC_MESSAGES/django.mo index 46dadac28f7c92fec5db28f34f5a8a88f40d98e0..1af769697221b49f6de684283729fd35b23d2b5c 100644 GIT binary patch delta 62957 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 delta 63289 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" msgstr "Huidige waarde: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (standaard)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "tijd" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "gebruikersnaam" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "verzoek-ID" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "daad" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "gegevens vóór de wijziging" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "gegevens na de wijziging" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "wijziging van het object" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "wijzigingen in het object" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "Logboekregistratie van wijzigingen wordt niet ondersteund voor dit " "objecttype ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "aangemaakt" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "commentaar" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "configuratiegegevens" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "revisie van de configuratie" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "revisies van de configuratie" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Standaardconfiguratie" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Huidige configuratie" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Revisie van de configuratie #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "type" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "ingeschakeld" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "negeer regels" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Patronen (één per regel) die overeenkomen met bestanden om te negeren " "tijdens het synchroniseren" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parameters" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "laatst gesynchroniseerd" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "gegevensbron" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "gegevensbronnen" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Onbekend backend-type: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Kan de synchronisatie niet starten; de synchronisatie is al bezig." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1905,1224 +2171,1286 @@ msgstr "" "Er is een fout opgetreden bij het initialiseren van de backend. Er moet een " "afhankelijkheid worden geïnstalleerd: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "laatst bijgewerkt" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "pad" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Bestandspad relatief ten opzichte van de hoofdmap van de gegevensbron" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "grootte" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "hash" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "De lengte moet 64 hexadecimale tekens zijn." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256-hash van de bestandsgegevens" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "gegevensbestand" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "gegevensbestanden" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "opname automatisch synchroniseren" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "records automatisch synchroniseren" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "root van het bestand" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "bestandspad" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Bestandspad relatief ten opzichte van het aangewezen hoofdpad" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "beheerd bestand" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "beheerde bestanden" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "gepland" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "interval" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Herhalingsinterval (in minuten)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "gestart" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "voltooid" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "gegevens" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "fout" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "taak-ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "taak" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "taken" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Taken kunnen niet worden toegewezen aan dit objecttype ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Ongeldige status voor beëindiging van het dienstverband. De keuzes zijn: " "{choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () kan niet worden aangeroepen met waarden voor zowel schedule_at " "als immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Verwijdering wordt voorkomen door een beschermingsregel: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Volledige naam" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Object" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID aanvragen" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Is actief" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Pad" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Laatst bijgewerkt" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Interval" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Versie" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Laatst bijgewerkt" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimale NetBox-versie" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maximale NetBox-versie" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Geen plugin-gegevens gevonden" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Auteur" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Geïnstalleerd" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Gecertificeerd" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Gepubliceerd" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Geïnstalleerde versie" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Laatste versie" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Oudste taak" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Workers" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Host" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Poort" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "PID van de planner" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Geen wachtrijen gevonden" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "In de wachtrij gezet" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Afgelopen" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Oproepbaar" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Geen taken gevonden" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Staat" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Geboorte" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PIDE" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Geen workers gevonden" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Taak in de wachtrij #{id} om te synchroniseren {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Herstelde configuratierevisie #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Taak {job_id} niet gevonden" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Baan {id} is verwijderd." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Fout bij het verwijderen van de taak {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Baan {id} niet gevonden." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Baan {id} is opnieuw gevraagd." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Baan {id} is ondervraagd." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Baan {id} is gestopt." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Kon de taak niet stoppen {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "De catalogus met plug-ins kon niet worden geladen" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plug-in {name} niet gevonden" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Positie (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Faciliteits-ID" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Klaarzetten" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Ontmanteling" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Opgeheven" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Frame met 2 stijlen" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Frame met 4 stijlen" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Kast met 4 posten" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Frame voor wandmontage" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Frame voor wandmontage (verticaal)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Kast voor wandmontage" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Wandkast (verticaal)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} inches" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Gereserveerd" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Beschikbaar" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Verouderd" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Millimeters" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Inches" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Van voor naar achter" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Van achter naar voren" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Ouder" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Kind" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Voorkant" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Achterkant" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Klaargezet" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventaris" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Van links naar rechts" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Van rechts naar links" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Van links naar achteren" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Van achter naar links" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Van onder naar boven" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Van boven naar beneden" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passief" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Gemengd" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (niet-vergrendelend)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (vergrendeling)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Californische stijl" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Internationaal/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Gepatenteerd" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Andere" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/internationaal" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fysiek" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtueel" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Draadloos" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Virtuele interfaces" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Bridge" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Linkaggregatiegroep (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (vast)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modulair)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (backplane)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Mobiel" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Serienummer" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Coaxiaal" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Stapelen" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Half" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Volledig" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Auto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Toegang" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Getagd" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Getagd (Alles)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE-standaard" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Passief 24V (2 paren)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Passief 24V (4 paren)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Passief 48V (2 paren)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Passief 48V (4 paren)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Koper" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Glasvezel" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Vezel" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Verbonden" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometers" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Meters" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centimeters" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Mijlen" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Feet" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogrammen" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gram" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Ponden" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Ons" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundant" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Een fase" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Drie fase" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Ongeldig formaat van het MAC-adres: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Ongeldig WWN-formaat: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Ouderregio (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Ouderregio (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Oudersitegroep (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Bovenliggende sitegroep (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Groep (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Groep (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "ALS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Locatie van de ouder (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Locatie van de ouder (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Locatie (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Locatie (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Fabrikant (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Fabrikant (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Racktype (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Racktype (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rol (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rol (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Rek (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Gebruiker (naam)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Standaardplatform (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Standaardplatform (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Heeft een afbeelding van de voorkant" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Heeft een afbeelding van de achterkant" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Heeft consolepoorten" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Heeft consoleserverpoorten" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Heeft voedingspoorten" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Heeft stopcontacten" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Heeft interfaces" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Heeft pass-through-poorten" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Heeft modulevakken" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Heeft apparaatvakken" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Heeft inventarisitems" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Soort apparaat (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Moduletype (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Voedingspoort (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Onderliggend inventarisitem (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Configuratiesjabloon (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Soort apparaat (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Ouderapparaat (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Platform (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Platform (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Sitenaam (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Ouderbaby (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "VM-cluster (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Clustergroep (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Clustergroep (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Apparaatmodel (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Is volledige diepte" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC-adres" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Heeft een primair IP-adres" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Heeft een IP-adres buiten de band" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Virtueel chassis (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Is een virtueel chassislid" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Heeft een context voor een virtueel apparaat" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Model van het apparaat" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interface (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Moduletype (model)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Modulevak (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Apparaat (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (naam)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Apparaat (naam)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Soort apparaat (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Rol van het apparaat (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Rol van het apparaat (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Virtueel chassis (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Virtueel chassis" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Module (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kabel (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Toegewezen VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Toegewezen VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Virtuele chassisinterfaces voor apparaten" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Virtuele chassisinterfaces voor apparaat (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Soort interface" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Ouderinterface (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Overbrugde interface (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "LAG-interface (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Context van het virtuele apparaat" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Context van het virtuele apparaat (ID)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Draadloos LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Draadloze link" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Baai voor oudermodule (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Geïnstalleerde module (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Geïnstalleerd apparaat (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Geïnstalleerd apparaat (naam)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Meester (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (naam)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Tenant (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Tenant (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Onbeëindigd" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Voedingspaneel (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Labels" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Positie" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3130,843 +3458,923 @@ msgstr "" "Alfanumerieke reeksen worden ondersteund. (Moet overeenkomen met het aantal " "namen dat wordt aangemaakt.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Naam van de contactpersoon" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Telefoonnummer contacteren" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "E-mailadres voor contact" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Tijdzone" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Fabrikant" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Vormfactor" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Breedte" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Hoogte (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Aflopende eenheden" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Buitenbreedte" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Buitendiepte" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Buitenste eenheid" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Inbouwdiepte" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Gewicht" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maximaal gewicht" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Gewichtseenheid" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Racktype" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Buitenafmetingen" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensies" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Nummering" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rol" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Racktype" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Serienummer" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Tag voor bedrijfsmiddelen" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Luchtstroom" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Rek" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Standaardplatform" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Onderdeelnummer" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "U-hoogte" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Uitsluiten van gebruik" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Soort apparaat" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Moduletype" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chassis" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VM-rol" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Configuratiesjabloon" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Soort apparaat" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Rol van het apparaat" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Platform" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Cluster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Apparaat" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configuratie" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualisatie" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Moduletype" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Label" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Lengte" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Lengte-eenheid" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Domein" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Voedingspaneel" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Levering" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Spanning" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Stroomsterkte" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maximaal gebruik" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maximale trekking" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maximaal stroomverbruik (watt)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Toegewezen loting" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Toegewezen stroomverbruik (watt)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Voedingspoort" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Voer de poot in" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Alleen voor beheer" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE-modus" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE-type" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Draadloze rol" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Module" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Contexten van virtuele apparaten" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Snelheid" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Modus" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN-groep" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN zonder label" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Getagde VLAN's" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Draadloze LAN-groep" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Draadloze LAN's" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Addressing" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operatie" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Gerelateerde interfaces" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q-omschakeling" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "De interfacemodus moet worden gespecificeerd om VLAN's toe te wijzen" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" "Aan een toegangsinterface kunnen geen gelabelde VLAN's worden toegewezen." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Naam van de moederregio" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Naam van de oudersitegroep" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Toegewezen regio" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Toegewezen groep" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "beschikbare opties" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Toegewezen site" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Locatie van de ouders" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Locatie niet gevonden." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "De fabrikant van dit racktype" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "De positie met het laagst genummerde nummer in het rack" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Breedte van rail tot rail (in inches)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Eenheid voor buitenafmetingen" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Eenheid voor rackgewichten" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Naam van de toegewezen tenant" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Naam van de toegewezen rol" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Richting van de luchtstroom" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Site voor ouders" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Locatie van het rek (indien aanwezig)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Eenheden" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Door komma's gescheiden lijst van individuele eenheidsnummers" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "De fabrikant die dit apparaattype produceert" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Het standaardplatform voor apparaten van dit type (optioneel)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Gewicht van het apparaat" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Eenheid voor het gewicht van het apparaat" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Gewicht van de module" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Eenheid voor modulegewicht" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Beperk de platformtoewijzingen aan deze fabrikant" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Toegewezen rol" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Apparaattype fabrikant" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Apparaattype model" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Toegewezen platform" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Virtueel chassis" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Virtualisatiecluster" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Toegewezen locatie (indien aanwezig)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Toegewezen rek (indien aanwezig)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Gezicht" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Gemonteerd rackfront" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Ouderapparaat (voor apparaten voor kinderen)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Toestelvak" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Apparaatvak waarin dit apparaat is geïnstalleerd (voor onderliggende " "apparaten)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Het apparaat waarop deze module is geïnstalleerd" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Modulevak" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "De moduleruimte waarin deze module is geïnstalleerd" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Het type module" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Componenten repliceren" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3974,264 +4382,271 @@ msgstr "" "Componenten die aan dit moduletype zijn gekoppeld automatisch invullen " "(standaard ingeschakeld)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Componenten adopteren" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Reeds bestaande componenten adopteren" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Poorttype" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Poortsnelheid in bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Type stopcontact" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Lokale voedingspoort die dit stopcontact voedt" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Elektrische fase (voor driefasige circuits)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interface voor ouders" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Overbrugde interface" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Lag" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "LAG-interface voor ouders" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "VDC-namen gescheiden door komma's, tussen dubbele aanhalingstekens. " "Voorbeeld:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Fysiek medium" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Dubbelzijdig" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Poe-modus" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Poe-type" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q operationele modus (voor L2-interfaces)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Toegewezen VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rf-rol" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Draadloze rol (AP/station)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} is niet toegewezen aan het apparaat {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Poort aan de achterkant" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Bijbehorende poort aan de achterkant" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Classificatie van fysieke media" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Geïnstalleerd apparaat" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Kinderapparaat dat in deze bay is geïnstalleerd" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Kinderapparaat niet gevonden." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Onderliggend inventarisitem" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Soort onderdeel" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Soort onderdeel" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Naam van het onderdeel" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Naam van de component" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Onderdeel niet gevonden: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Side A-apparaat" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Naam van het apparaat" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Type kant A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Soort beëindiging" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Naam van kant A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Naam van beëindiging" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Side B-apparaat" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Type kant B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Naam van kant B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Status van de verbinding" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Kant {side_upper}: {device} {termination_object} is al verbonden" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} nevenbeëindiging niet gevonden: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Meester" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Master-apparaat" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Naam van de moedersite" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Stroomopwaarts stroompaneel" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primair of redundant" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Soort voeding (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Enkel- of driefasig" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Primaire IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4-adres met masker, bijvoorbeeld 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Primaire IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6-adres met prefixlengte, bijvoorbeeld 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4240,7 +4655,7 @@ msgstr "" "De gelabelde VLAN's ({vlans}) moeten tot dezelfde site behoren als het " "bovenliggende apparaat/VM van de interface, of ze moeten globaal zijn" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4248,7 +4663,7 @@ msgstr "" "Kan een module met tijdelijke aanduidingen niet installeren in een " "modulecompartiment zonder gedefinieerde positie." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4258,188 +4673,199 @@ msgstr "" "modulelaurierboom {level} in een boom, maar {tokens} tijdelijke aanduidingen" " gegeven." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Kan niet adopteren {model} {name} omdat het al bij een module hoort" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "EEN {model} genoemd {name} bestaat al" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Voedingspaneel" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Stroomvoorziening" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Kant" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Status van het apparaat" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Regio van het moederland" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Oudergroep" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Faciliteit" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Racktype" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Functie" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Afbeeldingen" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Componenten" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Rol van het subapparaat" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Model" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Heeft een OOB IP" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Virtueel chassislid" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Heeft contexten voor virtuele apparaten" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Clustergroep" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Bekabeld" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Bezet" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Verbinding" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Vriendelijk" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Alleen voor beheer" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Draadloos kanaal" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Kanaalfrequentie (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Kanaalbreedte (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Zendvermogen (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kabel" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Ontdekt" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Er bestaat al een virtueel chassislid op zijn plaats {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Contactgegevens" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Rol van het rek" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Slug" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Selecteer een vooraf gedefinieerd racktype of stel hieronder de fysieke " "kenmerken in." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Inventarisbeheer" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4447,148 +4873,175 @@ msgstr "" "Door komma's gescheiden lijst van numerieke eenheid-ID's. Een bereik kan " "worden gespecificeerd met een koppelteken." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Reservatie" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Apparaat Rol" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "" "De eenheid met het laagste nummer die door het apparaat wordt gebruikt" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "De positie in het virtuele chassis waarmee dit apparaat wordt " "geïdentificeerd" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "De prioriteit van het apparaat in het virtuele chassis" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" "Componenten die aan dit moduletype zijn gekoppeld automatisch invullen" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Kenmerken" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Sjabloon voor consolepoort" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Poortsjabloon voor consoleserver" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Sjabloon voor de voorpoort" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Interfacesjabloon" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Sjabloon voor stopcontact" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Sjabloon voor voedingspoort" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Sjabloon voor achterpoort" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interface" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Consolepoort" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Console Server-poort" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Poort Voor" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Poort achter" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Voedingspoort" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Stopcontact" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Toewijzing van componenten" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Een InventoryItem kan slechts aan één component worden toegewezen." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "LAG-interface" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filter-VLAN's die beschikbaar zijn voor toewijzing per groep." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Apparaat voor kinderen" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4596,32 +5049,35 @@ msgstr "" "Kindapparaten moeten eerst worden aangemaakt en toegewezen aan de site en " "het rack van het ouderapparaat." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Consolepoort" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Console-serverpoort" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Poort voor" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Stopcontact" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Inventarisitem" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Rol van het inventarisitem" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4629,7 +5085,7 @@ msgstr "" "Alfanumerieke reeksen worden ondersteund. (Moet overeenkomen met het aantal " "objecten dat wordt gemaakt.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4638,18 +5094,19 @@ msgstr "" "Het meegeleverde patroon specificeert {value_count} waarden, maar " "{pattern_count} worden verwacht." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Poorten achter" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Selecteer één toewijzing van de achterpoort voor elke poort aan de voorkant " "die wordt gemaakt." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4659,16 +5116,7 @@ msgstr "" "moet overeenkomen met het geselecteerde aantal posities aan de achterkant " "van de poort ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Het touwtje {module} wordt vervangen door de positie van de " -"toegewezen module, indien aanwezig." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4678,17 +5126,18 @@ msgstr "" "overeenkomen met het geselecteerde aantal posities aan de achterkant van de " "poort ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Leden" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Uitgangspositie" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4696,69 +5145,71 @@ msgstr "" "Positie van het apparaat van het eerste lid. Verhoogt met één voor elk extra" " lid." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Voor het eerste VC-lid moet een positie worden gespecificeerd." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "label" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "lengte" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "lengte-eenheid" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "kabel" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "kabels" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Moet een eenheid specificeren bij het instellen van een kabellengte" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" "Moet A- en B-aansluitingen definiëren bij het aanmaken van een nieuwe kabel." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Kan geen verschillende soorten aansluitingen aansluiten op hetzelfde " "uiteinde van de kabel." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Incompatibele beëindigingstypen: {type_a} en {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "" "A- en B-aansluitingen kunnen geen verbinding maken met hetzelfde object." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "einde" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "kabelafsluiting" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "kabelaansluitingen" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4767,38 +5218,38 @@ msgstr "" "Dubbele beëindiging gevonden voor {app_label}.{model} {termination_id}: " "kabel {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kabels kunnen niet worden aangesloten op {type_display} interfaces" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Circuitafsluitingen die zijn aangesloten op het netwerk van een provider " "zijn mogelijk niet bekabeld." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "is actief" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "is compleet" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "is gesplitst" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "kabelpad" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "kabelpaden" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4807,18 +5258,18 @@ msgstr "" "{module} wordt geaccepteerd als vervanging voor de positie van het " "modulecompartiment wanneer deze is gekoppeld aan een moduletype." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Fysiek label" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Componentsjablonen kunnen niet naar een ander apparaattype worden " "verplaatst." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4826,7 +5277,7 @@ msgstr "" "Een componentsjabloon kan niet worden gekoppeld aan zowel een apparaattype " "als een moduletype." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4834,138 +5285,138 @@ msgstr "" "Een componentsjabloon moet gekoppeld zijn aan een apparaattype of een " "moduletype." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "sjabloon voor consolepoort" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "sjablonen voor consolepoorten" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "poortsjabloon voor consoleserver" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "poortsjablonen voor consoleservers" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maximale trekking" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "toegewezen gelijkspel" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "sjabloon voor voedingspoort" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "sjablonen voor voedingspoorten" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "De toegewezen trekking mag niet hoger zijn dan de maximale trekking " "({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "voerbeen" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fase (voor driefasige voedingen)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "sjabloon voor stopcontact" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "sjablonen voor stopcontacten" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Voedingspoort voor ouders ({power_port}) moet tot hetzelfde apparaattype " "behoren" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Voedingspoort voor ouders ({power_port}) moet tot hetzelfde moduletype " "behoren" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "alleen beheer" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "bridge-interface" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "draadloze rol" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "interfacesjabloon" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "interfacesjablonen" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Een interface kan niet naar zichzelf worden overbrugd." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Bridge-interface ({bridge}) moet tot hetzelfde apparaattype behoren" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Bridge-interface ({bridge}) moet tot hetzelfde moduletype behoren" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "positie van de achterpoort" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "sjabloon voor de voorpoort" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "sjablonen voor de voorpoort" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Achterpoort ({name}) moet tot hetzelfde apparaattype behoren" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4974,48 +5425,48 @@ msgstr "" "Ongeldige positie van de achterpoort ({position}); achterpoort {name} heeft " "slechts {count} standen" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "standen" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "sjabloon voor de achterpoort" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "sjablonen voor achterpoorten" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "positie" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identificatie waarnaar moet worden verwezen bij het hernoemen van " "geïnstalleerde componenten" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "sjabloon voor modulebay" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "sjablonen voor modulebay" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "sjabloon voor apparaatvak" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "sjablonen voor apparaatruimte" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5024,206 +5475,211 @@ msgstr "" "De rol van het apparaattype van het subapparaat ({device_type}) moet op " "„parent” zijn ingesteld om apparaatbays toe te staan." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "onderdeel-ID" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Onderdeel-ID toegewezen door de fabrikant" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "sjabloon voor inventarisitems" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "sjablonen voor inventarisitems" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Componenten kunnen niet naar een ander apparaat worden verplaatst." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "uiteinde van de kabel" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "markeer verbonden" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Behandel alsof er een kabel is aangesloten" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" "Moet het kabeluiteinde (A of B) specificeren bij het aansluiten van een " "kabel." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Het kabeluiteinde mag niet zonder kabel worden ingesteld." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Kan niet markeren als verbonden met een aangesloten kabel." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} modellen moeten een eigenschap parent_object declareren" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Fysiek poorttype" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "snelheid" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Poortsnelheid in bits per seconde" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "consolepoort" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "consolepoorten" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "console-serverpoort" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "console-serverpoorten" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "voedingspoort" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "voedingspoorten" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "stopcontact" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "stopcontacten" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Voedingspoort voor ouders ({power_port}) moet tot hetzelfde apparaat behoren" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "-modus" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q-tagging-strategie" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "bovenliggende interface" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "LAG van de ouders" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Deze interface wordt alleen gebruikt voor beheer buiten de band" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "snelheid (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "tweezijdig" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-bits wereldwijde naam" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "draadloos kanaal" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "kanaalfrequentie (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Ingevuld per geselecteerd kanaal (indien ingesteld)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "zendvermogen (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "draadloze LAN's" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN zonder label" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "gelabelde VLAN's" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interface" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfaces" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} op interfaces kan geen kabel worden aangesloten." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" "{display_type} interfaces kunnen niet als verbonden worden gemarkeerd." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Een interface kan niet zijn eigen ouder zijn." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Alleen virtuele interfaces mogen aan een bovenliggende interface worden " "toegewezen." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5232,7 +5688,7 @@ msgstr "" "De geselecteerde ouderinterface ({interface}) hoort bij een ander apparaat " "({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5241,7 +5697,7 @@ msgstr "" "De geselecteerde ouderinterface ({interface}) behoort tot {device}, dat geen" " deel uitmaakt van een virtueel chassis {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5250,7 +5706,7 @@ msgstr "" "De geselecteerde bridge-interface ({bridge}) hoort bij een ander apparaat " "({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5259,15 +5715,15 @@ msgstr "" "De geselecteerde bridge-interface ({interface}) behoort tot {device}, dat " "geen deel uitmaakt van een virtueel chassis {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Virtuele interfaces kunnen geen bovenliggende LAG-interface hebben." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Een LAG-interface kan niet zijn eigen ouder zijn." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5275,7 +5731,7 @@ msgstr "" "De geselecteerde LAG-interface ({lag}) hoort bij een ander apparaat " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5284,46 +5740,46 @@ msgstr "" "De geselecteerde LAG-interface ({lag}) behoort tot {device}, dat geen deel " "uitmaakt van een virtueel chassis {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Virtuele interfaces kunnen geen PoE-modus hebben." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Virtuele interfaces mogen geen PoE-type hebben." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Moet de PoE-modus specificeren bij het aanwijzen van een PoE-type." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "De draadloze rol kan alleen worden ingesteld op draadloze interfaces." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Kanaal mag alleen worden ingesteld op draadloze interfaces." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "De kanaalfrequentie mag alleen worden ingesteld op draadloze interfaces." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "Kan geen aangepaste frequentie specificeren met een geselecteerd kanaal." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "De kanaalbreedte kan alleen worden ingesteld op draadloze interfaces." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Kan geen aangepaste breedte specificeren als het kanaal is geselecteerd." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5332,24 +5788,24 @@ msgstr "" "Het VLAN zonder label ({untagged_vlan}) moet tot dezelfde site behoren als " "het bovenliggende apparaat van de interface, of het moet globaal zijn." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "In kaart gebrachte positie op de corresponderende achterpoort" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "poort voor" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "poorten voor" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Achterpoort ({rear_port}) moet tot hetzelfde apparaat behoren" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5358,19 +5814,19 @@ msgstr "" "Ongeldige positie van de achterpoort ({rear_port_position}): Achterpoort " "{name} heeft slechts {positions} posities." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Aantal poorten aan de voorkant dat in kaart kan worden gebracht" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "poort achter" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "poorten achter" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5379,38 +5835,39 @@ msgstr "" "Het aantal posities mag niet minder zijn dan het aantal toegewezen poorten " "aan de voorkant ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "modulevak" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "modulevakken" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Een modulecompartiment mag niet behoren tot een module die erin is " "geïnstalleerd." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "apparaatvak" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "bays voor apparaten" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Dit type apparaat ({device_type}) ondersteunt geen apparaatsleuven." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Kan een apparaat niet op zichzelf installeren." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5418,116 +5875,118 @@ msgstr "" "Kan het opgegeven apparaat niet installeren; het apparaat is al " "geïnstalleerd in {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "Rol van het inventarisitem" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "Rollen van inventarisitems" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "serienummer" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "tag voor bedrijfsmiddelen" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Een unieke tag die wordt gebruikt om dit item te identificeren" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "ontdekt" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Dit item is automatisch ontdekt" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "inventarisitem" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "inventarisartikelen" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Kan zichzelf niet als ouder toewijzen." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "" "Het item van de bovenliggende inventaris behoort niet tot hetzelfde " "apparaat." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Kan een inventarisitem met afhankelijke kinderen niet verplaatsen" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "Kan inventarisitem niet toewijzen aan component op een ander apparaat" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "fabrikant" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "fabrikanten" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "model-" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "standaardplatform" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "onderdeelnummer" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Discreet onderdeelnummer (optioneel)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "hoogte (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "uitsluiten van gebruik" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Apparaten van dit type zijn uitgesloten bij de berekening van het " "rackgebruik." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "is volledig diep" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "" "Het apparaat verbruikt zowel de voorkant als de achterkant van het rack." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "status van ouder/kind" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5536,24 +5995,24 @@ msgstr "" "apparaatvakken. Laat dit veld leeg als dit apparaattype geen ouder of kind " "is." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "luchtstroom" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "apparaattype" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "soorten apparaten" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "De U-hoogte moet in stappen van 0,5 rekeenheden zijn." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5562,7 +6021,7 @@ msgstr "" "Apparaat {device} in een rek {rack} heeft niet voldoende ruimte voor een " "hoogte van {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5572,7 +6031,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} instanties al in rekken " "gemonteerd." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5580,152 +6039,152 @@ msgstr "" "U moet alle sjablonen voor apparaatruimte verwijderen die aan dit apparaat " "zijn gekoppeld voordat u het als ouderapparaat declassificeert." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Apparaattypen voor kinderen moeten 0U zijn." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "moduletype" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "moduletypen" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Virtuele machines kunnen aan deze rol worden toegewezen" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "rol van het apparaat" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "rollen van het apparaat" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Beperk dit platform optioneel tot apparaten van een bepaalde fabrikant" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "platform" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "platformen" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "De functie die dit apparaat dient" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Serienummer van het chassis, toegekend door de fabrikant" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Een unieke tag die wordt gebruikt om dit apparaat te identificeren" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "positie (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "gezicht met een rekje" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "primaire IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "primaire IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP-adres buiten de band" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "VC-positie" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Virtuele chassispositie" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC-prioriteit" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Verkiezingsprioriteit van het virtuele chassis" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "breedtegraad" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS-coördinaat in decimaal formaat (xx.jjjjj)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "lengtegraad" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "De apparaatnaam moet per site uniek zijn." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "apparaat" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "apparaten" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Rek {rack} hoort niet bij de site {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Locatie {location} hoort niet bij de site {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Rek {rack} hoort niet bij de locatie {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Kan geen rackface selecteren zonder een rack toe te wijzen." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Kan geen rackpositie selecteren zonder een rack toe te wijzen." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "De positie moet in stappen van 0,5 rekeenheden zijn." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Bij het bepalen van de positie van het rek moet het oppervlak van het rack " "worden gespecificeerd." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5733,7 +6192,7 @@ msgstr "" "Een 0U-apparaattype ({device_type}) kan niet worden toegewezen aan een " "rackpositie." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5741,7 +6200,7 @@ msgstr "" "Onderliggende apparaattypen kunnen niet aan een rackface worden toegewezen. " "Dit is een kenmerk van het ouderapparaat." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5749,7 +6208,7 @@ msgstr "" "Onderliggende apparaattypen kunnen niet worden toegewezen aan een " "rackpositie. Dit is een kenmerk van het ouderapparaat." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5758,22 +6217,22 @@ msgstr "" "U{position} is al bezet of beschikt niet over voldoende ruimte voor dit " "apparaattype: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} is geen IPv4-adres." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Het opgegeven IP-adres ({ip}) is niet toegewezen aan dit apparaat." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} is geen IPv6-adres." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5783,18 +6242,18 @@ msgstr "" "apparaattypen, maar het type van dit apparaat behoort tot " "{devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Het toegewezen cluster behoort tot een andere site ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "De positie van een apparaat dat aan een virtueel chassis is toegewezen, moet" " zijn positie hebben bepaald." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5803,15 +6262,15 @@ msgstr "" "Het apparaat kan niet van het virtuele chassis worden verwijderd " "{virtual_chassis} omdat het momenteel is aangewezen als zijn master." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "module" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "modules" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5820,15 +6279,15 @@ msgstr "" "De module moet worden geïnstalleerd in een modulecompartiment dat bij het " "toegewezen apparaat hoort ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domein" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "virtueel chassis" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." @@ -5836,7 +6295,7 @@ msgstr "" "De geselecteerde master ({master}) is niet toegewezen aan dit virtuele " "chassis." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5845,62 +6304,62 @@ msgstr "" "Kan het virtuele chassis niet verwijderen {self}. Er zijn lidinterfaces die " "een LAG-interface tussen chassis vormen." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "-identificatiecode" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Numerieke identificatie die uniek is voor het ouderapparaat" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "reacties" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "context van het virtuele apparaat" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "contexten van virtuele apparaten" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} is geen IPv{family} adres." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "Het primaire IP-adres moet bij een interface op het toegewezen apparaat " "horen." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "gewicht" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "gewichtseenheid" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Moet een eenheid specificeren bij het instellen van een gewicht" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "voedingspaneel" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "elektriciteitspanelen" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5908,43 +6367,43 @@ msgstr "" "Locatie {location} ({location_site}) bevindt zich op een andere site dan " "{site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "bevoorrading" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "fase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "spanning" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "stroomsterkte" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maximale benutting" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Maximaal toelaatbare trekking (percentage)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "beschikbaar vermogen" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "voeding" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "voedingen" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5953,63 +6412,63 @@ msgstr "" "Rek {rack} ({rack_site}) en voedingspaneel {powerpanel} ({powerpanel_site}) " "bevinden zich op verschillende locaties." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "De spanning kan niet negatief zijn voor de AC-voeding" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "breedte" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Breedte van spoor tot spoor" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Hoogte in rekeenheden" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "starteenheid" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Starteenheid voor rack" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "aflopende eenheden" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Eenheden zijn van boven naar beneden genummerd" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "buitenbreedte" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Buitenafmeting van het rek (breedte)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "buitendiepte" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Buitenafmeting van het rek (diepte)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "buiteneenheid" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "montagediepte" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6017,76 +6476,77 @@ msgstr "" "Maximale diepte van een gemonteerd apparaat, in millimeters. Voor rekken met" " vier stijlen is dit de afstand tussen de voor- en achterrails." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "maximaal gewicht" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Maximaal draagvermogen voor het rack" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "vormfactor" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "type rek" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "soorten rekken" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Moet een eenheid specificeren bij het instellen van een buitenbreedte/diepte" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "" "Moet een eenheid specificeren bij het instellen van een maximaal gewicht" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "rack rol" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "rack rollen" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID van de faciliteit" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Lokaal toegewezen identificatiecode" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Functionele rol" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Een unieke tag die wordt gebruikt om dit rek te identificeren" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "rack" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "racks" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "De toegewezen locatie moet bij de bovenliggende site horen ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6095,7 +6555,7 @@ msgstr "" "Het rek moet minimaal {min_height}Ik praat om de momenteel geïnstalleerde " "apparaten te huisvesten." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6104,892 +6564,954 @@ msgstr "" "De nummering van de rackeenheid moet beginnen bij {position} of minder om " "momenteel geïnstalleerde apparaten te huisvesten." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "De locatie moet van dezelfde locatie zijn, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "eenheden" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "Reserveren van de baan" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "Reserveringen volgen" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Ongeldige eenheid (en) voor {height}U-rail: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "De volgende eenheden zijn al gereserveerd: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Er bestaat al een regio op het hoogste niveau met deze naam." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Er bestaat al een regio op het hoogste niveau met deze slug." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "regio" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regio's" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Er bestaat al een sitegroep op het hoogste niveau met deze naam." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Er bestaat al een sitegroep op het hoogste niveau met deze slug." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "sitegroep" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "sitegroepen" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Volledige naam van de site" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "faciliteit" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ID of beschrijving van de lokale faciliteit" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "fysiek adres" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Fysieke locatie van het gebouw" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "verzendadres" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Indien anders dan het fysieke adres" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "site" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "sites" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Er bestaat al een locatie met deze naam op de opgegeven site." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Er bestaat al een locatie met deze slug binnen de opgegeven site." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "locatie" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "locaties" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Locatie van de ouder ({parent}) moet tot dezelfde site behoren ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Beëindiging A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Eindpunt B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Apparaat A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Apparaat B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Locatie A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Locatie B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Rek A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Rek B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Site A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Locatie B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Bereikbaar" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Apparaten" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VM's" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Configuratiesjabloon" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Sitegroep" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP-adres" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4-adres" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6-adres" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "VC-positie" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "VC-prioriteit" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Apparaat voor ouders" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Positie (apparaatvak)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Consolepoorten" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Serverpoorten voor de console" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Voedingspoorten" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Stopcontacten" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfaces" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Poorten vooraan" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Toestelvakken" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Modulebays" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Inventarisartikelen" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Modulebaai" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Inventarisartikelen" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Kleur van de kabel" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Peers koppelen" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Markeer Verbonden" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maximale trekkracht (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Toegewezen trekking (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP-adressen" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "FHRP-groepen" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Alleen beheer" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC's" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Geïnstalleerde module" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Seriële module" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Tag voor module-bedrijfsmiddelen" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Status van de module" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Onderdeel" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Artikelen" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Apparaattypen" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Moduletypen" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Platformen" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Standaardplatform" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Volledige diepte" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "U-hoogte" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instanties" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Consolepoorten" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Serverpoorten voor de console" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Voedingspoorten" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Stopcontacten" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Ports aan de voorkant" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Poorten achteraan" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Apparaatvakken" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Modulebays" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Stroomvoedingen" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Maximaal gebruik" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Beschikbaar vermogen (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Racks" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Hoogte" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Buitenbreedte" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Buitendiepte" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Maximaal gewicht" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Ruimte" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Sites" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "De testcase moet peer_termination_type instellen" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Verbinding verbroken {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Reserveringen" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Apparaten zonder rack" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Context van de configuratie" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Render-configuratie" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "" "Er is een fout opgetreden tijdens het renderen van de sjabloon: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Virtuele machines" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Geïnstalleerd apparaat {device} in de baai {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Apparaat verwijderd {device} van bay {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Kinderen" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Lid toegevoegd {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Kan het masterapparaat niet verwijderen {device} vanaf het virtuele chassis." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Verwijderd {device} vanaf een virtueel chassis {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Onbekende gerelateerde object (en): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Het wijzigen van het type aangepaste velden wordt niet ondersteund." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Planning is niet ingeschakeld voor dit script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Tekst" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Tekst (lang)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Integer" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Decimaal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Booleaans (waar/onwaar)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Datum" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Datum en tijd" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Selectie" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Meervoudige selectie" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Meerdere objecten" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Uitgeschakeld" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Los" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Exact" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Altijd" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Indien ingesteld" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Verborgen" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Ja" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Nee" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Link" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Nieuwste" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Oudste" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabetisch (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabetisch (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Informatie" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Succes" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Waarschuwing" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Gevaar" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Debuggen" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Standaard" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Mislukking" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Elk uur" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 uur" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Dagelijks" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Wekelijks" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 dagen" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Creëren" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Bijwerken" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Verwijderen" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Blauw" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Paars" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Roze" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Rood" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Oranje" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Geel" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Groen" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Groenblauw" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Cyaan" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Grijs" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Zwart" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Wit" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Script" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Melding" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Onbekende operator: {op}. Moet een van de volgende zijn: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Niet ondersteunende waardetype: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Ongeldig type voor {op} operatie: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "De regelset moet een woordenboek zijn, niet {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Ongeldig logicatype: moet 'AND' of 'OR' zijn. Controleer de documentatie." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "" "Onjuiste sleutel (s) geïnformeerd. Controleer alstublieft de documentatie." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Widgettype" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Ongeregistreerde widgetklasse: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} moet een render () -methode definiëren." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Opmerking" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Geef willekeurige aangepaste inhoud weer. Markdown wordt ondersteund." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Tellingen van objecten" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6997,272 +7519,294 @@ msgstr "" "Geef een set NetBox-modellen weer en het aantal objecten dat voor elk type " "is gemaakt." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "" "Filters die moeten worden toegepast bij het tellen van het aantal objecten" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Ongeldig formaat. Objectfilters moeten als woordenboek worden doorgegeven." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Objectlijst" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Geef een willekeurige lijst met objecten weer." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Het standaardaantal objecten dat moet worden weergegeven" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Ongeldig formaat. URL-parameters moeten als woordenboek worden doorgegeven." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS-feed" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Voeg een RSS-feed van een externe website in." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL van de feed" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Het maximale aantal objecten dat moet worden weergegeven" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Hoe lang moet de inhoud in de cache worden bewaard (in seconden)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Bladwijzers" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Laat je persoonlijke bladwijzers zien" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Onbekend actietype voor een evenementregel: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "" "Kan de pijplijn voor gebeurtenissen niet importeren {name} fout: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Scriptmodule (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Gegevensbestand (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Groep (naam)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Clustertype" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Clustertype (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Tenant groep" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Tenant groep (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Tag" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Label (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Heeft contextgegevens voor de lokale configuratie" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Groepsnaam" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Verplicht" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Moet uniek zijn" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "UI zichtbaar" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "UI bewerkbaar" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Is kloonbaar" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimumwaarde" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maximale waarde" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Validatieregex" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Gedrag" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nieuw venster" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Knopklasse" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIME-type" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "bestandsextensie" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Als bijlage" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Gedeeld" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP-methode" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL van de payload" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL-verificatie" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Geheim" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA-bestandspad" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Soorten evenementen" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Is actief" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Objecttypen" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Een of meer toegewezen objecttypen" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Veldgegevenstype (bijv. tekst, geheel getal, enz.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Soort object" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Objecttype (voor velden met objecten of velden met meerdere objecten)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Keuze set" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Keuzeset (voor selectievelden)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Of het aangepaste veld wordt weergegeven in de gebruikersinterface" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Of het aangepaste veld bewerkbaar is in de gebruikersinterface" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "" "De basisset van vooraf gedefinieerde keuzes om te gebruiken (indien " "aanwezig)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7271,188 +7815,204 @@ msgstr "" "gescheiden door een dubbele punt: „Choice1:First Choice, Choice2:Second " "Choice”" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "knopklasse" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "De klasse van de eerste link in een groep wordt gebruikt voor de dropdown-" "knop" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Het (de) evenementtype (s) dat deze regel activeert" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Actieobject" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Webhook-naam of script als stippelpad module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} niet gevonden" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Script {name} niet gevonden" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Toegewezen objecttype" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "De classificatie van binnenkomst" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Gebruikers" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Gebruikersnamen gescheiden door komma's, tussen dubbele aanhalingstekens" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Groepen" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Groepsnamen gescheiden door komma's, tussen dubbele aanhalingstekens" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Gerelateerd objecttype" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Soort veld" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Keuzes" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Gegevens" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Gegevensbestand" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Inhoudstypen" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP-inhoudstype" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Soort evenement" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Soort actie" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Objecttype met tags" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Toegestaan objecttype" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regio's" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Sitegroepen" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Locaties" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Apparaattypes" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Rollen" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Clustertypen" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Clustergroepen" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Clusters" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Tenant groepen" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Het (de) objecttype (s) dat dit aangepaste veld heeft" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Standaardwaarde" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" "Type van het gerelateerde object (alleen voor velden met object/meerdere " "objecten)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filter voor gerelateerde objecten" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Specificeer queryparameters als een JSON-object." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Aangepast veld" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7460,7 +8020,7 @@ msgstr "" "Het type gegevens dat in dit veld is opgeslagen. Voor velden met " "object/meerdere objecten selecteert u hieronder het gerelateerde objecttype." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7468,11 +8028,11 @@ msgstr "" "Dit wordt weergegeven als helptekst voor het formulierveld. Markdown wordt " "ondersteund." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Gerelateerd object" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7480,15 +8040,16 @@ msgstr "" "Voer één keuze per regel in. Voor elke keuze kan een optioneel label worden " "gespecificeerd door er een dubbele punt aan toe te voegen. Voorbeeld:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Aangepaste link" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Sjablonen" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7498,62 +8059,68 @@ msgstr "" "{example}. Links die als lege tekst worden weergegeven, worden niet " "weergegeven." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "" "Jinja2-sjablooncode voor de link-URL. Verwijs naar het object als {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Sjablooncode" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Sjabloon exporteren" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Renderen" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "De inhoud van de sjabloon wordt ingevuld via de externe bron die hieronder " "is geselecteerd." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Moet lokale inhoud of een gegevensbestand specificeren" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Opgeslagen filter" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "" "In een meldingsgroep wordt ten minste één gebruiker of groep gespecificeerd." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP-aanvraag" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Keuze van de actie" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Voer de voorwaarden in JSON formaat." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7561,112 +8128,114 @@ msgstr "" "Voer parameters in om door te geven aan de actie JSON formaat." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Regel voor evenementen" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Triggers" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Meldingsgroep" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Tenant" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "" "Gegevens worden ingevuld via de externe bron die hieronder is geselecteerd." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Moet lokale gegevens of een gegevensbestand specificeren" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Inhoud" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Schema op" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Plan de uitvoering van het rapport op een vast tijdstip" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Gebeurd elke" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Interval waarop dit rapport opnieuw wordt uitgevoerd (in minuten)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (huidige tijd: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "De geplande tijd moet in de toekomst liggen." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Wijzigingen doorvoeren" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Wijzigingen doorvoeren in de database (schakel het vinkje uit voor een " "oefening; een repetitie)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Plan de uitvoering van het script op een bepaald tijdstip" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Interval waarmee dit script opnieuw wordt uitgevoerd (in minuten)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Wijzigingen in de database zijn automatisch teruggedraaid." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Script is met een fout afgebroken: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Er deed zich een uitzondering voor: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Wijzigingen in de database zijn teruggedraaid vanwege een fout." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Geen indexers gevonden!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "context van de configuratie" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "contexten configureren" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON-gegevens moeten in objectvorm zijn. Voorbeeld:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7674,19 +8243,19 @@ msgstr "" "Contextgegevens van de lokale configuratie hebben voorrang op broncontexten " "in de uiteindelijke gerenderde configuratiecontext" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "sjablooncode" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2-sjablooncode." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "omgevingsparameters" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7696,42 +8265,42 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">aanvullende" " parameters om door te geven bij het bouwen van de Jinja2-omgeving." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "configuratiesjabloon" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "configuratiesjablonen" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Het (de) object (en) waarop dit veld van toepassing is." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Het type gegevens dat dit aangepaste veld bevat" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Het type NetBox-object waarnaar dit veld wordt toegewezen (voor " "objectvelden)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Naam van het interne veld" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Alleen alfanumerieke tekens en onderstrepingstekens zijn toegestaan." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Dubbele onderstrepingstekens zijn niet toegestaan in aangepaste veldnamen." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7739,19 +8308,19 @@ msgstr "" "Naam van het veld zoals getoond aan gebruikers (indien niet opgegeven, wordt" " 'de veldnaam gebruikt)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "naam van de groep" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Aangepaste velden binnen dezelfde groep worden samen weergegeven" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "verplicht" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7759,19 +8328,19 @@ msgstr "" "Dit veld is vereist wanneer u nieuwe objecten maakt of een bestaand object " "bewerkt." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "moet uniek zijn" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "De waarde van dit veld moet uniek zijn voor het toegewezen object" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "zoekgewicht" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7779,11 +8348,11 @@ msgstr "" "Weging voor zoeken. Lagere waarden worden als belangrijker beschouwd. Velden" " met een zoekgewicht van nul worden genegeerd." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "filterlogica" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7791,11 +8360,11 @@ msgstr "" "Loose komt overeen met elk exemplaar van een bepaalde tekenreeks; exact komt" " overeen met het hele veld." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "standaard" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7803,7 +8372,7 @@ msgstr "" "Standaardwaarde voor het veld (moet een JSON-waarde zijn). Voeg tekenreeksen" " in met dubbele aanhalingstekens (bijvoorbeeld „Foo”)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7812,36 +8381,36 @@ msgstr "" "dictaat (moet een JSON-waarde zijn) .Voeg tekenreeksen in met dubbele " "aanhalingstekens (bijvoorbeeld „Foo”)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "gewicht van het beeldscherm" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "" "Velden met een hoger gewicht worden lager weergegeven in een formulier." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "minimumwaarde" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Minimaal toegestane waarde (voor numerieke velden)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maximale waarde" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Maximaal toegestane waarde (voor numerieke velden)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "validatieregex" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7852,197 +8421,199 @@ msgstr "" "en $ om het matchen van de hele string te forceren. Bijvoorbeeld ^ " "[A-Z]{3}$ beperkt de waarden tot precies drie hoofdletters." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "keuzeset" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Specificeert of het aangepaste veld wordt weergegeven in de " "gebruikersinterface" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Specificeert of de aangepaste veldwaarde kan worden bewerkt in de " "gebruikersinterface" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "is kloonbaar" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Repliceer deze waarde bij het klonen van objecten" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "aangepast veld" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "aangepaste velden" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Ongeldige standaardwaarde”{value}„: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "" "Er mag alleen een minimumwaarde worden ingesteld voor numerieke velden" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "" "Er mag alleen een maximumwaarde worden ingesteld voor numerieke velden" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Validatie van reguliere expressies wordt alleen ondersteund voor tekst- en " "URL-velden" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Uniciteit kan niet worden afgedwongen voor booleaanse velden" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Selectievelden moeten een reeks keuzes specificeren." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Keuzes kunnen alleen worden ingesteld op selectievelden." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Objectvelden moeten een objecttype definiëren." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} velden definiëren mogelijk geen objecttype." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Een gerelateerd objectfilter kan alleen voor objectvelden worden " "gedefinieerd." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Filter moet worden gedefinieerd als een woordenboek dat attributen aan " "waarden toewijst." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Waar" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Onwaar" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Waarden moeten overeenkomen met deze regex: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "De waarde moet een tekenreeks zijn." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "De waarde moet overeenkomen met regex '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "De waarde moet een geheel getal zijn." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "De waarde moet minstens {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "De waarde mag niet hoger zijn dan {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "De waarde moet een decimaal getal zijn." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "De waarde moet waar of onwaar zijn." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "De datumwaarden moeten de indeling ISO 8601 hebben (JJJJ-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "De datum- en tijdwaarden moeten de indeling ISO 8601 hebben (JJJJ-MM-DD " "H:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Ongeldige keuze ({value}) voor keuzeset {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Ongeldige keuze (s) ({value}) voor keuzeset {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "De waarde moet een object-ID zijn, niet {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "De waarde moet een lijst met object-ID's zijn, niet {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Ongeldige object-ID gevonden: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Het verplichte veld mag niet leeg zijn." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Basisset van vooraf gedefinieerde keuzes (optioneel)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Keuzes worden automatisch alfabetisch gerangschikt" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "aangepaste veldkeuzeset" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "aangepaste veldkeuzesets" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Moet basis- of extra keuzes definiëren." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8051,60 +8622,60 @@ msgstr "" "Keuze kan niet worden verwijderd {choice} zoals er zijn {model} objecten die" " ernaar verwijzen." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "lay-out" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "configuratie" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "dashboard" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "spatschermen" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "objecttypen" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Het (de) object (en) waarop deze regel van toepassing is." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "De soorten gebeurtenissen die deze regel zullen activeren." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "voorwaarden" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Een set voorwaarden die bepalen of de gebeurtenis wordt gegenereerd." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "actietype" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Aanvullende gegevens om door te geven aan het actieobject" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "regel van het evenement" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "regels voor evenementen" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8115,7 +8686,7 @@ msgstr "" "Jinja2-sjablonen wordt ondersteund met dezelfde context als de hoofdtekst " "van het verzoek." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available hier." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "extra kopteksten" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8142,11 +8713,11 @@ msgstr "" "Jinja2-sjablonen wordt ondersteund met dezelfde context als de hoofdtekst " "van het verzoek (hieronder)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "sjabloon voor het lichaam" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8159,11 +8730,11 @@ msgstr "" "tijdstempel, gebruikersnaam, " "aanvraag_id, en gegevens." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "geheim" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8173,16 +8744,16 @@ msgstr "" "header met een HMAC-hex-samenvatting van de payload-body met het geheim als " "sleutel. Het geheim wordt niet in het verzoek doorgegeven." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" "Activeer de verificatie van SSL-certificaten. Voorzichtig uitschakelen!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA-bestandspad" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8191,64 +8762,64 @@ msgstr "" "verificatie. Laat dit veld leeg om de standaardinstellingen van het systeem " "te gebruiken." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Geef geen CA-certificaatbestand op als SSL-verificatie is uitgeschakeld." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Het (de) objecttype (s) waarop deze link van toepassing is." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "linktekst" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Jinja2-sjablooncode voor linktekst" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL van de link" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Jinja2-sjablooncode voor link-URL" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Links met dezelfde groep verschijnen als een dropdown-menu" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nieuw venster" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Link forceren om in een nieuw venster te openen" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "link op maat" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "links op maat" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Het (de) objecttype (s) waarop dit sjabloon van toepassing is." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8256,1088 +8827,1154 @@ msgstr "" "Jinja2-sjablooncode. De lijst met objecten die worden geëxporteerd, wordt " "doorgegeven als een contextvariabele met de naam queryset." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Wordt standaard ingesteld op text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "bestandsextensie" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Uitbreiding om toe te voegen aan de gerenderde bestandsnaam" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "als bijlage" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Download het bestand als bijlage" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "sjabloon exporteren" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "sjablonen exporteren" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "„{name}„is een gereserveerde naam. Kies een andere naam." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Het (de) objecttype (s) waarop dit filter van toepassing is." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "gedeeld" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "opgeslagen filter" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "opgeslagen filters" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Filterparameters moeten worden opgeslagen als een woordenboek met " "trefwoordargumenten." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "hoogte van de afbeelding" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "breedte van de afbeelding" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "bijlage bij de afbeelding" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "bijlagen bij afbeeldingen" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Afbeeldingsbijlagen kunnen niet aan dit objecttype worden toegewezen " "({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "vriendelijk" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "journaalboeking" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "journaalboekingen" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Journaling wordt niet ondersteund voor dit objecttype ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "bladwijzer" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "bladwijzers" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "" "Bladwijzers kunnen niet aan dit objecttype worden toegewezen ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "lezen" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "evenement" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "melding" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "meldingen" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objecten van dit type ({type}) ondersteunen geen meldingen." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "groepen" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "gebruikers" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "meldingsgroep" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "meldingsgroepen" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "abonnement" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "abonnementen" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "is uitvoerbaar" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "script" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "scripts" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "scriptmodule" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "scriptmodules" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "tijdstempel" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "veld" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "waarde" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "waarde in de cache" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "waarden in de cache" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "filiaal" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "takken" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "gefaseerde verandering" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "gefaseerde wijzigingen" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Het (de) objecttype (s) waarop deze tag kan worden toegepast." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "tag" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "labels" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "item met tags" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "getagde artikelen" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Scriptgegevens" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parameters voor uitvoering van scripts" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Ontslaan" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Objecttypen" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Uniciteit valideren" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Zichtbaar" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Bewerkbaar" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Gerelateerd objecttype" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Keuzeset" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Is kloonbaar" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimumwaarde" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maximale waarde" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Validatie Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Tellen" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Alfabetisch ordenen" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nieuw venster" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Als bijlage" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Gegevensbestand" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Gesynchroniseerd" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Afbeelding" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Grootte (bytes)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Lees" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL-validatie" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Soorten evenementen" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Apparaat rollen" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Opmerkingen (kort)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Lijn" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Niveau" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Bericht" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Methode" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Zorg ervoor dat deze waarde gelijk is aan %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Zorg ervoor dat deze waarde niet gelijk is %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Dit veld moet leeg zijn." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Dit veld mag niet leeg zijn." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Validatieregels moeten als woordenboek worden doorgegeven" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Aangepaste validatie is mislukt voor {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Ongeldig kenmerk”{name}„op aanvraag" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Ongeldig kenmerk”{name}„voor {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Je dashboard is opnieuw ingesteld." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Widget toegevoegd: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Bijgewerkte widget: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Widget verwijderd: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Fout bij het verwijderen van de widget: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Kan script niet uitvoeren: het RQ-werkproces wordt niet uitgevoerd." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Voer een geldig IPv4- of IPv6-adres in met optioneel masker." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Ongeldig formaat van het IP-adres: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" "Voer een geldig IPv4- of IPv6-voorvoegsel en masker in de CIDR-notatie in." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Ongeldig formaat voor IP-prefix: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Er is onvoldoende ruimte beschikbaar voor de gevraagde prefixgrootte (s)" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Container" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standaard" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "CheckPoint" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Platte tekst" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Ongeldig formaat van het IP-adres: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Doel importeren" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Importdoel (naam)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Doel exporteren" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Exportdoel (naam)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "VRF importeren" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "VRF (RD) importeren" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "VRF exporteren" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "VRF (RD) exporteren" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "L2VPN importeren" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "L2VPN importeren (identifier)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "L2VPN exporteren" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "L2VPN exporteren (identifier)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Voorvoegsel" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slak)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Binnen het voorvoegsel" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Binnen en inclusief voorvoegsel" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Prefixen die dit voorvoegsel of IP-adres bevatten" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Lengte van het masker" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN-nummer (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adres" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Bereiken die dit voorvoegsel of IP-adres bevatten" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Oudervoorvoegsel" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Virtuele machine (naam)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Virtuele machine (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interface (naam)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM-interface (naam)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM-interface (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP-groep (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Is toegewezen aan een interface" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Is toegewezen" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Service (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT binnen IP-adres (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Toegewezen interface" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Toegewezen VM-interface" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP-adres (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP-adres" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Primaire IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Primaire IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Voer een geldig IPv4- of IPv6-adres in (zonder masker)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Ongeldig IPv4/IPv6-adresformaat: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Dit veld vereist een IP-adres zonder masker." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Geef een geldig IPv4- of IPv6-adres op." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Voer een geldig IPv4- of IPv6-adres in (met CIDR-masker)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Een CIDR-masker (bijv /24) is vereist." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Adrespatroon" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Zorg voor unieke ruimte" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Is privé" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Datum toegevoegd" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN-groep" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Lengte van het voorvoegsel" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Is een pool" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Behandel als volledig gebruikt" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN-toewijzing" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS-naam" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protocol" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Groeps-ID" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Authenticatietype" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Verificatiesleutel" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Authentificatie" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Soort bereik" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Toepassingsgebied" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN-ID-bereiken" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Site en groep" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Poorten" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Routedoelen importeren" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Routedoelen exporteren" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Toegewezen RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLAN-groep (indien aanwezig)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Ouderapparaat met toegewezen interface (indien aanwezig)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Virtuele machine" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Bovenliggende VM van de toegewezen interface (indien aanwezig)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Is primair" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Maak dit het primaire IP-adres voor het toegewezen apparaat" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Geen apparaat of virtuele machine gespecificeerd; kan niet worden ingesteld " "als primair IP-adres" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Geen interface gespecificeerd; kan niet worden ingesteld als primair IP-" "adres" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Authenticatietype" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Soort bereik (app en model)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Toegewezen VLAN-groep" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP-protocol" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Vereist indien niet toegewezen aan een VM" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Vereist indien niet toegewezen aan een apparaat" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} is niet toegewezen aan dit apparaat/VM." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Routedoelen" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Doelen importeren" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Doelen exporteren" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Geïmporteerd door VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Geëxporteerd door VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privé" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Adres familie" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Assortiment" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Begin" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Einde" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Zoek binnen" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Aanwezig in VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Apparaat/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Voorvoegsel voor ouders" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Toegewezen apparaat" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Toegewezen VM" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Toegewezen aan een interface" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS-naam" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN's" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Bevat VLAN-ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN-ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Virtuele machine" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Doel van de route" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Aggregaat" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN-assortiment" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Site/VLAN-toewijzing" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP-bereik" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP-groep" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Maak dit het primaire IP-adres voor het apparaat/VM" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (binnenin)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Een IP-adres kan slechts aan één object worden toegewezen." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Kan het IP-adres niet opnieuw toewijzen terwijl dit is aangewezen als het " -"primaire IP-adres voor het bovenliggende object" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Alleen IP-adressen die aan een interface zijn toegewezen, kunnen als " "primaire IP-adressen worden aangeduid." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Virtueel IP-adres" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "De opdracht bestaat al" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN-ID's" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Kind-VLAN's" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9345,134 +9982,135 @@ msgstr "" "Door komma's gescheiden lijst van een of meer poortnummers. Een bereik kan " "worden gespecificeerd met een koppelteken." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Servicesjabloon" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Poort (en)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Service" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Servicesjabloon" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Van sjabloon" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Op maat" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "U moet de naam, het protocol en de poort (en) opgeven als u geen " "servicesjabloon gebruikt." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "begin" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN-assortiment" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN-reeksen" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "ASN starten ({start}) moet lager zijn dan het einde van ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" "Regionaal internetregister dat verantwoordelijk is voor deze AS-nummerruimte" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- of 32-bits autonoom systeemnummer" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "groeps-ID" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protocol" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "authenticatietype" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "authenticatiesleutel" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP-groep" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "FHRP-groepen" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "FHRP-groepsopdracht" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "FHRP-groepstoewijzingen" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privé" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "IP-ruimte die door deze RIR wordt beheerd, wordt als privé beschouwd" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR's" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4- of IPv6-netwerk" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "" "Regionaal internetregister dat verantwoordelijk is voor deze IP-ruimte" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "datum toegevoegd" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "totaal" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "totalen" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Kan geen aggregaat maken met een masker /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9481,7 +10119,7 @@ msgstr "" "Aggregaten kunnen elkaar niet overlappen. {prefix} is al gedekt door een " "bestaand aggregaat ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9490,269 +10128,279 @@ msgstr "" "Voorvoegsels mogen aggregaten niet overlappen. {prefix} omvat een bestaand " "aggregaat ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "functie" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "rollen" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "voorvoegsel" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "IPv4- of IPv6-netwerk met masker" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Operationele status van dit voorvoegsel" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "De primaire functie van dit voorvoegsel" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "is een pool" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Alle IP-adressen binnen dit voorvoegsel worden als bruikbaar beschouwd" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "merk gebruikt" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "voorvoegsels" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Kan geen voorvoegsel aanmaken met het masker /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "globale tabel" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Duplicaat voorvoegsel gevonden in {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "startadres" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4- of IPv6-adres (met masker)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "eindadres" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Operationele status van deze serie" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "De primaire functie van dit assortiment" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP-bereik" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP-bereiken" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "" "De versies van het begin- en eindpunt van het IP-adres moeten overeenkomen" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "De IP-adresmaskers voor het begin en einde moeten overeenkomen" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "Het eindadres moet groter zijn dan het beginadres ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Gedefinieerde adressen overlappen met het bereik {overlapping_range} in VRF " "{vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Het gedefinieerde bereik overschrijdt de maximale ondersteunde grootte " "({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "adres" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "De operationele status van dit IP-adres" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "De functionele rol van dit IP-adres" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (binnen)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "Het IP-adres waarvoor dit adres het „externe” IP-adres is" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Hostnaam of FQDN (niet hoofdlettergevoelig)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP-adressen" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Kan geen IP-adres aanmaken met een masker /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} is een netwerk-ID, die mogelijk niet aan een interface is toegewezen." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" "{ip} is een uitzendadres dat mogelijk niet aan een interface is toegewezen." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Duplicaat IP-adres gevonden in {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Kan het IP-adres niet opnieuw toewijzen terwijl dit is aangewezen als het " +"primaire IP-adres voor het bovenliggende object" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Alleen IPv6-adressen kunnen een SLAAC-status krijgen" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "poortnummers" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "servicesjabloon" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "servicesjablonen" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "De specifieke IP-adressen (indien aanwezig) waaraan deze service is " "gekoppeld" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "service" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "diensten" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Een service kan niet worden gekoppeld aan zowel een apparaat als een " "virtuele machine." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Een service moet gekoppeld zijn aan een apparaat of een virtuele machine." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN-groepen" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Kan scope_type niet instellen zonder scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Kan scope_id niet instellen zonder scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Bereiken kunnen elkaar niet overlappen." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "De specifieke site waaraan dit VLAN is toegewezen (indien aanwezig)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN-groep (optioneel)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numerieke VLAN-id (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Operationele status van dit VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "De primaire functie van dit VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9761,169 +10409,171 @@ msgstr "" "VLAN is toegewezen aan de groep {group} (toepassingsgebied: {scope}); kan " "niet ook aan de site worden toegewezen {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID moet binnen bereik zijn {ranges} voor VLAN's in groep {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "route-onderscheider" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Unieke routedifferentiator (zoals gedefinieerd in RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "unieke ruimte afdwingen" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Voorkom dubbele voorvoegsels/IP-adressen in deze VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF's" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "" "Doelwaarde van de route (geformatteerd in overeenstemming met RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "doel van de route" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "routedoelen" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Aantal sites" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Aantal providers" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Totalen" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Toegevoegd" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Voorvoegsels" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Gebruik" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP-bereiken" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Voorvoegsel (plat)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Diepte" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Pool" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Gemarkeerd als gebruikt" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Startadres" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (binnenkant)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (buiten)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Toegewezen" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Toegewezen object" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Soort toepassingsgebied" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID-reeksen" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Uniek" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Doelen importeren" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Doelen exporteren" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} is geen geldig voorvoegsel. Bedoelde je {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "" "De lengte van het voorvoegsel moet kleiner zijn dan of gelijk aan " "%(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "" "De lengte van het voorvoegsel moet groter zijn dan of gelijk zijn aan " "%(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9931,31 +10581,31 @@ msgstr "" "Alleen alfanumerieke tekens, sterretjes, koppeltekens, punten en " "onderstrepingstekens zijn toegestaan in DNS-namen" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Voorvoegsels voor kinderen" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Ranges voor kinderen" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Gerelateerde IP's" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfaces voor apparaten" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM-interfaces" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Dit veld is mogelijk niet leeg." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9963,331 +10613,344 @@ msgstr "" "De waarde moet rechtstreeks worden doorgegeven (bijvoorbeeld „foo”: 123); " "gebruik geen woordenboek of lijst." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} is geen geldige keuze." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Ongeldig inhoudstype: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Ongeldige waarde. Specificeer een inhoudstype als " "'.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "" "Bereiken moeten in het formulier worden gespecificeerd (onder, boven)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Bereikgrenzen moeten worden gedefinieerd als gehele getallen." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} moet get_view_name () implementeren" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Ongeldige toestemming {permission} voor model {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Donkerrood" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Roos" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuchsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Donkerpaars" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Lichtblauw" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Donkergroen" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Lichtgroen" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Limoen" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Amber" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Donkeroranje" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Bruin" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Lichtgrijs" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Grijs" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Donkergrijs" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Rechtstreeks" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Uploaden" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Automatisch detecteren" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Komma" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Puntkomma" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Tab" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Ongeldige configuratieparameter: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Banner voor inloggen" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Aanvullende inhoud om weer te geven op de inlogpagina" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Onderhoudsbanner" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Aanvullende inhoud om weer te geven in de onderhoudsmodus" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Bovenste banner" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Aanvullende inhoud om bovenaan elke pagina weer te geven" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Onderste banner" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Aanvullende inhoud om onderaan elke pagina weer te geven" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Wereldwijd unieke IP-ruimte" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Unieke IP-adressering binnen de globale tabel afdwingen" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Geef de voorkeur aan IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Geef de voorkeur aan IPv4-adressen boven IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Hoogte van de rackeenheid" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Standaardeenheidshoogte voor gerenderde rackverhogingen" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Breedte van de rackunit" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Standaardeenheidsbreedte voor gerenderde rackhoogtes" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Voedingsspanning" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Standaardspanning voor voedingen" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Stroomsterkte van de voeding" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Standaardstroomsterkte voor voedingen" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Maximaal gebruik van Powerfeed" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Maximaal standaardgebruik voor powerfeeds" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Toegestane URL-schema's" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Toegestane schema's voor URL's in door gebruikers aangeleverde inhoud" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Standaard paginaformaat" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maximale paginagrootte" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Eigen Validators" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Aangepaste validatieregels (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Beschermingsregels" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Regels voor verwijderingsbeveiliging (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Standaardvoorkeuren" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Standaardvoorkeuren voor nieuwe gebruikers" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Onderhoudsmodus" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Onderhoudsmodus inschakelen" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL ingeschakeld" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "De GraphQL-API inschakelen" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Behoud van changelog" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Dagen om de geschiedenis van het changelog te bewaren (ingesteld op nul voor" " onbeperkt)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Behoud van werkresultaten" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Dagen om de geschiedenis van de taakresultaten bij te houden (op nul gezet " "voor een onbeperkt aantal)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL van de kaart" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Basis-URL voor het in kaart brengen van geografische locaties" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Gedeeltelijke match" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Exacte overeenkomst" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Begint met" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Eindigt met" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Objecttype (s)" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Opzoeken" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10295,412 +10958,427 @@ msgstr "" "Tag-slugs gescheiden door komma's, tussen dubbele aanhalingstekens " "(bijvoorbeeld „tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Tags toevoegen" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Tags verwijderen" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} moet een modelklasse specificeren." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Onbekende veldnaam '{name}'in aangepaste veldgegevens." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Ongeldige waarde voor aangepast veld '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Aangepast veld '{name}'moet een unieke waarde hebben." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Ontbreekt het vereiste aangepaste veld '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Externe gegevensbron" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "datapad" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "" "Pad naar extern bestand (ten opzichte van de root van de gegevensbron)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "automatische synchronisatie ingeschakeld" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Automatische synchronisatie van gegevens inschakelen wanneer het " "gegevensbestand wordt bijgewerkt" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "datum gesynchroniseerd" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} moet een sync_data () -methode implementeren." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organisatie" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Sitegroepen" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Tenant Groepen" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Contactgroepen" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Rollen voor contactpersonen" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Contacttoewijzingen" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Rack rollen" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Verhogingen" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Soorten rekken" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Modules" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Contexten van virtuele apparaten" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Fabrikanten" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Onderdelen van het apparaat" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Rollen van inventarisitems" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Verbindingen" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kabels" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Draadloze links" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Interface-aansluitingen" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Console-aansluitingen" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Stroomaansluitingen" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Draadloze LAN-groepen" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Prefix- en VLAN-rollen" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN-reeksen" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN-groepen" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Servicesjablonen" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Diensten" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunnels" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Tunnelgroepen" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Tunnelafsluitingen" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN's" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Beëindigingen" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKE-voorstellen" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE-beleid" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPsec-voorstellen" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPsec-beleid" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPsec-profielen" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Virtuele schijven" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Clustertypen" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Clustergroepen" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Circuittypes" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Circuitgroepen" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Groepstoewijzingen" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Circuitafsluitingen" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Providers" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Accounts van providers" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Netwerken van providers" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Voedingspanelen" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Configuraties" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Contexten configureren" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Configuratiesjablonen" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Aanpassing" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Aangepaste velden" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Aangepaste veldkeuzes" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Aangepaste links" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Sjablonen exporteren" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Opgeslagen filters" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Afbeeldingsbijlagen" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operaties" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integraties" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Gegevensbronnen" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Regels voor evenementen" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Jobs" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Loggen" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Meldingsgroepen" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Journaalboekingen" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Logboek wijzigen" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "beheerder" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API-tokens" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Machtigingen" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Systeem" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plug-ins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Configuratiegeschiedenis" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Achtergrondtaken" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Machtigingen moeten worden doorgegeven als een tuple of lijst." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Knoppen moeten als een tuple of lijst worden doorgegeven." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "De kleur van de knop moet een keuze zijn binnen ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10709,7 +11387,7 @@ msgstr "" "PluginTemplateExtension-klasse {template_extension} werd als voorbeeld " "aangenomen!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10718,196 +11396,197 @@ msgstr "" "{template_extension} is geen subklasse van de " "NetBox.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} moet een exemplaar zijn van NetBox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} moet een exemplaar zijn van NetBox.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} moet een exemplaar zijn van NetBox.Plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context moet een woordenboek zijn" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX-navigatie" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Dynamische UI-navigatie inschakelen" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Experimentele functie" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Taal" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Forceert UI-vertaling naar de opgegeven taal" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Ondersteuning voor vertaling is lokaal uitgeschakeld" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Lengte van de pagina" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Het standaardaantal objecten dat per pagina moet worden weergegeven" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Plaatsing van de paginator" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Onderkant" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Bovenkant" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Allebei" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Waar de bedieningselementen van de paginator worden weergegeven ten opzichte" " van een tabel" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Formaat van de gegevens" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "De voorkeurssyntaxis voor het weergeven van generieke gegevens in de " "gebruikersinterface" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Ongeldige winkel: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Kan na initialisatie geen winkels aan het register toevoegen" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Kan winkels niet verwijderen uit het register" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Tsjechisch" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Deens" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Duits" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Engels" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Spaans" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Frans" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italiaans" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japans" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Nederlands" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Pools" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Portugees" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Russisch" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Turks" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Oekraïens" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Chinees" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Alles selecteren" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Alles omschakelen" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Dropdown in- en uitschakelen" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Fout" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "Nee {model_name} gevonden" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Veld" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Waarde" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Dummy-plug-in" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10916,57 +11595,57 @@ msgstr "" "Er is een fout opgetreden bij het weergeven van de geselecteerde " "exportsjabloon ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Rij {i}: Object met ID {id} bestaat niet" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Nee {object_type} zijn geselecteerd." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Hernoemd {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Verwijderd {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Log met wijzigingen" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Tijdschrift" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "" "Kan gegevens niet synchroniseren: er is geen gegevensbestand ingesteld." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Gesynchroniseerde gegevens voor {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Gesynchroniseerd {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} moet get_children () implementeren" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10974,705 +11653,747 @@ msgstr "" "Er is een fout opgetreden tijdens het laden van de dashboardconfiguratie. Er" " wordt een standaarddashboard gebruikt." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Toegang geweigerd" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Je hebt geen toestemming om deze pagina te openen" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Pagina niet gevonden" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "De opgevraagde pagina bestaat niet" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Serverfout" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Er was een probleem met je aanvraag. Neem contact op met een beheerder" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "De volledige uitzondering wordt hieronder gegeven" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python-versie" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox-versie" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Niet geïnstalleerd" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Als er meer hulp nodig is, stuur dan een bericht naar de" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox-discussieforum" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "op GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Startpagina" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profiel" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Meldingen" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abonnementen" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Voorkeuren" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Wachtwoord wijzigen" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Annuleer" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Opslaan" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Tabelconfiguraties" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Tabelvoorkeuren wissen" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Alles omschakelen" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tafel" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Bestellen" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Kolommen" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Niets gevonden" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Gebruikersprofiel" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Accountgegevens" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "Email" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Account aangemaakt" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Laatste aanmelding" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superuser" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Staf" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Toegewezen groepen" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Geen" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Recente activiteit" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Mijn API-tokens" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Schrijven ingeschakeld" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Laatst gebruikt" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Een token toevoegen" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Home" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox-motief" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox-logo" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Documenten" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST API-documentatie" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL-API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Ondersteuning voor NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Broncode" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Gemeenschap" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Datum van installatie" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Beëindigingsdatum" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Groep toewijzen" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Swap Circuit-afsluitingen" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Verwissel deze aansluitingen voor een circuit %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "A-kant" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z-kant" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Circuit toewijzen" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Circuitgroepopdracht" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Circuit toevoegen" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Circuittype" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Toevoegen" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Bewerken" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Ruil" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Gemarkeerd als verbonden" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "naar" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Spoor" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Kabel bewerken" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Kabel verwijderen" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Verbinding verbreken" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Verbind" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Stroomafwaarts" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Stroomopwaarts" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Cross-connect" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Patchpaneel/poort" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Circuit toevoegen" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Account van de provider" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Configuratiegegevens" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Commentaar" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Herstellen" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parameter" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Huidige waarde" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nieuwe waarde" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Gewijzigd" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Grootte" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256-hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synchroniseer" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Laatst gesynchroniseerd" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Geen parameters gedefinieerd" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "bestanden" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Rackverhogingen" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Standaardeenheidshoogte" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Breedte van de standaardeenheid" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Stroomvoedingen" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Standaardspanning" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Standaard stroomsterkte" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Maximaal standaardgebruik" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Wereldwijd uniek afdwingen" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Aantal paginaten" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Maximale paginagrootte" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Gebruikersvoorkeuren" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Behoud van een baan" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Taak" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Gemaakt door" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Planning" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "elk %(interval)s minuten" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Verandering" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Verschil" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Vorige" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Volgende" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Object gemaakt" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Object verwijderd" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Geen wijzigingen" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Gegevens vóór de wijziging" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Waarschuwing: niet-atomaire wijzigingen vergelijken met eerdere " "wijzigingsrecords" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Gegevens na de wijziging" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Alles bekijken %(count)s Veranderingen" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Het bewaren van logboeken wijzigen" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "dagen" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Onbepaald" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Niet geïnstalleerd" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Overzicht" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Installeren" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Details van de plug-in" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Samenvatting" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licentie" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Versiegeschiedenis" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Lokale installatie-instructies" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Achtergrondwachtrijen" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Tabel configureren" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Stop" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Requeue" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "In de wachtrij" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Wachtrij" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Time-out" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Resultaat TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumenten" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argumenten voor zoekwoorden" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Hangt af van" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Uitzondering" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "taken in " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Opdrachten in de wachtrij" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11680,384 +12401,402 @@ msgstr "" "Selecteer allemaal %(count)s %(object_type_plural)s " "overeenkomende vraag" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informatie voor werknemers" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Worker" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Wachtrijen" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Huidige baan" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Aantal succesvolle taken" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Aantal mislukte taken" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Totale werktijd" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "seconden" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Achtergrondwerkers" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Werknemers in %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Exporteren" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Status van het systeem" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox-release" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Django-versie" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL-versie" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Databasenaam" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Grootte van de database" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Niet beschikbaar" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ-werknemers" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "standaardwachtrij" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Systeemtijd" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Huidige configuratie" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" "Weet je zeker dat je deze wilt loskoppelen %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Cable Trace voor %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "SVG downloaden" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Asymmetrisch pad" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "De knooppunten hieronder hebben geen links en resulteren in een asymmetrisch" " pad" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Pad gesplitst" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Selecteer hieronder een knooppunt om door te gaan" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Traceren voltooid" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Totaal aantal segmenten" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Totale lengte" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Geen paden gevonden" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Gerelateerde paden" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Herkomst" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Bestemming" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmenten" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Onvolledig" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Geselecteerde naam wijzigen" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Niet verbonden" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Markeer het apparaat in het rack" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Niet gehackt" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS-coördinaten" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Kaart" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Tag voor bedrijfsmiddelen" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Bekijk het virtuele chassis" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "VDC aanmaken" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Beheer" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT voor" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Energiegebruik" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Invoer" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Verkooppunten" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Toegewezen" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Leg" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Een service toevoegen" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Componenten toevoegen" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Consolepoorten toevoegen" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Console Server-poorten toevoegen" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Apparaatbays toevoegen" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Poorten aan de voorkant toevoegen" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Verbergen ingeschakeld" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Verbergen Uitgeschakeld" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Virtueel verbergen" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Verberg de verbinding verbroken" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Interfaces toevoegen" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Inventarisitem toevoegen" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Modulebays toevoegen" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Stopcontacten toevoegen" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Voedingspoort toevoegen" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Achterpoorten toevoegen" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Configuratie" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Contextgegevens" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Gerenderde configuratie" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Downloaden" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Geen configuratiesjabloon gevonden" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Parent Bay" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Regenereer naaktslak" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Verwijderen" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Contextgegevens voor lokale configuratie" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Hernoemen" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Apparaatvak" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Geïnstalleerd apparaat" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Verwijderen %(device)s uit %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12066,430 +12805,449 @@ msgstr "" "Weet je zeker dat je wilt verwijderen %(device)s uit " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Bevolken" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Bay" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Apparaat toevoegen" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "VM-rol" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Naam van het model" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Onderdeelnummer" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Van gebruik uitsluiten" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Ouder/kind" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Afbeelding op de voorkant" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Afbeelding aan de achterkant" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Positie van de achterpoort" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Gemarkeerd als verbonden" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Status van de verbinding" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "A-kant" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B-kant" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Geen beëindiging" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Mark Gepland" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Markeer geïnstalleerd" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Status van het pad" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Niet bereikbaar" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Eindpunten van het pad" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Niet verbonden" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Niet gelabeld" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Geen VLAN's toegewezen" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Duidelijk" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Alles wissen" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Montagediepte" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Starteenheid" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Aflopende eenheden" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Rackhoogte" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Kindinterface toevoegen" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Snelheid/duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE-modus" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE-type" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q-modus" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC-adres" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Draadloze link" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanaal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Kanaalfrequentie" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Kanaalbreedte" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "LAG-leden" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Geen interfaces voor leden" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "IP-adres toevoegen" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Bovenliggend item" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Onderdeel-ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Locatie van het kind toevoegen" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Locaties voor kinderen" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Een locatie toevoegen" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Een apparaat toevoegen" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Apparaattype toevoegen" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Moduletype toevoegen" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Aangesloten apparaat" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Verbruik (toegewezen)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Elektrische kenmerken" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Voer de poot in" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Power Feeds toevoegen" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Maximaal aantal trekkingen" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Toegewezen gelijkspel" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Ruimtegebruik" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Gewicht van het rek" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maximaal gewicht" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Totaal gewicht" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Afbeeldingen en labels" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Alleen afbeeldingen" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Alleen labels" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Reservering toevoegen" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Lijst bekijken" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Rack-weergave selecteren" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Sorteer op" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Geen rekken gevonden" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Bekijk de verhogingen" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Reserveringsgegevens" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Rack toevoegen" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Posities" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Site toevoegen" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Kindgebieden" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Regio toevoegen" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Tijdzone" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Tijd op de site" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Fysiek adres" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Verzendadres" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Kindergroepen" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Sitegroep toevoegen" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Gehechtheid" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Lid toevoegen" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Apparaten voor leden" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Nieuw lid toevoegen aan virtueel chassis %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Nieuw lid toevoegen" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Acties" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Opslaan en nog een toevoegen" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Virtueel chassis bewerken %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Rack/eenheid" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Virtueel chassislid verwijderen" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12498,11 +13256,12 @@ msgstr "" "Weet je zeker dat je wilt verwijderen %(device)s vanaf een " "virtueel chassis %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identificatie" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12510,11 +13269,11 @@ msgstr "" "Tijdens dit verzoek is er een fout opgetreden bij het importeren van de " "module. Veelvoorkomende oorzaken zijn onder meer:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Vereiste pakketten ontbreken" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12531,11 +13290,11 @@ msgstr "" "freeze vanaf de console en vergelijk de uitvoer met de lijst met " "vereiste pakketten." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "De WSGI-service is niet opnieuw gestart na de upgrade" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12545,7 +13304,7 @@ msgstr "" "service (bijvoorbeeld gunicorn of uWSGI) opnieuw is gestart. Dit zorgt " "ervoor dat de nieuwe code actief is." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12553,11 +13312,11 @@ msgstr "" "Tijdens de verwerking van dit verzoek is een fout in de bestandsrechten " "gedetecteerd. Veelvoorkomende oorzaken zijn onder meer:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Onvoldoende schrijfrechten naar de mediaroot" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12568,7 +13327,7 @@ msgstr "" " de gebruiker NetBox toegang heeft om bestanden naar alle locaties binnen " "dit pad te schrijven." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12576,11 +13335,11 @@ msgstr "" "Er is een programmeerfout in de database gedetecteerd tijdens de verwerking " "van dit verzoek. Veelvoorkomende oorzaken zijn onder meer:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Databasemigraties ontbreken" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12591,11 +13350,11 @@ msgstr "" "migraties handmatig uitvoeren door het uitvoeren van python3 manage.py" " migreren vanaf de command line." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Niet ondersteunde PostgreSQL-versie" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12606,99 +13365,102 @@ msgstr "" "inloggegevens van NetBox en een query uit te voeren voor SELECTEER " "VERSIE ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Het gegevensbestand dat aan dit object is gekoppeld, is verwijderd" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Gegevens gesynchroniseerd" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Gegevens synchroniseren" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Milieuparameters" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Sjabloon" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Naam van de groep" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Moet uniek zijn" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Kloonbaar" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Standaardwaarde" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Zoekgewicht" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filterlogica" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Gewicht van het scherm" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "UI zichtbaar" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "UI bewerkbaar" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Validatieregels" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Reguliere expressie" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Knopklasse" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Toegewezen modellen" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Tekst koppelen" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL van de link" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Dashboard opnieuw instellen" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12706,7 +13468,7 @@ msgstr "" "Dit zal verwijderen allemaal geconfigureerde widgets en " "herstel de standaard dashboardconfiguratie." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12714,159 +13476,161 @@ msgstr "" "Deze wijziging is alleen van invloed jouw dashboard, en heeft geen " "invloed op andere gebruikers." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "configuratie van de widget" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Widget sluiten" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Een widget toevoegen" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Er zijn nog geen bladwijzers toegevoegd." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Geen toestemming" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Geen toestemming om deze inhoud te bekijken" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Kan inhoud niet laden. Ongeldige weergavenaam" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Geen inhoud gevonden" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Er is een probleem opgetreden bij het ophalen van de RSS-feed" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Voorwaarden" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME-type" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "bestandsextensie" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Gepland voor" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Duur" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Samenvatting van de test" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Logboek" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Uitgang" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Aan het laden" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Resultaten in behandeling" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Dagboekinvoer" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Meldingsgroep" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Geen toegewezen" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "De lokale configuratiecontext overschrijft alle broncontexten" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Broncontexten" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nieuwe journaalpost" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Rapporteren" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Je hebt geen toestemming om scripts uit te voeren" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Script uitvoeren" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Fout bij laden van script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Het script bestaat niet meer in het bronbestand." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Laatste run" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Het script is niet langer aanwezig in het bronbestand" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Nooit" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Draai opnieuw" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "Kon de scripts van niet laden van module %(module)s" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Geen scripts gevonden" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12875,81 +13639,83 @@ msgstr "" "Ga aan de slag met een script maken " "van een geüpload bestand of een gegevensbron." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Resultaten" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Drempel voor loggen" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Alles" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Getagde artikelen" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Toegestane objecttypen" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Elke" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Typen artikelen met tags" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Getagde objecten" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP-methode" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP-inhoudstype" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL-verificatie" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Aanvullende kopteksten" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Lichaamssjabloon" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Creatie in bulk" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Geselecteerde objecten" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "om toe te voegen" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Bulk verwijderen" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Bulkverwijdering bevestigen" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12960,66 +13726,69 @@ msgstr "" "%(type_plural)s. Controleer de geselecteerde objecten zorgvuldig en bevestig" " deze actie." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Bewerken" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Bulkbewerking" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Toepassen" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Importeren in bulk" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Rechtstreeks importeren" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Bestand uploaden" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Verzenden" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Veldopties" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Accessor" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "keuzes" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Importwaarde" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Formaat: JJJJ-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Specificeer waar of onwaar" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Verplichte velden moeten voor alle objecten worden " "gespecificeerd." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -13029,15 +13798,15 @@ msgstr "" "Bijvoorbeeld %(example)s zou een VRF identificeren aan de hand " "van zijn route-identificator." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Bulk verwijderen" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Bulkverwijdering bevestigen" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -13048,72 +13817,72 @@ msgstr "" "%(parent_obj)s. Lees a.u.b. zorgvuldig de %(obj_type_plural)s om hieronder " "te worden verwijderd en te bevestigen." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Verwijder deze %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Hernoemen" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Bulk hernoemen" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Huidige naam" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nieuwe naam" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Voorbeeld" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Weet je het zeker" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Bevestigen" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Geselecteerde bewerken" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Geselecteerde verwijderen" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Voeg een nieuwe toe %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Modeldocumentatie bekijken" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Help" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Nog een aanmaken en toevoegen" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filters" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13123,40 +13892,40 @@ msgstr "" "count\">%(count)s %(object_type_plural)s overeenkomende " "vraag" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nieuwe release beschikbaar" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "is beschikbaar" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Instructies voor de upgrade" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Dashboard ontgrendelen" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Dashboard vergrendelen" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Widget toevoegen" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Lay-out opslaan" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Verwijdering bevestigen" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13165,40 +13934,40 @@ msgstr "" "Weet je zeker dat je dat wilt verwijderen %(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Als gevolg van deze actie worden de volgende objecten verwijderd." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "geleden" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Geen ongelezen meldingen" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Alle meldingen" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Selecteer" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Resetten" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Schakel de donkere modus in" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Lichtmodus inschakelen" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13207,281 +13976,283 @@ msgstr "" "Voordat je een kunt toevoegen %(model)s je moet eerst een aanmaken " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Paginaselectie" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "bewijs %(start)s-%(end)s van %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Pagineringsopties" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Per pagina" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Een afbeelding bijvoegen" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Gerelateerde objecten" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Geen tags toegewezen" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Gegevens lopen niet synchroon met het upstream-bestand" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Snel zoeken" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Opgeslagen filter" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Duidelijke bestelling" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Helpcentrum" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Django-beheerder" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Uitloggen" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Inloggen" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Familie" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Datum toegevoegd" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Voorvoegsel toevoegen" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS-nummer" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Authenticatietype" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Verificatiesleutel" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Virtuele IP-adressen" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "IP toewijzen" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Bulk aanmaken" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Groep aanmaken" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Virtuele IP-adressen" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Toegewezen weergeven" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Beschikbaar weergeven" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Alles weergeven" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globaal" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (buiten)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Een IP-adres toewijzen" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "IP-adres selecteren" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Zoekresultaten" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "IP-adressen in bulk toevoegen" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Startadres" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Eindadres" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Gemarkeerd als volledig gebruikt" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Adresseringsgegevens" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "IP's voor kinderen" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Beschikbare IP-adressen" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Eerste beschikbare IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Details van het voorvoegsel" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Netwerkadres" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Netwerkmasker" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Wildcard-masker" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Adres van de uitzending" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "IP-bereik toevoegen" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Diepte-indicatoren verbergen" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Maximale diepte" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Maximale lengte" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Aggregaat toevoegen" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "VRF's importeren" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "VRF's exporteren" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "L2VPN's importeren" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "L2VPN's exporteren" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Een voorvoegsel toevoegen" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "VLAN toevoegen" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Routeherkenner" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Unieke IP-ruimte" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Fouten" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Inloggen" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Of" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Statische mediafout - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Statische mediafout" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Het volgende statische mediabestand kon niet worden geladen" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Controleer het volgende" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13491,7 +14262,7 @@ msgstr "" "recente upgrade. Hiermee wordt de meest recente iteratie van elk statisch " "bestand in het statische hoofdpad geïnstalleerd." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13503,7 +14274,7 @@ msgstr "" " href=\"%(docs_url)s\">de installatiedocumentatie voor verdere " "begeleiding." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13512,550 +14283,573 @@ msgstr "" "Het bestand %(filename)s bestaat in de statische hoofdmap en is" " leesbaar voor de HTTP-server." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Klik hier om te proberen NetBox opnieuw te " "laden." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Neem contact op" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Titel" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefoon" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Contactgroep" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Contactgroep toevoegen" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Rol van contactpersoon" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Een contact toevoegen" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Tenant toevoegen" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Tenant Groep" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Tenant Groep toevoegen" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Toegewezen machtigingen" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Toestemming" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Bekijken" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Beperkingen" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Toegewezen gebruikers" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Toegewezen middelen" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Virtuele CPU's" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Geheugen" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Schijfruimte" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Virtuele machine toevoegen" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Apparaat toewijzen" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Geselecteerde verwijderen" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Apparaat aan cluster toevoegen %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Selectie van het apparaat" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Apparaten toevoegen" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Cluster toevoegen" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Clustergroep" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Clustertype" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Virtuele schijf" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Hulpbronnen" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Virtuele schijf toevoegen" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE-beleid" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE-versie" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Vooraf gedeelde sleutel" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Geheim tonen" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Voorstellen" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "IKE-voorstel" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Authenticatiemethode" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Encryptie-algoritme" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Authenticatie-algoritme" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "DH-groep" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Een leven lang (seconden)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPsec-beleid" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS-groep" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPsec-profiel" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS-groep" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPsec-voorstel" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Een leven lang (kB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN-kenmerken" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Een beëindiging toevoegen" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Beëindiging toevoegen" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Inkapseling" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPsec-profiel" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Tunnel-ID" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Tunnel toevoegen" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Tunnelgroep" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Afsluiting van de tunnel" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Buiten IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Beëindigingen door collega's" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Cijfer" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Bijgevoegde interfaces" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Draadloos netwerk toevoegen" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Draadloze LAN-groep" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Draadloze LAN-groep toevoegen" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Eigenschappen van de link" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Afstand" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Contactgroep voor ouders (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Contactgroep voor ouders (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Contactgroep (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Contactgroep (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Contactpersoon (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Rol van contactpersoon (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Contactrol (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Contactgroep" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Parent tenant groep (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Parent tenant groep (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Tenant groep (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Tenant Groep (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Tenant Groep (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Beschrijving" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Toegewezen contactpersoon" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "contactgroep" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "contactgroepen" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "contactrol" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "contactrollen" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "noemen" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefoon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "verbinden" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "contact" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "neemt contact op" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "contactopdracht" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "contacttoewijzingen" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "" "Contactpersonen kunnen niet aan dit objecttype worden toegewezen ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "tenant groep" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "tenant groepen" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "De naam van de tenant moet per groep uniek zijn." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "De slug van de tentant moet per groep uniek zijn." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "tenant" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "tenants" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Titel van de contactpersoon" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Telefoonnummer contact opnemen" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "E-mailadres voor contact" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Contactadres" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Link contact opnemen" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Beschrijving van de contactpersoon" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Toestemming (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Meldingsgroep (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Voornaam" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Achternaam" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Status van het personeel" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Status van superuser" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "" "Als er geen sleutel wordt verstrekt, wordt er automatisch een gegenereerd." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Is personeel" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Is Superuser" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Kan bekijken" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Kan toevoegen" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Kan veranderen" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Kan verwijderen" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Gebruikersinterface" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14065,7 +14859,7 @@ msgstr "" "sleutel opneemt voordat dit formulier wordt verzonden, omdat het " "mogelijk niet meer toegankelijk is nadat het token is aangemaakt." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14075,33 +14869,33 @@ msgstr "" "Laat dit veld leeg zodat er geen beperkingen zijn. Voorbeeld: " "10.1.1.0/24, 192.168.10.16/32,2001:db 8:1: :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Wachtwoord bevestigen" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Voer ter verificatie hetzelfde wachtwoord in als voorheen." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Wachtwoorden komen niet overeen! Controleer uw invoer en probeer het " "opnieuw." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Aanvullende acties" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Acties die zijn toegekend in aanvulling op de hierboven genoemde" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objecten" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14112,80 +14906,80 @@ msgstr "" " Een lijst met meerdere objecten zal resulteren in een logische OR-" "bewerking." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Er moet minstens één actie worden geselecteerd." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Ongeldig filter voor {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "De lijst met acties die met deze toestemming zijn verleend" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "verplichtingen" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Querysetfilter dat overeenkomt met de toepasselijke objecten van het " "geselecteerde type (s)" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "toestemming" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "toestemmingen" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "gebruikersvoorkeuren" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "" "Sleutel '{path}'is een bladknooppunt; kan geen nieuwe sleutels toewijzen" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Sleutel '{path}'is een woordenboek; kan geen waarde toekennen die niet uit " "het woordenboek bestaat" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "vervalt" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "laatst gebruikt" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "sleutel" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "schrijven ingeschakeld" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "Bewerkingen aanmaken, bijwerken/verwijderen met deze sleutel toestaan" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "toegestane IP's" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14194,43 +14988,43 @@ msgstr "" "Laat dit veld leeg zodat er geen beperkingen zijn. Bijvoorbeeld: " "„10.1.1.0/24, 192.168.10.16/32, 2001:DB 8:1: :/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "blijk" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "tokens" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "groeperen" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "gebruiker" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Er bestaat al een gebruiker met deze gebruikersnaam." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Acties op maat" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Gerelateerd object niet gevonden met behulp van de opgegeven kenmerken: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Meerdere objecten komen overeen met de opgegeven kenmerken: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14239,42 +15033,42 @@ msgstr "" "Naar gerelateerde objecten moet worden verwezen met een numerieke ID of een " "woordenboek met attributen. Een niet-herkende waarde ontvangen: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Het gerelateerde object is niet gevonden met de opgegeven numerieke ID: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} heeft een sleutel gedefinieerd, maar CHOICES is geen lijst" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Gewicht moet een positief getal zijn" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Ongeldige waarde '{weight}'voor gewicht (moet een getal zijn)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Onbekende eenheid {unit}. Moet een van de volgende zijn: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "De lengte moet een positief getal zijn" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Ongeldige waarde '{length}'voor lengte (moet een getal zijn)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14283,15 +15077,15 @@ msgstr "" "Kan niet verwijderen {objects}. {count} afhankelijke " "objecten zijn gevonden: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Meer dan 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "RGB-kleur in hexadecimaal. Voorbeeld: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14300,7 +15094,7 @@ msgstr "" "%s(%r) is ongeldig. De parameter to_model voor CounterCacheField moet een " "tekenreeks zijn in het formaat 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14309,39 +15103,39 @@ msgstr "" "%s(%r) is ongeldig. De parameter to_field voor CounterCacheField moet een " "tekenreeks zijn in de indeling 'field'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Voer objectgegevens in CSV-, JSON- of YAML-formaat in." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV-scheidingsteken" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "Het teken dat CSV-velden afbakent. Alleen van toepassing op CSV-formaat." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "Formuliergegevens moeten leeg zijn bij het uploaden/selecteren van een " "bestand." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Onbekend gegevensformaat: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Kan het gegevensformaat niet detecteren. Specificeer alstublieft." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Ongeldig CSV-scheidingsteken" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14349,7 +15143,7 @@ msgstr "" "Ongeldige YAML-gegevens. De gegevens moeten de vorm hebben van meerdere " "documenten, of een enkel document dat een lijst met woordenboeken bevat." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14358,7 +15152,7 @@ msgstr "" "Ongeldige lijst ({value}). Moet numeriek zijn en reeksen moeten in oplopende" " volgorde staan." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14366,7 +15160,7 @@ msgstr "" "Geef een of meer numerieke reeksen op, gescheiden door komma's. Voorbeeld: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14374,17 +15168,18 @@ msgstr "" "Ongeldige reeksen ({value}). Moet een reeks gehele getallen in oplopende " "volgorde zijn." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Ongeldige waarde voor een meerkeuzeveld: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Object niet gevonden: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14393,20 +15188,20 @@ msgstr "" "„{value}„is geen unieke waarde voor dit veld; er zijn meerdere objecten " "gevonden" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "„{field_name}„is een ongeldige naam voor het accessorveld." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Het objecttype moet worden gespecificeerd als”.„" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Ongeldig objecttype" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14416,7 +15211,7 @@ msgstr "" " en typen binnen één bereik worden niet ondersteund (bijvoorbeeld: " "[leeftijd, ex] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14424,7 +15219,7 @@ msgstr "" "Specificeer een numeriek bereik om meerdere IP-adressen te creëren.
    Voorbeeld: 192.0.2. [1,5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" " Markdown syntaxis wordt ondersteund" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL-vriendelijke unieke afkorting" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "Voer contextgegevens in JSON formaat." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC-adres moet het EUI-48-formaat hebben" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Reguliere expressies gebruiken" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Numerieke ID van een bestaand object dat moet worden bijgewerkt (als er geen" " nieuw object wordt aangemaakt)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Koptekst niet herkend: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Beschikbare kolommen" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Geselecteerde kolommen" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14477,13 +15272,13 @@ msgstr "" "Dit object is gewijzigd sinds de weergave van het formulier. Raadpleeg het " "wijzigingslogboek van het object voor meer informatie." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Bereik”{value}„is ongeldig." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14492,68 +15287,68 @@ msgstr "" "Ongeldig bereik: eindwaarde ({end}) moet groter zijn dan de beginwaarde " "({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Dubbele of conflicterende kolomkop voor”{field}„" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Dubbele of conflicterende kolomkop voor”{header}„" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Rij {row}: Verwacht {count_expected} columns maar gevonden {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Onverwachte kolomkop”{field}„gevonden." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Kolom”{field}„is geen gerelateerd object; kan geen punten gebruiken" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "Ongeldig gerelateerd objectkenmerk voor kolom”{field}„: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Vereiste kolomkop”{header}„niet gevonden." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Ontbrekende vereiste waarde voor dynamische queryparameter: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Ontbrekende vereiste waarde voor statische queryparameter: '{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Het wachtwoord moet minstens één cijfer bevatten." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Het wachtwoord moet minstens één hoofdletter bevatten." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Het wachtwoord moet minstens één kleine letter bevatten." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14561,7 +15356,7 @@ msgstr "" "Je wachtwoord moet minstens één cijfer, één hoofdletter en één kleine letter" " bevatten." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14570,127 +15365,127 @@ msgstr "" "Ongeldige toestemmingsnaam: {name}. Moet in het formaat zijn " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Onbekende app_label/model_name voor {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Ongeldig IP-adres ingesteld voor {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "" "Een kolom met de naam {name} is al gedefinieerd voor de tabel {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Niet gedefinieerd" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Bladwijzer uitzetten" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Bladwijzer" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Kloon" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Huidige weergave" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Alle gegevens" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Exportsjabloon toevoegen" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importeren" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Afmelden" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Abonneer" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Naar klembord kopiëren" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Dit veld is verplicht" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Null instellen" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Alles wissen" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Tabelconfiguratie" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Omhoog gaan" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Naar beneden gaan" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Zoek..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Zoek in NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Selector openen" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Schrijf" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "De test moet csv_update_data definiëren." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} is geen geldige reguliere expressie." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} moet get_required_permission () implementeren" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} moet get_required_permission () implementeren" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14699,61 +15494,63 @@ msgstr "" "{class_name} heeft geen queryset gedefinieerd. ObjectPermissionRequiredMixIn" " mag alleen worden gebruikt op views die een basisqueryset definiëren" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Oudergroep (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Oudergroep (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Clustertype (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Cluster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU's" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Geheugen (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Soort cluster" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Toegewezen clustergroep" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Toegewezen cluster" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Toegewezen apparaat binnen cluster" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Serienummer" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14762,51 +15559,51 @@ msgstr "" "{device} behoort tot een andere site ({device_site}) dan het cluster " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Optioneel kan deze VM worden vastgezet op een specifiek hostapparaat binnen " "het cluster" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Site/cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "De schijfgrootte wordt beheerd via de koppeling van virtuele schijven." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Schijf" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "clustertype" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "clustertypen" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "clustergroep" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "clustergroepen" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "cluster" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "clusters" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14815,32 +15612,32 @@ msgstr "" "{count} apparaten zijn toegewezen als hosts voor dit cluster, maar bevinden " "zich niet op de locatie {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "geheugen (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "schijf (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "De naam van de virtuele machine moet per cluster uniek zijn." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "virtuele machine" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "virtuele machines" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" "Een virtuele machine moet worden toegewezen aan een site en/of cluster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." @@ -14848,11 +15645,11 @@ msgstr "" "Het geselecteerde cluster ({cluster}) is niet toegewezen aan deze site " "({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Moet een cluster specificeren bij het toewijzen van een hostapparaat." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14860,7 +15657,7 @@ msgstr "" "Het geselecteerde apparaat ({device}) is niet toegewezen aan dit cluster " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14869,17 +15666,17 @@ msgstr "" "De opgegeven schijfgrootte ({size}) moet overeenkomen met de totale grootte " "van toegewezen virtuele schijven ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Moet een IPv zijn{family} adres. ({ip} is een IPv{version} adres.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Het opgegeven IP-adres ({ip}) is niet toegewezen aan deze VM." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14888,7 +15685,7 @@ msgstr "" "De geselecteerde ouderinterface ({parent}) behoort tot een andere virtuele " "machine ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14897,7 +15694,7 @@ msgstr "" "De geselecteerde bridge-interface ({bridge}) behoort tot een andere virtuele" " machine ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14906,395 +15703,418 @@ msgstr "" "Het VLAN zonder label ({untagged_vlan}) moet tot dezelfde site behoren als " "de bovenliggende virtuele machine van de interface, of moet globaal zijn." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "grootte (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "virtuele schijf" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "virtuele schijven" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Toegevoegd {count} apparaten om te clusteren {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Verwijderd {count} apparaten uit het cluster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Vervoer" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-in-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Spoke" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agressive" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Main" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Vooraf gedeelde sleutels" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certificaten" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA-handtekeningen" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA-handtekeningen" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "groep {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernet, privé-LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Virtueel privé-LAN via Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernet Private Tree" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Virtuele privéstructuur van Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Tunnelgroep (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Tunnelgroep (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPsec-profiel (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPsec-profiel (naam)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunnel (naam)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Buiten IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE-beleid (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE-beleid (naam)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPsec-beleid (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPsec-beleid (naam)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "VM-interface (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (naam)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Tunnelgroep" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Een leven lang" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Vooraf gedeelde sleutel" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE-beleid" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPsec-beleid" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Inkapseling van tunnels" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Operationele rol" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Ouderapparaat met toegewezen interface" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Bovenliggende VM van de toegewezen interface" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interface voor apparaat of virtuele machine" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE-voorstel (en)" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Diffie-Hellman-groep voor Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPsec-voorstel (en)" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPsec-protocol" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN-type" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Ouderapparaat (voor interface)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Virtuele bovenliggende machine (voor interface)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Toegewezen interface (apparaat of VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Kan apparaat- en VM-interface-afsluitingen niet tegelijkertijd importeren." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Elke beëindiging moet een interface of een VLAN specificeren." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Kan niet zowel een interface als een VLAN toewijzen." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE-versie" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Voorstel" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Toegewezen objecttype" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Tunnelinterface" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Eerste beëindiging" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Tweede beëindiging" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Deze parameter is vereist voor het definiëren van een beëindiging." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Beleid" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Een beëindiging moet een interface of VLAN specificeren." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Een beëindiging kan slechts één afsluitend object hebben (een interface of " "VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "coderingsalgoritme" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "authenticatie-algoritme" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Diffie-Hellman groeps-ID" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Levensduur van de beveiligingsvereniging (in seconden)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "IKE-voorstel" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKE-voorstellen" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "versie" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "voorstellen" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "vooraf gedeelde sleutel" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE-beleid" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Modus is vereist voor de geselecteerde IKE-versie" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "De modus kan niet worden gebruikt voor de geselecteerde IKE-versie" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "encryptie" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "authenticatie" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Levensduur van de beveiligingsvereniging (seconden)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Levensduur van de veiligheidsorganisatie (in kilobytes)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPsec-voorstel" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPsec-voorstellen" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" "Het algoritme voor versleuteling en/of authenticatie moet worden " "gedefinieerd" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPsec-beleid" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPsec-profielen" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN-beëindiging" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN-beëindigingen" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN Beëindiging is al toegewezen ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15303,187 +16123,195 @@ msgstr "" "{l2vpn_type} L2VPN's kunnen niet meer dan twee beëindigingen hebben; " "gevonden {terminations_count} reeds gedefinieerd." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "tunnelgroep" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "tunnelgroepen" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "inkapseling" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "tunnel-ID" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunnels" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Een object mag slechts in één tunnel tegelijk worden afgesloten." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "beëindiging van de tunnel" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "tunnelafsluitingen" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} is al bevestigd aan een tunnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Authenticatiemethode" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Encryptie-algoritme" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Authenticatie-algoritme" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Een leven lang" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Vooraf gedeelde sleutel" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Een leven lang (seconden)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA-levensduur (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Voorwerp: ouder" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Site van het object" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Toegangspunt" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Station" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Open" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Enterprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Authenticatiecijfer" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Afstandseenheid" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Overbrugd VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interface A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interface B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Kant B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "authenticatiecijfer" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "draadloze LAN-groep" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "draadloze LAN-groepen" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "draadloos LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interface A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interface B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "afstand" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "afstandseenheid" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "draadloze link" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "draadloze verbindingen" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "Moet een eenheid specificeren bij het instellen van een draadloze afstand" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} is geen draadloze interface." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Ongeldige kanaalwaarde: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Ongeldig kanaalkenmerk: {name}" diff --git a/netbox/translations/pl/LC_MESSAGES/django.mo b/netbox/translations/pl/LC_MESSAGES/django.mo index a9c8d9fe73e53d9a1eb01acda722e23d908aad69..e0e9273fad9a9f24c369aeddbf96cabc25093979 100644 GIT binary patch delta 65964 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%0ApP&QnL>qjArtpur|2O7Re^olBWzaoS18sj6 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 diff --git a/netbox/translations/pl/LC_MESSAGES/django.po b/netbox/translations/pl/LC_MESSAGES/django.po index 07567c147..92dde3ca4 100644 --- a/netbox/translations/pl/LC_MESSAGES/django.po +++ b/netbox/translations/pl/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Grzegorz Szymaszek, 2024\n" "Language-Team: Polish (https://app.transifex.com/netbox-community/teams/178115/pl/)\n" @@ -24,3093 +24,3421 @@ msgstr "" "Language: pl\n" "Plural-Forms: nplurals=4; plural=(n==1 ? 0 : (n%10>=2 && n%10<=4) && (n%100<12 || n%100>14) ? 1 : n!=1 && (n%10>=0 && n%10<=1) || (n%10>=5 && n%10<=9) || (n%100>=12 && n%100<=14) ? 2 : 3);\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Klucz" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Zapis włączony" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Utworzony" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Wygasa" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Ostatnio używane" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "Dozwolone adresy IP" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Zaloguj się jako {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Wylogowałeś się." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Twoje preferencje zostały zaktualizowane." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "Poświadczenia użytkownika uwierzytelnionego LDAP nie mogą być zmieniane w " "NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Twoje hasło zostało pomyślnie zmienione." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Planowane" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Zaopatrzenie" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Aktywny" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Nieaktywne" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Odstąpienie od zaopatrzenia" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Wycofane ze służby" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Pierwszorzędny" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Drugorzędny" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Trzeciorzędny" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Nieaktywny" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Region (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Region (identyfikator)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Grupa witryn (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Grupa terenów (identyfikator)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Teren" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Teren (identyfikator)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Dostawca (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Dostawca (identyfikator)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Konto dostawcy (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Konto dostawcy (konto)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Sieć dostawcy (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Typ obwodu (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Typ obwodu (identyfikator)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Teren (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Wypowiedzenie A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Szukaj" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Obwód" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Sieć dostawcy (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Obwód (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Obwód (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Grupa obwodów (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Grupa obwodów (identyfikator)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Opis" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Dostawca" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "Identyfikator usługi" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Kolor" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Typ" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Konto dostawcy" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Status" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Najemca" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Data instalacji" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Data wypowiedzenia" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Szybkość zatwierdzania (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Parametry serwisowe" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Najem" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Sieć dostawców" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Prędkość portu (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Prędkość od klienta do serwera (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Oznacz podłączony" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Zakończenie obwodu" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Szczegóły wypowiedzenia" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Priorytet" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Przydzielony dostawca" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Przydzielone konto dostawcy" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Rodzaj obwodu" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Status operacyjny" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Przydzielony najemca" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Wypowiedzenie" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Sieć dostawców" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Lokalizacja" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Łączność" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Region" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Grupa terenów" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Atrybuty" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Konto" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Strona terminowa" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Zlecenie" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Grupa" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Grupa obwodów" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "kolor" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "typ obwodu" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "typy obwodów" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ID obwodu" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Unikalny identyfikator obwodu" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "status" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "zainstalowany" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "kończy się" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "szybkość zatwierdzania (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Stopa zobowiązań" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "obwód" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "obwodów" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "grupa obwodów" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "grupy obwodów" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "priorytet" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Przypisanie grupy obwodów" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Przydziały grup obwodowych" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "wypowiedzenie" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "Prędkość portu (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Prędkość obwodu fizycznego" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "prędkość przed strumieniem (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Prędkość poprzedzająca, jeśli różni się od prędkości portu" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "identyfikator połączenia krzyżowego" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "Identyfikator lokalnego połączenia krzyżowego" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "panel krosowy/port (y)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "Identyfikator panelu krosowego i numer (y) portu" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "opis" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "zakończenie obwodu" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "zakończenia obwodu" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "Zakończenie obwodu musi być podłączone do witryny lub sieci dostawcy." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Zakończenie obwodu nie może połączyć się zarówno z witryną, jak i siecią " "dostawcy." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "nazwa" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Pełna nazwa dostawcy" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "identyfikator" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "dostawca" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "dostawcy" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "Identyfikator konta" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "konto dostawcy" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "konta dostawcy" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "Identyfikator usługi" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "sieć dostawców" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "sieci dostawców" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Nazwa" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Obwody" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "Identyfikator obwodu" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Strona A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Strona Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Współczynnik zatwierdzania" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Komentarze" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Zadania" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Konta" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Liczba kont" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Liczba ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Nie zdefiniowano zakończeń dla obwodu {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Wymienione zakończenia na obwód {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Ten użytkownik nie ma uprawnień do synchronizacji tego źródła danych." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Nowość" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "W kolejce" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Synchronizacja" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Zakończone" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Nie powiodło się" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Skrypty" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Raporty" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Oczekiwane" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Zaplanowane" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Uruchomione" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Zakończone z błędem" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Zaktualizowano" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Usunięte" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Zakończone" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Rozpoczęte" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Odroczone" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Zatrzymane" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Anulowane" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Lokalne" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Nazwa użytkownika" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Tylko używane do klonowania poprzez HTTP(S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Hasło" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "gałąź" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Pobieranie zdalnych danych nie powiodło się ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "Identyfikator klucza dostępu AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Tajny klucz dostępu AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Utworzony obiekt" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Obiekt zaktualizowany" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Obiekt usunięty" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Praca rozpoczęta" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Praca zakończona" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Zadanie nie powiodło się" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Błąd pracy" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Źródło danych (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Źródło danych (nazwa)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Użytkownik (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Nazwa użytkownika" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Włączone" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parametry" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ignoruj reguły" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Źródło danych" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Plik" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Źródło danych" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Stworzenie" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Typ obiektu" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Utworzone po" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Utworzone przed" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Zaplanowane po" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Zaplanowane przed" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Rozpoczęte po" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Rozpoczęte przed" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Zakończone po" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Zakończone przed" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Użytkownik" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Czas" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Po" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Wcześniej" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Działanie" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Źródło" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Parametry zaplecza" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Przesyłanie plików" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "Nie można przesłać pliku i zsynchronizować z istniejącym plikiem" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "Musisz przesłać plik lub wybrać plik danych do synchronizacji" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Elewacje szaf" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Moc" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Bezpieczeństwo" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Banery" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Paginacja" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Walidacja" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Preferencje użytkownika" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Różne" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Zmiana konfiguracji" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "" "Ten parametr został zdefiniowany statycznie i nie można go modyfikować." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Bieżąca wartość: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (domyślnie)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "czas" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "nazwa użytkownika" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "Identyfikator żądania" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "działanie" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "dane wstępnej zmiany" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "dane po zmianie" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "zmiana obiektu" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "zmiany obiektu" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "Rejestracja zmian nie jest obsługiwana dla tego typu obiektu ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "utworzony" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "komentarz" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "dane konfiguracyjne" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "wersja konfiguracji" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "poprawki konfiguracji" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Domyślna konfiguracja" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Bieżąca konfiguracja" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Wersja konfiguracji #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "typ" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "włączone" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignoruj zasady" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Wzory (jeden na wiersz) pasujące do plików do zignorowania podczas " "synchronizacji" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parametry" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "ostatnio zsynchronizowane" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "źródło danych" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "źródła danych" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Nieznany typ zaplecza: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Nie można zainicjować synchronizacji; synchronizacja jest już w toku." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "" "Wystąpił błąd podczas inicjowania zaplecza. Należy zainstalować zależność: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "Ostatnia aktualizacja" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "ścieżka" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Ścieżka pliku względem katalogu głównego źródła danych" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "rozmiar" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "haszysz" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Długość musi wynosić 64 znaki szesnastkowe." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Skrót danych pliku SHA256" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "plik danych" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "pliki danych" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "zapis automatycznej synchronizacji" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "automatyczna synchronizacja rekordów" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "root pliku" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "ścieżka pliku" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Ścieżka pliku względem wyznaczonej ścieżki głównej" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "plik zarządzany" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "zarządzane pliki" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "planowy" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "interwał" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Odstęp nawrotów (w minutach)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "rozpoczął się" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "ukończony" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "dane" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "błąd" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID pracy" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "pracy" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "prace" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Zadania nie mogą być przypisane do tego typu obiektu ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "Nieprawidłowy status zakończenia pracy. Wybory to: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue () nie można wywołać z wartościami zarówno dla schedule_at, jak i " "natychmiastowego." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Usuwanie jest zapobiegane przez regułę ochrony: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Pełne imię i nazwisko" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Przedmiot" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "Identyfikator żądania" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Jest aktywny" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Ścieżka" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Ostatnia aktualizacja" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "IDENTYFIKATOR" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Przedział" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Wersja" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Ostatnia aktualizacja" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimalna wersja NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maksymalna wersja NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Nie znaleziono danych wtyczki" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Autor" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Zainstalowany" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certyfikowany" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Opublikowano" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Zainstalowana wersja" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Najnowsza wersja" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Najstarsze zadanie" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Pracownicy" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Gospodarz" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Port" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Harmonogram PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Nie znaleziono kolejek" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "W kolejce" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Zakończony" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Możliwość wywołania" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Nie znaleziono zadań" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Stan" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Narodziny" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Nie znaleziono pracowników" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Zadanie w kolejce #{id} zsynchronizować {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Przywrócona wersja konfiguracji #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Praca {job_id} nie znaleziono" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Praca {id} został usunięty." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Błąd usuwania zadania {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Praca {id} nie znaleziono." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Praca {id} został ponownie ustawiony w kolejce." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Praca {id} został ustawiony w kolejce." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Praca {id} został zatrzymany." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Nie udało się zatrzymać zadania {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Nie można załadować katalogu wtyczek" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Wtyczka {name} nie znaleziono" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Pozycja (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Identyfikator obiektu" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Inscenizacja" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Wycofanie z eksploatacji" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Emerytowany" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Rama 2-słupkowa" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Rama 4-słupkowa" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Szafka 4-słupkowa" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Rama naścienna" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Rama naścienna (pionowa)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Szafka naścienna" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Szafka naścienna (pionowa)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} cale" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Zastrzeżone" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Dostępny" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Przestarzałe" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Milimetrów" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Cale" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Przód do tyłu" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Tył do przodu" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Rodzic" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Dziecko" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Przód" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Tył" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Inscenizowane" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inwentaryzacja" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Od lewej do prawej" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Od prawej do lewej" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Z boku do tyłu" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Tył na bok" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Od dołu do góry" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Od góry do dołu" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Pasywny" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Mieszane" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (bez blokowania)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (Blokowanie)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Styl kalifornijski" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Międzynarodowy/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Własnościowy" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Pozostałe" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Międzynarodowy" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fizyczne" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Wirtualny" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Bezprzewodowy" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfejsy wirtualne" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Most" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Grupa agregacji linków (LGD)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (stały)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modułowy)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (płaszczyzna tylna)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Komórkowy" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seryjny" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "koncentryczny" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Układanie" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Połowa" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Pełny" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Automatyczny" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Dostęp" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Oznaczone" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Oznaczone (Wszystkie)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Standard IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Pasywny 24V (2 pary)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Pasywny 24V (4-parowy)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Pasywny 48V (2 pary)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Pasywny 48V (4 pary)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Miedź" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Światłowód" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Włókno" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Połączony" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometry" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Mierniki" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centymetry" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Mile" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Stopy" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogramy" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramy" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "funty" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Uncja" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Nadmiarowy" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Jednofazowy" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Trójfazowy" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Nieprawidłowy format adresu MAC: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Nieprawidłowy format WWN: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Region macierzysty (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Region macierzysty (identyfikator)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Nadrzędna grupa witryn (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Nadrzędna grupa terenów (identyfikator)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Grupa (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Grupa (identyfikator)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "JAKO (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Lokalizacja nadrzędna (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Lokalizacja nadrzędna (identyfikator)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Lokalizacja (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Lokalizacja (identyfikator)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Producent (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Producent (identyfikator)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Typ szafy (identyfikator)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Typ szafy (numer identyfikacyjny)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rola (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rola (identyfikator)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Szafa (numer identyfikacyjny)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Użytkownik (nazwa)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Domyślna platforma (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Domyślna platforma (identyfikator)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Posiada obraz z przodu" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Posiada tylny obraz" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Posiada porty konsoli" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Posiada porty serwera konsoli" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Posiada porty zasilania" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Posiada gniazdka elektryczne" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Posiada interfejsy" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Posiada porty przelotowe" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Posiada kieszenie modułowe" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Posiada zatoki na urządzenia" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Posiada pozycje inwentaryzacyjne" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Typ urządzenia (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Typ modułu (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Port zasilania (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Nadrzędny element zapasów (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Szablon konfiguracji (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Typ urządzenia (identyfikator)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Urządzenie nadrzędne (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Platforma (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Platforma (identyfikator)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Nazwa terenu (identyfikator)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Zatoka macierzysta (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Klaster maszyn wirtualnych (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Grupa klastra (identyfikator)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Grupa klastra (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Model urządzenia (identyfikator)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Jest pełna głębokość" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "Adres MAC" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Posiada podstawowy adres IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Posiada adres IP poza pasmem" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Wirtualne podwozie (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Jest członkiem wirtualnego podwozia" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB IP (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Posiada kontekst urządzenia wirtualnego" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Model urządzenia" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interfejs (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Typ modułu (model)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Osłona modułu (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Urządzenie (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Szafa (nazwa)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Urządzenie (nazwa)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Typ urządzenia (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Rola urządzenia (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Rola urządzenia (identyfikator)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Wirtualne podwozie (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Wirtualne podwozie" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Moduł (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kabel (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Przypisana sieć VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Przypisany VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Interfejsy wirtualnej obudowy dla urządzenia" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Interfejsy wirtualnej obudowy dla urządzenia (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Rodzaj interfejsu" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Interfejs nadrzędny (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Interfejs mostkowy (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Interfejs LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Kontekst urządzenia wirtualnego" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Kontekst urządzenia wirtualnego (identyfikator)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Bezprzewodowa sieć LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Połączenie bezprzewodowe" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Osłona modułu nadrzędnego (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Zainstalowany moduł (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Zainstalowane urządzenie (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Zainstalowane urządzenie (nazwa)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Mistrz (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Mistrz (imię)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Najemca (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Najemca (identyfikator)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Nieskończony" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Panel zasilania (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Tagi" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Pozycja" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3118,842 +3446,922 @@ msgstr "" "Obsługiwane są zakresy alfanumeryczne. (Musi odpowiadać liczbie tworzonych " "nazw.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Nazwa kontaktu" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Telefon kontaktowy" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Kontakt E-mail" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Strefa czasowa" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Producent" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Współczynnik kształtu" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Szerokość" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Wysokość (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Jednostki malejące" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Szerokość zewnętrzna" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Głębokość zewnętrzna" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Jednostka zewnętrzna" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Głębokość montażu" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Waga" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maksymalna waga" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Jednostka wagowa" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Typ szafy" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Wymiary zewnętrzne" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Wymiary" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numeracja" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rola" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Typ szafy" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Numer seryjny" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Etykieta zasobu" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Przepływ powietrza" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Szafa" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Sprzęt" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Domyślna platforma" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Numer części" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Wysokość U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Wyklucz z wykorzystania" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Typ urządzenia" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Typ modułu" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Podwozie" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Rola maszyny wirtualnej" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Szablon konfiguracji" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Typ urządzenia" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Rola urządzenia" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Platforma" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Klaster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Urządzenie" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Konfiguracja" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Wirtualizacja" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Rodzaj modułu" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Etykieta" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Długość" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Jednostka długości" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Domena" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Panel zasilania" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Dostawa" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Faza" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Napięcie" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Natężenie prądu" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maksymalne wykorzystanie" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maksymalne losowanie" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maksymalny pobór mocy (waty)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Przydzielone losowanie" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Przydzielony pobór mocy (waty)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Port zasilania" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Noga do karmienia" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Tylko zarządzanie" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Tryb PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Typ PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Rola sieci bezprzewodowej" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Moduł" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "OPÓŹNIENIE" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Konteksty urządzeń wirtualnych" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Prędkość" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Tryb" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Grupa VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Nieoznaczone sieci VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Oznaczone sieci VLAN" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Grupa sieci bezprzewodowej sieci LAN" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Bezprzewodowe sieci LAN" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adresowanie" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operacja" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Powiązane interfejsy" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Przełączanie 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Tryb interfejsu musi być określony, aby przypisać sieci VLAN" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Interfejs dostępu nie może mieć przypisanych oznakowanych sieci VLAN." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Nazwa regionu macierzystego" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Nazwa nadrzędnej grupy witryn" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Przypisany region" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Przydzielona grupa" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "dostępne opcje" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Przydzielona witryna" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Lokalizacja nadrzędna" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Lokalizacja nie została znaleziona." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Producent tego typu szaf" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Najniższy numer pozycji w szafie" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Szerokość szyny do szyny (w calach)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Jednostka do wymiarów zewnętrznych" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Jednostka masy w szafach" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Nazwa przydzielonego najemcy" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Nazwa przypisanej roli" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Kierunek przepływu powietrza" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Witryna nadrzędna" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Lokalizacja szafy (jeśli określona)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Jednostki" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Lista poszczególnych numerów jednostek oddzielona przecinkami" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Producent, który produkuje ten typ urządzenia" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Domyślna platforma dla urządzeń tego typu (opcjonalnie)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Waga urządzenia" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Jednostka do wagi urządzenia" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Waga modułu" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Jednostka do ciężaru modułu" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Ogranicz przypisania platformy do tego producenta" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Przypisana rola" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Producent typu urządzenia" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Model typu urządzenia" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Przydzielona platforma" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Wirtualne podwozie" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Klaster wirtualizacji" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Przypisana lokalizacja (jeśli istnieje)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Przypisana szafa (jeśli określona)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Twarz" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Powierzchnia montażu w szafie" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Urządzenie nadrzędne (dla urządzeń podrzędnych)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Osłona urządzenia" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Osłona urządzenia, w której to urządzenie jest zainstalowane (dla urządzeń " "podrzędnych)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Urządzenie, w którym zainstalowany jest ten moduł" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Wnęka modułu" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Wnęka modułu, w której ten moduł jest zainstalowany" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Rodzaj modułu" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Replikacja komponentów" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3961,264 +4369,271 @@ msgstr "" "Automatyczne wypełnianie komponentów powiązanych z tym typem modułu " "(domyślnie włączone)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Zastosuj komponenty" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Zastosuj już istniejące komponenty" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Typ portu" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Prędkość portu w bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Rodzaj wylotu" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Lokalny port zasilania zasilający to gniazdko" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Faza elektryczna (dla obwodów trójfazowych)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interfejs nadrzędny" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Interfejs mostkowy" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Opóźnienie" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Nadrzędny interfejs LAG" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdc" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Nazwy VDC oddzielone przecinkami, otoczone podwójnymi cudzysłowami. " "Przykład:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Medium fizyczne" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Dwupoziomowy" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Tryb PoE" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Typ PoE" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Tryb pracy IEEE 802.1Q (dla interfejsów L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Przypisany VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rola Rf" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Rola bezprzewodowa (AP/stacja)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} nie jest przypisany do urządzenia {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Tylny port" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Odpowiedni tylny port" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Klasyfikacja medium fizycznego" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Zainstalowane urządzenie" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Urządzenie dziecięce zainstalowane w tej wnęce" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Nie znaleziono urządzenia dziecięcego." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Nadrzędny element zapasów" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Typ komponentu" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Typ komponentu" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Nazwa firmy" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Nazwa komponentu" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Nie znaleziono komponentu: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Urządzenie boczne A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Nazwa urządzenia" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Typ strony A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Typ zakończenia" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Nazwa strony A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Nazwa zakończenia" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Urządzenie boczne B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Strona typu B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Nazwa strony B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Status połączenia" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Bok {side_upper}: {device} {termination_object} jest już połączony" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} Nie znaleziono zakończenia bocznego: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Mistrzu" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Urządzenie główne" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Nazwa witryny nadrzędnej" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Panel zasilania przed strumieniem" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Podstawowy lub nadmiarowy" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Rodzaj zasilania (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Pojedynczy lub trójfazowy" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Podstawowy IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Adres IPv4 z maską, np. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Podstawowy IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Adres IPv6 z prefiksem, np. 2001:db8::1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4227,7 +4642,7 @@ msgstr "" "Oznaczone sieci VLAN ({vlans}) muszą należeć do tej samej witryny co " "urządzenie nadrzędne/maszyna wirtualna interfejsu lub muszą być globalne" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4235,7 +4650,7 @@ msgstr "" "Nie można zainstalować modułu z wartościami zastępczymi w kieszeni modułu " "bez zdefiniowanej pozycji." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4244,187 +4659,198 @@ msgstr "" "Nie można zainstalować modułu z wartościami zastępczymi w drzewie laurowym " "modułu {level} na drzewie, ale {tokens} podane symbole zastępcze." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Nie można adoptować {model} {name} ponieważ już należy do modułu" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "A {model} o nazwie {name} już istnieje" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Panel zasilania" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Zasilanie zasilania" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Bok" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Status urządzenia" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Region macierzysty" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Grupa nadrzędna" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Obiekty" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Typ szafy" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Funkcja" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Obrazy" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Komponenty" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Rola urządzenia podrzędnego" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Model" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Posiada adres IP OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Wirtualny element podwozia" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Posiada konteksty urządzeń wirtualnych" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Grupa klastra" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Okablowany" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Zajęty" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Połączenie" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Uprzejmy" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Tylko MGMT" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Kanał bezprzewodowy" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Częstotliwość kanału (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Szerokość kanału (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Moc transmisji (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kabel" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Odkryte" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Wirtualny element podwozia istnieje już na pozycji {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Dane kontaktowe" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Rola szafy" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Identyfikator" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Wybierz predefiniowany typ szafy lub ustaw parametry fizyczne poniżej." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Kontrola zapasów" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4432,145 +4858,172 @@ msgstr "" "Lista numerycznych identyfikatorów jednostek oddzielonych przecinkami. " "Zakres można określić za pomocą myślnika." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Rezerwacje" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Rola urządzenia" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Jednostka o najniższej liczbie zajmowana przez urządzenie" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "" "Pozycja w wirtualnej obudowie tego urządzenia jest identyfikowana przez" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Priorytet urządzenia w wirtualnej obudowie" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Automatyczne wypełnianie komponentów powiązanych z tym typem modułu" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Charakterystyka" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Szablon portu konsoli" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Szablon portu serwera konsoli" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Szablon portu przedniego" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Szablon interfejsu" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Szablon gniazdka elektrycznego" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Szablon portu zasilania" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Szablon tylnego portu" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interfejs" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Port konsoli" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Port serwera konsoli" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Port przedni" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Tylny port" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Port zasilania" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Gniazdo zasilania" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Przypisywanie komponentów" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "InventoryItem można przypisać tylko do pojedynczego komponentu." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Interfejs LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtruj sieci VLAN dostępne do przypisania według grup." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Urządzenie dziecięce" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4578,32 +5031,35 @@ msgstr "" "Urządzenia podrzędne muszą być najpierw utworzone i przypisane do terenu " "i szafy urządzenia nadrzędnego." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Port konsoli" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Port serwera konsoli" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Port przedni" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Gniazdo zasilania" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Przedmiot zapasów" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Rola pozycji zapasów" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4611,7 +5067,7 @@ msgstr "" "Obsługiwane są zakresy alfanumeryczne. (Muszą odpowiadać liczbie tworzonych " "obiektów.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4620,18 +5076,19 @@ msgstr "" "Podany wzór określa {value_count} wartości, ale {pattern_count} są " "oczekiwane." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Tylne porty" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Wybierz jedno przypisanie portu tylnego dla każdego tworzonego portu " "przedniego." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4640,16 +5097,7 @@ msgstr "" "Liczba szablonów portów przednich do utworzenia ({frontport_count}) musi " "odpowiadać wybranej liczbie pozycji tylnych portów ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Sznurek {module} zostanie zastąpiony pozycją przypisanego " -"modułu, jeśli istnieje." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4658,17 +5106,18 @@ msgstr "" "Liczba portów przednich do utworzenia ({frontport_count}) musi odpowiadać " "wybranej liczbie pozycji tylnych portów ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Członkowie" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Pozycja początkowa" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4676,66 +5125,68 @@ msgstr "" "Położenie pierwszego urządzenia członkowskiego. Zwiększa się o jeden dla " "każdego dodatkowego członka." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Pozycja musi być określona dla pierwszego członka VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "marka" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "długość" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "jednostka długości" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "kabel" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "linki" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Należy określić jednostkę podczas ustawiania długości kabla" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Musi zdefiniować zakończenia A i B podczas tworzenia nowego kabla." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Nie można podłączyć różnych typów zakończeń do tego samego końca kabla." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Niekompatybilne typy zakończeń: {type_a} a {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Zakończenia A i B nie mogą łączyć się z tym samym obiektem." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "zakończyć" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "zakończenie kabla" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "zakończenia kabli" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4744,37 +5195,37 @@ msgstr "" "Znaleziono duplikat zakończenia {app_label}.{model} {termination_id}: kabel " "{cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kable nie mogą być zakończone {type_display} interfejsy" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Zakończenia obwodów podłączone do sieci dostawcy nie mogą być okablowane." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "jest aktywny" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "jest kompletny" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "jest podzielony" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "ścieżka kabla" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "ścieżki kablowe" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4783,17 +5234,17 @@ msgstr "" "{module} jest akceptowany jako substytucja położenia wnęki modułu po " "dołączeniu do typu modułu." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Etykieta fizyczna" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Szablony komponentów nie mogą być przenoszone do innego typu urządzenia." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4801,146 +5252,146 @@ msgstr "" "Szablonu komponentu nie można skojarzyć zarówno z typem urządzenia, jak i " "typem modułu." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" "Szablon komponentu musi być skojarzony z typem urządzenia lub typem modułu." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "szablon portu konsoli" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "szablony portów konsoli" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "szablon portu serwera konsoli" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "szablony portów serwera konsoli" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maksymalne losowanie" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "przydzielone losowanie" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "szablon portu zasilania" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "szablony portów zasilania" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Przydzielone losowanie nie może przekroczyć maksymalnego losowania " "({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "noga karmiąca" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Faza (dla zasilania trójfazowego)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "szablon gniazdka elektrycznego" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "szablony gniazdek elektrycznych" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Nadrzędny port zasilania ({power_port}) musi należeć do tego samego typu " "urządzenia" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Nadrzędny port zasilania ({power_port}) musi należeć do tego samego typu " "modułu" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "Tylko zarządzanie" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "interfejs mostka" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "rola bezprzewodowa" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "szablon interfejsu" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "szablony interfejsu" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Interfejs nie może być połączony z samym sobą." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Interfejs mostka ({bridge}) musi należeć do tego samego typu urządzenia" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Interfejs mostka ({bridge}) musi należeć do tego samego typu modułu" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "pozycja tylnego portu" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "szablon portu przedniego" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "szablony portów przednich" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Tylny port ({name}) musi należeć do tego samego typu urządzenia" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4949,48 +5400,48 @@ msgstr "" "Nieprawidłowa pozycja tylnego portu ({position}); tylny port {name} ma tylko" " {count} położenia" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "położenia" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "szablon tylnego portu" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "szablony tylnych portów" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "położenie" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Identyfikator, do którego należy odwołać się podczas zmiany nazwy " "zainstalowanych komponentów" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "szablon modułu wnęki" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "szablony modułów" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "szablon kieszeni urządzenia" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "szablony kieszeni urządzeń" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -4999,202 +5450,207 @@ msgstr "" "Rola podurządzenia typu urządzenia ({device_type}) musi być ustawiony na " "„rodzic”, aby zezwolić na gniazda urządzeń." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID części" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identyfikator części przypisany przez producenta" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "szablon pozycji inwentaryzacji" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "szablony pozycji inwentaryzacji" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Komponentów nie można przenieść na inne urządzenie." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "koniec kabla" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "znak połączony" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Traktuj tak, jakby kabel był podłączony" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Należy określić koniec kabla (A lub B) podczas mocowania kabla." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Końcówka kabla nie może być ustawiona bez kabla." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Nie można oznaczyć jako podłączonego za pomocą podłączonego kabla." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} modele muszą zadeklarować właściwość parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Typ portu fizycznego" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "prędkość" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Prędkość portu w bitach na sekundę" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "port konsoli" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "porty konsoli" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "port serwera konsoli" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "porty serwera konsoli" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "port zasilania" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "porty zasilania" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "gniazdo zasilania" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "gniazdka elektryczne" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Nadrzędny port zasilania ({power_port}) musi należeć do tego samego " "urządzenia" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "tryb" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Strategia tagowania IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "interfejs macierzysty" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "macierzysta LGD" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Ten interfejs jest używany tylko do zarządzania poza pasmem" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "Prędkość (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "dupleks" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-bitowa nazwa światowa" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "kanał bezprzewodowy" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "częstotliwość kanału (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Wypełnione przez wybrany kanał (jeśli ustawiony)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "moc nadawania (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "bezprzewodowe sieci LAN" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "nieoznaczone sieci VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "oznaczone sieci VLAN" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interfejs" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfejsy" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} Interfejsy nie mogą mieć podłączonego kabla." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} interfejsów nie można oznaczyć jako połączonych." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Interfejs nie może być własnym rodzicem." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "Do interfejsu nadrzędnego można przypisać tylko interfejsy wirtualne." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5203,7 +5659,7 @@ msgstr "" "Wybrany interfejs nadrzędny ({interface}) należy do innego urządzenia " "({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5212,7 +5668,7 @@ msgstr "" "Wybrany interfejs nadrzędny ({interface}) należy do {device}, która nie jest" " częścią wirtualnej obudowy {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5220,7 +5676,7 @@ msgid "" msgstr "" "Wybrany interfejs mostu ({bridge}) należy do innego urządzenia ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5229,21 +5685,21 @@ msgstr "" "Wybrany interfejs mostu ({interface}) należy do {device}, która nie jest " "częścią wirtualnej obudowy {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Interfejsy wirtualne nie mogą mieć nadrzędnego interfejsu LAG." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Interfejs LAG nie może być własnym rodzicem." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "Wybrany interfejs LAG ({lag}) należy do innego urządzenia ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5252,49 +5708,49 @@ msgstr "" "Wybrany interfejs LAG ({lag}) należy do {device}, która nie jest częścią " "wirtualnej obudowy {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Interfejsy wirtualne nie mogą mieć trybu PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Interfejsy wirtualne nie mogą mieć typu PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Musi określić tryb PoE podczas wyznaczania typu PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "Rola sieci bezprzewodowej może być ustawiona tylko na interfejsach " "bezprzewodowych." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Kanał można ustawić tylko na interfejsach bezprzewodowych." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "Częstotliwość kanału może być ustawiona tylko na interfejsach " "bezprzewodowych." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Nie można określić niestandardowej częstotliwości z wybranym kanałem." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "Szerokość kanału może być ustawiona tylko na interfejsach bezprzewodowych." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Nie można określić niestandardowej szerokości przy zaznaczonym kanale." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5303,24 +5759,24 @@ msgstr "" "Nieoznaczona sieć VLAN ({untagged_vlan}) musi należeć do tej samej witryny " "co urządzenie nadrzędne interfejsu lub musi być globalne." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Zmapowana pozycja na odpowiednim tylnym porcie" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "port przedni" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "porty przednie" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Tylny port ({rear_port}) musi należeć do tego samego urządzenia" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5329,19 +5785,19 @@ msgstr "" "Nieprawidłowa pozycja tylnego portu ({rear_port_position}): Tylny port " "{name} ma tylko {positions} pozycje." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Liczba portów przednich, które mogą być mapowane" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "tylny port" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "tylne porty" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5350,36 +5806,37 @@ msgstr "" "Liczba pozycji nie może być mniejsza niż liczba zmapowanych portów przednich" " ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "wnęka modułu" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "kieszenie modułowe" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "Wnęka modułu nie może należeć do zainstalowanego w nim modułu." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "wnęka urządzenia" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "kieszenie na urządzenia" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Ten typ urządzenia ({device_type}) nie obsługuje wnęk na urządzenia." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Nie można zainstalować urządzenia w sobie." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5387,114 +5844,116 @@ msgstr "" "Nie można zainstalować określonego urządzenia; urządzenie jest już " "zainstalowane w {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "rola pozycji zapasów" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "role pozycji zapasów" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "numer seryjny" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "znacznik zasobu" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Unikalny znacznik używany do identyfikacji tego elementu" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "odkryty" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Ten przedmiot został automatycznie wykryty" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "pozycja inwentaryzacyjna" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "pozycje inwentaryzacyjne" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Nie można przypisać siebie jako rodzica." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Nadrzędny element ekwipunku nie należy do tego samego urządzenia." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "" "Nie można przenieść pozycji inwentarza z pozostałymi dziećmi na utrzymaniu" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Nie można przypisać elementu zapasów do komponentu na innym urządzeniu" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "producenta" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "producentów" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "model" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "domyślna platforma" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "numer części" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Dyskretny numer części (opcjonalnie)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "wysokość (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "wykluczyć z wykorzystania" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Urządzenia tego typu są wykluczone przy obliczaniu wykorzystania szafy." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "jest pełna głębokość" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "Urządzenie zajmuje zarówno przednią, jak i tylną powierzchnię szafy." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "status rodzica/dziecka" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5503,24 +5962,24 @@ msgstr "" " Pozostaw puste, jeśli ten typ urządzenia nie jest ani rodzicem, ani " "dzieckiem." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "przepływ powietrza" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "typ urządzenia" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "typy urządzeń" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "Wysokość U musi być w odstępach co 0,5 jednostki szafy." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5529,7 +5988,7 @@ msgstr "" "Urządzenie {device} w szafie {rack} nie ma wystarczającej ilości miejsca, " "aby pomieścić wysokość {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5539,7 +5998,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} instancji już zamontowanych " "w szafach." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5547,157 +6006,157 @@ msgstr "" "Przed odtajnieniem go jako urządzenia nadrzędnego należy usunąć wszystkie " "szablony kieszeni urządzeń powiązane z tym urządzeniem." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Typy urządzeń podrzędnych muszą mieć wartość 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "typ modułu" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "typy modułów" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Maszyny wirtualne mogą być przypisane do tej roli" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "rola urządzenia" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "role urządzenia" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "Opcjonalnie ogranicz tę platformę do urządzeń określonego producenta" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "platforma" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "platformy" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Funkcja, jaką spełnia to urządzenie" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Numer seryjny podwozia, przypisany przez producenta" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Unikalny znacznik używany do identyfikacji tego urządzenia" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "pozycja (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "powierzchnia szafy" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "podstawowy IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "podstawowy IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "Poza pasmem IP" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Pozycja VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Wirtualna pozycja podwozia" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Priorytet VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Priorytet wyboru głównego wirtualnego podwozia" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "swoboda" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Współrzędne GPS w formacie dziesiętnym (xx.rrrr)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "długość geograficzna" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Nazwa urządzenia musi być niepowtarzalna dla każdej witryny." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "urządzenie" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "urządzenia" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Szafa {rack} nie należy do terenu {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Lokalizacja {location} nie należy do strony {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Szafa {rack} nie należy do lokalizacji {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Nie można wybrać powierzchni szafy bez przypisania szafy." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Nie można wybrać pozycji w szafie bez przypisania szafy." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Pozycja musi być w odstępach co 0,5 jednostek regałowych." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Należy określić powierzchnię szafy podczas definiowania pozycji w szafie." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "" "Typ urządzenia 0U ({device_type}) nie może być przypisany do pozycji szafy." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5705,7 +6164,7 @@ msgstr "" "Typy urządzeń podrzędnych nie mogą być przypisane do powierzchni szafy. Jest" " to atrybut urządzenia nadrzędnego." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5713,7 +6172,7 @@ msgstr "" "Typy urządzeń podrzędnych nie mogą być przypisane do pozycji szafy. Jest to " "atrybut urządzenia nadrzędnego." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5722,22 +6181,22 @@ msgstr "" "U{position} jest już zajęty lub nie ma wystarczającej ilości miejsca, aby " "pomieścić ten typ urządzenia: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} nie jest adresem IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Podany adres IP ({ip}) nie jest przypisany do tego urządzenia." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} nie jest adresem IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5746,18 +6205,18 @@ msgstr "" "Przydzielona platforma jest ograniczona do {platform_manufacturer} typy " "urządzeń, ale typ tego urządzenia należy do {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Przypisany klaster należy do innej lokalizacji ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Urządzenie przypisane do wirtualnej obudowy musi mieć zdefiniowane " "położenie." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5766,15 +6225,15 @@ msgstr "" "Nie można usunąć urządzenia z wirtualnej obudowy {virtual_chassis} ponieważ " "jest obecnie wyznaczony jako jego mistrz." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "moduł" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "modułów" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5783,22 +6242,22 @@ msgstr "" "Moduł musi być zainstalowany w wnęce modułowej należącej do przypisanego " "urządzenia ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domena" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "wirtualne podwozie" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "Wybrany mistrz ({master}) nie jest przypisany do tej wirtualnej obudowy." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5807,61 +6266,61 @@ msgstr "" "Nie można usunąć wirtualnej obudowy {self}. Istnieją interfejsy członów, " "które tworzą interfejsy LAG między podwoziami." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identyfikator" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Identyfikator numeryczny unikalny dla urządzenia nadrzędnego" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "komentarzy" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "kontekst urządzenia wirtualnego" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "konteksty urządzeń wirtualnych" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} nie jest IPV{family} adres." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "Podstawowy adres IP musi należeć do interfejsu na przypisanym urządzeniu." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "waga" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "jednostka wagowa" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Należy określić jednostkę podczas ustawiania wagi" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "panel zasilania" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "panele zasilające" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5869,43 +6328,43 @@ msgstr "" "Lokalizacja {location} ({location_site}) znajduje się w innej witrynie niż " "{site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "zapas" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "etap" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "napięcie" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "natężenie prądu" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maksymalne wykorzystanie" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Maksymalne dopuszczalne losowanie (procent)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "dostępna moc" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "zasilanie" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "zasilanie" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5914,63 +6373,63 @@ msgstr "" "Szafa {rack} ({rack_site}) i panel zasilania {powerpanel} " "({powerpanel_site}) znajdują się na różnych terenach." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Napięcie nie może być ujemne dla zasilania prądem przemiennym" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "szerokość" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Szerokość szyny do szyny" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Wysokość w jednostkach szafy" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "jednostka startowa" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Jednostka początkowa szafy" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "jednostki malejące" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Jednostki są ponumerowane od góry do dołu" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "szerokość zewnętrzna" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Wymiar zewnętrzny szafy (szerokość)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "głębokość zewnętrzna" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Wymiar zewnętrzny szafy (głębokość)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "jednostka zewnętrzna" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "głębokość montażu" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5978,76 +6437,77 @@ msgstr "" "Maksymalna głębokość zamontowanego urządzenia w milimetrach. W przypadku " "stojaków czterosłupkowych jest to odległość między przednią i tylną szyną." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "maksymalna waga" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Maksymalna nośność regału" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "współczynnik kształtu" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "typ szafy" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "typy szaf" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Należy określić jednostkę podczas ustawiania szerokości/głębokości " "zewnętrznej" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Należy określić jednostkę podczas ustawiania maksymalnej wagi" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "rola szafy" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "role szafy" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "Identyfikator obiektu" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Lokalnie przypisany identyfikator" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Funkcjonalna rola" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Unikalny tag używany do identyfikacji tej szafy" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "szafa" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "szafy" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "Przypisana lokalizacja musi należeć do witryny nadrzędnej ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6056,7 +6516,7 @@ msgstr "" "Szafa musi być mieć najmniej {min_height}U wysokości aby pomieścić aktualnie" " zainstalowane urządzeń." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6065,891 +6525,953 @@ msgstr "" "Numeracja jednostek szafy musi rozpoczynać się od {position} lub mniej, aby " "pomieścić aktualnie zainstalowane urządzenia." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Lokalizacja musi pochodzić z tego samego miejsca, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "jednostki" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "rezerwacja szafy" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "rezerwacje szafy" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Nieprawidłowa jednostka (jednostki) dla szafy {height}U: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Następujące jednostki zostały już zarezerwowane: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Region najwyższego poziomu o tej nazwie już istnieje." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Region najwyższego poziomu z tym identyfikatorem już istnieje." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "regionu" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regionów" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Grupa witryn najwyższego poziomu o tej nazwie już istnieje." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Grupa terenów najwyższego poziomu z tym identyfikatorem już istnieje." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "grupa witryn" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "grupy witryn" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Pełna nazwa strony" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "obiekt" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Identyfikator lub opis lokalnego obiektu" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "adres fizyczny" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Fizyczne położenie budynku" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "adres wysyłki" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Jeśli różni się od adresu fizycznego" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "miejsce" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "witryny" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Lokalizacja o tej nazwie istnieje już w określonej witrynie." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Lokalizacja z tym identyfikatorem już istnieje na określonym terenie." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "lokalizacja" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "lokalizacje" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Lokalizacja macierzysta ({parent}) musi należeć do tej samej witryny " "({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Wypowiedzenie A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Wypowiedzenie B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Urządzenie A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Urządzenie B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Lokalizacja A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Lokalizacja B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Szafa A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Szafa B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Strona A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Strona B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Osiągnięty" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Urządzenia" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "maszyny wirtualne" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Szablon konfiguracji" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Grupa witryn" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "Adres IP" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Adres IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Adres IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Pozycja VC" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Priorytet VC" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Urządzenie nadrzędne" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Pozycja (gniazdo urządzenia)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Porty konsoli" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Porty serwera konsoli" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Porty zasilania" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Gniazdka elektryczne" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfejsy" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Porty przednie" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Wnęsy na urządzenia" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Wnęsy modułowe" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Elementy inwentaryzacyjne" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Moduł Bay" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Przedmioty magazynowe" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Kolor kabla" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Łącz rówieśników" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Oznacz Połączony" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maksymalne wyciąganie (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Przydzielone losowanie (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "Adresy IP" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Grupy FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tunel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Tylko zarządzanie" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Zainstalowany moduł" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Moduł szeregowy" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Etykietka zasobów modułu" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Status modułu" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Komponent" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Przedmioty" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Rodzaje urządzeń" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Rodzaje modułów" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Platformy" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Domyślna platforma" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Pełna głębokość" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Wysokość U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instancje" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Porty konsoli" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Porty serwera konsoli" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Porty zasilania" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Gniazdka elektryczne" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Porty przednie" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Tylne porty" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Wnęsy na urządzenia" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Wnęsy modułowe" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Zasilanie zasilania" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Maksymalne wykorzystanie" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Dostępna moc (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Szafy" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Wysokość" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Szerokość zewnętrzna" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Głębokość zewnętrzna" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Maksymalna waga" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Przestrzeń" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Witryny" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Przypadek testowy musi ustawić peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Odłączony {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Rezerwacje" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Urządzenia poza szafami" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Kontekst konfiguracji" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Konfiguracja renderowania" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Wystąpił błąd podczas renderowania szablonu: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Maszyny wirtualne" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Zainstalowane urządzenie {device} w zatoce {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Usunięte urządzenie {device} z zatoki {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Dzieci" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Dodano członka {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Nie można usunąć urządzenia głównego {device} z wirtualnego podwozia." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Usunięto {device} z wirtualnego podwozia {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Nieznany obiekt (y) powiązany (y): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Zmiana typu pól niestandardowych nie jest obsługiwana." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Planowanie nie jest włączone dla tego skryptu." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Tekst" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Tekst (długi)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Liczba całkowita" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Dziesiętny" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Boolean (prawda/fałsz)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Data" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Data i godzina" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Wybór" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Wielokrotny wybór" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Wiele obiektów" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Niepełnosprawny" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Luźne" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Dokładny" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Zawsze" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Jeśli ustawiony" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Ukryte" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "tak" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Nie" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Link" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Najnowszy" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Najstarszy" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabetycznie (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabetycznie (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Informacja" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Sukces" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Ostrzeżenie" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Niebezpieczeństwo" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Debugowanie" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Domyślnie" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Niepowodzenie" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Godzinowe" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 godzin" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Codziennie" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Tygodniowy" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 dni" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Utwórz" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Aktualizacja" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Usuń" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Niebieska" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Indygo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Fioletowy" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Różowy" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Czerwony" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Pomarańczowy" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Żółty" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Zielony" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Cyraneczka" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Niebieski" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Szary" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Czarny" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Biały" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Hook internetowy" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Skrypt" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Powiadomienie" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Nieznany operator: {op}. Musi być jednym z: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Nieobsługiwany typ wartości: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Nieprawidłowy typ {op} operacja: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Zestaw reguł musi być słownikiem, a nie {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Nieprawidłowy typ logiki: musi być „AND” lub „OR”. Proszę sprawdzić " "dokumentację." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Zgłoszono nieprawidłowy klucz (y). Proszę sprawdzić dokumentację." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Typ widżetu" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Niezarejestrowana klasa widgetów: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} musi zdefiniować metodę render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Uwaga" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Wyświetl dowolną niestandardową zawartość. Markdown jest obsługiwany." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Liczenie obiektów" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6957,269 +7479,291 @@ msgstr "" "Wyświetla zestaw modeli NetBox i liczbę obiektów utworzonych dla każdego " "typu." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtry do zastosowania przy liczeniu liczby obiektów" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Nieprawidłowy format. Filtry obiektów muszą być przekazywane jako słownik." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Lista obiektów" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Wyświetla dowolną listę obiektów." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Domyślna liczba obiektów do wyświetlenia" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Nieprawidłowy format. Parametry adresu URL muszą być przekazywane jako " "słownik." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "Kanał RSS" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Osadź kanał RSS z zewnętrznej strony internetowej." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "Adres URL kanału" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Maksymalna liczba obiektów do wyświetlenia" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Jak długo przechowywać zawartość w pamięci podręcznej (w sekundach)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Zakładki" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Pokaż swoje osobiste zakładki" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Nieznany typ akcji dla reguły zdarzenia: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Nie można importować pociągu zdarzeń {name} błąd: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Moduł skryptu (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Plik danych (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Grupa (nazwa)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Typ klastra" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Typ klastra (identyfikator)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Grupa najemców" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Grupa najemców (identyfikator)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Etykietka" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Tag (identyfikator)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Posiada lokalne dane kontekstowe konfiguracji" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Nazwa grupy" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Wymagane" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Musi być wyjątkowy" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Widoczny interfejs użytkownika" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Edytowalny interfejs użytkownika" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Jest klonowalny" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimalna wartość" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maksymalna wartość" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Walidacja regex" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Zachowanie" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nowe okno" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Klasa przycisków" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Typ MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Rozszerzenie pliku" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Jako załącznik" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Udostępnione" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Metoda HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "Adres URL ładunku" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Weryfikacja SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Tajemnica" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Ścieżka pliku CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Rodzaje zdarzeń" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Jest aktywny" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Typy obiektów" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Jeden lub więcej przypisanych typów obiektów" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Typ danych pola (np. tekst, liczba całkowita itp.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Typ obiektu" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Typ obiektu (dla pól obiektu lub wielu obiektów)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Zestaw do wyboru" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Zestaw wyboru (dla pól wyboru)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Czy pole niestandardowe jest wyświetlane w interfejsie użytkownika" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Czy pole niestandardowe można edytować w interfejsie użytkownika" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "Podstawowy zestaw predefiniowanych opcji do użycia (jeśli istnieje)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7227,185 +7771,201 @@ msgstr "" "Cytowany ciąg opcji pól oddzielonych przecinkami z opcjonalnymi etykietami " "oddzielonymi dwukropkiem: „Choice1:First Choice, Choice2:Second Choice”" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "klasa przycisków" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Klasa pierwszego łącza w grupie zostanie użyta dla rozwijanego przycisku" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Typy zdarzeń, które wyzwalają tę regułę" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Obiekt akcji" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Nazwa lub skrypt Webhook jako ścieżka kropkowana module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Hook internetowy {name} nie znaleziono" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Skrypt {name} nie znaleziono" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Przypisany typ obiektu" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Klasyfikacja wpisu" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Użytkownicy" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Nazwy użytkowników oddzielone przecinkami, otoczone podwójnymi cudzysłowami" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Grupy" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Nazwy grup oddzielone przecinkami, otoczone podwójnymi cudzysłowami" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Powiązany typ obiektu" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Typ pola" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Wybory" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Dane" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Plik danych" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Typy treści" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Typ zawartości HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Typ zdarzenia" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Rodzaj akcji" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Typ obiektu oznaczonego" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Dozwolony typ obiektu" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regiony" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Grupy witryn" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Lokalizacje" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Rodzaje urządzeń" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Role" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Typy klastrów" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Grupy klastrów" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Klastry" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Grupy najemców" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Typ (y) obiektu, który ma to pole niestandardowe" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Wartość domyślna" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Typ powiązanego obiektu (tylko dla pól obiektu/wielu obiektów)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Powiązany filtr obiektów" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Określ parametry zapytania jako obiekt JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Pole niestandardowe" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7413,7 +7973,7 @@ msgstr "" "Rodzaj danych przechowywanych w tym polu. W przypadku pól obiektu/wielu " "obiektów wybierz powiązany typ obiektu poniżej." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7421,11 +7981,11 @@ msgstr "" "Zostanie wyświetlony jako tekst pomocy dla pola formularza. Markdown jest " "obsługiwany." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Powiązany obiekt" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7433,15 +7993,16 @@ msgstr "" "Wprowadź jeden wybór na linię. Opcjonalną etykietę można określić dla " "każdego wyboru, dodając ją dwukropkiem. Przykład:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Niestandardowe łącze" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Szablony" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7450,60 +8011,66 @@ msgstr "" "Kod szablonu Jinja2 dla tekstu łącza. Odwołaj obiekt jako {example}. Linki " "renderowane jako pusty tekst nie będą wyświetlane." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "" "Kod szablonu Jinja2 dla adresu URL linku. Odwołaj obiekt jako {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Kod szablonu" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Szablon eksportu" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Renderowanie" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Zawartość szablonu jest wypełniana ze zdalnego źródła wybranego poniżej." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Musi określić zawartość lokalną lub plik danych" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Zapisany filtr" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Grupa powiadomień określa co najmniej jednego użytkownika lub grupę." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Żądanie HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Wybór działania" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Wprowadź warunki w JSON format." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7511,110 +8078,112 @@ msgstr "" "Wprowadź parametry, które mają zostać przekazane do akcji w JSON format." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Reguła zdarzenia" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Wyzwalacze" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Grupa powiadomień" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Najemcy" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Dane są wypełniane ze zdalnego źródła wybranego poniżej." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Musi określić dane lokalne lub plik danych" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Zawartość" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Zaplanuj pod adresem" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Zaplanuj wykonanie raportu na określony czas" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Powtarza się co" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Przedział, w którym raport jest ponownie uruchamiany (w minutach)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (aktualny czas: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Zaplanowany czas musi być w przyszłości." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Zatwierdź zmiany" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Zatwierdź zmiany w bazie danych (usuń zaznaczenie dla suchego uruchomienia)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Zaplanuj wykonanie skryptu na określony czas" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Interwał, w którym ten skrypt jest ponownie uruchamiany (w minutach)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Zmiany w bazie danych zostały wycofane automatycznie." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Skrypt przerwany z błędem: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Wystąpił wyjątek: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Zmiany bazy danych zostały cofnięte z powodu błędu." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Nie znaleziono indeksatorów!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "Kontekst konfiguracji" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "Konteksty konfiguracji" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Dane JSON muszą być w formie obiektu. Przykład:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7622,19 +8191,19 @@ msgstr "" "Lokalne dane kontekstowe konfiguracji mają pierwszeństwo przed kontekstami " "źródłowymi w ostatecznym renderowanym kontekście konfiguracji" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "kod szablonu" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Kod szablonu Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "parametry środowiska" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7644,40 +8213,40 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">dodatkowe" " parametry do przejścia podczas konstruowania środowiska Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "szablon konfiguracji" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "szablony konfiguracji" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Obiekt (-y), do którego dotyczy to pole." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Typ danych przechowywanych w tym polu niestandardowym" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "Typ obiektu NetBox, do którego mapuje to pole (dla pól obiektowych)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Nazwa pola wewnętrznego" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Dozwolone są tylko znaki alfanumeryczne i podkreślenia." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Podwójne podkreślenia nie są dozwolone w niestandardowych nazwach pól." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7685,19 +8254,19 @@ msgstr "" "Nazwa pola wyświetlana użytkownikom (jeśli nie zostanie podana, zostanie " "użyta nazwa pola)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "nazwa grupy" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Pola niestandardowe w tej samej grupie będą wyświetlane razem" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "wymagane" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7705,19 +8274,19 @@ msgstr "" "To pole jest wymagane podczas tworzenia nowych obiektów lub edycji " "istniejącego obiektu." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "musi być wyjątkowy" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Wartość tego pola musi być niepowtarzalna dla przypisanego obiektu" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "waga wyszukiwania" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7725,11 +8294,11 @@ msgstr "" "Ważenie do wyszukiwania. Niższe wartości są uważane za ważniejsze. Pola o " "wadze wyszukiwania równej zero zostaną zignorowane." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "logika filtra" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7737,11 +8306,11 @@ msgstr "" "Luźna pasuje do dowolnego wystąpienia danego ciągu; dokładnie pasuje do " "całego pola." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "domyślny" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7749,7 +8318,7 @@ msgstr "" "Wartość domyślna dla pola (musi być wartością JSON). Enkapsuluj ciągi z " "podwójnymi cudzysłowami (np. „Foo”)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7758,35 +8327,35 @@ msgstr "" "wartością JSON). Enkapsuluj ciągi znaków z podwójnymi cudzysłowami (np. " "„Foo”)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "waga wyświetlacza" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Pola o większej wadze wydają się niższe w formularzu." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "wartość minimalna" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Minimalna dopuszczalna wartość (dla pól numerycznych)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maksymalna wartość" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Maksymalna dopuszczalna wartość (dla pól numerycznych)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "walidacja regex" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7797,191 +8366,193 @@ msgstr "" "wymusić dopasowanie całego ciągu. Na przykład, ^ [A-Z]{3}$ " "ograniczy wartości do dokładnie trzech wielkich liter." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "zestaw wyboru" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Określa, czy pole niestandardowe jest wyświetlane w interfejsie użytkownika" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Określa, czy wartość pola niestandardowego może być edytowana w interfejsie " "użytkownika" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "jest klonowalny" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Powtórz tę wartość podczas klonowania obiektów" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "pole niestandardowe" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "pola niestandardowe" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Nieprawidłowa wartość domyślna”{value}„: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Wartość minimalna może być ustawiona tylko dla pól numerycznych" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Maksymalna wartość może być ustawiona tylko dla pól liczbowych" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Walidacja wyrażeń regularnych jest obsługiwana tylko dla pól tekstowych i " "URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Unikalność nie może być egzekwowana dla pól logicznych" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Pola wyboru muszą określać zestaw opcji." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Opcje można ustawić tylko w polach wyboru." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Pola obiektu muszą definiować typ obiektu." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} pola mogą nie definiować typu obiektu." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "Powiązany filtr obiektów można zdefiniować tylko dla pól obiektu." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Filtr musi być zdefiniowany jako słownik mapowania atrybutów do wartości." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Prawda" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Fałszywe" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Wartości muszą być zgodne z tym regex: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Wartość musi być ciągiem." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Wartość musi być zgodna z regex '{regex}”" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Wartość musi być liczbą całkowitą." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Wartość musi być co najmniej {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Wartość nie może przekraczać {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Wartość musi być dziesiętna." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Wartość musi być prawdziwa lub fałszywa." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Wartości dat muszą być w formacie ISO 8601 (RRRR-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Wartości daty i godziny muszą być zgodne z normą ISO 8601 (RRRR-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Nieprawidłowy wybór ({value}) do wyboru zestawu {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Nieprawidłowy wybór (y) ({value}) do wyboru zestawu {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Wartość musi być identyfikatorem obiektu, a nie {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Wartość musi być listą identyfikatorów obiektów, a nie {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Znaleziono nieprawidłowy identyfikator obiektu: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Pole wymagane nie może być puste." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Podstawowy zestaw predefiniowanych opcji (opcjonalnie)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Wybory są automatycznie uporządkowane alfabetycznie" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "niestandardowy zestaw wyboru pola" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "niestandardowe zestawy wyboru pól" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Musi zdefiniować opcje bazowe lub dodatkowe." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -7990,61 +8561,61 @@ msgstr "" "Nie można usunąć wyboru {choice} tak jak są {model} Obiekty, które się do " "niego odnoszą." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "układ" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "konfiguruj" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "deska rozdzielcza" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "pulpity nawigacyjne" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "typy obiektów" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Obiekt (-y), do którego ma zastosowanie ta reguła." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Rodzaje zdarzeń, które wyzwalają tę regułę." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "warunki" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "" "Zestaw warunków decydujących o tym, czy zdarzenie zostanie wygenerowane." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "typ działania" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Dodatkowe dane do przekazania do obiektu akcji" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "reguła zdarzenia" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "zasady zdarzeń" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8054,7 +8625,7 @@ msgstr "" "podczas wywołania webhook. Przetwarzanie szablonu Jinja2 jest obsługiwane w " "tym samym kontekście co treść żądania." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available tutaj." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "dodatkowe nagłówki" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8080,11 +8651,11 @@ msgstr "" "formacie Nazwa: Value. Przetwarzanie szablonu Jinja2 jest " "obsługiwane w tym samym kontekście co treść żądania (poniżej)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "szablon ciała" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8097,11 +8668,11 @@ msgstr "" "znacznik czasu, nazwa użytkownika, " "Identyfikator żądania, i dane." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "tajemnica" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8111,15 +8682,15 @@ msgstr "" "zawierający podsumowanie heksadecymalne HMAC korpusu ładunku użytkowego " "używającego sekretu jako klucza. Tajemnica nie jest przekazywana w żądaniu." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Włącz weryfikację certyfikatu SSL. Wyłącz ostrożnie!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Ścieżka pliku CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8127,64 +8698,64 @@ msgstr "" "Określony plik certyfikatu CA, który ma być używany do weryfikacji SSL. " "Pozostaw puste miejsce, aby użyć ustawień domyślnych systemu." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "haczyk internetowy" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "haczyki internetowe" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Nie określaj pliku certyfikatu CA, jeśli weryfikacja SSL jest wyłączona." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Typ obiektu (-y), do którego dotyczy to łącze." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "tekst linku" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Kod szablonu Jinja2 dla tekstu linku" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL linku" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Kod szablonu Jinja2 dla adresu URL linku" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Linki z tą samą grupą pojawią się jako menu rozwijane" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nowe okno" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Wymuś otwarcie łącza w nowym oknie" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "niestandardowy link" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "niestandardowe linki" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Typ obiektu, do którego ma zastosowanie ten szablon." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8192,1085 +8763,1151 @@ msgstr "" "Kod szablonu Jinja2. Lista eksportowanych obiektów jest przekazywana jako " "zmienna kontekstowa o nazwie zestaw zapytań." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Domyślnie tekst/zwykły; charset = utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "rozszerzenie pliku" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Rozszerzenie do dołączenia do renderowanej nazwy pliku" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "jako załącznik" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Pobierz plik jako załącznik" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "szablon eksportu" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "szablony eksportu" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "„{name}„jest zastrzeżoną nazwą. Proszę wybrać inną nazwę." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Typ obiektu (-y), do którego ma zastosowanie ten filtr." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "wspólne" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "zapisany filtr" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "zapisane filtry" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Parametry filtra muszą być przechowywane jako słownik argumentów słów " "kluczowych." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "wysokość obrazu" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "szerokość obrazu" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "załącznik do obrazu" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "załączniki do obrazów" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Załączniki obrazów nie mogą być przypisane do tego typu obiektu ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "rodzaj" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "wpis do dziennika" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "wpisy do dziennika" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Rejestracja nie jest obsługiwana dla tego typu obiektu ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "zakładka" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "zakładki" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Zakładki nie mogą być przypisane do tego typu obiektu ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "przeczytać" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "zdarzenie" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "powiadomienie" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "powiadomienia" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Obiekty tego typu ({type}) nie obsługują powiadomień." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "grupy" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "użytkownicy" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "grupa powiadomień" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "grupy powiadomień" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "subskrypcja" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "subskrypcje" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "jest wykonywalny" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "scenariusz" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "scenariusze" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "moduł skryptu" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "moduły skryptowe" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "znacznik czasu" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "pole" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "wartość" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "wartość buforowana" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "wartości buforowane" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "oddział" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "oddziałów" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "zmiana etapowa" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "zmiany etapowe" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Typ obiektu, do którego można zastosować ten znacznik." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "metka" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "znakuje" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "przedmiot oznaczony" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "przedmioty oznaczone" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Dane skryptu" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parametry wykonywania skryptów" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Odrzucić" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Typy obiektów" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Potwierdź wyjątkowość" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Widoczne" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Edytowalny" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Powiązany typ obiektu" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Zestaw wyboru" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Jest klonowalny" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimalna wartość" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maksymalna wartość" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Walidacja Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Policz" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Uporządkuj alfabetycznie" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nowe okno" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Jako załącznik" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Plik danych" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Zsynchronizowane" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Obraz" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Rozmiar (bajty)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Przeczytaj" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Walidacja SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Rodzaje zdarzeń" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Role urządzenia" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Komentarze (krótkie)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linia" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Poziom" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Wiadomość" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Metoda" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Upewnij się, że ta wartość jest równa %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Upewnij się, że ta wartość nie jest równa %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "To pole musi być puste." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "To pole nie może być puste." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Reguły walidacji muszą być przekazane jako słownik" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Niestandardowa walidacja nie powiodła się {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Nieprawidłowy atrybut”{name}„na żądanie" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Nieprawidłowy atrybut”{name}„dla {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Twój pulpit nawigacyjny został zresetowany." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Dodano widżet: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Zaktualizowano widżet: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Usunięty widget: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Błąd usuwania widżetu: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Nie można uruchomić skryptu: proces roboczy RQ nie działa." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Wprowadź prawidłowy adres IPv4 lub IPv6 z opcjonalną maską." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Nieprawidłowy format adresu IP: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Wprowadź prawidłowy prefiks IPv4 lub IPv6 i maskę w notacji CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Nieprawidłowy format prefiksu IP: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Nie jest dostępna jest wystarczająca ilość miejsca, aby pomieścić żądany " "rozmiar prefiksu (prefiksów)" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Pojemnik" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLACK" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Pętla zwrotna" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standardowy" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Punkt kontrolny" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Zwykły tekst" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Nieprawidłowy format adresu IP: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Importuj cel" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Import docelowy (nazwa)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Cel eksportu" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Eksportuj cel (nazwa)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importowanie VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Import VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Eksportowanie VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Eksportuj VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importowanie L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importowanie L2VPN (identyfikator)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Eksportowanie L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Eksportowanie L2VPN (identyfikator)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefiks" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (identyfikator)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "W prefiksie" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "W i włącznie z prefiksem" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Prefiksy zawierające ten prefiks lub adres IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Długość maski" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Numer VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adres" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Zakresy zawierające ten prefiks lub adres IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Prefiks nadrzędny" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Maszyna wirtualna (nazwa)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Maszyna wirtualna (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interfejs (nazwa)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interfejs maszyny wirtualnej (nazwa)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interfejs maszyny wirtualnej (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Grupa FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Jest przypisany do interfejsu" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Jest przypisany" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Usługa (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT wewnątrz adresu IP (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Przypisany interfejs" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Przypisany interfejs maszyny wirtualnej" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "Adres IP (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "Adres IP" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Podstawowy IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Podstawowy IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Wprowadź prawidłowy adres IPv4 lub IPv6 (bez maski)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Nieprawidłowy format adresu IPv4/IPv6: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "To pole wymaga adresu IP bez maski." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Proszę podać prawidłowy adres IPv4 lub IPv6." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Wprowadź prawidłowy adres IPv4 lub IPv6 (z maską CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Wymagana jest maska CIDR (np. /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Wzór adresu" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Wymuszaj unikalną przestrzeń" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Jest prywatny" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "WRZUCIĆ" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Data dodania" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Grupa VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Długość prefiksu" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Jest basenem" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Traktuj jako w pełni wykorzystany" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Przypisanie sieci VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Nazwa DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protokół" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Identyfikator grupy" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Typ uwierzytelniania" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "klucz uwierzytelniania" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Uwierzytelnienie" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Rodzaj zakresu" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Zakres" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Zakresy identyfikatorów VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Strona & Grupa" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Porty" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Importuj cele trasy" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Cele trasy eksportu" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Przypisany RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Grupa sieci VLAN (jeśli istnieje)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Urządzenie nadrzędne przypisanego interfejsu (jeśli istnieje)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Maszyna wirtualna" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Nadrzędna maszyna wirtualna przypisanego interfejsu (jeśli istnieje)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Jest podstawowy" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Ustaw to podstawowy adres IP przypisanego urządzenia" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Nie określono urządzenia ani maszyny wirtualnej; nie można ustawić jako " "podstawowego adresu IP" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Nie określono interfejsu; nie można ustawić jako podstawowego adresu IP" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Rodzaj auth" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Typ zakresu (aplikacja i model)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Przypisana grupa VLAN" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "protokół IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Wymagane, jeśli nie jest przypisane do maszyny wirtualnej" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Wymagane, jeśli nie jest przypisane do urządzenia" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} nie jest przypisany do tego urządzenia/maszyny wirtualnej." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Cele trasy" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Importuj cele" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Cele eksportowe" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importowane przez VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Eksportowane przez VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Prywatny" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Rodzina adresu" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Zasięg" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Rozpocznij" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Koniec" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Szukaj w obrębie" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Obecny w VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Urządzenie/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Prefiks nadrzędny" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Przypisane urządzenie" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Przypisana maszyna maszynowa" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Przypisany do interfejsu" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Nazwa DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "sieci VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Zawiera identyfikator VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "IDENTYFIKATOR VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Maszyna wirtualna" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Cel trasy" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "agregat" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Zakres ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Przypisanie witryny/sieci VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Zakres IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Grupa FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Ustaw to podstawowy adres IP urządzenia/maszyny wirtualnej" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (wewnątrz)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Adres IP może być przypisany tylko do jednego obiektu." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Nie można ponownie przypisać adresu IP, gdy jest on wyznaczony jako główny " -"adres IP dla obiektu nadrzędnego" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Tylko adresy IP przypisane do interfejsu mogą być oznaczone jako podstawowe " "adresy IP." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Wirtualny adres IP" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Przydział już istnieje" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "Identyfikatory sieci VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Dziecięce sieci VLAN" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9278,133 +9915,134 @@ msgstr "" "Oddzielona przecinkami lista jednego lub więcej numerów portów. Zakres można" " określić za pomocą myślnika." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Szablon usługi" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Port (y)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Serwis" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Szablon usługi" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Z szablonu" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Niestandardowe" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Musi podać nazwę, protokół i port (y), jeśli nie używasz szablonu usługi." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "start" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Zakres ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Zakresy ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" "Rozpoczęcie ASN ({start}) musi być niższy niż kończący się ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" "Regionalny Rejestr Internetowy odpowiedzialny za tę przestrzeń numeryczną AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- lub 32-bitowy autonomiczny numer systemu" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID grupy" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protokół" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "typ uwierzytelniania" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "klucz uwierzytelniania" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Grupa FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Grupy FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Przydział grupy FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Zadania grupowe FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "prywatny" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "Przestrzeń IP zarządzana przez ten RIR jest uważana za prywatną" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Sieć IPv4 lub IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Regionalny Rejestr Internetowy odpowiedzialny za tę przestrzeń IP" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "data dodania" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "agregat" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "agregaty" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Nie można utworzyć agregatu z maską /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9413,7 +10051,7 @@ msgstr "" "Agregaty nie mogą się nakładać. {prefix} jest już objęty istniejącym " "agregatem ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9422,265 +10060,275 @@ msgstr "" "Prefiksy nie mogą nakładać się na agregaty. {prefix} obejmuje istniejące " "kruszywo ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "roli" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "ról" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "prefiks" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Sieć IPv4 lub IPv6 z maską" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Status operacyjny tego prefiksu" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Podstawowa funkcja tego prefiksu" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "jest basenem" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Wszystkie adresy IP w tym prefiksie są uważane za użyteczne" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "użyty znak" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "prefiksy" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Nie można utworzyć prefiksu z maską /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "tabela globalna" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Zduplikowany prefiks znaleziony w {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "adres początkowy" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Adres IPv4 lub IPv6 (z maską)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "adres końcowy" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Stan operacyjny tego zakresu" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Podstawowa funkcja tego zakresu" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Zakres IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Zakresy IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Początkowe i kończące wersje adresu IP muszą być zgodne" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Początkowe i kończące maski adresów IP muszą być zgodne" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "Adres końcowy musi być większy niż adres początkowy ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Zdefiniowane adresy pokrywają się z zakresem {overlapping_range} w VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Zdefiniowany zakres przekracza maksymalny obsługiwany rozmiar ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "przemawiać" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Status operacyjny niniejszego IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Funkcjonalna rola tego IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (wewnątrz)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "IP, dla którego ten adres jest „zewnętrznym” adresem IP" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Nazwa hosta lub FQDN (nie rozróżnia wielkości liter)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "Adresy IP" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Nie można utworzyć adresu IP z maską /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} jest identyfikatorem sieci, który może nie być przypisany do " "interfejsu." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" "{ip} jest adresem nadawczym, który nie może być przypisany do interfejsu." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Zduplikowany adres IP znaleziony w {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Nie można ponownie przypisać adresu IP, gdy jest on wyznaczony jako główny " +"adres IP dla obiektu nadrzędnego" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Tylko adresy IPv6 mogą mieć przypisany status SLAAC" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "numery portów" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "szablon usługi" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "szablony usług" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Konkretne adresy IP (jeśli istnieją), z którymi ta usługa jest związana" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "usługi" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "usług" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Usługa nie może być powiązana zarówno z urządzeniem, jak i maszyną " "wirtualną." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "Usługa musi być powiązana z urządzeniem lub maszyną wirtualną." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Grupy VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Nie można ustawić typu skope_bez identyfikatora scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Nie można ustawić scope_id bez scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Zakresy nie mogą się nakładać." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" "Określona strona, do której przypisana jest ta sieć VLAN (jeśli istnieje)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Grupa VLAN (opcjonalnie)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Numeryczny identyfikator sieci VLAN (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Stan operacyjny tej sieci VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Podstawowa funkcja tej VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9689,165 +10337,167 @@ msgstr "" "VLAN jest przypisana do grupy {group} (zakres: {scope}); nie można również " "przypisać do witryny {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID musi być w zakresach {ranges} dla sieci VLAN w grupie {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "rozróżniacz trasy" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Unikalny rozróżniacz trasy (zgodnie z definicją w RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "egzekwuj unikalną przestrzeń" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Zapobiegaj duplikowaniu prefiksów / adresów IP w tym VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Wartość docelowa trasy (sformatowana zgodnie z RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "cel trasy" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "cele trasy" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Liczba witryn" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Liczba dostawców" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agregaty" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Dodano" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Prefiksy" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Wykorzystanie" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Zakresy IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Prefiks (płaski)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Głębokość" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Basen" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Oznaczone Używane" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Adres początkowy" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (Wewnątrz)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (na zewnątrz)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Przypisany" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Przypisany obiekt" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Rodzaj zakresu" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Zakresy VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VIDEO" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD." -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Wyjątkowy" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Importuj cele" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Cele eksportu" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "" "{prefix} nie jest prawidłowym prefiksem. Czy chodziło Ci o {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Długość przedrostka musi być mniejsza niż lub równa %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Długość przedrostka musi być większa niż lub równa %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9855,31 +10505,31 @@ msgstr "" "W nazwach DNS dozwolone są tylko znaki alfanumeryczne, gwiazdki, łączniki, " "kropki i podkreślenia" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Prefiksy podrzędne" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Zakresy dla dzieci" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Powiązane adresy IP" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfejsy urządzeń" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Interfejsy VM" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "To pole może nie być puste." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9887,331 +10537,344 @@ msgstr "" "Wartość musi być przekazana bezpośrednio (np. „foo”: 123); nie używaj " "słownika ani listy." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} Nie jest ważnym wyborem." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Nieprawidłowy typ zawartości: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Nieprawidłowa wartość. Określ typ zawartości jako " "'.”." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Zakresy muszą być określone w formularzu (dolny, górny)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Granice zakresu muszą być zdefiniowane jako liczby całkowite." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} musi zaimplementować get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Nieprawidłowe uprawnienia {permission} dla modelu {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Ciemny czerwony" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Róża" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuksja" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Ciemnofioletowy" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Jasnoniebieski" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "wodny" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Ciemnozielony" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Jasnozielony" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Wapno" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Amber" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Ciemny Pomarańczowy" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Brązowy" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Jasnoszary" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Szary" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Ciemny szary" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Bezpośredni" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Przesyłanie" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Automatyczne wykrywanie" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "przecinek" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Średnik" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Zakładka" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Nieprawidłowy parametr konfiguracyjny: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Baner logowania" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Dodatkowe treści do wyświetlenia na stronie logowania" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Baner konserwacyjny" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Dodatkowa zawartość do wyświetlania w trybie konserwacji" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Górny baner" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Dodatkowe treści do wyświetlenia na górze każdej strony" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Dolny baner" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Dodatkowe treści do wyświetlenia na dole każdej strony" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Unikalna na całym świecie przestrzeń IP" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Wymuszanie unikalnego adresowania IP w tabeli globalnej" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Preferuj IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Preferuj adresy IPv4 niż IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Wysokość jednostki szafy" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Domyślna wysokość jednostki dla renderowanych elewacji szafy" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Szerokość jednostki szafy" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Domyślna szerokość jednostki dla renderowanych elewacji szafy" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Napięcie zasilania" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Domyślne napięcie zasilania" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Natężenie prądu zasilającego" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Domyślne natężenie prądu zasilania" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Maksymalne wykorzystanie zasilania" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Domyślne maksymalne wykorzystanie zasilaczy" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Dozwolone schematy adresów URL" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" "Dozwolone schematy adresów URL w treści dostarczonych przez użytkownika" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Domyślny rozmiar strony" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maksymalny rozmiar strony" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Niestandardowe walidatory" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Niestandardowe reguły walidacji (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Zasady ochrony" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Reguły ochrony przed usunięciem (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Preferencje domyślne" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Domyślne preferencje dla nowych użytkowników" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Tryb konserwacji" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Włącz tryb konserwacji" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL włączony" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Włącz interfejs API GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Przechowywanie dziennika zmian" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Dni na zachowanie historii dziennika zmian (ustawione na zero dla " "nieograniczonego)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Zachowanie wyników pracy" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Dni na zachowanie historii wyników pracy (ustawione na zero dla " "nieograniczonej liczby)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "Adres URL map" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Podstawowy adres URL do mapowania lokalizacji geograficznych" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Mecz częściowy" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Dokładne dopasowanie" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Zaczyna się od" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Kończy się z" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Typ (y) obiektu" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Wyszukiwanie" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10219,409 +10882,424 @@ msgstr "" "Identyfikatory tagów oddzielone przecinkami, otoczone podwójnymi " "cudzysłowami (np. \"tag1,tag2,tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Dodawanie tagów" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Usuń tagi" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} musi określić klasę modelu." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Nieznana nazwa pola '{name}'w danych pola niestandardowego." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Nieprawidłowa wartość pola niestandardowego '{name}”: {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Pole niestandardowe '{name}„musi mieć unikalną wartość." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Brakujące wymagane pole niestandardowe '{name}”." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Zdalne źródło danych" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "ścieżka danych" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Ścieżka do pliku zdalnego (względem katalogu głównego źródła danych)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "włączona automatyczna synchronizacja" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "Włącz automatyczną synchronizację danych po aktualizacji pliku danych" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "data zsynchronizowana" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} musi wdrożyć metodę sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organizacja" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Grupy witryn" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Grupy najemców" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Grupy kontaktowe" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Role kontaktowe" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Zadania kontaktowe" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Role szafy" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Elewacje" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Rodzaje szaf" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Moduły" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Konteksty urządzeń wirtualnych" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Producenci" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Komponenty urządzenia" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Role pozycji zapasów" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Połączenia" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kable" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Linki bezprzewodowe" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Połączenia interfejsu" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Połączenia konsoli" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Połączenia zasilania" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Grupy sieci bezprzewodowej sieci LAN" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Role prefiksów i VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Zakresy ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Grupy VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Szablony usług" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Usługi" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tunele" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Grupy tuneli" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Zakończenia tunelu" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Zakończenia" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Propozycje IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE Zasady działalności" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Propozycje IPsec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Zasady IPsec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Profile IPsec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Wirtualne dyski" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Typy klastrów" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Grupy klastrów" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Typy obwodów" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Grupy obwodów" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Zadania grupowe" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Zakończenia obwodów" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Dostawcy" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Konta dostawców" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Sieci dostawców" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Panele zasilające" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Konfiguracje" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Konteksty konfiguracji" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Szablony konfiguracji" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Dostosowywanie" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Pola niestandardowe" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Niestandardowe opcje pól" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Linki niestandardowe" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Szablony eksportu" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Zapisane filtry" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Załączniki do obrazów" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operacje" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integracje" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Źródła danych" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Zasady zdarzeń" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Haczyki internetowe" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Oferty pracy" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Rejestracja" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Grupy powiadomień" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Wpisy do czasopism" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Dziennik zmian" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Administrator" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Tokeny API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Uprawnienia" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "System" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Wtyczki" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Historia konfiguracji" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Zadania w tle" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Uprawnienia muszą być przekazywane jako kropka lub lista." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Przyciski muszą być przekazywane jako kółka lub lista." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Kolor przycisku musi być wybrany w ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10630,7 +11308,7 @@ msgstr "" "PluginTemplateExtension class {template_extension} Został przekazany jako " "przykład!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10639,196 +11317,197 @@ msgstr "" "{template_extension} nie jest podklasą " "Netbox.Plugins.Plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} musi być wystąpieniem Netbox.Plugins.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "" "{menu_link} musi być wystąpieniem Netbox.Plugins.Plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "" "{button} musi być wystąpieniem Netbox.Plugins.Plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context musi być słownikiem" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Nawigacja HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Włącz dynamiczną nawigację interfejsu użytkownika" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Funkcja eksperymentalna" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Język" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Wymusza tłumaczenie interfejsu użytkownika na określony język" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Obsługa tłumaczeń została wyłączona lokalnie" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Długość strony" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Domyślna liczba obiektów do wyświetlenia na stronie" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Umieszczenie paginatora" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Dół" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Top" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Obie" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Gdzie elementy sterujące paginatora będą wyświetlane względem tabeli" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Format danych" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Preferowana składnia do wyświetlania ogólnych danych w interfejsie " "użytkownika" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Nieprawidłowy sklep: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Nie można dodać sklepów do rejestru po zainicjowaniu" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Nie można usunąć sklepów z rejestru" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "czeski" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "duński" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "niemiecki" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "angielski" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "hiszpański" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "francuski" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "włoski" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "japoński" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "holenderski" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "polski" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "portugalski" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "rosyjski" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "turecki" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "ukraiński" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "chiński" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Zaznacz wszystko" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Przełącz wszystko" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Przełącz menu rozwijane" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Błąd" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "Nie znaleziono {model_name} " -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Pole" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Wartość" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Wtyczka Dummy" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10836,56 +11515,56 @@ msgid "" msgstr "" "Wystąpił błąd renderowania wybranego szablonu eksportu ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Wiersz {i}: Obiekt z identyfikatorem {id} nie istnieje" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Nie {object_type} zostały wybrane." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Zmiana nazwy {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Usunięte {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Dziennik zmian" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Dziennik" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Nie można zsynchronizować danych: Brak zestawu plików danych." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Zsynchronizowane dane dla {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Zsynchronizowane {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} musi zaimplementować get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10893,703 +11572,745 @@ msgstr "" "Wystąpił błąd podczas ładowania konfiguracji deski rozdzielczej. Używany " "jest domyślny pulpit nawigacyjny." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Odmowa dostępu" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Nie masz dostępu do tej strony" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Strona nie znaleziona" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Żądana strona nie istnieje" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Błąd serwera" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "Wystąpił problem z twoją prośbą. Skontaktuj się z administratorem" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Pełny wyjątek znajduje się poniżej" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Wersja Pythona" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Wersja NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Brak zainstalowanego" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Jeśli wymagana jest dalsza pomoc, prosimy o przesłanie do" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Forum dyskusyjne NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "na GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Strona główna" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Powiadomienia" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Subskrypcje" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Preferencje" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Zmień hasło" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Anuluj" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Zapisz" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Konfiguracje tabel" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Wyczyść preferencje tabeli" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Przełącz wszystko" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tabela" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Zamawianie" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Kolumny" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Nie znaleziono" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Profil użytkownika" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Szczegóły konta" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-mail" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Konto utworzone" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Ostatnie logowanie" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superuser" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Personel" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Przydzielone grupy" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Żaden" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Ostatnia aktywność" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Moje tokeny API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Zapis włączony" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Ostatnio używane" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Dodaj token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Strona główna" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Motyw NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Logo NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Dokumenty" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Dokumentacja REST API" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "Interfejs API GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Wsparcie NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Kod źródłowy" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Społeczność" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Data instalacji" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Data wypowiedzenia" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Przypisz grupę" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Zamknięcia obwodu zamiennego" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Zamień te zakończenia na obwód %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Strona A" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Strona Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Przypisz obwód" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Przypisanie grupy obwodów" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Dodaj obwód" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Typ obwodu" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Dodaj" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Edytuj" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Zamień" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Oznaczony jako połączony" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "do" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Ślad" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Edytuj kabel" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Wyjmij kabel" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Odłącz" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Połącz" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "W dalszej części" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "W górę rzeki" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Połączenie krzyżowe" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Panel krosowy/port" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Dodaj obwód" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Konto dostawcy" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Dane konfiguracyjne" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Komentarz" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Przywróć" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parametr" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Bieżąca wartość" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Nowa wartość" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Zmieniono" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Rozmiar" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bajty" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 Hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Synchronizacja" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Ostatnia synchronizacja" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Brak zdefiniowanych parametrów" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Pliki" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Elewacje szaf" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Domyślna wysokość jednostki" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Domyślna szerokość jednostki" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Zasilanie zasilania" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Domyślne napięcie" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Domyślne natężenie prądu" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Domyślne maksymalne wykorzystanie" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Egzekwuj globalny unikalny" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Liczba stron" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Maksymalny rozmiar strony" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Preferencje użytkownika" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Zatrzymanie pracy" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Praca" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Utworzony przez" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Planowanie" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "co %(interval)s minut(ę/y)" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Zmień" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Różnica" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Poprzednie" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Kolejny" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Utworzony obiekt" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Obiekt usunięty" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Brak zmian" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Wstępna zmiana danych" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Ostrzeżenie: Porównywanie zmian nieatomowych z poprzednim rekordem zmian" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Dane po zmianie" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Zobacz wszystko %(count)s Zmiany" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Zmień przechowywanie dziennika" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "dni" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Nieokreślony" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Nie zainstalowany" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Przegląd" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Zainstaluj" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Szczegóły wtyczki" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Podsumowanie" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licencja" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Historia wersji" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Lokalne instrukcje instalacji" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Kolejki tła" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Skonfiguruj tabelę" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Przestań" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Request" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Zaciągnij kolejkę" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Kolejka" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Limit czasu" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Wynik TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumenty" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argumenty słów kluczowych" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Zależy od" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Wyjątek" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "zadania w " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Zlecenia w kolejce" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11597,381 +12318,399 @@ msgstr "" "Wybierz wszyscy %(count)s %(object_type_plural)s pasujące " "zapytanie" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informacje o pracowniku" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Pracownik" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Kolejki" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Bieżąca praca" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Liczba udanych miejsc pracy" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Liczba nieudanych zadań" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Całkowity czas pracy" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "sekundy" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Pracownicy w tle" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Pracownicy w %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Eksportuj" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Status systemu" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Wydanie NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Wersja Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Wersja PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Nazwa bazy danych" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Wielkość bazy danych" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Niedostępne" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Pracownicy RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "domyślna kolejka" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Czas systemu" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Bieżąca konfiguracja" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Czy na pewno chcesz je odłączyć %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Śledzenie kabli dla %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Pobierz SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Ścieżka asymetryczna" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "Poniższe węzły nie mają linków i powodują asymetryczną ścieżkę" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Podział ścieżki" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Wybierz węzeł poniżej, aby kontynuować" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Śledzenie zakończone" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Segmenty ogółem" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Całkowita długość" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Nie znaleziono ścieżek" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Powiązane ścieżki" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Pochodzenie" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Miejsce docelowe" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmenty" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Niekompletny" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Zmień nazwę Wybrano" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Nie jest połączony" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Podświetl urządzenie w szafie" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Poza szafą" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Współrzędne GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Mapa" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Etykietka zasobów" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Wyświetl wirtualne podwozie" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Utwórz VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Zarządzanie" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT dla" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Wykorzystanie mocy" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Wejście" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Punkty sprzedaży" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Przydzielony" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Noga" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Dodawanie usługi" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Dodawanie komponentów" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Dodaj porty konsoli" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Dodaj porty serwera konsoli" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Dodaj kieszenie na urządzenia" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Dodaj przednie porty" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Ukryj włączone" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Ukryj wyłączone" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Ukryj wirtualny" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Ukryj odłączony" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Dodaj interfejsy" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Dodaj przedmiot zapasów" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Dodaj kieszenie modułowe" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Dodaj gniazdka elektryczne" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Dodaj port zasilania" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Dodaj tylne porty" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Konfiguracja" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Dane kontekstowe" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Wyrenderowana konfiguracja" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Ściągnij" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Nie znaleziono szablonu konfiguracji" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Zatoka Parent" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Regeneruj identyfikator" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Usuń" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Dane kontekstowe konfiguracji lokalnej" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Przemianować" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Zatoka na urządzenia" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Zainstalowane urządzenie" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Usuń %(device)s od %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11980,430 +12719,449 @@ msgstr "" "Czy na pewno chcesz usunąć %(device)s od " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Wypełnić" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Zatoka" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Dodaj urządzenie" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Rola maszyny wirtualnej" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Nazwa modelu" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Numer części" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Wyklucz z użytkowania" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Rodzic/Dziecko" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Obraz z przodu" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Obraz z tyłu" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Pozycja tylnego portu" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Oznaczone jako połączone" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Status połączenia" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Strona" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Strona B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Brak wypowiedzenia" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Oznacz zaplanowane" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Oznacz zainstalowany" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Status ścieżki" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Nieosiągalny" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Punkty końcowe ścieżki" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Nie podłączony" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Bez oznakowania" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Brak przypisanych sieci VLAN" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Wyczyść" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Wyczyść wszystko" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Głębokość montażu" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Jednostka startowa" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Jednostki malejące" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Elewacja szafy" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Dodaj interfejs podrzędny" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Prędkości/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Tryb PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Typ PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Tryb 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "Adres MAC" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Bezprzewodowe łącze" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanał" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Częstotliwość kanału" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Szerokość kanału" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Członkowie LGD" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Brak interfejsów członka" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Dodaj adres IP" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Element nadrzędny" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Identyfikator części" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Dodaj lokalizację dziecka" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Lokalizacje dzieci" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Dodawanie lokalizacji" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Dodawanie urządzenia" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Dodaj typ urządzenia" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Dodaj typ modułu" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Podłączone urządzenie" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Wykorzystanie (przydzielone" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Charakterystyka elektryczna" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Noga karmienia" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Dodaj źródła zasilania" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Maksymalne losowanie" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Przydzielone losowanie" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Wykorzystanie przestrzeni" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Waga szafy" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maksymalna waga" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Całkowita waga" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Obrazy i etykiety" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Tylko obrazy" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Tylko etykiety" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Dodaj rezerwację" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Wyświetl listę" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Wybierz widok szafy" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Sortuj wg" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Nie znaleziono szaf" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Wyświetl elewacje" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Szczegóły rezerwacji" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Dodaj szafę" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Pozycje" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Dodaj witrynę" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Regiony dziecięce" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Dodaj region" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Strefa czasowa" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Czas na stronie" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Adres fizyczny" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Adres wysyłki" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Grupy dzieci" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Dodaj grupę witryn" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Załącznik" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Dodaj członka" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Urządzenia członkowskie" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Dodaj nowego członka do wirtualnej obudowy %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Dodaj nowego członka" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Działania" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Zapisz i dodaj kolejny" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Edycja wirtualnej obudowy %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Szafa/jednostka" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Usuń członek wirtualnej obudowy" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12412,11 +13170,12 @@ msgstr "" "Czy na pewno chcesz usunąć %(device)s z wirtualnego " "podwozia %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identyfikator" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12424,11 +13183,11 @@ msgstr "" "Podczas tego żądania wystąpił błąd importu modułu. Typowe przyczyny " "obejmują:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Brakujące wymagane pakiety" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12444,11 +13203,11 @@ msgstr "" " uruchom zamrażanie pip z konsoli i porównaj dane wyjściowe z " "listą wymaganych pakietów." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Usługa WSGI nie została ponownie uruchomiona po aktualizacji" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12458,7 +13217,7 @@ msgstr "" "WSGI (np. gunicorn lub uwsGI) została ponownie uruchomiona. Zapewnia to " "uruchomienie nowego kodu." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12466,11 +13225,11 @@ msgstr "" "Podczas przetwarzania tego żądania wykryto błąd uprawnień do pliku. Typowe " "przyczyny obejmują:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Niewystarczające uprawnienia do zapisu do katalogu głównego nośnika" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12481,7 +13240,7 @@ msgstr "" "się, że użytkownik NetBox działa tak, jak ma dostęp do zapisu plików we " "wszystkich lokalizacjach w tej ścieżce." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12489,11 +13248,11 @@ msgstr "" "Podczas przetwarzania tego żądania wykryto błąd programowania bazy danych. " "Typowe przyczyny obejmują:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Brak migracji baz danych" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12504,11 +13263,11 @@ msgstr "" "Migracje można uruchamiać ręcznie, wykonując migracja python3 " "manage.py z wiersza poleceń." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Nieobsługiwana wersja PostgreSQL" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12518,99 +13277,102 @@ msgstr "" "sprawdzić, łącząc się z bazą danych za pomocą poświadczeń NetBox i wydając " "zapytanie dotyczące WYBIERZ WERSJĘ ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Plik danych powiązany z tym obiektem został usunięty" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Zsynchronizowane dane" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Synchronizuj dane" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Parametry środowiska" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Szablon" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Nazwa grupy" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Musi być wyjątkowy" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Klonowalne" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Wartość domyślna" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Szukaj wagi" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filtruj logikę" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Waga wyświetlacza" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Widoczny interfejs użytkownika" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Edytowalny interfejs użytkownika" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Reguły walidacji" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Wyrażenie regularne" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Klasa przycisków" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Przypisane modele" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Tekst linku" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "Adres URL łącza" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Resetuj pulpit" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12618,7 +13380,7 @@ msgstr "" "Spowoduje to usunięcie wszyscy skonfigurowane widżety i " "przywrócenie domyślnej konfiguracji pulpitu nawigacyjnego." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12626,159 +13388,161 @@ msgstr "" "Ta zmiana dotyczy tylko twój pulpit nawigacyjny i nie wpłynie na " "innych użytkowników." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "konfiguracja widżetu" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Zamknij widżet" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Dodawanie widżetu" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Nie dodano jeszcze żadnych zakładek." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Bez pozwolenia" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Brak uprawnień do przeglądania tych treści" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Nie można załadować treści. Nieprawidłowa nazwa widoku" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Nie znaleziono treści" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Wystąpił problem z pobieraniem kanału RSS" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Warunki" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Typ MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Rozszerzenie pliku" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Zaplanowane na" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Czas trwania" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Podsumowanie testu" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Dziennik" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Wyjście" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Ładowanie" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Wyniki oczekujące" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Wpis do dziennika" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Grupa powiadomień" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Brak przypisanych" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Kontekst konfiguracji lokalnej zastępuje wszystkie konteksty źródłowe" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Konteksty źródłowe" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Nowy wpis do dziennika" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Zgłoś" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Nie masz uprawnień do uruchamiania skryptów" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Uruchom skrypt" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Błąd ładowania skryptu" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Skrypt nie istnieje już w pliku źródłowym." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Ostatni bieg" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Skrypt nie jest już obecny w pliku źródłowym" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Nigdy" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Uruchom ponownie" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Nie znaleziono skryptów" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12787,81 +13551,83 @@ msgstr "" "Zacznij od utworzenia skryptu " "z przesłanego pliku lub źródła danych." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Wyniki" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Próg dziennika" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Wszystko" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Oznaczone przedmioty" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Dozwolone typy obiektów" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Dowolny" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Oznaczone typy przedmiotów" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Oznaczone obiekty" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Metoda HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Typ zawartości HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Weryfikacja SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Dodatkowe nagłówki" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Szablon ciała" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Tworzenie zbiorcze" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Wybrane obiekty" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "Dodać" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Usuwanie zbiorcze" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Potwierdź masowe usuwanie" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12872,65 +13638,68 @@ msgstr "" "%(type_plural)s. Proszę dokładnie przejrzeć wybrane obiekty i potwierdzić tę" " akcję." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Edycja" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Edycja zbiorcza" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Zastosuj" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Import zbiorczy" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Import bezpośredni" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Prześlij plik" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Zatwierdź" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Opcje pola" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Akcesoria" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "wyborów" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Wartość importu" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Format: RRRR-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Określ prawdę lub fałsz" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Wymagane pola musi być określony dla wszystkich obiektów." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12940,15 +13709,15 @@ msgstr "" "przykład, %(example)s zidentyfikowałby VRF za pomocą " "rozróżniacza trasy." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Usuwanie zbiorcze" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Potwierdź usuwanie zbiorcze" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12959,72 +13728,72 @@ msgstr "" "%(parent_obj)s. Proszę dokładnie zapoznać się z %(obj_type_plural)s do " "usunięcia i potwierdzenia poniżej." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Usuń te %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Zmiana nazwy" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Zbiorcza zmiana nazwy" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Obecna nazwa" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Nowa nazwa" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Podgląd" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Jesteś pewien" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Potwierdź" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Edytuj wybrane" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Usuń zaznaczone" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Dodaj nowy %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Wyświetl dokumentację modelu" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Pomoc" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Utwórz i dodaj kolejny" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtry" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13033,40 +13802,40 @@ msgstr "" "Wybierz wszyscy %(count)s " "%(object_type_plural)s pasujące zapytanie" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Dostępne nowe wydanie" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "jest dostępny" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Instrukcje uaktualnienia" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Odblokuj pulpit" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Zablokuj pulpit" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Dodaj widżet" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Zapisz układ" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Potwierdź usunięcie" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13075,40 +13844,40 @@ msgstr "" "Jesteś pewien, że chcesz usunąć " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Następujące obiekty zostaną usunięte w wyniku tej akcji." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "temu" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Brak nieprzeczytanych powiadomień" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Wszystkie powiadomienia" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Wybierz" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Resetuj" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Włącz tryb ciemny" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Włącz tryb oświetlenia" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13117,282 +13886,284 @@ msgstr "" "Zanim będziesz mógł dodać %(model)s musisz najpierw utworzyć " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Wybór strony" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Pokazują %(start)s-%(end)s z %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Opcje stronicowania" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Na stronę" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Dołącz obraz" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Powiązane obiekty" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Brak przypisanych tagów" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Dane nie są zsynchronizowane z plikiem poprzedzającym" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Szybkie wyszukiwanie" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Zapisany filtr" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Wyraźne zamawianie" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centrum pomocy" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Administrator Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Wyloguj się" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Zaloguj się" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Rodzina" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Data dodania" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Dodaj prefiks" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Numer AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Typ uwierzytelniania" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "klucz uwierzytelniania" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Wirtualne adresy IP" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Przypisz adres IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Tworzenie zbiorcze" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Utwórz grupę" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Wirtualne adresy IP" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Pokaż przypisane" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Pokaż dostępne" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Pokaż wszystko" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Globalny" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (na zewnątrz)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Przypisanie adresu IP" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Wybierz adres IP" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Wyniki wyszukiwania" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Masowe dodawanie adresów IP" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Adres początkowy" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Adres końcowy" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Oznaczone w pełni wykorzystane" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Szczegóły adresowania" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Adresy IP dla dzieci" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Dostępne adresy IP" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Pierwszy dostępny adres IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Szczegóły prefiksu" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Adres sieciowy" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Maska sieciowa" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Maska wieloznaczna" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Adres transmisji" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Dodaj zakres IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Ukryj wskaźniki głębokości" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Maksymalna głębokość" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Maksymalna długość" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Dodaj agregat" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importowanie plików VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Eksportowanie plików VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Importowanie L2VPN" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Eksportowanie L2VPN" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Dodaj prefiks" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Dodaj VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Rozróżniacz trasy" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Unikalna przestrzeń IP" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Błędy" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Zaloguj się" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Lub" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Awaria nośnika statycznego - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Awaria nośnika statycznego" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "" "Nie udało się załadować następującego statycznego pliku multimedialnego" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Sprawdź następujące" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13402,7 +14173,7 @@ msgstr "" "aktualizacji. Spowoduje to zainstalowanie najnowszej iteracji każdego pliku " "statycznego do statycznej ścieżki głównej." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13413,7 +14184,7 @@ msgstr "" "STATYCZNY KORZEŃ ścieżka. Zapoznaj się z dokumentacja instalacji dalszych wskazówek." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13422,548 +14193,571 @@ msgstr "" "Plik %(filename)s istnieje w statycznym katalogu głównym i jest" " czytelny przez serwer HTTP." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Kliknij tutaj aby spróbować ponownie załadować " "NetBox." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Kontakt" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Tytuł" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefon" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Grupa kontaktowa" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Dodaj grupę kontaktów" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Rola kontaktowa" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Dodawanie kontaktu" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Dodaj najemcę" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Grupa Najemców" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Dodaj grupę najemców" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Przypisane uprawnienia" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Pozwolenie" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Widok" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Ograniczenia" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Przydzieleni użytkownicy" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Przydzielone zasoby" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Wirtualne procesory" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Pamięć" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Miejsce na dysku" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Dodaj maszynę wirtualną" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Przypisz urządzenie" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Usuń zaznaczone" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Dodaj urządzenie do klastra %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Wybór urządzenia" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Dodawanie urządzeń" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Dodaj klaster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Grupa klastrów" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Typ klastra" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Wirtualny dysk" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Zasoby" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Dodaj dysk wirtualny" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Polityka IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Wersja IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Klucz wstępnie udostępniony" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Pokaż sekret" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Propozycje" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Propozycja IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Metoda uwierzytelniania" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Algorytm szyfrowania" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algorytm autoryzacji" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Grupa DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Żywotność SA (sekundy)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Polityka IPsec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Grupa PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Profil IPsec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Grupa PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Propozycja IPsec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Żywotność SA (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN Atrybuty" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Dodaj zakończenie" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Dodaj zakończenie" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Enkapsulacja" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Profil IPsec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Identyfikator tunelu" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Dodaj tunel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Grupa tuneli" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Zakończenie tunelu" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Zewnętrzny adres IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Zakończenia rówieśników" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Szyfr" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Dołączone interfejsy" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Dodaj bezprzewodową sieć LAN" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Grupa sieci bezprzewodowej sieci LAN" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Dodaj grupę sieci bezprzewodowej sieci LAN" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Właściwości łącza" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Dystans" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Nadrzędna grupa kontaktów (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Nadrzędna grupa kontaktów (identyfikator)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Grupa kontaktowa (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Grupa kontaktów (identyfikator)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Kontakt (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Rola kontaktowa (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Rola kontaktu (identyfikator)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Grupa kontaktowa" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Grupa nadrzędnych najemców (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Nadrzędna grupa najemców (identyfikator)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Grupa najemców (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Grupa najemców (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Grupa najemców (identyfikator)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Opisanie" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Przypisany kontakt" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "grupa kontaktowa" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "grupy kontaktowe" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "rola kontaktowa" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "role kontaktowe" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "tytuł" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "link" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "kontakt" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "łączność" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "przypisanie kontaktu" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "zadania kontaktowe" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Kontakty nie mogą być przypisane do tego typu obiektu ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "grupa najemców" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "grupy najemców" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Nazwa najemcy musi być niepowtarzalna dla każdej grupy." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Identyfikator najemcy musi być unikalny dla każdej grupy." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "najemcy" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "najemcy" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Tytuł kontaktu" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Telefon kontaktowy" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Kontakt e-mail" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Adres kontaktowy" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Link do kontaktu" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Opis kontaktu" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Zezwolenie (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Grupa powiadomień (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Imię" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Nazwisko" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Status personelu" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Status superużytkownika" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Jeśli klucz nie zostanie podany, zostanie wygenerowany automatycznie." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Jest personelem" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Jest superużytkownikiem" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Można wyświetlić" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Można dodać" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Może się zmienić" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Można usunąć" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Interfejs użytkownika" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13973,7 +14767,7 @@ msgstr "" "zapisać swój klucz przed przesłaniem tego formularza, ponieważ może" " nie być już dostępny po utworzeniu tokena." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13983,31 +14777,31 @@ msgstr "" " ograniczeń. Przykład: 10.1.1.0/24,192.168.10.16/32,2001: db 8:1: " ":/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Potwierdź hasło" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Wprowadź to samo hasło, co poprzednio, w celu weryfikacji." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "Hasła nie pasują! Sprawdź dane wejściowe i spróbuj ponownie." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Dodatkowe działania" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Działania udzielone w uzupełnieniu do wymienionych powyżej" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Obiekty" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14017,79 +14811,79 @@ msgstr "" "Pozostaw wartość null, aby pasowała do wszystkich obiektów tego typu. Lista " "wielu obiektów spowoduje logiczną operację OR." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Należy wybrać co najmniej jedną akcję." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Nieprawidłowy filtr dla {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Wykaz działań udzielonych niniejszym zezwoleniem" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "ograniczenia" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtr Queryset pasujący do odpowiednich obiektów wybranego typu (typów)" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "pozwolenie" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "zezwolenia" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "preferencje użytkownika" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Klucz '{path}'jest węzłem liścia; nie można przypisać nowych kluczy" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Klucz '{path}'jest słownikiem; nie może przypisać wartości innej niż słownik" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "wygasa" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "ostatnio używane" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "przycisk" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "włączony zapis" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Zezwalaj na operacje tworzenia/aktualizowania/usuwania przy użyciu tego " "klucza" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "dozwolone adresy IP" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14098,43 +14892,43 @@ msgstr "" " ograniczeń. Na przykład: „10.1.1.0/24, 192.168.10.16/32, 2001: DB 8:1: " ":/64”" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "żeton" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "tokeny" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "grupa" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "użytkownika" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Użytkownik z tą nazwą użytkownika już istnieje." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Akcje niestandardowe" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Powiązany obiekt nie został znaleziony przy użyciu podanych atrybutów: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Wiele obiektów pasuje do podanych atrybutów: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14144,44 +14938,44 @@ msgstr "" "numerycznego lub słownika atrybutów. Otrzymała nierozpoznaną wartość: " "{value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Powiązany obiekt nie został znaleziony przy użyciu podanego identyfikatora " "numerycznego: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} ma zdefiniowany klucz, ale CHOICES nie jest listą" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Waga musi być liczbą dodatnią" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Nieprawidłowa wartość '{weight}„dla wagi (musi być liczbą)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Nieznana jednostka {unit}. Musi być jednym z następujących elementów: " "{valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Długość musi być liczbą dodatnią" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Nieprawidłowa wartość '{length}„dla długości (musi być liczbą)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14190,15 +14984,15 @@ msgstr "" "Nie można usunąć {objects}. {count} Znaleziono obiekty " "zależne: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Ponad 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Kolor RGB w wersji szesnastkowej. Przykład: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14207,7 +15001,7 @@ msgstr "" "%s(%r) jest nieprawidłowy. parametr to_model do CounterCacheField musi być " "ciągiem w formacie „app.model”" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14216,36 +15010,36 @@ msgstr "" "%s(%r) jest nieprawidłowy. parametr to_field do CounterCacheField musi być " "ciągiem w formacie „field”" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Wprowadź dane obiektu w formacie CSV, JSON lub YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Ogranicznik CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Znak oddzielający pola CSV. Dotyczy tylko formatu CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "Dane formularza muszą być puste podczas przesyłania/wybierania pliku." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Nieznany format danych: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Nie można wykryć formatu danych. Proszę określić." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Nieprawidłowy separator CSV" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14253,7 +15047,7 @@ msgstr "" "Nieprawidłowe dane YAML. Dane muszą mieć formę wielu dokumentów lub jednego " "dokumentu zawierającego listę słowników." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14262,7 +15056,7 @@ msgstr "" "Nieprawidłowa lista ({value}). Musi być numeryczny, a zakresy muszą być w " "kolejności rosnącej." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14270,7 +15064,7 @@ msgstr "" "Określ jeden lub więcej zakresów liczbowych oddzielonych przecinkami. " "Przykład: 1-5.20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14278,17 +15072,18 @@ msgstr "" "Nieprawidłowe zakresy ({value}). Musi być zakresem liczb całkowitych w " "kolejności rosnącej." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Nieprawidłowa wartość pola wyboru wielokrotnego wyboru: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Obiekt nie został znaleziony: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14297,20 +15092,20 @@ msgstr "" "„{value}„nie jest unikalną wartością dla tego pola; znaleziono wiele " "obiektów" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "„{field_name}„jest nieprawidłową nazwą pola dostępu." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Typ obiektu musi być określony jako”.„" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Nieprawidłowy typ obiektu" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14320,7 +15115,7 @@ msgstr "" "przypadki i typy w jednym zakresie nie są obsługiwane (przykład: [ge, " "xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14328,7 +15123,7 @@ msgstr "" "Określ zakres numeryczny, aby utworzyć wiele adresów IP.
    Przykład: " "192.0.2.[1,5,100-254]/24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown składnia jest obsługiwana" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Przyjazny dla adresów URL unikatowy skrót" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Wprowadź dane kontekstowe w JSON format." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "Adres MAC musi być w formacie EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Używanie wyrażeń regularnych" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Numeryczny identyfikator istniejącego obiektu do aktualizacji (jeśli nie " "zostanie utworzony nowy obiekt)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Nierozpoznany nagłówek: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Dostępne kolumny" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Wybrane kolumny" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14382,13 +15177,13 @@ msgstr "" "Ten obiekt został zmodyfikowany od czasu renderowania formularza. " "Szczegółowe informacje można znaleźć w dzienniku zmian obiektu." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Zasięg”{value}„jest nieważny." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14397,71 +15192,71 @@ msgstr "" "Nieprawidłowy zakres: wartość końcowa ({end}) musi być większa niż wartość " "początkowa ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Zduplikowany lub sprzeczny nagłówek kolumny dla”{field}„" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Zduplikowany lub sprzeczny nagłówek kolumny dla”{header}„" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Wiersz {row}: Oczekiwane {count_expected} kolumny, ale znalezione " "{count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Nieoczekiwany nagłówek kolumny”{field}„znaleziono." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Kolumna”{field}„nie jest obiektem powiązanym; nie może używać kropek" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Nieprawidłowy atrybut obiektu powiązanego dla kolumny”{field}„: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Wymagany nagłówek kolumny”{header}„Nie znaleziono." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Brak wymaganej wartości dla parametru zapytania dynamicznego: " "'{dynamic_params}”" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Brak wymaganej wartości dla parametru zapytania statycznego: " "'{static_params}”" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Hasło musi zawierać co najmniej jedną cyfrę." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Hasło musi mieć co najmniej jedną wielką literę." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Hasło musi zawierać co najmniej jedną małą literę." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14469,7 +15264,7 @@ msgstr "" "Twoje hasło musi zawierać co najmniej jedną cyfrę, jedną wielką literę i " "jedną małą literę." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14478,125 +15273,125 @@ msgstr "" "Nieprawidłowa nazwa uprawnienia: {name}. Musi być w formacie " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Nieznany app_label/model_name dla {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Nieprawidłowy adres IP ustawiony dla {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Kolumna o nazwie {name} jest już zdefiniowany dla tabeli {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Niezdefiniowane" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Usuń zakładkę" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Zakładka" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Klonowanie" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Bieżący widok" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Wszystkie dane" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Dodaj szablon eksportu" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Import" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Anuluj subskrypcję" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Subskrybuj" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Kopiuj do schowka" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "To pole jest wymagane" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Ustaw Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Wyczyść wszystko" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Konfiguracja tabeli" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Przesuń w górę" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Przesuń w dół" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Szukaj..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Szukaj NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Otwórz selektor" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Napisz" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Test musi zdefiniować csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} nie jest prawidłowym wyrażeniem regularnym." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__} musi zaimplementować get_required_permit ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} musi zaimplementować get_required_permit ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14606,61 +15401,63 @@ msgstr "" "ObjectPermissionRequiredMixIn może być używany tylko w widokach, które " "definiują podstawowy zestaw zapytań" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Grupa nadrzędna (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Grupa nadrzędna (identyfikator)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Typ klastra (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Klaster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "VCPU" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Pamięć (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Rodzaj klastra" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Przypisana grupa klastrów" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Przypisany klaster" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Przypisane urządzenie w klastrze" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Numer seryjny" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14668,50 +15465,50 @@ msgid "" msgstr "" "{device} należy do innej strony ({device_site}) niż klaster ({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Opcjonalnie przypiąć tę maszynę wirtualną do określonego urządzenia hosta w " "klastrze" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Witryna/Klaster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "Rozmiar dysku jest zarządzany poprzez załączenie dysków wirtualnych." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Dysk" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "typ klastra" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "typy klastrów" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "grupa klastra" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "grupy klastrów" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "klastra" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "gromady" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14720,42 +15517,42 @@ msgstr "" "{count} urządzenia są przypisane jako hosty dla tego klastra, ale nie są w " "witrynie {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "pamięć (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "dysk (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Nazwa maszyny wirtualnej musi być unikatowa dla każdego klastra." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "maszyna wirtualna" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "maszyny wirtualne" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Maszyna wirtualna musi być przypisana do witryny i/lub klastra." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "Wybrany klaster ({cluster}) nie jest przypisany do tej witryny ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Musi określić klaster podczas przypisywania urządzenia hosta." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14763,7 +15560,7 @@ msgstr "" "Wybrane urządzenie ({device}) nie jest przypisany do tego klastra " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14772,17 +15569,17 @@ msgstr "" "Określony rozmiar dysku ({size}) musi odpowiadać zagregowanemu rozmiarowi " "przypisanych dysków wirtualnych ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Musi być IPV{family} adres. ({ip} jest IPV{version} adres.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Podany adres IP ({ip}) nie jest przypisany do tej maszyny wirtualnej." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14791,7 +15588,7 @@ msgstr "" "Wybrany interfejs nadrzędny ({parent}) należy do innej maszyny wirtualnej " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14800,7 +15597,7 @@ msgstr "" "Wybrany interfejs mostu ({bridge}) należy do innej maszyny wirtualnej " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14809,393 +15606,416 @@ msgstr "" "Nieoznaczona sieć VLAN ({untagged_vlan}) musi należeć do tej samej witryny " "co macierzysta maszyna wirtualna interfejsu lub musi być globalna." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "rozmiar (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "dysk wirtualny" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "dyski wirtualne" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Dodano {count} urządzenia do klastrowania {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Usunięto {count} urządzenia z klastra {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Transport" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP w IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GREE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Piasta" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Mówił" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agresywny" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Główny" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Wstępnie udostępnione klucze" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certyfikaty" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Podpisy RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Podpisy DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Grupa {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Prywatna sieć LAN Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Wirtualna prywatna sieć LAN Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Prywatne drzewo Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Wirtualne prywatne drzewo Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Grupa tuneli (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Grupa tunelowa (ślimak)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Profil IPsec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Profil IPsec (nazwa)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tunel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tunel (nazwa)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Zewnętrzny adres IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Polityka IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Polityka IKE (nazwa)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Polityka IPsec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Polityka IPsec (nazwa)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (identyfikator)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Interfejs maszyny wirtualnej (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (nazwa)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Grupa tuneli" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Żywotność SA" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Klucz wstępnie udostępniony" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Polityka IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Polityka IPsec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Enkapsulacja tunelu" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Rola operacyjna" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Urządzenie nadrzędne przypisanego interfejsu" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Nadrzędna maszyna wirtualna przypisanego interfejsu" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interfejs urządzenia lub maszyny wirtualnej" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Propozycje IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Grupa Diffie-Hellman dla Perfect Forward Secretary" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Propozycje IPsec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protokół IPsec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Typ L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Urządzenie nadrzędne (dla interfejsu)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Nadrzędna maszyna wirtualna (dla interfejsu)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Przypisany interfejs (urządzenie lub maszyna wirtualna)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Nie można jednocześnie importować zakończeń interfejsu urządzenia i maszyny " "wirtualnej." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Każde zakończenie musi określać interfejs lub sieć VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Nie można przypisać zarówno interfejsu, jak i sieci VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Wersja IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Propozycja" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Przypisany typ obiektu" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Interfejs tunelu" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Pierwsze zakończenie" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Drugie zakończenie" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Ten parametr jest wymagany przy definiowaniu zakończenia." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Polityka" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Zakończenie musi określać interfejs lub sieć VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Zakończenie może mieć tylko jeden obiekt końcowy (interfejs lub sieć VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "algorytm szyfrowania" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "algoritm uwierzytelniania" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Identyfikator grupy Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Żywotność skojarzenia zabezpieczeń (w sekundach)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Propozycja IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Propozycje IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "wersji" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "oferty" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "klucz wstępnie udostępniony" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Zasady IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Tryb jest wymagany dla wybranej wersji IKE" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Tryb nie może być używany dla wybranej wersji IKE" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "szyfrowanie" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "poświadczenie" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Żywotność skojarzenia zabezpieczeń (sekundy)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Żywotność skojarzenia zabezpieczeń (w kilobajtach)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Propozycja IPsec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Propozycje IPsec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Należy zdefiniować algorytm szyfrowania i/lub uwierzytelniania" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Zasady IPsec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Profile IPsec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Zakończenie L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Zakończenia L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Zakończenie L2VPN już przypisane ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15204,187 +16024,195 @@ msgstr "" "{l2vpn_type} L2VPN nie mogą mieć więcej niż dwóch terminów; znaleziono " "{terminations_count} już zdefiniowane." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "grupa tuneli" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "grupy tuneli" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "hermetyzacja" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "Identyfikator tunelu" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tunel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tunele" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Obiekt może zostać zakończony tylko jednym tunelem naraz." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "zakończenie tunelu" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "zakończenia tunelu" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} jest już przymocowany do tunelu ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Metoda uwierzytelniania" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Algorytm szyfrowania" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algorytm autoryzacji" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Żywotność SA" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Klucz wstępnie udostępniony" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Żywotność SA (sekundy)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Żywotność SA (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Nadrzędny obiekt" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Strona obiektu" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Punkt dostępu" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Stacja" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Otwórz" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Przedsiębiorstwo" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Szyfr uwierzytelniania" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Jednostka odległości" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Zmostkowana sieć VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interfejs A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interfejs B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Strona B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "szyfr uwierzytelniania" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "grupa sieci bezprzewodowej LAN" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "grupy sieci bezprzewodowej LAN" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "bezprzewodowa sieć LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interfejs A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interfejs B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "odstęp" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "jednostka odległości" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "łącze bezprzewodowe" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "łącza bezprzewodowe" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "Należy określić jednostkę podczas ustawiania odległości bezprzewodowej" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} nie jest interfejsem bezprzewodowym." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Nieprawidłowa wartość kanału: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Nieprawidłowy atrybut kanału: {name}" diff --git a/netbox/translations/pt/LC_MESSAGES/django.mo b/netbox/translations/pt/LC_MESSAGES/django.mo index 96c602259ecc4f8a866fb81962f4557639b08407..644e274a473c9fbb8f592ed13e013bcac865cfd8 100644 GIT binary patch delta 66062 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 aLDj&akG=MM4s3VRdvcS&Mg@GTRR15WsHx=u delta 66343 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 TecJ?e?dIQk+xL8-Yt;B3t}G7m diff --git a/netbox/translations/pt/LC_MESSAGES/django.po b/netbox/translations/pt/LC_MESSAGES/django.po index d3ea03c89..aa6fa39b2 100644 --- a/netbox/translations/pt/LC_MESSAGES/django.po +++ b/netbox/translations/pt/LC_MESSAGES/django.po @@ -14,7 +14,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Fabricio Maciel, 2024\n" "Language-Team: Portuguese (https://app.transifex.com/netbox-community/teams/178115/pt/)\n" @@ -24,1877 +24,2143 @@ msgstr "" "Language: pt\n" "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Chave" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Permissão de Escrita" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Criado" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Expira" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Usado pela Última Vez" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "IPs Permitidos" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Logado como {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Você se desconectou." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Suas preferências foram atualizadas." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "As credenciais de usuário autenticadas pelo LDAP não podem ser alteradas no " "NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Sua senha foi alterada com sucesso." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Planejado" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Provisionamento" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Ativo" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Offline" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Em Desprovisionamento" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Descomissionado" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Primário" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Secundário" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Terciário" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Inativo" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Região (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Região (slug)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Grupo de sites (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Grupo de sites (slug)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Site" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Site (slug)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Provedor (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Provedor (slug)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Conta do provedor (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Conta do provedor (conta)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Rede do provedor (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Tipo de circuito (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Tipo de circuito (slug)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Site (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Terminação A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Busca" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Circuito" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Rede do provedor (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Circuito (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Circuito (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Grupo de circuitos (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Grupo de circuitos (slug)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASNs" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Descrição" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Provedor" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "ID do serviço" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Cor" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Tipo" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Conta do provedor" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Status" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Inquilino" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Data de ativação" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Data de desativação" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Taxa garantida (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Parâmetros do serviço" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Locação" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Rede do Provedor" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Velocidade da porta (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Velocidade de upstream (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Marcar como conectado" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Terminação do Circuito" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Detalhes da Terminação" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Prioridade" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Provedor designado" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Conta de provedor designada" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Tipo de circuito" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Status operacional" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Inquilino designado" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Terminação" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Rede do provedor" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Localização" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Contatos" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Região" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Grupo de sites" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Atributos" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Conta" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Lado da Terminação" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Atribuição" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Grupo" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Grupo de Circuitos" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "cor" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "tipo de circuito" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "tipos de circuitos" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ID do circuito" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "ID única do circuito" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "status" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "instalado" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "encerramento" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "taxa garantida (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Taxa garantida" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "circuito" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "circuitos" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "grupo de circuitos" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "grupos de circuitos" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "prioridade" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Atribuição do grupo de circuitos" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Atribuições do grupo de circuitos" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "terminação" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "velocidade da porta (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Velocidade do circuito físico" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "velocidade de upstream (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Velocidade de upstream, se diferente da velocidade da porta" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ID da conexão cruzada" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID da conexão cruzada local" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "patch panel/porta(s)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "ID do patch panel e número da(s) porta(s)" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "descrição" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "terminação do circuito" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "terminações dos circuitos" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Uma terminação de circuito deve ser conectada a um site ou a uma rede do " "provedor." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Uma terminação de circuito não pode ser conectada ao mesmo tempo a um site e" " a uma rede do provedor." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "nome" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Nome completo do provedor" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "slug" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "provedor" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "provedores" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "ID da conta" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "conta de provedor" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "contas de provedores" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "ID do serviço" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "rede do provedor" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "redes dos provedores" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Nome" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Circuitos" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "ID do Circuito" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Lado A" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Lado Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Taxa Garantida" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Comentários" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Atribuições" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Contas" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Quantidade de contas" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Quantidade de ASNs" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Nenhuma terminação foi definida para o circuito {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Terminações trocadas para o circuito {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Este usuário não tem permissão para sincronizar esta origem de dados." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Novo" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "Em Fila" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Sincronizando" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Concluído" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Falhou" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Scripts" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Relatórios" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Pendente" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Agendado" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Em Execução" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Falhou" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Atualizado" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Excluído" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Concluído" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Iniciado" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Adiado" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Parado" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Cancelado" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Local" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Nome de Usuário" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Usado apenas para clonagem com HTTP(S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Senha" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Filial" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Falha na obtenção de dados remotos ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "ID da chave de acesso da AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Chave de acesso secreta da AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Objeto criado" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Objeto atualizado" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Objeto excluído" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Tarefa iniciada" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Tarefa completada" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Tarefa com falha" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Tarefa com erro" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Origem de dados (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Origem de dados (nome)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Usuário (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Nome de usuário" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Habilitado" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parâmetros" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ignorar regras" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Origem de dados" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Arquivo" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Origem de dados" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Criação" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Tipo de Objeto" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Criado após" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Criado antes" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Programado após" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Programado antes" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Iniciado após" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Iniciado antes" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Concluído após" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Concluído antes" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Usuário" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Tempo" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Depois" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Antes" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Ação" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Origem" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Parâmetros de Backend" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Upload de Arquivo" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "" "Não é possível carregar um arquivo e sincronizar a partir de um arquivo " "existente" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "É necessário carregar um arquivo ou selecionar um arquivo de dados para " "sincronizar" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Elevações de Rack" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Alimentação Elétrica" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Segurança" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Banners" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Paginação" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Validação" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Preferências de Usuário" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Diversos" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Revisão da Configuração" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Este parâmetro foi definido estaticamente e não pode ser modificado." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Valor atual: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (padrão)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "horas" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "nome de usuário" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "ID da solicitação" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "ação" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "dados pré-alteração" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "dados pós-alteração" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "mudança no objeto" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "mudanças no objeto" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "Changelog não é suportado para este tipo de objeto ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "criado" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "comentário" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "dados de configuração" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "revisão da configuração" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "revisões da configuração" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Configuração padrão" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Configuração atual" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Revisão da configuração #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "tipo" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "ativado" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ignorar regras" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Padrões (um por linha) de correspondencia de arquivos a serem ignorados ao " "sincronizar" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parâmetros" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "última sincronização" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "origem de dados" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "origens de dados" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Tipo de backend desconhecido: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "" "Não é possível iniciar a sincronização; a sincronização já está em " "andamento." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1902,1222 +2168,1284 @@ msgstr "" "Houve um erro ao inicializar o backend. Uma dependência precisa ser " "instalada: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "última atualização" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "caminho" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Caminho de arquivo relativo à raiz da origem de dados" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "tamanho" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "hash" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "O comprimento deve ser de 64 caracteres hexadecimais." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Hash SHA256 do arquivo de dados" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "arquivo de dados" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "arquivos de dados" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "registro de sincronização automática" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "registros de sincronização automática" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "raíz do arquivo" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "caminho do arquivo" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Caminho do arquivo em relação ao caminho raíz designado" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "arquivo gerenciado" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "arquivos gerenciados" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "agendado" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "intervalo" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Intervalo de recorrência (em minutos)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "iniciado" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "concluído" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "dados" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "erro" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ID da tarefa" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "tarefa" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "tarefas" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Tarefas não podem ser atribuídas a este tipo de objeto ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "Status inválido para encerramento da tarefa. As opções são: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue() não pode ser chamado com valores para ambos schedule_at e " "immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "A exclusão é impedida por uma regra de proteção: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Nome Completo" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Objeto" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "ID da Solicitação" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Está Ativo" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Caminho" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Última atualização" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Intervalo" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Versão" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Última Atualização" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Versão Mínima do Netbox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Versão Máxima do Netbox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Nenhum dado do plugin encontrado" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Autor" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Instalado" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Certificado" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Publicado" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Versão Instalada" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Última Versão" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Tarefa mais Antiga" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Agentes" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Host" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Porta" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "Banco de Dados" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Agendador PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Nenhuma fila foi encontrada" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "Enfileirado" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Finalizado" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Chamável" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Nenhuma tarefa encontrada" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Estado" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Começo" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Nenhum agente encontrado" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Tarefa {id} enfileirada para sincronizar {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Revisão da configuração nº {id} restaurada" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Tarefa {job_id} não encontrada" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Tarefa {id} foi excluída." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Erro ao excluir a tarefa {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Tarefa {id} não encontrada." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Tarefa {id} foi reenfileirada." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Tarefa {id} foi enfileirada." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Tarefa {id} foi interrompida." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Falha ao interromper a tarefa {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Catálogo de plugins não pode ser carregado" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Plugin {name} não encontrado" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Posição (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "ID do Facility" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Em Preparação" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Em Descomissionamento" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Desativado" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "Rack aberto de 2 colunas" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "Rack aberto de 4 colunas" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Rack fechado" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Bracket de parede" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Bracket de parede (vertical)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Rack de parede" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Rack de parede (vertical)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} polegadas" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Reservado" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Disponível" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Obsoleto" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Milímetros" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Polegadas" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Frente para trás" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Trás para frente" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Pai" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Filho" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Frente" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Traseira" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Preparado" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Inventário" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Esquerda para direita" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Direita para esquerda" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Lado para trás" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "De trás para o lado" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "De baixo para cima" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "De cima para baixo" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Passivo" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Misto" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (sem trava)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (twist-lock)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "California Standard" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Internacional/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Proprietário" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Outros" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Internacional" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Físico" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Virtual" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Wireless" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Interfaces virtuais" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Bridge" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Link Aggregation (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (fixa)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modular)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (backplane)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Celular" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Serial" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Coaxial" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Empilhamento" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Half" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Full" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Automático" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Acesso" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Tagueada" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Tagueada (Todos)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Padrão IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "24V passivo (2 pares)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "24V passivo (4 pares)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "48V passivo (2 pares)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "48V passivo (4 pares)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Cabo Metálico" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fibra Óptica" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fibra" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Conectado" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Quilômetros" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Metros" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Centímetros" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Milhas" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Pés" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Quilogramas" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramas" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Libras" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Onças" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Redundante" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Monofásico" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Trifásico" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Formato de endereço MAC inválido: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Formato WWN inválido: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Região principal (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Região principal (slug)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Grupo de sites principais (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Grupo de sites principais (slug)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Grupo (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Grupo (slug)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Localização principal (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Localização principal (slug)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Localização (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Localização (slug)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Fabricante (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Fabricante (slug)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Tipo de rack (slug)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Tipo de rack (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Função (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Função (slug)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Rack (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Usuário (nome)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Plataforma padrão (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Plataforma padrão (slug)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Possui imagem frontal" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Possui imagem traseira" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Possui portas de console" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Possui portas de servidor de console" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Possui portas de alimentação" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Possui tomadas elétricas" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Possui interfaces" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Possui portas passthrough" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Possui compartimentos de módulos" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Possui compartimentos de dispositivos" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Possui itens de inventário" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Tipo de dispositivo (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Tipo de módulo (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Porta de alimentação (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Item principal do inventário (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Modelo de configuração (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Tipo de dispositivo (slug)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Dispositivo Pai (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Plataforma (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Plataforma (slug)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Nome do site (slug)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Compartimento Pai (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Cluster de VMs (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Grupo de clusters (slug)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Grupo de clusters (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Modelo do dispositivo (slug)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "É full-depth" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "Endereço MAC" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Possui IP primário" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Possui IP fora de banda" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Chassi virtual (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "É membro do chassi virtual" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "IP Fora de Banda (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Possui contexto de dispositivo virtual" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "Contexto de Dispositivo Virtual (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Modelo de dispositivo" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interface (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Tipo de módulo (modelo)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Compartimento de módulo (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Dispositivo (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Rack (nome)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Dispositivo (nome)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Tipo de dispositivo (modelo)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Função do dispositivo (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Função do dispositivo (slug)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Chassi Virtual (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Chassi Virtual" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Módulo (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Cabo (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "VLAN Designada" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "VLAN ID Designada " -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Interfaces de Chassi Virtual para Dispositivo" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Interfaces de Chassi Virtual para Dispositivo (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Tipo de interface" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Interface pai (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Interface bridged (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Interface LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Contexto de Dispositivo Virtual" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Contexto de Dispositivo Virtual (ID)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Rede Wireless" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Link Wireless" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Compartimento de módulo pai (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Módulo instalado (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Dispositivo instalado (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Dispositivo instalado (nome)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Mestre (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Mestre (nome)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Inquilino (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Inquilino (slug)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Não terminado" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Quadro de alimentação (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Etiquetas" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Posição" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3125,842 +3453,922 @@ msgstr "" "Intervalos alfanuméricos são suportados. (Devem corresponder ao número de " "nomes que estão sendo criados.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Contato" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Telefone de Contato" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "E-mail de Contato" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Fuso horário" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Fabricante" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Formato físico" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Largura" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Altura (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Unidades descendentes" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Largura externa" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Profundidade externa" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Unidade externa" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Profundidade de montagem" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Peso" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Peso máximo" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Unidade de peso" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Tipo de Rack" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dimensões externas" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Dimensões" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numeração" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Função" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Tipo de rack" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Número de Série" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Etiqueta de patrimônio" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Fluxo de Ar" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Rack" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Hardware" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Plataforma padrão" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Part number" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Altura em U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Excluir da utilização" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Tipo de Dispositivo" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Tipo de Módulo" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Chassi" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Função da VM" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Modelo de configuração" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Tipo de dispositivo" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Função do dispositivo" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Plataforma" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Cluster" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Dispositivo" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Configuração" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Virtualização" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Tipo de módulo" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Rótulo" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Comprimento" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Unidade de comprimento" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Domínio" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Quadro de alimentação" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Tipo de Alimentação" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Fase" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Tensão" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Corrente" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Utilização máxima" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Consumo máximo" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Consumo máximo de energia (Watts)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Consumo alocado" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Consumo de energia alocado (Watts)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Porta de alimentação" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Ramal de alimentação" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Somente gerenciamento" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Modo de Operação" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Tipo de PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Função do Wireless" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Módulo" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Contextos de dispositivos virtuais" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Velocidade" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Modo" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Grupo de VLANs" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN Não Tagueada" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLANs Tagueadas" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "Adicionar VLANs tagueadas" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "Remover VLANs tagueadas" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Grupo da Rede Wireless" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Redes Wireless" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Endereçamento" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operação" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Interfaces Relacionadas" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Comutação 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "Adicionar/Remover" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "O modo de interface deve ser especificado para atribuir VLANs" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Uma interface de acesso não pode ter VLANs tagueadas." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Nome da região principal" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Nome do grupo de sites principais" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Região designada" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Grupo designado" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "opções disponíveis" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Site designado" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Localização principal" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Localização não encontrada." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Fabricante deste tipo de rack" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "A numeração de posição mais baixa no rack" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Largura de trilho a trilho (em polegadas)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Unidade para dimensões externas" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Unidade de peso do rack" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Nome do inquilino designado" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Nome da função designada" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Direção do fluxo de ar" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Site principal" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Localização do rack (se houver)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Unidades" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Lista separada por vírgula de unidades individuais" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Fabricante que produz este tipo de dispositivo" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "A plataforma padrão para dispositivos deste tipo (opcional)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Peso do dispositivo" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Unidade de peso do dispositivo" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Peso do módulo" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Unidade de peso do módulo" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Limitar as atribuições de plataforma a este fabricante" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Função designada" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Fabricante do tipo de dispositivo" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Modelo do tipo de dispositivo" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Plataforma designada" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Chassi virtual" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Cluster de virtualização" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Local designado (se houver)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Rack designado (se houver)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Face" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Face do rack em que está montado" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Dispositivo pai (para dispositivos filhos)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Compartimento de dispositivos" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Compartimento de dispositivos no qual este dispositivo está instalado (para " "dispositivos filhos)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "O dispositivo no qual este módulo está instalado" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Compartimento de módulo" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "O compartimento no qual este módulo está instalado" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "O tipo de módulo" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Replicar componentes" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3968,266 +4376,273 @@ msgstr "" "Popular automaticamente os componentes associados a este tipo de módulo " "(ativado por padrão)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Adotar componentes" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Adotar componentes já existentes" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Tipo de porta" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Velocidade da porta em bps" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Tipo de tomada" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Porta de alimentação local que alimenta esta tomada" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Fase (para circuitos trifásicos)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Interface pai" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Interface bridged" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "LAG" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Interface LAG pai" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Contextos de Dispositivos Virtuais" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Nomes de contextos de dispositivos virtuais separados por vírgulas, entre " "aspas duplas. Exemplo:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Meio físico" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Duplex" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Modo de operação do PoE" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Tipo de PoE" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Modo de operação do IEEE 802.1Q (para interfaces L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "VRF designado" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Função RF" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Função do Wireless (AP/Station)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "" "Contexto de dispositivo virtual {vdc} não está associado ao dispositivo " "{device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Porta traseira" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Porta traseira correspondente" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Tipo de conexão do meio físico" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Dispositivo instalado" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Dispositivo filho instalado neste compartimento" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Dispositivo filho não encontrado." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Item pai do inventário" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Tipo de componente" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Tipo de Componente" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Nome do componente" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Nome do Componente" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Componente não encontrado: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Dispositivo no lado A" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Nome do dispositivo" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Tipo de terminação no lado A" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Tipo de terminação" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Nome da terminação no lado A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Nome da terminação" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Dispositivo no lado B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Tipo de terminação no lado B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Nome da terminação no lado B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Status da conexão" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Lado {side_upper}: {device} {termination_object} já está conectado" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr " Terminação {side_upper} não encontrada: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Mestre" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Dispositivo mestre" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Nome do site principal" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Quadro de alimentação" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Primário ou redundante" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Tipo de alimentação (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Monofásico ou trifásico" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "IPv4 Primário" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Endereço IPv4 com máscara, por exemplo, 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "IPv6 Primário" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Endereço IPv6 com tamanho de prefixo, por exemplo, 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4236,7 +4651,7 @@ msgstr "" "As VLANs tagueadas ({vlans}) devem pertencer ao mesmo site do dispositivo/VM" " pai da interface ou devem ser globais." -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4244,7 +4659,7 @@ msgstr "" "Não é possível instalar o módulo com valores de espaço reservado em um " "compartimento de módulo sem a sua posição definida." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4254,187 +4669,198 @@ msgstr "" "compartimento de módulos {level} na árvore, pois foram fornecidos {tokens} " "espaços reservados" -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Não é possível adotar {model} {name} pois já pertence a outro módulo." -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "Um {model} com nome {name} já existe." -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Quadro de Alimentação" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Fontes de Alimentação" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Lado" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Status do Dispositivo" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Região principal" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Grupo principal" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Facility" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Tipo de rack" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Função" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Imagens" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Componentes" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Função do subdispositivo" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modelo" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Possui um IP fora de banda" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Membro do chassi virtual" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Possui contextos de dispositivos virtuais" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Grupo de clusters" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Cabeado" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Ocupado" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Conexão" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Tipo" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Somente gerenciamento" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Canal do Wireless" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Frequência do canal (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Largura do canal (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Potência de transmissão (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Cabo" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Descoberto" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Já existe um membro no chassi virtual na posição {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Informações de Contato" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Função do Rack" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Slug" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Selecione um tipo pré-definido de rack, ou ajuste as características abaixo." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Controle de Inventário" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4442,145 +4868,172 @@ msgstr "" "Lista separada por vírgulas de números de IDs. Um intervalo pode ser " "especificado usando hífen." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Reserva" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Função do Dispositivo" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "A unidade mais baixa ocupada pelo dispositivo" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "A posição no chassi virtual pela qual este dispositivo é identificado" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "A prioridade do dispositivo no chassi virtual" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "" "Popular automaticamente os componentes associados a este tipo de módulo" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Características" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Modelo da porta de console" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Modelo da porta do servidor de console" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Modelo da porta frontal" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Modelo da interface" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Modelo da tomada elétrica" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Modelo da porta de alimentação" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Modelo da porta traseira" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Interface" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Porta de Console" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Porta do Servidor de Console" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Porta Frontal" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Porta Traseira" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Porta de Alimentação" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Tomada Elétrica" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Atribuição de Componentes" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Um item de inventário só pode ser associado a um único componente." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Interface LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Filtre as VLANs disponíveis para atribuição por grupo." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Dispositivo Filho" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4588,32 +5041,35 @@ msgstr "" "Os dispositivos filhos devem primeiro ser criados e atribuídos ao site e ao " "rack do dispositivo pai." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Porta de console" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Porta do servidor de console" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Porta frontal" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Tomada elétrica" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Item de Inventário" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Função do Item de Inventário" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4621,7 +5077,7 @@ msgstr "" "Intervalos alfanuméricos são suportados. (Deve corresponder ao número de " "objetos a serem criados.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4630,18 +5086,19 @@ msgstr "" "O padrão fornecido especifica {value_count} valores, mas {pattern_count} são" " esperados." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Portas traseiras" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Selecione uma atribuição de porta traseira para cada porta frontal que está " "sendo criada." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4651,16 +5108,7 @@ msgstr "" "deve corresponder ao número selecionado de posições dE porta traseira " "({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"A string {module} será substituída pela posição do módulo " -"designado, se houver." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4670,17 +5118,18 @@ msgstr "" "corresponder ao número selecionado de posições de portas traseiras " "({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Membros" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Posição inicial" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4688,68 +5137,70 @@ msgstr "" "Posição do primeiro dispositivo membro. Aumenta em um para cada membro " "adicional." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "" "Uma posição deve ser especificada para o primeiro membro do chassi virtual." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "rótulo" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "comprimento" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "unidade de comprimento" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "cabo" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "cabos" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Deve especificar uma unidade ao definir o comprimento do cabo" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Terminações A e B devem ser definidas ao criar um novo cabo." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Não é possível conectar diferentes tipos de terminação à mesma extremidade " "do cabo." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Tipos de terminações incompatíveis: {type_a} e {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "As terminações A e B não podem se conectar ao mesmo objeto." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "fim" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "terminação de cabo" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "terminações de cabos" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4758,38 +5209,38 @@ msgstr "" "Terminação duplicada encontrada para {app_label}.{model} {termination_id}: " "cabo {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Os cabos não podem ser terminados em interfaces {type_display}" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "As terminações de circuito conectadas a uma rede de provedor não podem ser " "cabeadas." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "está ativo" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "está completo" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "é dividido" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "caminho do cabo" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "caminhos do cabos" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4798,18 +5249,18 @@ msgstr "" "{module} é aceito como substituto para a posição do compartimento do módulo " "quando conectado a um tipo de módulo." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Rótulo físico" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "" "Os modelos de componentes não podem ser movidos para um tipo diferente de " "dispositivo." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4817,7 +5268,7 @@ msgstr "" "Um modelo de componente não pode ser associado a um tipo de dispositivo e " "módulo ao mesmo tempo." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4825,138 +5276,138 @@ msgstr "" "Um modelo de componente deve estar associado a um tipo de dispositivo ou a " "um tipo de módulo." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "modelo de porta de console" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "modelos de porta de console" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "modelo de porta de servidor de console" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "modelos de porta de servidor de console" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "consumo máximo" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "consumo alocado" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "modelo de porta de alimentação" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "modelos de porta de alimentação" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "O consumo alocado não pode exceder o consumo máximo ({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "ramal de alimentação" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Fase (para alimentação trifásica)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "modelo de tomada elétrica" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "modelos de tomadas elétricas" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Porta de alimentação principal ({power_port}) deve pertencer ao mesmo tipo " "de dispositivo" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Porta de alimentação principal ({power_port}) deve pertencer ao mesmo tipo " "de módulo" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "somente gerenciamento" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "interface bridge" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "função do wireless" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "modelo de interface" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "modelos de interface" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Uma interface não pode ser conectada a si mesma." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Interface bridge ({bridge}) deve pertencer ao mesmo tipo de dispositivo" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Interface bridge ({bridge}) deve pertencer ao mesmo tipo de módulo" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "posição da porta traseira" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "modelo de porta frontal" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "modelos de porta frontal" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Porta traseira ({name}) deve pertencer ao mesmo tipo de dispositivo" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4965,46 +5416,46 @@ msgstr "" "Posição inválida da porta traseira ({position}); porta traseira {name} tem " "apenas {count} posições" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "posições" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "modelo de porta traseira" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "modelos de porta traseira" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "posição" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "Identificador a ser referenciado ao renomear componentes instalados" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "modelo de compartimento de módulo" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "modelos de compartimento de módulos" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "modelo de compartimento de dispositivos" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "modelos de compartimentos de dispositivos" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5013,202 +5464,207 @@ msgstr "" "Função do subdispositivo do tipo {device_type} deve ser definido como “pai” " "para permitir compartimentos de dispositivos." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "ID da peça" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Identificador da peça, designado pelo fabricante" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "modelo de item de inventário" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "modelos de itens de inventário" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Os componentes não podem ser movidos para um dispositivo diferente." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "extremidade do cabo" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "marcar conectado" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Tratar como se um cabo estivesse conectado" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Deve especificar a extremidade (A ou B) ao conectar um cabo." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "A extremidade do cabo não deve ser definida sem um cabo." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Não é possível marcar como conectado com um cabo já conectado." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr " Os modelos {class_name} devem declarar uma propriedade parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Tipo de porta física" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "velocidade" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Velocidade da porta em bits por segundo" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "porta de console" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "portas de console" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "porta de servidor de console" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "portas de servidor de console" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "porta de alimentação" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "portas de alimentação" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "tomada elétrica" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "tomadas elétricas" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Porta de alimentação principal ({power_port}) deve pertencer ao mesmo " "dispositivo" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "modo" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Estratégia de tagueamento IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "interface pai" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "LAG pai" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Esta interface é usada somente para gerenciamento fora de banda" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "velocidade (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "duplex" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-bit World Wide Name" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "canal do wireless" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "frequência do canal (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Preenchido pelo canal selecionado (se definido)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "potência de transmissão (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "redes wireless" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN não tagueada" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLANs tagueadas" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "interface" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "interfaces" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "As interfaces {display_type} não podem ter um cabo conectado." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr " As interfaces {display_type}não podem ser marcadas como conectadas." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Uma interface não pode ser pai de si mesma." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "Somente interfaces virtuais podem ser associadas a uma interface pai." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5217,7 +5673,7 @@ msgstr "" "A interface pai selecionada ({interface}) pertence a um dispositivo " "diferente ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5226,7 +5682,7 @@ msgstr "" "A interface pai selecionada ({interface}) pertence a {device}, que não faz " "parte do chassi virtual {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5235,7 +5691,7 @@ msgstr "" "A interface bridge selecionada ({bridge}) pertence a um dispositivo " "diferente ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5244,15 +5700,15 @@ msgstr "" "A interface bridge selecionada ({interface}) pertence a {device}, que não " "faz parte do chassi virtual {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Interfaces virtuais não podem ter uma interface LAG pai." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Uma interface LAG não pode ser pai de si mesma." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." @@ -5260,7 +5716,7 @@ msgstr "" "A interface LAG selecionada ({lag}) pertence a um dispositivo diferente " "({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5269,48 +5725,48 @@ msgstr "" "A interface LAG selecionada ({lag}) pertence a {device}, que não faz parte " "do chassi virtual {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Interfaces virtuais não podem ter um modo de operação do PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "As interfaces virtuais não podem ter um tipo de PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Deve especificar o modo PoE ao designar um tipo de PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "A função do wireless pode ser definida somente em interfaces wireless." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "O canal pode ser configurado somente em interfaces wireless." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "A frequência do canal pode ser definida somente em interfaces wireless." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "" "Não é possível especificar a frequência personalizada com o canal " "selecionado." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "A largura do canal pode ser definida somente em interfaces wireless." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "" "Não é possível especificar a largura personalizada com o canal selecionado." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5319,24 +5775,24 @@ msgstr "" "A VLAN não tagueada ({untagged_vlan}) deve pertencer ao mesmo site do " "dispositivo pai da interface ou deve ser global." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Posição mapeada na porta traseira correspondente" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "porta frontal" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "portas frontais" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Porta traseira ({rear_port}) deve pertencer ao mesmo dispositivo" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5345,19 +5801,19 @@ msgstr "" "Posição inválida da porta traseira ({rear_port_position}): Porta traseira " "{name} tem apenas {positions} posições." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Número de portas frontais que podem ser mapeadas" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "porta traseira" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "portas traseiras" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5366,40 +5822,41 @@ msgstr "" "O número de posições não pode ser menor que o número de portas frontais " "mapeadas ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "compartimento de módulos" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "compartimentos de módulos" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" "Um compartimento de módulo não pode pertencer a um módulo instalado dentro " "dele." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "compartimento de dispositivos" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "compartimentos de dispositivos" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Este tipo de dispositivo ({device_type}) não suporta compartimentos de " "dispositivos." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Não é possível instalar um dispositivo em si mesmo." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5407,115 +5864,117 @@ msgstr "" "Não é possível instalar o dispositivo especificado; o dispositivo já está " "instalado em {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "função do item de inventário" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "funções dos itens de inventário" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "número de série" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "etiqueta de patrimônio" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Uma etiqueta exclusiva usada para identificar este item" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "descoberto" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Este item foi descoberto automaticamente" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "item de inventário" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "itens de inventário" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Não é possível designar a si mesmo como pai." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "O item pai do inventário não pertence ao mesmo dispositivo." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "" "Não é possível mover um item de inventário com itens filhos dependentes" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Não é possível atribuir um item de inventário ao componente em outro " "dispositivo" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "fabricante" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "fabricantes" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "modelo" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "plataforma padrão" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "part number" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Part number discreto (opcional)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "altura (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "excluir da utilização" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" "Dispositivos deste tipo são excluídos ao calcular a utilização do rack." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "é full-depth" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "O dispositivo consome as faces frontal e traseira do rack." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "status pai/filho" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5524,24 +5983,24 @@ msgstr "" "dispositivos. Deixe em branco se este tipo de dispositivo não for nem pai " "nem filho." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "fluxo de ar" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "tipo de dispositivo" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "tipos de dispositivos" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "A altura U deve estar em incrementos de 0,5U." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5550,7 +6009,7 @@ msgstr "" "Dispositivo {device} no rack {rack} não tem espaço suficiente para acomodar " "uma altura de {height}U" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5560,7 +6019,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} instância(s) já montada(s) " "dentro de racks." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5569,151 +6028,151 @@ msgstr "" "associados a este dispositivo antes de desclassificá-lo como dispositivo " "pai." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Dispositivo filho deve ser 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "tipo de módulo" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "tipos de módulos" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Máquinas virtuais podem ser atribuídas a esta função" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "função de dispositivo" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "funções de dispositivos" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Opcionalmente, limite esta plataforma a dispositivos de um determinado " "fabricante" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "plataforma" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "plataformas" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "A função que este dispositivo desempenha" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Número de série do chassi, designado pelo fabricante" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Uma etiqueta exclusiva usada para identificar este dispositivo" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "posição (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "face do rack" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "IPv4 primário" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "IPv6 primário" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP fora de banda" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Posição no Chassi Virtual" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Posição no chassi virtual" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Prioridade no Chassi Virtual" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Prioridade de eleição do mestre no chassi virtual" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "latitude" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Coordenada GPS em formato decimal (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "longitude" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "O nome do dispositivo deve ser exclusivo por site." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "dispositivo" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "dispositivos" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Rack {rack} não pertence ao site {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Localização {location} não pertence ao site {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Rack {rack} não pertence à localização {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Não é possível selecionar uma face de rack sem atribuir um rack." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Não é possível selecionar uma posição de rack sem atribuir um rack." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "A posição deve estar em incrementos de 0,5U." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "Deve especificar a face do rack ao definir a posição do rack." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5721,7 +6180,7 @@ msgstr "" "Um tipo de dispositivo 0U ({device_type}) não pode ser alocado em uma " "posição de rack." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5729,7 +6188,7 @@ msgstr "" "Dispositivo filho não pode ser alocado em uma face do rack. Este é um " "atributo do dispositivo pai." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5737,7 +6196,7 @@ msgstr "" "Dispositivo filho não pode ser alocado em uma posição de rack. Este é um " "atributo do dispositivo pai." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5746,23 +6205,23 @@ msgstr "" "U{position} já está ocupado ou não tem espaço suficiente para acomodar este " "tipo de dispositivo: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} não é um endereço IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" "O endereço IP especificado ({ip}) não está alocado a este dispositivo." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} não é um endereço IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5772,17 +6231,17 @@ msgstr "" "{platform_manufacturer}, mas este pertence ao fabricante " "{devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "O cluster definido pertence a um site diferente ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Um dispositivo associado a um chassi virtual deve ter sua posição definida." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5791,15 +6250,15 @@ msgstr "" "O dispositivo não pode ser removido do chassi virtual {virtual_chassis} " "porque atualmente é designado como seu mestre." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "módulo" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "módulos" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5808,22 +6267,22 @@ msgstr "" "O módulo deve ser instalado dentro de um compartimento pertencente ao " "dispositivo ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domínio" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "chassi virtual" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" "O mestre selecionado ({master}) não está associado a este chassi virtual." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5832,105 +6291,105 @@ msgstr "" "Não foi possível excluir o chassi virtual {self}. Existem interfaces membro " "que formam interfaces LAG entre chassis." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "identificador" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Identificador numérico exclusivo para o dispositivo principal" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "comentários" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "contexto de dispositivo virtual" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "contextos de dispositivos virtuais" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} não é um endereço IPv{family}." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "O endereço IP primário deve pertencer a uma interface no dispositivo " "associado." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "peso" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "unidade de peso" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Deve especificar uma unidade ao definir um peso" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "painel de alimentação" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "quadros de alimentação" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "" "Localização {location} ({location_site}) está em um site diferente do {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "tipo de alimentação" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "fase" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "tensão" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "corrente" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "utilização máxima" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Consumo máximo permitido (porcentagem)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "potência disponível" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "fonte de alimentação" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "fontes de alimentação" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5939,63 +6398,63 @@ msgstr "" "Rack {rack} ({rack_site}) e quadro de alimentação {powerpanel} " "({powerpanel_site}) estão em sites diferentes." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "A tensão não pode ser negativa para alimentação do tipo CA" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "largura" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Largura de trilho a trilho" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Altura em U" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "unidade inicial" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Unidade inicial do rack" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "unidades descendentes" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "As unidades são numeradas de cima para baixo" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "largura externa" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Dimensão externa do rack (largura)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "profundidade externa" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Dimensão externa do rack (profundidade)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "unidade externa" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "profundidade de montagem" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -6004,75 +6463,76 @@ msgstr "" "abertos de 4 colunas, esta é a distância entre os trilhos dianteiro e " "traseiro." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "peso máximo" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Capacidade máxima de carga do rack" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "formato físico" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "tipo de rack" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "tipos de rack" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Deve especificar uma unidade ao definir a largura/profundidade externa" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Deve especificar uma unidade ao definir um peso máximo" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "função do rack" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "funções de rack" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "ID do facility" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Identificador atribuído localmente" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Papel funcional" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Uma etiqueta exclusiva usada para identificar este rack" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "rack" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "racks" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "A localização definida deve pertencer ao site principal ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6081,7 +6541,7 @@ msgstr "" "O rack deve ter pelo menos {min_height}U de altura para abrigar os " "dispositivos instalados." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6090,892 +6550,954 @@ msgstr "" "A numeração do rack deve começar em {position} ou menos para abrigar " "dispositivos atualmente instalados." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "A localização deve ser do mesmo site, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "unidades" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "reserva em rack" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "reservas em rack" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Unidade(s) inválida(s) para rack {height}U: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "As seguintes unidades já foram reservadas: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Já existe uma região de nível superior com este nome." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Já existe uma região de alto nível com esta slug." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "região" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "regiões" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Já existe um grupo de sites de nível superior com este nome." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Já existe um grupo de sites de nível superior com este slug." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "grupo de sites" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "grupos de sites" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Nome completo do site" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "facility" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "ID ou descrição do facility" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "endereço físico" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Localização física do edifício" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "endereço de entrega" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Se for diferente do endereço físico" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "site" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "sites" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Já existe uma localização com este nome no site especificado." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Já existe uma localização com este slug no site especificado." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "localização" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "localizações" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Localização principal ({parent}) deve pertencer ao mesmo site ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Terminação A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Terminação B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Dispositivo A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Dispositivo B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Localização A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Localização B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Rack A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Rack B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Site A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Sítio B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Acessível" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Dispositivos" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VMs" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Modelo de Configuração" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Grupo de Sites" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "Endereço IP" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Endereço IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Endereço IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Posição no Chassi Virtual" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Prioridade no Chassi Virtual" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Dispositivo Pai" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Posição (Compartimento de Dispositivo)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Portas de console" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Portas de servidor de console" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Portas de alimentação" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Tomadas elétricas" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Interfaces" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Portas frontais" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Compartimentos de dispositivos" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Compartimentos de módulos" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Itens de inventário" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Compartimento de módulo" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Itens de Inventário" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Cor do Cabo" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Pares Vinculados" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Marcar Conectado" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Consumo máximo (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Consumo alocado (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "Endereços IP" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Grupos FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Túnel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Somente Gerenciamento" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "Contextos de Dispositivos Virtuais" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Módulo Instalado" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Serial do Módulo" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Etiqueta de Patrimônio do Módulo" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Status do Módulo" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Componente" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Itens" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Tipos de Dispositivos" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Tipos de Módulos" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Plataformas" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Plataforma Padrão" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Full-Depth" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Altura em U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Instâncias" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Portas de Console" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Portas de Servidor de Console" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Portas de Alimentação" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Tomadas Elétricas" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Portas Frontais" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Portas Traseiras" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Compartimentos de Dispositivos" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Compartimentos de Módulos" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Fontes de Alimentação" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Utilização Máxima" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Potência Disponível (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Racks" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Altura" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Largura Externa" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Profundidade Externa" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Peso Máximo" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Espaço" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Sites" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "O caso de teste deve definir peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Desconectado {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Reservas" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Dispositivos Não Montados em Rack" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Contexto de Configuração" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Renderização de Configuração" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Ocorreu um erro ao renderizar o modelo: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Máquinas Virtuais" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Dispositivo instalado {device} no compartimento {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Dispositivo {device} removido do compartimento {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Filhos" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Membro {device} adicionado" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" "Não é possível remover o dispositivo principal {device} do chassi virtual." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Removido {device} do chassi virtual {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Objeto(s) relacionado(s) desconhecido(s): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Alteração do tipo do campo customizado não é suportado." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "O agendamento não está habilitado para este script." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Texto" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Texto (longo)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Número Inteiro" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Decimal" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Booleano (verdadeiro/falso)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Data" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Data e hora" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Seleção" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Múltipla Seleção" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Múltiplos objetos" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Desativado" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Flexível" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Exato" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Sempre" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Se Definido" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Oculto" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Sim" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Não" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Link" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Mais Recente" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Mais Antigo" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Ordem Alfabética (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Ordem Alfabética (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Informações" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Sucesso" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Aviso" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Perigo" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Debug" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Padrão" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Falha" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "A cada hora" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 horas" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Diariamente" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Semanalmente" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 dias" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Criar" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Atualizar" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Excluir" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Azul" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Índigo" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Roxo" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Rosa" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Vermelho" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Laranja" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Amarelo" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Verde" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Azul petróleo" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Ciano" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Cinza" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Preto" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Branco" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Script" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Notificação" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Operador desconhecido: {op}. Deve ser um dos seguintes: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Tipo de valor não suportado: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Tipo inválido para operação {op}: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "O conjunto de regras deve ser um dicionário, não {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Tipo lógico inválido: deve ser 'AND' ou 'OR'. Por favor, verifique a " "documentação." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Chave(s) inválida(s) informada(s). Por favor, cheque a documentação." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Tipo de widget" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Classe de widget não registrada: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} deve definir um método render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Nota" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Exibe qualquer conteúdo personalizado arbitrário. Markdown é suportado." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Contagem de Objetos" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6983,271 +7505,293 @@ msgstr "" "Exibe um conjunto de modelos do NetBox e o número de objetos criados para " "cada tipo." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Filtros a serem aplicados ao contar o número de objetos" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Formato inválido. Os filtros de objetos devem ser passados como um " "dicionário." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Lista de Objetos" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Exibe uma lista arbitrária de objetos." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "O número padrão de objetos a serem exibidos" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Formato inválido. Os parâmetros de URL devem ser passados como um " "dicionário." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "Feed RSS" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Incorpore um feed RSS de um site externo." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL do feed" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "O número máximo de objetos a serem exibidos" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "" "Por quanto tempo o conteúdo em cache deve ser armazenado (em segundos)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Favoritos" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Exibe seus favoritos pessoais" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Tipo de ação desconhecido para uma regra de evento: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Não é possível importar o pipeline de eventos {name}: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Módulo script (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Arquivo de dados (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Grupo (nome)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Tipo de cluster" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Tipo de cluster (slug)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Grupo de inquilinos" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Grupo de inquilinos (slug)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Etiqueta" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Etiqueta (slug)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Possui dados de contexto de configuração local" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Nome do grupo" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Obrigatório" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Deve ser único" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "UI visível" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "UI editável" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "É clonável" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Valor mínimo" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Valor máximo" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Expressão regular de validação" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Comportamento" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Nova janela" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Classe de botão" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Tipo MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Extensão de arquivo" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Como anexo" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Compartilhado" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Método HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL do payload" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Verificação SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Senha" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Caminho do arquivo CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Tipos de evento" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Está ativo" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Tipos de objetos" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Um ou mais tipos de objetos associados" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Tipo de campo de dados (por exemplo, texto, número inteiro etc.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Tipo de objeto" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Tipo de objeto (para campos de objeto ou de multiobjetos)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Conjunto de opções" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Conjunto de opções (para campos de seleção)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Se o campo personalizado é exibido na interface do usuário" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Se o campo personalizado é editável na interface do usuário" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "O conjunto básico de opções predefinidas a serem usadas (se houver)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7256,185 +7800,201 @@ msgstr "" "com rótulos opcionais separados por dois pontos: “Choice1:First Choice, " "Choice2:Second Choice”" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "classe de botão" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "A classe do primeiro link em um grupo será usada para o botão suspenso" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "O(s) tipo(s) de evento que acionará(ão) esta regra." -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Objeto de ação" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Nome do webhook ou script como caminho pontilhado module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Webhook {name} não encontrado" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Script {name} não encontrado" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Tipo de objeto associado" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "A classificação da entrada" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Usuários" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Nomes de usuários separados por vírgulas, envoltos por aspas duplas." -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Grupos" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Nomes de grupo separados por vírgulas, envoltos por aspas duplas." -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Tipo de objeto relacionado" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Tipo de campo" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Escolhas" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Dados" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Arquivo de dados" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Tipos de conteúdo" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Tipo de conteúdo HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Tipo de evento" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Tipo de ação" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Tipo de objeto etiquetado" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Tipo de objeto permitido" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Regiões" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Grupos de sites" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Localizações" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Tipos de dispositivos" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Funções" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Tipos de cluster" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Grupos de clusters" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Clusters" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Grupos de inquilinos" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "O(s) tipo(s) de objeto que possuem este campo customizado." -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Valor padrão" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" "Tipo do objeto relacionado (somente para campos de objeto/vários objetos)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Filtro de objeto relacionado" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Especifique os parâmetros da consulta como um objeto JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Campo personalizado" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7442,7 +8002,7 @@ msgstr "" "O tipo de dados armazenados neste campo. Para campos de objeto/multiobjeto, " "selecione o tipo de objeto relacionado abaixo." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7450,11 +8010,11 @@ msgstr "" "Isso será exibido como texto de ajuda para o campo do formulário. Markdown é" " suportado." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Objeto Relacionado" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7462,15 +8022,16 @@ msgstr "" "Insira uma opção por linha. Um rótulo opcional pode ser especificado para " "cada opção anexando-o com dois pontos. Exemplo:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Link Personalizado" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Modelos" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7479,7 +8040,7 @@ msgstr "" "Modelo de código Jinja2 para o texto do link. Faça referência ao objeto como" " {example}. Links renderizados como texto vazio não serão exibidos." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7487,55 +8048,61 @@ msgstr "" "Modelo de código Jinja2 para a URL do link. Faça referência ao objeto como " "{example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Modelo de código" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Modelo de Exportação" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Renderizando" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "O conteúdo do modelo é preenchido a partir da fonte remota selecionada " "abaixo." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Deve especificar o conteúdo local ou um arquivo de dados" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Filtro Salvo" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "" "Um grupo de notificações deve especificar pelo menos um usuário ou grupo." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Solicitação HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Escolha da ação" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Insira as condições em formato JSON." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7543,109 +8110,111 @@ msgstr "" "Insira os parâmetros a serem passados para a ação em formato JSON." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Regra de Evento" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Triggers" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Grupo de notificação" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Inquilinos" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Os dados são preenchidos a partir da fonte remota selecionada abaixo." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Deve especificar dados locais ou um arquivo de dados" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Conteúdo" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Agende para" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Agende a execução do relatório em um horário definido" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Repita a cada" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Intervalo no qual este relatório é executado novamente (em minutos)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (hora atual: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "O horário agendado deve ser no futuro." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Confirmar alterações" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "Confirme as alterações no banco de dados (desmarque para um teste)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Programe a execução do script para um horário definido" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Intervalo no qual este script é executado novamente (em minutos)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "As alterações no banco de dados foram revertidas automaticamente." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Script abortado com erro: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Ocorreu uma exceção: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "As alterações do banco de dados foram revertidas devido a um erro." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Nenhum indexador encontrado!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "contexto de configuração" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "contexto de configuração" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Os dados JSON devem estar no formato de objeto. Exemplo:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7653,19 +8222,19 @@ msgstr "" "Os dados do contexto de configuração local têm precedência sobre os " "contextos de origem no contexto de configuração renderizado final" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "modelo de código" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Modelo de código Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "parâmetros do ambiente" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7675,42 +8244,42 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">parâmetros" " adicionais para passar ao construir o ambiente Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "modelo de configuração" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "modelos de configuração" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Objetos aos quais este campo se aplica." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "O tipo de dados que este campo personalizado contém" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "O tipo de objeto do NetBox para o qual este campo é mapeado (para campos de " "objeto)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Nome interno do campo" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Somente caracteres alfanuméricos e sublinhados são permitidos." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "Sublinhados duplos não são permitidos em nomes de campos personalizados." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7718,19 +8287,19 @@ msgstr "" "Nome do campo exibido aos usuários (se não for fornecido, o nome do campo " "será usado)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "nome do grupo" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Os campos personalizados dentro do mesmo grupo serão exibidos juntos" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "requeridos" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7738,19 +8307,19 @@ msgstr "" "Este campo é necessário ao criar novos objetos ou editar um objeto " "existente." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "deve ser único" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "O valor deste campo deve ser único para o objeto atribuído" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "peso da pesquisa" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7758,11 +8327,11 @@ msgstr "" "Peso durante uma pesquisa. Valores mais baixos são considerados mais " "importantes. Campos com peso de pesquisa zero serão ignorados." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "lógica do filtro" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7770,11 +8339,11 @@ msgstr "" "Flexível corresponde a qualquer instância de uma determinada string; exata " "corresponde a todo o campo." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "padrão" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7782,7 +8351,7 @@ msgstr "" "Valor padrão para o campo (deve ser um valor JSON). Encapsule strings usando" " aspas duplas (por exemplo, “Foo”)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7791,35 +8360,35 @@ msgstr "" "(deve ser um valor JSON). Encapsule strings com aspas duplas (por exemplo, " "'Foo')." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "peso de exibição" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Os campos com pesos maiores aparecem mais abaixo em um formulário." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "valor mínimo" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Valor mínimo permitido (para campos numéricos)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "valor máximo" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Valor máximo permitido (para campos numéricos)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "expressão regular de validação" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7830,193 +8399,195 @@ msgstr "" "forçar a correspondência de toda a string. Por exemplo, ^ " "[A-Z]{3}$ limitará os valores a exatamente três letras maiúsculas." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "conjunto de opções" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "Especifica se o campo personalizado é exibido na interface do usuário" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Especifica se o valor do campo personalizado pode ser editado na interface " "do usuário" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "é clonável" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Replique este valor ao clonar objetos" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "campo personalizado" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "campos personalizados" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Valor padrão inválido”{value}“: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Um valor mínimo pode ser definido somente para campos numéricos" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Um valor máximo pode ser definido somente para campos numéricos" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Expressões regulares são suportadas somente para campos de texto e URLs" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "A unicidade não pode ser aplicada para campos booleanos." -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Os campos de seleção devem especificar um conjunto de opções." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "As opções podem ser definidas somente nos campos de seleção." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Os campos de objeto devem definir um tipo de objeto." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "Campos {type} não podem definir um tipo de objeto." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Um filtro de objeto relacionado pode ser definido apenas para campos de " "objeto." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "O filtro deve ser definido como um dicionário que mapeia atributos para " "valores." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Verdadeiro" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Falso" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" "Os valores devem corresponder a esta expressão regular: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "O valor deve ser uma string." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "O valor deve corresponder à expressão regular '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "O valor deve ser um número inteiro." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "O valor deve ser pelo menos {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "O valor não deve exceder {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "O valor deve ser decimal." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "O valor deve ser verdadeiro ou falso." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Os valores de data devem estar no formato ISO 8601 (AAAA-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Os valores de data e hora devem estar no formato ISO 8601 (AAAA-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Escolha {value} é inválida para o conjunto de escolhas {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Escolha {value} é inválida para o conjunto de escolhas {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "O valor deve ser um ID de objeto, não {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "O valor deve ser uma lista de IDs de objetos, não {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "ID de objeto inválida encontrada: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "O campo obrigatório não pode estar vazio." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Conjunto básico de opções predefinidas (opcional)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "As opções são ordenadas automaticamente em ordem alfabética" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "conjunto de opções de campo personalizado" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "conjuntos de opções de campos personalizados" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Deve definir opções básicas ou extras." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8025,60 +8596,60 @@ msgstr "" "Não é possível remover a escolha {choice} como existem {model} objetos que " "fazem referência a ele." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "layout" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "configuração" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "dashboard" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "dashboards" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "tipos de objetos" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Objeto(s) aos quais esta regra se aplica." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Os tipos de eventos que irão acionar esta regra." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "condições" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Um conjunto de condições que determinam se o evento será gerado." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "tipo de ação" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Dados adicionais para passar ao objeto da ação" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "regra de evento" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "regras dos eventos" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8088,7 +8659,7 @@ msgstr "" "chamado. O processamento do modelo Jinja2 é suportado com o mesmo contexto " "do corpo da solicitação." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available aqui." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "cabeçalhos adicionais" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8114,11 +8685,11 @@ msgstr "" "Name:Value. O processamento do modelo Jinja2 é suportado com o " "mesmo contexto do corpo da solicitação (abaixo)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "corpo modelo" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8131,11 +8702,11 @@ msgstr "" "timestamp, username, request_id, e " "data." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "senha" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8145,15 +8716,15 @@ msgstr "" "Signature contendo um HMAC hex digest do corpo do payload usando a " "senha como chave. A senha não é transmitido na solicitação." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Ative a verificação do certificado SSL. Desative com cuidado!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Caminho do arquivo CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8161,65 +8732,65 @@ msgstr "" "O arquivo de certificado CA específico a ser usado para verificação SSL. " "Deixe em branco para usar os padrões do sistema." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "Não especifique um arquivo de certificado CA se a verificação SSL estiver " "desativada." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "O(s) tipo(s) de objeto aos quais este link se aplica." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "texto do link" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Modelo de código Jinja2 para texto do link" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL do link" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Modelo de código Jinja2 para URL do link" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Links com o mesmo grupo aparecerão como um menu suspenso" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "nova janela" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Forçar o link a abrir em uma nova janela" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "link personalizado" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "links personalizados" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "O (s) tipo (s) de objeto aos quais este modelo se aplica." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8227,1087 +8798,1153 @@ msgstr "" "Modelo de código Jinja2. A lista de objetos que estão sendo exportados é " "passada como uma variável de contexto chamada queryset." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "O padrão é text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "extensão do arquivo" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Extensão para anexar ao nome do arquivo renderizado" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "como anexo" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Baixar arquivo como anexo" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "modelo de exportação" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "modelos de exportação" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "“{name}“é um nome reservado. Escolha um nome diferente." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "O (s) tipo (s) de objeto aos quais este filtro se aplica." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "compartilhado" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "filtro salvo" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "filtros salvos" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Os parâmetros de filtro devem ser armazenados como um dicionário de " "palavras-chave." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "altura da imagem" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "largura da imagem" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "anexo de imagem" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "anexos de imagens" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Os anexos de imagens não podem ser associados a este tipo de objeto " "({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "tipo" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "registro de evento" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "registros de eventos" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Registro de eventos não é suportado para o tipo de objeto ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "favorito" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "favoritos" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "O tipo de objeto ({type}) não pode ser favoritado." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "leitura" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "evento" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "notificação" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "notificações" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Objetos deste tipo ({type}) não suportam notificações." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "grupos" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "usuários" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "grupo de notificação" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "grupos de notificação" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "subscrição" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "subscrições" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "é executável" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "script" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "scripts" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "módulo de script" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "módulos de scripts" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "timestamp" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "campo" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "valor" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "valor em cache" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "valores em cache" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "filial" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "filiais" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "mudança preparada" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "mudanças preparadas" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Tipo(s) de objeto aos quais esta etiqueta pode ser aplicada." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "etiqueta" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "etiquetas" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "item etiquetado" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "itens etiquetados" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Dados do Script" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Parâmetros de Execução do Script" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Descartar" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Tipos de Objetos" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Validar Unicidade" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Visível" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Editável" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Tipo de Objeto Relacionado" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Conjunto de Opções" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "É Clonável" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Valor Mínimo" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Valor Máximo" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Expressão Regular de Validação" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Contar" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Ordenar Alfabeticamente" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Nova Janela" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Como Anexo" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Arquivo de Dados" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Sincronizado" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Imagem" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Tamanho (Bytes)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Leitura" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Validação SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Tipos de Evento" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Funções de Dispositivos" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Comentários (curto)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Linha" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Nível" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Mensagem" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Método" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Verifique se este valor é igual a %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Certifique-se de que este valor não seja igual a%(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Este campo deve estar vazio." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Este campo não deve estar vazio." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "As regras de validação devem ser passadas como um dicionário" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Falha na validação personalizada para {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Atributo \"{name}\" é inválido para a requisição" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Atributo \"{name}\" é inválido para {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Seu dashboard foi redefinido." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Widget adicionado: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Widget atualizado: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Widget excluído: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Erro ao excluir o widget: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "" "Não é possível executar o script: o processo do agente RQ não está em " "execução." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Insira um endereço IPv4 ou IPv6 válido com máscara opcional." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Formato de endereço IP inválido: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Insira um prefixo IPv4 ou IPv6 válido e uma máscara na notação CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Formato de prefixo IP inválido: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" "Espaço insuficiente para acomodar o(s) tamanho(s) de prefixo solicitado" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Contêiner" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Padrão" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "CheckPoint" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Texto sem formatação" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Formato de endereço IP inválido: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Import target" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Import target (nome)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Export target" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Export target (nome)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Importando VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Importar VRF (Route Distinguisher)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Exportando VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Exportar VRF (Route Distinguisher)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Importando L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Importando L2VPN (identificador)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Exportando L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Exportando L2VPN (identificador)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefixo" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (slug)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Dentro do prefixo" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Dentro e incluindo o prefixo" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Prefixos que contêm este prefixo ou IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Tamanho da máscara" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Número da VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Endereço" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Faixas que contêm este prefixo ou IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Prefixo pai" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Máquina virtual (nome)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Máquina virtual (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interface (nome)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interface da VM (nome)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interface da VM (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Grupo FHRP (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Está associado a uma interface" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Está associado" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Serviço (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT dentro do endereço IP (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interface associada" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Interface de VM atribuída" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "Endereço IP (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "Endereço IP" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "IPv4 Primário (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "IPv6 Primário (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Insira um endereço IPv4 ou IPv6 válido (sem máscara)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Formato de endereço IPv4/IPv6 inválido: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Este campo exige um endereço IP sem máscara." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Especifique um endereço IPv4 ou IPv6 válido." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Insira um endereço IPv4 ou IPv6 válido (com máscara CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "A máscara CIDR (por exemplo, /24) é obrigatória." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Padrão de endereço" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Imponha um espaço exclusivo" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "É privado" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Data da adição" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Grupo de VLANs" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Comprimento do prefixo" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "É um pool" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Trate como totalmente utilizado" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Atribuição de VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Nome DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protocolo" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "ID do Grupo" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Tipo de autenticação" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Chave de autenticação" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Autenticação" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Tipo de escopo" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Escopo" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Faixas para ID de VLAN." -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Site e Grupo" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Portas" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Import route targets" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Export route targets" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "RIR associado" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Grupo de VLANs (se houver)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Dispositivo pai da interface associada (se houver)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Máquina virtual" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "VM pai da interface associada (se houver)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "É primário" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Tornar este o IP primário do dispositivo associado" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Nenhum dispositivo ou máquina virtual especificado; não pode ser definido " "como IP primário" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Nenhuma interface especificada; não é possível definir como IP primário" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Tipo de autenticação" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Tipo de escopo (aplicativo e modelo)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Grupo de VLANs associado" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "Protocolo IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Obrigatório se não estiver atribuído a uma VM" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Obrigatório se não estiver atribuído a um dispositivo" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} não está associado a este dispositivo/VM." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Route Targets" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Import targets" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Export targets" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Importado pela VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Exportado pela VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Privado" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Família de endereços" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Faixa" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Início" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Fim" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Pesquisar dentro" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Presente em VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Dispositivo/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Prefixo Pai" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Dispositivo Associado" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "VM Associada" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Associado a uma interface" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Nome DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLANs" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Contém ID de VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "ID da VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Máquina Virtual" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Route Target" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Agregado" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Intervalo de ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Atribuição de Site/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Faixa de IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Grupo FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Torne este o IP primário do dispositivo/VM" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "IP NAT (interno)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "Um endereço IP só pode ser atribuído a um único objeto." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Não é possível reatribuir o endereço IP enquanto ele estiver designado como " -"o IP primário do objeto pai" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Somente endereços IP associados a uma interface podem ser designados como " "IPs primários." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Endereço IP Virtual" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "A atribuição já existe" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "IDs de VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "VLANs filhas" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9315,132 +9952,133 @@ msgstr "" "Lista separada por vírgula de um ou mais números de portas. Um intervalo " "pode ser especificado usando hífen." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Modelo de Serviço" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Porta(s)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Serviço" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Modelo de serviço" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Do Modelo" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Personalizado" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Deve especificar nome, protocolo e porta(s) se não estiver usando um modelo " "de serviço." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "iniciar" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "intervalo de ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Intervalos de ASNs" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "ASN inicial ({start}) deve ser menor do que o ASN final ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Regional Internet Registry responsável por este espaço numérico de AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "Número de 16 ou 32 bits do sistema autônomo" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ID do grupo" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protocolo" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "tipo de autenticação" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "chave de autenticação" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Grupo FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Grupos FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Associação a um grupo de FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Associações a grupos de FHRPs" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "privado" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "O espaço IP gerenciado por este RIR é considerado privado" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIRs" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Rede IPv4 ou IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Regional Internet Registry responsável por este espaço de IP" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "data adicionada" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "agregado" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "agregados" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Não é possível criar agregação com máscara /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9449,7 +10087,7 @@ msgstr "" "Os agregados não podem se sobrepor. {prefix} já está coberto por um agregado" " existente ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9458,266 +10096,276 @@ msgstr "" "Os prefixos não podem se sobrepor aos agregados. {prefix} cobre um agregado " "existente ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "função" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "funções" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "prefixo" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Rede IPv4 ou IPv6 com máscara" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Status operacional deste prefixo" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "A função primária deste prefixo" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "é um pool" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "" "Todos os endereços IP dentro deste prefixo são considerados utilizáveis" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "marcar utilizado" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "prefixos" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Não é possível criar prefixo com a máscara /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "tabela global" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Prefixo duplicado encontrado em {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "endereço inicial" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Endereço IPv4 ou IPv6 (com máscara)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "endereço final" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Status operacional desta faixa" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "A função principal desta faixa" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Faixa de IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Faixas de IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Endereços IP inicial e final devem ter a mesma versão" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Máscaras de endereço IP inicial e final precisam ser iguais" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "O endereço final deve ser maior que o endereço inicial ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Endereços definidos se sobrepõem com a faixa {overlapping_range} em VRF " "{vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "Faixa definida excede o tamanho máximo suportado ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "endereço" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "O status operacional deste IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "O papel funcional deste IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (interno)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "O IP para o qual este endereço é o IP “externo”" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Hostname ou FQDN (não diferencia maiúsculas de minúsculas)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "Endereços IP" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Não é possível criar endereço IP com máscara /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} é um ID de rede, que não pode ser atribuído a uma interface." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" "{ip} é um endereço de broadcast, que não pode ser atribuído a uma interface." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Endereço IP duplicado encontrado em {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Não é possível reatribuir o endereço IP enquanto ele estiver designado como " +"o IP primário do objeto pai" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Somente endereços IPv6 podem receber o status SLAAC" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "números de porta" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "modelo de serviço" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "modelos de serviços" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" "Os endereços IP específicos (se houver) aos quais este serviço está " "vinculado" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "serviço" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "serviços" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Um serviço não pode ser associado a um dispositivo e a uma máquina virtual " "ao mesmo tempo." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Um serviço deve estar associado a um dispositivo ou a uma máquina virtual." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Grupos de VLANs" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Não é possível definir scope_type sem scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Não é possível definir scope_id sem scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Os intervalos não podem se sobrepor." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "O site específico ao qual esta VLAN está associada (se houver)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Grupo de VLANs (opcional)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "ID numérica da VLAN (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Status operacional desta VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Função principal desta VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9726,164 +10374,166 @@ msgstr "" "A VLAN está atribuída ao grupo {group} (escopo: {scope}); não pode ser " "associada ao site {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VLAN ID devem estar nas faixas {ranges} para VLANs no grupo {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "route distinguisher" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Route Distinguisher único (conforme definido na RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "imponha um espaço exclusivo" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Prevenir prefixos/endereços IP duplicados dentro deste VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRFs" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Valor do Route Target (formatado de acordo com a RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "route target" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "route targets" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Total de Sites" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Total de Provedores" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agregados" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Adicionado" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Prefixos" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Utilização" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Faixas de IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Prefixo (Plano)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Profundidade" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Pool" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Marcado como Utilizado" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Endereço inicial" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (interno)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (Externo)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Associado" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Objeto Associado" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Tipo de Escopo" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Faixas de ID de VLAN" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VLAN ID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "Route Distinguiser" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Único" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Import Targets" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Export Targets" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} não é um prefixo válido. Você quis dizer {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "O comprimento do prefixo deve ser menor ou igual a %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "O comprimento do prefixo deve ser maior ou igual a %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9891,31 +10541,31 @@ msgstr "" "Somente caracteres alfanuméricos, asteriscos, hífens, pontos e sublinhados " "são permitidos em nomes DNS" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Prefixos Filhos" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Intervalos Filhos" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "IPs relacionados" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Interfaces de dispositivos" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Interfaces de Máquina Virtual" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Este campo pode não estar em branco." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9923,329 +10573,342 @@ msgstr "" "O valor deve ser passado diretamente (por exemplo, “foo”: 123); não use um " "dicionário ou uma lista." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} não é uma escolha válida." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Tipo de conteúdo inválido: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Valor inválido. Especifique um tipo de conteúdo como " "'.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Intervalos devem ser especificados no formato (inferior,superior)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Fronteiras do intervalo devem ser definidas como inteiros." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} deve implementar get_view_name()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Permissão {permission} é inválida para o modelo {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Vermelho Escuro" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Rosa" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fúcsia" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Roxo Escuro" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Azul Claro" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Aqua" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Verde Escuro" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Verde Claro" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Verde-Limão" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Âmbar" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Laranja Escuro" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Marrom" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Cinza Claro" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Cinza" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Cinza Escuro" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Direto" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Carregar" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Detecção automática" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Vírgula" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Ponto e vírgula" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Aba" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Parâmetro de configuração inválido: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Banner de login" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Conteúdo adicional a ser exibido na página de login" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Banner de manutenção" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Conteúdo adicional a ser exibido no modo de manutenção" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Banner superior" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Conteúdo adicional a ser exibido na parte superior de cada página" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Banner inferior" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Conteúdo adicional a ser exibido na parte inferior de cada página" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Espaço de IP globalmente exclusivo" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Imponha endereçamento IP único na tabela global" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Preferir IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Preferir endereços IPv4 em vez de IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Altura do rack" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Altura padrão para elevações de rack renderizados" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Largura do rack" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Largura padrão para elevações de rack renderizados" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Tensão da fonte de alimentação" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Tensão padrão para fontes de alimentação" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Corrente da fonte de alimentação" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Corrente padrão para fontes de alimentação" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Utilização máxima da fonte de alimentação" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Padrão máximo de utilização para fontes alimentação" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Esquemas de URL permitidos" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Esquemas permitidos para URLs em conteúdo fornecido pelo usuário" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Tamanho padrão da página" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Tamanho máximo da página" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Validadores personalizados" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Regras de validação personalizadas (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Regras de proteção" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Regras de proteção contra exclusão (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Preferências padrão" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Preferências padrão para novos usuários" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Modo de manutenção" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Ativar o modo de manutenção" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL habilitado" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Habilite a API do GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Retenção do changelog" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Dias para reter o histórico do changelog (definido como zero ilimitado)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Retenção dos resultados de tarefas" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Dias para reter o histórico de resultados das tarefas (definido como zero " "para ilimitado)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL dos mapas" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "URL Base para mapear localizações geográficas" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Correspondência parcial" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Correspondência exata" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Começa com" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Termina com" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Expressão Regular" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Tipo(s) de objeto" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Procurar" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10253,411 +10916,426 @@ msgstr "" "Slugs das etiquetas separadas por vírgulas, entre aspas duplas (por exemplo," " “tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Adicionar etiquetas" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Remover etiquetas" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} deve especificar um modelo de classe." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Nome de campo desconhecido '{name}' nos dados do campo personalizado." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Valor inválido para o campo personalizado '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Campo customizado '{name}' deve ser um valor único." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Campo personalizado obrigatório '{name}' ausente." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Fonte de dados remota" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "caminho dos dados" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Caminho para o arquivo remoto (em relação à raiz da fonte de dados)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "sincronização automática ativada" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Habilita a sincronização automática de dados quando o arquivo de dados for " "atualizado" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "data sincronizada" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} deve implementar um método sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organização" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Grupos de Sites" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Grupos de Inquilinos" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Grupos de Contatos" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Funções dos Contatos" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Atribuições dos Contatos" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Funções de Rack" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Elevações" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Tipos de Racks" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Módulos" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Contextos de Dispositivos Virtuais" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Fabricantes" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Componentes de Dispositivos" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Funções dos Itens de Inventário" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Conexões" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Cabos" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Links Wireless" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Conexões de Interface" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Conexões de Console" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Conexões de Alimentação" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Grupos de Redes Wireless" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Funções de Prefixo e VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Intervalos de ASNs" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Grupos de VLANs" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Modelos de Serviço" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Serviços" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Túneis" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Grupos de Túneis" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Terminações de Túneis" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPNs" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Terminações" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Propostas de IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Políticas de IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Propostas de IPsec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Políticas de IPsec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Perfis de IPsec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Discos Virtuais" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Tipos de Clusters" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Grupos de Clusters" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Tipos de Circuitos" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Grupos de Circuitos" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Atribuições do Grupo" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Terminações de Circuitos" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Provedores" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Contas de Provedores" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Redes dos Provedores" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Quadros de Alimentação" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Configurações" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Contexto de Configuração" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Modelos de Configuração" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Personalização" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Campos Personalizados" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Opções de Campo Personalizadas" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Links Personalizados" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Modelos de Exportação" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Filtros Salvos" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Anexos de Imagens" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operações" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Integrações" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Fontes de dados" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Regras dos eventos" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhooks" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Tarefas" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Rastreamento" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Grupos de Notificação" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Registros de Eventos" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Changelog" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Administrador" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Tokens de API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Permissões" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Sistema" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Plugins" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Histórico de Configuração" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Tarefas em Background" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Permissões devem ser passadas como uma tupla ou lista." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Botões devem ser passados como uma tupla ou lista." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Cor do botão deve ser uma opção em ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10666,7 +11344,7 @@ msgstr "" "Classe PluginTemplateExtension {template_extension} foi passada como uma " "instância!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10675,193 +11353,194 @@ msgstr "" "{template_extension} não é uma subclasse de " "netbox.plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} deve ser uma instância de netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} deve ser uma instância de netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} deve ser uma instância de netbox.plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context deve ser um dicionário" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Navegação HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Habilitar navegação dinâmica na interface do usuário" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Característica experimental" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Idioma" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Força a tradução da interface do usuário para o idioma especificado" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Suporte para tradução foi desativado localmente" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Comprimento da página" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "O número padrão de objetos a serem exibidos por página" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Posição do paginador" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Parte Inferior" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Topo" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Ambos" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Onde os controles do paginador serão exibidos em relação a uma tabela" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Formato de dados" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "A sintaxe preferida para exibir dados genéricos na interface do usuário" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Store inválido: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Não é possível adicionar stores ao registro após a inicialização" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Não é possível excluir stores do registro" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Tcheco" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Dinamarquês" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Alemão" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Inglês" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Espanhol" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Francês" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Italiano" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japonês" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Holandês" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Polonês" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Português" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Russo" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Turco" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ucraniano" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Chinês" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Selecionar todos" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Alternar todos" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Alternar Lista Suspensa" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Erro" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} não encontrados" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Campo" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Valor" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Plugin Dummy" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10869,57 +11548,57 @@ msgid "" msgstr "" "Houve um erro ao renderizar o modelo de exportação ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Linha {i}: Objeto com ID {id} não existe" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Nenhum {object_type} foi/foram selecionado(s)." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Renomeado(s) {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Excluído(s) {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Changelog" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Registro" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "" "Não é possível sincronizar os dados: Nenhum arquivo de dados definido." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Dados sincronizados para {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Sincronizado(s) {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} deve implementar get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10927,704 +11606,746 @@ msgstr "" "Erro ao carregar a configuração do dashboard. Um dashboard padrão está em " "uso." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Acesso Negado" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Você não tem permissão para acessar esta página" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Página Não Encontrada" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "A página solicitada não existe" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Erro no Servidor" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Houve um problema com sua solicitação. Entre em contato com o administrador" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "A exceção completa é fornecida abaixo" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Versão do Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Versão do NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Nenhum instalado" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Se necessitar de mais ajuda, por favor poste no" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Fórum de discussão do NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "no GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Página Inicial" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Perfil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Notificações" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Subscrições" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Preferências" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Alterar senha" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Cancelar" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Salvar" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Configurações de Tabelas" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Limpar preferências de tabela" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Alternar Tudo" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tabela" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Ordenação" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Colunas" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Nenhum encontrado" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Perfil do Usuário" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Detalhes da Conta" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-mail" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Conta Criada" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Último Login" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Superusuário" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Staff" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Grupos Associados" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Nenhum" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Atividade Recente" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Meus Tokens de API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Permissão de escrita" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Usado pela última vez" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Adicionar um Token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Início" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Tema do NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Logotipo do NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Documentos" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "API REST" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Documentação da API REST" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "API do GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Suporte NetBox Labs " -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Código-Fonte" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Comunidade" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Data de Ativação" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Data de Desativação" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Atribuir Grupo" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Troca das Terminações dos Circuitos" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Trocar as terminações do circuito %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Lado A" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Lado Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Atribuir Circuito" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Atribuição do Grupo de Circuitos" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Adicionar Circuito" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Tipo de circuito" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Adicionar" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Editar" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Trocar" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Marcado como conectado" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "para" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Rastrear" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Editar cabo" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Remover cabo" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Desconectar" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Conectar" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Downstream" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Upstream" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Conexão Cruzada" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Patch Panel/Porta" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Adicionar circuito" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Conta de Provedor" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Dados de Configuração" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Comentário" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Restaurar" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parâmetro" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Valor Atual" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Novo Valor" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Alterado" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Tamanho" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Hash SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Sincronizar" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Última sincronização" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Backend" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Nenhum parâmetro definido" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Arquivos" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Elevações de rack" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Altura padrão" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Largura padrão" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Fontes de Alimentação" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Tensão padrão" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Corrente padrão" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Utilização máxima padrão" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Impor unicidade global" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Contagem de paginações" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Tamanho máximo da página" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Preferências do usuário" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Retenção da tarefa" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Tarefa" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Criado Por" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Agendamento" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "a cada %(interval)s minuto(s)" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Alteração" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Diferença" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Anterior" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Próximo" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Objeto Criado" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Objeto Excluído" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Sem Alterações" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Dados Pré-Alteração" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Aviso: Comparando alteração não atômica com o registro de alteração anterior" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Dados Pós-Alteração" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Visualizar %(count)s Alterações" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Retenção do changelog" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "dias" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Indefinido" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Não instalado" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Visão Geral" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Instalar" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Detalhes do Plugin" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Sumário" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Licença" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Histórico da Versão" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Instruções para Instalação Local" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Filas em Segundo Plano" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Configurar Tabela" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Parar" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Reenfileirar" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Enfileirar" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Fila" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Tempo Limite" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "TTL Resultado" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argumentos" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Argumentos Chave" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Depende de" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Exceção" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "tarefas em " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Trabalhos em Fila" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11632,382 +12353,400 @@ msgstr "" "Selecione todas as %(count)s %(object_type_plural)s " "consultas correspondentes" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Informações sobre o Agente" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Agente" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Filas" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Tarefa Atual" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Total de tarefas bem-sucedidas" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Total de tarefas falhadas" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Tempo total de execução" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "segundos" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Agentes em Background" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Agentes em %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Exportar" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Status do Sistema" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Versão do NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Versão do Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Versão do PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Nome do banco de dados" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Tamanho do banco de dados" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Indisponível" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Agentes RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "fila padrão" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Hora do sistema" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Configuração Atual" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "" "Tem certeza de que deseja desconectar estes %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Rastrear Cabo para %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Baixar SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Caminho Assimétrico" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "Os nós abaixo não possuem links e resultam em um caminho assimétrico" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Divisão de caminho" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Selecione um nó abaixo para continuar" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Rastreamento Concluído" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Total de segmentos" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Comprimento total" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Nenhum caminho encontrado" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Caminhos Relacionados" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Origem" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Destino" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmentos" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Incompleto" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Renomear Selecionado" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Não Conectado" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Destacar o dispositivo no rack" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Não montado em rack" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Coordenadas GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Mapa" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Etiqueta de Patrimônio" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Exibir Chassi Virtual" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Criar Contexto de Dispositivo Virtual" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Gestão" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT para" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Utilização de Energia" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Entrada" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Tomadas" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Alocado" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Ramal" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Adicionar um serviço" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Adicionar Componentes" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Adicionar Portas de Console" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Adicionar Portas de Servidor de Console" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Adicionar Compartimentos de Dispositivos" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Adicionar Portas Frontais" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Ocultar Ativado" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Ocultar Desativado" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Ocultar Virtual" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Ocultar Desconectado" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Adicionar Interfaces" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Adicionar Item de Inventário" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Adicionar Compartimentos de Módulos" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Adicionar Tomadas Elétricas" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Adicionar Porta de Alimentação" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Adicionar Portas Traseiras" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Configuração" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Dados do Contexto" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Configuração Renderizada" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Baixar" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Nenhum modelo de configuração encontrado" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Compartimento Pai" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Regenerar Slug" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Remover" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Dados de Contexto de Configuração Local" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Renomear" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Compartimento de Dispositivos" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Dispositivo Instalado" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Remover %(device)s de %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -12016,430 +12755,449 @@ msgstr "" "Tem certeza de que deseja remover %(device)s de " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Popular" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Compartimento" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Adicionar Dispositivo" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Função da VM" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Nome do Modelo" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Part Number" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Excluir da Utilização" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Pai/Filho" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Imagem Frontal" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Imagem Traseira" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Posição da Porta Traseira" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Marcado como Conectado" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Status da Conexão" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Lado A" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Lado B" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Sem Terminação" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Marcar Planejado" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Marcar Instalado" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Status do Caminho" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Não Acessível" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Endpoints do Caminho" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Não conectado" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Não tagueada" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Nenhuma VLAN Associada" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Limpar" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Limpar Tudo" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Profundidade de Montagem" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Unidade Inicial" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Unidades Descendentes" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Elevação de rack" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Adicionar Interface Filha" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Velocidade/Duplex" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Modo do PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Tipo de PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Modo 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "Endereço MAC" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Link Wireless" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Par" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Canal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Frequência do Canal" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Largura do Canal" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Membros do LAG" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Nenhuma interface membro" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Adicionar Endereço IP" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Item Pai" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Part ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Adicionar Sub-Localização" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Sub-Localizações" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Adicionar uma localização" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Adicionar um Dispositivo" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Adicionar Tipo de Dispositivo" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Adicionar Tipo de Módulo" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Dispositivo Conectado" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Utilização (Alocada)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Características Elétricas" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Ramal de Alimentação" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Adicionar Fontes de Alimentação" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Consumo Máximo" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Consumo Alocado" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Espaço Utilizado" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Peso do Rack" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Peso Máximo" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Peso Total" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Imagens e Rótulos" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Somente imagens" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Somente rótulos" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Adicionar reserva" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Exibir Lista" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Selecione visão do rack" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Ordenar Por" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Nenhum Rack Localizado" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Exibir Elevações" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Detalhes da Reserva" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Adicionar Rack" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Posições" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Adicionar Site" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Regiões de Sub-Localizações" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Adicionar Região" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Fuso Horário" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Horário local" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Endereço Físico" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Endereço de Entrega" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Grupos de Sub-Localizações" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Adicionar Grupo de Sites" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Anexo" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Adicionar Membro" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Dispositivos Membros" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Adicionar Novo Membro ao Chassi Virtual %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Adicionar Novo Membro" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Ações" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Salvar e Adicionar Outro" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Editando Chassi Virtual %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Rack/Posição" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Remover Membro do Chassi Virtual" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12448,11 +13206,12 @@ msgstr "" "Tem certeza de que deseja remover %(device)s do chassi " "virtual %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Identificador" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12460,11 +13219,11 @@ msgstr "" "Ocorreu um erro de importação do módulo durante esta solicitação. As causas " "comuns incluem o seguinte:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Pacotes necessários ausentes" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12480,11 +13239,11 @@ msgstr "" "instalados, execute pip freeze a partir do console e compare a " "saída com a lista de pacotes necessários." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "O serviço WSGI não foi reiniciado após a atualização" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12494,7 +13253,7 @@ msgstr "" "(por exemplo, gunicorn ou uWSGI) foi reiniciado. Isso garante que o novo " "código esteja em execução." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12502,11 +13261,11 @@ msgstr "" "Um erro de permissão de arquivo foi detectado ao processar esta solicitação." " As causas comuns incluem o seguinte:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Permissão de gravação insuficiente para a raíz da mídia" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12517,7 +13276,7 @@ msgstr "" "que o usuário NetBox seja executado com acesso para gravar arquivos em todos" " os locais dentro deste caminho." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12525,11 +13284,11 @@ msgstr "" "Um erro de programação do banco de dados foi detectado ao processar esta " "solicitação. As causas comuns incluem o seguinte:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Migrações do banco de dados ausentes" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12540,11 +13299,11 @@ msgstr "" "pode executar migrações manualmente executando python3 manage.py " "migrate a partir da linha de comando." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Versão não suportada do PostgreSQL" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12554,99 +13313,102 @@ msgstr "" " pode verificar isso conectando-se ao banco de dados usando as credenciais " "do NetBox e emitindo uma consulta para SELECT VERSION()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "O arquivo de dados associado a este objeto foi excluído" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Dados Sincronizados" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Sincronizar Dados" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Parâmetros do Ambiente" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Modelo" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Nome do Grupo" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Deve ser Único" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Clonável" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Valor Padrão" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Peso na Pesquisa" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Lógica do Filtro" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Peso de Exibição" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Interface de Usuário Visível" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Interface de Usuário Editável" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Regras de Validação" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Expressão Regular" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Classe do Botão" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Modelos Associados" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Texto do Link" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL do link" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Redefinir Dashboard" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12654,7 +13416,7 @@ msgstr "" "Isso removerá todos os widgets configurados e irá restaurar" " as configurações padrão do dashboard." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12662,160 +13424,162 @@ msgstr "" "Esta mudança afetará apenas seu dashboard e não impactará os outros " "usuários." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "configuração do widget" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Fechar widget" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Adicionar um Widget" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Nenhum favorito foi adicionado ainda." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Sem permissão" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Sem permissão para visualizar este conteúdo" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Não é possível carregar o conteúdo. Nome de exibição inválido" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Nenhum conteúdo encontrado" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Houve um problema ao obter o feed RSS" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Condições" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME Type" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Extensão do arquivo" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Agendado para" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Duração" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Resumo do Teste" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Log" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Saída" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Carregando" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Resultados pendentes" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Registro de Evento" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Grupo de Notificação" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Nenhum atribuído" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "" "O contexto de configuração local sobrescreve todos os contextos de origem" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Contextos de Origem" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Novo Registro de Evento" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Relatório" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Você não tem permissão para executar scripts" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Executar Script" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Erro ao carregar o script" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "O script não existe mais no arquivo de origem." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Última Execução" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "O script não está mais presente no arquivo de origem" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Nunca" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Execute Novamente" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "Não foi possível carregar os scripts do módulo %(module)s" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Nenhum Script Encontrado" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12824,81 +13588,83 @@ msgstr "" "Comece criando um script a partir de " "um arquivo ou fonte de dados carregado." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Resultados" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Limite do log" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Todos" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Itens Etiquetados" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Tipos de Objetos Permitidos" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Qualquer" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Tipos de Itens Etiquetados" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Objetos Etiquetados" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Método HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Tipo de Conteúdo HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Verificação SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Cabeçalhos Adicionais" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Modelo de Corpo" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Criação em Massa" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Objetos Selecionados" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "para Adicionar" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Exclusão em Massa" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Confirmar Exclusão em Massa" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12908,66 +13674,69 @@ msgstr "" "A operação a seguir excluirá %(count)s %(type_plural)s. " "Analise cuidadosamente o(s) objeto(s) selecionado(s) e confirme esta ação." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Editando" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Edição em Massa" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Aplicar" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Importação em Massa" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Importação Direta" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Carregar Arquivo" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Enviar" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Opções de Campos" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Acessador" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "escolhas" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Importar Valor" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Formato: AAAA-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Especifique verdadeiro ou falso" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Campos obrigatórios devem ser especificados para todos os " "objetos." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12977,15 +13746,15 @@ msgstr "" "exclusivo. Por exemplo, %(example)s identificaria um VRF por " "seu Route Distinguiser." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Remoção em Massa" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Confirme Remoção em Massa" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12996,72 +13765,72 @@ msgstr "" "%(parent_obj)s. Por favor, revise cuidadosamente o(s) %(obj_type_plural)s a " "ser(em) removido(s) e confirme abaixo." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Remova este(s) %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Renomeando" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Renomeação em Massa" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Nome Atual" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Novo Nome" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Pré-visualização" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Você tem certeza" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Confirma" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Editar Selecionado" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Excluir Selecionado" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Adicionar %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Veja a documentação do modelo" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Ajuda" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Criar e Adicionar Outro" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtros" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13070,40 +13839,40 @@ msgstr "" "Selecione toda(s)%(count)s" " %(object_type_plural)s consulta(s) correspondente(s)" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Nova Versão Disponível" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "está disponível" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Instruções para Atualização" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Desbloquear Dashboard" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Bloquear Dashboard" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Adicionar Widget" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Salvar Layout" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Confirmar Exclusão" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13112,40 +13881,40 @@ msgstr "" "Tem certeza que deseja deletar " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Os objetos a seguir serão excluídos como resultado desta ação." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "atrás" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Nenhuma notificação não lida" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Todas as notificações" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Selecionar" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Redefinir" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Ativar o modo escuro" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Ativar o modo claro" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13154,281 +13923,283 @@ msgstr "" "Antes que você possa adicionar um %(model)s, você deve primeiro criar um " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Seleção de página" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Exibindo %(start)s-%(end)s de %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Opções de paginação" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Por Página" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Anexar uma imagem" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Objetos Relacionados" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Nenhuma tag associada" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Os dados não estão sincronizados com o arquivo de upstream" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Busca rápida" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Filtro salvo" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Limpar ordenação" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Centro de ajuda" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Administrador do Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Logout" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Login" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Família" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Data Adicionada" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Adicionar Prefixo" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Número do AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Tipo de Autenticação" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Chave de Autenticação" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Endereços IP Virtuais" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Atribuir IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Criar em Massa" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Criar Grupo" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "IPs Virtuais" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Mostrar Atribuído" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Mostrar Disponível" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Mostrar Tudo" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Global" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (externo)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Atribuir um Endereço IP" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Selecione o Endereço IP" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Resultados da Pesquisa" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Adicionar Endereços IP em Massa" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Endereço Inicial" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Endereço Final" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Marcado como totalmente utilizado" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Detalhes do Endereçamento" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "IPs Filhos" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "IPs Disponíveis" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Primeiro IP disponível" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Detalhes do Prefixo" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Endereço de Rede" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Máscara de Rede" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Máscara Curinga" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Endereço de Broadcast" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Adicionar Faixa de IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Ocultar Indicadores de Profundidade" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Profundidade Máxima" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Comprimento Máximo" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Adicionar Agregado" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Importando VRFs" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Exportando VRFs" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Importando L2VPNs" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Exportando L2VPNs" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Adicionar um Prefixo" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Adicionar VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Route Distinguisher" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Espaço de IP exclusivo" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Erros" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Entrar" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Ou" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Falha de Mídia Estática - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Falha de Mídia Estática" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "O seguinte arquivo de mídia estática falhou ao carregar" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Verifique o seguinte" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13438,7 +14209,7 @@ msgstr "" "mais recente. Isso instala a iteração mais recente de cada arquivo estático " "no caminho raiz estático." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13449,7 +14220,7 @@ msgstr "" "caminho RAIZ_ESTÁTICA. Consulte a " "documentação de instalação para obter mais orientações." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13458,548 +14229,571 @@ msgstr "" "O arquivo %(filename)s existe no diretório raiz estático e pode" " ser lido pelo servidor HTTP." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Clique aqui para tentar carregar o NetBox " "novamente." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Contato" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Título" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefone" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Grupo de Contatos" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Adicionar Grupo de Contato" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Função dos Contatos" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Adicionar um contato" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Adicionar Inquilino" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Grupo de Inquilinos" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Adicionar Grupo de Inquilinos" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Permissões Atribuídas" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Permissão" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Visualizar" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Restrições" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Usuários Atribuídos" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Recursos Alocados" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "CPUs Virtuais" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Memória" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Espaço em Disco" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Adicionar Máquina Virtual" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Atribuir Dispositivo" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Remover Selecionado" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Adicionar Dispositivo ao Cluster %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Seleção de Dispositivos" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Adicionar Dispositivos" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Adicionar Cluster" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Grupo de Clusters" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Tipo de Cluster" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Disco Virtual" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Recursos" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Adicionar Disco Virtual" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Política da IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Versão da IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Chave Pré-compartilhada" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Mostrar Senha" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Propostas" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Proposta de IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Método de autenticação" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Algoritmo de criptografia" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Algoritmo de autenticação" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Grupo DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Vida útil da Associação de Segurança (segundos)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Política de IPsec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Grupo PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Perfil IPsec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Grupo PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Proposta de IPsec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Vida útil da Security Association (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "Atributos da L2VPN" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Adicionar uma Terminação" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Adicionar Terminação" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Encapsulamento" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Perfil IPsec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "ID do Túnel" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Adicionar Túnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Grupo de Túneis" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Terminação do Túnel" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "IP Externo" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Pares de Terminações" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Cifra" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Interfaces Anexadas" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Adicionar Rede Wireless" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Grupo de Redes Wireless" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Adicionar Grupo de Redes Wireless" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Propriedades do Link" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Distância" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Grupo de contatos principal (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Grupo de contatos principal (slug)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Grupo de contatos (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Grupo de contatos (slug)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Contato (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Função do contato (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Função do contato (slug)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Grupo de contatos" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Grupo de inquilinos principal (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Grupo de inquilinos principal (slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Grupo de inquilinos (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Grupo de Inquilinos (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Grupo de inquilinos (slug)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Descrição" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Contato atribuído" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "grupo de contatos" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "grupos de contatos" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "função do contato" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "funções do contato" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "título" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefone" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "e-mail" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "link" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "contato" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "contatos" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "atribuição do contato" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "atribuições do contato" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Os contatos não podem ser atribuídos a este tipo de objeto ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "grupo de inquilinos" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "grupos de inquilinos" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "O nome do inquilino deve ser exclusivo por grupo." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Slug do inquilino deve ser exclusivo por grupo." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "inquilino" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "inquilinos" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Título do Contato" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Telefone de Contato" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "E-mail de Contato" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Endereço de Contato" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Link de Contato" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Descrição do Contato" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Permissão (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Grupo de notificação (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Primeiro nome" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Último nome" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Status de staff" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Superusuário" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Se nenhuma chave for fornecida, uma será gerada automaticamente." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Staff" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "É Superusuário" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Pode Visualizar" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Pode Adicionar" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Pode Alterar" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Pode Excluir" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Interface de Usuário" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -14009,7 +14803,7 @@ msgstr "" "salvar sua chave antes de enviar este formulário, pois ela não será" " mais acessível depois que o token for criado." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14019,31 +14813,31 @@ msgstr "" "para nenhuma restrição. Exemplo: 10.1.1.0/24.192.168.10.16/32, 2001:db" " 8:1: :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Confirme a senha" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Digite a senha novamente." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "As senhas não coincidem! Verifique e tente novamente." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Ações adicionais" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Ações concedidas além das listadas acima" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Objetos" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14053,79 +14847,79 @@ msgstr "" "permitidos. Deixe em nulo para corresponder a todos os objetos deste tipo. " "Uma lista de vários objetos resultará em uma operação lógica \"OR\"." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Ao menos uma ação deve ser selecionada." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Filtro inválido para {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "A lista de ações concedidas por esta permissão" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "restrições" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Filtro queryset que corresponde aos objetos aplicáveis do(s) tipo(s) " "selecionado(s)" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "permissão" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "permissões" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "preferências do usuário" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Chave '{path}'é um nó folha; não é possível atribuir novas chaves" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Chave '{path}'é um dicionário; não pode atribuir um valor que não seja do " "dicionário" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "expira" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "usado pela última vez" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "chave" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "escrita habilitada" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "Permitir operações de criação/atualização/exclusão usando esta chave" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "IPs permitidos" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14134,42 +14928,42 @@ msgstr "" "para nenhuma restrição. Ex: “10.1.1.0/24, 192.168.10.16/32, 2001:DB 8:1: " ":/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "token" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "tokens" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "grupo" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "usuário" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Nome de usuário já existente." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Ações Personalizadas" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Objeto relacionado não encontrado usando os atributos fornecidos: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Vários objetos correspondem aos atributos fornecidos: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14178,42 +14972,42 @@ msgstr "" "Objetos relacionados devem ser referenciados por uma ID numérica ou por um " "dicionário de atributos. Recebeu um valor desconhecido: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Objeto relacionado não encontrado usando a ID numérica fornecida: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} possui uma chave definida, mas CHOICES não é uma lista" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Peso deve ser um número positivo" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Valor '{weight}'para peso é inválido (deve ser um número)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Unidade {unit} é desconhecida. Deve ser um dos seguintes: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Comprimento deve ser um número positivo" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Valor '{length}'para comprimento é inválido (deve ser um número)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14222,15 +15016,15 @@ msgstr "" "Não é possível excluir {objects}. {count} objetos " "dependentes foram encontrados: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Mais que 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Cor RGB em hexadecimal. Exemplo:" -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14239,7 +15033,7 @@ msgstr "" "%s(%r) é inválido. O parâmetro to_model para CounterCacheField deve ser uma " "string no formato 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14248,39 +15042,39 @@ msgstr "" "%s(%r) é inválido. O parâmetro to_field para CounterCacheField deve ser uma " "string no formato 'field'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Insira os dados do objeto no formato CSV, JSON ou YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Delimitador CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "O caractere que delimita os campos CSV. Aplica-se somente ao formato CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "" "Os dados do formulário devem estar vazios ao carregar/selecionar um arquivo." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Formato de dados desconhecido: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "" "Não foi possível detectar o formato dos dados. Por favor, especifique." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Delimitador CSV inválido" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14288,7 +15082,7 @@ msgstr "" "Dados YAML inválidos. Os dados devem estar na forma de vários documentos ou " "de um único documento contendo uma lista de dicionários." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14297,7 +15091,7 @@ msgstr "" "Lista inválida ({value}). Deve ser numérica e os intervalos devem estar em " "ordem crescente." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14305,7 +15099,7 @@ msgstr "" "Especifique um ou mais intervalos numéricos separados por vírgulas. Exemplo:" " 1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14313,17 +15107,18 @@ msgstr "" "Intervalos inválidos ({value}). Deve ser um intervalo de inteiros em ordem " "ascendente." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Valor inválido para um campo de múltipla escolha: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Objeto não encontrado: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14332,20 +15127,20 @@ msgstr "" "“{value}“não é um valor exclusivo para este campo; vários objetos foram " "encontrados" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "“{field_name}“é um nome de campo de acesso inválido." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "O tipo de objeto deve ser especificado como”.“" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Tipo de objeto inválido" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14355,7 +15150,7 @@ msgstr "" " mistos dentro de um único intervalo não são suportados (exemplo: [ge," " xe] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14363,7 +15158,7 @@ msgstr "" "Especifique um intervalo numérico para criar vários IPs.
    Exemplo: " "192,0.2. [1,5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Uso de sintaxe Markdown é suportada" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Abreviatura exclusiva da URL amigável" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Inserir dados de contexto no formato JSON." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "O endereço MAC deve estar no formato EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Usar expressões regulares" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "ID numérica de um objeto existente a ser atualizado (se não estiver criando " "um novo objeto)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Cabeçalho não reconhecido: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Colunas Disponíveis" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Colunas Selecionadas" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14417,13 +15212,13 @@ msgstr "" "Este objeto foi modificado desde que o formulário foi renderizado. Consulte " "o changelog do objeto para obter mais detalhes." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Intervalo ”{value}“ é inválido." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14432,71 +15227,71 @@ msgstr "" "Intervalo inválido: valor final ({end}) deve ser maior que o valor inicial " "({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Cabeçalho de coluna duplicado ou conflitante com ”{field}“" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Cabeçalho de coluna duplicado ou conflitante com ”{header}“" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Linha {row}: Esperado(s) {count_expected} coluna(s), mas encontrado(s) " "{count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Cabeçalho de coluna inesperado ”{field}“ encontrado." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Coluna ”{field}“ não é um objeto relacionado; não pode usar pontos" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "" "Atributo de objeto relacionado inválido para a coluna ”{field}“: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Cabeçalho de coluna obrigatório ”{header}“ não encontrado." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Valor necessário ausente para o parâmetro de consulta dinâmica: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Valor necessário ausente para o parâmetro de consulta estática: " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Senha deve possuir ao menos um número." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Senha deve possuir ao menos uma letra maiúscula." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Senha deve possuir ao menos uma letra minúscula." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14504,7 +15299,7 @@ msgstr "" "Sua senha deve possuir ao menos um número, uma letra maíuscula e uma letra " "minúscula." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14513,125 +15308,125 @@ msgstr "" "Nome de permissão inválido: {name}. Deve estar no formato " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "app_label/model_name desconhecido para {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Endereço IP inválido definido para {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Uma coluna chamada {name} já está definida para a tabela {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Não definido" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Desfavoritar" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Favorito" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Clonar" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Visualização Atual" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Todos os Dados" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Adicionar modelo de exportação" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Importar" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Cancelar inscrição" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Inscrever" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Copiar para área de transferência" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Este campo é obrigatório" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Definir como Nulo" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Limpar tudo" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Configuração da Tabela" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Mover para Cima" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Mover para Baixo" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Buscar..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Buscar no Netbox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Abrir seletor" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Escrita" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "O teste deve definir csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} não é uma expressão regular válida." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__} deve implementar get_required_permission ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} deve implementar get_required_permission ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14640,61 +15435,63 @@ msgstr "" "{class_name} não possui queryset definido. ObjectPermissionRequiredMixin só " "pode ser usado em visualizações que definem um queryset básico." -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Grupo principal (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Grupo principal (slug)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Tipo de cluster (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Cluster (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPUs" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Memória (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Tipo de cluster" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Grupo de clusters atribuído" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Cluster atribuído" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Dispositivo atribuído dentro do cluster" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Número de série" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14703,49 +15500,49 @@ msgstr "" "{device} pertence ao site ({device_site}), diferente do que pertence o " "cluster ({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "Opcionalmente, vincule esta VM a um host específico dentro do cluster" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Site/Cluster" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "O tamanho do disco é gerenciado por meio da conexão de discos virtuais." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disco" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "tipo de cluster" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "tipos de cluster" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "grupo de clusters" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "grupos de clusters" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "grupo" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "clusters" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14754,42 +15551,42 @@ msgstr "" "{count} dispositivo(s) está/estão atribuído(s) como host(s) para este " "cluster, mas não está/estão no site {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "memória (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disco (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "O nome da máquina virtual deve ser exclusivo por cluster." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "máquina virtual" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "máquinas virtuais" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Uma máquina virtual deve ser associada a um site e/ou cluster." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "O cluster selecionado ({cluster}) não está atribuído a este site ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "É necessário especificar um cluster ao atribuir um host." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." @@ -14797,7 +15594,7 @@ msgstr "" "O dispositivo selecionado ({device}) não está associado a este cluster " "({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14806,17 +15603,17 @@ msgstr "" "O tamanho do disco especificado ({size}) deve corresponder ao tamanho " "agregado dos discos virtuais associados ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Deve ser um endereço IPv{family}. ({ip} é um endereço IPv{version}.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "O endereço IP especificado ({ip}) não está associado a esta VM." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14825,7 +15622,7 @@ msgstr "" "A interface pai selecionada ({parent}) pertence a uma máquina virtual " "diferente ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14834,7 +15631,7 @@ msgstr "" "A interface bridge selecionada ({bridge}) pertence a uma máquina virtual " "diferente ({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14843,393 +15640,416 @@ msgstr "" "A VLAN não tagueada ({untagged_vlan}) deve pertencer ao mesmo site da " "máquina virtual pai da interface ou deve ser global." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "tamanho (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "disco virtual" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "discos virtuais" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Adicionado(s) {count} dispositivo(s) para agrupar {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Removido(s) {count} dispositivo(s) do cluster {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Transporte" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Túnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-in-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Spoke" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agressivo" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Principal" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Chaves pré-compartilhadas" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Certificados" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Assinaturas RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Assinaturas DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Grupo {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernet Private LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Ethernet Virtual Private LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernet Private Tree" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Árvore privada virtual Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Grupo de túneis (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Grupo de túneis (slug)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Perfil de IPsec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Perfil de IPsec (nome)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Túnel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Túnel (nome)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "IP Externo (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Política da IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Política da IKE (nome)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Política de IPsec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Política de IPsec (nome)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (slug)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Interface da VM (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (nome)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Grupo de túneis" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Vida útil da Security Association" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Chave pré-compartilhada" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Política da IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Política de IPsec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Encapsulamento do túnel" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Função operacional" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Dispositivo pai da interface associada" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "VM principal da interface pai" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Interface de dispositivo ou máquina virtual" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Proposta(s) de IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Grupo Diffie-Hellman para Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Proposta(s) de IPsec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Protocolo IPsec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Tipo de L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Dispositivo pai (para interface)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Máquina virtual pai (para interface)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Interface atribuída (dispositivo ou VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Não é possível importar terminações de dispositivo e de interface de VM " "simultaneamente." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Cada terminação deve especificar uma interface ou uma VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Não é possível associar tanto uma interface e uma VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Versão da IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Proposta" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Tipo de Objeto Atribuído" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Interface do túnel" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Primeira Terminação" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Segunda Terminação" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Este parâmetro é necessário ao definir uma terminação." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Política" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Uma terminação deve especificar uma interface ou VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Uma terminação só pode ter um objeto de terminação (uma interface ou VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "algoritmo de criptografia" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "algoritmo de autenticação" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "ID do grupo Diffie-Hellman" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Vida útil da Security Association (em segundos)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Proposta de IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Propostas de IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "versão" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "propostas" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "chave pré-compartilhada" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Políticas de IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Modo é necessário para a versão da IKE selecionada" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Modo não pode ser usado para a versão da IKE selecionada" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "criptografia" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "autenticação" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Vida útil da Security Association (segundos)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Vida útil da Security Association (em kilobytes)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Proposta de IPsec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Propostas de IPsec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "O algoritmo de criptografia e/ou autenticação deve ser definido" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Políticas de IPsec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Perfis de IPsec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Terminação L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Terminações L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Terminação L2VPN ({assigned_object}) já atribuída" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15238,187 +16058,195 @@ msgstr "" "L2VPNs {l2vpn_type} não podem ter mais de duas terminações; encontrada(s) " "{terminations_count} já definida(s)." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "grupo de túneis" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "grupos de túneis" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "encapsulamento" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ID do túnel" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "túnel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "túneis" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Um objeto pode ser terminado em apenas um túnel por vez." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "terminação do túnel" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "terminações dos túneis" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} já está conectado ao túnel ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Método de Autenticação" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Algoritmo de Criptografia" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Algoritmo de Autenticação" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Vida útil da Security Association" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Chave pré-compartilhada" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Vida útil da Security Association (segundos)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Vida útil da Security Association (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Objeto Pai" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Site do Objeto" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Ponto de acesso" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Estação" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Aberto" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Enterprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Cifra de autenticação" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Unidade de distância" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "VLAN Bridged" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Interface A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Interface B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Lado B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "cifra de autenticação" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "grupo de redes wireless" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "grupos de redes wireless" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "rede wireless" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "interface A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "interface B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "distância" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "unidade de distância" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "link wireless" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "links wireless" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "É necessário especificar uma unidade ao definir uma distância sem fio." -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} não é uma interface wireless." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Valor de canal inválido: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Atributo de canal inválido: {name}" diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo index 785b3f6d553c61fe45bd9a9cb7b7be7ebb615e8c..65ede0d43ad754ab9da9b2b12e0340b2a9c3f444 100644 GIT binary patch delta 65987 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 delta 66358 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 && n%10<=4 && (n%100<12 || n%100>14) ? 1 : n%10==0 || (n%10>=5 && n%10<=9) || (n%100>=11 && n%100<=14)? 2 : 3);\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Ключ" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Запись включена" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Создан" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Истекает" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Последнее использование" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "Разрешенные IP-адреса" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Вошел(-ла) в систему как {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Вы вышли из системы." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Ваши настройки были обновлены." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "Учетные данные доменных пользователей нельзя изменить в NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Ваш пароль успешно изменен." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Запланировано" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Эксплутация" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Активный" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Оффлайн" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Вывод из эксплуатации" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Списан" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Основной" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Вторичный" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Третичный" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Неактивный" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Регион (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Регион (подстрока)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Группа сайтов (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Группа сайтов (подстрока)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Сайт" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Сайт (подстрока)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Провайдер (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Провайдер (подстрока)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Аккаунт провайдера (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Учетная запись провайдера" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Сеть провайдера (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Тип канала связи (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Тип канала связи (подстрока)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Сайт (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Точка подключения A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Поиск" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Канал связи" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Сеть провайдера (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Канал связи (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Канал связи (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Группа каналов связи (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Группа каналов связи (подстрока)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Описание" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Провайдер" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "Идентификатор Службы" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Цвет" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Тип" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Аккаунт провайдера" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Статус" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Арендатор" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Дата установки" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Дата отключения" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Гарантированная скорость (Кбит/с)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Параметры Службы" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Аренда" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Сеть провайдера" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Скорость порта (Кбит/с)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Скорость восходящего потока (Кбит/с)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Пометить подключенным" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Точка подключения канала связи" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Сведения об точке подключения" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Приоритет" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Назначенный провайдер" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Назначенный аккаунт провайдера" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Тип канала связи" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Операционный статус" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Назначенный арендатор" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Прекращение" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Сеть провайдера" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Локация" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Контакты" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Регион" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Группа сайтов" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Атрибуты" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Аккаунт" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Терминология" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Задание" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Группа" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Группа каналов связи" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "цвет" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "тип канала связи" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "типы каналов связи" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "Идентификатор канала связи" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Уникальный ID канала связи" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "статус" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "установлен" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "разобран" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "гарантированная скорость (Кбит/с)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Гарантированная скорость" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "канал связи" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "каналы связи" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "группа каналов связи" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "группы каналов связи" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "приоритет" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Назначение группы каналов связи" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Назначения групп каналов связи" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "завершение" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "скорость порта (Кбит/с)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Физическая скорость канала связи" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "скорость отдачи (Кбит/с)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Скорость отдачи, если она отличается от скорости порта" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ID кросс-соединения" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "ID локального кросс-соединения" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "патч-панель или порт(ы)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "ID патч-панели и номера порта(-ов)" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "описание" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "точка подключения канала связи" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "точки подключения канала связи" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Оконечное устройство канала должно быть подключено либо к узлу, либо к сети " "провайдера." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Терминатор канала не может быть подключен как к сайту, так и к сети " "поставщика." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "имя" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Полное имя провайдера" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "подстрока" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "провайдер" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "провайдеры" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "идентификатор аккаунта" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "аккаунт провайдера" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "аккаунты провайдера" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "идентификатор службы" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "сеть провайдера" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "сети провайдера" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Имя" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Каналы связи" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "Идентификатор канала связи" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Сторона А" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Сторона Z" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Гарантированная скорость" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Комментарии" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Задания" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Аккаунты" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Количество аккаунтов" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Количество ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Не определены точки подключения для канала связи {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Поменены местами точки подключения для канала связи {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "" "У этого пользователя нет разрешения на синхронизацию этого источника данных." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Новый" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "В очереди" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Синхронизируется" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Завершено" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Неисправно" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Скрипты" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Отчеты" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "В ожидании" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Запланировано" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Исполняется" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Ошибка" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Обновлено" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Удалено" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Закончено" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Запущено" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Отложено" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Остановлен" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Отменено" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Локальный" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Имя пользователя" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Используется только для клонирования по HTTP (S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Пароль" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Ветка" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Не удалось получить удаленные данные ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "ID ключа доступа AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Секретный ключ доступа AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Объект создан" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Объект обновлен" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Объект удален" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Задача начата" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Задача выполнена" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Задача не выполнена" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Задача выполнена с ошибкой" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Источник данных (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Источник данных (имя)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Пользователь (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Имя пользователя" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Включено" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Параметры" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Правила исключения" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Источник данных" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Файл" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Источник данных" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Создание" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Тип объекта" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Создано после" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Создано до" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Запланировано после" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Запланировано до" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Запустилось после" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Запустилось до" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Завершено после" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Завершено до" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Пользователь" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Время" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "После" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "До" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Действие" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Источник" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Параметры backend" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Загрузка файла" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "" "Невозможно загрузить файл и синхронизировать его с существующим файлом" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "Необходимо загрузить файл или выбрать файл данных для синхронизации" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Фасады стоек" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Мощность" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Безопасность" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Баннеры" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Разбивка на страницы" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Валидация" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Пользовательские настройки" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Разное" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Ревизия конфигурации" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Этот параметр определен статически и не может быть изменен." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Текущее значение: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (по умолчанию)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "время" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "имя пользователя" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "идентификатор запроса" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "действие" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "данные перед изменением" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "данные после изменений" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "изменение объекта" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "изменения объекта" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "" "Ведение журнала изменений не поддерживается для этого типа объектов " "({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "создан(а)" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "комментарий" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "конфигурационные данные" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "ревизия конфигурации" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "ревизии конфигураций" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Конфигурация по умолчанию" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Текущая конфигурация" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Ревизия конфигурации #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "тип" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "включен" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "правила исключения" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Шаблоны (по одному в строке), соответствующие файлам, которые следует " "игнорировать при синхронизации" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "параметры" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "время последней синхронизации" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "источник данных" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "источники данных" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Неизвестный тип backend: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Невозможно запустить синхронизацию; синхронизация уже выполняется." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1903,1222 +2169,1284 @@ msgstr "" "Произошла ошибка при инициализации бэкэнда. Необходимо установить " "зависимость: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "последнее обновление" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "путь" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Путь к файлу относительно корня источника данных" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "размер" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "хэш" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Длина должна быть 64 шестнадцатеричных символа." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256 хэш данных файла" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "файл данных" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "файлы данных" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "автоматическая синхронизация записи" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "автоматическая синхронизация записей" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "корень файла" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "путь к файлу" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Путь к файлу относительно указанного корневого пути" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "Настраиваемый файл" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "Настраиваемые файлы" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "по расписанию" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "интервал" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Интервал повторения (в минутах)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "начало" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "завершено" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "данные" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "ошибка" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "идентификатор задачи" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "задача" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr " задачи" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Нельзя присвоить задачи этому типу объектов ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Неверный статус для завершения задачи. Возможны следующие варианты: " "{choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "Невозможно вызвать enqueue() со значениями schedule_at и immediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Удаление предотвращается правилом защиты: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Полное имя" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Объект" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "Идентификатор запроса" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Активен" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Путь" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Последнее обновление" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Интервал" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Версия" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Последнее обновление" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Минимальная версия NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Максимальная версия NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Данные плагина не найдены" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Автор" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Установлен" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Сертифицирован" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Опубликовано" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Установленная версия" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Последняя версия" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Самая старая задача" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Рабочие процессы" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Хост" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Порт" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "БАЗА ДАННЫХ" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "PID планировщика" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Очереди не найдены" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "В очереди" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Закончено" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Вызываемый" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Задач не найдено" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Состояние" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Рождение" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "ПІД" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Рабочие процессы не найдены" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Задача #{id} для синхронизации {datasource} добавлена в очередь" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Ревизия конфигурации #{id} восстановлена" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Задача {job_id} не найдена" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Задача {id} была удалена." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Ошибка при удалении задачи {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Задача {id} не найдена." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "вЗадача {id} была повторно добавлена в очередь." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Задача {id} добавлена в очередь." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Задача {id} остановлена." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Не удалось остановить задачу {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Не удалось загрузить каталог плагинов" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Плагин {name} не найден" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Позиция (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Идентификатор объекта" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Подготовка к развертыванию" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Вывод из эксплуатации" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr " Вывод из эксплуатации" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2-стоечная рама" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4-стоечная рама" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4-стоечный шкаф" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Настенная рама" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Настенная рама (вертикальная)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Настенный шкаф" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Настенный шкаф (вертикальный)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} дюймов" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Зарезервировано" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Доступно" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Выведенный(-ая) из использования" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Миллиметры" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Дюймы" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Спереди назад" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Сзади вперед" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Родитель" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Потомок" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Вид спереди" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Вид сзади" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Подготовлен" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Инвентарь" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Слева направо" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Справа налево" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Бок назад" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Сзади в сторону" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Снизу вверх" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Сверху вниз" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Пассивный" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Смешанный" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (не блокирующий)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (блокирующий)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Калифорнийский стиль" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "ITA/Международный" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Проприетарный" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Другой" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Международный" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Физический" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Виртуальный" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Беспроводной" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Виртуальные интерфейсы" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Мост" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Группа агрегации линков (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (фиксированный)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (модульный)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (объединительная плата)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Сотовая связь" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Серийный" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Коаксиальный" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Стекирование" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Полу" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Полный" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Авто" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Доступ" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Тегированный" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Тегированный (все)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Стандарт IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Пассивный режим 24 В (2 пары)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Пассивное напряжение 24 В (4 пары)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Пассивное напряжение 48 В (2 пары)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Пассивное напряжение 48 В (4 пары)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Медь" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Оптоволоконное" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Волокно" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Подключено" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Километры" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Метры" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Сантиметры" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Мили" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Футы" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Килограммы" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Граммы" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Фунты" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Унции" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Резервный" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Однофазный" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Трехфазный" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Неверный формат MAC-адреса: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Неверный формат WWN: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Родительский регион (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Регион родителя (подстрока)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Родительская группа сайтов (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Группа сайтов родителя (подстрока)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Группа (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Группа (подстрока)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "Автономная система (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Родительская локация (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Локация родителя (подстрока)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Локация (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Локация (подстрока)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Производитель (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Производитель (подстрока)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Тип стойки (подстрока)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Тип стойки (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Роль (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Роль (подстрока)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Стойка (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Пользователь (имя)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Платформа по умолчанию (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Платформа по умолчанию (подстрока)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Имеет фронтальное изображение" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Имеет изображение сзади" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Имеет консольные порты" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Имеет серверные консольные порты" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Имеет порты питания" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Имеет розетки" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Имеет интерфейсы" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Имеет сквозные порты" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Имеет отсеки для модулей" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Имеет отсеки для устройств" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Имеет инвентарь" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Тип устройства (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Тип модуля (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Порт питания (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Родительский инвентарь (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Шаблон конфигурации (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Тип устройства (подстрока)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Родительское устройство (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Платформа (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Платформа (подстрока)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Имя сайта (подстрока)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Родительский ребенок (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Кластер виртуальных машин (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Группа кластеров (подстрока)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Кластерная группа (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Модель устройства (подстрока)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Полная глубина" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC-адрес" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Имеет основной IP-адрес" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Имеет внеполосный IP-адрес" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Виртуальное шасси (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Является членом виртуального шасси" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "Сервисный порт (ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Имеет контекст виртуального устройства" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "модель устройства" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Интерфейс (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Тип модуля (модель)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Отсек для модулей (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Устройство (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Стойка (имя)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Устройство (имя)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Тип устройства (модель)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Роль устройства (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Роль устройства (подстрока)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Виртуальное шасси (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Виртуальное шасси" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Модуль (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Кабель (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Назначенная VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Назначенный VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Интерфейсы виртуального шасси для устройства" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Интерфейсы виртуального шасси для устройства (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Вид интерфейса" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Родительский интерфейс (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Мостовой интерфейс (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Интерфейс LAG (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Виртуальный контекст" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Контекст виртуального устройства (идентификатор)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Беспроводная сеть" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Беспроводная связь" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Отсек для родительского модуля (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Установленный модуль (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Установленное устройство (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Установленное устройство (имя)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Мастер (удостоверение личности)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Мастер (имя)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Арендатор (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Арендатор (подстрока)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Нерасторгнутый" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Панель питания (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Теги" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Позиция" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3126,842 +3454,922 @@ msgstr "" "Поддерживаются алфавитно-цифровые диапазоны. (Должно совпадать с количеством" " создаваемых имен.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Имя контактного лица" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Контактный телефон" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Контактный адрес электронной почты" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Часовой пояс" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Производитель" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Форм-фактор" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Ширина" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Высота (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Единицы по убыванию" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Наружная ширина" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Внешняя глубина" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Внешний блок" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Глубина крепления" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Вес" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Максимальный вес" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Единица веса" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Тип стойки" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Внешние размеры" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Габариты" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Нумерация" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Роль" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Тип стойки" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Серийный номер" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Инвентарный номер" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Воздушный поток" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Стойка" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Аппаратное обеспечение" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Платформа по умолчанию" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Номер детали" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Высота U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Исключить из использования" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Тип устройства" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Тип модуля" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Шасси" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Роль виртуальной машины" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Шаблон конфигурации" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Тип устройства" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Роль устройства" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Платформа" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Кластер" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Устройство" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Конфигурация" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Виртуализация" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Тип модуля" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Лейбл" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Длина" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Единица длины" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Домен" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Панель питания" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Снабжение" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Фаза" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Напряжение" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Сила тока" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Максимальное использование" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Максимальное потребление" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Максимальная потребляемая мощность (Вт)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Выделенная мощность" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Распределенная потребляемая мощность (Вт)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Порт питания" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Фаза электропитания" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Только управление" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Режим PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Тип PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Роль беспроводной связи" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Модуль" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Виртуальные контексты" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Скорость" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Режим" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Группа VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN без тегов" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLAN с тегами" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Беспроводная группа LAN" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Беспроводные LANы" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Адресация" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Операция" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Связанные интерфейсы" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Коммутация 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Для назначения VLAN необходимо указать режим интерфейса" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Интерфейсу доступа нельзя назначать VLAN с тегами." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Название родительского региона" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Имя родительской группы сайтов" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Назначенный регион" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Назначенная группа" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "доступные опции" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Назначенное место" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Родительская локация" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Локация не найдена." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Производитель этого типа стоек" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Позиция с наименьшим юнитом в стойке" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Ширина от рельса до рельса (в дюймах)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Единица измерения внешних размеров" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Единица измерения веса стойки" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Имя назначенного арендатора" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Название назначенной роли" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Направление воздушного потока" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Родительское место" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Локация стойки (если есть)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Единицы" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Список отдельных номеров объектов, разделенных запятыми" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Производитель, выпускающий этот тип устройства" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Платформа по умолчанию для устройств этого типа (опционально)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Вес устройства" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Единица измерения веса устройства" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Вес модуля" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Единица измерения веса модуля" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Ограничьте назначение платформ этим производителем" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Назначенная роль" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Производитель типа устройства" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Модель типа устройства" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Назначенная платформа" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Виртуальное шасси" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Кластер виртуализации" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Назначенная локация (если есть)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Назначенная стойка (если есть)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Лицевая сторона" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Сторона монтажа в стойке" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Родительское устройство (для дочерних устройств)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Отсек для устройств" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Отсек для устройств, в котором установлено данное устройство (для детских " "устройств)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Устройство, в котором установлен данный модуль" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Отсек для модулей" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Отсек для модулей, в котором установлен данный модуль" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Тип модуля" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Репликация компонентов" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3969,262 +4377,269 @@ msgstr "" "Автоматическое заполнение компонентов, связанных с этим типом модуля " "(включено по умолчанию)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Принять компоненты" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Используйте уже существующие компоненты" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Тип порта" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Скорость порта в бит/с" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Тип розетки" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Локальный порт питания, питающий эту розетку" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Электрическая фаза (для трехфазных цепей)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Родительский интерфейс" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Мостовой интерфейс" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Lag" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Родительский интерфейс LAG" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Виртуальные контексты устройств(VDCs)" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "Имена VDC разделены запятыми и заключены в двойные кавычки. Пример:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Физическая среда" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Дуплекс" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Режим Poe" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Тип Poe" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Рабочий режим IEEE 802.1Q (для интерфейсов L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Назначенный VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Роль Rf" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Роль беспроводной сети (точка доступа/станция)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "В ПОСТОЯННОГО ТОКА {vdc} не присвоено устройству {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Задний порт" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Соответствующий задний порт" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Классификация физических сред" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Установленное устройство" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Дочернее устройство, установленное в этом отсеке" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Дочернее устройство не найдено." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Предмет родительского инвентаря" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Тип компонента" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Тип компонента" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Имя компонента" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Имя компонента" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Компонент не найден: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Устройство на стороне А" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Имя устройства" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Сторона типа А" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Тип точки подключения" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Название стороны А" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Название точки подключения" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Устройство на стороне B" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Тип стороны B" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Название стороны B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Состояние подключения" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Сторона {side_upper}: {device} {termination_object} уже подключен" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} боковое завершение не найдено: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Мастер" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Мастер-устройство" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Имя родительского сайта" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Панель питания в восходящем направлении" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Основное или резервное" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Тип питания (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Однофазный или трехфазный" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Основной IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Адрес IPv4 с маской, напр. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Основной IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Адрес IPv6 с длиной префикса, напр. 2001:db8::1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4234,7 +4649,7 @@ msgstr "" "родительское устройство/виртуальная машина интерфейса, или они должны быть " "глобальными" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4242,7 +4657,7 @@ msgstr "" "Невозможно установить модуль со значениями-заполнителями в модульном отсеке " "без определенного положения." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4251,189 +4666,200 @@ msgstr "" "Невозможно установить модуль с указанами значениями на уровне {level}, но " "переданы значения {tokens}." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" "Невозможно принять {model} {name} поскольку оно уже принадлежит модулю" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "A {model} названный {name} уже существует" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Панель питания" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Подача питания" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Сторона" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Статус устройства" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Родительский регион" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Родительская группа" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Объект" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Тип стойки" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Функция" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Изображения" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Компоненты" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Роль подустройства" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Модель" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Имеет IP-адрес OOB" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Элемент виртуального шасси" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Имеет контексты виртуальных устройств" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Кластерная группа" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Кабельный" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Занятый" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Подключение" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Вид" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Только менеджмент" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "Глобальное уникальное имя (WWN)" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Беспроводной канал" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Частота канала (МГц)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Ширина канала (МГц)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Мощность передачи (дБм)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Кабель" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Обнаружено" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Виртуальный элемент шасси уже находится на месте {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Контактная информация" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Роль стойки" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Подстрока" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Выберите заранее определенный тип стойки или задайте физические " "характеристики ниже." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Управление запасами" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4441,144 +4867,171 @@ msgstr "" "Список числовых идентификаторов, разделенных запятыми. Диапазон можно " "указать с помощью дефиса." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Резервирование" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Роль устройства" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Устройство с наименьшим номером, занимаемое устройством" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "Положение в виртуальном корпусе этого устройства определяется по" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Приоритет устройства в виртуальном шасси" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Автоматическое заполнение компонентов, связанных с этим типом модуля" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Характеристики" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Шаблон консольного порта" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Шаблон порта консольного сервера" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Шаблон переднего порта" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Шаблон интерфейса" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Шаблон розетки питания" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Шаблон порта питания" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Шаблон заднего порта" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Интерфейс" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Консольный порт" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Порт консольного сервера" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Передний порт" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Задний порт" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Порт питания" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Розетка питания" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Назначение компонентов" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Инвентарный номер можно присвоить только одному компоненту." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Интерфейс LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Фильтровать доступные к назначению VLAN-ы по группе." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Дочернее устройство" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4586,32 +5039,35 @@ msgstr "" "Сначала необходимо создать дочерние устройства и назначить их сайту и стойке" " родительского устройства." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Консольный порт" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Порт консольного сервера" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Передний порт" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Розетка питания" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Комплектующие" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Роли комплектующих" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4619,7 +5075,7 @@ msgstr "" "Поддерживаются алфавитно-цифровые диапазоны. (Количество создаваемых " "объектов должно соответствовать количеству создаваемых объектов.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4628,18 +5084,19 @@ msgstr "" "Предоставленный шаблон определяет {value_count} ценности, но {pattern_count}" " ожидаются." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Задние порты" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Выберите одно назначение заднего порта для каждого создаваемого переднего " "порта." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4649,16 +5106,7 @@ msgstr "" "должно соответствовать выбранному количеству положений задних портов " "({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Строка {module} будет заменено позицией назначенного модуля, " -"если таковая имеется." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4668,17 +5116,18 @@ msgstr "" "соответствовать выбранному количеству положений задних портов " "({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Участники" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Исходное положение" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4686,67 +5135,69 @@ msgstr "" "Положение первого элементного устройства. Увеличивается на единицу за каждый" " дополнительный элемент." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Должность должна быть указана для первого члена VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr " лейбл" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "Длина" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "единица длины" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "кабель" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "кабели" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "При настройке длины кабеля необходимо указать единицу измерения" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "" "При создании нового кабеля необходимо определить концевые разъемы A и B." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "" "Невозможно подключить разные типы разъемов к одному и тому же концу кабеля." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Несовместимые типы терминации: {type_a} а также {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Окончания A и B не могут подключаться к одному и тому же объекту." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "конец" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "точка подключения кабеля" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "точки подключения кабеля" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4755,38 +5206,38 @@ msgstr "" "Обнаружен дубликат подключения для {app_label}.{model} {termination_id}: " "кабель {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Кабели не могут быть подключены к {type_display} интерфейсов" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Концевые разъемы, подключенные к сети провайдера, могут не подключаться к " "кабелям." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "активен" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "завершен" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "разделен" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "кабельная трасса" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "кабельные трассы" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4795,16 +5246,16 @@ msgstr "" "{module} принимается в качестве замены положения отсека для модулей при " "подключении к модулю того или иного типа." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Физический лейбл" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "Шаблоны компонентов нельзя перемещать на устройства другого типа." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4812,145 +5263,145 @@ msgstr "" "Шаблон компонента нельзя связать как с типом устройства, так и с типом " "модуля." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" "Шаблон компонента должен быть связан с типом устройства или типом модуля." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "шаблон консольного порта" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "шаблоны консольных портов" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "шаблон порта консольного сервера" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "шаблоны портов консольного сервера" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "максимальное потребление" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "выделенное потребление" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "шаблон порта питания" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "шаблоны портов питания" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Выделенная мощность не может превышать максимальную ({maximum_draw}Вт)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "фаза электропитания" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Фаза (для трехфазных)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "шаблон розетки питания" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "шаблоны розеток питания" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Родительский порт питания ({power_port}) должен принадлежать тому же типу " "устройства" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Родительский порт питания ({power_port}) должен принадлежать тому же типу " "модулей" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "только управление" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "интерфейс моста" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "роль беспроводной сети" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "шаблон интерфейса" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "шаблоны интерфейсов" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Интерфейс не может быть подключен к самому себе." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Интерфейс моста ({bridge}) должно принадлежать к тому же типу устройства" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Интерфейс моста ({bridge}) должен принадлежать к одному типу модулей" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "положение заднего порта" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "шаблон переднего порта" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "шаблоны передних портов" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Задний порт ({name}) должно принадлежать к тому же типу устройства" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4959,48 +5410,48 @@ msgstr "" "Неверное положение заднего порта ({position}); задний порт {name} имеет " "только {count} позиции" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "позиция" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "шаблон заднего порта" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "шаблоны задних портов" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "позиция" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Идентификатор, на который следует ссылаться при переименовании установленных" " компонентов" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "шаблон модульного отсека" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "шаблоны модульных отсеков" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "шаблон отсека для устройств" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "шаблоны отсеков для устройств" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5009,203 +5460,208 @@ msgstr "" "Роль подустройства типа устройства ({device_type}) должно быть установлено " "значение «родительский», чтобы разрешить отсеки для устройств." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "номер модели" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Номер модели, присвоенный производителем" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "шаблон инвентарного товара" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "шаблоны товаров инвентаря" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Компоненты нельзя перемещать на другое устройство." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "конец кабеля" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "отметка подключена" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Обращайтесь так, как будто кабель подключен" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "При подключении кабеля необходимо указать конец кабеля (A или B)." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Нельзя указывать конец кабеля без указания самого кабеля." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Невозможно отметить как подключенный, если присоединен кабель." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} модели должны объявить свойство parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Тип физического порта" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "скорость" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Скорость порта в битах в секунду" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "консольный порт" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "консольные порты" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "порт консольного сервера" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "порты консольного сервера" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "порт питания" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "порты питания" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "розетка питания" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "розетки питания" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Родительский порт питания ({power_port}) должен принадлежать тому же " "устройству" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "режим" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Стратегия маркировки IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "родительский интерфейс" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "родительский LAG" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Этот интерфейс используется только для внеполосного управления" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "скорость (Кбит/с)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "дуплекс" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-битное всемирное имя" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "беспроводной канал" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "частота канала (МГц)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Заполнено выбранным каналом (если задано)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "мощность передачи (дБм)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "беспроводные LANs" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN без тегов" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLAN без тегов" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "интерфейс" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "интерфейсы" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} к интерфейсам нельзя подключать кабель." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} интерфейсы нельзя пометить как подключенные." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Интерфейс не может быть собственным родителем." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Родительскому интерфейсу могут быть назначены только виртуальные интерфейсы." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5214,7 +5670,7 @@ msgstr "" "Выбранный родительский интерфейс ({interface}) принадлежит другому " "устройству ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5223,7 +5679,7 @@ msgstr "" "Выбранный родительский интерфейс ({interface}) принадлежит {device}, который" " не является частью виртуального шасси {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5232,7 +5688,7 @@ msgstr "" "Выбранный интерфейс моста ({bridge}) принадлежит другому устройству " "({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5241,22 +5697,22 @@ msgstr "" "Выбранный интерфейс моста ({interface}) принадлежит {device}, который не " "является частью виртуального шасси {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Виртуальные интерфейсы не могут иметь родительский интерфейс LAG." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Интерфейс LAG не может быть собственным родителем." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" "Выбранный интерфейс LAG ({lag}) принадлежит другому устройству ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5265,47 +5721,47 @@ msgstr "" "Выбранный интерфейс LAG ({lag}) принадлежит {device}, который не является " "частью виртуального шасси {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Виртуальные интерфейсы не могут иметь режим PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Виртуальные интерфейсы не могут иметь тип PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "При назначении типа PoE необходимо указать режим PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "Роль беспроводной связи может быть установлена только на беспроводных " "интерфейсах." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Канал можно настроить только на беспроводных интерфейсах." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "Частота канала может быть установлена только на беспроводных интерфейсах." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Невозможно указать произвольную частоту для выбранного канала." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "Ширина канала может быть установлена только на беспроводных интерфейсах." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "Невозможно указать произвольную ширину полосы для выбранного канала." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5314,25 +5770,25 @@ msgstr "" "VLAN без тегов ({untagged_vlan}) должно принадлежать тому же сайту, что и " "родительское устройство интерфейса, или оно должно быть глобальным." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Нанесенное на карту положение на соответствующем заднем порту" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "фронтальный порт" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "фронтальные порты" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "" "Задний порт ({rear_port}) должно принадлежать одному и тому же устройству" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5341,19 +5797,19 @@ msgstr "" "Неверное положение заднего порта ({rear_port_position}): Задний порт {name} " "имеет только {positions} позиции." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Количество передних портов, которые можно сопоставить" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "задний порт" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "задние порты" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5362,37 +5818,38 @@ msgstr "" "Количество позиций не может быть меньше количества сопоставленных передних " "портов ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "модульный отсек" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "отсеки для модулей" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "Отсек для модулей не может принадлежать установленному в нем модулю." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "отсек для устройств" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "отсеки для устройств" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Этот тип устройства ({device_type}) не поддерживает отсеки для устройств." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Невозможно установить устройство в само по себе." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5400,114 +5857,116 @@ msgstr "" "Невозможно установить указанное устройство; устройство уже установлено в " "{bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "роль элемента инвентаря" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "роли элементов инвентаря" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "серийный номер" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "инвентарный номер" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Инвентарный номер, используемый для идентификации этого элемента" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "обнаружено" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Этот элемент был обнаружен автоматически" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "элемент инвентаря" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "элементы инвентаря" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Невозможно назначить себя родителем." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "" "Предмет родительского инвентаря не принадлежит одному и тому же устройству." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Невозможно переместить инвентарь вместе с дочерней зависимостью" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "" "Невозможно присвоить инвентарный предмет компоненту на другом устройстве" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "производитель" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "производители" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "модель" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "платформа по умолчанию" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "номер модели" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Дискретный номер детали (опционально)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "высота (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "исключить из использования" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "Устройства этого типа исключаются при расчёте загруженности стоек." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "полная глубина" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "" "Устройство занимает/блокирует юниты с обоих сторон стойки (спереди и сзади)." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "статус родителя/потомка" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5516,24 +5975,24 @@ msgstr "" "устройств. Оставьте поле пустым, если этот тип устройства не относится ни к " "родительскому, ни к дочернему." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "воздушный поток" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "тип устройства" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "типы устройств" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "Высоту в юнитах нужно указывать с шагом 0.5 юнита." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5542,7 +6001,7 @@ msgstr "" "Устройству {device} в стойке {rack} для размещения на высоте {height}U не " "хватет свободных юнитов." -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5552,7 +6011,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} экземпляр(ов) уже смонтированых в" " стойках." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5560,156 +6019,156 @@ msgstr "" "Необходимо удалить все шаблоны отсеков устройств, связанные с этим " "устройством, прежде чем рассекретить его как родительское устройство." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Типы дочерних устройств должны быть 0U." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "тип модуля" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "типы модулей" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Эта роль может быть назначена виртуальным машинам." -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "роль устройства" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "роли устройств" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "Опционально ограничьте эту платформу устройствам определенного производителя" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "платформа" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "платформы" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Функция, которую выполняет это устройство" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Серийный номер шасси, присвоенный производителем" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Уникальный тег, используемый для идентификации этого устройства" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "положение (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "лицевая сторона стойки" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "основной IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "основной IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "внеполосный IP-адрес" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Позиция VC" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Положение виртуального шасси" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Приоритет VC" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Приоритет выбора основного виртуального шасси" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "широта" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS координата в десятичном формате (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "долгота" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Имя устройства должно быть уникальным для каждого сайта." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "устройство" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "устройства" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Стойка {rack} не принадлежит сайту {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Локация {location} не принадлежит сайту {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Стойка {rack} не принадлежит локации {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Невозможно выбрать лицевую сторону стойки, не выбрав саму стойку." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Невозможно выбрать позицию в стойке, не выбрав саму стойку." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Позиция должна быть указана с шагом 0,5 единицы стойки." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "При определении лицевой стороны необходимо указать позицию в стойке." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "Тип устройства 0U ({device_type}) не может быть отнесено к стойке." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5717,7 +6176,7 @@ msgstr "" "Устройствам с указанным в типе свойством \"дочернее\" нельзя выбрать лицевую" " сторону стойки. Этот атрибут указывается для \"родительского\" устройства." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5725,7 +6184,7 @@ msgstr "" "Типы дочерних устройств нельзя отнести к позиции в стойке. Это атрибут " "родительского устройства." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5734,22 +6193,22 @@ msgstr "" "U{position} уже занят или в нем недостаточно места для размещения этого типа" " устройств: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} не является адресом IPv4." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Указанный IP-адрес ({ip}) не назначено этому устройству." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} не является адресом IPv6." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5758,18 +6217,18 @@ msgstr "" "Назначенная платформа ограничена {platform_manufacturer} типы устройств, но " "данный тип устройства относится к {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Назначенный кластер принадлежит другому сайту ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Положение устройства, назначенного виртуальному шасси, должно быть " "определено." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5778,15 +6237,15 @@ msgstr "" "Устройство нельзя удалить из виртуального корпуса {virtual_chassis} потому " "что в настоящее время оно назначено его хозяином." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "модуль" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "модули" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5795,21 +6254,21 @@ msgstr "" "Модуль должен быть установлен в модульном отсеке, принадлежащем назначенному" " устройству ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "Домен" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "виртуальное шасси" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "Выбранный мастер ({master}) не назначено этому виртуальному шасси." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5818,61 +6277,61 @@ msgstr "" "Невозможно удалить виртуальное шасси {self}. Существуют интерфейсы-члены, " "которые образуют межкорпусные интерфейсы LAG." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "идентификатор" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Цифровой идентификатор, уникальный для родительского устройства" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "комментарии" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "виртуальный контекст" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "виртуальные контексты" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} не является IPV{family} адрес." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "Основной IP-адрес должен принадлежать интерфейсу на назначенном устройстве." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "вес" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "весовая единица" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "При установке веса необходимо указать единицу измерения" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "панель питания" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "панели питания" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5880,43 +6339,43 @@ msgstr "" "Расположение локации{location} ({location_site}) не соответствует " "требующемуся сайту {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "запас" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "фаза" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "напряжение" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "сила тока" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "максимальное использование" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Максимально допустимое потребление (в процентах)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "доступная мощность" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "подача питания" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "источники питания" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5925,63 +6384,63 @@ msgstr "" "Стойка {rack} ({rack_site}) и панель питания {powerpanel} " "({powerpanel_site}) расположены на разных сайтах." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Напряжение питания переменного тока не может быть отрицательным" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "ширина" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Ширина от рельса до рельса" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Высота в юнитах стойки" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "начальный юнит" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Начальный юнит для стойки" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "единицы по убыванию" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Единицы нумеруются сверху вниз" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "внешняя ширина" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Наружный размер стойки (ширина)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "внешняя глубина" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Внешний размер стойки (глубина)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "внешний юнит" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "глубина монтажа" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5990,75 +6449,76 @@ msgstr "" "четырехстоечных стоек это расстояние между передними и задними " "направляющими." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "максимальный вес" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Максимальная грузоподъемность стойки" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "форм-фактор" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "тип стойки" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "типы стоек" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "При настройке внешней ширины/глубины необходимо указать единицу измерения" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "При установке максимального веса необходимо указать единицу измерения" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "назначение стойки" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "назначение стоек" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "идентификатор объекта" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Локально назначенный идентификатор" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Функциональная роль" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Инвентарный номер, используемый для идентификации этой стойки" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "стойка" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "стойки" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "Назначенная локация должна принадлежать родительскому сайту ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6067,7 +6527,7 @@ msgstr "" "Стойка должна иметь высоту не менее {min_height}чтобы разместить, " "установленные в настоящее время устройства." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6076,895 +6536,957 @@ msgstr "" "Нумерация стоек должна начинаться с {position} или меньше для размещения " "установленных в настоящее время устройств." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Локация должна располагаться в том-же сайте, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "юниты" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "Резервирование стойки" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "Резервирование стоек" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" "Неверные единицы измерения для стоек высотой{height}U по списку: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Следующие юниты уже зарезервированы: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Регион верхнего уровня с таким названием уже существует." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Регион верхнего уровня с этой подстрокой уже существует." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "регион" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "регионы" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Группа сайтов верхнего уровня с таким именем уже существует." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Группа сайтов верхнего уровня с этой подстрокой уже существует." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "группа сайта" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "группы сайтов" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Полное имя сайта" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "объект" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Идентификатор или описание местного объекта" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "физический адрес" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Физическое местоположение здания" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "адрес доставки" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Если отличается от физического адреса" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "сайт" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "сайты" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Локация с таким именем уже существует в указанном сайте." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Локация с этой подстрокой уже существует в указанном сайте." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "локация" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "локации" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Родительская локация ({parent}) должна принадлежать тому же сайту ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Точка подключения A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Точка подключения Б" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Устройство A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Устройство Б" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Локация A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Локация Б" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Стойка A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Стойка Б" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Сайт A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Сайт Б" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Доступен" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Устройства" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "Виртуальные машины" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Шаблон конфигурации" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Группа сайтов" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP-адрес" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Адрес IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Адрес IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Позиция в шасси" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Приоритет шасси" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Родительское устройство" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Положение (отсек для устройств)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Консольные порты" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Порты консольного сервера" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Порты питания" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Розетки питания" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Интерфейсы" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Фронтальные порты" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Отсеки для устройств" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Отсеки для модулей" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Комплектующие" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Модульный отсек" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Предметы инвентаря" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Цвет кабеля" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Связать узлы" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Отметить подключение" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Максимальная потребляемая мощность (Вт)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Выделенная мощность (Вт)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP-адреса" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Группы FHRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Туннель" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Только управление" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "Виртуальные контексты устройств(VDCs)" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Установленный модуль" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Серийный номер модуля" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Тег активов модуля" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Состояние модуля" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Компонент" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Предметы" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Типы устройств" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Типы модулей" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Платформы" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Платформа по умолчанию" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Полная глубина" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Высота U" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Инстансы" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Порты консоли" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Порты консольного сервера" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Порты питания" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Розетки питания" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Фронтальные порты" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Задние порты" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Отсеки для устройств" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Отсеки для модулей" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Источники питания" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Максимальное использование" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Доступная мощность (ВА)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Стойки" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Высота" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Внешняя ширина" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Внешняя глубина" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Максимальный вес" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Пространство" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Сайты" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "" "В тестовом примере должно быть установлено значение peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Отключен {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Резервирование" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Устройства без стоек" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Контекст конфигурации" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Конфигурация рендера" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Во время рендеринга шаблона произошла ошибка: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Виртуальные машины" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Установлено устройство {device} в отсек {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Удалено устройство {device} из отсека {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Потомки" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Добавлен участник {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Невозможно удалить главное устройство {device} из виртуального шасси." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "{device} удалено из виртуального шасси {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Неизвестный связанный объект (ы): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Изменение типа настраиваемых полей не поддерживается." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Для этого сценария планирование отключено." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Текст" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Текст (длинный)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Целое число" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Десятичный" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Логическое значение (истинно/ложь)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Дата" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Дата и время" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Выбор" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Множественный выбор" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Несколько объектов" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Инвалид" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Свободный" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Точный" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Всегда" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Если установлено" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Скрытый" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Да" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Нет" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Ссылка" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Новейший" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Самый старый" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "В алфавитном порядке (А-Я)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "В обратном алфавитном порядке (Я-А)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Информация" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Успех" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Предупреждение" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Опасность" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Отладка" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "По умолчанию" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Неудача" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Ежечасно" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 часов" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Ежедневно" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Еженедельно" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 дней" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Создать" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Обновить" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Удалить" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Синий" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Темно-синий" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Фиолетовый" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Розовый" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Красный" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Оранжевый" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Желтый" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Зелёный" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Cине-зеленый" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Голубой" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Серый" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Черный" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Белый" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Вебхук" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Сценарий" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Уведомление" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "" "Неизвестный оператор: {op}. Должен быть одним из следующих: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Неподдерживаемый тип значения: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Неверный тип для {op} операция: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Набор правил должен быть словарем, а не {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Неверный тип логики: должен быть И или ИЛИ. Пожалуйста, проверьте " "документацию." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Введены неверные ключ(и). Пожалуйста, проверьте документацию." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Тип виджета" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Незарегистрированный класс виджета: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} должен определить метод render ()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Примечание" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Отображает произвольный пользовательский контент. Поддерживается разметка " "Markdown." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Количество объектов" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6972,269 +7494,291 @@ msgstr "" "Отобразите набор моделей NetBox и количество объектов, созданных для каждого" " типа." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Фильтры, применяемые при подсчете количества объектов" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "" "Неверный формат. Фильтры объектов необходимо передавать в виде словаря." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Список объектов" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Отобразите произвольный список объектов." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Количество отображаемых объектов по умолчанию" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "Неверный формат. Параметры URL должны быть переданы в виде словаря." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS-канал" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Вставьте RSS-канал с внешнего веб-сайта." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL-адрес ленты" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Максимальное количество отображаемых объектов" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Как долго хранить кэшированный контент (в секундах)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Закладки" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Покажите свои личные закладки" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Неизвестный тип действия для правила события: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Невозможно импортировать конвейер событий {name} ошибка: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Модуль сценария (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Файл данных (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Группа (название)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Тип кластера" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Тип кластера (подстрока)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Группы арендаторов" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Группа арендаторов (подстрока)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Тег" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Тег (подстрока)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Имеет локальные контекстные данные конфигурации" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Название группы" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Обязательно" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Должно быть уникальным" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Видимый пользовательский интерфейс" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Редактируемый UI" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Можно клонировать" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Минимальное значение" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Максимальное значение" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Регулярное выражение валидации" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Поведение" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Новое окно" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Класс кнопки" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Тип MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Расширение файла" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "В качестве вложения" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Общий" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Метод HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL-адрес полезной нагрузки" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Проверка SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Секрет" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Путь к файлу CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Типы событий" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Активен" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Типы объектов" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Один или несколько назначенных типов объектов" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Тип данных поля (например, текст, целое число и т. д.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Тип объекта" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "" "Тип объекта (для полей объектов или полей, состоящих из нескольких объектов)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Набор для выбора" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Набор вариантов (для полей выбора)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Отображается ли настраиваемое поле в пользовательском интерфейсе" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "" "Доступно ли редактирование настраиваемого поля в пользовательском интерфейсе" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "Базовый набор стандартных вариантов для использования (если есть)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7243,187 +7787,203 @@ msgstr "" "запятыми, с дополнительными метками через двоеточие: «Choice1:First Choice, " "Choice2:Second Choice»" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "класс кнопок" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Класс первой ссылки в группе будет использоваться для кнопки раскрывающегося" " списка" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Тип(ы) события(-ий), при котором будет запущено это правило" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Объект действия" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Имя веб-хука или скрипт в виде пунктирного пути module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Вебхук {name} не найден" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Сценарий {name} не найден" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Назначенный тип объекта" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Классификация записей" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Пользователи" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Имена пользователей, разделенные запятыми и заключенные в двойные кавычки" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Группы" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Имена групп, разделенные запятыми и заключенные в двойные кавычки" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Тип связанного объекта" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Тип поля" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Варианты" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Данные" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Файл данных" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Типы контента" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Тип содержимого HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Тип события" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Тип действия" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Тип объекта с тегами" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Разрешенный тип объекта" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Регионы" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Группы сайтов" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Локации" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Типы устройств" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Роли" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Типы кластеров" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Кластерные группы" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Кластеры" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Группы арендаторов" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Тип(ы) объекта(-ов), в котором есть это настраиваемое поле" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Значение по умолчанию" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "" "Тип связанного объекта (только для полей объектов/нескольких объектов)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Фильтр связанных объектов" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Укажите параметры запроса в виде объекта JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Настраиваемое Поле" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7431,7 +7991,7 @@ msgstr "" "Тип данных, хранящихся в этом поле. Для полей объектов или полей, состоящих " "из нескольких объектов, выберите соответствующий тип объекта ниже." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7439,11 +7999,11 @@ msgstr "" "Это будет отображаться в виде справочного текста для поля формы. " "Поддерживается функция Markdown." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Связанный объект" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7451,15 +8011,16 @@ msgstr "" "Введите по одному варианту в строке. Для каждого варианта можно указать " "дополнительный лейбл через двоеточие. Пример:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Настраиваемая Ссылка" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Шаблоны" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7468,60 +8029,66 @@ msgstr "" "Код Jinja2 шаблона для текста ссылки. Ссылайтесь на объект как {example}. " "Ссылки с пустым текстом отображены не будут." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "" "Код Jinja2 шаблона для URL-адреса. Ссылайтесь на объект как {example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Код шаблона" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Шаблон экспорта" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Рендеринг" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "" "Содержимое шаблона заполняется из удаленного источника, выбранного ниже." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Необходимо указать локальное содержимое или файл данных" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Сохраненный фильтр" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "В группе уведомлений укажите хотя бы одного пользователя или группу." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP-запрос" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Выбор действия" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Введите условия в JSON формат." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7529,110 +8096,112 @@ msgstr "" "Введите параметры для перехода к действию в JSON формат." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Правило мероприятия" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Триггеры" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Группа уведомлений" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Арендаторы" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Данные заполняются из удаленного источника, выбранного ниже." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Необходимо указать локальные данные или файл данных" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Контент" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Расписание на" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Запланировать выполнение отчета на установленное время" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Повторяется каждый" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Интервал повторного запуска отчета (в минутах)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (текущее время: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Запланированное время должно быть в будущем." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Зафиксируйте изменения" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Зафиксируйте изменения в базе данных (снимите флажок для пробного запуска)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Запланируйте выполнение скрипта на заданное время" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Интервал повторного запуска этого скрипта (в минутах)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Изменения в базе данных были автоматически отменены." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Скрипт прерван с ошибкой: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Возникло исключение: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Изменения в базе данных отменены из-за ошибки." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Индексаторы не найдены!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "контекст конфигурации" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "контексты конфигурации" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Данные JSON должны быть в форме объекта. Пример:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7640,19 +8209,19 @@ msgstr "" "Данные контекста локальной конфигурации имеют приоритет над исходными " "контекстами в окончательном визуализированном контексте конфигурации" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "код шаблона" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Код Jinja2 шаблона." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "параметры окружения" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7662,42 +8231,42 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">дополнительные" " параметры для Jinja2 окружения." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "шаблон конфигурации" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "шаблоны конфигураций" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Объекты, к которым относится это поле." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Тип данных, которые содержит это настраиваемое поле" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Тип объекта NetBox, которому соответствует это поле (для полей объектов)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Имя внутреннего поля" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Допустимы только буквенно-цифровые символы и символы подчеркивания." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "" "В именах настраиваемых полей недопустимо использовать два подчеркивания " "подряд (зарезервировано)." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7705,19 +8274,19 @@ msgstr "" "Имя поля, отображаемое пользователям (если оно не указано, будет " "использовано имя поля)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "имя группы" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Настраиваемые поля в одной группе будут отображаться вместе" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "Требуется" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7725,19 +8294,19 @@ msgstr "" "Это поле необходимо для создания новых объектов или редактирования " "существующего объекта." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "должен быть уникальным" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Значение этого поля должно быть уникальным для назначенного объекта" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "вес поиска" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7745,11 +8314,11 @@ msgstr "" "Взвешивание для поиска. Более низкие значения считаются более важными. Поля " "с нулевым весом поиска будут проигнорированы." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "логика фильтрации" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7757,11 +8326,11 @@ msgstr "" "Loose соответствует любому экземпляру заданной строки; точно соответствует " "всему полю." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "по умолчанию" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7769,7 +8338,7 @@ msgstr "" "Значение по умолчанию для поля (должно быть JSON-значением). Заключайте " "строки в двойные кавычки (например, «Foo»)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7777,35 +8346,35 @@ msgstr "" "Отфильтруйте варианты выбора объектов, используя dict query_params (должно " "быть значение JSON). Заключайте строки в двойные кавычки (например, «Foo»)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "вес дисплея" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Поля с большим весом отображаются в форме ниже." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "минимальное значение" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Минимальное допустимое значение (для числовых полей)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "максимальное значение" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Максимально допустимое значение (для числовых полей)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "регулярное выражение валидации" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7816,195 +8385,197 @@ msgstr "" " ^ и $ для принудительного сопоставления всей строки. Например, ^ " "[A-Z]{3}$ ограничит значения ровно тремя заглавными буквами." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "набор для выбора" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Указывает, отображается ли настраиваемое поле в пользовательском интерфейсе" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Указывает, можно ли редактировать значение настраиваемого поля в " "пользовательском интерфейсе" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "клонируется" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Реплицируйте это значение при клонировании объектов" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "настраиваемое поле" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "настраиваемые поля" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Неверное значение по умолчанию»{value}«: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Минимальное значение может быть установлено только для числовых полей" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "" "Максимальное значение может быть установлено только для числовых полей" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Проверка регулярных выражений поддерживается только для текстовых полей и " "полей URL" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Уникальность не может быть обеспечена для булевых полей" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "В полях выбора должен быть указан набор вариантов." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Варианты могут быть заданы только в полях выбора." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Поля объекта должны определять тип объекта." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} поля не могут определять тип объекта." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "Фильтр связанных объектов можно определить только для полей объектов." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Фильтр должен быть определен как словарь, сопоставляющий атрибуты со " "значениями." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Истина" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Ложь" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "" "Значения должны соответствовать этому регулярному вырагу: " "{regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Значение должно быть строкой." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Значение должно совпадать с регулярным выраженностью '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Значение должно быть целым числом." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Значение должно быть не менее {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Значение не должно превышать {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Значение должно быть десятичным." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Значение должно быть истинным или ложным." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Значения дат должны быть в формате ISO 8601 (YYYY-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Значения даты и времени должны быть в формате ISO 8601 (YYYY-MM-DD " "HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Неверный выбор ({value}2) для выбора набора {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Неверный выбор (ы){value}2) для выбора набора {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Значение должно быть идентификатором объекта, а не {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Значение должно быть списком идентификаторов объектов, а не {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Обнаружен неправильный идентификатор объекта: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Обязательное поле не может быть пустым." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Базовый набор предопределенных вариантов (опционально)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Варианты автоматически упорядочены в алфавитном порядке" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "набор вариантов для настраиваемых полей" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "наборы вариантов для настраиваемых полей" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Должен определить базовые или дополнительные варианты." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8013,60 +8584,60 @@ msgstr "" "Невозможно удалить выбор {choice} так как есть {model} объекты, ссылающиеся " "на него." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "макет" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "конфигурация" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "панель управления" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "панели управления" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "типы объектов" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Объект (объекты), к которым применяется данное правило." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Типы событий, которые повлекут за собой действие этого правила." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "условия" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Набор условий, определяющих, будет ли создано событие." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "тип действия" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Дополнительные данные для передачи объекту действия" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "правило события" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "правила мероприятия" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8076,7 +8647,7 @@ msgstr "" "вызове веб-хука. Обработка шаблона Jinja2 поддерживается в том же контексте," " что и тело запроса." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available здесь." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "дополнительные заголовки" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8102,11 +8673,11 @@ msgstr "" "быть определены в формате Название: Значение. Обработка шаблона" " Jinja2 поддерживается в том же контексте, что и тело запроса (см. ниже)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "шаблон тела" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8118,11 +8689,11 @@ msgstr "" "event, model, timestamp, " "username, request_id, и data." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "секретный" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8133,15 +8704,15 @@ msgstr "" " нагрузки в формате HMAC, в котором в качестве ключа используется секрет. " "Секрет не передается в запросе." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Включите проверку сертификата SSL. Отключайте с осторожностью!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Путь к файлу CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8149,63 +8720,63 @@ msgstr "" "Конкретный файл сертификата CA, используемый для проверки SSL. Оставьте поле" " пустым, чтобы использовать системные настройки по умолчанию." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "вебхук" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "вебхуки" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "Не указывайте файл сертификата CA, если проверка SSL отключена." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Тип (ы) объекта, к которому относится эта ссылка." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "текст ссылки" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Код Jinja2 шаблона для текста ссылки" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL-адрес ссылки" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Код Jinja2 шаблона для URL-адреса" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Ссылки с той же группой появятся в выпадающем меню" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "новое окно" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Принудительно открыть ссылку в новом окне" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "настраиваемая ссылка" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "настраиваемые ссылки" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Тип (типы) объектов, к которым применим этот шаблон." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8213,1081 +8784,1147 @@ msgstr "" "Код Jinja2 шаблона. Список экспортируемых объектов передается в виде " "контекстной переменной с именем queryset." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "По умолчанию текстовый/обычный; кодировка=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "расширение файла" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Расширение для добавления к отображаемому имени файла" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "в качестве вложения" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Загрузить файл в виде вложения" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "шаблон экспорта" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "шаблоны экспорта" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "«{name}\"— зарезервированное имя. Пожалуйста, выберите другое имя." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Тип (типы) объектов, к которым применяется этот фильтр." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "общий" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "сохраненный фильтр" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "сохраненные фильтры" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Параметры фильтра должны храниться в виде словаря аргументов ключевых слов." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "высота изображения" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "ширина изображения" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "прикрепить изображение" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "прикрепленные изображения" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "Вложенные изображения нельзя присвоить этому типу объекта ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "добрый" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "запись в журнале" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "записи в журнале" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Ведение журнала не поддерживается для этого типа объектов ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "закладка" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "закладки" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Закладки нельзя присвоить этому типу объекта ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "читать" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "событие" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "уведомление" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "уведомления" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Объекты этого типа ({type}) не поддерживают уведомления." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "групп" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "пользователей" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "группа уведомлений" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "группы уведомлений" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "подписка" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "подписки" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "является исполняемым" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "сценарий" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "сценарии" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "скриптовый модуль" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "скриптовые модули" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "отметка времени" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "полк" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "значение" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "кэшированное значение" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "кэшированные значения" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "ветка" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "ветки" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "поэтапное изменение" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "поэтапные изменения" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Тип (ы) объекта, к которому можно применить этот тег." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "тег" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "теги" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "помеченный товар" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "помеченные товары" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Данные скрипта" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Параметры выполнения сценария" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Отклонить" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Типы объектов" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Подтвердите уникальность" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Видимый" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Редактируемый" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Тип связанного объекта" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Набор для выбора" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Можно ли клонировать" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Минимальное значение" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Максимальное значение" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Валидации регулярным выражением" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Количество" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Упорядочить в алфавитном порядке" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Новое окно" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "В качестве вложения" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Файл данных" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Синхронизировано" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Изображение" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Размер (байты)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Прочтите" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Валидация SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Типы событий" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Роли устройств" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Комментарии (короткие)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Линия" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Уровень" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Сообщение" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Метод" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Убедитесь, что это значение равно %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Убедитесь, что это значение не равно %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Это поле должно быть пустым." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Это поле не должно быть пустым." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Правила валидации должны быть переданы в виде словаря" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Пользовательская проверка не удалась для {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Неверный атрибут»{name}\"по запросу" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Недопустимый атрибут \"{name}\" для {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Панель виджетов была сброшена." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Добавлен виджет: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Обновлен виджет: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Удален виджет: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Ошибка при удалении виджета: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Невозможно запустить скрипт: процесс RQ не запущен." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Введите действительный адрес IPv4 или IPv6 с дополнительной маской." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Неверный формат IP-адреса: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "Введите действительный префикс и маску IPv4 или IPv6 в нотации CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Неверный формат IP-префикса: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "Недостаточно места для размещения запрошенных размеров префиксов" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Контейнер" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Обратная петля" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Стандарт" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "CheckPoint" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Обычный текст" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Неверный формат IP-адреса: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Цель импорта" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Цель импорта (имя)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Цель экспорта" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Цель экспорта (имя)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Импорт VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Импорт VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Экспорт VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Экспорт VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Импорт L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Импорт L2VPN (идентификатор)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Экспорт L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Экспорт L2VPN (идентификатор)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Префикс" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (подстрока)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "В префиксе" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "В префиксе и включительно" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Префиксы, содержащие этот префикс или IP-адрес" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Длина маски" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Номер VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Адрес" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Диапазоны, содержащие этот префикс или IP-адрес" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Родительский префикс" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Виртуальная машина (имя)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Виртуальная машина (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Интерфейс (имя)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Интерфейс виртуальной машины (имя)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Интерфейс виртуальной машины (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP группа (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Присвоен интерфейсу" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Назначено" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Сервис (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "Внутренний NAT IP-адрес (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Назначенный интерфейс" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Назначенный интерфейс виртуальной машины" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP-адрес (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP-адрес" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Основной IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Основной IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Введите действительный адрес IPv4 или IPv6 (без маски)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Неверный формат адреса IPv4/IPv6: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "В этом поле требуется IP-адрес без маски." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Укажите действительный адрес IPv4 или IPv6." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Введите действительный адрес IPv4 или IPv6 (с маской CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Требуется маска CIDR (например, /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Шаблон адреса" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Обеспечить уникальное пространство" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Является приватным" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Дата добавления" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN группа" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Длина префикса" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Является пулом" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Считать полностью использованным" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Назначение VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS-имя" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Протокол" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Идентификатор группы" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Тип аутентификации" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Ключ аутентификации" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Аутентификация" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Тип прицела" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Область применения" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Диапазоны идентификаторов VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Сайт и группа" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Порты" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Импортируйте цели маршрута" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Экспортные цели маршрута" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Назначенный RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Группа VLAN (если есть)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Родительское устройство назначенного интерфейса (если есть)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Виртуальная машина" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Родительская виртуальная машина назначенного интерфейса (если есть)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Является основным" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Сделайте этот IP-адрес основным для назначенного устройства" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Не указано устройство или виртуальная машина; невозможно установить в " "качестве основного IP-адреса" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "" "Интерфейс не указан; невозможно установить в качестве основного IP-адреса" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Тип авторизации" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Тип прицела (приложение и модель)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Назначенная VLAN группа" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "протокол IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Требуется, если не назначено виртуальной машине" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Требуется, если не назначено устройству" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} не назначено этому устройству/виртуальной машине." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Цели маршрута" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Цели импорта" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Экспортные цели" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Импортировано компанией VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Экспортируется компанией VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Частное" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Семейство адресов" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Диапозон" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Начало" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Конец" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Поиск внутри" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Присутствует в VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Устройство/виртуальная машина" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Родительский префикс" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Назначенное устройство" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Назначенная виртуальная машина" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Назначено интерфейсу" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS-имя" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Содержит идентификатор VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Виртуальная машина" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Цель маршрута" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "агрегат" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Диапазон ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Назначение сайта/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Диапазон IP-адресов" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Группа компаний FHRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Сделайте этот IP-адрес основным для устройства/виртуальной машины" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "IP-адрес NAT (внутренний)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP-адрес можно присвоить только одному объекту." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Невозможно переназначить IP-адрес, если он назначен основным IP-адресом " -"родительского объекта" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "В качестве основных IP-адресов можно назначить только IP-адреса, назначенные" " интерфейсу." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Виртуальный IP-адрес" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Задание уже существует" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "Идентификаторы VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Дочерние VLAN" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9295,133 +9932,134 @@ msgstr "" "Список одного или нескольких номеров портов, разделенных запятыми. Диапазон " "можно указать с помощью дефиса." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Шаблон Службы" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Порт(ы)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Служба" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Шаблон службы" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Из шаблона" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Настраиваемый" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Если шаблон сервиса не используется, необходимо указать имя, протокол и порт" " (порты)." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "старт" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Диапазон ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Диапазоны ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Запуск ASN ({start}) должно быть меньше, чем конечный ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" "Региональный интернет-реестр, отвечающий за это номерное пространство AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- или 32-разрядный номер автономной системы" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "идентификатор группы" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "протокол" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "тип аутентификации" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "ключ аутентификации" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Группа FHRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Группы FHRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Групповое назначение FHRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Групповые задания FHRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "частного" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "IP-пространство, управляемое этим RIR, считается частным" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR's" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Сеть IPv4 или IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Региональный реестр Интернета, отвечающий за это IP-пространство" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "дата добавления" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "совокупный" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "сводные показатели" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Невозможно создать агрегат с маской /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9430,7 +10068,7 @@ msgstr "" "Агрегаты не могут перекрываться. {prefix} уже покрывается существующим " "агрегатом ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9439,261 +10077,271 @@ msgstr "" "Префиксы не могут перекрывать агрегаты. {prefix} охватывает существующий " "агрегат ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "роль" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "ролей" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "префикс" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Сеть IPv4 или IPv6 с маской" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Рабочий статус этого префикса" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Основная функция этого префикса" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "это пул" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Все IP-адреса в этом префиксе считаются пригодными для использования" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "использованная марка" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "префиксы" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Невозможно создать префикс с маской /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "глобальная таблица" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Дубликат префикса обнаружен в {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "начальный адрес" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Адрес IPv4 или IPv6 (с маской)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "конечный адрес" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Эксплуатационное состояние этой линейки" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Основная функция этого диапазона" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Диапазон IP-адресов" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Диапазоны IP-адресов" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Начальная и конечная версии IP-адресов должны совпадать" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Маски начального и конечного IP-адресов должны совпадать" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "Конечный адрес должен быть больше начального адреса ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Определенные адреса пересекаются с диапазоном {overlapping_range} в формате " "VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Заданный диапазон превышает максимальный поддерживаемый размер ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "адрес" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Рабочий статус этого IP-адреса" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Функциональная роль этого IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (внутри)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "IP-адрес, для которого этот адрес является «внешним»" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Имя хоста или полное доменное имя (регистр не учитывается)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP-адреса" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Невозможно создать IP-адрес с маской /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} это идентификатор сети, который не может быть присвоен интерфейсу." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" "{ip} это широковещательный адрес, который может не быть присвоен интерфейсу." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Дубликат IP-адреса обнаружен в {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Невозможно переназначить IP-адрес, если он назначен основным IP-адресом " +"родительского объекта" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Только адресам IPv6 можно присвоить статус SLAAC" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "номера портов" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "шаблон службы" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "шаблоны служб" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "Конкретные IP-адреса (если есть), к которым привязана эта служба" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "служба" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "службы" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "Службу нельзя связать как с устройством, так и с виртуальной машиной." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "Служба должна быть связана с устройством или виртуальной машиной." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Группы VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Невозможно установить scope_type без scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Невозможно установить scope_id без scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Диапазоны не могут перекрываться." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Конкретный сайт, которому назначена эта VLAN (если есть)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Группа VLAN (опционально)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Цифровой VLAN ID (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Рабочее состояние этой VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Основная функция этой VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9702,167 +10350,169 @@ msgstr "" "VLAN назначена группе {group} (область применения: {scope}); также не может " "быть присвоено сайту {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "VID должен быть в диапазонах {ranges} для виртуальных локальных сетей в " "группе {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "разграничитель маршрута" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Уникальный отличитель маршрута (как определено в RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "создайте уникальное пространство" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Предотвращение дублирования префиксов/IP-адресов в этом VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Целевое значение маршрута (отформатировано в соответствии с RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "цель маршрута" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "цели маршрута" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "АСДОТ" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Количество сайтов" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Количество провайдеров" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Агрегаты" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Добавлено" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Префиксы" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Использование" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Диапазоны IP-адресов" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Префикс (плоский)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Глубина" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Пул" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Отмечено как использованный" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Начальный адрес" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (внутри)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (за пределами сети)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Назначено" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Назначенный объект" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Тип прицела" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Диапазоны VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "КРАСНЫЙ" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Уникальный" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Цели импорта" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Цели экспорта" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "" "{prefix} не является допустимым префиксом. Вы имели в виду {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Длина префикса должна быть меньше или равна %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Длина префикса должна быть больше или равна %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9870,31 +10520,31 @@ msgstr "" "В именах DNS разрешены только буквенно-цифровые символы, звездочки, дефисы, " "точки и символы подчеркивания" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Дочерние префиксы" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Детские диапазоны" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Связанные IP-адреса" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Интерфейсы устройств" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Интерфейсы виртуальных машин" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Это поле не может быть пустым." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9902,331 +10552,344 @@ msgstr "" "Значение должно быть передано напрямую (например, «foo»: 123); не " "используйте словарь или список." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} не является правильным выбором." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Неверный тип контента: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Неверное значение. Укажите тип контента как '.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "В форме должны быть указаны диапазоны (нижний, верхний)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Границы диапазона должны быть определены целыми числами." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} должен реализовать функцию get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Неверное разрешение {permission} для модели {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Темно-красный" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Роза" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Фуксия" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Темно-фиолетовый" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Светло-синий" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Бирюзовый" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Темно-зеленый" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Светло-зеленый" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Лайм" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Янтарь" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Темно-оранжевый" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Коричневый" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Светло-серый" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Серый" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Темно-серый" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Прямой" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Загрузить" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Автоматическое обнаружение" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Запятая" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Точка с запятой" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Вкладка" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Неверный параметр конфигурации: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Баннер для входа" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Дополнительный контент для отображения на странице входа" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Баннер технического обслуживания" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Дополнительный контент для отображения в режиме обслуживания" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Верхний баннер" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "" "Дополнительный контент для отображения в верхней части каждой страницы" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Нижний баннер" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Дополнительный контент для отображения внизу каждой страницы" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Уникальное в глобальном масштабе IP-пространство" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Обеспечьте уникальную IP-адресацию в глобальной таблице" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Предпочитаю IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Предпочитайте адреса IPv4, а не IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Высота стойки" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "" "Высота единиц измерения по умолчанию для визуализированных высот стоек" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Ширина стойки" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Ширина юнита по умолчанию для визуализированных высот стоек" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Напряжение питания" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Напряжение по умолчанию для источников питания" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Сила тока в питающей сети" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Сила тока по умолчанию для источников питания" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Максимальное использование Powerfeed" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Максимальное использование по умолчанию для Powerfeeds" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Разрешенные схемы URL-адресов" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" "Разрешенные схемы URL-адресов в предоставляемом пользователем контенте" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Размер страницы по умолчанию" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Максимальный размер страницы" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Настраиваемые валидаторы" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Настраиваемые правила проверки (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Правила защиты" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Правила защиты от удаления (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Настройки по умолчанию" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Настройки по умолчанию для новых пользователей" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Режим обслуживания" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Включить режим обслуживания" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL включен" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Включите API GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Хранение журнала изменений" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Количество дней для хранения истории изменений (равно нулю без ограничений)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Сохранение результатов задач" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Количество дней для хранения истории результатов задач (укажите 0 для " "неограниченного хранения)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "URL-адрес карты" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Базовый URL-адрес для картографирования географических местоположений" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Частичное совпадение" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Точное совпадение" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Начинается с" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Заканчивается на" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regex" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Тип (ы) объекта" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Запрос" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10234,410 +10897,425 @@ msgstr "" "Подстрока тегов разделены запятыми и заключены в двойные кавычки (например, " "«tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Добавить теги" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Удалить теги" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} необходимо указать класс модели." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Неизвестное имя поля '{name}' в данных для настраиваемых полей." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Неверное значение для настраиваемого поля '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Настраиваемое поле '{name}'должно иметь уникальное значение." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Отсутствует обязательное настраиваемое поле '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Удаленный источник данных" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "путь к данным" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Путь к удаленному файлу (относительно корня источника данных)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "автоматическая синхронизация включена" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Включить автоматическую синхронизацию данных при обновлении файла данных" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "дата синхронизирована" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} должен реализовать метод sync_data ()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Организация" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Группы сайтов" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Группы арендаторов" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Группы контактов" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Роли контактов" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Назначения контактов" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Роли стоек" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Возвышения" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Типы стоек" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Модули" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Виртуальные контексты" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Производители" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Компоненты устройства" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Роли предметов" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Подключения" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Кабели" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Беспроводные каналы" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Интерфейсные подключения" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Консольные подключения" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Подключения кабелей питания" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Группы WLAN" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Роли префиксов и VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Диапазоны ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Группы VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Шаблоны Служб" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Службы" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Туннели" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Группы туннелей" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Окончание туннелей" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Соединения" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Предложения IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Политики IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Предложения IPsec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Политики IPsec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Профили IPsec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Виртуальные диски" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Типы кластеров" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Группы кластеров" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Типы каналов связи" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Группы каналов связей" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Групповые задания" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Точка подключения канала связи" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Провайдеры" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Аккаунты провайдеров" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Сети провайдеров" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Панели питания" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Конфигурации" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Контексты конфигурации" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Шаблоны конфигурации" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Настройка" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Настраиваемые Поля" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Варианты для Настраиваемых Полей" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Настраиваемые Ссылки" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Шаблоны экспорта" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Сохраненные фильтры" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Прикрепленные Изображения" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Операции" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Интеграции" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Источники данных" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Правила мероприятия" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Вебхуки" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Задачи" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Ведение журнала" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Группы уведомлений" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Записи в журнале" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Журнал изменений" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Администратор" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Токены API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Разрешения" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "система" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Плагины" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "История конфигурации" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Фоновые задачи" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Разрешения должны передаваться в виде кортежа или списка." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Кнопки должны передаваться в виде кортежа или списка." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Цвет кнопки должен быть выбран в ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10646,7 +11324,7 @@ msgstr "" "Класс расширения шаблонов плагинов {template_extension} было принято в " "качестве экземпляра!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10655,196 +11333,197 @@ msgstr "" "{template_extension} не является подклассом расширения " "Netbox.Plugins.Plugins.PluginstemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} должен быть экземпляром Netbox.plugins.pluginmenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} должен быть экземпляром Netbox.plugins.pluginmenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "" "{button} должен быть экземпляром кнопки Netbox.plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context должен быть словарём" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Навигация по HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Включить динамическую навигацию пользовательского интерфейса" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "экспериментальная функция" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Язык" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Принудительно переводит пользовательский интерфейс на указанный язык" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Поддержка перевода отключена локально" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Длина страницы" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Количество объектов, отображаемых на странице по умолчанию" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Размещение пагинатора" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Внизу" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Вверху" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Вверху и внизу" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "" "Где элементы управления пагинатором будут отображаться относительно таблицы" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Формат данных" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Предпочтительный синтаксис для отображения общих данных в пользовательском " "интерфейсе" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Неверное хранилище: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Невозможно добавить хранилище в реестр после инициализации" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Невозможно удалить хранилище из реестра" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Чешский" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Датский" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Немецкий" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Английский" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Испанский" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Французский" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Итальянский" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Японский" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Голландский" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Польский" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Португальский" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Русский" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Турецкий" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Украинский" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Китайский" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Выбрать все" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Переключить все" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Переключить выпадающий список" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Ошибка" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} не найдена" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Поле" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Значение" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Фиктивный плагин" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10852,56 +11531,56 @@ msgid "" msgstr "" "Произошла ошибка при рендеринге выбранного шаблона ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Ряд {i}: Объект с идентификатором {id} не существует" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "{object_type} не были выбраны." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Переименован(-о) {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Удален(-о) {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Журнал изменений" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Журнал" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Невозможно синхронизировать данные: не указан файл данных." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Синхронизированы данные для {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Синхронизирован(-о) {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} должен реализовать get_children ()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10909,705 +11588,747 @@ msgstr "" "Произошла ошибка при загрузке конфигурации панели управления. По умолчанию " "используется панель управления." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Отказано в доступе" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "У вас нет разрешения на доступ к этой странице" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Страница не найдена" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Запрошенная страница не существует" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Ошибка сервера" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "С вашим запросом возникла проблема. Обратитесь к администратору" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Полное исключение приведено ниже" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Версия для Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Версия NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Ничего не установлено" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Если требуется дополнительная помощь, отправьте сообщение по адресу" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Дискуссионный форум NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "на GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Домашняя страница" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Профиль" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Уведомления" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Подписки" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Настройки" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Изменить пароль" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Отменить" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Сохранить" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Конфигурации таблиц" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Очистить настройки таблицы" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Переключить все" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Таблица" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Заказ" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Колонны" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Ничего не найдено" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Профиль пользователя" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Сведения об учетной записи" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "Электронная почта" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Учетная запись создана" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Последний вход в систему" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Суперпользователь" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Персонал" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Назначенные группы" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Нет" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Недавняя активность" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Мои токены API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Токен" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Запись включена" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Последний раз использованный" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Добавить токен" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Главная" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "Мотив NetBox" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Логотип NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Документация" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Документация по REST API" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "API GraphQL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Поддержка NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Исходный код" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Сообщество" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Дата установки" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Дата отключения" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Назначить группу" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Прерывания цепей Swap" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "" "Поменять местами эти эти точки подключения в канале связи %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Сторона" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Сторона Z" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Назначить цепь" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Назначение группы цепей" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Добавить канал связи" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Тип канала связи" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Добавить" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Редактировать" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Обмен" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Отмечено как подключенное" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "к" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Следить" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Редактирование кабеля" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Извлеките кабель" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Отключить" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Подключить" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Ниже по течению" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Вверх по течению" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Кросс-коннект" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Патч-панель/порт" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Добавить канал связи" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Учетная запись поставщика" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Конфигурационные данные" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Комментарий" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Восстановить" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Параметр" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Текущее значение" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Новое значение" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Изменено" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Размер" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "байтов" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Хэш SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Синхронизация" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Последняя синхронизация" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Серверная часть" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Параметры не определены" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "файлы" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Высота стеллажей" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Высота юнита по умолчанию" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Ширина юнита по умолчанию" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Источники питания" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Напряжение по умолчанию" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Сила тока по умолчанию" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Максимальное использование по умолчанию" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Обеспечьте глобальную уникальность" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Количество страниц" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Максимальный размер страницы" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Пользовательские предпочтения" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Сохранение рабочих мест" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Задача" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Создано" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Планирование" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "каждый %(interval)s протокол" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Изменить" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Разница" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Предыдущий" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Следующий" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Объект создан" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Объект удален" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Без изменений" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Данные перед изменением" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Предупреждение: сравнение неатомарного изменения с предыдущей записью " "изменений" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Данные после изменений" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Показать все %(count)s Изменения" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Хранение журнала изменений" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "дни" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Бессрочно" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Не установлено" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Обзор" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Установить" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Сведения о плагине" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Резюме" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Лицензия" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "История версий" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Инструкции по локальной установке" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Фоновые очереди" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Настроить таблицу" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Стоп" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Запросить" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Поставить в очередь" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Очередь" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Тайм-аут" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Результат TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Мета" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Аргументы" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Аргументы ключевых слов" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Зависит от" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Исключение" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "задачи в " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Задачи в очереди" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11615,382 +12336,400 @@ msgstr "" "Выберите все %(count)s %(object_type_plural)s " "соответствующий запрос" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Информация о рабочем процессе" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Рабочий процесс" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Очереди" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Текущая задача" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Количество успешных задач" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Количество неуспешных задач" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Общее рабочее время" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "секунды" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Фоновые рабочие процессы" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Рабочие процессы в %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Экспорт" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Состояние системы" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "Релиз NetBox" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Версия для Django" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Версия PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Имя базы данных" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Размер базы данных" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Недоступно" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Рабочие процессы RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "очередь по умолчанию" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Системное время" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Текущая конфигурация" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Вы действительно хотите отключить их? %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Трассировка кабелей для %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Загрузить SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Асимметричный путь" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Приведенные ниже узлы не имеют ссылок и обеспечивают асимметричный путь" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Разделение путей" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Выберите узел ниже, чтобы продолжить" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Трассировка завершена" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Всего сегментов" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Общая длина" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Пути не найдены" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Связанные пути" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Происхождение" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Пункт назначения" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Сегменты" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Неполный" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Переименовать Выбранное" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Не подключено" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Выделите устройство в стойке" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Не в стойке" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "Координаты GPS" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Карта" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Тег актива" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Смотреть виртуальное шасси" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Создайте VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Управление" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT для" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "КОТ" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Использование энергии" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Ввод" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Торговые точки" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Выделено" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "ВА" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Ножка" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Добавить службу" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Добавить компоненты" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Добавить консольные порты" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Добавить порты консольного сервера" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Добавить отсеки для устройств" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Добавить передние порты" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Скрыть включено" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Скрыть отключено" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Скрыть виртуальное" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Скрыть отключено" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Добавить интерфейсы" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Добавить инвентарь" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Добавить отсеки для модулей" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Добавить розетки питания" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Добавить порт питания" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Добавить задние порты" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Конфигурация" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Контекстные данные" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Отображенная конфигурация" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Скачать" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Шаблон конфигурации не найден" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Родительский залив" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Сгенерировать Подстроку" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Удалить" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Контекстные данные локальной конфигурации" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Переименовать" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Отсек для устройств" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Вставленное устройство" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Удалить %(device)s из %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11999,430 +12738,449 @@ msgstr "" "Вы действительно хотите удалить %(device)s из " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Заселить" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "залив" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Добавить устройство" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Роль виртуальной машины" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Название модели" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Номер детали" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Исключить из использования" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Родитель/ребенок" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Изображение спереди" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Изображение сзади" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Положение заднего порта" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Отмечено как подключенное" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Состояние подключения" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Сторона «А»" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Сторона «Б»" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Без окончания" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Отметить как запланированное" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Отметить как установленное" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Состояние пути" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Недоступно" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Конечные точки пути" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Не подключено" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Без тегов" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "VLAN не назначены" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Чисто" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Очистить все" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Глубина монтажа" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Начальный юнит" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Единицы по убыванию" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Высота стойки" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Добавить дочерний интерфейс" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Скорость/дуплекс" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Режим PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Тип PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Режим 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC-адрес" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Беспроводная связь" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Peer" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Канал" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Частота канала" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "МГц" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Ширина канала" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Члены LAG" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Нет интерфейсов участников" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Добавить IP-адрес" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Родительский товар" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Номер модели" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Добавить Дочернюю Локацию" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Дочерние Локации" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Добавить Локацию" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Добавить устройство" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Добавить тип устройства" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Добавить тип модуля" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Подключенное устройство" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Использование (распределенное)" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Электрические характеристики" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Фаза электропитания" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Добавить каналы питания" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Максимальное потребление" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Выделенная мощность" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Использование пространства" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Вес стойки" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Максимальный вес" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Общий вес" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Изображения и лейблы" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Только изображения" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Только лейблы" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Добавить бронирование" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Показать список" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Выберите вид стойки" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Сортировать по" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Стойки не найдены" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Просмотр высот" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Сведения о бронировании" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Добавить стойку" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Позиции" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Добавить сайт" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Дочерние регионы" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Добавить регион" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Часовой пояс" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Время работы сайта" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Физический адрес" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Адрес доставки" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Дочерние группы" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Добавить группу сайтов" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Вложение" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Добавить участника" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Устройства для участников" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Добавить нового участника в виртуальное шасси %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Добавить нового участника" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Действия" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Сохранить и добавить еще" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Редактирование виртуального корпуса %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Стойка/Юнит" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Удалить элемент виртуального шасси" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12431,11 +13189,12 @@ msgstr "" "Вы действительно хотите удалить %(device)s из виртуального " "шасси %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Идентификатор" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12443,11 +13202,11 @@ msgstr "" "Во время этого запроса произошла ошибка импорта модуля. К распространенным " "причинам относятся следующие:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Отсутствуют необходимые пакеты" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12463,11 +13222,11 @@ msgstr "" "запустите замораживание губ из консоли и сравните выходные " "данные со списком необходимых пакетов." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Служба WSGI не перезапущена после обновления" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12477,7 +13236,7 @@ msgstr "" "(например, gunicorn или uWSGI) перезапущена. Это гарантирует, что новый код " "работает." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12485,11 +13244,11 @@ msgstr "" "При обработке этого запроса была обнаружена ошибка разрешения на доступ к " "файлу. К распространенным причинам относятся следующие:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Недостаточное разрешение на запись в корень носителя" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12500,7 +13259,7 @@ msgstr "" "пользователь NetBox, запущенный от имени пользователя, имеет доступ к записи" " файлов во все места на этом пути." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12508,11 +13267,11 @@ msgstr "" "При обработке этого запроса была обнаружена ошибка программирования базы " "данных. К распространенным причинам относятся следующие:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Отсутствует миграция баз данных" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12523,11 +13282,11 @@ msgstr "" "запустить вручную, выполнив Миграция manage.py на python3 из " "командной строки." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Неподдерживаемая версия PostgreSQL" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12537,99 +13296,102 @@ msgstr "" "можете проверить это, подключившись к базе данных NetBox, и отправив запрос " "на ВЫБЕРИТЕ ВЕРСИЮ ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Файл данных, связанный с этим объектом, был удален" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Синхронизация данных" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Синхронизация данных" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Параметры окружающей среды" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Шаблон" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Название группы" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Должен быть уникальным" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Клонируемый" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Значение по умолчанию" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Вес поиска" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Логика фильтрации" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Вес дисплея" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Видимый пользовательский интерфейс" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Редактируемый UI" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Правила валидации" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Регулярное выражение" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Класс кнопок" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Назначенные модели" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Текст ссылки" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL-адрес ссылки" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Сбросить панель управления" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12637,7 +13399,7 @@ msgstr "" "Это удалит все настроенные виджеты и восстановит настройку " "панели по умолчанию." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12645,159 +13407,161 @@ msgstr "" "Это изменение затрагивает только ваш панель управления и не повлияет " "на других пользователей." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "конфигурация виджета" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Закрыть виджет" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Добавить виджет" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Пока не добавлено ни одной закладки." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Нет прав" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Нет прав на просмотр этого контента" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Невозможно загрузить содержимое. Неверное имя" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Контент не найден" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Возникла проблема при загрузке RSS-канала" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "условия" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Тип MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Расширение файла" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Запланировано на" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Продолжительность" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Сводка теста" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Журнал" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Вывод" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Загрузка" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Результаты ожидаются" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Запись в журнале" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Группа уведомлений" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Ничего не назначено" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Локальный контекст конфигурации перезаписывает все исходные контексты" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Исходные контексты" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Новая запись в журнале" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Отчет" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "У вас нет разрешения на запуск скриптов" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Запустить скрипт" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Ошибка при загрузке скрипта" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Скрипт больше не существует в исходном файле." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Последний запуск" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Скрипт больше не присутствует в исходном файле" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Никогда" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Повторить" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Скрипты не найдены" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12806,81 +13570,83 @@ msgstr "" "Начните с создание сценария из " "загруженного файла или источника данных." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Результаты" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Пороговое значение журнала" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Все" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Элементы с тэгом" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Разрешенные типы объектов" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Любое" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Типы товаров с тегами" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Объекты с тегами" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Метод HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Тип содержимого HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Проверка SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Дополнительные заголовки" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Шаблон тела запроса" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Массовое создание" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Выбранные объекты" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "добавить" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Массовое удаление" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Подтвердить массовое удаление" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12891,66 +13657,69 @@ msgstr "" "Пожалуйста, внимательно просмотрите выбранные объекты и подтвердите это " "действие." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Редактирование" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Массовое редактирование" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Подать заявку" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Массовый импорт" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Прямой импорт" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Загрузить файл" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Отправить" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Опции полей" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Аксессор" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "выбор" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Стоимость импорта" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Формат: ГГГГ-ММ-ДД" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Укажите истину или ложь" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Обязательные поля должен должно быть указано для всех " "объектов." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12960,15 +13729,15 @@ msgstr "" "Например, %(example)s будет идентифицировать VRF по индикатору " "маршрута." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Массовое удаление" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Подтвердите массовое удаление" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12979,72 +13748,72 @@ msgstr "" "Пожалуйста, внимательно ознакомьтесь с %(obj_type_plural)s должно быть " "удалено и подтверждено ниже." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Удалите эти %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Переименование" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Массовое Переименование" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Текущее Имя" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Новое Имя" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Предварительный просмотр" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Вы уверены" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Подтвердить" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Изменить выбранное" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Удалить выбранное" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Добавить новое %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Смотреть документацию по модели" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Помощь" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Создать и добавить еще" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Фильтры" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13053,40 +13822,40 @@ msgstr "" "Выберите все %(count)s " "%(object_type_plural)s соответствующий запрос" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Доступен новый релиз" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "доступен" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Инструкции по обновлению" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Разблокируйте панель управления" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Заблокировать панель управления" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Добавить виджет" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Сохранить макет" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Подтвердить удаление" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13095,40 +13864,40 @@ msgstr "" "Вы уверены, что хотите удалить " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "В результате этого действия следующие объекты будут удалены." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "тому назад" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Нет непрочитанных уведомлений" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Все уведомления" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Выберите" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Сбросить" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Включить темный режим" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Включить режим освещения" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13137,281 +13906,283 @@ msgstr "" "Прежде чем вы сможете добавить %(model)s вы должны сначала создать " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Выбор страницы" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "показывая %(start)s-%(end)s из %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Варианты разбиения на страницы" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "На страницу" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Прикрепите изображение" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Связанные объекты" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Теги не назначены" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Данные не синхронизированы с вышестоящим файлом" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Быстрый поиск" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Сохраненный фильтр" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Очистить сортировку" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Справочный центр" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Администратор Джанго" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Выйти" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Войти" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Семейство" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Дата добавления" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Добавить префикс" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Номер AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Тип аутентификации" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Ключ аутентификации" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Виртуальные IP-адреса" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Назначить IP-адрес" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Массовое создание" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Создать группу" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Виртуальные IP-адреса" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Показать назначенное" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Показать доступные" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Показать все" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Глобальный" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (снаружи)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Назначьте IP-адрес" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Выберите IP-адрес" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Результаты поиска" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Массовое добавление IP-адресов" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Начальный адрес" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Конечный адрес" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Отмечено как полностью использованное" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Детали адресации" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Зависимые IP-адреса" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Доступные IP-адреса" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Первый доступный IP-адрес" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Детали префикса" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Сетевой адрес" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Сетевая маска" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Обратная маска" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Адрес вещания" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Добавить диапазон IP-адресов" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Скрыть индикаторы глубины" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Максимальная глубина" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Максимальная длина" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Добавить агрегат" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Импорт VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Экспорт VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Импорт L2VPN" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Экспорт L2VPN" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Добавить префикс" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Добавить VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "RD" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Уникальное IP-пространство" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Ошибки" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Войти" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Или" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Ошибка статичных медиа - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Ошибка статичных медиа" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Не удалось загрузить следующий статический медиафайл" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Проверьте следующее" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13421,7 +14192,7 @@ msgstr "" "обновления. При этом последняя итерация каждого статического файла " "устанавливается в статический корневой путь." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13431,7 +14202,7 @@ msgstr "" "Служба HTTP (например, nginx или Apache) настроена на обслуживание файлов из пути STATIC_ROOT\n" " . Обратитесь к документация по установке для получения дополнительных рекомендаций." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13440,548 +14211,571 @@ msgstr "" "Файл %(filename)s существует в статическом корневом каталоге и " "доступен для чтения HTTP-сервером." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Нажмите здесь чтобы снова попытаться загрузить " "NetBox." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Связаться" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Заголовок" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Телефон" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Контактная группа" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Добавить контактную группу" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Роль контакта" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Добавить контакт" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Добавить арендатора" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Группа арендаторов" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Добавить группу арендаторов" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Назначенные разрешения" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Разрешение" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Вид" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Ограничения" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Назначенные пользователи" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Выделенные ресурсы" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Виртуальные процессоры" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Память" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Дисковое пространство" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Добавить виртуальную машину" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Назначить устройство" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Удалить выбранное" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Добавить устройство в кластер %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Выбор устройства" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Добавить устройства" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Добавить кластер" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Кластерная группа" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Тип кластера" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Виртуальный диск" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Ресурсы" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Добавить виртуальный диск" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Политика IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Версия IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Pre-Shared ключ" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Показать секрет" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Предложения" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Предложение IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Метод аутентификации" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Алгоритм шифрования" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Алгоритм аутентификации" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Группа DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Срок службы SA (в секундах)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Политика IPsec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Группа PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Профиль IPsec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Группа компаний PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Предложение IPsec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Срок службы (КБ)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "Атрибуты L2VPN" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Добавить окончание" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Добавить окончание" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Инкапсуляция" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Профиль IPsec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Идентификатор туннеля" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Добавить туннель" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Туннельная группа" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Окончание Туннеля" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Внешний IP-адрес" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Конечные Точки" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Шифр" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "МГц" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Подключенные интерфейсы" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Добавить беспроводную локальную сеть" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Группа беспроводных локальных сетей" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Добавить группу беспроводной локальной сети" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Свойства ссылки" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Расстояние" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Контактная группа родителей (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Контактная группа родителей (подстрока)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Контактная группа (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Группа контактов (подстрока)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Контактное лицо (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Роль контакта (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Роль контакта (подстрока)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Контактная группа" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Родительская группа арендаторов (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Родительская группа арендаторов (подстрока)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Группа арендаторов (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Группа арендаторов (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Группа арендаторов (подстрока)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Описание" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Назначенный контакт" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "контактная группа" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "контактные группы" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "роль контакта" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "контактные роли" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "название" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "телефон" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "email" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "ссылка на сайт" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "контакт" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "контакты" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "назначение контакта" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "назначение контактов" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Контакты не могут быть присвоены этому типу объекта ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "группа арендаторов" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "группы арендаторов" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Имя арендатора должно быть уникальным для каждой группы." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Подстрока арендатора должна быть уникальной для каждой группы." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "арендатор" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "арендаторы" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Название контактного лица" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Контактный телефон" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Контактный адрес электронной почты" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Контактный адрес" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Контактная ссылка" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Описание контакта" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Разрешение (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Группа уведомлений (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Имя" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Фамилия" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Статус персонала" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Статус суперпользователя" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Если ключ не указан, он будет сгенерирован автоматически." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Является ли персонал" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Является суперпользователем" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Может просматривать" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Можно добавить" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Может измениться" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Можно удалить" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Пользовательский интерфейс" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13991,7 +14785,7 @@ msgstr "" "свой ключ до отправки этой формы, так как после создания токена она" " может быть недоступна." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -14001,33 +14795,33 @@ msgstr "" "поле пустым, чтобы не было ограничений. Пример: 10.1.1.0/24, " "192.168.10.16/32, 2001:DB8:1::/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Подтвердите пароль" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Введите тот же пароль, что и раньше, для проверки." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Пароли не совпадают! Пожалуйста, проверьте введенные данные и попробуйте " "снова." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Дополнительные действия" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Действия, предпринятые в дополнение к перечисленным выше" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Объекты" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14037,78 +14831,78 @@ msgstr "" "Оставьте значение null для соответствия всем объектам этого типа. Список из " "нескольких объектов приведет к логической операции ИЛИ." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Должно быть выбрано хотя бы одно действие." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Неверный фильтр для {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Список действий, предусмотренных этим разрешением" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "ограничения" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "" "Фильтр Queryset, соответствующий применимым объектам выбранного типа (типов)" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "разрешение" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "разрешения" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "пользовательские настройки" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Ключ '{path}'является листовым узлом; не может назначать новые ключи" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Ключ '{path}'— словарь; не может присвоить значение, отличное от словаря" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "истекает" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "последний раз использованный" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "ключ" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "запись включена" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Разрешить операции создания/обновления/удаления с использованием этого ключа" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "разрешенные IP-адреса" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14117,43 +14911,43 @@ msgstr "" "поле пустым, чтобы не было ограничений. Пример: «10.1.1.0/24, " "192.168.10.16/32, 2001:DB8:1::/64»" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "токен" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "токены" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "группа" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "пользователя" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Пользователь с таким именем уже существует." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Настраиваемые Действия" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Связанный объект не найден с использованием предоставленных атрибутов: " "{params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Предоставленным атрибутам соответствуют несколько объектов: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14162,43 +14956,43 @@ msgstr "" "На связанные объекты следует ссылаться с помощью числового идентификатора " "или словаря атрибутов. Получено нераспознанное значение: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Связанный объект не найден с использованием предоставленного числового " "идентификатора: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} имеет определенный ключ, но CHOICES не является списком" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Вес должен быть положительным числом" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Неверное значение '{weight}'для веса (должно быть число)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Неизвестная единица {unit}. Должно быть одно из следующих: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Длина должна быть положительным числом" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Неверное значение '{length}'для длины (должно быть число)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14207,15 +15001,15 @@ msgstr "" "Невозможно удалить {objects}. {count} найдены зависимые " "объекты: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Более 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Цвет RGB в шестнадцатеричном формате. Пример:" -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14224,7 +15018,7 @@ msgstr "" "%s(%r) недействителен. Параметр to_model для CounterCacheField должен быть " "строкой в формате app.model" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14233,36 +15027,36 @@ msgstr "" "%s(%r) недействителен. Параметр to_field для CounterCacheField должен быть " "строкой в формате «поле»" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Введите объектные данные в формате CSV, JSON или YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV-разделитель" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Символ, ограничивающий поля CSV. Применяется только к формату CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "При загрузке/выборе файла данные формы должны быть пустыми." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Неизвестный формат данных: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Не удалось определить формат данных. Пожалуйста, укажите." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Неверный разделитель CSV" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14270,7 +15064,7 @@ msgstr "" "Неверные данные YAML. Данные должны быть в форме нескольких документов или " "одного документа, содержащего список словарей." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14279,7 +15073,7 @@ msgstr "" "Неверный список ({value}). Должен быть числовым, а диапазоны — в порядке " "возрастания." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14287,7 +15081,7 @@ msgstr "" "Укажите один или несколько числовых диапазонов, разделенных запятыми. " "Пример: 1-5, 20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14295,17 +15089,18 @@ msgstr "" "Неверные диапазоны ({value}). Должен быть диапазон целых чисел в порядке " "возрастания." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Неверное значение для поля с несколькими вариантами ответов: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Объект не найден: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14314,20 +15109,20 @@ msgstr "" "«{value}\"не является уникальным значением для этого поля; найдено несколько" " объектов" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "\"{field_name}\" — неправильное имя поля доступа." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Тип объекта должен быть указан как».»" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Неверный тип объекта" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14337,7 +15132,7 @@ msgstr "" "Смешанные регистр и типы в одном диапазоне не поддерживаются (например: " "[возраст, пол] -0/0/ [0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14345,7 +15140,7 @@ msgstr "" "Укажите числовой диапазон для создания нескольких IP-адресов.
    Пример: " "192.0.2 [1,5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Уценка поддерживается синтаксис" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Уникальное сокращение, удобное для URL-адресов" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "Введите контекстные данные в JSON формат." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC-адрес должен быть в формате EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Используйте регулярные выражения" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Числовой ID существующего объекта для обновления (если не создается новый " "объект)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Неизвестный заголовок: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Доступные столбцы" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Выбранные столбцы" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14399,13 +15194,13 @@ msgstr "" "Этот объект был изменен с момента визуализации формы. Подробности см. в " "журнале изменений объекта." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Ассортимент»{value}\"недействительно." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14414,70 +15209,70 @@ msgstr "" "Неверный диапазон: конечное значение ({end}) должно быть больше начального " "значения ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Повторяющийся или конфликтующий заголовок столбца для»{field}»" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Повторяющийся или конфликтующий заголовок столбца для»{header}»" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Ряд {row}: Ожидается {count_expected} столбцы, но найдены {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Неожиданный заголовок столбца»{field}«найдено." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "" "Столбец»{field}\"не является родственным объектом; нельзя использовать точки" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "Неверный атрибут связанного объекта для столбца»{field}«: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Обязательный заголовок столбца»{header}\"не найден." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Отсутствует обязательное значение параметра динамического запроса: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Отсутствует обязательное значение для статического параметра запроса: " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Пароль должен содержать хотя бы одну цифру." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Пароль должен содержать хотя бы одну прописную букву." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Пароль должен содержать хотя бы одну строчную букву." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14485,7 +15280,7 @@ msgstr "" "Пароль должен содержать как минимум одну цифру, одну прописную и одну " "строчную букву." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14494,127 +15289,127 @@ msgstr "" "Неверное имя правила доступа: {name}. Должно быть в формате " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Неизвестный app_label/model_name для {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Неверный IP-адрес установлен для {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Столбец с именем {name} уже определено для таблицы {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Не определено" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Удалить закладки" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Закладка" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Клонировать" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Текущий вид" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Все данные" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Добавить шаблон экспорта" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Импорт" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Отписаться" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Подписаться" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Скопировать в буфер обмена" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Это поле обязательно" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Установить значение Null" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Очистить все" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Конфигурация таблицы" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Двигаться вверх" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Переместить вниз" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Поиск..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Поиск в NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Открыть селектор" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Текст" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Тест должен определить csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} не является допустимым регулярным выражением." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} должен реализовать функцию get_required_permission" " ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} должен реализовать функцию get_required_permission ()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14624,61 +15419,63 @@ msgstr "" "ObjectPermissionRequiredMixin можно использовать только в представлениях, " "определяющих базовый набор запросов" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Родительская группа (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Родительская группа (подстрока)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Тип кластера (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Кластер (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "Виртуальные процессоры" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Память (МБ)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Тип кластера" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Назначенная кластерная группа" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Назначенный кластер" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Назначенное устройство в кластере" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Серийный номер" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14687,50 +15484,50 @@ msgstr "" "{device} принадлежит другому сайту ({device_site}), чем кластер " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "Дополнительно подключите эту виртуальную машину к определенному хост-" "устройству в кластере." -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Сайт/кластер" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "Размер диска регулируется путем вложения виртуальных дисков." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Диск" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "тип кластера" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "типы кластеров" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "кластерная группа" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "кластерные группы" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "кластер" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "кластеры" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14739,48 +15536,48 @@ msgstr "" "{count} устройства назначены в качестве хостов для этого кластера, но их нет" " на сайте {site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "память (МБ)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "диск (МБ)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Имя виртуальной машины должно быть уникальным для каждого кластера." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "виртуальная машина" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "виртуальные машины" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Виртуальная машина должна быть назначена сайту и/или кластеру." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "Выбранный кластер ({cluster}) не относится к этому сайту ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "При назначении хост-устройства необходимо указать кластер." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" "Выбранное устройство ({device}) не относится к этому кластеру ({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14789,18 +15586,18 @@ msgstr "" "Указанный размер диска ({size}) должен соответствовать совокупному размеру " "назначенных виртуальных дисков ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" "Должен быть IPV{family} адрес. ({ip} является IP-адресом{version} адрес.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Указанный IP-адрес ({ip}) не назначено этой виртуальной машине." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14809,7 +15606,7 @@ msgstr "" "Выбранный родительский интерфейс ({parent}) принадлежит другой виртуальной " "машине ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14818,7 +15615,7 @@ msgstr "" "Выбранный интерфейс моста ({bridge}) принадлежит другой виртуальной машине " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14827,393 +15624,416 @@ msgstr "" "VLAN без тегов ({untagged_vlan}) должна принадлежать тому же сайту, что и " "родительская виртуальная машина интерфейса, или она должна быть глобальной." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "размер (МБ)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "виртуальный диск" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "виртуальные диски" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Добавлено {count} устройств(-а) для кластеризации {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Удалено {count} устройств(-а) из кластера {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec — транспорт" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec — туннель" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-адрес в IP-адресе" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Hub" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Spoke" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Агрессивный" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Главная" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "PSK" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Сертификаты" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Подписи RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Подписи DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Группа {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Частная локальная сеть Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Виртуальная частная локальная сеть Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Частное дерево Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Виртуальное частное дерево Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Группа туннелей (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Группа туннелей (подстрока)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Профиль IPsec (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Профиль IPsec (имя)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Туннель (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Туннель (название)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Внешний IP-адрес (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Политика IKE (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Политика IKE (название)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Политика IPsec (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Политика IPsec (имя)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (подстрока)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Интерфейс виртуальной машины (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (название)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Группа туннелей" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Время жизни SA" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Предварительный общий ключ" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Политика IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Политика IPsec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Инкапсуляция туннелей" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Операционная роль" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Родительское устройство назначенного интерфейса" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Родительская виртуальная машина назначенного интерфейса" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Интерфейс устройства или виртуальной машины" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Предложение (предложения) IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Группа Диффи-Хеллмана за Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Предложение (предложения) IPsec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "Протокол IPsec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Тип L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Родительское устройство (для интерфейса)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Родительская виртуальная машина (для интерфейса)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Назначенный интерфейс (устройство или виртуальная машина)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Невозможно одновременно сетевые окончания интерфейса устройства и " "виртуальной машины." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Каждое оконечное устройство должно указывать интерфейс или VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Невозможно назначить одновременно интерфейс и VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Версия IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Предложение" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Назначенный тип объекта" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Туннельный интерфейс" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Первая точка" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Вторая точка" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Этот параметр необходим при определении точки." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Политика" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "В терминации должен быть указан интерфейс или VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Терминал может иметь только один конечный объект (интерфейс или VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "алгоритм шифрования" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "алгоритм аутентификации" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Идентификатор группы Диффи-Хеллман" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Срок службы охранной ассоциации (в секундах)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Предложение IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Предложения IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "версия" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "предложений" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "предварительный общий ключ" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Политики IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Режим необходим для выбранной версии IKE" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Режим не может быть использован для выбранной версии IKE" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "шифрование" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "аутентификация" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Срок действия ассоциации безопасности (в секундах)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Срок действия ассоциации безопасности (в килобайтах)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Предложение IPsec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Предложения IPsec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Необходимо определить алгоритм шифрования и/или аутентификации" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Политики IPsec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Профили IPsec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN соединение" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN соединения" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Терминация L2VPN уже назначена ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15222,187 +16042,195 @@ msgstr "" "{l2vpn_type} У L2VPN не может быть более двух терминаций; найдено " "{terminations_count} уже определено." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "группа туннелей" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "группы туннелей" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "инкапсуляция" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "идентификатор туннеля" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "туннель" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "туннели" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Одновременно объект может быть отправлен только в один туннель." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "точка подключения туннеля" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "точки подключения туннеля" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} уже подключен к туннелю ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Метод аутентификации" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Алгоритм шифрования" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Алгоритм аутентификации" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Срок службы" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Предварительный общий ключ" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Срок службы SA (в секундах)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Срок службы SA (КБ)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Родитель объекта" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Сайт объекта" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Точка доступа" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Станция" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Открыть" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "Персонал WPA (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "Предприятие WPA" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Шифр аутентификации" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Единица измерения расстояний" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Мостовая VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Интерфейс A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Интерфейс B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Сторона B" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "шифр аутентификации" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "группа беспроводной локальной сети" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "группы беспроводной локальной сети" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "беспроводная локальная сеть" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "Интерфейс A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "Интерфейс B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "расстояние" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "единица измерения расстояний" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "беспроводное соединение" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "беспроводные соединения" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "При настройке беспроводного расстояния необходимо указать единицу измерения" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} не является беспроводным интерфейсом." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Неверное значение канала: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Неверный атрибут канала: {name}" diff --git a/netbox/translations/tr/LC_MESSAGES/django.mo b/netbox/translations/tr/LC_MESSAGES/django.mo index 998a28451f4a089a9615fec272fefd50a4bf051e..0455483e341d22e0cc83af209e5287d448ff34cf 100644 GIT binary patch delta 65979 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 delta 66303 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 diff --git a/netbox/translations/tr/LC_MESSAGES/django.po b/netbox/translations/tr/LC_MESSAGES/django.po index 40c255c45..18fd06563 100644 --- a/netbox/translations/tr/LC_MESSAGES/django.po +++ b/netbox/translations/tr/LC_MESSAGES/django.po @@ -13,7 +13,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" "Last-Translator: Jeremy Stretch, 2024\n" "Language-Team: Turkish (https://app.transifex.com/netbox-community/teams/178115/tr/)\n" @@ -23,1870 +23,2136 @@ msgstr "" "Language: tr\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Anahtar" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Yazma Etkin" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Oluşturuldu" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Süre bitiş tarihi" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Son Kullanım" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "İzin verilen IP'ler" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Olarak oturum açtı {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Oturumu kapattınız." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Tercihleriniz güncellendi." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "LDAP kimliği doğrulanmış kullanıcı kimlik bilgileri NetBox içinde " "değiştirilemez." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Şifreniz başarıyla değiştirildi." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Planlanan" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Tedarik" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Aktif" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Çevrim dışı" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Hazırlıktan Kaldırma" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Hizmet dışı bırakıldı" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Birincil" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "İkincil" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Üçüncül" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Etkin Olmayan" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Bölge (ID)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Bölge (kısa ad)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Site grubu (ID)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Site grubu (kısa ad)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Site" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Site (kısa ad)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ID)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Sağlayıcı (ID)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Sağlayıcı (kısa ad)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Sağlayıcı hesabı (ID)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Sağlayıcı hesabı (hesap)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Sağlayıcı ağı (ID)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Devre tipi (ID)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Devre tipi (kısa ad)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Site (ID)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Fesih A (ID)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Arama" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Devre" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Sağlayıcı Ağı (ID)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Devre (ID)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Devre (CID)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Devre grubu (ID)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Devre grubu (sümüklü böcek)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASN'ler" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Açıklama" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Sağlayıcı" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "Servis ID" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Renk" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Tür" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Sağlayıcı hesabı" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Durum" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Kiracı" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Yükleme tarihi" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Fesih tarihi" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Taahhüt oranı (Kbps)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Servis Parametreleri" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Kiracılık" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Sağlayıcı Ağı" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Bağlantı noktası hızı (Kbps)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Yukarı akış hızı (Kbps)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Bağlı olarak işaretle" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Devre Sonlandırma" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Fesih Ayrıntıları" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Öncelik" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Atanan sağlayıcı" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Atanan sağlayıcı hesabı" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Devre tipi" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Operasyonel durum" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Atanan kiracı" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Fesih" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Sağlayıcı ağı" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Konum" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "İletişim" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Bölge" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Site grubu" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Öznitellikler" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Hesap" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Dönem Tarafı" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Ödev" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Grup" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Devre Grubu" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "renk" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "devre tipi" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "devre türleri" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "devre ID" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Benzersiz devre ID" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "durum" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "kurulmuş" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "sonlandırır" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "taahhüt oranı (Kbps)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Taahhüt oranı" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "devre" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "devreler" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "devre grubu" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "devre grupları" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "öncelik" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Devre grubu ataması" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Devre grubu atamaları" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "sonlandırma" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "bağlantı noktası hızı (Kbps)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Fiziksel devre hızı" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "yukarı akış hızı (Kbps)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "Bağlantı noktası hızından farklıysa yukarı akış hızı" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "çapraz bağlantı kimliği" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "Yerel çapraz bağlantının kimliği" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "bağlantı paneli/port(lar)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "Bağlantı paneli ID ve port numaraları" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "açıklama" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "devre sonlandırma" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "devre sonlandırmaları" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Bir devre sonlandırma, bir siteye veya bir sağlayıcı ağına bağlanmalıdır." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "Devre sonlandırma hem siteye hem de sağlayıcı ağına bağlanamaz." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "ad" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Sağlayıcının tam adı" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "kısa ad" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "sağlayıcı" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "sağlayıcılar" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "hesap kimliği" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "sağlayıcı hesabı" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "sağlayıcı hesapları" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "servis kimliği" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "sağlayıcı ağı" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "sağlayıcı ağları" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "İsim" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Devreler" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "Devre ID" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "A Tarafı" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Z Tarafı" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Taahhüt Oranı" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Yorumlar" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Ödevler" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Hesaplar" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Hesap Sayısı" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "ASN Sayısı" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Devre için sonlandırma tanımlanmamıştır {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Devre için değiştirilmiş sonlandırmalar {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Bu kullanıcının bu veri kaynağını senkronize etme izni yoktur." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Yeni" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "Kuyruğa alındı" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Senkronizasyon" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Tamamlandı" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Başarısız" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Komut Dosyaları" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Raporlar" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Beklemede" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Zamanlanmış" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Koşu" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Hatalı" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Güncellendi" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Silinmiş" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Bitmiş" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Başladı" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Ertelenmiş" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Durduruldu" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "İptal Edildi" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Yerel" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Kullanıcı Adı" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Sadece HTTP(S) ile klonlama için kullanılır" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Şifre" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Şube" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Uzaktan veri getirilemedi ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "AWS erişim anahtarı kimliği" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "AWS gizli erişim anahtarı" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Oluşturulan nesne" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Nesne güncellendi" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Nesne silindi" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "İş başladı" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "İş tamamlandı" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "İş başarısız oldu" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "İş hatası" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Veri kaynağı (ID)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Veri kaynağı (isim)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Kullanıcı (ID)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Kullanıcı adı" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Etkin" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Parametreler" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Kuralları yok sayın" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Veri Kaynağı" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Dosya" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Veri kaynağı" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Oluşturma" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Nesne Türü" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Sonra oluşturuldu" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Daha önce oluşturuldu" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Sonrasında planlandı" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Önceden planlanmış" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Sonra başladı" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Daha önce başladı" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Sonrasında tamamlandı" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Daha önce tamamlandı" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Kullanıcı" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Zaman" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Sonra" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Önce" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Eylem" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Kaynak" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Arka Uç Parametreleri" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Dosya Yükleme" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "Dosya yüklenemiyor ve varolan bir dosyadan senkronize edilemiyor" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "" "Senkronize etmek için bir dosya yüklemeniz veya bir veri dosyası seçmeniz " "gerekir" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Raf Yükseltmeleri" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Güç" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Güvenlik" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Afişler" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Sayfalandırma" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Doğrulama" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Kullanıcı Tercihleri" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Çeşitli" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Yapılandırma Revizyonu" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Bu parametre statik olarak tanımlanmıştır ve değiştirilemez." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Mevcut değer: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (varsayılan)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "zaman" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "kullanıcı adı" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "istek kimliği" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "aksiyon" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "değişiklik öncesi veriler" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "değişim sonrası veriler" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "nesne değişikliği" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "nesne değişiklikleri" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "Değişiklik günlüğü bu nesne türü için desteklenmez ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "oluşturulan" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "yorum Yap" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "yapılandırma verileri" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "yapılandırma revizyonu" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "yapılandırma revizyonları" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Varsayılan yapılandırma" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Geçerli yapılandırma" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Yapılandırma revizyonu #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "türü" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "etkin" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "kuralları yok sayın" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Senkronizasyon sırasında yok sayılacak dosyalarla eşleşen desenler (satır " "başına bir tane)" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "parametreler" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "son senkronize edildi" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "veri kaynağı" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "veri kaynakları" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Bilinmeyen arka uç türü: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Senkronizasyon başlatılamıyor; senkronizasyon zaten devam ediyor." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " @@ -1894,1221 +2160,1283 @@ msgstr "" "Arka ucu başlatırken bir hata oluştu. Bir bağımlılığın yüklenmesi gerekiyor:" " " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "son güncellendi" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "yol" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Veri kaynağının köküne göre dosya yolu" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "boyut" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "kare" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Uzunluk 64 onaltılık karakter olmalıdır." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "Dosya verilerinin SHA256 karması" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "veri dosyası" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "veri dosyaları" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "otomatik senkronizasyon kaydı" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "otomatik senkronizasyon kayıtları" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "dosya kökü" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "dosya yolu" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Belirlenen kök yoluna göre dosya yolu" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "yönetilen dosya" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "yönetilen dosyalar" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "planlanmış" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "aralık" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Tekrarlama aralığı (dakika cinsinden)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "başladı" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "tamamlandı" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "veri" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "hata" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "görev ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "görev" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "görevler" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "İşler bu nesne türüne atanamaz ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "İşin sonlandırılması için geçersiz durum. Seçenekler şunlardır: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "enqueue () hem schedule_at hem de imediat değerleriyle çağrılamaz." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Silme işlemi bir koruma kuralı tarafından engellenir: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "Ad Soyad" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Nesne" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "İstek Kimliği" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Aktif mi" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Yol" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Son Güncelleme" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "KİMLİK" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Aralık" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Versiyon" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Son Güncelleme" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Minimum NetBox Sürümü" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Maksimum NetBox Sürümü" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Eklenti verisi bulunamadı" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Yazar" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Kurulmuş" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Sertifikalı" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Yayınlandı" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Yüklü Sürüm" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Son Sürüm" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "En Eski Görev" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "İşçiler" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Ana bilgisayar" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Port" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "DB" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Zamanlayıcı PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Kuyruk bulunamadı" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "Sıraya alındı" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Bitti" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Çağrılabilir" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Görev bulunamadı" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Eyalet" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Doğum" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "İşçi bulunamadı" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Sıraya alınmış iş #{id} senkronize etmek {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Geri yüklenen yapılandırma revizyonu #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "İş {job_id} bulunamadı" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "İş {id} silindi." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "İş silinirken hata oluştu {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "İş {id} bulunamadı." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "İş {id} yeniden sıraya alındı." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "İş {id} sıraya alındı." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "İş {id} durduruldu." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "İş durdurulamadı {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Eklentiler kataloğu yüklenemedi" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Eklenti {name} bulunamadı" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Pozisyon (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Tesis Kimliği" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Sahneleme" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Hizmetten çıkarma" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Emekli" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2 direkli çerçeve" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4 direkli çerçeve" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4 direkli dolap" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Duvara monte çerçeve" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Duvara monte çerçeve (dikey)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Duvara monte dolap" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Duvara monte dolap (dikey)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} inç" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Rezerve edilmiş" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Mevcut" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Kullanımdan kaldırıldı" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Milimetre" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "İnç" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Önden arkaya" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Arkadan öne" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Ebeveyn" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Çocuk" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Ön" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Arka" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Sahnelenmiş" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Envanter" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Soldan sağa" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Sağdan sola" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Yandan arkaya" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Arkadan yana" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Aşağıdan yukarıya" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Yukarıdan aşağıya" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Pasif" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Karışık" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (Kilitsiz)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (Kilitleme)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Kaliforniya Tarzı" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Uluslararası/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Tescilli" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Diğer" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Uluslararası" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Fiziksel" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Sanal" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Kablosuz" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Sanal arayüzler" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Köprü" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Bağlantı Toplama Grubu (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (sabit)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (modüler)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (arka panel)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Hücresel" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Seri" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Koaksiyel" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "İstifleme" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Yarım" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Dolu" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Oto" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Erişim" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Etiketlenmiş" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Etiketlenmiş (Tümü)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE Standardı" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Pasif 24V (2 çift)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Pasif 24V (4 çift)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Pasif 48V (2 çift)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Pasif 48V (4 çift)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Bakır" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Fiber Optik" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Fiber" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Bağlı" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Kilometre" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Sayaçlar" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Santimetre" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Mil" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Feet" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Kilogram" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Gramlar" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Pound'lar" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "ons" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Yedekli" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Tek fazlı" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Üç fazlı" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Geçersiz MAC adresi biçimi: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Geçersiz WWN biçimi: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Ana bölge (ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Ana bölge (kısa ad)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Ana site grubu (ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Ana site grubu (kısa ad)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Grup (ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Grup (kısa ad)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Ana konum (ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Ana konum (kısa ad)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Konum (ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Konum (kısa ad)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Üretici (ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Üretici (kısa ad)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Raf tipi (sümüklü böcek)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Raf tipi (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rol (ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rol (kısa ad)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Raf (ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Kullanıcı (isim)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Varsayılan platform (ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Varsayılan platform (kısa ad)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Ön resmi var" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Arka görüntüsü var" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Konsol bağlantı noktaları vardır" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Konsol sunucusu bağlantı noktaları vardır" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Güç bağlantı noktaları vardır" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Elektrik prizleri var" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Arayüzleri vardır" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Geçiş bağlantı noktaları vardır" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Modül yuvaları vardır" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Cihaz yuvaları var" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Envanter kalemleri var" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Cihaz tipi (ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Modül tipi (ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Güç bağlantı noktası (ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Ana envanter kalemi (ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Yapılandırma şablonu (ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Cihaz tipi (kısa ad)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Ana Cihaz (ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Platform (ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Platform (kısa ad)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Site adı (kısa ad)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Ebeveyn bölmesi (ID)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "VM kümesi (ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Küme grubu (kısa ad)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Küme grubu (ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Cihaz modeli (kısa ad)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Tam derinlik mi" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC adresi" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Birincil IP'ye sahiptir" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Bant dışı bir IP'ye sahiptir" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Sanal kasa (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Sanal bir şasi üyesidir" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "OOB İP (KİMLİĞİ)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Sanal cihaz bağlamına sahiptir" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (KİMLİK)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Cihaz modeli" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Arayüz (ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Modül tipi (model)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Modül yuvası (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Cihaz (ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Raf (isim)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Cihaz (isim)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Cihaz tipi (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Cihaz rolü (ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Cihaz rolü (kısa ad)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Sanal Kasa (ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Sanal Şasi" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Modül (ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Kablo (ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Atanmış VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Atanmış VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (KİMLİĞİ)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Cihaz için Sanal Şasi Arayüzleri" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Cihaz için Sanal Şasi Arayüzleri (ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Arayüz türü" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Ebeveyn arabirimi (ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Köprülü arayüz (ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "LAG arabirimi (ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Sanal Cihaz Bağlamı" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Sanal Cihaz Bağlamı (Tanımlayıcı)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Kablosuz LAN" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Kablosuz bağlantı" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Ana modül yuvası (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Yüklü modül (ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Yüklü cihaz (ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Yüklü cihaz (isim)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Master (ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Master (isim)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Kiracı (ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Kiracı (kısa ad)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Sonlandırılmamış" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Güç paneli (ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Etiketler" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Pozisyon" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3116,840 +3444,920 @@ msgstr "" "Alfasayısal aralıklar desteklenir. (Oluşturulan isim sayısıyla " "eşleşmelidir.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "İrtibat Kişisi Adı" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "İletişim telefonu" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "İletişim E-posta" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Saat dilimi" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Üretici" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Form faktörü" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Genişlik" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Yükseklik (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Azalan birimler" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Dış genişlik" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Dış derinlik" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Dış ünite" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Montaj derinliği" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Ağırlığı" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Maksimum ağırlık" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Ağırlık birimi" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Raf Tipi" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Dış Ölçüler" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Ölçüler" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Numaralandırma" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Rol" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Raf tipi" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Seri Numarası" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Varlık etiketi" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Hava akışı" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Raf" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Donanım" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Varsayılan platform" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Parça numarası" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "U yüksekliği" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Kullanımdan hariç tut" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Cihaz Türü" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Modül Türü" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Şasi" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VM rolü" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Yapılandırma şablonu" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Cihaz tipi" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Cihaz rolü" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Platform" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Küme" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Cihaz" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Yapılandırma" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Sanallaştırma" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Modül tipi" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "etiket" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Uzunluk" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Uzunluk birimi" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Alan adı" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Güç paneli" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Tedarik" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Faz" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Gerilim" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Amper" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Maksimum kullanım" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Maksimum çekiliş" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Maksimum güç çekimi (watt)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Tahsis edilen çekiliş" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Tahsis edilen güç çekimi (watt)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Güç bağlantı noktası" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Besleme bacağı" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Yalnızca yönetim" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE modu" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE tipi" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Kablosuz rolü" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Modül" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "GECİKME" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Sanal cihaz bağlamları" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Hız" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Modu" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN grubu" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "Etiketsiz VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "Etiketli VLAN'lar" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Kablosuz LAN grubu" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Kablosuz LAN'lar" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Adresleme" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Operasyon" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "İlgili Arayüzler" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q Anahtarlama" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "VLAN'ları atamak için arayüz modu belirtilmelidir" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Bir erişim arabirimi VLAN'ları etiketlemiş olamaz." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Ana bölgenin adı" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Üst site grubunun adı" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Atanan bölge" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Atanan grup" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "mevcut seçenekler" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Atanan site" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Ana konum" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Konum bulunamadı." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Bu raf tipinin üreticisi" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Raftaki en düşük numaralı konum" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Ray-ray genişliği (inç cinsinden)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Dış boyutlar için birim" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Raf ağırlıkları için ünite" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "Atanan kiracının adı" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Atanan rolün adı" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Hava akışı yönü" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Ana site" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Rafın konumu (varsa)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Birimler" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Bireysel birim numaralarının virgülle ayrılmış listesi" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Bu cihaz tipini üreten üretici" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Bu tür cihazlar için varsayılan platform (isteğe bağlı)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Cihaz ağırlığı" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Cihaz ağırlığı için birim" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Modül ağırlığı" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Modül ağırlığı için birim" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Platform atamalarını bu üreticiye sınırlayın" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Atanan rol" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Cihaz tipi üreticisi" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Cihaz tipi modeli" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Atanan platform" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Sanal şasi" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Sanallaştırma kümesi" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Atanan konum (varsa)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Atanmış raf (varsa)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Yüz" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Monte edilmiş raf yüzü" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Ana cihaz (alt cihazlar için)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Cihaz yuvası" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "Bu cihazın kurulu olduğu cihaz yuvası (alt cihazlar için)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Bu modülün kurulu olduğu cihaz" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Modül yuvası" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Bu modülün kurulu olduğu modül yuvası" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Modül türü" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Bileşenleri çoğaltın" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3957,264 +4365,271 @@ msgstr "" "Bu modül türüyle ilişkili bileşenleri otomatik olarak doldurun (varsayılan " "olarak etkindir)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Bileşenleri benimseyin" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Mevcut bileşenleri benimseyin" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Bağlantı noktası tipi" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Bps cinsinden bağlantı noktası hızı" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Çıkış tipi" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Bu prizi besleyen yerel güç portu" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Elektrik fazı (üç fazlı devreler için)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Ebeveyn arayüzü" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Köprülü arayüz" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "Gecikme" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Ebeveyn LAG arayüzü" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "VDC isimleri virgülle ayrılmış, çift tırnak işareti ile çevrelenmiştir. " "Örnek:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Fiziksel ortam" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Dubleks" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Poe modu" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Poe tipi" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q çalışma modu (L2 arayüzleri için)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Atanmış VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "Rf rolü" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Kablosuz rolü (AP/istasyon)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} cihaza atanmadı {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Arka bağlantı noktası" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "İlgili arka bağlantı noktası" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Fiziksel ortam sınıflandırması" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Yüklü cihaz" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Bu bölmeye takılan çocuk cihazı" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Çocuk cihazı bulunamadı." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Ana envanter kalemi" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Bileşen tipi" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Bileşen Türü" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Bileşen adı" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Bileşen Adı" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Bileşen bulunamadı: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "A Tarafı Cihazı" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Cihaz adı" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Taraf A tipi" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Sonlandırma türü" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "A Tarafı adı" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Fesih adı" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "B tarafı cihazı" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Taraf B tipi" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "B tarafı adı" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Bağlantı durumu" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Yan {side_upper}: {device} {termination_object} zaten bağlı" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} yan sonlandırma bulunamadı: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Usta" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Ana cihaz" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Ana sitenin adı" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Yukarı akış güç paneli" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Birincil veya gereksiz" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Besleme tipi (AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Tek veya üç fazlı" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Birincil IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "Maskeli IPv4 adresi, örn. 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Birincil IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "Önek uzunluğuna sahip IPv6 adresi, örn. 2001:db8: :1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4223,7 +4638,7 @@ msgstr "" "Etiketli VLAN'lar ({vlans}) arayüzün ana cihazı/sanal makinesiyle aynı " "siteye ait olmalı veya global olmalıdır" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4231,7 +4646,7 @@ msgstr "" "Konum tanımlanmamış bir modül yuvasına yer tutucu değerleri olan modül " "yüklenemiyor." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4240,188 +4655,199 @@ msgstr "" "Modül defne ağacına yer tutucu değerleri olan modül yüklenemiyor {level} " "Ağaçta ama {tokens} verilen yer tutucular." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "Evlat edinemiyor {model} {name} zaten bir modüle ait olduğu için" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "BİR {model} adlandırmak {name} zaten var" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Güç Paneli" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Güç Beslemesi" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Yan" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Cihaz Durumu" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Ana bölge" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Ebeveyn grubu" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Tesis" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Raf tipi" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Fonksiyon" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Görüntüler" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Bileşenleri" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Alt aygıt rolü" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Modeli" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "OOB IP'ye sahiptir" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Sanal şasi elemanı" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Sanal cihaz bağlamlarına sahiptir" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Küme grubu" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Kablolu" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "işgal" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Bağlantı" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Tür" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Sadece Mgmt" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Kablosuz kanal" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Kanal frekansı (MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Kanal genişliği (MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "İletim gücü (dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Kablo" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Keşfedildi" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Bir sanal kasa elemanı zaten yerinde var {vc_position}." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "İletişim Bilgisi" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Raf Rolü" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Kısa isim" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Önceden tanımlanmış bir raf tipi seçin veya aşağıda fiziksel özellikleri " "ayarlayın." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Envanter Kontrolü" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4429,144 +4855,171 @@ msgstr "" "Virgülle ayrılmış sayısal birim kimlikleri listesi. Bir aralık bir tire " "kullanılarak belirtilebilir." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Rezervasyon" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Cİhaz Rolü" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Cihazın kullandığı en düşük numaralı birim" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "Bu cihazın sanal kasadaki konumu tanımlanır" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Sanal kasadaki cihazın önceliği" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Bu modül türüyle ilişkili bileşenleri otomatik olarak doldurun" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "ÖZELLİKLERİ" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Konsol bağlantı noktası şablonu" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Konsol sunucusu bağlantı noktası şablonu" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Ön bağlantı noktası şablonu" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Arayüz şablonu" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Elektrik prizi şablonu" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Güç bağlantı noktası şablonu" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Arka bağlantı noktası şablonu" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Arayüz" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Konsol Bağlantı Noktası" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Konsol Sunucusu Bağlantı Noktası" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Ön Bağlantı Noktası" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Arka Bağlantı Noktası" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Güç Bağlantı Noktası" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Güç Çıkışı" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Bileşen Ataması" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Bir InventoryItem yalnızca tek bir bileşene atanabilir." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "LAG arayüzü" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Gruba göre atama için mevcut VLAN'ları filtreleyin." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Çocuk Cihazı" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4574,32 +5027,35 @@ msgstr "" "Alt aygıtlar önce oluşturulmalı ve ana aygıtın sahasına ve rafına " "atanmalıdır." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Konsol bağlantı noktası" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Konsol sunucusu bağlantı noktası" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Ön bağlantı noktası" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Güç çıkışı" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Envanter Öğesi" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Envanter Öğesi Rolü" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4607,7 +5063,7 @@ msgstr "" "Alfasayısal aralıklar desteklenir. (Oluşturulan nesnelerin sayısıyla " "eşleşmelidir.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4616,18 +5072,19 @@ msgstr "" "Sağlanan desen belirtir {value_count} Değerler, ama {pattern_count} " "bekleniyor." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Arka bağlantı noktaları" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Oluşturulan her ön bağlantı noktası için bir arka bağlantı noktası ataması " "seçin." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4636,16 +5093,7 @@ msgstr "" "Oluşturulacak ön bağlantı noktası şablonlarının sayısı ({frontport_count}) " "seçilen arka port konumu sayısıyla eşleşmelidir ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Dize {module} varsa atanan modülün konumu ile " -"değiştirilecektir." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4654,81 +5102,84 @@ msgstr "" "Oluşturulacak ön bağlantı noktalarının sayısı ({frontport_count}) seçilen " "arka port konumu sayısıyla eşleşmelidir ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Üyeler" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Başlangıç pozisyonu" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "İlk üye cihazın konumu. Her ek üye için bir artar." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "İlk VC üyesi için bir pozisyon belirtilmelidir." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "etiketlemek" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "uzunluk" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "uzunluk birimi" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "kablo" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "kablolar" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Kablo uzunluğu ayarlarken bir birim belirtmeniz gerekir" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Yeni bir kablo oluştururken A ve B sonlandırmalarını tanımlamalıdır." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "Farklı sonlandırma türleri kablonun aynı ucuna bağlanamaz." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Uyumsuz sonlandırma türleri: {type_a} ve {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "A ve B sonlandırmaları aynı nesneye bağlanamaz." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "son" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "kablo sonlandırma" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "kablo sonlandırmaları" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4737,36 +5188,36 @@ msgstr "" "Yinelenen sonlandırma bulundu {app_label}.{model} {termination_id}: kablo " "{cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Kablolar sonlandırılamaz {type_display} arayüzleri" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "Bir sağlayıcı ağına bağlı devre sonlandırmaları kablolanmayabilir." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "aktiftir" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "tamamlandı" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "bölünmüş" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "kablo yolu" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "kablo yolları" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4775,23 +5226,23 @@ msgstr "" "{module} bir modül tipine bağlandığında modül yuvası konumunun yerine kabul " "edilir." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Fiziksel etiket" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "Bileşen şablonları farklı bir aygıt türüne taşınamaz." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "" "Bir bileşen şablonu hem aygıt türü hem de modül türüyle ilişkilendirilemez." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." @@ -4799,134 +5250,134 @@ msgstr "" "Bir bileşen şablonu, bir aygıt türü veya bir modül türüyle " "ilişkilendirilmelidir." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "konsol bağlantı noktası şablonu" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "konsol bağlantı noktası şablonları" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "konsol sunucusu bağlantı noktası şablonu" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "konsol sunucusu bağlantı noktası şablonları" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "maksimum çekiliş" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "tahsis edilen çekiliş" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "güç bağlantı noktası şablonu" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "güç bağlantı noktası şablonları" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "Tahsis edilen çekiliş maksimum çekilişi aşamaz ({maximum_draw}W)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "besleme bacağı" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Faz (üç fazlı beslemeler için)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "elektrik prizi şablonu" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "elektrik prizi şablonları" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Ana güç bağlantı noktası ({power_port}) aynı cihaz türüne ait olmalıdır" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Ana güç bağlantı noktası ({power_port}) aynı modül türüne ait olmalıdır" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "sadece yönetim" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "köprü arayüzü" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "kablosuz rolü" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "arayüz şablonu" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "arayüz şablonları" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Bir arayüz kendi başına köprülenemez." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "Köprü arayüzü ({bridge}) aynı cihaz türüne ait olmalıdır" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Köprü arayüzü ({bridge}) aynı modül türüne ait olmalıdır" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "arka port konumu" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "ön bağlantı noktası şablonu" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "ön bağlantı noktası şablonları" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Arka bağlantı noktası ({name}) aynı cihaz türüne ait olmalıdır" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4935,46 +5386,46 @@ msgstr "" "Geçersiz arka bağlantı noktası konumu ({position}); arka bağlantı noktası " "{name} sadece var {count} pozisyonlar" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "pozisyonlar" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "arka bağlantı noktası şablonu" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "arka bağlantı noktası şablonları" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "pozisyon" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "Yüklü bileşenleri yeniden adlandırırken başvurulacak tanımlayıcı" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "modül bölmesi şablonu" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "modül bölmesi şablonları" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "cihaz yuvası şablonu" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "cihaz yuvası şablonları" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -4983,200 +5434,205 @@ msgstr "" "Aygıt türünün alt cihaz rolü ({device_type}) cihaz bölmelerine izin vermek " "için “ebeveyn” olarak ayarlanmalıdır." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "parça kimliği" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Üretici tarafından atanan parça tanımlayıcısı" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "envanter öğesi şablonu" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "envanter öğe şablonları" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Bileşenler farklı bir cihaza taşınamaz." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "kablo ucu" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "bağlı olarak işaretle" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Bir kablo bağlıymış gibi davranın" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Kablo takarken kablo ucunu (A veya B) belirtmelisiniz." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Kablo ucu kablo olmadan ayarlanmamalıdır." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Takılı bir kabloyla bağlı olarak işaretlenemiyor." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name} modeller bir parent_object özelliği bildirmelidir" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Fiziksel bağlantı noktası tipi" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "sürat" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Saniyede bit cinsinden port hızı" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "konsol bağlantı noktası" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "konsol bağlantı noktaları" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "konsol sunucusu bağlantı noktası" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "konsol sunucusu bağlantı noktaları" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "güç bağlantı noktası" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "güç bağlantı noktaları" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "elektrik prizi" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "elektrik prizleri" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "Ana güç bağlantı noktası ({power_port}) aynı cihaza ait olmalıdır" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "mod" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q etiketleme stratejisi" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "ebeveyn arabirimi" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "ebeveyn LAG" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "Bu arayüz yalnızca bant dışı yönetim için kullanılır" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "hız (Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "dubleks" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64 bit Dünya Çapında Adı" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "kablosuz kanal" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "kanal frekansı (MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Seçilen kanala göre doldurulur (ayarlanmışsa)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "iletim gücü (dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "kablosuz LAN'lar" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "etiketsiz VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "etiketli VLAN'lar" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "arayüz" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "arayüzleri" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} arabirimlerde kablo takılı olamaz." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} arayüzler bağlı olarak işaretlenemez." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Bir arayüz kendi ebeveyni olamaz." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "Bir üst arabirime yalnızca sanal arabirimler atanabilir." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5184,7 +5640,7 @@ msgid "" msgstr "" "Seçilen üst arabirim ({interface}) farklı bir cihaza aittir ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5193,14 +5649,14 @@ msgstr "" "Seçilen üst arabirim ({interface}) aittir {device}, sanal kasanın bir " "parçası olmayan {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "Seçilen köprü arayüzü ({bridge}) farklı bir cihaza aittir ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5209,21 +5665,21 @@ msgstr "" "Seçilen köprü arayüzü ({interface}) aittir {device}, sanal kasanın bir " "parçası olmayan {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Sanal arabirimlerin üst LAG arabirimi olamaz." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Bir LAG arabirimi kendi ana arabirimi olamaz." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "Seçilen LAG arayüzü ({lag}) farklı bir cihaza aittir ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5232,43 +5688,43 @@ msgstr "" "Seçilen LAG arayüzü ({lag}) aittir {device}, sanal kasanın bir parçası " "olmayan {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Sanal arabirimler PoE moduna sahip olamaz." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Sanal arabirimler PoE tipine sahip olamaz." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Bir PoE türü belirlerken PoE modunu belirtmelisiniz." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "Kablosuz rolü yalnızca kablosuz arayüzlerde ayarlanabilir." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Kanal sadece kablosuz arayüzlerde ayarlanabilir." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "Kanal frekansı yalnızca kablosuz arayüzlerde ayarlanabilir." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Seçili kanal ile özel frekans belirlenemiyor." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "Kanal genişliği yalnızca kablosuz arayüzlerde ayarlanabilir." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "Seçili kanal ile özel genişlik belirlenemiyor." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5277,24 +5733,24 @@ msgstr "" "Etiketlenmemiş VLAN ({untagged_vlan}) arayüzün ana cihazıyla aynı siteye ait" " olmalı veya global olmalıdır." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "İlgili arka bağlantı noktasında eşlenmiş konum" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "ön bağlantı noktası" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "ön bağlantı noktaları" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Arka bağlantı noktası ({rear_port}) aynı cihaza ait olmalıdır" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5303,19 +5759,19 @@ msgstr "" "Geçersiz arka bağlantı noktası konumu ({rear_port_position}): Arka bağlantı " "noktası {name} sadece var {positions} pozisyonları." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Eşlenebilecek ön bağlantı noktalarının sayısı" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "arka bağlantı noktası" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "arka bağlantı noktaları" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5324,146 +5780,149 @@ msgstr "" "Konum sayısı, eşlenen ön bağlantı noktalarının sayısından az olamaz " "({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "modül yuvası" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "modül bölmeleri" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "Bir modül yuvası, içinde kurulu bir modüle ait olamaz." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "cihaz yuvası" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "cihaz yuvaları" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "Bu tür bir cihaz ({device_type}) cihaz bölmelerini desteklemez." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Bir cihaz kendi içine yüklenemiyor." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "Belirtilen cihaz yüklenemiyor; cihaz zaten yüklü {bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "envanter kalemi rolü" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "envanter kalemi rolleri" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "seri numarası" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "varlık etiketi" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "Bu öğeyi tanımlamak için kullanılan benzersiz bir etiket" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "keşfedilen" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Bu öğe otomatik olarak keşfedildi" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "envanter kalemi" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "envanter kalemleri" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Kendisi ebeveyn olarak atanamıyor." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Ana envanter kalemi aynı cihaza ait değildir." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Bağımlı çocuklarla bir envanter öğesi taşınamıyor" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "Başka bir cihazdaki bileşene envanter öğesi atanamıyor" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "üretici firma" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "üreticiler" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "model" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "varsayılan platform" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "parça numarası" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Ayrık parça numarası (isteğe bağlı)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "yükseklik (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "kullanımdan hariç tut" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "Raf kullanımı hesaplanırken bu tip cihazlar hariç tutulur." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "tam derinliktir" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "Cihaz hem ön hem de arka kabin yüzlerini tüketir." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "ebeveyn/çocuk durumu" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5471,24 +5930,24 @@ msgstr "" "Ana cihazlar, alt cihazarı cihaz yuvalarında barındırır. Bu cihaz türü ana " "veya alt cihaz değilse boş bırakın." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "hava akımı" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "cihaz tipi" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "cihaz türleri" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "U yüksekliği 0,5 raf ünitesi artışlarla olmalıdır." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5497,7 +5956,7 @@ msgstr "" "{rack} kabininde {device} cihazını {height}U yüksekliğinde barındırmak için " "yeterli alan bulunmamaktadır" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5507,7 +5966,7 @@ msgstr "" "href=\"{url}\">{racked_instance_count} örnekler zaten raflara monte " "edilmiştir." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5515,164 +5974,164 @@ msgstr "" "Ana cihaz olarak sınıflandırmadan önce bu cihazla ilişkili tüm cihaz yuvası " "şablonlarını silmeniz gerekir." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Çocuk cihaz türleri 0U olmalıdır." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "modül tipi" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "modül türleri" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Sanal makineler bu role atanabilir" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "cihaz rolü" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "cihaz rolleri" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" "İsteğe bağlı olarak bu platformu belirli bir üreticinin cihazlarıyla " "sınırlayın" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "platform" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "platformlar" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Bu cihazın hizmet ettiği işlev" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Üretici tarafından atanan şasi seri numarası" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "Bu cihazı tanımlamak için kullanılan benzersiz bir etiket" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "pozisyon (U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "raf yüzü" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "birincil IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "birincil IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "bant dışı IP" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "VC pozisyonu" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Sanal şasi konumu" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC önceliği" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Sanal şasi ana seçim önceliği" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "enlem" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "Ondalık formatta GPS koordinatı (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "boylam" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Aygıt adı site başına benzersiz olmalıdır." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "cihaz" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "cihazlar" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Raf {rack} siteye ait değil {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "{location} Konum {site} adlı siteye ait değil." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "{rack} rafı {location} adlı konuma ait değil." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "Bir raf atamadan raf yüzü seçilemez." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Bir raf atamadan raf konumu seçilemez." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Konum 0,5 raf ünitesinin artışlarında olmalıdır." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "Raf konumunu tanımlarken raf yüzü belirtilmelidir." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "Bir 0U cihaz tipi ({device_type}) bir raf konumuna atanamaz." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "" "Alt aygıt türleri bir raf yüzüne atanamaz. Bu, ana cihazın bir özelliğidir." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5680,7 +6139,7 @@ msgstr "" "Alt aygıt türleri bir raf konumuna atanamaz. Bu, ana aygıtın bir " "özelliğidir." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5689,22 +6148,22 @@ msgstr "" "U{position} zaten işgal edilmiş veya bu cihaz tipini barındırmak için " "yeterli alana sahip değil: {device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} Bu bir IPv4 adresi değildir." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Belirtilen IP adresi ({ip}) bu cihaza atanmamıştır." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} Bu bir IPv6 adresi değildir." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5713,16 +6172,16 @@ msgstr "" "Atanan platform aşağıdakilerle sınırlıdır {platform_manufacturer} cihaz " "türleri, ancak bu cihazın türü şunlara aittir {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Atanan küme farklı bir siteye aittir ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "Sanal bir kasaya atanan bir aygıtın konumu tanımlanmış olmalıdır." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5731,36 +6190,36 @@ msgstr "" "Cihaz sanal kasadan kaldırılamıyor {virtual_chassis} çünkü şu anda efendisi " "olarak belirlenmiştir." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "modül" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "modülleri" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "Modül, atanan cihaza ait bir modül bölmesine kurulmalıdır ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "domain" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "sanal kasa" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "Seçilen usta ({master}) bu sanal kasaya atanmamıştır." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5769,102 +6228,102 @@ msgstr "" "Sanal kasa silinemiyor {self}. Çapraz şasi LAG arabirimleri oluşturan üye " "arayüzleri vardır." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "belirlemek" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Ana aygıta benzersiz sayısal tanımlayıcı" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "yorumlar" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "sanal cihaz bağlamı" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "sanal cihaz bağlamları" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} IPV değil{family} adres." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "Birincil IP adresi, atanan cihazdaki bir arayüze ait olmalıdır." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "ağırlık" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "ağırlık birimi" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Ağırlık ayarlarken bir birim belirtmelisiniz" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "güç paneli" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "güç panelleri" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "{location} ({location_site}) adlı konum, {site} adlı sitede değil." -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "sağlamak" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "faz" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "voltaj" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "amper" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "maksimum kullanım" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "İzin verilen maksimum çekiliş (yüzde)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "mevcut güç" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "güç beslemesi" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "güç beslemeleri" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5873,63 +6332,63 @@ msgstr "" "Raf {rack} ({rack_site}) ve güç paneli {powerpanel} ({powerpanel_site}) " "farklı sitelerdedir." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "AC beslemesi için voltaj negatif olamaz" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "genişlik" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Ray-ray genişliği" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Raf ünitelerinde yükseklik" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "başlangıç ünitesi" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Raf için başlangıç ünitesi" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "azalan birimler" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Birimler yukarıdan aşağıya numaralandırılmıştır" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "dış genişlik" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Rafın dış boyutu (genişlik)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "dış derinlik" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Rafın dış boyutu (derinlik)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "dış ünite" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "montaj derinliği" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5937,74 +6396,75 @@ msgstr "" "Monte edilmiş bir cihazın milimetre cinsinden maksimum derinliği. Dört " "direkli raflar için bu, ön ve arka raylar arasındaki mesafedir." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "maksimum ağırlık" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Raf için maksimum yük kapasitesi" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "form faktörü" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "raf tipi" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "raf türleri" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "Dış genişlik/derinlik ayarlarken bir birim belirtmelidir" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Maksimum ağırlık ayarlarken bir birim belirtmelisiniz" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "raf rolü" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "raf rolleri" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "tesis kimliği" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Yerel olarak atanmış tanımlayıcı" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Fonksiyonel rol" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Bu rafı tanımlamak için kullanılan benzersiz bir etiket" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "raf" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "rafları" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "Atanan konum üst siteye ait olmalıdır ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6013,7 +6473,7 @@ msgstr "" "Raf en az olmalıdır {min_height}Şu anda yüklü cihazları barındırmak için " "yeterli." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6022,889 +6482,951 @@ msgstr "" "Raf ünitesi numaralandırması şu adreste başlamalıdır: {position} veya şu " "anda yüklü cihazları barındırmak için daha az." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Konum aynı siteden olmalı, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "birimler" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "raf rezervasyonu" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "raf rezervasyonları" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "Geçersiz birim (ler) i {height}U rafı: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Aşağıdaki birimler zaten rezerve edilmiştir: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Bu ada sahip üst düzey bir bölge zaten var." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Bu kısa adı içeren üst düzey bir bölge zaten var." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "bölge" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "bölgeler" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Bu ada sahip üst düzey bir site grubu zaten var." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Bu kısa adı içeren üst düzey bir site grubu zaten var." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "site grubu" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "site grupları" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Sitenin tam adı" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "tesise" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Yerel tesis kimliği veya açıklaması" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "fiziksel adres" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Binanın fiziksel konumu" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "teslimat adresi" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Fiziksel adresden farklıysa" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "sitesi" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "siteler" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "Belirtilen sitede bu ada sahip bir konum zaten var." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "Belirtilen sitede bu kısa ada sahip bir konum zaten var." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "konum" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "konumlar" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "Ana konum ({parent}) aynı siteye ({site}) ait olmalıdır." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Fesih A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Sonlandırma B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Aygıt A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Aygıt B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Konum A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Konum B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Raf A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Raf B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Site A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Site B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Ulaşılabilir" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Aygıtlar" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "Sanal Makineler" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Yapılandırma Şablonu" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Site Grubu" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP Adresi" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4 Adresi" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6 Adresi" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "VC Pozisyonu" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "VC Önceliği" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Ebeveyn Aygıtı" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Konum (Aygıt Yuvası)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Konsol bağlantı noktaları" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Konsol sunucusu bağlantı noktaları" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Güç bağlantı noktaları" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Elektrik prizleri" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Arayüzler" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Ön bağlantı noktaları" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Cihaz yuvaları" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Modül bölmeleri" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Envanter kalemleri" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Modül Yuvası" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Envanter Öğeleri" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Kablo Rengi" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "Meslektaşları Bağla" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Bağlı İşaretle" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Maksimum çekim (W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Tahsis edilen çekiliş (W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP Adresleri" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "FHRP Grupları" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Tünel" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Yalnızca Yönetim" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDC'ler" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Yüklü Modül" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Modül Seri" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Modül Varlık Etiketi" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Modül Durumu" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Bileşen" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Öğeler" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Cihaz Türleri" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Modül Çeşitleri" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Platformlar" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Varsayılan Platform" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Tam Derinlik" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "U Yüksekliği" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Örnekler" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Konsol Bağlantı Noktaları" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Konsol Sunucusu Bağlantı Noktaları" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Güç Bağlantı Noktaları" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Elektrik Prizleri" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Ön Bağlantı Noktaları" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Arka Bağlantı Noktaları" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Cihaz Yuvaları" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Modül Bölmeleri" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Güç Beslemeleri" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Maksimum Kullanım" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Kullanılabilir Güç (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Raflar" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Yükseklik" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Dış genişlik" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Dış Derinlik" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Maksimum Ağırlık" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Uzay" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Siteler" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Test senaryosu peer_termination_type ayarlamalıdır" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Bağlantısı kesildi {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Rezervasyon" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Raf Olmayan Cihazlar" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Yapılandırma Bağlamı" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Oluştur Yapılandırması" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Şablon oluşturulurken bir hata oluştu: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Sanal Makineler" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Yüklü cihaz {device} körfezde {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Kaldırılan cihaz {device} körfezden {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Çocuklar" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Eklenen üye {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Ana aygıt kaldırılamıyor {device} sanal kasadan." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Kaldırıldı {device} sanal kasadan {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Bilinmeyen ilgili nesne (ler): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Özel alanların türünü değiştirmek desteklenmez." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Bu komut dosyası için zamanlama etkin değil." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Metin" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Metin (uzun)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Tamsayı" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Ondalık" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Boolean (doğru/yanlış)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "TARİH" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Tarih ve saat" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Seçim" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Çoklu seçim" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Birden çok nesne" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Engelli" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Gevşek" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Kesin" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Her zaman" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Ayarlanmışsa" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Gizli" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Evet" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Hayır" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Bağlantı" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "En yeni" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "En eski" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Alfabetik (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Alfabetik (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Bilgi" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Başarı" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Uyarı" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Tehlike" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Hata ayıklama" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "Varsayılan" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Başarısızlık" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Saatlik" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 saat" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Günlük" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Haftalık" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 gün" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Oluştur" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Güncelleme" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Sil" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Mavi" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "çivit mavisi" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Mor" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Pembe" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Kırmızı" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Portakal" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Sarı" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Yeşil" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "çamurcun" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Mavi" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Gri" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Siyah" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Beyaz" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Web kancası" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Senaryo" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Bildirim" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Bilinmeyen operatör: {op}. Şunlardan biri olmalı: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Desteklenmeyen değer türü: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Geçersiz tür {op} operasyon: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Kural seti bir sözlük olmalı, değil {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Geçersiz mantık türü: 'AND' veya 'OR' olmalıdır. Lütfen belgeleri kontrol " "edin." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "Yanlış anahtar (ler) bilgilendirildi. Lütfen belgeleri kontrol edin." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Widget türü" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Kayıtlı olmayan widget sınıfı: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} bir render () yöntemi tanımlamalıdır." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Not" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "Bazı rastgele özel içerikleri görüntüleyin. Markdown desteklenir." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Nesne Sayıları" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6912,267 +7434,289 @@ msgstr "" "Bir dizi NetBox modeli ve her tür için oluşturulan nesne sayısını " "görüntüleyin." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Nesne sayısını sayarken uygulanacak filtreler" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "Geçersiz biçim. Nesne filtreleri sözlük olarak iletilmelidir." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Nesne Listesi" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "İsteğe bağlı bir nesne listesi görüntüleyin." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Görüntülenecek nesnelerin varsayılan sayısı" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "Geçersiz biçim. URL parametreleri sözlük olarak iletilmelidir." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS Beslemesi" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Harici bir web sitesinden bir RSS beslemesi ekleyin." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "Akış URL'si" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Görüntülenecek maksimum nesne sayısı" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "" "Önbelleğe alınan içeriğin ne kadar süre saklanacağı (saniye cinsinden)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Yer İşaretleri" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Kişisel yer imlerinizi gösterin" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Bir olay kuralı için bilinmeyen eylem türü: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Olaylar boru hattı içe aktarılamıyor {name} hata: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Komut dosyası modülü (ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Veri dosyası (ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Grup (isim)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Küme türü" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Küme tipi (kısa ad)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Kiracı grubu" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Kiracı grubu (kısa ad)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "etiket" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Etiket (kısa ad)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Yerel yapılandırma bağlam verilerine sahiptir" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Grup adı" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Gerekli" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Benzersiz olmalı" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Kullanıcı arayüzü görünür" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "UI düzenlenebilir" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Klonlanabilir mi" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Minimum değer" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Maksimum değer" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Doğrulama regex" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Davranış" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Yeni pencere" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Düğme sınıfı" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIME türü" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Dosya uzantısı" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Ek olarak" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Paylaşılan" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP yöntemi" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "Yük URL'si" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL doğrulama" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Gizli" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA dosya yolu" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Etkinlik türleri" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Aktif" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Nesne türleri" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Bir veya daha fazla atanmış nesne türü" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Alan veri türü (örn. Metin, tamsayı vb.)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Nesne türü" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Nesne türü (nesne veya çoklu nesne alanları için)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Seçim seti" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Seçim kümesi (seçim alanları için)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Özel alanın kullanıcı arayüzünde görüntülenip görüntülenmediği" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Özel alanın kullanıcı arayüzünde düzenlenebilir olup olmadığı" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "Kullanılacak önceden tanımlanmış seçeneklerin temel kümesi (varsa)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7181,185 +7725,201 @@ msgstr "" "seçeneklerinin alıntılanmış dizesi: “Seçim1:First Choice, Choice2:Second " "Choice”" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "düğme sınıfı" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Bir gruptaki ilk bağlantının sınıfı açılır düğme için kullanılacaktır." -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Bu kuralı tetikleyecek olay türü (ler)" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Eylem nesnesi" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Noktalı yol olarak Webhook adı veya komut dosyası module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Web kancası {name} bulunamadı" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Senaryo {name} bulunamadı" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Atanan nesne türü" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Girişin sınıflandırılması" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Kullanıcılar" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "" "Virgülle ayrılmış, çift tırnak işareti ile çevrelenmiş kullanıcı adları" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Gruplar" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Virgülle ayrılmış, çift tırnak işareti ile çevrelenmiş grup adları" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "İlgili nesne türü" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Alan tipi" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Seçenekler" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Veriler" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Veri dosyası" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "İçerik türleri" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP içerik türü" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Etkinlik türü" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Eylem türü" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Etiketli nesne türü" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "İzin verilen nesne türü" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Bölgeler" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Site grupları" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Konumlar" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Cihaz türleri" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Roller" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Küme türleri" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Küme grupları" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Kümeler" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Kiracı grupları" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Bu özel alana sahip nesnenin türü (leri) i" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Varsayılan değer" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "İlgili nesnenin türü (yalnızca nesne/çoklu nesne alanları için)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "İlgili nesne filtresi" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Sorgu parametrelerini JSON nesnesi olarak belirtin." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Özel Alan" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7367,7 +7927,7 @@ msgstr "" "Bu alanda depolanan veri türü. Nesne/çoklu nesne alanları için aşağıda " "ilgili nesne türünü seçin." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7375,11 +7935,11 @@ msgstr "" "Bu, form alanı için yardım metni olarak görüntülenecektir. Markdown " "desteklenir." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "İlgili Nesne" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7387,15 +7947,16 @@ msgstr "" "Satır başına bir seçenek girin. Her seçim için iki nokta üst üste eklenerek " "isteğe bağlı bir etiket belirtilebilir. Örnek:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Özel Bağlantı" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Şablonlar" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7404,7 +7965,7 @@ msgstr "" "Bağlantı metni için Jinja2 şablon kodu. Nesneyi {example} şeklinde referans " "alabilirsiniz. Boş metin olarak görüntülenen bağlantılar görüntülenmez." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7412,52 +7973,58 @@ msgstr "" "Bağlantı metni için Jinja2 şablon kodu. Nesneyi {example} şeklinde referans " "alabilirsiniz. " -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Şablon kodu" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Dışa Aktarma Şablonu" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Oluşturma" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "Şablon içeriği aşağıda seçilen uzak kaynaktan doldurulur." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Yerel içerik veya veri dosyası belirtmelidir" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Kaydedilen Filtre" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Bir bildirim grubu en az bir kullanıcı veya grup belirtir." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP isteği" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Eylem seçimi" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Koşulları girin JSON biçim." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7465,111 +8032,113 @@ msgstr "" "Eyleme iletilecek parametreleri girin JSON" " biçim." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Etkinlik Kuralı" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Tetikleyiciler" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Bildirim grubu" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Kiracılar" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Veriler aşağıda seçilen uzak kaynaktan doldurulur." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Yerel veri veya veri dosyası belirtmelidir" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "İçerik" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Şurada programlayın" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Raporun yürütülmesini belirli bir zamana planlayın" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Her birini tekrarlar" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Bu raporun yeniden çalıştırıldığı aralık (dakika cinsinden)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (Geçerli saat: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Planlanan zaman gelecekte olmalıdır." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Değişiklikleri gerçekleştirme" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Veritabanındaki değişiklikleri ilet (kuru çalıştırma için işaretini " "kaldırın)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Komut dosyasının yürütülmesini belirli bir zamana planlayın" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Bu komut dosyasının yeniden çalıştırıldığı aralık (dakika cinsinden)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Veritabanı değişiklikleri otomatik olarak geri alındı." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Komut dosyası hatayla iptal edildi: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Bir istisna oluştu: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Veritabanı değişiklikleri hata nedeniyle geri alındı." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Dizinleyici bulunamadı!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "yapılandırma bağlamı" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "yapılandırma bağlamları" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON verileri nesne biçiminde olmalıdır. Örnek:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7577,19 +8146,19 @@ msgstr "" "Yerel yapılandırma bağlamı verileri, nihai işlenmiş yapılandırma bağlamında " "kaynak bağlamlara göre önceliklidir" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "şablon kodu" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2 şablon kodu." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "çevre parametreleri" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7599,39 +8168,39 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">ek" " parametreler Jinja2 ortamını inşa ederken geçmek." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "yapılandırma şablonu" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "yapılandırma şablonları" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Bu alanın geçerli olduğu nesne (ler) dir." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Bu özel alanın tuttuğu veri türü" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "Bu alanın eşlendiği NetBox nesnesinin türü (nesne alanları için)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "İç alan adı" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Yalnızca alfasayısal karakterlere ve alt çizgilere izin verilir." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "Özel alan adlarında çift alt çizgilere izin verilmez." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7639,19 +8208,19 @@ msgstr "" "Kullanıcılara görüntülenen alanın adı (belirtilmezse, 'alanın adı " "kullanılacaktır)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "grup adı" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Aynı gruptaki özel alanlar birlikte görüntülenecektir" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "gereklidir" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7659,19 +8228,19 @@ msgstr "" "Yeni nesneler oluştururken veya mevcut bir nesneyi düzenlerken bu alan " "gereklidir." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "benzersiz olmalı" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Bu alanın değeri atanan nesne için benzersiz olmalıdır" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "arama ağırlığı" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7679,11 +8248,11 @@ msgstr "" "Arama için ağırlıklandırma. Düşük değerler daha önemli kabul edilir. Arama " "ağırlığı sıfır olan alanlar göz ardı edilecektir." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "filtre mantığı" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7691,11 +8260,11 @@ msgstr "" "Loose, belirli bir dizgenin herhangi bir örneğiyle eşleşir; tam olarak tüm " "alanla eşleşir." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "varsayılan" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7703,7 +8272,7 @@ msgstr "" "Alan için varsayılan değer (JSON değeri olmalıdır). Dizeleri çift tırnak " "işaretleriyle kapsülleyin (örn. “Foo”)." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7712,35 +8281,35 @@ msgstr "" "JSON değeri olmalıdır). Dizeleri çift tırnak işareti ile kapsülleyin (örn. " "“Foo”)." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "ekran ağırlığı" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Daha yüksek ağırlığa sahip alanlar bir formda daha düşük görünür." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "minimum değer" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "İzin verilen minimum değer (sayısal alanlar için)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "maksimum değer" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "İzin verilen maksimum değer (sayısal alanlar için)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "doğrulama regex" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7751,190 +8320,192 @@ msgstr "" "zorlamak için ^ ve $ kullanın. Örneğin, ^ [A-Z]{3}$ değerleri " "tam olarak üç büyük harfle sınırlayacaktır." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "seçim seti" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Özel alanın kullanıcı arayüzünde görüntülenip görüntülenmeyeceğini belirtir" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Özel alan değerinin kullanıcı arayüzünde düzenlenip düzenlenemeyeceğini " "belirtir" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "klonlanabilir" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Nesneleri klonlarken bu değeri çoğaltın" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "özel alan" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "özel alanlar" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Geçersiz varsayılan değer”{value}“: {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Minimum değer yalnızca sayısal alanlar için ayarlanabilir" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Maksimum değer yalnızca sayısal alanlar için ayarlanabilir" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Düzenli ifade doğrulaması yalnızca metin ve URL alanları için desteklenir" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Boole alanları için benzersizlik uygulanamaz" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Seçim alanları bir dizi seçenek belirtmelidir." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Seçenekler yalnızca seçim alanlarında ayarlanabilir." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Nesne alanları bir nesne türü tanımlamalıdır." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} alanlar bir nesne türü tanımlayamaz." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "İlgili bir nesne filtresi yalnızca nesne alanları için tanımlanabilir." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Filtre, öznitelikleri değerlerle eşleyen bir sözlük olarak tanımlanmalıdır." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Doğru" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Yanlış" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Değerler bu normal ifadeyle eşleşmelidir: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Değer bir dize olmalıdır." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Değer regex ile eşleşmelidir '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Değer bir tamsayı olmalıdır." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Değer en az olmalıdır {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Değer geçmemelidir {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Değer ondalık olmalıdır." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Değer doğru veya yanlış olmalıdır." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Tarih değerleri ISO 8601 biçiminde olmalıdır (YYYY-AA-GG)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Tarih ve saat değerleri ISO 8601 biçiminde olmalıdır (YYYY-MM-DD HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Geçersiz seçim ({value}) seçim seti için {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Geçersiz seçim (ler) ({value}) seçim seti için {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Değer bir nesne kimliği olmalıdır, değil {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Değer, nesne kimliklerinin bir listesi olmalıdır, değil {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Geçersiz nesne kimliği bulundu: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Zorunlu alan boş olamaz." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Önceden tanımlanmış seçeneklerin temel kümesi (isteğe bağlı)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Seçenekler otomatik olarak alfabetik olarak sıralanır" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "özel alan seçim kümesi" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "özel alan seçim kümeleri" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Temel veya ekstra seçenekleri tanımlamalıdır." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -7943,60 +8514,60 @@ msgstr "" "Seçim kaldırılamıyor {choice} olduğu gibi {model} Ona referans veren " "nesneler." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "plan" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "yapılandırma" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "gösterge paneli" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "gösterge tabloları" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "nesne türleri" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Bu kuralın geçerli olduğu nesne (ler) dir." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Bu kuralı tetikleyecek olay türleri." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "koşullar" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Olayın oluşturulup oluşturulmayacağını belirleyen bir dizi koşul." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "eylem türü" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Eylem nesnesine iletilecek ek veriler" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "olay kuralı" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "etkinlik kuralları" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8006,7 +8577,7 @@ msgstr "" "çağrılacaktır. Jinja2 şablon işleme, istek gövdesi ile aynı bağlamda " "desteklenir." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available burada." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "ek başlıklar" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8032,11 +8603,11 @@ msgstr "" "İsim: Değer. Jinja2 şablon işleme, istek gövdesi ile aynı " "bağlamda desteklenir (aşağıda)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "vücut şablonu" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8049,11 +8620,11 @@ msgstr "" "Kullanıcı adı, istek_kimliği, ve " "veri." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "gizli" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8063,16 +8634,16 @@ msgstr "" "olarak sırrı kullanan yük gövdesinin bir HMAC hex özetini içeren başlık. Sır" " istekte iletilmez." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "" "SSL sertifikası doğrulamasını etkinleştirin. Dikkatle devre dışı bırakın!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA Dosya Yolu" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8080,65 +8651,65 @@ msgstr "" "SSL doğrulaması için kullanılacak belirli CA sertifika dosyası. Sistem " "varsayılanlarını kullanmak için boş bırakın." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "web kancası" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "web kancaları" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "" "SSL doğrulaması devre dışı bırakılmışsa bir CA sertifika dosyası " "belirtmeyin." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Bu bağlantının geçerli olduğu nesne türü (ler) dir." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "bağlantı metni" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Bağlantı metni için Jinja2 şablon kodu" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "bağlantı URL'si" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Bağlantı URL'si için Jinja2 şablon kodu" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Aynı gruba sahip bağlantılar açılır menü olarak görünecektir" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "yeni pencere" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Bağlantıyı yeni bir pencerede açmaya zorla" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "özel bağlantı" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "özel bağlantılar" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Bu şablonun uygulandığı nesne türü (ler) dir." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8146,1078 +8717,1145 @@ msgstr "" "Jinja2 şablon kodu. Dışa aktarılan nesnelerin listesi, adı verilen bir " "bağlam değişkeni olarak iletilir sorgulama." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "Varsayılan olarak metin/düz; karakter kümesi = utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "dosya uzantısı" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Oluşturulan dosya adına eklenecek uzantı" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "ek olarak" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Dosya ek olarak indir" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "dışa aktarma şablonu" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "dışa aktarma şablonları" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "“{name}“ayrılmış bir isimdir. Lütfen farklı bir isim seçin." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Bu filtrenin uygulandığı nesne türü (ler) dir." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "paylaşılan" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "kaydedilmiş filtre" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "kaydedilmiş filtreler" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Filtre parametreleri, anahtar kelime argümanları sözlüğü olarak " "saklanmalıdır." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "görüntü yüksekliği" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "görüntü genişliği" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "görüntü eki" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "görüntü ekleri" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "Görüntü ekleri bu nesne türüne atanamaz ({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "çeşit" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "dergi girişi" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "dergi girişleri" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Günlüğe kaydetme bu nesne türü için desteklenmez ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "yer imi" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "yer imleri" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Yer imleri bu nesne türüne atanamaz ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "okumak" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "olay" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "bildirim" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "bildirimleri" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Bu tür nesneler ({type}) bildirimleri desteklemez." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "gruplar" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "kullanıcıları" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "bildirim grubu" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "bildirim grupları" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "abonelik" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "abonelikler" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "yürütülebilir" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "senaryo" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "senaryolar" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "komut dosyası modülü" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "komut dosyası modülleri" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "zaman damgası" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "tarla" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "değer" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "önbelleğe alınan değer" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "önbelleğe alınan değerler" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "şube" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "dallar" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "aşamalı değişim" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "aşamalı değişiklikler" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Bu etiketin uygulanabileceği nesne türü (ler) dir." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "etiket" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "etiketler" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "etiketli öğe" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "etiketli öğeler" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Komut Dosyası Verileri" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Script Yürütme Parametreleri" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Görevden alma" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Nesne Türleri" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Benzersizliği Doğrula" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "Görünür" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Düzenlenebilir" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "İlgili Nesne Türü" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Seçim Seti" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Klonlanabilir mi" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Minimum Değer" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Maksimum Değer" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Doğrulama Regex" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Saymak" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Alfabetik olarak sıralayın" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Yeni Pencere" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Ek Olarak" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Veri Dosyası" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Senkronize" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Görüntü" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Boyut (Bayt)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Okumak" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL Doğrulama" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Etkinlik Türleri" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Cihaz Rolleri" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Yorumlar (Kısa)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Çizgi" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Seviye" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Mesaj" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Yöntemi" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Bu değerin eşit olduğundan emin olun %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Bu değerin eşit olmadığından emin olun %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Bu alan boş olmalıdır." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Bu alan boş olmamalıdır." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Doğrulama kuralları sözlük olarak geçirilmelidir" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "Özel doğrulama başarısız oldu {attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Geçersiz öznitelik”{name}“istek için" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "\"{name}\" niteliği {model} için geçerli değil." -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Kontrol paneliniz sıfırlandı." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Eklenen widget: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Güncellenmiş widget: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Silinen widget: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Widget silinirken hata oluştu: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Komut dosyası çalıştırılamıyor: RQ işçi işlemi çalışmıyor." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "İsteğe bağlı maske ile geçerli bir IPv4 veya IPv6 adresi girin." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Geçersiz IP adresi biçimi: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "CIDR gösteriminde geçerli bir IPv4 veya IPv6 öneki ve maske girin." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Geçersiz IP önek biçimi: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "İstenen önek boyutlarını barındırmak için yetersiz alan mevcut değil" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Konteyner" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "ZÜMRÜT" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Geri döngü" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Standart" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Kontrol Noktası" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Düz metin" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Geçersiz IP adresi biçimi: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Hedefi içe aktarma" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Hedefi içe aktarma (isim)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Dışa aktarma hedefi" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Dışa aktarma hedefi (isim)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "VRF'yi içe aktarma" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "VRF'yi içe aktarın (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "VRF'yi dışa aktarma" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "VRF'yi (RD) dışa aktarma" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "L2VPN'i içe aktarma" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "L2VPN'i içe aktarma (tanımlayıcı)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "L2VPN'i dışa aktarma" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "L2VPN'i dışa aktarma (tanımlayıcı)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Önek" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RİR (İD)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (kısa ad)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "Önek içinde" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "Önek içinde ve dahil olmak üzere" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Bu önek veya IP'yi içeren önekler" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Maske uzunluğu" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (KİMLİĞİ)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN numarası (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adres" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Bu önek veya IP'yi içeren aralıklar" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Ebeveyn öneki" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Sanal makine (isim)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Sanal makine (ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Arayüz (isim)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM arabirimi (isim)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM arabirimi (ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP grubu (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Bir arayüze atanır" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "Atanmıştır" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Hizmet (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "IP adresi içinde NAT (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Atanmış arayüz" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Atanmış VM arabirimi" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP adresi (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP adresi" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Birincil IPv4 (ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Birincil IPv6 (ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Geçerli bir IPv4 veya IPv6 adresi girin (maske olmadan)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Geçersiz IPv4/IPv6 adres biçimi: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Bu alan maskesiz bir IP adresi gerektirir." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Lütfen geçerli bir IPv4 veya IPv6 adresi belirtin." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Geçerli bir IPv4 veya IPv6 adresi girin (CIDR maskesi ile)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "CIDR maskesi (örn. /24) gereklidir." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Adres deseni" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Benzersiz alanı uygulayın" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Özeldir" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "ZIVIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Eklenen tarih" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN Grubu" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Önek uzunluğu" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Havuz mu" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Tamamen kullanılmış gibi davran" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN Ataması" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS adı" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Protokol" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Grup Kimliği" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Kimlik doğrulama türü" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Kimlik doğrulama anahtarı" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Kimlik Doğrulama" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Kapsam türü" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Kapsam" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN ID aralıkları" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Site ve Grup" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Limanlar" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Rota hedeflerini içe aktarma" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Rota hedeflerini dışa aktarma" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Atanmış RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLAN grubu (varsa)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Atanan arayüzün ana cihazı (varsa)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Sanal makine" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Atanan arabirimin üst VM'si (varsa)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Birincildir" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Bunu atanan cihaz için birincil IP yapın" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Aygıt veya sanal makine belirtilmemiş; birincil IP olarak ayarlanamıyor" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "Arayüz belirtilmedi; birincil IP olarak ayarlanamıyor" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Kimlik doğrulama türü" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Kapsam türü (uygulama ve model)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Atanmış VLAN grubu" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP protokolü" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Bir VM'ye atanmadıysa gereklidir" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Bir cihaza atanmadıysa gereklidir" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} bu cihaza/VM'ye atanmamıştır." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Rota Hedefleri" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Hedefleri içe aktarma" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "İhracat hedefleri" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "VRF tarafından ithal" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "VRF tarafından ihraç edildi" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Özel" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Adres ailesi" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Menzil" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Başlat" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Bitiş" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "İçinde ara" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "VRF'de mevcut" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Cihaz/VM" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Ebeveyn Öneki" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Atanan Cihaz" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Atanmış VM" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Bir arayüze atandı" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS Adı" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN'lar" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "VLAN Kimliği içerir" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN KİMLİĞİ" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Sanal Makine" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Rota Hedefi" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Agrega" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN Aralığı" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Site/VLAN Ataması" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP Aralığı" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP Grubu" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Bunu cihaz/VM için birincil IP yapın" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (İç)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP adresi yalnızca tek bir nesneye atanabilir." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Üst nesne için birincil IP olarak belirlenirken IP adresi yeniden atanamıyor" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Yalnızca bir arayüze atanan IP adresleri birincil IP olarak belirlenebilir." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Sanal IP Adresi" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Atama zaten var" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN kimlikleri" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Çocuk VLAN'ları" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9225,132 +9863,133 @@ msgstr "" "Bir veya daha fazla bağlantı noktası numarasının virgülle ayrılmış listesi. " "Bir aralık bir tire kullanılarak belirtilebilir." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Hizmet Şablonu" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Liman (lar)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Hizmet" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Hizmet şablonu" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "Şablondan" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Özel" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Hizmet şablonu kullanmıyorsanız ad, protokol ve bağlantı noktası (lar) ı " "belirtmeniz gerekir." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "başlangıç" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN aralığı" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN aralıkları" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Başlangıç ASN'si ({start}), son ASN'den ({end}) daha küçük olmalıdır." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Bu ASN alanından sorumlu Bölgesel İnternet Kaydı" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16 veya 32 bit otonom sistem numarası" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "grup kimliği" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "protokol" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "kimlik doğrulama türü" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "kimlik doğrulama anahtarı" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP grubu" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "FHRP grupları" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "FHRP grup ataması" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "FHRP grup ödevleri" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "özel" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "Bu RIR tarafından yönetilen IP alanı özel olarak kabul edilir" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIR'ler" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4 veya IPv6 ağı" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Bu IP alanından sorumlu Bölgesel İnternet Kaydı" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "tarih eklendi" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "toplamak" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "toplar" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "/0 maskesi ile toplama oluşturulamıyor." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9359,7 +9998,7 @@ msgstr "" "Agremalar üst üste gelemez. {prefix} zaten mevcut bir toplama tarafından " "kapsanmıştır ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9368,258 +10007,267 @@ msgstr "" "Önekler toplamalarla örtüşemez. {prefix} mevcut bir toplamı kapsar " "({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "rol" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "rolleri" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "önek" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Maskeli IPv4 veya IPv6 ağı" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Bu önekin operasyonel durumu" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Bu önekin birincil işlevi" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "bir havuz" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Bu önek içindeki tüm IP adresleri kullanılabilir kabul edilir" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "kullanılan işaret" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "önekleri" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "/0 maskesi ile önek oluşturulamıyor." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "küresel tablo" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Yinelenen önek şurada bulundu {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "başlangıç adresi" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4 veya IPv6 adresi (maske ile)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "bitiş adresi" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Bu aralığın çalışma durumu" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Bu aralığın birincil işlevi" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP aralığı" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP aralıkları" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Başlangıç ve bitiş IP adresi sürümleri eşleşmelidir" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Başlangıç ve bitiş IP adresi maskeleri eşleşmelidir" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "Bitiş adresi başlangıç adresinden daha büyük olmalıdır ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Tanımlanan adresler aralık ile örtüşüyor {overlapping_range} VRF'de {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "Tanımlanan aralık maksimum desteklenen boyutu aşıyor ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "adres" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Bu IP'nin operasyonel durumu" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Bu IP'nin işlevsel rolü" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (iç)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "Bu adresin “dış” IP olduğu IP" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Ana bilgisayar adı veya FQDN (büyük/küçük harfe duyarlı değil)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP adresleri" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "/0 maskesi ile IP adresi oluşturulamıyor." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip} bir arayüze atanamayacak bir ağ kimliğidir." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "{ip} bir arayüze atanamayacak bir yayın adresidir." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Yinelenen IP adresi şurada bulundu {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Üst nesne için birincil IP olarak belirlenirken IP adresi yeniden atanamıyor" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Yalnızca IPv6 adreslerine SLAAC durumu atanabilir" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "port numaraları" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "hizmet şablonu" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "servis şablonları" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "Bu hizmetin bağlı olduğu belirli IP adresleri (varsa)" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "hizmet" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "servisler" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "Bir hizmet hem cihaz hem de sanal makine ile ilişkilendirilemez." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "Bir hizmet, bir cihaz veya sanal makine ile ilişkilendirilmelidir." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN grupları" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "scope_id olmadan scope_type ayarlanamıyor." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "scope_type olmadan scope_id ayarlanamıyor." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Aralıklar üst üste gelemez." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Bu VLAN'ın atandığı belirli site (varsa)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN grubu (isteğe bağlı)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Sayısal VLAN Kimliği (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Bu VLAN'ın operasyonel durumu" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Bu VLAN'ın birincil işlevi" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9628,164 +10276,166 @@ msgstr "" "VLAN {group} adlı gruba (kapsam: {scope}) atandığı için; {site} adlı siteye " "de atanamaz ." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID aralıklarda olmalıdır {ranges} gruptaki VLAN'lar için {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "rota ayırt edici" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Benzersiz rota ayırt edici (RFC 4364'te tanımlandığı gibi)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "benzersiz alanı zorunlu kılmak" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Bu VRF içinde yinelenen önek/IP adreslerini önleyin" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRF'ler" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Rota hedef değeri (RFC 4360'a göre biçimlendirilmiş)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "rota hedefi" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "rota hedefleri" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Site Sayısı" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Sağlayıcı Sayısı" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Agregalar" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Eklendi" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Önekler" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Kullanımı" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP Aralıkları" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Önek (Düz)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Derinlik" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Havuz" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "İşaretli Kullanıldı" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Başlangıç adresi" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (İç)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (Dış)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Atanmış" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Atanan Nesne" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Kapsam Türü" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID Aralıkları" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VİDEO" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Benzersiz" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Hedefleri İçe Aktar" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "İhracat Hedefleri" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} geçerli bir önek değildir. Demek istedin {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Önek uzunluğu şunlardan küçük veya eşit olmalıdır %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Önek uzunluğu şunlardan büyük veya eşit olmalıdır %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9793,31 +10443,31 @@ msgstr "" "DNS adlarında yalnızca alfanümerik karakterlere, yıldızlara, tirelere, " "noktalara ve alt çizgilere izin verilir" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Çocuk Önekleri" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Çocuk Aralıkları" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "İlgili IP'ler" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Cihaz Arayüzleri" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM Arayüzleri" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Bu alan boş olmayabilir." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9825,329 +10475,342 @@ msgstr "" "Değer doğrudan iletilmelidir (örn. “foo”: 123); sözlük veya liste " "kullanmayın." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} geçerli bir seçim değildir." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Geçersiz içerik türü: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "" "Geçersiz değer. İçerik türünü 'olarak belirtin.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Aralıklar formda belirtilmelidir (alt, üst)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Menzil sınırları tamsayılar olarak tanımlanmalıdır." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} get_view_name () uygulamasını uygulamalıdır" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Geçersiz izin {permission} model için {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Koyu Kırmızı" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Gül" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Fuşya" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Koyu Mor" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Açık Mavi" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "su" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Koyu Yeşil" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Açık Yeşil" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Kireç" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Kehribar" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Koyu Turuncu" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Kahverengi" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Açık gri" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Gri" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Koyu gri" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "Doğrudan" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Yükleme" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Otomatik algılama" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Virgül" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Noktalı virgül" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Sekme" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Geçersiz yapılandırma parametresi: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Giriş başlığı" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Giriş sayfasında görüntülenecek ek içerik" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Bakım afişi" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Bakım modundayken görüntülenecek ek içerik" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "En iyi afiş" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Her sayfanın üst kısmında görüntülenecek ek içerik" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Alt afiş" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Her sayfanın altında görüntülenecek ek içerik" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Küresel olarak benzersiz IP alanı" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Genel tablo içinde benzersiz IP adreslemesini uygulayın" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "IPv4'ü tercih et" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "IPv4 adreslerini IPv6 yerine tercih edin" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Raf ünitesi yüksekliği" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Oluşturulan raf yükseklikleri için varsayılan birim yüksekliği" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Raf ünitesi genişliği" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Oluşturulan raf yükseklikleri için varsayılan birim genişliği" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Güç besleme gerilimi" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Güç beslemeleri için varsayılan voltaj" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Güç besleme amperi" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Güç beslemeleri için varsayılan amper" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Powerfeed maksimum kullanımı" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Güç beslemeleri için varsayılan maksimum kullanım" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "İzin verilen URL şemaları" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "" "Kullanıcı tarafından sağlanan içerikteki URL'ler için izin verilen şemalar" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Varsayılan sayfa boyutu" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Maksimum sayfa boyutu" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Özel doğrulayıcılar" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Özel doğrulama kuralları (JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Koruma kuralları" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Silme koruma kuralları (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Varsayılan tercihler" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Yeni kullanıcılar için varsayılan tercihler" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Bakım modu" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Bakım modunu etkinleştir" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL etkin" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "GraphQL API'sini etkinleştirin" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Değişiklik günlüğü tutma" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Değişiklik günlüğü geçmişini korumak için günler (sınırsız olarak sıfıra " "ayarlayın)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "İş sonucunun korunması" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "İş sonucu geçmişini tutmak için günler (sınırsız olarak sıfıra ayarlayın)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "Haritalar URL'si" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Coğrafi konumları haritalamak için temel URL" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Kısmi eşleşme" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Tam eşleşme" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Şununla başlar" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "İle bitiyor" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Regeks" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Nesne türü (ler)" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Aramak" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10155,411 +10818,426 @@ msgstr "" "Çift tırnak işaretleriyle çevrelenmiş, virgülle ayrılmış sümüklü böcekleri " "etiketleyin (örn. “tag1, tag2, tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Etiket ekle" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Etiketleri kaldır" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} bir model sınıfı belirtmelidir." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Bilinmeyen alan adı '{name}'özel alan verilerinde." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Özel alan için geçersiz değer '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Özel alan '{name}'benzersiz bir değere sahip olmalıdır." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Gerekli özel alan eksik '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Uzak veri kaynağı" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "veri yolu" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Uzak dosyanın yolu (veri kaynağı köküne göre)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "otomatik senkronizasyon etkin" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "" "Veri dosyası güncellendiğinde verilerin otomatik senkronizasyonunu " "etkinleştir" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "senkronize edilen tarih" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} bir sync_data () yöntemi uygulamalıdır." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Organizasyon" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Site Grupları" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Kiracı Grupları" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "İletişim Grupları" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "İletişim Rolleri" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "İletişim Atamaları" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Raf Rolleri" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Yükselmeler" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Raf Çeşitleri" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Modüller" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Sanal Cihaz Bağlamları" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "İmalatçıları" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Cihaz Bileşenleri" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Envanter Öğesi Rolleri" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "Bağlantılar" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Kablolar" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Kablosuz Bağlantılar" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Arayüz Bağlantıları" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Konsol Bağlantıları" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Güç Bağlantıları" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Kablosuz LAN Grupları" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Önek ve VLAN Rolleri" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN Aralıkları" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN Grupları" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Hizmet Şablonları" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "HİZMETLER" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Tüneller" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Tünel Grupları" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Tünel Sonlandırmaları" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN'ler" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Fesih" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKE Teklifleri" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE Politikaları" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPSec Önerileri" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPsec İlkeleri" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPsec Profilleri" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Sanal Diskler" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Küme Türleri" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Küme Grupları" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Devre Türleri" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Devre Grupları" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Grup Ödevleri" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Devre Sonlandırmaları" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Sağlayıcılar" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Sağlayıcı Hesapları" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Sağlayıcı Ağları" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Güç Panelleri" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Yapılandırmalar" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Yapılandırma Bağlamları" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Yapılandırma Şablonları" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Özelleştirme" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Özel Alanlar" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Özel Alan Seçenekleri" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Özel Bağlantılar" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Şablonları Dışa Aktar" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Kaydedilen Filtreler" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Görüntü Ekleri" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Operasyonlar" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Entegrasyonlar" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Veri Kaynakları" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Etkinlik Kuralları" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Web kancaları" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Meslekler" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Günlüğe kaydetme" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Bildirim Grupları" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Dergi Girişleri" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Değişim Günlüğü" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Yönetici" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API Belirteçleri" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "İzinler" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Sistem" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Eklentiler" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Yapılandırma Geçmişi" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Arka Plan Görevleri" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "İzinler bir küme veya liste olarak iletilmelidir." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Düğmeler bir küme veya liste olarak iletilmelidir." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Düğme rengi ButtonColorChoices içinde bir seçim olmalıdır." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10568,7 +11246,7 @@ msgstr "" "PluginTemplateExtension sınıfı {template_extension} Örnek olarak kabul " "edildi!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10577,194 +11255,195 @@ msgstr "" "{template_extension} Netbox.plugins.pluginTemplateExtension'ın bir alt " "sınıfı değildir!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} Netbox.Plugins.PluginMenuItem örneği olmalıdır" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} Netbox.Plugins.PluginMenuItem örneği olmalıdır" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} Netbox.Plugins.PluginMenuButton örneği olmalıdır" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context bir sözlük olmalıdır" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX Navigasyon" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Dinamik kullanıcı arayüzü gezinmesini etkinleştir" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Deneysel özellik" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Dil" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Kullanıcı arabirimi çevirisini belirtilen dile zorlar" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Çeviri desteği yerel olarak devre dışı bırakıldı" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Sayfa uzunluğu" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Sayfa başına görüntülenecek varsayılan nesne sayısı" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Paginator yerleşimi" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Alt" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Üst" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "İkisi de" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Paginator kontrollerinin bir tabloya göre görüntüleneceği yer" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Veri biçimi" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Kullanıcı arayüzünde genel verileri görüntülemek için tercih edilen " "sözdizimi" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Geçersiz mağaza: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Başlatıldıktan sonra kayıt defterine mağazalar eklenemiyor" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Mağazalar kayıt defterinden silinemiyor" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Çek" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Danca" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Alman" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "İngilizce" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "İspanyolca" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Fransızca" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "İtalyan" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Japonca" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Hollandalı" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Lehçe" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Portekizce" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Rusça" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Türkçe" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Ukraynalı" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Çince" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Tümünü seç" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Tümünü değiştir" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Açılır menüyü Aç/Kapat" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Hata" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "Hayır {model_name} bulunan" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Tarla" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Değer" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Sahte Eklenti" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10773,56 +11452,56 @@ msgstr "" "Seçilen dışa aktarma şablonunu oluştururken bir hata oluştu ({template}): " "{error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Satır {i}: Kimliği olan nesne {id} mevcut değil" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Hayır {object_type} seçildi." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Yeniden adlandırıldı {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Silinmiş {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Değişiklik Günlüğü" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "dergi" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Veriler senkronize edilemiyor: Veri dosyası kümesi yok." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Senkronize edilmiş veriler {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Senkronize {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} get_children () uygulamasını uygulamalıdır" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10830,703 +11509,745 @@ msgstr "" "Kontrol paneli yapılandırması yüklenirken bir hata oluştu. Varsayılan bir " "gösterge tablosu kullanımda." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Erişim Reddedildi" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "Bu sayfaya erişim izniniz yok" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Sayfa Bulunamadı" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "İstenen sayfa mevcut değil" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Sunucu Hatası" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "İsteğinizle ilgili bir sorun oluştu. Lütfen bir yöneticiye başvurun" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Tam istisna aşağıda verilmiştir" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python sürümü" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox sürümü" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Yüklü yok" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "Daha fazla yardım gerekiyorsa, lütfen şu adrese gönderin" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox tartışma forumu" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "GitHub'da" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Ana Sayfa" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Profil" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Bildirimler" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Abonelikler" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Tercihler" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Şifreyi Değiştir" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "İptal" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Kaydet" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Tablo Yapılandırmaları" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Tablo tercihlerini temizle" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Tümünü Değiştir" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Tablo" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Sipariş" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Sütunlar" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Hiçbiri bulunamadı" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Kullanıcı Profili" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Hesap Ayrıntıları" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "E-posta" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Hesap Oluşturuldu" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Son Giriş" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Süper kullanıcı" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Personel" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Atanan Gruplar" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Yok" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Son Etkinlik" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "API Belirteçlerim" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Simge" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Yazma etkin" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "En son kullanılmış" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Bir Jeton Ekle" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Ana Sayfa" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox Motif" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox Logosu" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Dokümanlar" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST API belgeleri" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "NetBox Labs Desteği" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Kaynak Kodu" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Topluluk" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Yükleme Tarihi" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Fesih Tarihi" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Grup Atama" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Takas Devresi Sonlandırmaları" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "%(circuit)s devre için bu sonlandırmaların yerini değiştirin ?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Bir taraf" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z tarafı" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Devre Atama" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Devre Grubu Ataması" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Devre Ekle" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Devre Tipi" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Ekle" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Düzenle" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Takas" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Bağlı olarak işaretlendi" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "doğru" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "İzleme" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Kabloyu düzenle" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Kabloyu çıkarın" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Bağlantıyı kes" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Bağlan" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "Aşağı doğru" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Yukarı akış" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Çapraz Bağlantı" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Yama Paneli/Bağlantı Noktası" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Devre ekle" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Sağlayıcı Hesabı" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Yapılandırma Verileri" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Yorum" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Geri Yükleme" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Parametre" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Mevcut Değer" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Yeni Değer" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Değişti" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Boyut" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bayt" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 Karması" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Senkronizasyon" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Son senkronize edildi" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Arka uç" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Parametre tanımlanmadı" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Dosyalar" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Raf yükseklikleri" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Varsayılan birim yüksekliği" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Varsayılan birim genişliği" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Güç beslemeleri" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Varsayılan voltaj" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Varsayılan amper" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Varsayılan maksimum kullanım" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Küresel benzersiz uygulamayı uygulayın" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Sayfalandırma sayısı" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Maksimum sayfa boyutu" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Kullanıcı tercihleri" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "İş tutma" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "İş" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Tarafından Oluşturuldu" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Çizelgeleme" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "her bir %(interval)s dakikalar" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Değişim" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Farkı" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Önceki" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Sonraki" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Nesne Oluşturuldu" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Nesne Silindi" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Değişiklik Yok" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Ön Değişim Verileri" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "" "Uyarı: Atomik olmayan değişimin önceki değişiklik kaydıyla karşılaştırılması" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Değişim Sonrası Veriler" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Tümünü Gör %(count)s Değişiklikler" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Günlük tutma işlemini değiştir" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "günler" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "belirsiz" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Yüklü değil" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Genel Bakış" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Yüklemek" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Eklenti Ayrıntıları" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Özet" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Lisans" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Sürüm Geçmişi" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Yerel Kurulum Talimatları" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Arka Plan Kuyrukları" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Tabloyu Yapılandır" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Dur" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Requeue" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Sıraya girin" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Kuyruk" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Zaman aşımı" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Sonuç TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Meta" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Argümanlar" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Anahtar Kelime Argümanları" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Bağlı" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "İstisna" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "Görevler " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Kuyruklu İşler" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" @@ -11534,96 +12255,99 @@ msgstr "" "Seçiniz bütün %(count)s %(object_type_plural)s eşleşen " "sorgu" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "İşçi Bilgisi" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "İşçi" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Kuyruklar" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Geçerli İş" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Başarılı iş sayısı" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Başarısız iş sayısı" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Toplam çalışma süresi" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "saniyeler" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Arka Plan Çalışanları" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "İçindeki işçiler %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Dışa Aktar" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Sistem Durumu" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox sürümü" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Django sürümü" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL sürümü" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Veritabanı adı" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Veritabanı boyutu" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Kullanılamıyor" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ çalışanları" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "varsayılan kuyruk" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Sistem zamanı" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Geçerli Yapılandırma" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" @@ -11631,287 +12355,302 @@ msgstr "" "Bunların bağlantısını kesmek istediğinizden emin misiniz %(count)s " "%(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Kablo İzleme için %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "SVG indir" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Asimetrik Yol" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Aşağıdaki düğümlerin bağlantısı yoktur ve asimetrik bir yol ile sonuçlanır" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Yol bölünmesi" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Devamlamak için aşağıdan bir düğüm seçin" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "İzleme Tamamlandı" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Toplam segmentler" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Toplam uzunluk" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Yol bulunamadı" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "İlgili Yollar" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Menşei" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Hedef" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Segmentler" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Tamamlanmamış" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Seçili Yeniden Adlandır" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Bağlı Değil" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Kabindeki cihazı vurgulayın" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Kabine bağlı değil" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS Koordinatları" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Harita" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Varlık Etiketi" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Sanal Kasayı Görüntüle" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "VDC oluştur" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Yönetim" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT için" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Güç Kullanımı" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Giriş" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "Satış noktaları" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Tahsis edilmiş" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "İL" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Bacak" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Hizmet ekle" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Bileşenler Ekle" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Konsol Bağlantı Noktaları Ekle" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Konsol Sunucusu Bağlantı Noktaları Ekle" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Cihaz Yuvaları Ekle" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Ön Bağlantı Noktaları Ekle" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Gizle Etkin" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Gizle Devre Dışı" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Sanal Gizle" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Bağlantısızlığı Gizle" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Arayüzler Ekle" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Envanter Öğesi Ekle" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Modül Yuvaları Ekle" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Elektrik Prizleri Ekle" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Güç Bağlantı Noktası Ekle" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Arka Bağlantı Noktaları Ekle" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Yapılandırma" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Bağlam Verileri" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Oluşturulan Yapılandırma" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "İndir" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Yapılandırma şablonu bulunamadı" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Ebeveyn Körfezi" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Yeniden kısa ad oluştur" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Kaldır" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Yerel Yapılandırma Bağlam Verileri" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Yeniden Adlandır" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Cihaz Yuvası" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Yüklü Cihaz" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Kaldır %(device)s beri %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11920,430 +12659,449 @@ msgstr "" "Kaldırmak istediğinizden emin misiniz? %(device)s beri " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Doldurmak" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Körfez" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Cihaz Ekle" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "VM Rolü" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Model Adı" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Parça Numarası" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Kullanımdan Hariç Tutma" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Ebeveyn/Çocuk" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Ön Görüntü" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Arka Görüntü" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Arka Bağlantı Noktası Konumu" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Bağlı olarak işaretlendi" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Bağlantı Durumu" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "A Tarafı" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B Tarafı" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Fesih yok" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Planlanan İşaretle" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Mark Yüklü" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Yol Durumu" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Ulaşılamıyor" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Yol Bitiş Noktaları" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Bağlı değil" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Etiketsiz" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Atanmamış VLAN" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Temiz" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Tümünü Temizle" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Montaj Derinliği" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Başlangıç Ünitesi" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Azalan Birimler" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Raf yüksekliği" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Çocuk Arayüzü Ekle" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Hız/Dubleks" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE Modu" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE Tipi" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q Modu" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC Adresi" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Kablosuz Bağlantı" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Akran" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Kanal" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Kanal Frekansı" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Kanal Genişliği" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "LAG Üyeleri" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Üye arabirimi yok" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "IP Adresi Ekle" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Ana Öğe" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Parça Kimliği" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Alt Konumu Ekle" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Alt Konumlar" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Konum Ekle" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Cihaz Ekle" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Cihaz Türü Ekle" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Modül Türü Ekle" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Bağlı Cihaz" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Kullanım (Tahsis Edildi" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Elektriksel Özellikler" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Besleme ayağı" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Güç Beslemeleri Ekle" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Maksimum Çekiliş" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Tahsis Edilen Çekiliş" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Alan Kullanımı" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Raf Ağırlığı" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Maksimum Ağırlık" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Toplam Ağırlık" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Resimler ve Etiketler" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Yalnızca resimler" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Yalnızca etiketler" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Rezervasyon ekle" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Listeyi Görüntüle" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Raf görünümünü seçin" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Sıralamaya Göre" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Raf Bulunamadı" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Yükseklikleri Görüntüle" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Rezervasyon Detayları" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Raf Ekle" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Pozisyonlar" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Site Ekle" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Alt Bölgeler" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Bölge Ekle" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Saat dilimi" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Site zamanı" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Fiziksel Adres" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Kargo Adresi" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Çocuk Grupları" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Site Grubu Ekle" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Ataşman" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Üye Ekle" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Üye Cihazları" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Sanal Şasiye Yeni Üye Ekle %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Yeni Üye Ekle" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Eylemler" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Kaydet ve Başka Ekle" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Sanal Kasayı Düzenleme %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Raf/Birim" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Sanal Kasa Üyesini Kaldır" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12352,11 +13110,12 @@ msgstr "" "Kaldırmak istediğinizden emin misiniz? %(device)s sanal " "kasadan %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Tanımlayıcı" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12364,11 +13123,11 @@ msgstr "" "Bu istek sırasında bir modül içe aktarma hatası oluştu. Yaygın nedenler " "aşağıdakileri içerir:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Gerekli paketler eksik" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12384,11 +13143,11 @@ msgstr "" "çalıştırın pip dondurma konsoldan ve çıktıyı gerekli paketlerin" " listesiyle karşılaştırın." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "WSGI hizmeti yükseltmeden sonra yeniden başlatılmadı" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12398,7 +13157,7 @@ msgstr "" "veya uWSGi) yeniden başlatıldığını kontrol edin. Bu, yeni kodun çalışmasını " "sağlar." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12406,11 +13165,11 @@ msgstr "" "Bu istek işlenirken bir dosya izni hatası tespit edildi. Yaygın nedenler " "aşağıdakileri içerir:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Medya köküne yetersiz yazma izni" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12421,7 +13180,7 @@ msgstr "" "kullanıcısının, bu yoldaki tüm konumlara dosya yazmak için erişimi olduğu " "gibi çalıştığından emin olun." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12429,11 +13188,11 @@ msgstr "" "Bu istek işlenirken bir veritabanı programlama hatası tespit edildi. Yaygın " "nedenler aşağıdakileri içerir:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Veritabanı geçişleri eksik" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12444,11 +13203,11 @@ msgstr "" " manuel olarak çalıştırabilirsiniz python3 manage.py geçişi " "komut satırından." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Desteklenmeyen PostgreSQL sürümü" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12458,99 +13217,102 @@ msgstr "" "NetBox'ın kimlik bilgilerini kullanarak veritabanına bağlanarak ve bir sorgu" " düzenleyerek bunu kontrol edebilirsiniz. SÜRÜMÜ SEÇİN ()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Bu nesneyle ilişkili veri dosyası silindi" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Veriler Senkronize Edildi" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Verileri Senkronize Et" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Çevre Parametreleri" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Şablon" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Grup Adı" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Benzersiz Olmalı" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Klonlanabilir" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Varsayılan Değer" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Arama Ağırlığı" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Filtre Mantığı" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Ekran Ağırlığı" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Kullanıcı Arayüzü Görünür" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "UI Düzenlenebilir" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Doğrulama Kuralları" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Düzenli İfade" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Düğme Sınıfı" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Atanan Modeller" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Bağlantı Metni" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "Bağlantı URL'si" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Kontrol Panelini Sıfırla" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12558,7 +13320,7 @@ msgstr "" "Bu kaldıracak bütün widget'ları yapılandırın ve varsayılan " "gösterge paneli yapılandırmasını geri yükleyin." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12566,159 +13328,161 @@ msgstr "" "Bu değişiklik sadece etkiliyor sizin kontrol paneli, ve diğer " "kullanıcıları etkilemeyecektir." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "widget yapılandırması" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Widget'ı kapat" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Widget Ekle" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Henüz yer imi eklenmedi." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "İzin yok" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Bu içeriği görüntüleme izni yok" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "İçerik yüklenemiyor. Geçersiz görünüm adı" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "İçerik bulunamadı" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "RSS beslemesini getirirken bir sorun oluştu" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Koşullar" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME Türü" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Dosya uzantısı" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "İçin planlanmış" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Süre" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Test Özeti" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Günlüğe" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "Çıktı" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Yükleniyor" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Sonuçlar beklemede" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Dergi Girişi" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Bildirim Grubu" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Atanmadı" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Yerel yapılandırma bağlamı tüm kaynak bağlamların üzerine yazar" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Kaynak Bağlamları" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Yeni Dergi Girişi" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Rapor" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "Komut dosyalarını çalıştırma izniniz yok" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Komut Dosyasını Çalıştır" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Komut dosyası yüklenirken hata oluştu" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Kaynak dosyada komut dosyası artık mevcut değil." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Son Koşu" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Komut dosyası artık kaynak dosyada mevcut değil" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Asla" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Tekrar koş" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Komut Dosyası Bulunamadı" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12727,81 +13491,83 @@ msgstr "" "Şuradan başlayın bir komut dosyası " "oluşturma yüklenen bir dosyadan veya veri kaynağından." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Sonuçlar" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Günlük eşiği" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Hepsi" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Etiketli Öğeler" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "İzin Verilen Nesne Türleri" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Herhangi bir" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Etiketli Öğe Türleri" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Etiketli Nesneler" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP Yöntemi" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP İçerik Türü" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL Doğrulama" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Ek Başlıklar" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Vücut Şablonu" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Toplu Oluşturma" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Seçili Nesneler" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "Eklemek için" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Toplu Silme" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Toplu Silmeyi Onayla" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12811,64 +13577,67 @@ msgstr "" "Aşağıdaki işlem silinecek %(count)s %(type_plural)s. Lütfen" " seçilen nesneleri dikkatlice inceleyin ve bu işlemi onaylayın." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Düzenleme" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Toplu Düzenleme" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Uygula" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Toplu İçe Aktar" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Doğrudan İçe Aktar" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Dosya Yükle" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Gönder" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Alan Seçenekleri" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Aksesuar" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "seçimler" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "İthalat Değeri" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Biçim: YYYY-MM-DD" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Doğru veya yanlış belirtin" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "Zorunlu alanlar şart tüm nesneler için belirtilir." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12878,15 +13647,15 @@ msgstr "" " Örneğin, %(example)s bir VRF'yi rota ayırt edicisi ile " "tanımlar." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Toplu Kaldırma" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Toplu Kaldırmayı Onayla" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12897,72 +13666,72 @@ msgstr "" "%(parent_obj)s. Lütfen dikkatlice inceleyin %(obj_type_plural)s kaldırılacak" " ve aşağıda onaylanacak." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Bunları kaldır %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Yeniden Adlandırma" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Toplu Yeniden Adlandırma" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Geçerli İsim" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Yeni İsim" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Önizleme" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Emin misin" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Onayla" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Seçili Düzenle" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Seçili Sil" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Yeni ekle %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Model belgelerini görüntüleyin" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Yardım" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Başka Oluştur ve Ekle" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Filtreler" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -12971,40 +13740,40 @@ msgstr "" "Seçiniz bütün %(count)s " "%(object_type_plural)s eşleşen sorgu" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Yeni Sürüm Mevcut" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "mevcuttur" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Yükseltme Talimatları" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Panelin Kilidini Açın" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Kontrol Panelini Kilitle" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Widget Ekle" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Düzeni Kaydet" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Silmeyi Onayla" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13013,40 +13782,40 @@ msgstr "" "İstediğinizden emin misiniz silmek " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Bu işlem sonucunda aşağıdaki nesneler silinecektir." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "önce" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Okunmamış bildirim yok" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Tüm bildirimler" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Seçiniz" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Sıfırla" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Karanlık modu etkinleştir" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Işık modunu etkinleştir" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13055,281 +13824,283 @@ msgstr "" "%(model)s eklemeden önce %(prerequisite_model)s " "oluşturmalısınız." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Sayfa seçimi" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Gösterme %(start)s-%(end)s dan %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Sayfalama seçenekleri" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "Sayfa Başına" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Bir resim ekle" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "İlgili Nesneler" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Hiçbir etiket atanmadı" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Veriler yukarı akış dosyasıyla senkronize değil" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Hızlı arama" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Kaydedilen filtre" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Net sipariş" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Yardım Merkezi" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Django Yöneticisi" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Oturumu Kapat" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Oturum aç" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Aile" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Ekleme Tarihi" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Önek Ekle" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS Numarası" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Kimlik Doğrulama Türü" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Kimlik Doğrulama Anahtarı" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Sanal IP Adresleri" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "IP atayın" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Toplu Oluşturma" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Grup Oluştur" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Sanal IP'ler" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Atananları Göster" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Mevcut Göster" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Tümünü Göster" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Küresel" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (dış)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "IP Adresi Atama" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "IP Adresini Seçin" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Arama Sonuçları" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Toplu IP Adresleri Ekleme" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Başlangıç Adresi" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Bitiş Adresi" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Tamamen kullanılmış olarak işaretlenmiş" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Adresleme Ayrıntıları" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Çocuk IP'leri" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Kullanılabilir IP'ler" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "İlk kullanılabilir IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Önek Ayrıntıları" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Ağ Adresi" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Ağ Maskesi" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Joker Karakter Maskesi" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Yayın Adresi" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "IP Aralığı Ekle" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Derinlik Göstergelerini Gizle" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Maksimum Derinlik" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Maksimum Uzunluk" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Toplama Ekle" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "VRF'leri içe aktarma" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "VRF'leri Dışa Aktarma" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "L2VPN'leri içe aktarma" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "L2VPN'leri Dışa Aktarma" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Önek Ekle" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "VLAN ekle" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Rota Ayırt Edici" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Benzersiz IP Alanı" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Hatalar" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Oturum aç" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Veya" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Statik Ortam Hatası - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Statik Ortam Arızası" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Aşağıdaki statik medya dosyası yüklenemedi" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Aşağıdakileri kontrol edin" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13339,7 +14110,7 @@ msgstr "" "çalıştırıldı. Bu, her statik dosyanın en son yinelemesini statik kök yoluna " "yükler." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13350,7 +14121,7 @@ msgstr "" "yapılandırılmıştır. STATİC_ROOT yol. Bakınız kurulum belgeleri Daha fazla rehberlik için." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13359,548 +14130,571 @@ msgstr "" "Dosya %(filename)s statik kök dizinde bulunur ve HTTP sunucusu " "tarafından okunabilir." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Tıklayın burada NetBox'ı tekrar yüklemeyi " "denemek için." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "İletişim" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Başlık" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Telefon" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "İletişim Grubu" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Kişi Grubu Ekle" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "İletişim Rolü" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Kişi ekle" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Kiracı Ekle" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Kiracı Grubu" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Kiracı Grubu Ekle" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Atanan İzinler" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "İzin" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Görünüm" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Kısıtlamalar" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Atanan Kullanıcılar" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Tahsis Edilen Kaynaklar" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Sanal CPU'lar" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Bellek" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Disk Alanı" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Sanal Makine Ekle" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Aygıt Atama" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Seçili Kaldır" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Kümeye Aygıt Ekle %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Cihaz Seçimi" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Cihaz Ekle" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Küme Ekle" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Küme Grubu" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Küme Türü" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Sanal Disk" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Kaynaklar" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Sanal Disk Ekle" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE İlkesi" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE Versiyonu" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Önceden Paylaşılan Anahtar" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Sırrı Göster" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Teklifler" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "IKE Teklifi" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Kimlik doğrulama yöntemi" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Şifreleme algoritması" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Kimlik doğrulama algoritması" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "DH grubu" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "SA ömrü (saniye)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPSec İlkesi" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS grubu" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPsec Profili" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS Grubu" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPsec Teklifi" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "SA ömrü (KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN Öznitellikler" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Sonlandırma Ekle" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Sonlandırma Ekle" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Kapsülleme" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPsec profili" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Tünel Kimliği" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Tünel Ekle" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Tünel Grubu" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Tünel Sonlandırma" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "Dış IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Akran Sonlandırmaları" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Şifre" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Ekli Arayüzler" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Kablosuz LAN Ekle" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Kablosuz LAN Grubu" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Kablosuz LAN Grubu Ekle" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Bağlantı Özellikleri" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Mesafe" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Ebeveyn iletişim grubu (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Ebeveyn iletişim grubu (kısa ad)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "İletişim grubu (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "İletişim grubu (kısa ad)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "İletişim (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Kişi rolü (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "İletişim rolü (kısa ad)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "İletişim grubu" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Ana kiracı grubu (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Ana kiracı grubu (kısa ad)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Kiracı grubu (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Kiracı Grubu (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Kiracı Grubu (kısa ad)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Tanımlama" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Atanan kişi" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "iletişim grubu" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "iletişim grupları" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "iletişim rolü" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "iletişim rolleri" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "başlık" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "telefon" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "E-posta" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "bağlantı" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "temas" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "kişileri" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "iletişim ataması" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "iletişim atamaları" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Kişiler bu nesne türüne atanamaz ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "kiracı grubu" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "kiracı grupları" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Kiracı adı, her grup için benzersiz olmalıdır." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Kiracı kısa adı, her grup için benzersiz olmalıdır." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "kiracı" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "kiracılar" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "İletişim Başlığı" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "İletişim Telefonu" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "İletişim E-posta" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "İletişim Adresi" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "İletişim Bağlantısı" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "İletişim Açıklaması" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "İzin (ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Bildirim grubu (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "İlk isim" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Soyadı" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Personel durumu" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Süper kullanıcı durumu" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Anahtar sağlanmazsa, bir anahtar otomatik olarak oluşturulur." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Personel mi" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Süper kullanıcı mı" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Görebilir" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Ekleyebilir" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Değişebilir" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Silebilir" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Kullanıcı Arayüzü" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13910,7 +14704,7 @@ msgstr "" "kaydettiğinizden emin olun belirteç oluşturulduktan sonra artık " "erişilemeyebileceğinden, bu formu göndermeden önce." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13920,32 +14714,32 @@ msgstr "" "olmadan boş bırakın. Örnek: 10.1.1.0/24.192.168.10.16/32,2001: db 8:1:" " :/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Şifreyi onayla" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Doğrulama için öncekiyle aynı şifreyi girin." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Şifreler eşleşmiyor! Lütfen girdilerinizi kontrol edin ve tekrar deneyin." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Ek eylemler" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Yukarıda listelenenlere ek olarak verilen eylemler" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Nesneler" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -13955,76 +14749,76 @@ msgstr "" "ifadesi. Bu türdeki tüm nesneleri eşleştirmek için null bırakın. Birden çok " "nesnenin listesi mantıksal bir OR işlemi ile sonuçlanır." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "En az bir eylem seçilmelidir." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Geçersiz filtre {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Bu izin tarafından verilen eylemlerin listesi" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "kısıtlamaları" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "Seçili türlerin uygulanabilir nesneleriyle eşleşen Queryset filtresi" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "izin" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "izinler" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "kullanıcı tercihleri" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Anahtar '{path}'bir yaprak düğümüdür; yeni anahtarlar atanamıyor" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "Anahtar '{path}'bir sözlüktür; sözlük dışı bir değer atayamaz" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "süresi dolmak" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "son kullanılan" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "anahtar" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "yazma etkin" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Bu anahtarı kullanarak oluşturma/güncelleme/silme işlemlerine izin verin" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "izin verilen IP'ler" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14033,41 +14827,41 @@ msgstr "" "olmadan boş bırakın. Örn: “10.1.1.0/24, 192.168.10.16/32, 2001: DB 8:1: " ":/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "jeton" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "jetonlar" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "grup" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "kullanıcı" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Bu kullanıcı adına sahip bir kullanıcı zaten var." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Özel Eylemler" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "Sağlanan öznitelikler kullanılarak ilgili nesne bulunamadı: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Birden çok nesne sağlanan özniteliklerle eşleşir: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14076,41 +14870,41 @@ msgstr "" "İlgili nesnelere sayısal kimlik veya öznitelikler sözlüğü ile " "başvurulmalıdır. Tanınmayan bir değer alındı: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "Sağlanan sayısal kimlik kullanılarak ilgili nesne bulunamadı: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} tanımlanmış bir anahtarı var ama SEÇENEKLER bir liste değil" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Ağırlık pozitif bir sayı olmalıdır" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Geçersiz değer '{weight}'ağırlık için (bir sayı olmalıdır)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" "Bilinmeyen birim {unit}. Aşağıdakilerden biri olmalıdır: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Uzunluk pozitif bir sayı olmalıdır" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Geçersiz değer '{length}'uzunluk için (bir sayı olmalıdır)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14118,15 +14912,15 @@ msgid "" msgstr "" "Silinemiyor {objects}. {count} bağımlı nesneler bulundu: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "50'den fazla" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "Onaltılık olarak RGB rengi. Örnek: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14135,7 +14929,7 @@ msgstr "" "%s(%r) geçersiz. counterCacheField için to_model parametresi 'app.model' " "biçiminde bir dize olmalıdır" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14144,37 +14938,37 @@ msgstr "" "%s(%r) geçersiz. counterCacheField için to_field parametresi 'field' " "biçiminde bir dize olmalıdır" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Nesne verilerini CSV, JSON veya YAML biçiminde girin." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV sınırlayıcı" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "" "CSV alanlarını sınırlayan karakter. Yalnızca CSV formatı için geçerlidir." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "Bir dosya yüklerken/seçerken form verileri boş olmalıdır." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Bilinmeyen veri biçimi: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Veri biçimi tespit edilemiyor. Lütfen belirtin." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Geçersiz CSV sınırlayıcı" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14182,7 +14976,7 @@ msgstr "" "Geçersiz YAML verileri. Veriler birden fazla belge veya bir sözlük listesi " "içeren tek bir belge şeklinde olmalıdır." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14191,7 +14985,7 @@ msgstr "" "Geçersiz liste ({value}). Sayısal olmalı ve aralıklar artan sırada " "olmalıdır." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14199,24 +14993,25 @@ msgstr "" "Virgülle ayrılmış bir veya daha fazla sayısal aralık belirtin. Örnek: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." msgstr "" "Geçersiz aralıklar ({value}). Artan sırada bir tamsayı aralığı olmalıdır." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Çoktan seçmeli alan için geçersiz değer: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Nesne bulunamadı: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14224,20 +15019,20 @@ msgid "" msgstr "" "“{value}“bu alan için benzersiz bir değer değil; birden fazla nesne bulundu" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "“{field_name}“geçersiz bir erişici alan adıdır." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Nesne türü şu şekilde belirtilmelidir”.“" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Geçersiz nesne türü" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14247,7 +15042,7 @@ msgstr "" "karışık durumlar ve türler desteklenmez (örnek: [ge, xe] -0/0/ " "[0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14255,7 +15050,7 @@ msgstr "" "Birden çok IP oluşturmak için sayısal bir aralık belirtin.
    Örnek: " "192.0.2. [1.5,100-254] /24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    İndirim sözdizimi desteklenir" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL dostu benzersiz stenografi" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "" "İçeriğe bağlam verilerini girin JSON " "biçim." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC adresi EUI-48 formatında olmalıdır" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Düzenli ifadeler kullan" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Güncellenecek mevcut bir nesnenin sayısal kimliği (yeni bir nesne " "oluşturmuyorsa)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Tanınmayan başlık: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Kullanılabilir Sütunlar" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Seçili Sütunlar" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14310,13 +15105,13 @@ msgstr "" "Bu nesne, form oluşturulduğundan beri değiştirildi. Ayrıntılar için lütfen " "nesnenin değişiklik günlüğüne bakın." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Menzil”{value}“geçersiz." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14325,73 +15120,73 @@ msgstr "" "Geçersiz aralık: Bitiş değeri ({end}) başlangıç değerinden büyük olmalıdır " "({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Yinelenen veya çakışan sütun başlığı”{field}“" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Yinelenen veya çakışan sütun başlığı”{header}“" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Satır {row}: Bekleniyor {count_expected} sütunlar ama bulundu {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Beklenmeyen sütun başlığı”{field}“bulundu." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "Sütun”{field}“ilgili bir nesne değildir; nokta kullanamaz" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "Sütun için geçersiz ilgili nesne özniteliği”{field}“: {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Gerekli sütun başlığı”{header}“Bulunamadı." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Dinamik sorgu parametresi için gerekli değer eksik: '{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "Statik sorgu parametresi için gerekli değer eksik: '{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Şifre en az bir rakamdan oluşmalıdır." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Şifre en az bir büyük harf içermelidir." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Şifre en az bir küçük harf içermelidir." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." msgstr "" "Şifreniz en az bir rakamı, bir büyük harf ve bir küçük harf içermelidir." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14399,127 +15194,127 @@ msgid "" msgstr "" "Geçersiz izin adı: {name}. Formatında olmalı ._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Bilinmeyen app_label/model_name {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Geçersiz IP adresi ayarlandı {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Adlı bir sütun {name} tablo için zaten tanımlanmıştır {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Tanımlanmamış" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Yer İşaretini Kaldır" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Yer işareti" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Klon" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Geçerli Görünüm" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Tüm Veriler" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Dışa aktarma şablonu ekle" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "İçe aktar" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Aboneliği iptal et" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Abone ol" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Panoya kopyala" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Bu alan zorunludur" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Sıfır Ayarla" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Hepsini temizle" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Tablo Yapılandırması" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Yukarı hareket et" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Aşağı hareket et" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Arama..." -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Arama NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Seçiciyi aç" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Yazmak" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Test csv_update_data tanımlamalıdır." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} geçerli bir normal ifade değildir." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} get_required_permissions () uygulamasını " "uygulamalıdır" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} get_required_permissions () uygulamasını uygulamalıdır" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14528,61 +15323,63 @@ msgstr "" "{class_name} tanımlanmış bir sorgu seti yok. ObjectPermissionRequiredMixin " "yalnızca temel sorgu kümesini tanımlayan görünümlerde kullanılabilir" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Ana grup (ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Ebeveyn grubu (kısa ad)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Küme türü (ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Küme (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU'lar" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Bellek (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Küme türü" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Atanmış küme grubu" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Atanmış küme" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Küme içinde atanan aygıt" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Seri numarası" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14591,50 +15388,50 @@ msgstr "" "{device} adlı aygıt, ({cluster_site}) kümesinden farklı bir siteye " "({device_site}) aittir" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "İsteğe bağlı olarak bu sanal makineyi küme içindeki belirli bir ana aygıta " "sabitleyin" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Site/Küme" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "Disk boyutu sanal disklerin eklenmesiyle yönetilir." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Disk" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "küme türü" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "küme türleri" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "küme grubu" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "küme grupları" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "küme" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "kümeleri" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14643,47 +15440,47 @@ msgstr "" "{count} aygıt bu küme için ana bilgisayar olarak atanır, ancak {site} isimli" " site için için atanmaz" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "bellek (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "disk (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Sanal makine adı küme başına benzersiz olmalıdır." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "sanal makine" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "sanal makineler" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "Bir sanal makine bir siteye ve/veya kümeye atanmalıdır." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "Seçilen küme ({cluster}) bu siteye atanmamıştır ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Ana aygıt atarken bir küme belirtmeniz gerekir." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "Seçilen cihaz ({device}) bu kümeye atanmadı ({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14692,17 +15489,17 @@ msgstr "" "Belirtilen disk boyutu ({size}) atanmış sanal disklerin toplam boyutuyla " "eşleşmelidir ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "IPV olmalı{family} adres. ({ip} bir IPV{version} adres.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Belirtilen IP adresi ({ip}) bu VM'ye atanmadı." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14711,7 +15508,7 @@ msgstr "" "Seçilen üst arabirim ({parent}) farklı bir sanal makineye aittir " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14720,7 +15517,7 @@ msgstr "" "Seçilen köprü arayüzü ({bridge}) farklı bir sanal makineye aittir " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14729,392 +15526,415 @@ msgstr "" "Etiketlenmemiş VLAN ({untagged_vlan}) arabirimin ana sanal makinesiyle aynı " "siteye ait olmalı veya global olmalıdır." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "boyut (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "sanal disk" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "sanal diskler" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Eklendi {count} kümelenecek cihazlar {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Kaldırıldı {count} kümeden aygıtlar {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Taşıma" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tünel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP içinde IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GREC" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "göbek" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "konuştu" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Agresif" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Ana" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Önceden paylaşılan anahtarlar" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Sertifikalar" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA imzaları" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA imzaları" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Grup {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernet Özel LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Ethernet Sanal Özel LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernet Özel Ağacı" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Ethernet Sanal Özel Ağacı" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Tünel grubu (ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Tünel grubu (kısa ad)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPsec profili (ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPsec profili (ad)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Tünel (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Tünel (isim)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Dış IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE ilkesi (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE ilkesi (isim)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPsec ilkesi (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPsec ilkesi (ad)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (kısa ad)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "VM Arabirimi (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (isim)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Tünel grubu" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "SA ömrü" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Önceden paylaşılan anahtar" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE ilkesi" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPsec ilkesi" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Tünel kapsülleme" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Operasyonel rol" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Atanan arayüzün ana aygıtı" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Atanan arabirimin üst VM'si" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Aygıt veya sanal makine arayüzü" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE teklifi (lar)" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Perfect Forward Secrecy için Diffie-Hellman grubu" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPsec teklifleri" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPsec protokolü" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN türü" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Ana cihaz (arayüz için)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Ana sanal makine (arayüz için)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Atanmış arayüz (cihaz veya VM)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "Aygıt ve VM arabirimi sonlandırmaları aynı anda içe aktarılamıyor." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Her sonlandırma bir arabirim veya bir VLAN belirtmelidir." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Hem arabirim hem de VLAN atanamıyor." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE versiyonu" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Teklif" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Atanan Nesne Türü" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Tünel arayüzü" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "İlk Fesih" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "İkinci Sonlandırma" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Bir sonlandırma tanımlarken bu parametre gereklidir." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "İlke" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Bir sonlandırma bir arayüz veya VLAN belirtmelidir." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" "Bir sonlandırma yalnızca bir sonlandırma nesnesine (bir arayüz veya VLAN) " "sahip olabilir." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "şifreleme algoritması" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "kimlik doğrulama algoritması" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Diffie-Hellman grup kimliği" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Güvenlik ilişkilendirmesi ömrü (saniye cinsinden)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "IKE teklifi" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKE teklifleri" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "versiyon" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "öneriler" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "önceden paylaşılan anahtar" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE politikaları" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Seçilen IKE sürümü için mod gereklidir" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Seçilen IKE sürümü için mod kullanılamaz" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "şifreleme" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "onaylama" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Güvenlik ilişkilendirmesi ömrü (saniye)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Güvenlik ilişkilendirmesi ömrü (kilobayt cinsinden)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPsec teklifi" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPsec önerileri" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Şifreleme ve/veya kimlik doğrulama algoritması tanımlanmalıdır" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPsec ilkeleri" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPsec profilleri" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN sonlandırma" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN sonlandırmaları" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN Sonlandırma zaten atanmış ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15123,186 +15943,194 @@ msgstr "" "{l2vpn_type} L2VPN'ler ikiden fazla sonlandırmaya sahip olamaz; bulundu " "{terminations_count} zaten tanımlanmış." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "tünel grubu" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "tünel grupları" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "kapsülleme" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "tünel kimliği" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "tünel" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "tüneller" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Bir nesne aynı anda yalnızca bir tünele sonlandırılabilir." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "tünel sonlandırma" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "tünel sonlandırmaları" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} zaten bir tünele bağlı ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Kimlik Doğrulama Yöntemi" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Şifreleme Algoritması" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Kimlik Doğrulama Algoritması" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA Ömrü" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Önceden Paylaşılan Anahtar" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "SA Ömrü (Saniye)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA Ömrü (KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Nesne Ebeveyni" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Nesne Sitesi" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Erişim noktası" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "İstasyon" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Açık" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Kişisel (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Kurumsal" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Kimlik doğrulama şifresi" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Mesafe birimi" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Köprülü VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Arayüz A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Arayüz B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "B Tarafı" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "kimlik doğrulama şifresi" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "kablosuz LAN grubu" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "kablosuz LAN grupları" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "kablosuz LAN" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "arayüz A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "arayüz B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "uzaklık" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "mesafe birimi" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "kablosuz bağlantı" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "kablosuz bağlantılar" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "Kablosuz mesafeyi ayarlarken bir birim belirtmelisiniz" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} kablosuz bir arayüz değildir." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Geçersiz kanal değeri: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Geçersiz kanal özniteliği: {name}" diff --git a/netbox/translations/uk/LC_MESSAGES/django.mo b/netbox/translations/uk/LC_MESSAGES/django.mo index eefdca659b524821e8b6d3dbddd20e768485b5c9..04eed761adf8c299fb359b7d1d2a13cb99121eeb 100644 GIT binary patch delta 65550 zcmXWkcfgKSAHebZc^*P4D}`ic@4d2jM)nS66(J+Zx>d4^Bvi5@8Y-ovh$tm83Tcbf z8zpHQ^?twiIqyH8>zwOc=lssRuIEATXUlRwuqt=*>)e?hOYpy}S0oYzu}}X*B1g_d zV(E4g{O@QYEl~ZU;2gXRU&C6s1#iONu{Ac# zoR(;av#<;9#?Dyivb4l-+E0w;q6Hbp@OCVfB`whu=SL4=Rnqyg2HRjg(o?VpzKOLl zPqwr~4Qz`I@P2HC@1Ox+etAfDLIZvhZ=(IgDlRJH&*;z=${y^1R(OB(4YbE+&?(7x zMX(W?e>*n81?bcq#uAwO$}n}c(V=gO*{}^JGjq|Eiwx|I&RM@$;P&WfbnYj`^o*E( z1T&Gp6m#K9%!{vL0o;v+@H@06@1 z(Q=c~A)Jm@^icFkbnQHg*7F)VqFd4Ozn~rc6MgRdRmrqO9xk%xNK53#f@lSmqVw<5sQ+38?EnH%>N0k?;^SzvL|zfjC^PSrO*oNq7^oe zc10f?gszFPG5O0k{~PnOtebFTCgeF z;LT`Y1JFRnpn*+8JMa*?n3tftVHq002Ur$AMMpS2PcSdmasQX*q9!+P!%FygOz+0> zq!U+%#Z&>Uum&1PGqm9@XvO`|07j#8KOPPAiJ1R9y6rZg&%K3x-T%8{Mv1(kp~~n` z)katAO=wTsV;$@s?>~Z8_%s^WdUT|=#Pk6)uy3#tob?d|AyD6B@&P1OG|Vj{ZjsL#HJSr+pRk~B7M;g3`9qIIC?;> zF2Mdb<6AO3yYpR_mbex>pmTUTmc#{U&o`qZ@*6J2ztDZYuwZCtDS9BSLKop$9EBUP z6_zAgUs5Bn7aqKx{qGQ#FBBGG&1f?;zf-giI>dwH{kzcy9*Fnnqa*hO+S8ZNHS$LE zgXq!d|IqS(C*#GHg+qnK(1t3-bOZFHYJ<*gPjpudM~~Wj(Lm;*i)|^o4cEu?yXX;o z7_IkrbSg87ghiUXh6~T?+UQhtMkAYzF2d!}4e0jVi8k;R+QZ+`05cU0=0@|2peJQz zbhWoepYMWpU<6VwnV7&u2{LAfjKs@mPq(8F9*Ta0PRS`u^#oHdm13bs18K37osD!3aw`o zx+vd98{CDK{|ud?(=q=dW^w=LxFM|eYom?PRXz-@a3uD_ap>YYf^MsCq9@V7Pon{y zMa%t*j#!owX^Fa+3k|d_TK-l{+Q48gd~kSlBAP!dIv*R7UL5@tU3Ax$3_ZI6T@y89 zx*Zx|KXgh4p(8pGZD&SIKUR|cZ-gsj#`Dol(Vb{R`=eiCZPGttSu9p6+;11{g&w^_ z(1vEAfh(J*nmP&?;Z^*F6mzNIaLL175&RIuvNN+>ub{JaWnCO&ve->KL z0<>d~V^w?_>*EnDhgX*g-;j-xTwG7aBy5CFU`hM}-4*F&(-Ot7bhHh+C`Vv5+<-Q4 z5^unK<2W-B_hyU;277#)Fc&=L6&9kH|M`EUVQjLAgyO5t<42s*U=&9k#$7=oDqE5$d}R?N}vrJJyais1f&nGcp|7 z_Gmyo&>s|-EJ2_DEy;xy zUO*3;Otr(}$%_V56y0`}F*Wote*!uZv!aipi}ES7p7m(JZ^!$4(T*NL>pdM!p69|v zl&wxU>Iv*=K5j`!a|EBF-c=}*y1Xt}HEg^{@iygDKS`wSh@6KIcqN1wllR(N@Xur{tm>nntA<1c^xh;F_GEu7a5SdBihhp<_6z#pzv$3qY8=dt_B=N_Mc1Q&mWozG>u-n# z&we<#VS|@2jX?O z2px%6qT7*xl8Jp>81W})Priws!WN|e!0LEo)9^#%DD+e6MRY`dLf6VUG~n~-_R7{Q zu1IZFmWt`&unS4;!F8Z;uAp z4gHoJf;I3#EP`)EzeGp)QZ#F;`2Nqsg+o~kt*CUg4*I}N=oEF0-iih?Jf_E@J)4RK z{%~|L`uqy?`RCCQ-4xy3iv916FUW8a{(uJXJ6d7p*5ScC=>5WIh2^mk){6JX<0#V8 z(4qblEno7cFeTN{c3R>M*cprC_?wd9#!@nDcpW-to6!gM#{8q`-2NEvUqZipa<&OQ zDuXsy4-LE(-iF=K?Y0@6s-4&j_n;lgnQR*t({)&xjB4nOf#?vAL@OMJ4(+sf{~>f+ zEs5!kSeW!Sbf15NHvC<@e+FGc|Db_XYZrD)vK|*VlW`N4z$eh{wHze=_EAp73got*P`{DKu72&H1L0rjwTa%Zw@z#pbu6+cR_V@-w#1o z^HMB_A7eNC7p=H!hp>42qQ6uchz7J04g48&L^q=4x1l5O0TyxpAK=2@fc%O!a7D-P zKy7qaG)41Uqd!L9jV(=)2h+Fci2a2&P`*oOxN)>KIszT>4eW(U z&*(f|(-IZ2IaQ=+J+Mo_uLN!_*Zs0>?eTJSsMez8)}s|{jBbtYLL1nR74Q)HTza1n zKvpz;HQKQPSl0btnhSf>8Qu4N(TW~Hd%g(m!J3%ffR4m=tcX9O6&JiEoFm21cR(d< zhW)SwuEtq-8tvHKeO;vNzsX$KqgT+k(_83b`v?u}7#73RXvJ6c3tvDD(7^6N%RhiF z!bRvvZA5$e78>AgwETXw-Y-nM|G$qJ=g^nTC2wG^{-J{F(TK~TBU25npfs!Mv=zvCk2O7{ww8DvKAammV z`7ymHrk_LuT#26fFGM$^BfJX@@aV1Ve+zy~hW>=UH2y++R_(SBP<^!FW@y7*(29DZ zfek|&x+msOi}{Pt@~hAW*T(xVqlCco#xZTB;}D2faUKbhQs_N)|E#^&e& zH4Y8nQMBQe=+wO!)0^Y{U1$dm#r$Jvxu4OI{2S>&GLdy~sHgyXqZHaeEwqB>=z|^6 z2K%6Mc?a6F(eeHy^!XWRxy9)7tI_f=qvbcF9p0JBXaD`lg+uipI=7jIgbMPYffPaW zD@N<14YiHwK4^o(&?y;@u8rB~^UKil;RSSxx1seNQuqG}E`0DDT5+b^LxHQ&{NgcP z18t}omcou$1n)&FegggB^Ch(0KCF&kp!MXuBaCD*^n0TMCQEX0I~O%@9=iSBLl;Nd z(6q#A%!*dH9z7434?mInlW;j5b^v?N}vr4Gls+Xzq&XwRf`rE%*u< zu7S;H#c!iM-H#rYcUSm2z7hTYza2f{=Hdighb6K2sNhX#J)^LQ z`~OicYrc_==Mk-7ZziEG=NU%)J#Md(eu&c=z)^|o-pKXu^H*f z=#=e1hk7qMbzh?a{*0;b|FrR8m0uGri9T2po%=@Us%{t4-QxWL=ui)j=~?Jncr@lO zN1uNS-6bEOYv4%qTTHsTf8xT`{yVx0&SP2p54U33dqV*KL+9>S^ouCZgfNsf@qW@% z(KVAXF)eX7=EtkkI9Jej%j!uXkacLFuTP5a{~ctw?>~wKj>iIL(bwihw5Qij4kuhS zG`|x%l*7^2?tN$nmS7Eh3hm%0=sEHQIufVRDgI|N``^f_PYEYkZLCImB5uK#(7E%R za7w12LpT#{=u!0k5_ANgi}zo~)X<~b^aFIwe1?|KIW=s{Vo5Hnum*Y%H9`Ywi4IX4 zG~({)J|2WFuJLGtThVem(dYJ~YvmKP-Y;YN2Q;9wXh$wZlUeQy734w-T#ptgi>}t{ zXaG&o6RaZ|=p9%F@4_PZ1RBU&XkhQ7L;n#P$l-YZSWN$fj9@bH7Z+};iyIv#7|eQ1Mkq5HV7=55T8dx>7XE$OyY=RE?{OD4=f%H1G!H>{D4o1I-`6rQ~PyC2U z7u6XqQg5;8;RMT#Wyx=f_Iw0768A=Dp#eUQuI6XZZTJS3z`f`QomLOW6k z9hurQ*#BO%B*O~3#Tx_A21lb6-ydCs9x%_LJ>QOw(B7E-1a0`6=+Ec~TtGXLd1k0L zCz>weKK6lf@kX6^qcs{(7xZAc6)iU&4R|^_LXY7T+>VxSI4g`~Tl9py1s$QO=*TQU z53V=R`aVf=VTIqKi{dQWqrcG}{ulGJ&kl2z2fd#!S{UtNNpx*gMxU#R2Hpg1s3#im zkeFT&O|Iag6gOT(x62Xqo9-+&!fJCu#beP$GXcwE63gHV@%|BXNWVk_`~eN*47#?? z$NSmmhWu-gz>@4{Di)>ip~#TLfx@4>3LWIw_|HOgB~=s9|`yG zM0@-cy4{{fd;C(&-xAXw#`LG?h@QmM`~MFvT$Pv59_CvRdRz*f^SbD^YlyxBy2kWy zbjTk-*Un;eYBt3D?2m@IE{q0L4t>5h+D?Z@B zq5-{(PTekatsIDcfiA-D(GL8K>3A;Q{{symu`s@$b1V!E6hXgms-kP43pT<*=o)wi zos!Myk$nmcz#m>pOcIiPoRtKS#*ewqXo~S4P;*w z-eN`3KpLYx>w?aGPjm!^pcRjf`S(TVMV~^q+Y0!avceEBSbMt~*}g`+soE7=!Nr`>`I*Mi<+z zn7ets&}l4!S1t`xRuP+$t`nV%2KWxT=srL@@D(~@-^csEp}XrmrhfmIcq;TL z3mQP4n7$!e84cvdXdiUVOp5nsL?1;*a5);tTD07Y=<45$2DBUP@W)TF|GoH<4EOo> z(NpN$ob0qdM!32{Wdnkf1^!Tg`UrhE<#5j zxta@mz6l+Py=cWp(f#{NH0#qLprTlk{2S384M6AoF7)~F(P`*V&yV+)q3t{qeJhwu z9Ecew(Zz8deLZHZ4nto9P4`8A?w^m2*nV{AkD=QseN9*!S!jhPN9j$K* z8u)wY2p_@J@Be=0!k%128!EIm{FGY}ouhVW5BsC5dk`AvNVMX6Ftw`D=O0GPEkhUK zI&?Q3M&B*pVLQBtsrUa)>%yw-gl@xeXvGtv4@BoiAB!%Fu0^-m%h63}z;DO zH|GC_j`-i}*#8dI<mJpcgvFgV2gcp+h?*=Fg4!OVILbV*bl$JzHXWANu^~ zXrMo!^<0Ygvp*jLOLAdFrO~;oh8_$}(LlPRkqX{U_~^-CTN8nV!9tXFQpA1(Jc*1|07!<02d%eRc_ z4%mWp4|GJ9qaAo5q?3uaW5yozfcOfn;2gRJE<`h44Efp7xxE_gSs`>=m5ul7MVp}= zYKM+gZ?xPnG=NEXmHYqUc;l&f!;fG$U`f(F(F&)cBQrZX5AE^7 zcz-$C(6cdrOU!>CYm$F3n)S6%t|9t-Cv3~8oBO{P7w+SMSO)J! zD|#9|fSyC=?3I|_idOg@mdAZq7%yN`ylzXF!hU!I>8WT3)}SM^0qx*>nAQFNF&EC| z7ieVPqI3N#rcOZgT*%lO0x5&$S4Yd=7}IT|UC^HPK^N~(w7!vOAopTwmtfKYbGR_F z`DkRT(F!(TUEGG{@H{rdl5dBe4?`$_-Jw;1r_sR9p(B&n5z;xL*P~Na4y~_7Oeb4$ zVFjJgRoxR^)wiKNnTMtDP4olgI9l!^`dsFn;SVmaz%itIps&}x=&tx0Tj0Ow2sM8< z{PwH^GNSzXU${uDj=qLQx(h4eftXIb7aF`A?P;!PVRUXQpd(T@rkkJ*-i-FR7dnN* z(Ez8U((J$aT-c+P(dW>fy_zaO&tv``wBbYO5FbYu*RSYey@VyPz^98KK%Z-e zmhT-M;(ho3m{?#!yfHJn&;s0Ff%b4MHph)w7zeKf#>=t=rDy83@Z1NtZ4{}(Nv z{ezI7_XGC7Jt;tjkrhJ&D1$a!1Ffhz8bBMg{4MBD#e=XBF2@0Q47+2q-C^-AMMvm; zOl?Or&=WCzb~pRqx&Jd}{1*#k{xAfT8*MN@TCONsQCW0OE64i{V!8#oHoBlcYz{z2 zYGu6t3i{*vc64#4C-;P(POG9HB7@Kon1nVo6CKir(YNE%Xh83vBeokI;sY`NFdD#D z*c*RB%eC4YhW=(W@SbQr$st_Wz{r>}4V|O8Xyl8~3f7|Uh!?R6?m!#<9X%KR!OEED zqi|3)L+{^()^|5rPZHfN)3Jj4|7k9a2RirX(ZDkHhqquZv}fJW z4)jMGyd4dEBwBtV8o(?xfJJBr)_LFkzaf$~hkYC7>{T@VA9lf($3wZLIFNMS6XC!6 zGXb4~W9SiG?7J}JeXt?vC3rg?#WC*x#wWw7ehnLO;|shK3w|G_U>3TXUqO5H9y*kN zp@EkEAuVwqu0%(u`2WHP-i9qm&&7`T2|5xbehmNMVG^$P`+qMN9k?;-R5*fn;LW5z zLrOCM^C^X(2krz8$6G;ll9k- z&Wm=e_^<4L8>~QvCsQM|p)TkHcVI3Y7w^x+oTQhcBe6dE8XCY>G~gZ4kFgQy<7lA8 z&jrh)Q&{6%GDJFr42Nh88u^r%o{bLSW9ZyJ9@CqmZ=pTehMjRYj>PMK3%_7^2+NRu z3!VFu=)N!Yds<>N_DOP4fs6fU!{K}ZRonc!U1wKHX=O=or+g5 z^(&Ql{~NR;X@7^4^-A=pEsst?TXaoyMW&d4|I39vybGPvd(euLF@HW<;bOFcr_nX? z0@|~8usnW>F3wEu0C zJ`CYjw8EX}knhJS_&uiMpbO#t?a{H(snNM;eM_*Z`+p@D_TVJCigRBKi|$%M8(546usq&>3Ej@`#QTTQUG!D-+vv$l?0+Nrkqmou4(;JZw1TvM zL!^1pIV%#a5^aK&$nT5>_yGFj^(?H2tI#!Z5Zw(wVoA*SFYJP{|FQo&lF^0?SN~J- z#+&G>{Q|4v1vIdV%&r8Adg{Gi7wt)3w1RQy6g+^QppT&StVXADGups==*S(8>F?2Ue`0A&W={_d zRYxOjgElk}t#}d|(7foISd;Wgw1I*dp~CWLz>Tpo_COD|S?J>16z}gsN8+nsGI5d% zBl#IEcul6za0xWOHoACjMI#@CPR#@~z$efHYdu==9`rlllbFt(IXyLn1<($*L)YA3 zyv+Ci$kYWxibc3F86Co9I1Zn~53%TF>4{JAC-lAkZkF`a;>(gXJ+;_sp^I=Z`uv?S zJszE^DQLrU(J6ckbG!dnap7uz%?#X)KJaDq6go10qjQ-hTezPuS`rJ8Uma`U&FGQ* zV7$K)Jz-x$1A84EsU4VfTYSick$;Cad@A}k`ru`khbg!c-B!7<3^qciWGEKGBzll7 z!+y92i(|R$p`M%3gQr_e-} zq1}Ua;1K%!akSh|=-gkx)Z6fi&|cXql40oUli|tM5gp=h+)5l}_99m&Uju6N- z=$sZu51=||z#Y(@_C=5O(daob5AFGSO#Syic5q?D`_PJypb!3tR&)ssFni9>U;#A0 z6x#C|=<^NGfLov=)E!eNDZ2P3q0c>rPW97xh5P>{E*zRI=+Nv!Un&P<{*jn}ET&JR z75srVl$I+zcNLnSAAP(*XoEkX_56Z%>^wSxnR15_%Yz0|FgN?(hRc$nRnSFL8&g9X3${Qj?1Bc= z4?PdYqJfQ%`P1+w(vPES;XAax3(>SZp`I-0bGh@d|2;Yjk>MQGK^yLbF2-Ky&<(|6 zI1!!mWoQL!WBOIJp)F`ncc48#82thrv6JX?=g4E6y@y2)2v*@n4hz6P? zZwR0`8c;>F$F@zEsuz;v{s z1!%d&=yNM#`ni~XHM$k;*!yTehtL3z$NY2VyZ`^=!Xdo!+EB0{TCglS*LBf~n#cQ{ z(17~K^qpv66VM(e(GEO_K0gdUNy^w4PyT`3dNV&4~Gr3}L$TW$zLhEavpZ)J#_9Mf{Zbu^>jc%7DdjFA_{{&iY zEn2|_w4ohnLm#2fe}=x4zDEzDi|EMYDG*x zF!VepT48>)fkNo>H=rX@8y)iIG2J<)`=cEjfvNBR@$p6y9pZ=32A9VC)iM1F8qk|D z|DBk>9}W0ZbYzaBBl8Ktw z_V6~eha=IzC&&A9WBvlPBP(Kh9om7{(dV~f>c9W>VZ3n^Ju<(E1x}!WosH>>Xyn-n zg}|;t1IUL~ToSFgLd>s=2G9x}p$=$$z0rDx6k`9|!#l~a=i|^{p-e(6Ove1_F+CUE z9goKJI`sLM(1tgo0qsH$rbFnO_yG;%0@`p!;m}^z!t8$^xQYz-YeBR?RkY$-=$ti1 z1MC#-5%c@T^hmUUyV31B8Qu2}p>M&}Xni=ibn>Nmu@xI~V-HTi>_yX4zjT_8 z4Z&u|1Fe*6ej`f@iTdRx1?(yc5g& z^Z(mi*x+gOr`Q~&Lk}xrS5{+Bw1Jn(hHt>*Xb&=%OHchrr`q9s(%Wz*b|{~on2VpG zQ!uzfdg{*;#-cx#zl%=gG0gA&|A`BS?y`zuh%2E7$gSv)=VMH#v6%2N(#tEQCuU=f z%IW++7%(+x`HEH26Sra`+<>d_8SGLuJ@rR47jQA@{?$T&e`E3}84p%ZPb|c~HPRFN z@Hd==J8GsU7Gc|3>4`~r0$m&ZYo{mf!Y}Yu@7GCB{r7(ob<927h>47(ffOp@>{vS!k7i9FtHucj}f5~($_9dNYke>R7#Qkt0$-_7eJ2ng+!KtKs zH%d?aA=a1Jk94KRVM^vFY?Znq;b zeLAMon}++>VkYia#MI)#8l>+;mQG?7x_#Hg^b6>AeF8Zc<)&v`p9)jLqizV?r^vCg^u!#FV zTdUAOS**s5w&(*>u{cPJsB;(4sBo;+Owb0k5nzt|1-I;f^BF6U!euFwh0zPhxkS`p!VpLOpN!RLwouzw#Q6uLw%jG0_jm`K+Dm3 z-$LIBhfULd;^$Z(OS=$RarA*U=u`|r1A7Qv18<-`{T!_*t$k=PKf1VTp{u@G%)b{q zlU|J0cNz^O*Ujwz+qo#m#S~nK{V`96^wb}zj>T4_|3oWp*fBKJHaZktbThFqK8gM` z{T9~4BWQ!UJB1^;HoAD5q8;qiiT(cy7bD29qN1HcWYy6gv`1I@1L*5=HacQYpbZx2 z5>|Cxw4pX={-~IK1f8-?_%MEl4RH+TdNF*pEBpU67e~lAi#xi7x7n-R!-L;o8S<~_ z5q3#Ubnb^>@ihJ}2l5Bqi8p(ur~XfBmi10gyvY3~eZq+Sik>6?qTd&JZwUuoIrQkB zk>sKu7k^+M?AkXB@hjM!^a1RIrTc}Wb0WGJkKu=S4jt01{X;{0(UClXHuxvb!7FYJ z?}jCKFX{8>NtzscTX^6fbTM5qAb0~hls88EpsRTjI@HghLwEpv?l-&vvkwe`R7MwV zOSGQR=;B>~KDQD1Zb&9R<-(&dV^CN;rH~tmCNVt%T`aTE2G*d9>qBgZmkkcjbwL9g ziB<8jnEn7Qe+CVt?2s^}H{l>x(^xKAaN~1)0*l@r0@#8c6#qllK+ZeTQ~$EDE_&8a zLj&K6o*&<075onkq{`5+hPtC`U>f?Ge-b^4-^HS|pE%4#1N;kZsOGQ`K!0>D=b{fR zM;m$>Jwo@PQ*s(@F#nw);D%^mLt=UkI-;+l<-UpenTNBRELeey%dsP7#Xe{tgYX`l zhc9535h0+B=up0oMeql7n`Ipt7H19gyl9Eec^7nzj6*x{Fgg-1jAZ{?@Gu#-;&B{} z&F%^nY>K{%i^)HTj>sLO!fSaF`urnk2bQ5Huo=wn>Z$A0!hn56QFWqRcclJ<$lupd&gIeg0u|ik?PC>|pfQ zXs+bl;ejgXD({LG9EDE7BWOTxMGs9f)I(bawu^I_3@LQm_W^|eGh zItuGxauydox!8#g?e*is1C?H6q{E72b9!Tfj(4fuRaUvqB=yfRu(hv)ztPI?@U z#qZFUQO^mfPq$=ZJr_;Ms5mivT#m+@NdJu8u=b>|J?BM_;A--(pB%mecHl(PrKg0K z)oRR0<9U3I{9l>kIkbQ1K+TK#bL(TSRmh{A>AH5D#xKG*i!Vh`!+Vi184<#7Y4gTAH@aa ze;m_;9t-b^)#zII3Nz#1=mGU_k_&s7V^Oda8c;*5ibHTbK7nqlJd493D~T?mdg$Wn zjt>1`^oU&$eHpEPA6owVn4i8RJ@uDel0~?v&W+yagY(e`UX1y>&_FJr6;ymYM1B)G z#J$m}7>oB~5)CN*i7*wpuovk9_%_~+?_%{QQ}rYh|8QZ?E?*iJ;q};qbYnE2C(u>> z2DZiKPlW?%0s7pQ=zg^PadZ(UmIaHT{_fR)??MQdpUEH#C0+`kGx6(|fTZ=~GxA^REfzyQ4!t6I~Neq9gSjTF;R+?0+Nr zoeWR1e9xpO8e>&-yNpE(&Wo-`d$b3A?l*LDNP#-$2*IL3FYGf^Nrxo5BdR!K$Q(p&eR=HE=&BJ)1MX5#Cb$@n+JG z<5>I=t+4OrP{ADZ{@d6ZuX-~)*8>NTegxa&A9yD=dn4xif%a60LY=(ef1E%dA{n!XcVypz!>SdIp=3sbM@?cw(b zUC^oQjn+SAdouhaGLwv}$k>4X47WXc4qY@iyc4W|HdGUBxCgo`?m(wtG3LS7qPx+6 zzQWR&X-8ON6{4M!T)2AgMd$v}=u2pYd(en~jQMFhLxtDlQ{*>8D?X0fF#EgV_XK;; z=PSP#f0KgN{{Z^&x*Q#$WUgHyfd1$zo`BBL2DIVhSRK!!J*o75SX|xEh95-pUql-? zjCSZ(T#MO12y5q6bi}^LDfkyM;>pCg-QmoC5Pc25j~2Z0!*EmVRR9` zhz7D1`(d^N;n#9^pxf?4^Z>g0U>J!c`usw?12@L}LLY|_s)h#M9S!8(=zL5zCSxrZ zuKFMGCcN&G(8Iy#i8vLz;4|pk@B$k6$U~vWzo6$rfx}_#3`NsVq9@*IbjUA15=QEJ zwBDLW*#BPiA!97wk5}Md=p1MIG%Tw8cpvE+xDPksy*T}7SmlY&!Y5TB98CVL=)V5| z-33`b4?hW&z$;0&!aiwy(0tDRzlDrfzX%_lxxNg)E+2|+k1c40*}n>_b~JV*{VRGT zH~l)4dj@xt{sSlDwr|1@B=wJl*X?3-YPVra+=q4Wn&h`(+jT$-%!n>Rx8E9cZnvU6 z`3l``7ox?Ehp*z+SdaWg=;Hi1`V)E}U3Mb;08;=>mq$lB*@z3@$L-Jn24F=Tjb(8q zR>Hkl9xtNh%6u0VRc&+%d!Zi|Q_;ZJp*`G=26P?`{OXh8xq3*)l8IZmaIPn#i*Nz@ zz`N+8`8xV5_9va``%r#RbV76<`uu7%;3Lt?ehB4jq6btP^!s86rvCe%W4Q3ZSc*Mx z4f?V8FWS>O{|o!M6=oyd8Lj9RbV}}x>BVS0uVP!=f_5z1k6{}YLhm=hR3O;XZ8U_7 z9QY3Q!GmbQil@Td*NS$J-h&;uzZhMF|3eR)Hm5_y-Oxon8W-XLoP&dY;y`27|B7}j z{S4c9G#9zJaHyxDL%$e{;Reithp;n#i5@(ae+j$cNp$TLI2*obDq|IXnUv8U6VQaM;O9#(Z=WycSkGUfi`py{fzz+GvPmIkN!p1&b5CA zOQHF-V!8vm2>W9hyc-?i$}qjlvs9??m5L|3kM`k-x(t>wslR z--+#UF!lFjQgqetLIe9U`YSp`m;Dtg zt++=_k3=h)jUFh=u@P=S7v(whz$uoIk@_5Ogq9nD_H-&b!k?q{|AsU1s!Yj@)JNmu zOc|-){T{ez0iYYHo9h3MYo}We2JbL zzoOgiBDxzIU7nHpyCXNFBa-}_3y;*_&<7LQLxXwImryM zeU6S););-e1G;2cN9fROv?DK|0l$L<-2bP!aGze5GdyrDx@hi03x0vMF>|hr z)Q`;#ur2AaSO?$1hIj#;%6hrO8W@A0l3s>4;^l8(ypD1#5Xs`#~Li!bC zXc9T|hJu~36X}^)1HZtDnCqI1#8i9;pTVoH%}D(xmtI4sqGi5})bEamqf_ubK7keT zXCxlQ4=_1{i#`Q1Qh(3qI~+-R;&mB`2kGl|E8|6UH&rMa&X*488W|aVuxK*u!zanGg3ahj_#ryv`>{5k zOvQ?2q~6=Ti)W<1-|xnz+~10mFztqn#08v!?&}F9G7>v+34Y1*eM*M<>y!>1y$M|_ zBa&R?=i(W3k!(kMcnKY<;$=clnxkuC9Qp;bIp$|68-}trIue7>jy#5A@ELS_7busJ z`sgf$w$~JgWAYX*+~<363Le5y*tt9-K;-YCbCs`R81m-P9(Wn~!_cqU(U=(@Mu&VM zdN6H5&xu252Tr3?SFutmQ2zZt7e?3#t)L%f;2`wGx&y6XJXXVbI2m`MJ#Ab$40$K? zxx3H~jYWGpIo@B4j_7OXr`e~N)BXP+7akZntAqj#&;tFjFwR6PT8A#y9cW;`Vt-6j z%}D*3(5;x7O0+}U(EvX}>-icTsejQmQlJ|7?*H0cbi*F#nf($vL~mkM{0QxNqIx)x zs-qS3#o{;#$Knd~OwU^*1XvMUldg{qaRwg2_tD=kEUU@>@6N?3E}WYtwL%3CVtoss ztMp5BPOq*V8mxtPlkSb)KZvt2Tb+!=09=TU(BJ5y&QdpwNV8~1w4;6Nvi}{jJIHVf z9zc7x0bM-%W5J)$IsFSA+C;sK#0t0)9pV?G+psa|1L)$+ePc%IXTAK<66hMKf<9N{ zM)toEwje_vz#h0A?MeRnVJar0i)ViH6|{mwXy7N&HIt`7M(Q^u_0TDtkM{IwyaiuG z51=a=hN&!;kRb%EBQ z;d1EOsEMuc33O4Oz-#erOlQ3*%yC|cjc?9KoWrH)OJ-h&@MU!gO%Lfv!+5x3 zMl#W#i>{qAQh&1XIzCLgbLViP9Y-7L-X-`VE+L({YewoX7B9m|q)T=Sfj^Dz`?t{V zfF0=C`6{OWM5i)W_t2qY-IHNX8l$^<4VGfI-LtGPmNpwLUxC>qNlhJcwI@*Kh z(TcX9Yv&}o7XFLo=^b`Ksc2pF!=@ctt`pk9ZXbM22HU(sPjxvH!VnD2|~A#5t^s&H9Cx zOA@Vk6Z$#+IeM^U>K{(NE@*=T(4n4;j^Lv)|0VPs*&Wkgql^4+O#S(P&Rau)^61bu zMi)&dbVP=sQ}a+vKaUMae}tC1;KH(S}>1&-ITcu|4T!SRQ{ydtP902(S`%BK;Wp z{QofNMcR;1Q31S?bRF!AEzuEq23?Gs@EUv>Tk!qf!5n*82jHL?lUZ8OhJcw9(vNPM;FgWSPw6ui>l6@q5OR~j`RY2 z6tfKvJ$njW)UTr>@D&>PxtPv2BJ8R{Ba&f%mm@)1dHRw z=uxam`XahJs*MUGa|^l{M?~*Kr)(iw?oDig$?v!*#YMT%VW>N!=?8EyK96HD_n2_f z%|N&5hv-LS!Li|Iz1z{L`3SpX-n+w`4@dtx-Y4i(e>yJgo`0~m`@i-*;lp7RwxYmO z=>Gp6t*Geu5Wu}yjr1Apg2nC)J-7!Kk$xKutm}lZ7S`fJr0Y%0Nd04$-Dt-;PYNS3 z5u5lLTFHgqe&3-D6rCJC6uP1Tyoy$weM;!@E!d6pv*^K-U=2B>1<-Ue^nmG$PT4qg zwJ$)Y^y%n_O8fi`#c(6v)UeGOVh8fuVsm^7?ePhmj+w9=;dKwh_y0*QYLSsKEv(jh=uz4M-S>mh9*#j*?Nc}$U%=T|;KA_z zUxNm6_4Kfou1CwaLr0(wIwHf-0A@{R|GT<(k>M)-9$nqn&j`QYYmA=#_oEf9L5FxF zUW5D4RelmZC;mnQEj=^jcS1*K5Zdr-=>3CuJ6@Q{&|C4qSsAH6`5c28q~AvKccA8agRY4y9|}`i0(~x7l?%5;b98?W z$J7ywHn<*b@L%y>$CZa<;A0Nc0(ZyWm zvGC(~TTH$G=f;eeurdXHK_4u#C|C_0x)yjfc13$I6#dG501bEF(KZl&niEEaG?Q=7BBE1|fcMcoi)sF`|qk%0z16v#2 z9`irLJmjCjF_`{DSk&X5VE?@n!Jo{DvF9lAD-qifPXJ#37ohhjmTjc(Vq=*S(#McCSHg`(cnde~!mPLto%2sIH5KS$yZqHKhYhd?=`Pq3 z*P}!I2Rih_H-_IIe2Y$T)7QcX_dwGVUdsr7{x^>dPq^o>I&O~XGw43OgpDxg>tPLa zL@T%*o%6|PxwYtzR&SysxC`ybcj(dlGdj|FHii6Zo06fT8_BST9nqn>7mMH`9F3c> zJ(hhVd`jJm-AJE68>+iGRNMod+wtg>%|ciG8Z^)k&=EX`wo@|sW>~FF(K#7{o`{dd z{HM{A>wWa+_m40GKSsZRjzoWsW_l|Ga2;A-c{Gq-=t(&)x+I!>lM5sH5N39{EQ(1p>T_XFdZNE@xE*ciA++LU=*Qz0bWRVUL;QENzz1RKZbZLo z$Ds8s$6WX#x(l|W?VUiU^(QWq}+S9ZT!;j-v zp>ux|I#T`6lXC*PmY&8c_yyXbEB6G;?Ma3kt;ul6CPvpp_hSq4|G`GsXm2QYANmFK zJXXe2G5@-c!k1HXbSkHyfj)_j;5y8M+tGjzCF6}B(IHFQ7YgP?hq^SH-xdw9H#$NO z;#^#bGqB?RjMQJZeI1vQ?t377?Os6VzVX3uLXJYGZWyGyD9&~7@#r#$1`+rAFSNJ5{Z--OKABF?m|37gth>Q-0LZq*w z`}2FWp~T_vJ&*&NkZg_S&&AZxqJgc8Zbk$95clFK^xd%ONI1|wM9crbtFr))>gvMv z1O|5kMS=u(*Wm8%?!hIvGq@CIa4k~Y-Cc?&E$;3vg_Z*M{pPIvH}|gR*}Qu%-}{_7 znFz^!===Kr2PTbBd^babtInIm4p0x8u}~+p9qL{<4fWA3{xy5%!}6>Lz{c<(YzUKH zcW%ZIs1H69p^khD%nL8TavmmrHypoj`}~Smtl*(vi z=Ga4EFL(j!8kWB2?4%A<1N~q;I11{+tk>43pz>dZdKrF(deFtW?{RjN_r7yfm7sRs z1ZwBOP?ur=)U};y_BT)`_75!X#~X?V&Nm)wKXl$7c;QLx-{EL@{E_pc7?mG8FV~|` zCsW1q#Cd{+KwY!-FcAq`K6O5*^m*odDfTq%gFW+e=ja!~TC9`3aNd}7hI3i(fx)oO z%gC;AB|wJ#SRlz-9Q6^^FhCCoUI0I{rgHIhXP(Y^B$KfzOU%Hq^)WcThVk z_P6u$n+&_M-Up|^%wL=zQrQK&vCj0>@tXyMSRaFG^gGnM~$L~{H7zrZ;72kVb8gNLKqAKC5e_<`H)`?;P}QQWRmILwFD zV4J9J-v^CNP?zKwYyjP+$$115~mjw12E zf)iPvPw4hNAshQUjr|6767v(eeNV(#iQT>vYzuXdT}$lt_&$2o|HbV(kK#7e%Who~ zx9`hm2ccfCCyckDUXGukUZx3>I_nfLFYCg#?gC{W2cyFoP%qa7P!F&jwmzGbzkj9= z7LQSgQIffRZyYi}1=fK2u-g#kgd<>KxEYp*&tY7cE4kbE=CTCTgQyx*Tw|!hqo5jJ zWZVPwpt|fahsVaBP!EP=0Zu?ksDe$Qb~qEN(Nj=`o7(6xPz~-|L(3Ng~XRp+H8r z@1s+Ds2weUO`(4#x9>e)52y#vMpy=>$n5q#SXx4@XTe|KHJBg1g?itRK8tfnx)P}e+mR=4jBM0TiqqB2y$k#HP50rm2%p3OP2U!mUh zE`j>0R~Xby`OcU;JFkBoRXHYd=nMzJ2{0FQ=Wx3Y@_fh-W&fDdX((YXr$82%5q$}$ z2TL$?!|J)6S4$nJn|1`$$!>=_k;hOEvgCPq{cmN`Ighi0lzH90pWpc%>ZW@NbpkJ8 z4;U$*Q=k{r3H671hcgfAo>>R=vN~nF3UzW%VL=!zzY|vi%CA*^UjKTh5@L#la6jwy zFe&U*z_E{n(O7SUdfDuRx&$!`x_zG$mWA3;2$cOWEDIAAa_o(u8Xg0+u~o)(9wvIw zY=SZ1ZWsj~g=*{%m=Jz~z8w^{9Y7szE7$^hq3)dzP=1kv+`b>lC<681S_6aNHP{>` zEaE)CJRwYY9lCZx-KAZMI(Pe4Sdn$yVs78}0UN;5tPemvcz!}1dFmXxu zsB1j}>ZaTYbtyl>OfY5%-*dy`%FCn(ids;w>xr-fykhziC7ll*1ECUyL0!|hr5xsj zdM{VQ*xNW4>c|fm??OGO{7O6ZQo}lW{WoEvBiaCUm)?RZ6sL^ya;XCAvF-zF!P9Uc zOkUP0FcX$wy%Q?WXE*?+FXue@7C}9FBbRsbrGk37R}!i3YRDu6wud^xt1vD626a=V zs^C0ex_S%tSZg zGN_%bgZ}UZ`~&`gJ^grDRd&1P!Jw+nJDR_$IfW`$cb=5TVNCps)o?z{R)o4&nnPWR z&c;bl8`xNb*MDgy_fhEen69RCljVbQ=nM6LSq*g}7oie;uyvwZ&NVFr^`xs0=fQDM zH(#3C&V#D~)Xmx#>Qyk^)@N(;`p<#lDGI%O64!AOW;B+A+Cdu_750F-7y3cHTFye< zdP)&zgFNex^&%;F5=qc2r_%l?&fco~bg6cd7>Jrt5 zy5=pQ{D(oE%nGP?Hm6_`cpJ*^GfV*!H*hwZ7b>om(KD8bZo2ib91MlJ2NE}Q-Url! zYG4*r;1;MtSD{YqwebhkwU5`xVRERKTLviqvQQgqY-|s?nLV!FOjKa9aSc@GCv5!~ z>gD3s*tz!cjd`Jtz8=($2SPP49qQ4&5Eg(tpdL6cjs8uXby1i>um848bW=_6DY*Ng zUaw(LgBQ+sO#)p$*)ljs7~zz|!Hg9%yBg?huW&ejj1{Qic%kN8C)w>bADx z^{>f26xwmz)(-PS-R(`F9z<=SZleCSo(%OQTx#40)!1dIJny06leBT}r9h~cWhtl= z>J9b0Slq_rIEJFoPOd}k_yx=kqqlVe3&6~*J3sD5GgpHMHS48cy}yigxSYd}5w zCqP|FcY7yqcBncmE=iG8k&- zE1-`2Fx1XYLpA=~?2$S;eyN}?WfACm{nuimqwZ{+;}~4Wp^oehROhZv&dJ1rN{|Pt zU`41$X)UOuZ3y-9?Fe0+pBc?Rkde1M9J7UDFV18M_>jpd;luLE_nc7-|NEU3nghw%E> z1LhtI9sMV$1hIQMcX2YP4>CbeC(;7SzY|mgL!ovw!?@k_SD^0xmr(C|-MyT30Mx4| zKdb^vd6?+sG7+kybx=oo3To$%p+0_pg*t)6y`7h9X{bxq5vuVSQ11iQLS2gUP#d{r z>*r9fman$<>*Lh(#Al*H*^MQk@5rDEc7;kf*YvAweFUaL9}3m*TVtHQj(;|&4Hbd1 zH!yu4TaR+c=l@Jp@DS8Bx(>6$Nd24yxnLmcs!-RiD^x=ZppJem)XvWt-$HFDVSnc) z%K&vL3fj6Rl)V+qtB?P^eG|S24VCb^@f*}NPC39i%DhkwmV~4esKO_WkD&5LqK=N-AF6?@P#?4kd6;O2C7=@5fo|9w%297nr0)S$ zU=Yj+CzyRV)ID(m>LgwpV+?mTkil3IDqmx$!tHJC>BdBz4T5Fhbf}$Og1UL0Lp_S4 zk8oZ_g`pa(4fDbVP&=FeRbW2U39N!e;0ag^x<)z=y5h#>kekxu8tP13OQ3dm1nM)Q zP^ixd??64d-ay^;U!d-lc%z(xK~RlUfTiI;SQ73t{Wqw)Kj&y?BejgfVM@LJH~S`h zQwcW2@fD2h$J_8ReAdgl(pcwfIeTFh)<2*MRUYSjMRX$6$z6x#VT$o?-*3xp1NHKb zH^J@u2F6s_n)QFMFKqFv+ci`Umzb!-IujlCfqKx)hQaU-Zr=|yG>6*gCg{J)Zq7P#G`=#1&o~ktBY6%!rVb;aq!GIB`WTBGCaypJ zlJ4jqc@sSJ_l&ZN(!ORa!%~#$ZHT%}*7D3xpzn-cH$XA`FEC$(oj*+aKbe8wChIg8 z-Cd{K@%SyHy9ZR|G40xB{(5q~cR_rxGt9%6w_F$B?i3Ie8Bt9oQfVqiOmUlfuY zHvf*W83hvBnab}A>#WLY#nz#FgkN%WKbXIvk#cfG;_=9JZKe?4fAh&XjFOw|;35TU zux?_B_)ho#q#Q*yvp#4|p0v1!6ncXfKa$~-Qf6<9onJKL`z~ZxYd#BkTX-lk71uvG z4hcU7!*3Db(^6ZXA!vu)3~y=bxfSZf+#h{@3Vfv*Nj_qVkx%joU21&w{n&76X*sp7 zL%hT@iGZjS89<_sbXJz6{4sIY`UuXYBFy>CC_af{MIT#3QsyUDK!j7`cmDW3AjGj# z$cXO{;x54G_>nfbs~rWqQ?R~uq(uF(jP#~C?(aFujNeh>`hZtc!p1_$66QM?;W82* zFJrB>)!Fu4%Xkrf!+8)b>XTi`baMOAnwy+Gt?e9i@ycrKj=>|2$B1h%!H;oXNl;Vf zanYrH%KTqz|1@iUKF0T9Bo+-VwcdBcb@MqVZzrBQf8K?Fl)yWAmaPM9dcS zH+|m!_n!%>f#`$Ps2IH3c+9%qk)$#waSG+{%&X%RnS`mZ>2I(dq3bzzO4~`A5Z{E@ zvSa%PMwC3*f1|kM2mDG?CGh`^9k+z{?PSj?P9I?EkmR(yk*7Fc!oc_cT}g1J(o}uw(`LEa)>@5$UGmA1-UH(fsHJ+I#|h&-y(1CDq_Ps4wrh%3~~nu>uL%yz4FN z*X%gAP65X*@EZCP-r}cH*FQx0Can74kyGvwBqO#!vb3b-yQYtiUu3c;Mn4#iW-a*- z@;A9%Gx5#t-Eu0xQ<7O9GSp^ssbER^=!w@3=8`=|XXX5R3Li;1GT)|G{+7Kf21C-F zJkuDGsMw=n|3SXi=pMsrmTw*YbM)k|N&}KcIA6!Ok$E!al3{k*BP`)wbo`vl|0Ik? zCb6n%nl{+Bk}nf+iz6JcXY$zX1I-vEJH6=%yO; zrTCS?E(xR3W~xe-S&j|N?=w$=ehy=<<*8--K^I+Yo|HW2{J84vQA)PMM3#Ifb3dCq zR_EWn==;)SZHh}K+g68@bUEv-mg_dnZs0f;)6720!w+}4^3&8o^nVi98v0(?HwkXd zS-m2tG)zYUeP4J7>mAJRV?WP&1-AE?Zpe-V!d(=si~T6cYNJcwSZVkL74au4ho1`v&eHcy1eiQvg#zy?Ek~to_{=~P2k~i2&SmoQaUlv;{%lS9e zQ``KQ&NLwf3enmnl3yo5Y=Sf3(9#MwV*Z?D`x$$j{JtNrD1x8ljTKD|^U-_=`X9uc zrciFj#rJOkyAIoFW*y@kezEjQ`VVt*6p{~?O!IyuS!nBHG#Hx(-;uNjdc8-zMa&9x zOBhK=7Mq>+pvi>TQp4R8Y=r+B)*CJVc*xI}xgwJ{D;%vCiDVu8l^stZ;FEQ_4c&d5 zig|lJ^3PJ3*{_soh_)|j_A^gsX-lK~!MIGO!ruEA0@Cn1XMK_%ZGReGisu@}OQO0k zT6!6)?4ZL2_@<*Z$6751Cjcg|vN6=*=CI($f{B>RAgXF`ujm&G% zJ+xdm(9b8|6ZD;|Bl(_ZhaaMF@g;Fdu$zK26$p!3a(+>uYba~UXcA9w&LVINZbe- z_)g=Jlygbko}|54{6k<%>s-d_-s)jVJe4A7I+8+i8qfb|JqKecsSn|^h1BJ-?IvRv zpBJAm;g^dsIzo;U_}``cDY(JTrZ*hN7>T|%qaQ7&r&c2U`PHr@7>^>Ool6JiX(%ud z{RR@Jq+lLKCf1z^TFiNbpuZ2Fk+d25TIh>X@DKbtW1G(y%=$jI$@uYGL4C3i{YYZs z)5Ig}4We;})M9ZPWgWSYAU8pWX(j-NL8ua7duPpEVcmgZf1t~W?>-V2rhw#yu_LV{wZSLO>C9{ahr{5xd4aWde%J2&b(lU~u z<0p7svn=5u)?ut)Kz!k8S5uQ$H2g7qj8mDbAPAW1;s={DboPYQH@_$+*wB{|6@Sl0$_G*|1D^4%r7mza6~pBrlcD%zMn4??rDUi{ zHwVxKG5;N1Ub-kqm1>N&=xY++5#3j8lDNzl(?M43v8h#*`7nJ&p@g-w28SXfm1Kdv zP5+R9JvbL7Q7B2*n*JL_mXoLzapAI#29Ki8i(ht_opYVV=o;=|EJ#dw^3IIm&3iRr z{o|IRI3+3*nhjH7Qn{ILvJej~?!v%v?Hc6sMr4e-=8 zuTEGd*}N-Rn=)TSWOcGWVmu^jDC`trGjp-0M%S0Fj$t3h_)4B#bS7y=l?3Rjsv1&~ zyp4&eMNCt4ccOE;`iaw07sLGnAvW>Dx5 zxzfXx*d$@t)3T0cxihoQO^(H^$D`+o$QOp_HUouHp#0`j@@TP>C_>^tu>D2Cr6l)< zEnsx`4xgmV8^Hvu_gi!Gh`C12G!#2U&QGutrBdUwfbj*tCg=uYTcvxTJCi~r3YSa~ zPGA%E!UXLl;JCN>_0*oa)?#UkNQPybh4OzXe6pPk4e)D1=F|A;H#?RHPY*9)&q?O3 z=wlF*UUsS+rnT&L@#N08K3v_;P0zn9K~Y}J}C{v zgM|sm!2FEQ!Ex5V+epHH|MAIPe5O(8IZb3H{y5qj=(^ENcWbCO>-*O9pQf9G|5a+# zCbk?k)_cQl`WKIabqCc-!yZ<31X)K~bOooVt8j#l#$x-7e`ar*TLFnH;{BSOk`U%0 zSo3;o-%1iZ5}$u9k7K8+@QJan<;_B*zNz@0n5=XsY0YR(<{NZ=AKo(G8fIU|sf2kG zeDL>-CHhaZo+rZ#_SqFmN)w&WB7SGSgtLiDR}-;cA!}Y3i%iF1S>ILZILqihQqv#oubbyjy%pnFrT}ilvKtF5bUv!e46qZ{gY~gZ} zf(aa>BkMlx@(f>&{iN3bLt zfoW{6b#MI6*e;*rKc3k6*8DnhMaDOm<*7goeP=Nh{td{Jm5pEUpxi@HE)-$#I{c5I zx6H$3G6^TKE{-BINhSU8X@$N7&Hu${!$`)u3Q7Ma$0_V*Df|H6%IIoQrwBfh=lG?? z772ZU-}t93&XV?wKX81_`X)&vbBrzMx|Z$qfH%Qi|0vIBrIt6#-GG!WNLCHM-DuV` zrmIBD z$WDARSfe9oW-;s7*6?fWZx{ou$VVFTqsb6Err)&zZ|i&ho;+mOOQqpN7P5m&LneLm z`3%vmi8x_V)2SYnG1EHAXw`3+U0uE zvoQ{{WFKgz5QPe}U4LxR_}K9$zEiEqzew24w%39<-!~<&-zV|!%$LE6>$btdvPOiud0 z(Cr{)PUb=Qb|T{zeA6;&vu>`lz*e5|6We=qbD-omJF}`$eLpQh5|S>XcrR~`2dO=| zShZz0QzS+F-J_BkV5x}h7udW}9A zmHdKYq7|CQyfkBsH5HeFdDz@Z0$wwZZiVJz=l{$8KXQ>(S+hT5i;^+KWhTBOo0-Ra z19e`IryuhUQTfKs3j+4z@Ha!k&#w4n98I{;J>xe#h?z>!dIeZ5_QuuD>w%&?_{JT!|&F9GAf)T!z}NCM**I)M5VVodlDYct!5vZ zUTKGN0B=bH`~u1DhwTTwB!C-XMeGllr-c1jzavjg>*Aa$V~Z#mS(Hb=GyF~2uLOLw zVrMCGocT%;>vJ@49$)>qOLlA% z@VjU+tB4~^R%J=Bz!aJ-llIU;NGYO95 z9q}ZIryZ+0ta1=Bk8zZFK0FgK%3~`;3xk;NrkyJcKU!!?i`n53I1YP#;tI3AP4;!H zlM^Q?#TY?%wT)Rp7lSHd=n$P?z$<8ufkoW+;zmi}9 z+xdWf4(k%kGoa)Dt^1_1nxNQm?2>NSC1+@|A^A44et-}E&D_;IdVph`L89##B`-)O zsqWqKG)aufgh~2%!=9#&@;8Ztyq}+@4(9LixKgp_KG>Epma*Q(IvZ*E`!B9+==L)j z5Fz=2J}Zm`B`NUPNX4p_zmT0-I&7(I{z5OvD0f*U@=kx2+B1ZhPsEI6YoCZq%=jIh zWQ1*VJL`G)B(`-0tN+~mH18M0j@h=%6mVXSqO^(mlzgqlMeG|b;a4!N=ay`nBtN>0~$@m_pO&0u%?Gaa> zM5oC<_-$c)!8U+GyeV)s#Q#rn-C>-hP*v>VGLiLD7Gv>0X?c_CFLb`g(1QR;YK%E3 zK2wK=_>ow01$|{_>gt6(2Kq_F@0s$lzJO}%7o zACn-D-!dG9O>D_YIBTZ8%k_P z-Ng17~B-tDx+fJf3q3?>{Z)EL` z{UR0iSaR0Mz~YYCK?UPmpB{JXRnnh;@i@k% zz%`U>S;r#bPEJ^|9Q}86J3!i_<`wQbKIU`#$K0EbYadFr}f%GKWN`f$UFo8~E5D+d0nAEhu2F(Aazydgh zm?y+sBmO1!SBzf7U1nUjU_X2^MQB>;U~0Z$cqZ{r8x(Em>=T?pqQoSb4}Vp+B0hU< zM`g4NYb*wd&nO#`jJYH?&CFolfPy`UjZbV9hGe&K5u8oFU|s(umh2>oU5r;Gh)NU-00WdCe8Tq$C^F&1-b;W8ZGinXsq8Z#}zY$d`Rs% zL#lLm{EGDisbkt%6pe5O(J7ym^#oe)4_6SA5x+6C^O<#4);;jq4(Flk%e*B#!iYy# z-z?W7_?9}ot;R!rWuXy@ohUln)g4SwGjx)6%){j<^Mfo7vqidh<;H&?acL-4l_L6< z|5S8QEO~p@li64hwqll~0}T{nz6|{}e8=eOEg-=moEl(UPV&D9loZ5a8S7?L+knqW z8kkPCIFl<^ARk(MJW>$Gfa6}p4u)6>h9 z8D%KS082E923BFrOR}Lfksp09_HY?Qa8kx&^t0I2Y?3d-uLffay1vABz+^8_xrZeWEw~A5;eG$fzxY}T zgpu$%mbS18i6wcA<CPtJTCF|`>j(dESF1V<2!tkhrNnIxx~A##3Vbb80?jyBnS4Aa6V0Zq)2s& zN&KH(9xNs(YsPfJn!|t13dXjKaz2e{{F?1h*Xkuj1v};pHyir^JXQX^-@|7vh!Z6i;3+Kbsp;Pn_i|!f0TYWeucLg zA4xO`7O|pZNK~1CG3eScKjs~A-`_j!zT12FOZ1@MtW95E{L=xCq>LZ5cZ95)VO}!r zXC5w%nI!c3ef9UO=R#h>;*UoiGPz-@2%d_lN5k$2x&i2xv#Cw=)0Z)Xxa#Ctz^IEY z3jUI)a29)cK zH;gT8ChdOOxkD@A(uK7o1}&|`zQQs{7r^`(dPzy<-)Q9v>&W=kVk={*I-dCX5f1i% zwXT@X*au)QfzG2JY5LBjG0vfOy*|U9B$W&>o#qeFHR3GvMT_Jln8J4cqk-%&H93|r zLTKbFF?rDa#Q%DP_DZgGUg?*bH-H3Qz_1YKc+9_Z5{Fs;grB{B|N6%n zOWJ65Cbzt4{`L1HB7vm8@jUathz}(02?c5r(FQIcM?-vG5Z#Ya5T9QuoSpH}nwyR9 zZ`2JJe>V9R-Fj1ug)Q)HfUX!DPN!45OoE3boQz^U!JjEy30*`PgRLMzb!nhIwu~e> z#k?YH4!dEK6k!}jmxRLOnO9|0!Y;W%jdbLZOk*y2ug~%&BiP*;b{RzA6^vylGS{4r zSn{^UZ|HC7G%VR*8XioJMYi+eCb~M#{3wdyEH`JXAJfYLiz|3|lvA&`b0Euq|V>uEkEzVW`Q@ zN5PYpKtZL@HNiPta$16`=t>YLX+xn~6sbzH?P=r-N%u0Zi+vus{Jhiu^Y=7HD;bKm zyR}rEmX_NY%65pc7@fp}KA7rV5AJKYyK}yr8VD6%;Q<}vaKL) z10x}gB!W?6^HnyukzBDYritYp5&olu@9elX!d#4VG;ou|8EvOZ9Ek=3*kxvlEr`&} zVHr(^+G+W-uENH);rE4N6)F6U*nN!LB7U9m@#LpKCmc$`MX)D^mUR1!z)XzJb}5uU z1wQ`~Tn4>l7VAO8lxOruFDXj=Kg3^SJ&d9mts&W_;MbT@gAFuy{GC^MJc_g-nItvF zBaGFymaZ)JbOcmIR|yVB*WO7Wvrj_pXb;g`PsSsBQ^ADf3YXrT>|t^Zrom~9-}GKB z8HvK|`0LPJ73RAL+CuOpE<;py@RRuj=DV2JvqDPxk&zVtw-npS7)CBHi4WmZfD!Ed z{xgZ^7iOi&P=V+MRESEZmqd1;%HPlr=EHW^&Uz|YR^pRIaWFHPB|99r>Z4Cdp2zs* zhApv|mYwxKa26fZBrYvAkvguQmf#*rNg9}eB$BNJU1AGf8rWjGgd_-;E!ZP-3(us< zQY4&+-|QWa{cb0jlRl~6keGq>ItB;!>Cq*)`<&^1?qAYn5A4)FFr-&-@8IrzvIq9> z)U|71o8Z9Kef#w2*1AupwynE%9XMz3Bfk`Z{aSbJ8ywibV{rGtw!MO}b?*?^I$xd)h_=? I?h2Ft52{^_VgLXD delta 65493 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 diff --git a/netbox/translations/uk/LC_MESSAGES/django.po b/netbox/translations/uk/LC_MESSAGES/django.po index 08def4548..1588a5495 100644 --- a/netbox/translations/uk/LC_MESSAGES/django.po +++ b/netbox/translations/uk/LC_MESSAGES/django.po @@ -5,17 +5,17 @@ # # Translators: # Volodymyr Pidgornyi, 2024 -# Vladyslav V. Prodan, 2024 # Jeremy Stretch, 2024 +# Vladyslav V. Prodan, 2024 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-11-21 15:50+0000\n" +"POT-Creation-Date: 2024-12-12 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" -"Last-Translator: Jeremy Stretch, 2024\n" +"Last-Translator: Vladyslav V. Prodan, 2024\n" "Language-Team: Ukrainian (https://app.transifex.com/netbox-community/teams/178115/uk/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -23,3094 +23,3422 @@ msgstr "" "Language: uk\n" "Plural-Forms: nplurals=4; plural=(n % 1 == 0 && n % 10 == 1 && n % 100 != 11 ? 0 : n % 1 == 0 && n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14) ? 1 : n % 1 == 0 && (n % 10 ==0 || (n % 10 >=5 && n % 10 <=9) || (n % 100 >=11 && n % 100 <=14 )) ? 2: 3);\n" -#: account/tables.py:27 templates/account/token.html:22 -#: templates/users/token.html:17 users/forms/bulk_import.py:39 -#: users/forms/model_forms.py:112 +#: netbox/account/tables.py:27 netbox/templates/account/token.html:22 +#: netbox/templates/users/token.html:17 netbox/users/forms/bulk_import.py:39 +#: netbox/users/forms/model_forms.py:112 msgid "Key" msgstr "Ключ" -#: account/tables.py:31 users/forms/filtersets.py:132 +#: netbox/account/tables.py:31 netbox/users/forms/filtersets.py:132 msgid "Write Enabled" msgstr "Запис дозволено" -#: account/tables.py:35 core/choices.py:86 core/tables/jobs.py:29 -#: core/tables/tasks.py:79 extras/tables/tables.py:335 -#: extras/tables/tables.py:566 templates/account/token.html:43 -#: templates/core/configrevision.html:26 -#: templates/core/configrevision_restore.html:12 templates/core/job.html:69 -#: templates/core/rq_task.html:16 templates/core/rq_task.html:73 -#: templates/core/rq_worker.html:14 -#: templates/extras/htmx/script_result.html:12 -#: templates/extras/journalentry.html:22 templates/generic/object.html:58 -#: templates/users/token.html:35 +#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 +#: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 +#: netbox/templates/account/token.html:43 +#: netbox/templates/core/configrevision.html:26 +#: netbox/templates/core/configrevision_restore.html:12 +#: netbox/templates/core/job.html:69 netbox/templates/core/rq_task.html:16 +#: netbox/templates/core/rq_task.html:73 +#: netbox/templates/core/rq_worker.html:14 +#: netbox/templates/extras/htmx/script_result.html:12 +#: netbox/templates/extras/journalentry.html:22 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "Створено" -#: account/tables.py:39 templates/account/token.html:47 -#: templates/users/token.html:39 users/forms/bulk_edit.py:117 -#: users/forms/filtersets.py:136 +#: netbox/account/tables.py:39 netbox/templates/account/token.html:47 +#: netbox/templates/users/token.html:39 netbox/users/forms/bulk_edit.py:117 +#: netbox/users/forms/filtersets.py:136 msgid "Expires" msgstr "Термін дії закінчується" -#: account/tables.py:42 users/forms/filtersets.py:141 +#: netbox/account/tables.py:42 netbox/users/forms/filtersets.py:141 msgid "Last Used" msgstr "Використано востаннє" -#: account/tables.py:45 templates/account/token.html:55 -#: templates/users/token.html:47 users/forms/bulk_edit.py:122 -#: users/forms/model_forms.py:124 +#: netbox/account/tables.py:45 netbox/templates/account/token.html:55 +#: netbox/templates/users/token.html:47 netbox/users/forms/bulk_edit.py:122 +#: netbox/users/forms/model_forms.py:124 msgid "Allowed IPs" msgstr "Дозволені IP-адреси" -#: account/views.py:114 +#: netbox/account/views.py:114 #, python-brace-format msgid "Logged in as {user}." msgstr "Ввійшов в систему як {user}." -#: account/views.py:164 +#: netbox/account/views.py:164 msgid "You have logged out." msgstr "Ви вийшли з системи." -#: account/views.py:216 +#: netbox/account/views.py:216 msgid "Your preferences have been updated." msgstr "Ваші налаштування було оновлено." -#: account/views.py:239 +#: netbox/account/views.py:239 msgid "LDAP-authenticated user credentials cannot be changed within NetBox." msgstr "" "Облікові дані користувача, підтверджені LDAP, неможливо змінити в NetBox." -#: account/views.py:254 +#: netbox/account/views.py:254 msgid "Your password has been changed successfully." msgstr "Ваш пароль успішно змінено." -#: circuits/choices.py:21 dcim/choices.py:20 dcim/choices.py:102 -#: dcim/choices.py:185 dcim/choices.py:237 dcim/choices.py:1532 -#: dcim/choices.py:1608 dcim/choices.py:1658 virtualization/choices.py:20 -#: virtualization/choices.py:45 vpn/choices.py:18 +#: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 +#: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 +#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 +#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 +#: netbox/vpn/choices.py:18 msgid "Planned" msgstr "Заплановано" -#: circuits/choices.py:22 netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 msgid "Provisioning" msgstr "Забезпечення" -#: circuits/choices.py:23 core/tables/tasks.py:22 dcim/choices.py:22 -#: dcim/choices.py:103 dcim/choices.py:184 dcim/choices.py:236 -#: dcim/choices.py:1607 dcim/choices.py:1657 extras/tables/tables.py:495 -#: ipam/choices.py:31 ipam/choices.py:49 ipam/choices.py:69 -#: ipam/choices.py:154 templates/extras/configcontext.html:25 -#: templates/users/user.html:37 users/forms/bulk_edit.py:38 -#: virtualization/choices.py:22 virtualization/choices.py:44 vpn/choices.py:19 -#: wireless/choices.py:25 +#: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 +#: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 +#: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 +#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 +#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 +#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 +#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 +#: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 +#: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 msgid "Active" msgstr "Активний" -#: circuits/choices.py:24 dcim/choices.py:183 dcim/choices.py:235 -#: dcim/choices.py:1606 dcim/choices.py:1659 virtualization/choices.py:24 -#: virtualization/choices.py:43 +#: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 +#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 +#: netbox/virtualization/choices.py:43 msgid "Offline" msgstr "Офлайн" -#: circuits/choices.py:25 +#: netbox/circuits/choices.py:25 msgid "Deprovisioning" msgstr "Зняття з експлуатації" -#: circuits/choices.py:26 +#: netbox/circuits/choices.py:26 msgid "Decommissioned" msgstr "Виведені з експлуатації" -#: circuits/choices.py:90 dcim/choices.py:1619 tenancy/choices.py:17 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "Первинний" -#: circuits/choices.py:91 ipam/choices.py:90 tenancy/choices.py:18 +#: netbox/circuits/choices.py:91 netbox/ipam/choices.py:90 +#: netbox/tenancy/choices.py:18 msgid "Secondary" msgstr "Вторинний" -#: circuits/choices.py:92 tenancy/choices.py:19 +#: netbox/circuits/choices.py:92 netbox/tenancy/choices.py:19 msgid "Tertiary" msgstr "Третинний" -#: circuits/choices.py:93 tenancy/choices.py:20 +#: netbox/circuits/choices.py:93 netbox/tenancy/choices.py:20 msgid "Inactive" msgstr "Неактивний" -#: circuits/filtersets.py:31 circuits/filtersets.py:198 dcim/filtersets.py:98 -#: dcim/filtersets.py:152 dcim/filtersets.py:212 dcim/filtersets.py:333 -#: dcim/filtersets.py:464 dcim/filtersets.py:1021 dcim/filtersets.py:1368 -#: dcim/filtersets.py:1903 dcim/filtersets.py:2146 dcim/filtersets.py:2204 -#: ipam/filtersets.py:339 ipam/filtersets.py:959 -#: virtualization/filtersets.py:45 virtualization/filtersets.py:173 -#: vpn/filtersets.py:358 +#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 +#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 +#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 +#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 +#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 +#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 +#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/virtualization/filtersets.py:45 +#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "Регіон (ідентифікатор)" -#: circuits/filtersets.py:38 circuits/filtersets.py:205 dcim/filtersets.py:105 -#: dcim/filtersets.py:158 dcim/filtersets.py:219 dcim/filtersets.py:340 -#: dcim/filtersets.py:471 dcim/filtersets.py:1028 dcim/filtersets.py:1375 -#: dcim/filtersets.py:1910 dcim/filtersets.py:2153 dcim/filtersets.py:2211 -#: extras/filtersets.py:509 ipam/filtersets.py:346 ipam/filtersets.py:966 -#: virtualization/filtersets.py:52 virtualization/filtersets.py:180 -#: vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 +#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 +#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 +#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 +#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 +#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 +#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Регіон (скорочення)" -#: circuits/filtersets.py:44 circuits/filtersets.py:211 dcim/filtersets.py:128 -#: dcim/filtersets.py:225 dcim/filtersets.py:346 dcim/filtersets.py:477 -#: dcim/filtersets.py:1034 dcim/filtersets.py:1381 dcim/filtersets.py:1916 -#: dcim/filtersets.py:2159 dcim/filtersets.py:2217 ipam/filtersets.py:352 -#: ipam/filtersets.py:972 virtualization/filtersets.py:58 -#: virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 +#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 +#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 +#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Група тех. майданчиків (ідентифікатор)" -#: circuits/filtersets.py:51 circuits/filtersets.py:218 dcim/filtersets.py:135 -#: dcim/filtersets.py:232 dcim/filtersets.py:353 dcim/filtersets.py:484 -#: dcim/filtersets.py:1041 dcim/filtersets.py:1388 dcim/filtersets.py:1923 -#: dcim/filtersets.py:2166 dcim/filtersets.py:2224 extras/filtersets.py:515 -#: ipam/filtersets.py:359 ipam/filtersets.py:979 -#: virtualization/filtersets.py:65 virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 +#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 +#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 +#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 +#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 +#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/virtualization/filtersets.py:65 +#: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" msgstr "Група тех. майданчиків (скорочення)" -#: circuits/filtersets.py:56 circuits/forms/bulk_edit.py:188 -#: circuits/forms/bulk_edit.py:216 circuits/forms/bulk_import.py:124 -#: circuits/forms/filtersets.py:51 circuits/forms/filtersets.py:171 -#: circuits/forms/filtersets.py:209 circuits/forms/model_forms.py:138 -#: circuits/forms/model_forms.py:154 circuits/tables/circuits.py:113 -#: dcim/forms/bulk_edit.py:169 dcim/forms/bulk_edit.py:330 -#: dcim/forms/bulk_edit.py:678 dcim/forms/bulk_edit.py:883 -#: dcim/forms/bulk_import.py:131 dcim/forms/bulk_import.py:230 -#: dcim/forms/bulk_import.py:309 dcim/forms/bulk_import.py:540 -#: dcim/forms/bulk_import.py:1311 dcim/forms/bulk_import.py:1339 -#: dcim/forms/filtersets.py:87 dcim/forms/filtersets.py:225 -#: dcim/forms/filtersets.py:342 dcim/forms/filtersets.py:439 -#: dcim/forms/filtersets.py:753 dcim/forms/filtersets.py:997 -#: dcim/forms/filtersets.py:1021 dcim/forms/filtersets.py:1111 -#: dcim/forms/filtersets.py:1149 dcim/forms/filtersets.py:1584 -#: dcim/forms/filtersets.py:1608 dcim/forms/filtersets.py:1632 -#: dcim/forms/model_forms.py:137 dcim/forms/model_forms.py:165 -#: dcim/forms/model_forms.py:238 dcim/forms/model_forms.py:463 -#: dcim/forms/model_forms.py:723 dcim/forms/object_create.py:391 -#: dcim/tables/devices.py:153 dcim/tables/power.py:26 dcim/tables/power.py:93 -#: dcim/tables/racks.py:122 dcim/tables/racks.py:207 dcim/tables/sites.py:134 -#: extras/filtersets.py:525 ipam/forms/bulk_edit.py:218 -#: ipam/forms/bulk_edit.py:285 ipam/forms/bulk_edit.py:484 -#: ipam/forms/bulk_import.py:171 ipam/forms/bulk_import.py:429 -#: ipam/forms/filtersets.py:153 ipam/forms/filtersets.py:231 -#: ipam/forms/filtersets.py:432 ipam/forms/filtersets.py:489 -#: ipam/forms/model_forms.py:205 ipam/forms/model_forms.py:636 -#: ipam/tables/ip.py:245 ipam/tables/vlans.py:118 ipam/tables/vlans.py:221 -#: templates/circuits/inc/circuit_termination_fields.html:6 -#: templates/dcim/device.html:22 templates/dcim/inc/cable_termination.html:8 -#: templates/dcim/inc/cable_termination.html:33 -#: templates/dcim/location.html:37 templates/dcim/powerpanel.html:22 -#: templates/dcim/rack.html:20 templates/dcim/rackreservation.html:28 -#: templates/dcim/site.html:28 templates/ipam/prefix.html:56 -#: templates/ipam/vlan.html:23 templates/ipam/vlan_edit.html:40 -#: templates/virtualization/cluster.html:42 -#: templates/virtualization/virtualmachine.html:95 -#: virtualization/forms/bulk_edit.py:91 virtualization/forms/bulk_edit.py:109 -#: virtualization/forms/bulk_edit.py:124 -#: virtualization/forms/bulk_import.py:59 -#: virtualization/forms/bulk_import.py:85 -#: virtualization/forms/filtersets.py:79 -#: virtualization/forms/filtersets.py:148 -#: virtualization/forms/model_forms.py:71 -#: virtualization/forms/model_forms.py:104 -#: virtualization/forms/model_forms.py:171 -#: virtualization/tables/clusters.py:77 -#: virtualization/tables/virtualmachines.py:63 vpn/forms/filtersets.py:266 -#: wireless/forms/model_forms.py:76 wireless/forms/model_forms.py:118 +#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 +#: netbox/circuits/forms/bulk_edit.py:216 +#: netbox/circuits/forms/bulk_import.py:124 +#: netbox/circuits/forms/filtersets.py:51 +#: netbox/circuits/forms/filtersets.py:171 +#: netbox/circuits/forms/filtersets.py:209 +#: netbox/circuits/forms/model_forms.py:138 +#: netbox/circuits/forms/model_forms.py:154 +#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 +#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 +#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 +#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 +#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 +#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 +#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 +#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 +#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 +#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 +#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 +#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 +#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 +#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 +#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 +#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 +#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 +#: netbox/templates/dcim/device.html:22 +#: netbox/templates/dcim/inc/cable_termination.html:8 +#: netbox/templates/dcim/inc/cable_termination.html:33 +#: netbox/templates/dcim/location.html:37 +#: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 +#: netbox/templates/dcim/rackreservation.html:28 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 +#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/virtualization/virtualmachine.html:95 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/bulk_edit.py:109 +#: netbox/virtualization/forms/bulk_edit.py:124 +#: netbox/virtualization/forms/bulk_import.py:59 +#: netbox/virtualization/forms/bulk_import.py:85 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:148 +#: netbox/virtualization/forms/model_forms.py:71 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:171 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/virtualization/tables/virtualmachines.py:63 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 +#: netbox/wireless/forms/model_forms.py:118 msgid "Site" msgstr "Тех. майданчик" -#: circuits/filtersets.py:62 circuits/filtersets.py:229 -#: circuits/filtersets.py:274 dcim/filtersets.py:242 dcim/filtersets.py:363 -#: dcim/filtersets.py:458 extras/filtersets.py:531 ipam/filtersets.py:238 -#: ipam/filtersets.py:369 ipam/filtersets.py:989 -#: virtualization/filtersets.py:75 virtualization/filtersets.py:203 -#: vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 +#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 +#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 +#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/virtualization/filtersets.py:75 +#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "Тех. майданчик (скорочення)" -#: circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:67 msgid "ASN (ID)" msgstr "ASN (ідентифікатор)" -#: circuits/filtersets.py:73 circuits/forms/filtersets.py:31 -#: ipam/forms/model_forms.py:159 ipam/models/asns.py:108 -#: ipam/models/asns.py:125 ipam/tables/asn.py:41 templates/ipam/asn.html:20 +#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 +#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 +#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "ASN" -#: circuits/filtersets.py:95 circuits/filtersets.py:122 -#: circuits/filtersets.py:156 circuits/filtersets.py:283 -#: circuits/filtersets.py:325 ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 +#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 msgid "Provider (ID)" msgstr "Провайдер (ідентифікатор)" -#: circuits/filtersets.py:101 circuits/filtersets.py:128 -#: circuits/filtersets.py:162 circuits/filtersets.py:289 -#: circuits/filtersets.py:331 ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 msgid "Provider (slug)" msgstr "Провайдер (скорочення)" -#: circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:167 msgid "Provider account (ID)" msgstr "Обліковий запис провайдера (ідентифікатор)" -#: circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:173 msgid "Provider account (account)" msgstr "Обліковий запис провайдера (обліковий запис)" -#: circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:178 msgid "Provider network (ID)" msgstr "Мережа провайдера (ідентифікатор)" -#: circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:182 msgid "Circuit type (ID)" msgstr "Тип каналу зв'язку (ідентифікатор)" -#: circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (slug)" msgstr "Тип каналу зв'язку (скорочення)" -#: circuits/filtersets.py:223 circuits/filtersets.py:268 -#: dcim/filtersets.py:236 dcim/filtersets.py:357 dcim/filtersets.py:452 -#: dcim/filtersets.py:1045 dcim/filtersets.py:1393 dcim/filtersets.py:1928 -#: dcim/filtersets.py:2170 dcim/filtersets.py:2229 ipam/filtersets.py:232 -#: ipam/filtersets.py:363 ipam/filtersets.py:983 -#: virtualization/filtersets.py:69 virtualization/filtersets.py:197 -#: vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 +#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 +#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 +#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 +#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 +#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 +#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Тех. майданчик (ідентифікатор)" -#: circuits/filtersets.py:233 circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 msgid "Termination A (ID)" msgstr "Припинення A (ідентифікатор)" -#: circuits/filtersets.py:260 circuits/filtersets.py:320 core/filtersets.py:77 -#: core/filtersets.py:136 core/filtersets.py:173 dcim/filtersets.py:751 -#: dcim/filtersets.py:1362 dcim/filtersets.py:2277 extras/filtersets.py:41 -#: extras/filtersets.py:63 extras/filtersets.py:92 extras/filtersets.py:132 -#: extras/filtersets.py:181 extras/filtersets.py:209 extras/filtersets.py:239 -#: extras/filtersets.py:276 extras/filtersets.py:348 extras/filtersets.py:391 -#: extras/filtersets.py:438 extras/filtersets.py:498 extras/filtersets.py:657 -#: extras/filtersets.py:703 ipam/forms/model_forms.py:449 -#: netbox/filtersets.py:282 netbox/forms/__init__.py:22 -#: netbox/forms/base.py:167 templates/htmx/object_selector.html:28 -#: templates/inc/filter_list.html:46 templates/ipam/ipaddress_assign.html:29 -#: templates/search.html:7 templates/search.html:26 tenancy/filtersets.py:99 -#: users/filtersets.py:23 users/filtersets.py:57 users/filtersets.py:102 -#: users/filtersets.py:150 utilities/forms/forms.py:104 -#: utilities/templates/navigation/menu.html:16 +#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 +#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 +#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 +#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 +#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 +#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 +#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 +#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 +#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 +#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 +#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 +#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 +#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/templates/htmx/object_selector.html:28 +#: netbox/templates/inc/filter_list.html:46 +#: netbox/templates/ipam/ipaddress_assign.html:29 +#: netbox/templates/search.html:7 netbox/templates/search.html:26 +#: netbox/tenancy/filtersets.py:99 netbox/users/filtersets.py:23 +#: netbox/users/filtersets.py:57 netbox/users/filtersets.py:102 +#: netbox/users/filtersets.py:150 netbox/utilities/forms/forms.py:104 +#: netbox/utilities/templates/navigation/menu.html:16 msgid "Search" msgstr "Пошук" -#: circuits/filtersets.py:264 circuits/forms/bulk_edit.py:172 -#: circuits/forms/bulk_edit.py:246 circuits/forms/bulk_import.py:115 -#: circuits/forms/filtersets.py:198 circuits/forms/filtersets.py:214 -#: circuits/forms/filtersets.py:260 circuits/forms/model_forms.py:111 -#: circuits/forms/model_forms.py:133 circuits/forms/model_forms.py:199 -#: circuits/tables/circuits.py:104 circuits/tables/circuits.py:164 -#: dcim/forms/connections.py:73 templates/circuits/circuit.html:15 -#: templates/circuits/circuitgroupassignment.html:26 -#: templates/circuits/circuittermination.html:19 -#: templates/dcim/inc/cable_termination.html:55 -#: templates/dcim/trace/circuit.html:4 +#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 +#: netbox/circuits/forms/bulk_edit.py:246 +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/filtersets.py:198 +#: netbox/circuits/forms/filtersets.py:214 +#: netbox/circuits/forms/filtersets.py:260 +#: netbox/circuits/forms/model_forms.py:111 +#: netbox/circuits/forms/model_forms.py:133 +#: netbox/circuits/forms/model_forms.py:199 +#: netbox/circuits/tables/circuits.py:104 +#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/templates/circuits/circuit.html:15 +#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuittermination.html:19 +#: netbox/templates/dcim/inc/cable_termination.html:55 +#: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "Канал зв'язку" -#: circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:278 msgid "ProviderNetwork (ID)" msgstr "Мережа провайдера (ідентифікатор)" -#: circuits/filtersets.py:335 +#: netbox/circuits/filtersets.py:335 msgid "Circuit (ID)" msgstr "Канал зв'язку (ідентифікатор)" -#: circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:341 msgid "Circuit (CID)" msgstr "Канал зв'язку (ідентифікатор вмісту)" -#: circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:345 msgid "Circuit group (ID)" msgstr "Група каналів зв'язку (ідентифікатор)" -#: circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:351 msgid "Circuit group (slug)" msgstr "Група каналів зв'язку (скорочення)" -#: circuits/forms/bulk_edit.py:30 circuits/forms/filtersets.py:56 -#: circuits/forms/model_forms.py:29 circuits/tables/providers.py:33 -#: dcim/forms/bulk_edit.py:129 dcim/forms/filtersets.py:195 -#: dcim/forms/model_forms.py:123 dcim/tables/sites.py:94 -#: ipam/models/asns.py:126 ipam/tables/asn.py:27 ipam/views.py:213 -#: netbox/navigation/menu.py:172 netbox/navigation/menu.py:175 -#: templates/circuits/provider.html:23 +#: netbox/circuits/forms/bulk_edit.py:30 +#: netbox/circuits/forms/filtersets.py:56 +#: netbox/circuits/forms/model_forms.py:29 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 +#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 +#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "ASNs" -#: circuits/forms/bulk_edit.py:34 circuits/forms/bulk_edit.py:56 -#: circuits/forms/bulk_edit.py:83 circuits/forms/bulk_edit.py:104 -#: circuits/forms/bulk_edit.py:164 circuits/forms/bulk_edit.py:183 -#: circuits/forms/bulk_edit.py:228 core/forms/bulk_edit.py:28 -#: dcim/forms/bulk_create.py:35 dcim/forms/bulk_edit.py:74 -#: dcim/forms/bulk_edit.py:93 dcim/forms/bulk_edit.py:152 -#: dcim/forms/bulk_edit.py:193 dcim/forms/bulk_edit.py:211 -#: dcim/forms/bulk_edit.py:289 dcim/forms/bulk_edit.py:433 -#: dcim/forms/bulk_edit.py:467 dcim/forms/bulk_edit.py:482 -#: dcim/forms/bulk_edit.py:541 dcim/forms/bulk_edit.py:585 -#: dcim/forms/bulk_edit.py:619 dcim/forms/bulk_edit.py:643 -#: dcim/forms/bulk_edit.py:716 dcim/forms/bulk_edit.py:777 -#: dcim/forms/bulk_edit.py:829 dcim/forms/bulk_edit.py:852 -#: dcim/forms/bulk_edit.py:900 dcim/forms/bulk_edit.py:970 -#: dcim/forms/bulk_edit.py:1023 dcim/forms/bulk_edit.py:1058 -#: dcim/forms/bulk_edit.py:1098 dcim/forms/bulk_edit.py:1142 -#: dcim/forms/bulk_edit.py:1187 dcim/forms/bulk_edit.py:1214 -#: dcim/forms/bulk_edit.py:1232 dcim/forms/bulk_edit.py:1250 -#: dcim/forms/bulk_edit.py:1268 dcim/forms/bulk_edit.py:1720 -#: extras/forms/bulk_edit.py:39 extras/forms/bulk_edit.py:149 -#: extras/forms/bulk_edit.py:178 extras/forms/bulk_edit.py:208 -#: extras/forms/bulk_edit.py:256 extras/forms/bulk_edit.py:274 -#: extras/forms/bulk_edit.py:298 extras/forms/bulk_edit.py:312 -#: extras/forms/bulk_edit.py:339 extras/tables/tables.py:79 -#: ipam/forms/bulk_edit.py:53 ipam/forms/bulk_edit.py:73 -#: ipam/forms/bulk_edit.py:93 ipam/forms/bulk_edit.py:117 -#: ipam/forms/bulk_edit.py:146 ipam/forms/bulk_edit.py:175 -#: ipam/forms/bulk_edit.py:194 ipam/forms/bulk_edit.py:276 -#: ipam/forms/bulk_edit.py:321 ipam/forms/bulk_edit.py:369 -#: ipam/forms/bulk_edit.py:412 ipam/forms/bulk_edit.py:428 -#: ipam/forms/bulk_edit.py:516 ipam/forms/bulk_edit.py:547 -#: templates/account/token.html:35 templates/circuits/circuit.html:59 -#: templates/circuits/circuitgroup.html:32 -#: templates/circuits/circuittype.html:26 -#: templates/circuits/inc/circuit_termination_fields.html:88 -#: templates/circuits/provider.html:33 -#: templates/circuits/providernetwork.html:32 -#: templates/core/datasource.html:54 templates/core/plugin.html:80 -#: templates/dcim/cable.html:36 templates/dcim/consoleport.html:44 -#: templates/dcim/consoleserverport.html:44 templates/dcim/device.html:94 -#: templates/dcim/devicebay.html:32 templates/dcim/devicerole.html:30 -#: templates/dcim/devicetype.html:33 templates/dcim/frontport.html:58 -#: templates/dcim/interface.html:69 templates/dcim/inventoryitem.html:60 -#: templates/dcim/inventoryitemrole.html:22 templates/dcim/location.html:33 -#: templates/dcim/manufacturer.html:40 templates/dcim/module.html:73 -#: templates/dcim/modulebay.html:42 templates/dcim/moduletype.html:37 -#: templates/dcim/platform.html:33 templates/dcim/powerfeed.html:40 -#: templates/dcim/poweroutlet.html:40 templates/dcim/powerpanel.html:30 -#: templates/dcim/powerport.html:40 templates/dcim/rack.html:53 -#: templates/dcim/rackreservation.html:62 templates/dcim/rackrole.html:26 -#: templates/dcim/racktype.html:24 templates/dcim/rearport.html:54 -#: templates/dcim/region.html:33 templates/dcim/site.html:60 -#: templates/dcim/sitegroup.html:33 templates/dcim/virtualchassis.html:31 -#: templates/extras/configcontext.html:21 -#: templates/extras/configtemplate.html:17 -#: templates/extras/customfield.html:34 -#: templates/extras/dashboard/widget_add.html:14 -#: templates/extras/eventrule.html:21 templates/extras/exporttemplate.html:19 -#: templates/extras/notificationgroup.html:20 -#: templates/extras/savedfilter.html:17 templates/extras/script_list.html:46 -#: templates/extras/tag.html:20 templates/extras/webhook.html:17 -#: templates/generic/bulk_import.html:120 templates/ipam/aggregate.html:43 -#: templates/ipam/asn.html:42 templates/ipam/asnrange.html:38 -#: templates/ipam/fhrpgroup.html:34 templates/ipam/ipaddress.html:55 -#: templates/ipam/iprange.html:67 templates/ipam/prefix.html:81 -#: templates/ipam/rir.html:26 templates/ipam/role.html:26 -#: templates/ipam/routetarget.html:21 templates/ipam/service.html:50 -#: templates/ipam/servicetemplate.html:27 templates/ipam/vlan.html:62 -#: templates/ipam/vlangroup.html:34 templates/ipam/vrf.html:33 -#: templates/tenancy/contact.html:67 templates/tenancy/contactgroup.html:25 -#: templates/tenancy/contactrole.html:22 templates/tenancy/tenant.html:24 -#: templates/tenancy/tenantgroup.html:33 templates/users/group.html:21 -#: templates/users/objectpermission.html:21 templates/users/token.html:27 -#: templates/virtualization/cluster.html:25 -#: templates/virtualization/clustergroup.html:26 -#: templates/virtualization/clustertype.html:26 -#: templates/virtualization/virtualdisk.html:39 -#: templates/virtualization/virtualmachine.html:31 -#: templates/virtualization/vminterface.html:51 -#: templates/vpn/ikepolicy.html:17 templates/vpn/ikeproposal.html:17 -#: templates/vpn/ipsecpolicy.html:17 templates/vpn/ipsecprofile.html:17 -#: templates/vpn/ipsecprofile.html:40 templates/vpn/ipsecprofile.html:73 -#: templates/vpn/ipsecproposal.html:17 templates/vpn/l2vpn.html:26 -#: templates/vpn/tunnel.html:33 templates/vpn/tunnelgroup.html:30 -#: templates/wireless/wirelesslan.html:26 -#: templates/wireless/wirelesslangroup.html:33 -#: templates/wireless/wirelesslink.html:34 tenancy/forms/bulk_edit.py:32 -#: tenancy/forms/bulk_edit.py:80 tenancy/forms/bulk_edit.py:122 -#: users/forms/bulk_edit.py:64 users/forms/bulk_edit.py:82 -#: users/forms/bulk_edit.py:112 virtualization/forms/bulk_edit.py:32 -#: virtualization/forms/bulk_edit.py:46 virtualization/forms/bulk_edit.py:100 -#: virtualization/forms/bulk_edit.py:177 virtualization/forms/bulk_edit.py:228 -#: virtualization/forms/bulk_edit.py:337 vpn/forms/bulk_edit.py:28 -#: vpn/forms/bulk_edit.py:64 vpn/forms/bulk_edit.py:121 -#: vpn/forms/bulk_edit.py:155 vpn/forms/bulk_edit.py:190 -#: vpn/forms/bulk_edit.py:215 vpn/forms/bulk_edit.py:247 -#: vpn/forms/bulk_edit.py:274 wireless/forms/bulk_edit.py:29 -#: wireless/forms/bulk_edit.py:82 wireless/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 +#: netbox/circuits/forms/bulk_edit.py:83 +#: netbox/circuits/forms/bulk_edit.py:104 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/bulk_edit.py:183 +#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 +#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 +#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 +#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 +#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 +#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 +#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 +#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 +#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 +#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 +#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 +#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 +#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 +#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 +#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 +#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 +#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 +#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 +#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 +#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 +#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 +#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 +#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 +#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 +#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/templates/account/token.html:35 +#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuitgroup.html:32 +#: netbox/templates/circuits/circuittype.html:26 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/provider.html:33 +#: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/core/datasource.html:54 +#: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 +#: netbox/templates/dcim/consoleport.html:44 +#: netbox/templates/dcim/consoleserverport.html:44 +#: netbox/templates/dcim/device.html:94 +#: netbox/templates/dcim/devicebay.html:32 +#: netbox/templates/dcim/devicerole.html:30 +#: netbox/templates/dcim/devicetype.html:33 +#: netbox/templates/dcim/frontport.html:58 +#: netbox/templates/dcim/interface.html:69 +#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitemrole.html:22 +#: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/manufacturer.html:40 +#: netbox/templates/dcim/module.html:73 +#: netbox/templates/dcim/modulebay.html:42 +#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/platform.html:33 +#: netbox/templates/dcim/powerfeed.html:40 +#: netbox/templates/dcim/poweroutlet.html:40 +#: netbox/templates/dcim/powerpanel.html:30 +#: netbox/templates/dcim/powerport.html:40 netbox/templates/dcim/rack.html:53 +#: netbox/templates/dcim/rackreservation.html:62 +#: netbox/templates/dcim/rackrole.html:26 +#: netbox/templates/dcim/racktype.html:24 +#: netbox/templates/dcim/rearport.html:54 netbox/templates/dcim/region.html:33 +#: netbox/templates/dcim/site.html:60 netbox/templates/dcim/sitegroup.html:33 +#: netbox/templates/dcim/virtualchassis.html:31 +#: netbox/templates/extras/configcontext.html:21 +#: netbox/templates/extras/configtemplate.html:17 +#: netbox/templates/extras/customfield.html:34 +#: netbox/templates/extras/dashboard/widget_add.html:14 +#: netbox/templates/extras/eventrule.html:21 +#: netbox/templates/extras/exporttemplate.html:19 +#: netbox/templates/extras/notificationgroup.html:20 +#: netbox/templates/extras/savedfilter.html:17 +#: netbox/templates/extras/script_list.html:46 +#: netbox/templates/extras/tag.html:20 netbox/templates/extras/webhook.html:17 +#: netbox/templates/generic/bulk_import.html:120 +#: netbox/templates/ipam/aggregate.html:43 netbox/templates/ipam/asn.html:42 +#: netbox/templates/ipam/asnrange.html:38 +#: netbox/templates/ipam/fhrpgroup.html:34 +#: netbox/templates/ipam/ipaddress.html:55 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 +#: netbox/templates/ipam/routetarget.html:21 +#: netbox/templates/ipam/service.html:50 +#: netbox/templates/ipam/servicetemplate.html:27 +#: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 +#: netbox/templates/tenancy/contactgroup.html:25 +#: netbox/templates/tenancy/contactrole.html:22 +#: netbox/templates/tenancy/tenant.html:24 +#: netbox/templates/tenancy/tenantgroup.html:33 +#: netbox/templates/users/group.html:21 +#: netbox/templates/users/objectpermission.html:21 +#: netbox/templates/users/token.html:27 +#: netbox/templates/virtualization/cluster.html:25 +#: netbox/templates/virtualization/clustergroup.html:26 +#: netbox/templates/virtualization/clustertype.html:26 +#: netbox/templates/virtualization/virtualdisk.html:39 +#: netbox/templates/virtualization/virtualmachine.html:31 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/vpn/ikepolicy.html:17 +#: netbox/templates/vpn/ikeproposal.html:17 +#: netbox/templates/vpn/ipsecpolicy.html:17 +#: netbox/templates/vpn/ipsecprofile.html:17 +#: netbox/templates/vpn/ipsecprofile.html:40 +#: netbox/templates/vpn/ipsecprofile.html:73 +#: netbox/templates/vpn/ipsecproposal.html:17 +#: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 +#: netbox/templates/vpn/tunnelgroup.html:30 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:33 +#: netbox/templates/wireless/wirelesslink.html:34 +#: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 +#: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 +#: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 +#: netbox/virtualization/forms/bulk_edit.py:32 +#: netbox/virtualization/forms/bulk_edit.py:46 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_edit.py:177 +#: netbox/virtualization/forms/bulk_edit.py:228 +#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 +#: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 +#: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 +#: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 +#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 +#: netbox/wireless/forms/bulk_edit.py:140 msgid "Description" msgstr "Опис" -#: circuits/forms/bulk_edit.py:51 circuits/forms/bulk_edit.py:73 -#: circuits/forms/bulk_edit.py:123 circuits/forms/bulk_import.py:36 -#: circuits/forms/bulk_import.py:51 circuits/forms/bulk_import.py:74 -#: circuits/forms/filtersets.py:70 circuits/forms/filtersets.py:88 -#: circuits/forms/filtersets.py:116 circuits/forms/filtersets.py:131 -#: circuits/forms/filtersets.py:199 circuits/forms/filtersets.py:232 -#: circuits/forms/filtersets.py:255 circuits/forms/model_forms.py:47 -#: circuits/forms/model_forms.py:61 circuits/forms/model_forms.py:93 -#: circuits/tables/circuits.py:58 circuits/tables/circuits.py:108 -#: circuits/tables/circuits.py:160 circuits/tables/providers.py:72 -#: circuits/tables/providers.py:103 templates/circuits/circuit.html:18 -#: templates/circuits/circuittermination.html:25 -#: templates/circuits/provider.html:20 -#: templates/circuits/provideraccount.html:20 -#: templates/circuits/providernetwork.html:20 -#: templates/dcim/inc/cable_termination.html:51 +#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 +#: netbox/circuits/forms/bulk_edit.py:123 +#: netbox/circuits/forms/bulk_import.py:36 +#: netbox/circuits/forms/bulk_import.py:51 +#: netbox/circuits/forms/bulk_import.py:74 +#: netbox/circuits/forms/filtersets.py:70 +#: netbox/circuits/forms/filtersets.py:88 +#: netbox/circuits/forms/filtersets.py:116 +#: netbox/circuits/forms/filtersets.py:131 +#: netbox/circuits/forms/filtersets.py:199 +#: netbox/circuits/forms/filtersets.py:232 +#: netbox/circuits/forms/filtersets.py:255 +#: netbox/circuits/forms/model_forms.py:47 +#: netbox/circuits/forms/model_forms.py:61 +#: netbox/circuits/forms/model_forms.py:93 +#: netbox/circuits/tables/circuits.py:58 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/tables/providers.py:72 +#: netbox/circuits/tables/providers.py:103 +#: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuittermination.html:25 +#: netbox/templates/circuits/provider.html:20 +#: netbox/templates/circuits/provideraccount.html:20 +#: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/dcim/inc/cable_termination.html:51 msgid "Provider" msgstr "Провайдер" -#: circuits/forms/bulk_edit.py:80 circuits/forms/filtersets.py:91 -#: templates/circuits/providernetwork.html:28 +#: netbox/circuits/forms/bulk_edit.py:80 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "Ідентифікатор служби" -#: circuits/forms/bulk_edit.py:100 circuits/forms/filtersets.py:107 -#: dcim/forms/bulk_edit.py:207 dcim/forms/bulk_edit.py:605 -#: dcim/forms/bulk_edit.py:814 dcim/forms/bulk_edit.py:1183 -#: dcim/forms/bulk_edit.py:1210 dcim/forms/bulk_edit.py:1716 -#: dcim/forms/filtersets.py:1064 dcim/forms/filtersets.py:1455 -#: dcim/forms/filtersets.py:1479 dcim/tables/devices.py:704 -#: dcim/tables/devices.py:761 dcim/tables/devices.py:1003 -#: dcim/tables/devicetypes.py:249 dcim/tables/devicetypes.py:264 -#: dcim/tables/racks.py:33 extras/forms/bulk_edit.py:270 -#: extras/tables/tables.py:443 templates/circuits/circuittype.html:30 -#: templates/dcim/cable.html:40 templates/dcim/devicerole.html:34 -#: templates/dcim/frontport.html:40 templates/dcim/inventoryitemrole.html:26 -#: templates/dcim/rackrole.html:30 templates/dcim/rearport.html:40 -#: templates/extras/tag.html:26 +#: netbox/circuits/forms/bulk_edit.py:100 +#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 +#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 +#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 +#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 +#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 +#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 +#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 +#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 +#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/dcim/cable.html:40 +#: netbox/templates/dcim/devicerole.html:34 +#: netbox/templates/dcim/frontport.html:40 +#: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/rackrole.html:30 +#: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "Колір" -#: circuits/forms/bulk_edit.py:118 circuits/forms/bulk_import.py:87 -#: circuits/forms/filtersets.py:126 core/forms/bulk_edit.py:18 -#: core/forms/filtersets.py:33 core/tables/change_logging.py:32 -#: core/tables/data.py:20 core/tables/jobs.py:18 dcim/forms/bulk_edit.py:792 -#: dcim/forms/bulk_edit.py:931 dcim/forms/bulk_edit.py:999 -#: dcim/forms/bulk_edit.py:1018 dcim/forms/bulk_edit.py:1041 -#: dcim/forms/bulk_edit.py:1083 dcim/forms/bulk_edit.py:1127 -#: dcim/forms/bulk_edit.py:1178 dcim/forms/bulk_edit.py:1205 -#: dcim/forms/bulk_import.py:188 dcim/forms/bulk_import.py:260 -#: dcim/forms/bulk_import.py:708 dcim/forms/bulk_import.py:734 -#: dcim/forms/bulk_import.py:760 dcim/forms/bulk_import.py:780 -#: dcim/forms/bulk_import.py:863 dcim/forms/bulk_import.py:957 -#: dcim/forms/bulk_import.py:999 dcim/forms/bulk_import.py:1213 -#: dcim/forms/bulk_import.py:1376 dcim/forms/filtersets.py:955 -#: dcim/forms/filtersets.py:1054 dcim/forms/filtersets.py:1175 -#: dcim/forms/filtersets.py:1247 dcim/forms/filtersets.py:1272 -#: dcim/forms/filtersets.py:1296 dcim/forms/filtersets.py:1316 -#: dcim/forms/filtersets.py:1353 dcim/forms/filtersets.py:1450 -#: dcim/forms/filtersets.py:1474 dcim/forms/model_forms.py:703 -#: dcim/forms/model_forms.py:709 dcim/forms/object_import.py:84 -#: dcim/forms/object_import.py:113 dcim/forms/object_import.py:145 -#: dcim/tables/devices.py:178 dcim/tables/devices.py:814 -#: dcim/tables/power.py:77 dcim/tables/racks.py:138 -#: extras/forms/bulk_import.py:42 extras/tables/tables.py:405 -#: extras/tables/tables.py:465 netbox/tables/tables.py:240 -#: templates/circuits/circuit.html:30 templates/core/datasource.html:38 -#: templates/dcim/cable.html:15 templates/dcim/consoleport.html:36 -#: templates/dcim/consoleserverport.html:36 templates/dcim/frontport.html:36 -#: templates/dcim/interface.html:46 templates/dcim/interface.html:169 -#: templates/dcim/interface.html:311 templates/dcim/powerfeed.html:32 -#: templates/dcim/poweroutlet.html:36 templates/dcim/powerport.html:36 -#: templates/dcim/rearport.html:36 templates/extras/eventrule.html:74 -#: templates/virtualization/cluster.html:17 templates/vpn/l2vpn.html:22 -#: templates/wireless/inc/authentication_attrs.html:8 -#: templates/wireless/inc/wirelesslink_interface.html:14 -#: virtualization/forms/bulk_edit.py:60 virtualization/forms/bulk_import.py:41 -#: virtualization/forms/filtersets.py:54 -#: virtualization/forms/model_forms.py:62 virtualization/tables/clusters.py:66 -#: vpn/forms/bulk_edit.py:264 vpn/forms/bulk_import.py:264 -#: vpn/forms/filtersets.py:217 vpn/forms/model_forms.py:84 -#: vpn/forms/model_forms.py:119 vpn/forms/model_forms.py:231 +#: netbox/circuits/forms/bulk_edit.py:118 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 +#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 +#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 +#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 +#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 +#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 +#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 +#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 +#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 +#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 +#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 +#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 +#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 +#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 +#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 +#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 +#: netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 +#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 +#: netbox/netbox/tables/tables.py:240 +#: netbox/templates/circuits/circuit.html:30 +#: netbox/templates/core/datasource.html:38 +#: netbox/templates/dcim/cable.html:15 +#: netbox/templates/dcim/consoleport.html:36 +#: netbox/templates/dcim/consoleserverport.html:36 +#: netbox/templates/dcim/frontport.html:36 +#: netbox/templates/dcim/interface.html:46 +#: netbox/templates/dcim/interface.html:169 +#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/powerfeed.html:32 +#: netbox/templates/dcim/poweroutlet.html:36 +#: netbox/templates/dcim/powerport.html:36 +#: netbox/templates/dcim/rearport.html:36 +#: netbox/templates/extras/eventrule.html:74 +#: netbox/templates/virtualization/cluster.html:17 +#: netbox/templates/vpn/l2vpn.html:22 +#: netbox/templates/wireless/inc/authentication_attrs.html:8 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:14 +#: netbox/virtualization/forms/bulk_edit.py:60 +#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/filtersets.py:54 +#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/tables/clusters.py:66 +#: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 +#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 msgid "Type" msgstr "Тип" -#: circuits/forms/bulk_edit.py:128 circuits/forms/bulk_import.py:80 -#: circuits/forms/filtersets.py:139 circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:128 +#: netbox/circuits/forms/bulk_import.py:80 +#: netbox/circuits/forms/filtersets.py:139 +#: netbox/circuits/forms/model_forms.py:98 msgid "Provider account" msgstr "Обліковий запис постачальника" -#: circuits/forms/bulk_edit.py:136 circuits/forms/bulk_import.py:93 -#: circuits/forms/filtersets.py:150 core/forms/filtersets.py:38 -#: core/forms/filtersets.py:79 core/tables/data.py:23 core/tables/jobs.py:26 -#: core/tables/tasks.py:88 dcim/forms/bulk_edit.py:107 -#: dcim/forms/bulk_edit.py:182 dcim/forms/bulk_edit.py:352 -#: dcim/forms/bulk_edit.py:701 dcim/forms/bulk_edit.py:766 -#: dcim/forms/bulk_edit.py:798 dcim/forms/bulk_edit.py:925 -#: dcim/forms/bulk_edit.py:1739 dcim/forms/bulk_import.py:88 -#: dcim/forms/bulk_import.py:147 dcim/forms/bulk_import.py:248 -#: dcim/forms/bulk_import.py:505 dcim/forms/bulk_import.py:659 -#: dcim/forms/bulk_import.py:1207 dcim/forms/bulk_import.py:1371 -#: dcim/forms/bulk_import.py:1435 dcim/forms/filtersets.py:178 -#: dcim/forms/filtersets.py:237 dcim/forms/filtersets.py:359 -#: dcim/forms/filtersets.py:799 dcim/forms/filtersets.py:924 -#: dcim/forms/filtersets.py:958 dcim/forms/filtersets.py:1059 -#: dcim/forms/filtersets.py:1170 dcim/tables/devices.py:140 -#: dcim/tables/devices.py:817 dcim/tables/devices.py:1063 -#: dcim/tables/modules.py:69 dcim/tables/power.py:74 dcim/tables/racks.py:126 -#: dcim/tables/sites.py:82 dcim/tables/sites.py:138 -#: ipam/forms/bulk_edit.py:256 ipam/forms/bulk_edit.py:306 -#: ipam/forms/bulk_edit.py:354 ipam/forms/bulk_edit.py:506 -#: ipam/forms/bulk_import.py:192 ipam/forms/bulk_import.py:257 -#: ipam/forms/bulk_import.py:293 ipam/forms/bulk_import.py:450 -#: ipam/forms/filtersets.py:210 ipam/forms/filtersets.py:281 -#: ipam/forms/filtersets.py:355 ipam/forms/filtersets.py:501 -#: ipam/forms/model_forms.py:468 ipam/tables/ip.py:237 ipam/tables/ip.py:312 -#: ipam/tables/ip.py:363 ipam/tables/ip.py:426 ipam/tables/ip.py:453 -#: ipam/tables/vlans.py:126 ipam/tables/vlans.py:232 -#: templates/circuits/circuit.html:34 templates/core/datasource.html:46 -#: templates/core/job.html:48 templates/core/rq_task.html:81 -#: templates/core/system.html:18 templates/dcim/cable.html:19 -#: templates/dcim/device.html:178 templates/dcim/location.html:45 -#: templates/dcim/module.html:69 templates/dcim/powerfeed.html:36 -#: templates/dcim/rack.html:41 templates/dcim/site.html:43 -#: templates/extras/script_list.html:48 templates/ipam/ipaddress.html:37 -#: templates/ipam/iprange.html:54 templates/ipam/prefix.html:73 -#: templates/ipam/vlan.html:48 templates/virtualization/cluster.html:21 -#: templates/virtualization/virtualmachine.html:19 -#: templates/vpn/tunnel.html:25 templates/wireless/wirelesslan.html:22 -#: templates/wireless/wirelesslink.html:17 users/forms/filtersets.py:32 -#: users/forms/model_forms.py:194 virtualization/forms/bulk_edit.py:70 -#: virtualization/forms/bulk_edit.py:118 -#: virtualization/forms/bulk_import.py:54 -#: virtualization/forms/bulk_import.py:80 -#: virtualization/forms/filtersets.py:62 -#: virtualization/forms/filtersets.py:160 virtualization/tables/clusters.py:74 -#: virtualization/tables/virtualmachines.py:60 vpn/forms/bulk_edit.py:39 -#: vpn/forms/bulk_import.py:37 vpn/forms/filtersets.py:47 -#: vpn/tables/tunnels.py:48 wireless/forms/bulk_edit.py:43 -#: wireless/forms/bulk_edit.py:105 wireless/forms/bulk_import.py:43 -#: wireless/forms/bulk_import.py:84 wireless/forms/filtersets.py:49 -#: wireless/forms/filtersets.py:83 wireless/tables/wirelesslan.py:52 -#: wireless/tables/wirelesslink.py:20 +#: netbox/circuits/forms/bulk_edit.py:136 +#: netbox/circuits/forms/bulk_import.py:93 +#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 +#: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 +#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 +#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 +#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 +#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 +#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 +#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 +#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 +#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 +#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 +#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 +#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 +#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 +#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 +#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 +#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 +#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 +#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 +#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 +#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 +#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 +#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 +#: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 +#: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 +#: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 +#: netbox/templates/dcim/site.html:43 +#: netbox/templates/extras/script_list.html:48 +#: netbox/templates/ipam/ipaddress.html:37 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/vlan.html:48 +#: netbox/templates/virtualization/cluster.html:21 +#: netbox/templates/virtualization/virtualmachine.html:19 +#: netbox/templates/vpn/tunnel.html:25 +#: netbox/templates/wireless/wirelesslan.html:22 +#: netbox/templates/wireless/wirelesslink.html:17 +#: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 +#: netbox/virtualization/forms/bulk_edit.py:70 +#: netbox/virtualization/forms/bulk_edit.py:118 +#: netbox/virtualization/forms/bulk_import.py:54 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/virtualization/forms/filtersets.py:62 +#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/tables/clusters.py:74 +#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 +#: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 +#: netbox/wireless/forms/bulk_edit.py:43 +#: netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/bulk_import.py:43 +#: netbox/wireless/forms/bulk_import.py:84 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/tables/wirelesslan.py:52 +#: netbox/wireless/tables/wirelesslink.py:20 msgid "Status" msgstr "Статус" -#: circuits/forms/bulk_edit.py:142 circuits/forms/bulk_edit.py:233 -#: circuits/forms/bulk_import.py:98 circuits/forms/bulk_import.py:158 -#: circuits/forms/filtersets.py:119 circuits/forms/filtersets.py:241 -#: dcim/forms/bulk_edit.py:123 dcim/forms/bulk_edit.py:188 -#: dcim/forms/bulk_edit.py:347 dcim/forms/bulk_edit.py:462 -#: dcim/forms/bulk_edit.py:691 dcim/forms/bulk_edit.py:804 -#: dcim/forms/bulk_edit.py:1744 dcim/forms/bulk_import.py:107 -#: dcim/forms/bulk_import.py:152 dcim/forms/bulk_import.py:241 -#: dcim/forms/bulk_import.py:334 dcim/forms/bulk_import.py:479 -#: dcim/forms/bulk_import.py:1219 dcim/forms/bulk_import.py:1428 -#: dcim/forms/filtersets.py:173 dcim/forms/filtersets.py:205 -#: dcim/forms/filtersets.py:323 dcim/forms/filtersets.py:399 -#: dcim/forms/filtersets.py:420 dcim/forms/filtersets.py:722 -#: dcim/forms/filtersets.py:916 dcim/forms/filtersets.py:978 -#: dcim/forms/filtersets.py:1008 dcim/forms/filtersets.py:1130 -#: dcim/tables/power.py:88 extras/filtersets.py:612 -#: extras/forms/filtersets.py:323 extras/forms/filtersets.py:396 -#: ipam/forms/bulk_edit.py:43 ipam/forms/bulk_edit.py:68 -#: ipam/forms/bulk_edit.py:112 ipam/forms/bulk_edit.py:141 -#: ipam/forms/bulk_edit.py:166 ipam/forms/bulk_edit.py:251 -#: ipam/forms/bulk_edit.py:301 ipam/forms/bulk_edit.py:349 -#: ipam/forms/bulk_edit.py:501 ipam/forms/bulk_import.py:38 -#: ipam/forms/bulk_import.py:67 ipam/forms/bulk_import.py:95 -#: ipam/forms/bulk_import.py:115 ipam/forms/bulk_import.py:135 -#: ipam/forms/bulk_import.py:164 ipam/forms/bulk_import.py:250 -#: ipam/forms/bulk_import.py:286 ipam/forms/bulk_import.py:443 -#: ipam/forms/filtersets.py:48 ipam/forms/filtersets.py:68 -#: ipam/forms/filtersets.py:100 ipam/forms/filtersets.py:120 -#: ipam/forms/filtersets.py:143 ipam/forms/filtersets.py:174 -#: ipam/forms/filtersets.py:267 ipam/forms/filtersets.py:310 -#: ipam/forms/filtersets.py:469 ipam/tables/ip.py:456 ipam/tables/vlans.py:229 -#: templates/circuits/circuit.html:38 templates/circuits/circuitgroup.html:36 -#: templates/dcim/cable.html:23 templates/dcim/device.html:79 -#: templates/dcim/location.html:49 templates/dcim/powerfeed.html:44 -#: templates/dcim/rack.html:32 templates/dcim/rackreservation.html:49 -#: templates/dcim/site.html:47 templates/dcim/virtualdevicecontext.html:52 -#: templates/ipam/aggregate.html:30 templates/ipam/asn.html:33 -#: templates/ipam/asnrange.html:29 templates/ipam/ipaddress.html:28 -#: templates/ipam/iprange.html:58 templates/ipam/prefix.html:29 -#: templates/ipam/routetarget.html:17 templates/ipam/vlan.html:39 -#: templates/ipam/vrf.html:20 templates/tenancy/tenant.html:17 -#: templates/virtualization/cluster.html:33 -#: templates/virtualization/virtualmachine.html:39 templates/vpn/l2vpn.html:30 -#: templates/vpn/tunnel.html:49 templates/wireless/wirelesslan.html:34 -#: templates/wireless/wirelesslink.html:25 tenancy/forms/forms.py:25 -#: tenancy/forms/forms.py:48 tenancy/forms/model_forms.py:52 -#: tenancy/tables/columns.py:64 virtualization/forms/bulk_edit.py:76 -#: virtualization/forms/bulk_edit.py:155 -#: virtualization/forms/bulk_import.py:66 -#: virtualization/forms/bulk_import.py:115 -#: virtualization/forms/filtersets.py:47 -#: virtualization/forms/filtersets.py:105 vpn/forms/bulk_edit.py:59 -#: vpn/forms/bulk_edit.py:269 vpn/forms/bulk_import.py:59 -#: vpn/forms/bulk_import.py:258 vpn/forms/filtersets.py:214 -#: wireless/forms/bulk_edit.py:63 wireless/forms/bulk_edit.py:110 -#: wireless/forms/bulk_import.py:55 wireless/forms/bulk_import.py:97 -#: wireless/forms/filtersets.py:35 wireless/forms/filtersets.py:75 +#: netbox/circuits/forms/bulk_edit.py:142 +#: netbox/circuits/forms/bulk_edit.py:233 +#: netbox/circuits/forms/bulk_import.py:98 +#: netbox/circuits/forms/bulk_import.py:158 +#: netbox/circuits/forms/filtersets.py:119 +#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 +#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 +#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 +#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 +#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 +#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 +#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 +#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 +#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 +#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 +#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 +#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 +#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 +#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 +#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 +#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 +#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 +#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 +#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 +#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 +#: netbox/templates/dcim/location.html:49 +#: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 +#: netbox/templates/dcim/rackreservation.html:49 +#: netbox/templates/dcim/site.html:47 +#: netbox/templates/dcim/virtualdevicecontext.html:52 +#: netbox/templates/ipam/aggregate.html:30 netbox/templates/ipam/asn.html:33 +#: netbox/templates/ipam/asnrange.html:29 +#: netbox/templates/ipam/ipaddress.html:28 +#: netbox/templates/ipam/iprange.html:58 netbox/templates/ipam/prefix.html:29 +#: netbox/templates/ipam/routetarget.html:17 +#: netbox/templates/ipam/vlan.html:39 netbox/templates/ipam/vrf.html:20 +#: netbox/templates/tenancy/tenant.html:17 +#: netbox/templates/virtualization/cluster.html:33 +#: netbox/templates/virtualization/virtualmachine.html:39 +#: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 +#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslink.html:25 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 +#: netbox/virtualization/forms/bulk_edit.py:76 +#: netbox/virtualization/forms/bulk_edit.py:155 +#: netbox/virtualization/forms/bulk_import.py:66 +#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/virtualization/forms/filtersets.py:47 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 +#: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 +#: netbox/wireless/forms/bulk_edit.py:110 +#: netbox/wireless/forms/bulk_import.py:55 +#: netbox/wireless/forms/bulk_import.py:97 +#: netbox/wireless/forms/filtersets.py:35 +#: netbox/wireless/forms/filtersets.py:75 msgid "Tenant" msgstr "Орендар" -#: circuits/forms/bulk_edit.py:147 circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:147 +#: netbox/circuits/forms/filtersets.py:174 msgid "Install date" msgstr "Дата встановлення" -#: circuits/forms/bulk_edit.py:152 circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:152 +#: netbox/circuits/forms/filtersets.py:179 msgid "Termination date" msgstr "Дата припинення дії" -#: circuits/forms/bulk_edit.py:158 circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:158 +#: netbox/circuits/forms/filtersets.py:186 msgid "Commit rate (Kbps)" msgstr "Гарантована мінімальна швидкість (Кбіт/с)" -#: circuits/forms/bulk_edit.py:173 circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:173 +#: netbox/circuits/forms/model_forms.py:112 msgid "Service Parameters" msgstr "Параметри обслуговування" -#: circuits/forms/bulk_edit.py:174 circuits/forms/model_forms.py:113 -#: circuits/forms/model_forms.py:183 dcim/forms/model_forms.py:139 -#: dcim/forms/model_forms.py:181 dcim/forms/model_forms.py:266 -#: dcim/forms/model_forms.py:323 dcim/forms/model_forms.py:768 -#: dcim/forms/model_forms.py:1692 ipam/forms/model_forms.py:64 -#: ipam/forms/model_forms.py:81 ipam/forms/model_forms.py:115 -#: ipam/forms/model_forms.py:136 ipam/forms/model_forms.py:160 -#: ipam/forms/model_forms.py:232 ipam/forms/model_forms.py:261 -#: ipam/forms/model_forms.py:316 netbox/navigation/menu.py:24 -#: templates/dcim/device_edit.html:85 templates/dcim/htmx/cable_edit.html:72 -#: templates/ipam/ipaddress_bulk_add.html:27 templates/ipam/vlan_edit.html:22 -#: virtualization/forms/model_forms.py:80 -#: virtualization/forms/model_forms.py:222 vpn/forms/bulk_edit.py:78 -#: vpn/forms/filtersets.py:44 vpn/forms/model_forms.py:62 -#: vpn/forms/model_forms.py:147 vpn/forms/model_forms.py:411 -#: wireless/forms/model_forms.py:54 wireless/forms/model_forms.py:170 +#: netbox/circuits/forms/bulk_edit.py:174 +#: netbox/circuits/forms/model_forms.py:113 +#: netbox/circuits/forms/model_forms.py:183 +#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 +#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 +#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 +#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 +#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 +#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 +#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/netbox/navigation/menu.py:24 +#: netbox/templates/dcim/device_edit.html:85 +#: netbox/templates/dcim/htmx/cable_edit.html:72 +#: netbox/templates/ipam/ipaddress_bulk_add.html:27 +#: netbox/templates/ipam/vlan_edit.html:22 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 +#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 +#: netbox/wireless/forms/model_forms.py:170 msgid "Tenancy" msgstr "Оренда" -#: circuits/forms/bulk_edit.py:193 circuits/forms/bulk_edit.py:217 -#: circuits/forms/model_forms.py:155 circuits/tables/circuits.py:117 -#: templates/circuits/inc/circuit_termination_fields.html:62 -#: templates/circuits/providernetwork.html:17 +#: netbox/circuits/forms/bulk_edit.py:193 +#: netbox/circuits/forms/bulk_edit.py:217 +#: netbox/circuits/forms/model_forms.py:155 +#: netbox/circuits/tables/circuits.py:117 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 +#: netbox/templates/circuits/providernetwork.html:17 msgid "Provider Network" msgstr "Мережа провайдера" -#: circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:199 msgid "Port speed (Kbps)" msgstr "Швидкість порту (Кбіт/с)" -#: circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:203 msgid "Upstream speed (Kbps)" msgstr "Швидкість висхідного потоку (Кбіт/с)" -#: circuits/forms/bulk_edit.py:206 dcim/forms/bulk_edit.py:961 -#: dcim/forms/bulk_edit.py:1325 dcim/forms/bulk_edit.py:1342 -#: dcim/forms/bulk_edit.py:1359 dcim/forms/bulk_edit.py:1377 -#: dcim/forms/bulk_edit.py:1472 dcim/forms/bulk_edit.py:1632 -#: dcim/forms/bulk_edit.py:1649 +#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 +#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 +#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 +#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 +#: netbox/dcim/forms/bulk_edit.py:1654 msgid "Mark connected" msgstr "Позначити з'єднаним" -#: circuits/forms/bulk_edit.py:219 circuits/forms/model_forms.py:157 -#: templates/circuits/inc/circuit_termination_fields.html:54 -#: templates/dcim/frontport.html:121 templates/dcim/interface.html:193 -#: templates/dcim/rearport.html:111 +#: netbox/circuits/forms/bulk_edit.py:219 +#: netbox/circuits/forms/model_forms.py:157 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/templates/dcim/frontport.html:121 +#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "Кінець каналу зв'язку" -#: circuits/forms/bulk_edit.py:221 circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:221 +#: netbox/circuits/forms/model_forms.py:159 msgid "Termination Details" msgstr "Деталі кінця" -#: circuits/forms/bulk_edit.py:251 circuits/forms/filtersets.py:268 -#: circuits/tables/circuits.py:168 dcim/forms/model_forms.py:551 -#: templates/circuits/circuitgroupassignment.html:30 -#: templates/dcim/device.html:133 templates/dcim/virtualchassis.html:68 -#: templates/dcim/virtualchassis_edit.html:56 -#: templates/ipam/inc/panels/fhrp_groups.html:26 -#: tenancy/forms/bulk_edit.py:147 tenancy/forms/filtersets.py:110 +#: netbox/circuits/forms/bulk_edit.py:251 +#: netbox/circuits/forms/filtersets.py:268 +#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 +#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/templates/dcim/device.html:133 +#: netbox/templates/dcim/virtualchassis.html:68 +#: netbox/templates/dcim/virtualchassis_edit.html:56 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:26 +#: netbox/tenancy/forms/bulk_edit.py:147 +#: netbox/tenancy/forms/filtersets.py:110 msgid "Priority" msgstr "Пріоритет" -#: circuits/forms/bulk_import.py:39 circuits/forms/bulk_import.py:54 -#: circuits/forms/bulk_import.py:77 +#: netbox/circuits/forms/bulk_import.py:39 +#: netbox/circuits/forms/bulk_import.py:54 +#: netbox/circuits/forms/bulk_import.py:77 msgid "Assigned provider" msgstr "Призначений провайдер" -#: circuits/forms/bulk_import.py:83 +#: netbox/circuits/forms/bulk_import.py:83 msgid "Assigned provider account" msgstr "Призначений обліковий запис провайдера" -#: circuits/forms/bulk_import.py:90 +#: netbox/circuits/forms/bulk_import.py:90 msgid "Type of circuit" msgstr "Тип каналу зв'язку" -#: circuits/forms/bulk_import.py:95 dcim/forms/bulk_import.py:90 -#: dcim/forms/bulk_import.py:149 dcim/forms/bulk_import.py:250 -#: dcim/forms/bulk_import.py:507 dcim/forms/bulk_import.py:661 -#: dcim/forms/bulk_import.py:1373 ipam/forms/bulk_import.py:194 -#: ipam/forms/bulk_import.py:259 ipam/forms/bulk_import.py:295 -#: ipam/forms/bulk_import.py:452 virtualization/forms/bulk_import.py:56 -#: virtualization/forms/bulk_import.py:82 vpn/forms/bulk_import.py:39 -#: wireless/forms/bulk_import.py:45 +#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 +#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 +#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 +#: netbox/ipam/forms/bulk_import.py:476 +#: netbox/virtualization/forms/bulk_import.py:56 +#: netbox/virtualization/forms/bulk_import.py:82 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 msgid "Operational status" msgstr "Операційний стан" -#: circuits/forms/bulk_import.py:102 circuits/forms/bulk_import.py:162 -#: dcim/forms/bulk_import.py:111 dcim/forms/bulk_import.py:156 -#: dcim/forms/bulk_import.py:338 dcim/forms/bulk_import.py:483 -#: dcim/forms/bulk_import.py:1223 dcim/forms/bulk_import.py:1368 -#: dcim/forms/bulk_import.py:1432 ipam/forms/bulk_import.py:42 -#: ipam/forms/bulk_import.py:71 ipam/forms/bulk_import.py:99 -#: ipam/forms/bulk_import.py:119 ipam/forms/bulk_import.py:139 -#: ipam/forms/bulk_import.py:168 ipam/forms/bulk_import.py:254 -#: ipam/forms/bulk_import.py:290 ipam/forms/bulk_import.py:447 -#: virtualization/forms/bulk_import.py:70 -#: virtualization/forms/bulk_import.py:119 vpn/forms/bulk_import.py:63 -#: wireless/forms/bulk_import.py:59 wireless/forms/bulk_import.py:101 +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:162 +#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 +#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 +#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 +#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 +#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 +#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 +#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 +#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 +#: netbox/virtualization/forms/bulk_import.py:70 +#: netbox/virtualization/forms/bulk_import.py:119 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 +#: netbox/wireless/forms/bulk_import.py:101 msgid "Assigned tenant" msgstr "Призначений орендар" -#: circuits/forms/bulk_import.py:120 -#: templates/circuits/inc/circuit_termination.html:6 -#: templates/circuits/inc/circuit_termination_fields.html:15 -#: templates/dcim/cable.html:68 templates/dcim/cable.html:72 -#: vpn/forms/bulk_import.py:100 vpn/forms/filtersets.py:77 +#: netbox/circuits/forms/bulk_import.py:120 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 msgid "Termination" msgstr "Кінець" -#: circuits/forms/bulk_import.py:130 circuits/forms/filtersets.py:147 -#: circuits/forms/filtersets.py:227 circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_import.py:130 +#: netbox/circuits/forms/filtersets.py:147 +#: netbox/circuits/forms/filtersets.py:227 +#: netbox/circuits/forms/model_forms.py:144 msgid "Provider network" msgstr "Мережа провайдера" -#: circuits/forms/filtersets.py:30 circuits/forms/filtersets.py:118 -#: circuits/forms/filtersets.py:200 dcim/forms/bulk_edit.py:339 -#: dcim/forms/bulk_edit.py:442 dcim/forms/bulk_edit.py:683 -#: dcim/forms/bulk_edit.py:738 dcim/forms/bulk_edit.py:892 -#: dcim/forms/bulk_import.py:235 dcim/forms/bulk_import.py:315 -#: dcim/forms/bulk_import.py:546 dcim/forms/bulk_import.py:1317 -#: dcim/forms/bulk_import.py:1351 dcim/forms/filtersets.py:95 -#: dcim/forms/filtersets.py:322 dcim/forms/filtersets.py:356 -#: dcim/forms/filtersets.py:396 dcim/forms/filtersets.py:447 -#: dcim/forms/filtersets.py:719 dcim/forms/filtersets.py:762 -#: dcim/forms/filtersets.py:977 dcim/forms/filtersets.py:1006 -#: dcim/forms/filtersets.py:1026 dcim/forms/filtersets.py:1090 -#: dcim/forms/filtersets.py:1120 dcim/forms/filtersets.py:1129 -#: dcim/forms/filtersets.py:1240 dcim/forms/filtersets.py:1264 -#: dcim/forms/filtersets.py:1289 dcim/forms/filtersets.py:1308 -#: dcim/forms/filtersets.py:1331 dcim/forms/filtersets.py:1442 -#: dcim/forms/filtersets.py:1466 dcim/forms/filtersets.py:1490 -#: dcim/forms/filtersets.py:1508 dcim/forms/filtersets.py:1525 -#: dcim/forms/model_forms.py:180 dcim/forms/model_forms.py:243 -#: dcim/forms/model_forms.py:468 dcim/forms/model_forms.py:728 -#: dcim/tables/devices.py:157 dcim/tables/power.py:30 dcim/tables/racks.py:118 -#: dcim/tables/racks.py:212 extras/filtersets.py:536 -#: extras/forms/filtersets.py:320 ipam/forms/filtersets.py:173 -#: ipam/forms/filtersets.py:414 ipam/forms/filtersets.py:437 -#: ipam/forms/filtersets.py:467 templates/dcim/device.html:26 -#: templates/dcim/device_edit.html:30 -#: templates/dcim/inc/cable_termination.html:12 -#: templates/dcim/location.html:26 templates/dcim/powerpanel.html:26 -#: templates/dcim/rack.html:24 templates/dcim/rackreservation.html:32 -#: virtualization/forms/filtersets.py:46 -#: virtualization/forms/filtersets.py:100 wireless/forms/model_forms.py:87 -#: wireless/forms/model_forms.py:129 +#: netbox/circuits/forms/filtersets.py:30 +#: netbox/circuits/forms/filtersets.py:118 +#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 +#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 +#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 +#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 +#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 +#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 +#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 +#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 +#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 +#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 +#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 +#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 +#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 +#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 +#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 +#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 +#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 +#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 +#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 +#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 +#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/templates/dcim/device.html:26 +#: netbox/templates/dcim/device_edit.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:12 +#: netbox/templates/dcim/location.html:26 +#: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 +#: netbox/templates/dcim/rackreservation.html:32 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/filtersets.py:100 +#: netbox/wireless/forms/model_forms.py:87 +#: netbox/wireless/forms/model_forms.py:129 msgid "Location" msgstr "Розташування" -#: circuits/forms/filtersets.py:32 circuits/forms/filtersets.py:120 -#: dcim/forms/filtersets.py:144 dcim/forms/filtersets.py:158 -#: dcim/forms/filtersets.py:174 dcim/forms/filtersets.py:206 -#: dcim/forms/filtersets.py:328 dcim/forms/filtersets.py:400 -#: dcim/forms/filtersets.py:471 dcim/forms/filtersets.py:723 -#: dcim/forms/filtersets.py:1091 netbox/navigation/menu.py:31 -#: netbox/navigation/menu.py:33 tenancy/forms/filtersets.py:42 -#: tenancy/tables/columns.py:70 tenancy/tables/contacts.py:25 -#: tenancy/views.py:19 virtualization/forms/filtersets.py:37 -#: virtualization/forms/filtersets.py:48 -#: virtualization/forms/filtersets.py:106 +#: netbox/circuits/forms/filtersets.py:32 +#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 +#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 +#: netbox/virtualization/forms/filtersets.py:37 +#: netbox/virtualization/forms/filtersets.py:48 +#: netbox/virtualization/forms/filtersets.py:106 msgid "Contacts" msgstr "Контакти" -#: circuits/forms/filtersets.py:37 circuits/forms/filtersets.py:157 -#: dcim/forms/bulk_edit.py:113 dcim/forms/bulk_edit.py:314 -#: dcim/forms/bulk_edit.py:867 dcim/forms/bulk_import.py:93 -#: dcim/forms/filtersets.py:73 dcim/forms/filtersets.py:185 -#: dcim/forms/filtersets.py:211 dcim/forms/filtersets.py:334 -#: dcim/forms/filtersets.py:425 dcim/forms/filtersets.py:739 -#: dcim/forms/filtersets.py:983 dcim/forms/filtersets.py:1013 -#: dcim/forms/filtersets.py:1097 dcim/forms/filtersets.py:1136 -#: dcim/forms/filtersets.py:1576 dcim/forms/filtersets.py:1600 -#: dcim/forms/filtersets.py:1624 dcim/forms/model_forms.py:112 -#: dcim/forms/object_create.py:375 dcim/tables/devices.py:143 -#: dcim/tables/sites.py:85 extras/filtersets.py:503 -#: ipam/forms/bulk_edit.py:208 ipam/forms/bulk_edit.py:474 -#: ipam/forms/filtersets.py:217 ipam/forms/filtersets.py:422 -#: ipam/forms/filtersets.py:475 templates/dcim/device.html:18 -#: templates/dcim/rack.html:16 templates/dcim/rackreservation.html:22 -#: templates/dcim/region.html:26 templates/dcim/site.html:31 -#: templates/ipam/prefix.html:49 templates/ipam/vlan.html:16 -#: virtualization/forms/bulk_edit.py:81 virtualization/forms/filtersets.py:59 -#: virtualization/forms/filtersets.py:133 -#: virtualization/forms/model_forms.py:92 vpn/forms/filtersets.py:257 +#: netbox/circuits/forms/filtersets.py:37 +#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 +#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 +#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 +#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 +#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 +#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 +#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 +#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 +#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 +#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 +#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 +#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 +#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/templates/dcim/rackreservation.html:22 +#: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 +#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 +#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/virtualization/forms/filtersets.py:59 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:92 +#: netbox/vpn/forms/filtersets.py:257 msgid "Region" msgstr "Регіон" -#: circuits/forms/filtersets.py:42 circuits/forms/filtersets.py:162 -#: dcim/forms/bulk_edit.py:322 dcim/forms/bulk_edit.py:875 -#: dcim/forms/filtersets.py:78 dcim/forms/filtersets.py:190 -#: dcim/forms/filtersets.py:216 dcim/forms/filtersets.py:347 -#: dcim/forms/filtersets.py:430 dcim/forms/filtersets.py:744 -#: dcim/forms/filtersets.py:988 dcim/forms/filtersets.py:1102 -#: dcim/forms/filtersets.py:1141 dcim/forms/object_create.py:383 -#: extras/filtersets.py:520 ipam/forms/bulk_edit.py:213 -#: ipam/forms/bulk_edit.py:479 ipam/forms/filtersets.py:222 -#: ipam/forms/filtersets.py:427 ipam/forms/filtersets.py:480 -#: virtualization/forms/bulk_edit.py:86 virtualization/forms/filtersets.py:69 -#: virtualization/forms/filtersets.py:138 -#: virtualization/forms/model_forms.py:98 +#: netbox/circuits/forms/filtersets.py:42 +#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 +#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 +#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 +#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 +#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 +#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 +#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 +#: netbox/ipam/forms/filtersets.py:480 +#: netbox/virtualization/forms/bulk_edit.py:86 +#: netbox/virtualization/forms/filtersets.py:69 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:98 msgid "Site group" msgstr "Група тех. майданчиків" -#: circuits/forms/filtersets.py:65 circuits/forms/filtersets.py:83 -#: circuits/forms/filtersets.py:102 circuits/forms/filtersets.py:117 -#: core/forms/filtersets.py:67 core/forms/filtersets.py:135 -#: dcim/forms/bulk_edit.py:838 dcim/forms/filtersets.py:172 -#: dcim/forms/filtersets.py:204 dcim/forms/filtersets.py:915 -#: dcim/forms/filtersets.py:1007 dcim/forms/filtersets.py:1131 -#: dcim/forms/filtersets.py:1239 dcim/forms/filtersets.py:1263 -#: dcim/forms/filtersets.py:1288 dcim/forms/filtersets.py:1307 -#: dcim/forms/filtersets.py:1327 dcim/forms/filtersets.py:1441 -#: dcim/forms/filtersets.py:1465 dcim/forms/filtersets.py:1489 -#: dcim/forms/filtersets.py:1507 dcim/forms/filtersets.py:1523 -#: extras/forms/bulk_edit.py:90 extras/forms/filtersets.py:44 -#: extras/forms/filtersets.py:134 extras/forms/filtersets.py:165 -#: extras/forms/filtersets.py:205 extras/forms/filtersets.py:221 -#: extras/forms/filtersets.py:252 extras/forms/filtersets.py:276 -#: extras/forms/filtersets.py:441 ipam/forms/filtersets.py:99 -#: ipam/forms/filtersets.py:266 ipam/forms/filtersets.py:307 -#: ipam/forms/filtersets.py:382 ipam/forms/filtersets.py:468 -#: ipam/forms/filtersets.py:527 ipam/forms/filtersets.py:545 -#: netbox/tables/tables.py:256 virtualization/forms/filtersets.py:45 -#: virtualization/forms/filtersets.py:103 -#: virtualization/forms/filtersets.py:198 -#: virtualization/forms/filtersets.py:243 vpn/forms/filtersets.py:213 -#: wireless/forms/bulk_edit.py:150 wireless/forms/filtersets.py:34 -#: wireless/forms/filtersets.py:74 +#: netbox/circuits/forms/filtersets.py:65 +#: netbox/circuits/forms/filtersets.py:83 +#: netbox/circuits/forms/filtersets.py:102 +#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 +#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 +#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 +#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 +#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 +#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 +#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 +#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 +#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 +#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 +#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:103 +#: netbox/virtualization/forms/filtersets.py:198 +#: netbox/virtualization/forms/filtersets.py:243 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 +#: netbox/wireless/forms/filtersets.py:34 +#: netbox/wireless/forms/filtersets.py:74 msgid "Attributes" msgstr "Атрибути" -#: circuits/forms/filtersets.py:73 circuits/tables/circuits.py:63 -#: circuits/tables/providers.py:66 templates/circuits/circuit.html:22 -#: templates/circuits/provideraccount.html:24 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/tables/providers.py:66 +#: netbox/templates/circuits/circuit.html:22 +#: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "Обліковий запис" -#: circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:217 msgid "Term Side" msgstr "Сторона завершення" -#: circuits/forms/filtersets.py:250 dcim/forms/bulk_edit.py:1552 -#: extras/forms/model_forms.py:582 ipam/forms/filtersets.py:142 -#: ipam/forms/filtersets.py:546 ipam/forms/model_forms.py:323 -#: templates/extras/configcontext.html:60 templates/ipam/ipaddress.html:59 -#: templates/ipam/vlan_edit.html:30 tenancy/forms/filtersets.py:87 -#: users/forms/model_forms.py:314 +#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 +#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/templates/extras/configcontext.html:60 +#: netbox/templates/ipam/ipaddress.html:59 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "Призначення" -#: circuits/forms/filtersets.py:265 circuits/forms/model_forms.py:195 -#: circuits/tables/circuits.py:155 dcim/forms/bulk_edit.py:118 -#: dcim/forms/bulk_import.py:100 dcim/forms/model_forms.py:117 -#: dcim/tables/sites.py:89 extras/forms/filtersets.py:480 -#: ipam/filtersets.py:999 ipam/forms/bulk_edit.py:493 -#: ipam/forms/bulk_import.py:436 ipam/forms/model_forms.py:528 -#: ipam/tables/fhrp.py:67 ipam/tables/vlans.py:122 ipam/tables/vlans.py:226 -#: templates/circuits/circuitgroupassignment.html:22 -#: templates/dcim/interface.html:284 templates/dcim/site.html:37 -#: templates/ipam/inc/panels/fhrp_groups.html:23 templates/ipam/vlan.html:27 -#: templates/tenancy/contact.html:21 templates/tenancy/tenant.html:20 -#: templates/users/group.html:6 templates/users/group.html:14 -#: templates/virtualization/cluster.html:29 templates/vpn/tunnel.html:29 -#: templates/wireless/wirelesslan.html:18 tenancy/forms/bulk_edit.py:43 -#: tenancy/forms/bulk_edit.py:94 tenancy/forms/bulk_import.py:40 -#: tenancy/forms/bulk_import.py:81 tenancy/forms/filtersets.py:48 -#: tenancy/forms/filtersets.py:78 tenancy/forms/filtersets.py:97 -#: tenancy/forms/model_forms.py:45 tenancy/forms/model_forms.py:97 -#: tenancy/forms/model_forms.py:122 tenancy/tables/contacts.py:60 -#: tenancy/tables/contacts.py:107 tenancy/tables/tenants.py:42 -#: users/filtersets.py:62 users/filtersets.py:185 users/forms/filtersets.py:31 -#: users/forms/filtersets.py:37 users/forms/filtersets.py:79 -#: virtualization/forms/bulk_edit.py:65 virtualization/forms/bulk_import.py:47 -#: virtualization/forms/filtersets.py:85 -#: virtualization/forms/model_forms.py:66 virtualization/tables/clusters.py:70 -#: vpn/forms/bulk_edit.py:112 vpn/forms/bulk_import.py:158 -#: vpn/forms/filtersets.py:116 vpn/tables/crypto.py:31 -#: vpn/tables/tunnels.py:44 wireless/forms/bulk_edit.py:48 -#: wireless/forms/bulk_import.py:36 wireless/forms/filtersets.py:46 -#: wireless/forms/model_forms.py:40 wireless/tables/wirelesslan.py:48 +#: netbox/circuits/forms/filtersets.py:265 +#: netbox/circuits/forms/model_forms.py:195 +#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 +#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 +#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 +#: netbox/ipam/tables/vlans.py:226 +#: netbox/templates/circuits/circuitgroupassignment.html:22 +#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 +#: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 +#: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 +#: netbox/templates/users/group.html:14 +#: netbox/templates/virtualization/cluster.html:29 +#: netbox/templates/vpn/tunnel.html:29 +#: netbox/templates/wireless/wirelesslan.html:18 +#: netbox/tenancy/forms/bulk_edit.py:43 netbox/tenancy/forms/bulk_edit.py:94 +#: netbox/tenancy/forms/bulk_import.py:40 +#: netbox/tenancy/forms/bulk_import.py:81 +#: netbox/tenancy/forms/filtersets.py:48 netbox/tenancy/forms/filtersets.py:78 +#: netbox/tenancy/forms/filtersets.py:97 +#: netbox/tenancy/forms/model_forms.py:45 +#: netbox/tenancy/forms/model_forms.py:97 +#: netbox/tenancy/forms/model_forms.py:122 +#: netbox/tenancy/tables/contacts.py:60 netbox/tenancy/tables/contacts.py:107 +#: netbox/tenancy/tables/tenants.py:42 netbox/users/filtersets.py:62 +#: netbox/users/filtersets.py:185 netbox/users/forms/filtersets.py:31 +#: netbox/users/forms/filtersets.py:37 netbox/users/forms/filtersets.py:79 +#: netbox/virtualization/forms/bulk_edit.py:65 +#: netbox/virtualization/forms/bulk_import.py:47 +#: netbox/virtualization/forms/filtersets.py:85 +#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/tables/clusters.py:70 +#: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 +#: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 +#: netbox/wireless/forms/bulk_import.py:36 +#: netbox/wireless/forms/filtersets.py:46 +#: netbox/wireless/forms/model_forms.py:40 +#: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "Група" -#: circuits/forms/model_forms.py:182 templates/circuits/circuitgroup.html:25 +#: netbox/circuits/forms/model_forms.py:182 +#: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "Група каналів зв'язку" -#: circuits/models/circuits.py:27 dcim/models/cables.py:67 -#: dcim/models/device_component_templates.py:517 -#: dcim/models/device_component_templates.py:617 -#: dcim/models/device_components.py:975 dcim/models/device_components.py:1049 -#: dcim/models/device_components.py:1204 dcim/models/devices.py:479 -#: dcim/models/racks.py:224 extras/models/tags.py:28 +#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:517 +#: netbox/dcim/models/device_component_templates.py:617 +#: netbox/dcim/models/device_components.py:975 +#: netbox/dcim/models/device_components.py:1049 +#: netbox/dcim/models/device_components.py:1204 +#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/extras/models/tags.py:28 msgid "color" msgstr "колір" -#: circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:36 msgid "circuit type" msgstr "тип каналу зв'язку" -#: circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:37 msgid "circuit types" msgstr "типи каналів зв'язку" -#: circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:48 msgid "circuit ID" msgstr "ідентифікатор каналу зв'язку" -#: circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:49 msgid "Unique circuit ID" msgstr "Унікальний ідентифікатор каналу зв'язку" -#: circuits/models/circuits.py:69 core/models/data.py:52 -#: core/models/jobs.py:84 dcim/models/cables.py:49 dcim/models/devices.py:653 -#: dcim/models/devices.py:1173 dcim/models/devices.py:1399 -#: dcim/models/power.py:96 dcim/models/racks.py:297 dcim/models/sites.py:154 -#: dcim/models/sites.py:266 ipam/models/ip.py:253 ipam/models/ip.py:522 -#: ipam/models/ip.py:730 ipam/models/vlans.py:211 -#: virtualization/models/clusters.py:74 -#: virtualization/models/virtualmachines.py:84 vpn/models/tunnels.py:40 -#: wireless/models.py:95 wireless/models.py:159 +#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 +#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 +#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 +#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 +#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 +#: netbox/virtualization/models/virtualmachines.py:84 +#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:159 msgid "status" msgstr "статус" -#: circuits/models/circuits.py:84 templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "встановлено" -#: circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:89 msgid "terminates" msgstr "припинється" -#: circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:94 msgid "commit rate (Kbps)" msgstr "гарантована швидкість (Кбіт/с)" -#: circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:95 msgid "Committed rate" msgstr "Гарантована швидкість" -#: circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:137 msgid "circuit" msgstr "канал зв'язку" -#: circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:138 msgid "circuits" msgstr "канали зв'язку" -#: circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:170 msgid "circuit group" msgstr "група каналів зв'язку" -#: circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:171 msgid "circuit groups" msgstr "групи каналів зв'язку" -#: circuits/models/circuits.py:195 ipam/models/fhrp.py:93 -#: tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 +#: netbox/tenancy/models/contacts.py:134 msgid "priority" msgstr "пріоритет" -#: circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:213 msgid "Circuit group assignment" msgstr "Призначення групи каналів зв'язку" -#: circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:214 msgid "Circuit group assignments" msgstr "Призначення групи каналів зв'язку" -#: circuits/models/circuits.py:240 +#: netbox/circuits/models/circuits.py:240 msgid "termination" msgstr "кінець" -#: circuits/models/circuits.py:257 +#: netbox/circuits/models/circuits.py:257 msgid "port speed (Kbps)" msgstr "швидкість порту (Кбіт/с)" -#: circuits/models/circuits.py:260 +#: netbox/circuits/models/circuits.py:260 msgid "Physical circuit speed" msgstr "Фізична швидкість каналу зв'язку" -#: circuits/models/circuits.py:265 +#: netbox/circuits/models/circuits.py:265 msgid "upstream speed (Kbps)" msgstr "швидкість висхідного потоку (Кбіт/с)" -#: circuits/models/circuits.py:266 +#: netbox/circuits/models/circuits.py:266 msgid "Upstream speed, if different from port speed" msgstr "" "Швидкість висхідного потоку, якщо вона відрізняється від швидкості порту" -#: circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:271 msgid "cross-connect ID" msgstr "ідентифікатор перехресного з'єднання" -#: circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:272 msgid "ID of the local cross-connect" msgstr "Ідентифікатор локального перехресного з'єднання" -#: circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:277 msgid "patch panel/port(s)" msgstr "патч-панель/порт(и)" -#: circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:278 msgid "Patch panel ID and port number(s)" msgstr "Ідентифікатор патч-панелі та номер(и) порту" -#: circuits/models/circuits.py:281 -#: dcim/models/device_component_templates.py:61 -#: dcim/models/device_components.py:68 dcim/models/racks.py:685 -#: extras/models/configs.py:45 extras/models/configs.py:219 -#: extras/models/customfields.py:125 extras/models/models.py:61 -#: extras/models/models.py:158 extras/models/models.py:396 -#: extras/models/models.py:511 extras/models/notifications.py:131 -#: extras/models/staging.py:31 extras/models/tags.py:32 -#: netbox/models/__init__.py:110 netbox/models/__init__.py:145 -#: netbox/models/__init__.py:191 users/models/permissions.py:24 -#: users/models/tokens.py:57 users/models/users.py:33 -#: virtualization/models/virtualmachines.py:289 +#: netbox/circuits/models/circuits.py:281 +#: netbox/dcim/models/device_component_templates.py:61 +#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 +#: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 +#: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 +#: netbox/extras/models/models.py:511 +#: netbox/extras/models/notifications.py:131 +#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 +#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 +#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:289 msgid "description" msgstr "опис" -#: circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:294 msgid "circuit termination" msgstr "кінець каналу зв'язку" -#: circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:295 msgid "circuit terminations" msgstr "кінці каналу зв'язку" -#: circuits/models/circuits.py:308 +#: netbox/circuits/models/circuits.py:308 msgid "" "A circuit termination must attach to either a site or a provider network." msgstr "" "Кінець каналу зв'язку повинно приєднатися або до тех. майданчику, або до " "мережі провайдера." -#: circuits/models/circuits.py:310 +#: netbox/circuits/models/circuits.py:310 msgid "" "A circuit termination cannot attach to both a site and a provider network." msgstr "" "Обідви кінці каналу зв'язку не може приєднатися як до тех. майданчику, так і" " до мережі провайдера." -#: circuits/models/providers.py:22 circuits/models/providers.py:66 -#: circuits/models/providers.py:104 core/models/data.py:39 -#: core/models/jobs.py:45 dcim/models/device_component_templates.py:43 -#: dcim/models/device_components.py:53 dcim/models/devices.py:593 -#: dcim/models/devices.py:1330 dcim/models/devices.py:1395 -#: dcim/models/power.py:39 dcim/models/power.py:92 dcim/models/racks.py:262 -#: dcim/models/sites.py:138 extras/models/configs.py:36 -#: extras/models/configs.py:215 extras/models/customfields.py:92 -#: extras/models/models.py:56 extras/models/models.py:153 -#: extras/models/models.py:296 extras/models/models.py:392 -#: extras/models/models.py:501 extras/models/models.py:596 -#: extras/models/notifications.py:126 extras/models/scripts.py:30 -#: extras/models/staging.py:26 ipam/models/asns.py:18 ipam/models/fhrp.py:25 -#: ipam/models/services.py:52 ipam/models/services.py:88 -#: ipam/models/vlans.py:36 ipam/models/vlans.py:200 ipam/models/vrfs.py:22 -#: ipam/models/vrfs.py:79 netbox/models/__init__.py:137 -#: netbox/models/__init__.py:181 tenancy/models/contacts.py:64 -#: tenancy/models/tenants.py:20 tenancy/models/tenants.py:45 -#: users/models/permissions.py:20 users/models/users.py:28 -#: virtualization/models/clusters.py:57 -#: virtualization/models/virtualmachines.py:72 -#: virtualization/models/virtualmachines.py:279 vpn/models/crypto.py:24 -#: vpn/models/crypto.py:71 vpn/models/crypto.py:131 vpn/models/crypto.py:183 -#: vpn/models/crypto.py:221 vpn/models/l2vpn.py:22 vpn/models/tunnels.py:35 -#: wireless/models.py:51 +#: netbox/circuits/models/providers.py:22 +#: netbox/circuits/models/providers.py:66 +#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/core/models/jobs.py:46 +#: netbox/dcim/models/device_component_templates.py:43 +#: netbox/dcim/models/device_components.py:53 +#: netbox/dcim/models/devices.py:593 netbox/dcim/models/devices.py:1335 +#: netbox/dcim/models/devices.py:1400 netbox/dcim/models/power.py:39 +#: netbox/dcim/models/power.py:92 netbox/dcim/models/racks.py:262 +#: netbox/dcim/models/sites.py:138 netbox/extras/models/configs.py:36 +#: netbox/extras/models/configs.py:215 netbox/extras/models/customfields.py:92 +#: netbox/extras/models/models.py:56 netbox/extras/models/models.py:153 +#: netbox/extras/models/models.py:296 netbox/extras/models/models.py:392 +#: netbox/extras/models/models.py:501 netbox/extras/models/models.py:596 +#: netbox/extras/models/notifications.py:126 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 +#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 +#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 +#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 +#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 +#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 +#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 +#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 +#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 +#: netbox/virtualization/models/virtualmachines.py:72 +#: netbox/virtualization/models/virtualmachines.py:279 +#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 +#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 +#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 +#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 msgid "name" msgstr "назва" -#: circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:25 msgid "Full name of the provider" msgstr "Повна назва провайдера" -#: circuits/models/providers.py:28 dcim/models/devices.py:86 -#: dcim/models/racks.py:137 dcim/models/sites.py:149 -#: extras/models/models.py:506 ipam/models/asns.py:23 ipam/models/vlans.py:40 -#: netbox/models/__init__.py:141 netbox/models/__init__.py:186 -#: tenancy/models/tenants.py:25 tenancy/models/tenants.py:49 -#: vpn/models/l2vpn.py:27 wireless/models.py:56 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 +#: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 +#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:56 msgid "slug" msgstr "скорочення" -#: circuits/models/providers.py:42 +#: netbox/circuits/models/providers.py:42 msgid "provider" msgstr "провайдер" -#: circuits/models/providers.py:43 +#: netbox/circuits/models/providers.py:43 msgid "providers" msgstr "провайдери" -#: circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:63 msgid "account ID" msgstr "ідентифікатор облікового запису" -#: circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:86 msgid "provider account" msgstr "обліковий запис провайдера" -#: circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:87 msgid "provider accounts" msgstr "облікові записи провайдера" -#: circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:115 msgid "service ID" msgstr "ідентифікатор послуги" -#: circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:126 msgid "provider network" msgstr "мережа провайдера" -#: circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:127 msgid "provider networks" msgstr "мережі провайдера" -#: circuits/tables/circuits.py:32 circuits/tables/circuits.py:132 -#: circuits/tables/providers.py:18 circuits/tables/providers.py:69 -#: circuits/tables/providers.py:99 core/tables/data.py:16 -#: core/tables/jobs.py:14 core/tables/plugins.py:44 core/tables/tasks.py:11 -#: core/tables/tasks.py:115 dcim/forms/filtersets.py:63 -#: dcim/forms/object_create.py:43 dcim/tables/devices.py:52 -#: dcim/tables/devices.py:92 dcim/tables/devices.py:134 -#: dcim/tables/devices.py:289 dcim/tables/devices.py:392 -#: dcim/tables/devices.py:433 dcim/tables/devices.py:482 -#: dcim/tables/devices.py:531 dcim/tables/devices.py:648 -#: dcim/tables/devices.py:731 dcim/tables/devices.py:778 -#: dcim/tables/devices.py:841 dcim/tables/devices.py:911 -#: dcim/tables/devices.py:974 dcim/tables/devices.py:994 -#: dcim/tables/devices.py:1023 dcim/tables/devices.py:1053 -#: dcim/tables/devicetypes.py:31 dcim/tables/power.py:22 -#: dcim/tables/power.py:62 dcim/tables/racks.py:24 dcim/tables/racks.py:113 -#: dcim/tables/sites.py:24 dcim/tables/sites.py:51 dcim/tables/sites.py:78 -#: dcim/tables/sites.py:130 extras/forms/filtersets.py:213 -#: extras/tables/tables.py:58 extras/tables/tables.py:122 -#: extras/tables/tables.py:155 extras/tables/tables.py:180 -#: extras/tables/tables.py:246 extras/tables/tables.py:361 -#: extras/tables/tables.py:378 extras/tables/tables.py:401 -#: extras/tables/tables.py:439 extras/tables/tables.py:491 -#: extras/tables/tables.py:514 ipam/forms/bulk_edit.py:407 -#: ipam/forms/filtersets.py:386 ipam/tables/asn.py:16 ipam/tables/ip.py:85 -#: ipam/tables/ip.py:160 ipam/tables/services.py:15 ipam/tables/services.py:40 -#: ipam/tables/vlans.py:64 ipam/tables/vlans.py:114 ipam/tables/vrfs.py:26 -#: ipam/tables/vrfs.py:68 templates/circuits/circuitgroup.html:28 -#: templates/circuits/circuittype.html:22 -#: templates/circuits/provideraccount.html:28 -#: templates/circuits/providernetwork.html:24 -#: templates/core/datasource.html:34 templates/core/job.html:44 -#: templates/core/plugin.html:54 templates/core/rq_worker.html:43 -#: templates/dcim/consoleport.html:28 templates/dcim/consoleserverport.html:28 -#: templates/dcim/devicebay.html:24 templates/dcim/devicerole.html:26 -#: templates/dcim/frontport.html:28 -#: templates/dcim/inc/interface_vlans_table.html:5 -#: templates/dcim/inc/panels/inventory_items.html:18 -#: templates/dcim/interface.html:38 templates/dcim/interface.html:165 -#: templates/dcim/inventoryitem.html:28 -#: templates/dcim/inventoryitemrole.html:18 templates/dcim/location.html:29 -#: templates/dcim/manufacturer.html:36 templates/dcim/modulebay.html:30 -#: templates/dcim/platform.html:29 templates/dcim/poweroutlet.html:28 -#: templates/dcim/powerport.html:28 templates/dcim/rackrole.html:22 -#: templates/dcim/rearport.html:28 templates/dcim/region.html:29 -#: templates/dcim/sitegroup.html:29 -#: templates/dcim/virtualdevicecontext.html:18 -#: templates/extras/configcontext.html:13 -#: templates/extras/configtemplate.html:13 -#: templates/extras/customfield.html:13 templates/extras/customlink.html:13 -#: templates/extras/eventrule.html:13 templates/extras/exporttemplate.html:15 -#: templates/extras/notificationgroup.html:14 -#: templates/extras/savedfilter.html:13 templates/extras/script_list.html:45 -#: templates/extras/tag.html:14 templates/extras/webhook.html:13 -#: templates/ipam/asnrange.html:15 templates/ipam/fhrpgroup.html:30 -#: templates/ipam/rir.html:22 templates/ipam/role.html:22 -#: templates/ipam/routetarget.html:13 templates/ipam/service.html:24 -#: templates/ipam/servicetemplate.html:15 templates/ipam/vlan.html:35 -#: templates/ipam/vlangroup.html:30 templates/tenancy/contact.html:25 -#: templates/tenancy/contactgroup.html:21 -#: templates/tenancy/contactrole.html:18 templates/tenancy/tenantgroup.html:29 -#: templates/users/group.html:17 templates/users/objectpermission.html:17 -#: templates/virtualization/cluster.html:13 -#: templates/virtualization/clustergroup.html:22 -#: templates/virtualization/clustertype.html:22 -#: templates/virtualization/virtualdisk.html:25 -#: templates/virtualization/virtualmachine.html:15 -#: templates/virtualization/vminterface.html:25 -#: templates/vpn/ikepolicy.html:13 templates/vpn/ikeproposal.html:13 -#: templates/vpn/ipsecpolicy.html:13 templates/vpn/ipsecprofile.html:13 -#: templates/vpn/ipsecprofile.html:36 templates/vpn/ipsecprofile.html:69 -#: templates/vpn/ipsecproposal.html:13 templates/vpn/l2vpn.html:14 -#: templates/vpn/tunnel.html:21 templates/vpn/tunnelgroup.html:26 -#: templates/wireless/wirelesslangroup.html:29 tenancy/tables/contacts.py:19 -#: tenancy/tables/contacts.py:41 tenancy/tables/contacts.py:56 -#: tenancy/tables/tenants.py:16 tenancy/tables/tenants.py:38 -#: users/tables.py:62 users/tables.py:76 -#: virtualization/forms/bulk_create.py:20 -#: virtualization/forms/object_create.py:13 -#: virtualization/forms/object_create.py:23 -#: virtualization/tables/clusters.py:17 virtualization/tables/clusters.py:39 -#: virtualization/tables/clusters.py:62 -#: virtualization/tables/virtualmachines.py:55 -#: virtualization/tables/virtualmachines.py:139 -#: virtualization/tables/virtualmachines.py:194 vpn/tables/crypto.py:18 -#: vpn/tables/crypto.py:57 vpn/tables/crypto.py:93 vpn/tables/crypto.py:129 -#: vpn/tables/crypto.py:158 vpn/tables/l2vpn.py:23 vpn/tables/tunnels.py:18 -#: vpn/tables/tunnels.py:40 wireless/tables/wirelesslan.py:18 -#: wireless/tables/wirelesslan.py:79 +#: netbox/circuits/tables/circuits.py:32 +#: netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/tables/providers.py:18 +#: netbox/circuits/tables/providers.py:69 +#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 +#: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 +#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 +#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 +#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 +#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 +#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 +#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 +#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 +#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 +#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 +#: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 +#: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 +#: netbox/dcim/tables/sites.py:78 netbox/dcim/tables/sites.py:130 +#: netbox/extras/forms/filtersets.py:213 netbox/extras/tables/tables.py:58 +#: netbox/extras/tables/tables.py:122 netbox/extras/tables/tables.py:155 +#: netbox/extras/tables/tables.py:180 netbox/extras/tables/tables.py:246 +#: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 +#: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 +#: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 +#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 +#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 +#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 +#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/tables/vrfs.py:68 +#: netbox/templates/circuits/circuitgroup.html:28 +#: netbox/templates/circuits/circuittype.html:22 +#: netbox/templates/circuits/provideraccount.html:28 +#: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 +#: netbox/templates/core/plugin.html:54 +#: netbox/templates/core/rq_worker.html:43 +#: netbox/templates/dcim/consoleport.html:28 +#: netbox/templates/dcim/consoleserverport.html:28 +#: netbox/templates/dcim/devicebay.html:24 +#: netbox/templates/dcim/devicerole.html:26 +#: netbox/templates/dcim/frontport.html:28 +#: netbox/templates/dcim/inc/interface_vlans_table.html:5 +#: netbox/templates/dcim/inc/panels/inventory_items.html:18 +#: netbox/templates/dcim/interface.html:38 +#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/inventoryitem.html:28 +#: netbox/templates/dcim/inventoryitemrole.html:18 +#: netbox/templates/dcim/location.html:29 +#: netbox/templates/dcim/manufacturer.html:36 +#: netbox/templates/dcim/modulebay.html:30 +#: netbox/templates/dcim/platform.html:29 +#: netbox/templates/dcim/poweroutlet.html:28 +#: netbox/templates/dcim/powerport.html:28 +#: netbox/templates/dcim/rackrole.html:22 +#: netbox/templates/dcim/rearport.html:28 netbox/templates/dcim/region.html:29 +#: netbox/templates/dcim/sitegroup.html:29 +#: netbox/templates/dcim/virtualdevicecontext.html:18 +#: netbox/templates/extras/configcontext.html:13 +#: netbox/templates/extras/configtemplate.html:13 +#: netbox/templates/extras/customfield.html:13 +#: netbox/templates/extras/customlink.html:13 +#: netbox/templates/extras/eventrule.html:13 +#: netbox/templates/extras/exporttemplate.html:15 +#: netbox/templates/extras/notificationgroup.html:14 +#: netbox/templates/extras/savedfilter.html:13 +#: netbox/templates/extras/script_list.html:45 +#: netbox/templates/extras/tag.html:14 netbox/templates/extras/webhook.html:13 +#: netbox/templates/ipam/asnrange.html:15 +#: netbox/templates/ipam/fhrpgroup.html:30 netbox/templates/ipam/rir.html:22 +#: netbox/templates/ipam/role.html:22 +#: netbox/templates/ipam/routetarget.html:13 +#: netbox/templates/ipam/service.html:24 +#: netbox/templates/ipam/servicetemplate.html:15 +#: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/tenancy/contact.html:25 +#: netbox/templates/tenancy/contactgroup.html:21 +#: netbox/templates/tenancy/contactrole.html:18 +#: netbox/templates/tenancy/tenantgroup.html:29 +#: netbox/templates/users/group.html:17 +#: netbox/templates/users/objectpermission.html:17 +#: netbox/templates/virtualization/cluster.html:13 +#: netbox/templates/virtualization/clustergroup.html:22 +#: netbox/templates/virtualization/clustertype.html:22 +#: netbox/templates/virtualization/virtualdisk.html:25 +#: netbox/templates/virtualization/virtualmachine.html:15 +#: netbox/templates/virtualization/vminterface.html:25 +#: netbox/templates/vpn/ikepolicy.html:13 +#: netbox/templates/vpn/ikeproposal.html:13 +#: netbox/templates/vpn/ipsecpolicy.html:13 +#: netbox/templates/vpn/ipsecprofile.html:13 +#: netbox/templates/vpn/ipsecprofile.html:36 +#: netbox/templates/vpn/ipsecprofile.html:69 +#: netbox/templates/vpn/ipsecproposal.html:13 +#: netbox/templates/vpn/l2vpn.html:14 netbox/templates/vpn/tunnel.html:21 +#: netbox/templates/vpn/tunnelgroup.html:26 +#: netbox/templates/wireless/wirelesslangroup.html:29 +#: netbox/tenancy/tables/contacts.py:19 netbox/tenancy/tables/contacts.py:41 +#: netbox/tenancy/tables/contacts.py:56 netbox/tenancy/tables/tenants.py:16 +#: netbox/tenancy/tables/tenants.py:38 netbox/users/tables.py:62 +#: netbox/users/tables.py:76 netbox/virtualization/forms/bulk_create.py:20 +#: netbox/virtualization/forms/object_create.py:13 +#: netbox/virtualization/forms/object_create.py:23 +#: netbox/virtualization/tables/clusters.py:17 +#: netbox/virtualization/tables/clusters.py:39 +#: netbox/virtualization/tables/clusters.py:62 +#: netbox/virtualization/tables/virtualmachines.py:55 +#: netbox/virtualization/tables/virtualmachines.py:139 +#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 +#: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 +#: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 +#: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 +#: netbox/wireless/tables/wirelesslan.py:18 +#: netbox/wireless/tables/wirelesslan.py:79 msgid "Name" msgstr "Назва" -#: circuits/tables/circuits.py:41 circuits/tables/circuits.py:138 -#: circuits/tables/providers.py:45 circuits/tables/providers.py:79 -#: netbox/navigation/menu.py:266 netbox/navigation/menu.py:270 -#: netbox/navigation/menu.py:272 templates/circuits/provider.html:57 -#: templates/circuits/provideraccount.html:44 -#: templates/circuits/providernetwork.html:50 +#: netbox/circuits/tables/circuits.py:41 +#: netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/providers.py:45 +#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 +#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/templates/circuits/provider.html:57 +#: netbox/templates/circuits/provideraccount.html:44 +#: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "Канали зв'язку" -#: circuits/tables/circuits.py:55 templates/circuits/circuit.html:26 +#: netbox/circuits/tables/circuits.py:55 +#: netbox/templates/circuits/circuit.html:26 msgid "Circuit ID" msgstr "Ідентифікатор каналу зв'язку" -#: circuits/tables/circuits.py:69 wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:69 +#: netbox/wireless/forms/model_forms.py:160 msgid "Side A" msgstr "Сторона А" -#: circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:74 msgid "Side Z" msgstr "Сторона Б" -#: circuits/tables/circuits.py:77 templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:77 +#: netbox/templates/circuits/circuit.html:55 msgid "Commit Rate" msgstr "Гарантований процент чи коефіцієнт доступності" -#: circuits/tables/circuits.py:80 circuits/tables/providers.py:48 -#: circuits/tables/providers.py:82 circuits/tables/providers.py:107 -#: dcim/tables/devices.py:1036 dcim/tables/devicetypes.py:92 -#: dcim/tables/modules.py:29 dcim/tables/modules.py:72 dcim/tables/power.py:39 -#: dcim/tables/power.py:96 dcim/tables/racks.py:84 dcim/tables/racks.py:145 -#: dcim/tables/racks.py:225 dcim/tables/sites.py:108 -#: extras/tables/tables.py:582 ipam/tables/asn.py:69 ipam/tables/fhrp.py:34 -#: ipam/tables/ip.py:136 ipam/tables/ip.py:275 ipam/tables/ip.py:329 -#: ipam/tables/ip.py:397 ipam/tables/services.py:24 ipam/tables/services.py:54 -#: ipam/tables/vlans.py:145 ipam/tables/vrfs.py:47 ipam/tables/vrfs.py:72 -#: templates/dcim/htmx/cable_edit.html:89 templates/generic/bulk_edit.html:86 -#: templates/inc/panels/comments.html:5 tenancy/tables/contacts.py:68 -#: tenancy/tables/tenants.py:46 utilities/forms/fields/fields.py:29 -#: virtualization/tables/clusters.py:91 -#: virtualization/tables/virtualmachines.py:82 vpn/tables/crypto.py:37 -#: vpn/tables/crypto.py:74 vpn/tables/crypto.py:109 vpn/tables/crypto.py:140 -#: vpn/tables/crypto.py:173 vpn/tables/l2vpn.py:37 vpn/tables/tunnels.py:61 -#: wireless/tables/wirelesslan.py:27 wireless/tables/wirelesslan.py:58 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/providers.py:82 +#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 +#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 +#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 +#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 +#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 +#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 +#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 +#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 +#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/templates/generic/bulk_edit.html:86 +#: netbox/templates/inc/panels/comments.html:5 +#: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 +#: netbox/utilities/forms/fields/fields.py:29 +#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 +#: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 +#: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 +#: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 +#: netbox/wireless/tables/wirelesslan.py:58 msgid "Comments" msgstr "Коментарі" -#: circuits/tables/circuits.py:86 templates/tenancy/contact.html:84 -#: tenancy/tables/contacts.py:73 +#: netbox/circuits/tables/circuits.py:86 +#: netbox/templates/tenancy/contact.html:84 +#: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "Завдання" -#: circuits/tables/providers.py:23 +#: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "Рахунки" -#: circuits/tables/providers.py:29 +#: netbox/circuits/tables/providers.py:29 msgid "Account Count" msgstr "Кількість рахунків" -#: circuits/tables/providers.py:39 dcim/tables/sites.py:100 +#: netbox/circuits/tables/providers.py:39 netbox/dcim/tables/sites.py:100 msgid "ASN Count" msgstr "Кількість ASN" -#: circuits/views.py:331 +#: netbox/circuits/views.py:331 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "Не визначено кінців для каналу зв'язку {circuit}." -#: circuits/views.py:380 +#: netbox/circuits/views.py:380 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "Замінені місцями кінці для каналу зв'язку {circuit}." -#: core/api/views.py:39 +#: netbox/core/api/views.py:39 msgid "This user does not have permission to synchronize this data source." msgstr "Цей користувач не має дозволу на синхронізацію цього джерела даних." -#: core/choices.py:18 +#: netbox/core/choices.py:18 msgid "New" msgstr "Нові" -#: core/choices.py:19 core/constants.py:18 core/tables/tasks.py:15 -#: templates/core/rq_task.html:77 +#: netbox/core/choices.py:19 netbox/core/constants.py:18 +#: netbox/core/tables/tasks.py:15 netbox/templates/core/rq_task.html:77 msgid "Queued" msgstr "У черзі" -#: core/choices.py:20 +#: netbox/core/choices.py:20 msgid "Syncing" msgstr "Синхронізація" -#: core/choices.py:21 core/choices.py:57 core/tables/jobs.py:41 -#: templates/core/job.html:86 +#: netbox/core/choices.py:21 netbox/core/choices.py:57 +#: netbox/core/tables/jobs.py:41 netbox/templates/core/job.html:86 msgid "Completed" msgstr "Завершено" -#: core/choices.py:22 core/choices.py:59 core/constants.py:20 -#: core/tables/tasks.py:34 dcim/choices.py:187 dcim/choices.py:239 -#: dcim/choices.py:1609 virtualization/choices.py:47 +#: netbox/core/choices.py:22 netbox/core/choices.py:59 +#: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 +#: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 +#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 msgid "Failed" msgstr "Збій" -#: core/choices.py:35 netbox/navigation/menu.py:335 -#: netbox/navigation/menu.py:339 templates/extras/script/base.html:14 -#: templates/extras/script_list.html:7 templates/extras/script_list.html:12 -#: templates/extras/script_result.html:17 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 +#: netbox/netbox/navigation/menu.py:339 +#: netbox/templates/extras/script/base.html:14 +#: netbox/templates/extras/script_list.html:7 +#: netbox/templates/extras/script_list.html:12 +#: netbox/templates/extras/script_result.html:17 msgid "Scripts" msgstr "Скрипти" -#: core/choices.py:36 templates/extras/report/base.html:13 +#: netbox/core/choices.py:36 netbox/templates/extras/report/base.html:13 msgid "Reports" msgstr "Звіти" -#: core/choices.py:54 +#: netbox/core/choices.py:54 msgid "Pending" msgstr "Очікується" -#: core/choices.py:55 core/constants.py:23 core/tables/jobs.py:32 -#: core/tables/tasks.py:38 templates/core/job.html:73 +#: netbox/core/choices.py:55 netbox/core/constants.py:23 +#: netbox/core/tables/jobs.py:32 netbox/core/tables/tasks.py:38 +#: netbox/templates/core/job.html:73 msgid "Scheduled" msgstr "Заплановано" -#: core/choices.py:56 +#: netbox/core/choices.py:56 msgid "Running" msgstr "Запущено" -#: core/choices.py:58 +#: netbox/core/choices.py:58 msgid "Errored" msgstr "Помилка" -#: core/choices.py:87 core/tables/plugins.py:63 -#: templates/generic/object.html:61 +#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "Оновлено" -#: core/choices.py:88 +#: netbox/core/choices.py:88 msgid "Deleted" msgstr "Видалено" -#: core/constants.py:19 core/tables/tasks.py:30 +#: netbox/core/constants.py:19 netbox/core/tables/tasks.py:30 msgid "Finished" msgstr "Закінчено" -#: core/constants.py:21 core/tables/jobs.py:38 templates/core/job.html:82 -#: templates/extras/htmx/script_result.html:8 +#: netbox/core/constants.py:21 netbox/core/tables/jobs.py:38 +#: netbox/templates/core/job.html:82 +#: netbox/templates/extras/htmx/script_result.html:8 msgid "Started" msgstr "Почато" -#: core/constants.py:22 core/tables/tasks.py:26 +#: netbox/core/constants.py:22 netbox/core/tables/tasks.py:26 msgid "Deferred" msgstr "Відкладено" -#: core/constants.py:24 +#: netbox/core/constants.py:24 msgid "Stopped" msgstr "Зупинено" -#: core/constants.py:25 +#: netbox/core/constants.py:25 msgid "Cancelled" msgstr "Скасовано" -#: core/data_backends.py:32 core/tables/plugins.py:51 -#: templates/core/plugin.html:88 templates/dcim/interface.html:216 +#: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 +#: netbox/templates/core/plugin.html:88 +#: netbox/templates/dcim/interface.html:216 msgid "Local" msgstr "Місцеві" -#: core/data_backends.py:50 core/tables/change_logging.py:20 -#: templates/account/profile.html:15 templates/users/user.html:17 -#: users/tables.py:31 +#: netbox/core/data_backends.py:50 netbox/core/tables/change_logging.py:20 +#: netbox/templates/account/profile.html:15 +#: netbox/templates/users/user.html:17 netbox/users/tables.py:31 msgid "Username" msgstr "Ім'я користувача" -#: core/data_backends.py:52 core/data_backends.py:58 +#: netbox/core/data_backends.py:52 netbox/core/data_backends.py:58 msgid "Only used for cloning with HTTP(S)" msgstr "Використовується лише для клонування за допомогою HTTP(S)" -#: core/data_backends.py:56 templates/account/base.html:23 -#: templates/account/password.html:12 users/forms/model_forms.py:170 +#: netbox/core/data_backends.py:56 netbox/templates/account/base.html:23 +#: netbox/templates/account/password.html:12 +#: netbox/users/forms/model_forms.py:170 msgid "Password" msgstr "Пароль" -#: core/data_backends.py:62 +#: netbox/core/data_backends.py:62 msgid "Branch" msgstr "Відділення" -#: core/data_backends.py:120 +#: netbox/core/data_backends.py:120 #, python-brace-format msgid "Fetching remote data failed ({name}): {error}" msgstr "Не вдалося отримати збійні дані ({name}): {error}" -#: core/data_backends.py:133 +#: netbox/core/data_backends.py:133 msgid "AWS access key ID" msgstr "Ідентифікатор ключа доступу AWS" -#: core/data_backends.py:137 +#: netbox/core/data_backends.py:137 msgid "AWS secret access key" msgstr "Ключ таємничого доступу до AWS" -#: core/events.py:27 +#: netbox/core/events.py:27 msgid "Object created" msgstr "Об'єкт створений" -#: core/events.py:28 +#: netbox/core/events.py:28 msgid "Object updated" msgstr "Об'єкт оновлений" -#: core/events.py:29 +#: netbox/core/events.py:29 msgid "Object deleted" msgstr "Об'єкт видалений" -#: core/events.py:30 +#: netbox/core/events.py:30 msgid "Job started" msgstr "Завдання почалося" -#: core/events.py:31 +#: netbox/core/events.py:31 msgid "Job completed" msgstr "Завдання завершено" -#: core/events.py:32 +#: netbox/core/events.py:32 msgid "Job failed" msgstr "Збій завдання" -#: core/events.py:33 +#: netbox/core/events.py:33 msgid "Job errored" msgstr "Завдання завершено з помилкою" -#: core/filtersets.py:53 extras/filtersets.py:250 extras/filtersets.py:633 -#: extras/filtersets.py:661 +#: netbox/core/filtersets.py:53 netbox/extras/filtersets.py:250 +#: netbox/extras/filtersets.py:633 netbox/extras/filtersets.py:661 msgid "Data source (ID)" msgstr "Джерело даних (ідентифікатор)" -#: core/filtersets.py:59 +#: netbox/core/filtersets.py:59 msgid "Data source (name)" msgstr "Джерело даних (назва)" -#: core/filtersets.py:145 dcim/filtersets.py:501 extras/filtersets.py:287 -#: extras/filtersets.py:331 extras/filtersets.py:353 extras/filtersets.py:413 -#: users/filtersets.py:28 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 +#: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 +#: netbox/users/filtersets.py:28 msgid "User (ID)" msgstr "Користувач (ідентифікатор)" -#: core/filtersets.py:151 +#: netbox/core/filtersets.py:151 msgid "User name" msgstr "Ім'я користувача" -#: core/forms/bulk_edit.py:25 core/forms/filtersets.py:43 -#: core/tables/data.py:26 dcim/forms/bulk_edit.py:1132 -#: dcim/forms/bulk_edit.py:1410 dcim/forms/filtersets.py:1370 -#: dcim/tables/devices.py:553 dcim/tables/devicetypes.py:224 -#: extras/forms/bulk_edit.py:123 extras/forms/bulk_edit.py:187 -#: extras/forms/bulk_edit.py:246 extras/forms/filtersets.py:142 -#: extras/forms/filtersets.py:229 extras/forms/filtersets.py:294 -#: extras/tables/tables.py:162 extras/tables/tables.py:253 -#: extras/tables/tables.py:415 netbox/preferences.py:22 -#: templates/core/datasource.html:42 templates/dcim/interface.html:61 -#: templates/extras/customlink.html:17 templates/extras/eventrule.html:17 -#: templates/extras/savedfilter.html:25 -#: templates/users/objectpermission.html:25 -#: templates/virtualization/vminterface.html:29 users/forms/bulk_edit.py:89 -#: users/forms/filtersets.py:70 users/tables.py:83 -#: virtualization/forms/bulk_edit.py:217 -#: virtualization/forms/filtersets.py:215 +#: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 +#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 +#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 +#: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 +#: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 +#: netbox/extras/tables/tables.py:162 netbox/extras/tables/tables.py:253 +#: netbox/extras/tables/tables.py:415 netbox/netbox/preferences.py:22 +#: netbox/templates/core/datasource.html:42 +#: netbox/templates/dcim/interface.html:61 +#: netbox/templates/extras/customlink.html:17 +#: netbox/templates/extras/eventrule.html:17 +#: netbox/templates/extras/savedfilter.html:25 +#: netbox/templates/users/objectpermission.html:25 +#: netbox/templates/virtualization/vminterface.html:29 +#: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 +#: netbox/virtualization/forms/filtersets.py:215 msgid "Enabled" msgstr "Увімкнено" -#: core/forms/bulk_edit.py:34 extras/forms/model_forms.py:285 -#: templates/extras/savedfilter.html:52 vpn/forms/filtersets.py:97 -#: vpn/forms/filtersets.py:127 vpn/forms/filtersets.py:151 -#: vpn/forms/filtersets.py:170 vpn/forms/model_forms.py:301 -#: vpn/forms/model_forms.py:321 vpn/forms/model_forms.py:337 -#: vpn/forms/model_forms.py:357 vpn/forms/model_forms.py:380 +#: netbox/core/forms/bulk_edit.py:34 netbox/extras/forms/model_forms.py:285 +#: netbox/templates/extras/savedfilter.html:52 +#: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 +#: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 +#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 +#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 +#: netbox/vpn/forms/model_forms.py:380 msgid "Parameters" msgstr "Параметри" -#: core/forms/bulk_edit.py:38 templates/core/datasource.html:68 +#: netbox/core/forms/bulk_edit.py:38 netbox/templates/core/datasource.html:68 msgid "Ignore rules" msgstr "Ігнорувати правила" -#: core/forms/filtersets.py:30 core/forms/model_forms.py:97 -#: extras/forms/model_forms.py:248 extras/forms/model_forms.py:578 -#: extras/forms/model_forms.py:632 extras/tables/tables.py:191 -#: extras/tables/tables.py:483 extras/tables/tables.py:518 -#: templates/core/datasource.html:31 -#: templates/dcim/device/render_config.html:18 -#: templates/extras/configcontext.html:29 -#: templates/extras/configtemplate.html:21 -#: templates/extras/exporttemplate.html:35 -#: templates/virtualization/virtualmachine/render_config.html:18 +#: netbox/core/forms/filtersets.py:30 netbox/core/forms/model_forms.py:97 +#: netbox/extras/forms/model_forms.py:248 +#: netbox/extras/forms/model_forms.py:578 +#: netbox/extras/forms/model_forms.py:632 netbox/extras/tables/tables.py:191 +#: netbox/extras/tables/tables.py:483 netbox/extras/tables/tables.py:518 +#: netbox/templates/core/datasource.html:31 +#: netbox/templates/dcim/device/render_config.html:18 +#: netbox/templates/extras/configcontext.html:29 +#: netbox/templates/extras/configtemplate.html:21 +#: netbox/templates/extras/exporttemplate.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:18 msgid "Data Source" msgstr "Джерело даних" -#: core/forms/filtersets.py:55 core/forms/mixins.py:21 +#: netbox/core/forms/filtersets.py:55 netbox/core/forms/mixins.py:21 msgid "File" msgstr "Файл" -#: core/forms/filtersets.py:60 core/forms/mixins.py:16 -#: extras/forms/filtersets.py:170 extras/forms/filtersets.py:328 -#: extras/forms/filtersets.py:413 +#: netbox/core/forms/filtersets.py:60 netbox/core/forms/mixins.py:16 +#: netbox/extras/forms/filtersets.py:170 netbox/extras/forms/filtersets.py:328 +#: netbox/extras/forms/filtersets.py:413 msgid "Data source" msgstr "Джерело даних" -#: core/forms/filtersets.py:70 extras/forms/filtersets.py:440 +#: netbox/core/forms/filtersets.py:70 netbox/extras/forms/filtersets.py:440 msgid "Creation" msgstr "Творчість" -#: core/forms/filtersets.py:74 core/forms/filtersets.py:160 -#: extras/forms/filtersets.py:461 extras/tables/tables.py:220 -#: extras/tables/tables.py:294 extras/tables/tables.py:326 -#: extras/tables/tables.py:571 templates/core/job.html:38 -#: templates/core/objectchange.html:52 tenancy/tables/contacts.py:90 -#: vpn/tables/l2vpn.py:59 +#: netbox/core/forms/filtersets.py:74 netbox/core/forms/filtersets.py:160 +#: netbox/extras/forms/filtersets.py:461 netbox/extras/tables/tables.py:220 +#: netbox/extras/tables/tables.py:294 netbox/extras/tables/tables.py:326 +#: netbox/extras/tables/tables.py:571 netbox/templates/core/job.html:38 +#: netbox/templates/core/objectchange.html:52 +#: netbox/tenancy/tables/contacts.py:90 netbox/vpn/tables/l2vpn.py:59 msgid "Object Type" msgstr "Тип об'єкта" -#: core/forms/filtersets.py:84 +#: netbox/core/forms/filtersets.py:84 msgid "Created after" msgstr "Створено після" -#: core/forms/filtersets.py:89 +#: netbox/core/forms/filtersets.py:89 msgid "Created before" msgstr "Створено раніше" -#: core/forms/filtersets.py:94 +#: netbox/core/forms/filtersets.py:94 msgid "Scheduled after" msgstr "Заплановано після" -#: core/forms/filtersets.py:99 +#: netbox/core/forms/filtersets.py:99 msgid "Scheduled before" msgstr "Заплановано раніше" -#: core/forms/filtersets.py:104 +#: netbox/core/forms/filtersets.py:104 msgid "Started after" msgstr "Почнється після" -#: core/forms/filtersets.py:109 +#: netbox/core/forms/filtersets.py:109 msgid "Started before" msgstr "Почнється раніше" -#: core/forms/filtersets.py:114 +#: netbox/core/forms/filtersets.py:114 msgid "Completed after" msgstr "Завершено після" -#: core/forms/filtersets.py:119 +#: netbox/core/forms/filtersets.py:119 msgid "Completed before" msgstr "Завершено раніше" -#: core/forms/filtersets.py:126 core/forms/filtersets.py:155 -#: dcim/forms/bulk_edit.py:457 dcim/forms/filtersets.py:418 -#: dcim/forms/filtersets.py:462 dcim/forms/model_forms.py:316 -#: extras/forms/filtersets.py:456 extras/forms/filtersets.py:475 -#: extras/tables/tables.py:302 extras/tables/tables.py:342 -#: templates/core/objectchange.html:36 templates/dcim/rackreservation.html:58 -#: templates/extras/savedfilter.html:21 templates/inc/user_menu.html:33 -#: templates/users/token.html:21 templates/users/user.html:6 -#: templates/users/user.html:14 users/filtersets.py:107 -#: users/filtersets.py:174 users/forms/filtersets.py:84 -#: users/forms/filtersets.py:125 users/forms/model_forms.py:155 -#: users/forms/model_forms.py:192 users/tables.py:19 +#: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 +#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 +#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 +#: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 +#: netbox/templates/core/objectchange.html:36 +#: netbox/templates/dcim/rackreservation.html:58 +#: netbox/templates/extras/savedfilter.html:21 +#: netbox/templates/inc/user_menu.html:33 netbox/templates/users/token.html:21 +#: netbox/templates/users/user.html:6 netbox/templates/users/user.html:14 +#: netbox/users/filtersets.py:107 netbox/users/filtersets.py:174 +#: netbox/users/forms/filtersets.py:84 netbox/users/forms/filtersets.py:125 +#: netbox/users/forms/model_forms.py:155 netbox/users/forms/model_forms.py:192 +#: netbox/users/tables.py:19 msgid "User" msgstr "Користувач" -#: core/forms/filtersets.py:134 core/tables/change_logging.py:15 -#: extras/tables/tables.py:609 extras/tables/tables.py:646 -#: templates/core/objectchange.html:32 +#: netbox/core/forms/filtersets.py:134 netbox/core/tables/change_logging.py:15 +#: netbox/extras/tables/tables.py:609 netbox/extras/tables/tables.py:646 +#: netbox/templates/core/objectchange.html:32 msgid "Time" msgstr "Час" -#: core/forms/filtersets.py:139 extras/forms/filtersets.py:445 +#: netbox/core/forms/filtersets.py:139 netbox/extras/forms/filtersets.py:445 msgid "After" msgstr "Після" -#: core/forms/filtersets.py:144 extras/forms/filtersets.py:450 +#: netbox/core/forms/filtersets.py:144 netbox/extras/forms/filtersets.py:450 msgid "Before" msgstr "Раніше" -#: core/forms/filtersets.py:148 core/tables/change_logging.py:29 -#: extras/forms/model_forms.py:396 templates/core/objectchange.html:46 -#: templates/extras/eventrule.html:71 +#: netbox/core/forms/filtersets.py:148 netbox/core/tables/change_logging.py:29 +#: netbox/extras/forms/model_forms.py:396 +#: netbox/templates/core/objectchange.html:46 +#: netbox/templates/extras/eventrule.html:71 msgid "Action" msgstr "Дія" -#: core/forms/model_forms.py:54 core/tables/data.py:46 -#: templates/core/datafile.html:27 templates/extras/report/base.html:33 -#: templates/extras/script/base.html:32 +#: netbox/core/forms/model_forms.py:54 netbox/core/tables/data.py:46 +#: netbox/templates/core/datafile.html:27 +#: netbox/templates/extras/report/base.html:33 +#: netbox/templates/extras/script/base.html:32 msgid "Source" msgstr "Джерело" -#: core/forms/model_forms.py:58 +#: netbox/core/forms/model_forms.py:58 msgid "Backend Parameters" msgstr "Параметри бекенду" -#: core/forms/model_forms.py:96 +#: netbox/core/forms/model_forms.py:96 msgid "File Upload" msgstr "Вивантажити файл" -#: core/forms/model_forms.py:108 +#: netbox/core/forms/model_forms.py:108 msgid "Cannot upload a file and sync from an existing file" msgstr "Не вдається вивантажити файл і синхронізувати з існуючого файлу" -#: core/forms/model_forms.py:110 +#: netbox/core/forms/model_forms.py:110 msgid "Must upload a file or select a data file to sync" msgstr "Потрібно вивантажити файл або вибрати файл даних для синхронізації" -#: core/forms/model_forms.py:153 templates/dcim/rack_elevation_list.html:6 +#: netbox/core/forms/model_forms.py:153 +#: netbox/templates/dcim/rack_elevation_list.html:6 msgid "Rack Elevations" msgstr "Висота стійки" -#: core/forms/model_forms.py:157 dcim/choices.py:1520 -#: dcim/forms/bulk_edit.py:979 dcim/forms/bulk_edit.py:1367 -#: dcim/forms/bulk_edit.py:1385 dcim/tables/racks.py:158 -#: netbox/navigation/menu.py:291 netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 +#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 +#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 +#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" msgstr "Електрика" -#: core/forms/model_forms.py:159 netbox/navigation/menu.py:154 -#: templates/core/inc/config_data.html:37 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "IPAM" -#: core/forms/model_forms.py:160 netbox/navigation/menu.py:230 -#: templates/core/inc/config_data.html:50 vpn/forms/bulk_edit.py:77 -#: vpn/forms/filtersets.py:43 vpn/forms/model_forms.py:61 -#: vpn/forms/model_forms.py:146 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/templates/core/inc/config_data.html:50 +#: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 msgid "Security" msgstr "Безпека" -#: core/forms/model_forms.py:161 templates/core/inc/config_data.html:59 +#: netbox/core/forms/model_forms.py:161 +#: netbox/templates/core/inc/config_data.html:59 msgid "Banners" msgstr "Банери" -#: core/forms/model_forms.py:162 templates/core/inc/config_data.html:80 +#: netbox/core/forms/model_forms.py:162 +#: netbox/templates/core/inc/config_data.html:80 msgid "Pagination" msgstr "Нумерація сторінок" -#: core/forms/model_forms.py:163 extras/forms/bulk_edit.py:92 -#: extras/forms/filtersets.py:47 extras/forms/model_forms.py:116 -#: extras/forms/model_forms.py:129 templates/core/inc/config_data.html:93 +#: netbox/core/forms/model_forms.py:163 netbox/extras/forms/bulk_edit.py:92 +#: netbox/extras/forms/filtersets.py:47 netbox/extras/forms/model_forms.py:116 +#: netbox/extras/forms/model_forms.py:129 +#: netbox/templates/core/inc/config_data.html:93 msgid "Validation" msgstr "Перевірка" -#: core/forms/model_forms.py:164 templates/account/preferences.html:6 +#: netbox/core/forms/model_forms.py:164 +#: netbox/templates/account/preferences.html:6 msgid "User Preferences" msgstr "Параметри користувача" -#: core/forms/model_forms.py:167 dcim/forms/filtersets.py:732 -#: templates/core/inc/config_data.html:127 users/forms/model_forms.py:64 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/templates/core/inc/config_data.html:127 +#: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" msgstr "Різне" -#: core/forms/model_forms.py:169 +#: netbox/core/forms/model_forms.py:169 msgid "Config Revision" msgstr "Ревізія конфігурації" -#: core/forms/model_forms.py:208 +#: netbox/core/forms/model_forms.py:208 msgid "This parameter has been defined statically and cannot be modified." msgstr "Цей параметр був визначений статично і не може бути змінений." -#: core/forms/model_forms.py:216 +#: netbox/core/forms/model_forms.py:216 #, python-brace-format msgid "Current value: {value}" msgstr "Поточне значення: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr " (за замовчуванням)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "час" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "ім'я користувача" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "Ідентифікатор запиту" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "дія" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "дані перед зміною" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "дані після зміни" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "зміна об'єкта" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "змін об'єкта" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "Журнал змін не підтримується для цього типу об'єктів ({type})." -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "створено" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "коментар" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "дані конфігурації" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "версія конфігурації" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "версії конфігурації" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "Налаштування за замовчуванням" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "Поточне налаштування" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "Ревізія конфігурації #{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "тип" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "увімкнено" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "ігнорувати правила" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "" "Шаблони (по одному на рядок), що відповідають файлам, які слід ігнорувати " "під час синхронізації" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "параметри" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "останній синхронізований" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "джерело даних" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "джерела даних" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "Невідомий тип бекенда: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "Не вдається ініціювати синхронізацію; бо синхронізація вже триває." -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "" "Виникла помилка при ініціалізації бекенду. Необхідно встановити залежність: " -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "останнє оновлення" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "доріжка" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "Шлях до файлу відносно кореня джерела даних" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "розмір" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "хеш" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "Довжина повинна становити 64 шістнадцяткові символи." -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "SHA256 хеш даних файлу" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "файл даних" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "файли даних" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "автоматична синхронізація запису" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "автоматична синхронізація записів" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "кореневий файл" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "шлях до файлу" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "Шлях до файлу відносно призначеного кореневого шляху" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "керований файл" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "керовані файли" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "заплановано" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "інтервал" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "Інтервал рецидивів (у хвилинах)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "розпочато" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "завершено" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "дані" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "помилка" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "ідентифікатор завдання" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "завдання" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "завдання" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "Завдання не можуть бути призначені для цього типу об'єкта ({type})." -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" "Невірний статус для припинення виконання завдання. Треба вибрати: {choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" "enqueue() не можна викликати зі значеннями як для schedule_at, так і для " "imediate." -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "Видалення запобігає правилу захисту: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "П.І.Б." -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "Об'єкт" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "Ідентифікатор запиту" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "Є активним" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "Шлях" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "Останнє оновлення" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "Ідентифікатор" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "Інтервал" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "Версія" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "Останнє оновлення" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Мінімальна версія NetBox" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Максимальна версія NetBox" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "Не знайдено даних плагіна" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "Автор" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "Встановлено" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "Сертифіковано" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "Опубліковано" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "Встановлена версія" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "Найновіша версія" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "Найстаріше завдання" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Робочі процеси" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "Ведучий" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "Порт" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "База данних" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "Планувальник PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "Черг не знайдено" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "У черзі" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "Закінчився" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "Дзвониться" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "Завдань не знайдено" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "Держава" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "Народження" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "Робочих процессів не знайдено" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "Завдання у черзі #{id} синхронізовано з {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "Відновлена версія конфігурації #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "Завдання {job_id} не знайдено" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "Завдання {id} було видалено." -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "Помилка при видаленні завдання {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "Завдання {id} не знайдено." -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "Завдання {id} було знову поставлено в чергу." -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "Завдання {id} був поставлений у чергу." -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "Завдання {id} було зупинено." -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "Не вдалося зупинити завдання {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "Не вдалося завантажити каталог плагінів" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "Плагін {name} не знайдено" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "Позиція (U)" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "Ідентифікатор об'єкта" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "Підготовка" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "Виведення з експлуатації" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "Пенсіонер" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "2-постова рамка" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4-х стовпчастий каркас" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "Дворамна шафа" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "Настінний каркас" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "Рама настінна (вертикальна)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "Настінна шафа" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "Настінна шафа (вертикальна)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} дюймів" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "Зарезервовано" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "Доступний" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "Застарілий" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "Міліметри" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "Дюйми" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "Спереду ззаду" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "Ззаду спереду" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "Прабатько" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "Підпорядкований" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "Спереду" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "Ззаду" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "Підготовлено" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "Інвентар" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "Зліва направо" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "Праворуч наліво" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "Збоку ззаду" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "Ззаду в бік" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "Знизу вгору" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "Зверху вниз" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "Пасивний" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "Змішаний" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA (без блокування)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA (з блокуванням)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "Каліфорнійський стиль" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "Міжнародний/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "Пропрієтарний" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "Інше" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/Міжнародні" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "Фізичний" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "Віртуальний" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "Бездротові мережі" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "Віртуальні інтерфейси" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "Міст" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "Група агрегації каналів (LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "Ethernet (фіксований)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "Ethernet (модульний)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "Ethernet (панель)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "Стільниковий" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "Серійний" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "Коаксіальний" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "Стекований" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "Половинний" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "Повний" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "Авто" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "Доступ" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "З мітками" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "З мітками (Усі)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "Стандарт IEEE" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "Пасивний 24В (2-парний)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "Пасивний 24В (4-парний)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "Пасивний 48В (2-парний)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "Пасивний 48В (4-парний)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "Мідний" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "Волоконно-оптичний" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "Волоконний" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "Підключений" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "Кілометри" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "Метри" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "Сантиметри" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "Милі" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "Фути" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "Кілограми" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "Грами" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "Фунтів" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "Унцій" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "Надлишковий" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "Однофазний" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "Трифазний" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "Невірний формат MAC-адреси: {value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "Невірний формат WWN: {value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "Батьківський регіон (ідентифікатор)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "Батьківський регіон (скорочення)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "Батьківська група тех. майданчиків (ідентифікатор)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "Батьківська група тех. майданчиків (скорочення)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "Група (ідентифікатор)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "Група (скорочення)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ідентифікатор)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "Батьківське місцезнаходження (ідентифікатор)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "Батьківське розташування (скорочення)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "Місцезнаходження (ідентифікатор)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "Місцезнаходження (скорочення)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "Виробник (ідентифікатор)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "Виробник (скорочення)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "Тип стійки (скорочення)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "Тип стійки (ідентифікатор)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Роль (ідентифікатор)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Роль (скорочення)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "Стійка (ідентифікатор)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "Користувач (ім'я)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "Платформа за замовчуванням (ідентифікатор)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "Платформа за замовчуванням (скорочення)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "Має фронтальне зображення" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "Має зображення ззаду" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "Має консольні порти" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "Має порти консольного сервера" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "Має порти живлення" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "Має розетки" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "Має інтерфейси" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "Має прохідні порти" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "Має модульні відсіки" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "Має відсіки для пристроїв" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "Має предмети інвентарю" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "Тип пристрою (ідентифікатор)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "Тип модуля (ідентифікатор)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "Порт живлення (ідентифікатор)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "Батьківський предмет інвентарю (ідентифікатор)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "Шаблон конфігурації (ідентифікатор)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "Тип пристрою (скорочення)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "Батьківський пристрій (ідентифікатор)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "Платформа (ідентифікатор)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "Платформа (скорочення)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "Назва тех. майданчика (скорочення)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "Батьківський відсік (ідентифікатор)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "Кластер віртуальних машини (ідентифікатор)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "Кластерна група (скорочення)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "Група кластерів (ідентифікатор)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "Модель пристрою (скорочення)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "Це повна глибина" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC-адреса" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "Має основний IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "Має IP для зовнішнього незалежного керування" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "Віртуальне шасі (ідентифікатор)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "Є віртуальним членом шасі" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "IP для зовнішнього незалежного керування (ідентифікатор)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "Має контекст віртуального пристрою" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "Імпульсне джерело живлення (ідентифікатор)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "Модель пристрою" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Інтерфейс (ідентифікатор)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "Тип модуля (модель)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "Відсік модуля (ідентифікатор)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Пристрій (ідентифікатор)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "Стійка (назва)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Пристрій (назва)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "Тип пристрою (модель)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "Роль пристрою (ідентифікатор)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "Роль пристрою (скорочення)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "Віртуальне шасі (ідентифікатор)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "Віртуальне шасі" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "Модуль (ідентифікатор)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "Кабель (ідентифікатор)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "Призначений VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "Призначений VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ідентифікатор)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "Віртуальні інтерфейси шасі для пристрою" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "Віртуальні інтерфейси шасі для пристрою (ідентифікатор)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "Вид інтерфейсу" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "Батьківський інтерфейс (ідентифікатор)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "Мостовий інтерфейс (ідентифікатор)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "Інтерфейс LAG (ідентифікатор)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "Контекст віртуального пристрою" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "Контекст віртуального пристрою (ідентифікатор)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "Бездротова локальна мережа" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "Бездротова зв'язок" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "Відсік батьківського модуля (ідентифікатор)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "Встановлений модуль (ідентифікатор)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "Встановлений пристрій (ідентифікатор)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "Встановлений пристрій (назва)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "Майстер (ідентифікатор)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "Майстер (ім'я)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "Орендар (ідентифікатор)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "Орендар (скорочення)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "Незакінчений" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "Панель живлення (ідентифікатор)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "Мітки" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "Позиція" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" @@ -3118,842 +3446,922 @@ msgstr "" "Підтримуються буквено-цифрові діапазони. (Повинен збігатися з кількістю " "створених імен.)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "Ім'я контакту" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "Контактний телефон" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "Контактна адреса електронної пошти" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "Часовий пояс" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "Виробник" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "Форм-фактор" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "Ширина" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "Висота (U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "Юніти у низхідному порядку" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "Зовнішня ширина" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "Зовнішня глибина" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "Зовнішній блок" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "Глибина монтажу" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "Вага" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "Максимальна вага" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "Вага юніта" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "Тип стійки" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "Зовнішні розміри" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "Габарити" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "Нумерація" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "Роль" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "Тип стійки" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "Серійний номер" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "Призначеня міток" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "Потік повітря" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "Стійка" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "Апаратне забезпечення" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "Платформа за замовчуванням" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "Номер партії" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "Висота U" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "Виключити з утилізації" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "Тип пристрою" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "Тип модуля" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "Шасі" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "Роль віртуальної машини" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "Шаблон конфігурації" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "Тип пристрою" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "Роль пристрою" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "Платформа" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "Кластер" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "Пристрій" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "Конфігурація" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "Віртуалізація" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "Тип модуля" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "Етикетка" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "Довжина" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "Довжина юніта" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "Домен" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "Панель живлення" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "Постачання" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "Фаза" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "Напруга" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "Сила струму" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "Максимальне використання" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "Максимальна потужність" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "Максимальна споживана потужність (Вт)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "Виділена потужність" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "Виділена споживана потужність (Вт)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "Порт живлення" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "Фідер живлення" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "Тільки управління" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "Режим PoE" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "Тип PoE" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "Бездротова роль" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "Модуль" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "LAG" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "Контексти віртуальних пристроїв" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "Швидкість" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "Режим" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "Група VLAN" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "VLAN без міток" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "VLAN'и з мітками" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "Додати VLAN'и з мітками" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "Видалити мітки з VLAN'ів" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "Група бездротової локальної мережі" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "Бездротові локальні мережі" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "Адресація" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "Операція" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "Пов'язані інтерфейси" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "Комутація 802.1Q" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "Додати/Видалити" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "Для призначення VLAN'ів необхідно вказати режим інтерфейсу" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "Інтерфейс доступу не може призначити VLAN'и з мітками." -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "Назва батьківського регіону" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "Назва батьківської групи тех. майданчиків" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "Призначений регіон" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "Призначена група" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "доступні опції" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "Призначений тех. майданчик" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "Місцезнаходження прабатька" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "Місцезнаходження не знайдено." -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "Виробник даного стелажного типу" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "Позиція з найменшою нумерованістю в стійці" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "Ширина рейки до рейки (у дюймах)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "Блок для зовнішніх розмірів" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "Блок для стелажних ваг" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "ПІБ призначеного орендаря" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "Назва призначеної ролі" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "Напрямок повітряного потоку" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "Батьківський тех. майданчик" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "Розташування стійки (якщо є)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "Юніти" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "Список окремих номерів юнітів, розділених комами" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "Виробник, який випускає цей тип пристрою" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "Платформа за замовчуванням для пристроїв такого типу (опціонально)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "Вага пристрою" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "Вага пристрою на 1 юніт" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "Вага модуля" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "Вага модуля на 1 юніт" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "Обмежте призначення платформи цьому виробнику" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "Призначена роль" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "Тип пристрою виробник" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "Модель типу пристрою" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "Призначена платформа" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "Віртуальне шасі" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "Кластер віртуалізації" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "Призначене місце розташування (якщо є)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "Призначена стійка (якщо така є)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "Лицева сторона" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "Змонтована лицева сторона стійки" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "Батьківський пристрій (для підпорядкованих пристроїв)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "Відсік для пристроїв" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "" "Відсік для пристрою, в якому встановлено цей пристрій (для підпорядкованих " "пристроїв)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "Пристрій, в якому встановлений даний модуль" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "Відсік для модулів" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "Відсік для модуля, в якому встановлений цей модуль" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "Тип модуля" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "Повторювання компонентів" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" @@ -3961,266 +4369,273 @@ msgstr "" "Автоматично заповнювати компоненти, пов'язані з цим типом модуля (увімкнено " "за замовчуванням)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "Прийняти компоненти" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "Прийняти вже існуючі компоненти" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "Тип порту" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "Швидкість порту в біт/с" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "Тип розетки (живлення)" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "Локальний порт живлення, який живить цю розетку" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "Електрична фаза (для трифазних ланцюгів)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "Батьківський інтерфейс" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "Інтерфейс типу мост" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "LAG" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "Батьківський інтерфейс LAG" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Джерела живлення постійного струму" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" "Імена джерел живлення постійного струму, розділені комами, укладені " "подвійними лапками. Приклад:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "Фізичне середовище" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "Дуплекс" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "Режим PoE" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "Тип PoE" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "Режим роботи IEEE 802.1Q (для інтерфейсів L2)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "Призначений VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "роль RF" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "Бездротова роль (AP/станція)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "" "Джерело живлення постійного струму {vdc} не призначається до пристрою " "{device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "Задній порт" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "Відповідний задній порт" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "Класифікація фізичного середовища" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "Встановлений пристрій" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "Підпорядкований пристрій, встановлений у цьому відсіку" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "Підпорядкований пристрій не знайдено." -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "Батьківський предмет інвентарю" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "Тип компонента" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "Тип компонента" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "Назва компонента" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "Назва компонента" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "Компонент не знайдено: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "Сторона А пристрою" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "Назва пристрою" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "Тип сторони А" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "Тип кінця" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "Назва сторони A" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "Назва кінця" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "Сторона Б пристрою" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "Тип сторони Б" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "Назва сторони B" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "Статус підключення" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "Сторона {side_upper}: {device} {termination_object} вже підключена" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} кінцева сторона не знайдена: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Майстер" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "Головний пристрій" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "Назва батьківського тех. майданчика" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "Вища за течією панель живлення" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "Первинний або надлишковий" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "Тип живлення (змінній/постійний струм)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "Однофазний або трифазний (струм)" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "Первинна адреса IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "IPv4 адреса з маскою, наприклад 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "Первинна адреса IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "IPv6 адреса з довжиною префікса, наприклад 2001:db8::1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " @@ -4230,7 +4645,7 @@ msgstr "" " і батьківський пристрій/інтерфейсу віртуальної машини, або вони повинні " "бути глобальними" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." @@ -4238,7 +4653,7 @@ msgstr "" "Не вдається встановити модуль із значеннями заповнювачів у відсіку модуля " "без визначеної позиції." -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " @@ -4247,189 +4662,200 @@ msgstr "" "Не вдається встановити модуль із значеннями відсік модуля у дереві відсіків " "модуля {level} на дереві, у якому усього{tokens} місця для встановлення." -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" "Не можна усиновити {model} {name}, оскільки він вже належить до модуля" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "А {model} названий {name} вже існує" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "Панель живлення" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "Живлення живлення" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "Сторона" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "Статус пристрою" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "Батьківський регіон" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "Батьківська група" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "Об'єкт" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "Тип стійки" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "Функція" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "Зображення" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "Компоненти" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "Роль підпристрою" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "Модель" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "Має IP-адресу для зовнішнього незалежного керування" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "Віртуальний елемент шасі" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "Має контексти віртуальних пристроїв" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "Кластерна група" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "Кабельний" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "Зайнятий" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "Підключення" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "Вид" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "Тільки управління" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN (унікальний ідентифікатор)" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "Бездротовий канал" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "Частота каналу (МГц)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "Ширина каналу (МГц)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "Потужність передачі (дБм)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "Кабель" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "Виявлено" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "Віртуальний елемент шасі вже існує на {vc_position} місці." -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "Контактна інформація" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "Роль стійки" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "Скорочення" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" "Виберіть попередньо визначений тип стійки або встановіть фізичні " "характеристики нижче." -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "Контроль запасів" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." @@ -4437,144 +4863,175 @@ msgstr "" "Список ідентифікаторів числових юнітів, розділених комами. Діапазон можна " "вказати за допомогою дефіса." -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "Бронювання" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "Роль пристрою" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "Юніт з найменшим номером, зайнятим пристроєм" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "Положення у віртуальному шасі цього пристрою визначається" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "Пріоритет пристрою в віртуальному шасі" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "Автоматично заповнювати компоненти, пов'язані з цим типом модуля" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "Характеристики" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" +"Буквено-цифрові діапазони підтримуються для масового створення. Змішані " +"регістри та типи в межах одного діапазону не підтримуються (приклад: " +"[ге, хе] -0/0/ [0-9]). Жетон {module}, якщо є, " +"буде автоматично замінено значенням позиції при створенні нового модуля." + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "Шаблон порту консолі" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "Шаблон порту консольного сервера" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "Шаблон фронтального порту" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "Шаблон інтерфейсу" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "Шаблон електрічної розетки" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "Шаблон порту живлення" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "Шаблон порту ззаду" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "Інтерфейс" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Порт консолі" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Порт консольного сервера" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "Передній порт" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "Порт ззаду" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "Порт живлення" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "Електрична розетка" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "Призначення компонентів" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "Елемент інвентаря можна призначити лише одному компоненту." -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "Інтерфейс LAG" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "Фільтр VLAN'ів, доступних для призначення за групами." -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "Підпорядкований пристрій" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." @@ -4582,32 +5039,35 @@ msgstr "" "Підпорядковані пристрої спочатку повинні бути створені та присвоєні до тех. " "майданчику та стійки батьківського пристрою." -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Консольний порт" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Порт консольного сервера" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "Передній порт" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "Розетка живлення" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "Елемент інвентаря" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "Роль елемента інвентаря" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" @@ -4615,7 +5075,7 @@ msgstr "" "Підтримуються буквено-цифрові діапазони. (Повинен збігатися з кількістю " "створюваних об'єктів.)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" @@ -4624,18 +5084,19 @@ msgstr "" "Наданий шаблон визначає {value_count} цінності, але {pattern_count} " "очікуються." -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "Порти ззаду" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "" "Виберіть одне призначення порту ззаду для кожного створюваного переднього " "порту." -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " @@ -4645,16 +5106,7 @@ msgstr "" "({frontport_count}) повинна відповідати вибраній кількості позицій портів " "ззаду ({rearport_count})." -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "" -"Рядок {module} буде замінено позицією призначеного модуля, якщо" -" такий є." - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " @@ -4663,17 +5115,18 @@ msgstr "" "Кількість передніх портів, які потрібно створити ({frontport_count}) повинна" " відповідати вибраній кількості позицій портів ззаду ({rearport_count})." -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "Члени" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "Початкова позиція" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." @@ -4681,65 +5134,67 @@ msgstr "" "Положення пристрою першого члена. Збільшується на одного для кожного " "додаткового члена." -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "Позиція повинна бути вказана для першого члена VC." -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "етикетка" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "довжина" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "довжина юніта" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "кабель" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "кабелів" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "Необхідно вказати номер юніта при установці довжини кабелю" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "Необхідно визначити кінці А і Б при створенні нового кабелю." -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "Не вдається підключити різні типи кінцевок до одного кінця кабелю." -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "Несумісні типи з'єднання: {type_a} і {type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "Кінцевки A і Б не можуть з'єднуватися з одним об'єктом." -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "кінець" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "кабельний кінець" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "кабельні кінці" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " @@ -4748,38 +5203,38 @@ msgstr "" "Знайдено дублікат кінця {app_label}.{model} {termination_id}: кабель " "{cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "Кабелі не можуть бути підключені в {type_display} інтерфейси" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" "Кінці каналу зв'язку, приєднані до мережі провайдера, не можуть бути " "кабельними." -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "активний" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "завершено" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "розщеплюється" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "кабельний шлях" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "кабельні шляхи" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " @@ -4788,16 +5243,16 @@ msgstr "" "{module} приймається як заміна позиції відсіку модуля при приєднанні до типу" " модуля." -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "Фізична етикетка" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "Шаблони компонентів не можна переміщати на інший тип пристрою." -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." @@ -4805,146 +5260,146 @@ msgstr "" "Шаблон компонента не може бути пов'язаний як з типом пристрою, так і з типом" " модуля." -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" "Шаблон компонента повинен бути пов'язаний з типом пристрою або типом модуля." -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "шаблон порту консолі" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "шаблони портів консолі" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "шаблон порту консольного сервера" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "шаблони портів консольного сервера" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "максимальна потужність" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "виділена потужність" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "шаблон порту живлення" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "шаблони портів живлення" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" "Виділена потужність не може перевищувати максимальну потужність " "({maximum_draw}Вт)." -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "фідер живлення" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "Фаза (для трифазних подач)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "шаблон розетки" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "шаблони розеток" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" "Батьківський порт живлення ({power_port}) повинен належати до одного типу " "пристрою" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" "Батьківський порт живлення ({power_port}) повинен належати до одного типу " "модуля" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "тільки управління" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "інтерфейс моста" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "бездротова роль" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "шаблон інтерфейсу" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "шаблони інтерфейсу" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "Інтерфейс не може бути з'єднаний мостом з собою." -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" "Інтерфейс моста ({bridge}) повинні складатися з пристроїв одного типу " -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "Інтерфейс моста ({bridge}) повинні складатися з модулів одного типу " -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "положення порту ззаду" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "шаблон переднього порту" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "шаблони передніх портів" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "Задній порт ({name}) повинні належати до одного типу пристрою" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " @@ -4953,47 +5408,47 @@ msgstr "" "Невірна позиція порту ззаду ({position}); порт ззаду {name} має тільки " "{count} позиції" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "позиції" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "шаблон порту ззаду" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "шаблони портів ззаду" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "позиція" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "" "Ідентифікатор для посилання при перейменуванні встановлених компонентів" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "шаблон відсіку модуля" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "шаблони відсіків модулів" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "шаблон відсіку пристрою" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "шаблони відсіків пристроїв" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " @@ -5002,206 +5457,211 @@ msgstr "" "Роль підпристрою типу пристрою ({device_type}) має бути встановлено значення" " \"батько\", щоб дозволити відсіки пристрою." -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "Ідентифікатор частини" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "Ідентифікатор деталі, призначений виробником" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "шаблон елемента інвентаря" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "шаблони елемента інвентаря" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "Компоненти не можна переміщати на інший пристрій." -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "кінець кабелю" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "позначка підключена" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "Ставтеся так, ніби підключений кабель" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "Необхідно вказати кінець кабелю (А або Б) при приєднанні кабелю." -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "Кінець кабелю не можна встановлювати без кабелю." -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "Не можна позначити як з'єднаний із приєднаним вже кабелем." -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "" "{class_name} моделі повинні спочатку оголосити властивість parent_object" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "Фізичний тип порту" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "швидкість" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "Швидкість порту в бітах в секунду" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "консольний порт" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "консольні порти" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "порт консольного сервера" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "порти консольного сервера" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "порт живлення" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "порти живлення" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "розетка" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "розетки" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" "Батьківський порт живлення ({power_port}) повинні належати до одного і того " "ж пристрою" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "режим" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "Стратегія міток IEEE 802.1Q" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "батьківський інтерфейс" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "батьківський LAG" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "" "Цей інтерфейс використовується лише для зовнішнього незалежного керування" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "швидкість (Кбіт/с)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "дуплекс" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64-розрядна всесвітня назва" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "бездротовий канал" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "частота каналу (МГц)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "Заповнюється вибраним каналом (якщо встановлено)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "потужність передачі (дБм)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "бездротові локальні мережі" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "VLAN без міток" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "VLAN'и з мітками" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "інтерфейс" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "інтерфейси" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type} інтерфейси не можуть мати приєднаний кабель." -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type} інтерфейси не можуть бути позначені як підключені." -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "Інтерфейс не може бути власним батьківським." -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" "Тільки віртуальні інтерфейси можуть бути призначені батьківському " "інтерфейсу." -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " @@ -5210,7 +5670,7 @@ msgstr "" "Вибраний батьківський інтерфейс ({interface}) належить до іншого пристрою " "({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " @@ -5219,7 +5679,7 @@ msgstr "" "Вибраний батьківський інтерфейс ({interface}) належить {device}, яка не є " "частиною віртуального шасі {virtual_chassis}." -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " @@ -5227,7 +5687,7 @@ msgid "" msgstr "" "Вибраний інтерфейс моста ({bridge}) належить до іншого пристрою ({device})." -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " @@ -5236,22 +5696,22 @@ msgstr "" "Вибраний інтерфейс моста ({interface}) належить {device}, який не є частиною" " віртуального шасі {virtual_chassis}." -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "Віртуальні інтерфейси не можуть бути батьківським інтерфейсом LAG." -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "Інтерфейс LAG не може бути власним батьківським інтерфейсом." -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" "Вибраний інтерфейс LAG ({lag}) належить до іншого пристрою ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" @@ -5260,49 +5720,49 @@ msgstr "" "Вибраний інтерфейс LAG ({lag}) належить {device}, який не є частиною " "віртуального шасі {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "Віртуальні інтерфейси не можуть мати режим PoE." -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "Віртуальні інтерфейси не можуть мати тип PoE." -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "Необхідно вказати режим PoE при створенні інтерфейсу типу PoE." -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "" "Роль бездротового зв'язку може бути встановлена тільки на бездротових " "інтерфейсах." -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "Канал (Wi-Fi) можна встановлювати тільки на бездротових інтерфейсах." -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" "Частота каналу (Wi-Fi) може встановлюватися тільки на бездротових " "інтерфейсах." -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "Неможливо вказати користувацьку частоту при вибраному каналі (Wi-Fi)." -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "" "Ширина каналу (Wi-Fi) може бути встановлена тільки на бездротових " "інтерфейсах." -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "Неможливо вказати користувацьку ширину при вибраному каналі." -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -5311,24 +5771,24 @@ msgstr "" "VLAN без міток ({untagged_vlan}) повинен належати тому ж тех. майданчику, що" " і батьківський пристрій інтерфейсу, або ж він повинен бути глобальним." -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "Відображене положення на відповідному порті ззаду" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "передній порт" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "передні порти" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "Порт ззаду ({rear_port}) повинні належати до одного і того ж пристрою" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" @@ -5337,19 +5797,19 @@ msgstr "" "Невірна позиція порту ззаду ({rear_port_position}): порт ззаду {name} має " "тільки {positions} позицій." -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "Кількість передніх портів, які можуть бути відображені" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "порт ззаду" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "порти ззаду" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" @@ -5358,37 +5818,38 @@ msgstr "" "Кількість позицій не може бути меншою за кількість відображених фронтальних " "портів ({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "відсік модуля" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "відсіки модуля" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "Відсік модуля не може належати модулю, встановленому в ньому." -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "відсік пристрою" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "відсіки для пристроїв" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" "Даний тип пристрою ({device_type}) не підтримує відсіки для пристроїв." -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "Не вдається встановити пристрій в себе." -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." @@ -5396,112 +5857,114 @@ msgstr "" "Не вдається встановити вказаний пристрій, бо пристрій вже встановлено в " "{bay}." -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "роль елемента інвентаря" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "ролі елемента інвентаря" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "серійний номер" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "призначеня мітки" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "" "Унікальна мітка, яка використовується для ідентифікації цього елемента" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "виявлено" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "Цей елемент був автоматично виявлений" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "елемент інвентаря" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "елементи інвентаря" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "Не вдається призначити себе батьком." -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "Батьківський елемент інвентаря не належить до одного пристрою." -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "Не можливо переміщати елемент інвентаря з підпорядкованим елементом" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "Не можливо призначати елемент інвентаря компоненту у іншому пристрої" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "виробник" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "виробники" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "модель" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "платформа за замовчуванням" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "номер деталі" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "Дискретний номер деталі (необов'язково)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "висота (U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "виключити з підрахунку утилізації" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "Пристрої такого типу виключаються при підрахунку утилізації стійки." -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "є повною глибиною" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "Пристрій споживає як передні, так і задні грані стійки." -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "статус батька/дитини" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." @@ -5509,24 +5972,24 @@ msgstr "" "Батьківські пристрої розміщують дочірні пристрої в відсіках пристроїв. " "Залиште порожнім, якщо цей тип пристрою не є ані батьком, ані дитиною." -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "повітряний потік" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "тип пристрою" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "типи пристроїв" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "Висота має зазначатись з точністю до 0,5 юніта." -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" @@ -5535,7 +5998,7 @@ msgstr "" "В стійці {rack} не має достатньо вільного місця для розміщення " "пристрою{device}висотою {height}юніта" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " @@ -5544,7 +6007,7 @@ msgstr "" "Не вдалося встановити висоту 0 юніта, бо в стійці вже змонтовано {racked_instance_count} пристроїв." -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." @@ -5552,152 +6015,152 @@ msgstr "" "Необхідно видалити всі шаблони відсіків пристроїв, пов'язані з цим " "пристроєм, перш ніж перевизначати його як батьківський пристрій." -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "Підпорядковані типи пристроїв повинні бути висоту 0 юніт." -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "тип модуля" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "типи модулів" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "Віртуальні машини можуть бути призначені для цієї ролі" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "роль пристрою" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "ролі пристрою" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "Опціонально обмежити цю платформу пристроями певного виробника" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "платформа" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "платформи" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "Функція, яку виконує цей пристрій" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "Серійний номер шасі, наданий виробником" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "" "Унікальна мітка, яка використовується для ідентифікації цього пристрою" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "позиція (юніт)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "лицева частина стійки" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "первинна адреса IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "первинна адреса IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "IP для зовнішнього незалежного керування" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "Позиція віртуального шасі" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "Позиція віртуального шасі" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "Пріоритет віртуального шасі" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "Пріоритет виборів майстра віртуального шасі" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "широта" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS-координата в десятковому форматі (xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "довгота" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "Ім'я пристрою має бути унікальним для кожного тех. майданчика." -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "пристрій" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "пристрої" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "Стійка {rack} не належить до тех. майданчику {site}." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "Розташування {location} не належить до тех. майданчика {site}." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "Стійка {rack} не належить до місцезнаходження {location}." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "" "Не вдається вибрати лицеву частину стійки без призначення самої стійки." -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "Не вдається вибрати положення стійки без призначення самої стійки." -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "Положення повинно бути з кроком в 0,5 юніта." -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "" "Необхідно вказати лицеву частину стійки при визначенні положення стійки." -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." @@ -5705,7 +6168,7 @@ msgstr "" "Тип пристрою 0 юніта ({device_type}) не може бути призначений для положення " "стійки." -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." @@ -5713,7 +6176,7 @@ msgstr "" "Підпорядковані типи пристроїв не можуть бути призначені для лицевої частини " "стійки. Це атрибут батьківського пристрою." -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." @@ -5721,7 +6184,7 @@ msgstr "" "Підпорядковані типи пристроїв не можуть бути призначені для розміщення у " "стійки. Це атрибут батьківського пристрою." -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " @@ -5730,22 +6193,22 @@ msgstr "" "Монтажна позиція{position}юніт вже зайнята або не має достатньо вільного " "місця для розміщення цього пристрою: {device_type} ({u_height}юніта)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} Це не IPv4 адреса." -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "Зазначена IP-адреса ({ip}) не призначається до цього пристрою." -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} Це не IPv6 адреса." -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5754,18 +6217,18 @@ msgstr "" "Призначена платформа обмежена {platform_manufacturer} типом пристроїв, але " "цей тип пристрою належить до {devicetype_manufacturer}." -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "Призначений кластер належить іншому тех. майданчику ({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" "Для пристрія, призначеного для віртуального шасі, повинно бути задане " "положення." -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " @@ -5774,15 +6237,15 @@ msgstr "" "Пристрій неможливо видалити з віртуального шасі {virtual_chassis} тому, що в" " даний час він призначений майстром." -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "модуль" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "модулі" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " @@ -5791,21 +6254,21 @@ msgstr "" "Модуль повинен бути встановлений у відсіку модуля, що належить призначеному " "пристрою ({device})." -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "домен" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "віртуальні шасі" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "Обраний майстер ({master}) не присвоюється цьому віртуальному шасі." -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " @@ -5814,61 +6277,61 @@ msgstr "" "Неможливо видалити віртуальне шасі {self}. Існують мережеві інтерфейси, які " "утворюють інтерфейси LAG між шасі." -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "ідентифікатор" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "Числовий ідентифікатор, унікальний для батьківського пристрою" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "коментарі" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "контекст віртуального пристрою" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "контексти віртуальних пристроїв" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} не є IPv{family} адресою." -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" "Первинна IP-адреса повинна належати інтерфейсу на призначеному пристрої." -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "вага" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "одиниця ваги" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "Необхідно вказати одиницю виміру при установці ваги" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "панель живлення" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "панелі живлення" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" @@ -5876,43 +6339,43 @@ msgstr "" "Розташування {location} ({location_site}) знаходиться на іншому тех. " "майданчику, ніж {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "постачання" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "фаза" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "напруга" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "сила струму" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "максимальне використання" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "Максимальна допустима потужність (відсоток)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "доступна потужність" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "подача живлення" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "подачі живлення" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " @@ -5921,63 +6384,63 @@ msgstr "" "Стійка {rack} ({rack_site}) та панель живлення {powerpanel} " "({powerpanel_site}) знаходяться на різних тех. майданчиках." -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "Напруга не може бути негативною для живлення змінного струму" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "ширина" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "Ширина рейки до рейки" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "Висота стійки у юнітах" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "начальний юніт" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "Начальний юніт для стійки" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "юніти у низхідному порядку" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "Юніти нумеруються зверху вниз" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "зовнішня ширина" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "Зовнішній розмір стійки (ширина)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "зовнішня глибина" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "Зовнішній розмір стійки (глибина)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "зовнішній блок" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "монтажна глибина" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." @@ -5985,77 +6448,78 @@ msgstr "" "Максимальна глибина змонтованого пристрою, в міліметрах. Для чотиристійкових" " стійок це відстань між передньою і задньою рейками." -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "макс. вага" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "Максимальна вантажопідйомність для стійки" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "форм-фактор" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "тип стійки" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "типи стійки" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "" "Необхідно вказати одиницю виміру при встановленні зовнішньої ширини/глибини" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "Необхідно вказати одиницю виміру при встановленні максимальної ваги" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "роль стійки" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "ролі стійки" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "Ідентифікатор об'єкта" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "Локально призначений ідентифікатор" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "Функціональна роль" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "Унікальна мітка, який використовується для ідентифікації цієї стійки" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "стійка" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "стійки" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "" "Призначене місце розташування повинно належати батьківському тех. майданчику" " ({site})." -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " @@ -6064,7 +6528,7 @@ msgstr "" "Стійка має бути не нижча, ніж {min_height}юніт, щоб місця було достатньо для" " розміщення вже встановлених пристроїв." -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " @@ -6073,898 +6537,960 @@ msgstr "" "Нумерація стійок повинна починатися з {position} або не менше для розміщення" " встановлених на даний момент пристроїв." -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "Розташування повинно бути з одного і того ж тех. майданчика, {site}." -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "юнітів" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "резервування стійки" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "бронювання стійки" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" "Недійсне монтажне місце для стійки висотою {height} юнітів: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "Наступні юніти вже зарезервовані: {unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "Регіон верхнього рівня з такою назвою вже існує." -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "Регіон верхнього рівня з цим скореченням вже існує." -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "регіон" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "регіони" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "Група тех. майданчиків верхнього рівня з такою назвою вже існує." -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "Група тех. майданчиків верхнього рівня з цим скореченням вже існує." -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "група тех. майданчиків" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "групи тех. майданчиків" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "Повна назва тех. майданчику" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "об'єкт" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "Ідентифікатор або опис місцевого об'єкта" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "фізична адреса" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "Фізичне розташування будівлі" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "адреса доставки" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "Якщо відрізняється від фізичної адреси" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "тех. майданчик" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "тех. майданчики" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "" "Місцезнаходження з цим ім'ям вже існує в межах зазначеного тех. майданчика." -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "" "Місцезнаходження з цим скороченням вже існує в межах зазначеного тех. " "майданчику." -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "локація" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "локації" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" "Батьківське місцезнаходження ({parent}) повинні належати одному тех. " "майданчику ({site})." -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "Кінець А" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "Кінець Б" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "Пристрій А" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "Пристрій Б" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "Місцезнаходження A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "Місцезнаходження Б" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "Стійка А" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "Стійка Б" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "Тех. майданчик А" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "Тех. майданчик Б" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "Доступний" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "Пристрої" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "Віртуальні машини" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "Шаблон конфігурації" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "Група тех. майданчиків" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP-адреса" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "Адреса IPv4" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "Адреса IPv6" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "Позиція віртуальної шасі" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "Пріоритет віртуальної шасі" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "Батьківський пристрій" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "Позиція (відсік пристрою)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Консольні порти" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Порти консольного сервера" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "Порти живлення" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "Розетки" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "Інтерфейси" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "Передні порти" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "Відсіки для пристроїв" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "Модульні відсіки" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "Елементи інвентаря" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Резервуар модулів" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "Елементи інвентаря" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "Колір кабелю" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "З'єднання мережевих сусідів" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "Позначене підключення" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "Максимальна потужність (Вт)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "Виділена потужність (Вт)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP-адреси" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "Групи FHRP/VRRP" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "Тунель" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "Тільки управління" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "Джерела живлення постійного струму" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "Встановлений модуль" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "Послідовний модуль" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "Призначеня мітки на модуль" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "Статус модуля" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "Компонент" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "Предмети" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "Типи пристроїв" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "Типи модулів" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "Платформи" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "Платформа за замовчуванням" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "Повна глибина" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "Висота юніта(U)" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "Екземпляри" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Консольні порти" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Порти консольного сервера" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "Порти живлення" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "Розетки" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "Передні порти" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "Задні порти" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "Відсіки для пристроїв" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "Модульні відсіки" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "Подачі живлення" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "Максимальне використання (живлення)" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "Доступна потужність (ВА)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "Стійки" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "Висота" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "Зовнішня ширина" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "Зовнішня глибина" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "Максимальна вага" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "Простір" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "Тех. майданчики" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "Тестовий випадок повинен встановити peer_termination_type" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "Відключено {count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "Бронювання" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "Пристрої без можливості кріплення у стійку" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "Контекст конфігурації" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "Відтворення конфігурації" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "Під час візуалізації шаблону сталася помилка: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "Віртуальні машини" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "Встановлений пристрій {device} в бухті {device_bay}." -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "Видалений пристрій {device} з бухти {device_bay}." -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "Підпорядкований" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "Доданий член {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "Неможливо видалити головний пристрій {device} від віртуального шасі." -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "Вилучено {device} з віртуального шасі {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "Невідомий пов'язаний об'єкт(и): {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "Зміна типу призначених для користувача полів не підтримується." -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "Планування не ввімкнено для цього сценарію." -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "Текст" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "Текст (довгий)" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "Ціле число" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "Десяткове число" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "Булевий тип (правда/неправда)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "Дата" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "Дата та час" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "Вибір" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "Множинний вибір" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "Кілька об'єктів" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "Вимкнений" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "Пухкий" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "Точний" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "Завжди" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "Якщо встановлено" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "Прихований" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "Так" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "Ні" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "Посилання" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "Найновіші" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "Найстаріший" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "Зростання за алфавітом (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "Спадання за алфавітом (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "Інформація" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "Успіх" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "Попередження" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "Небезпека" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "Налагодження" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "За замовчуванням" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "Невдача" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "Погодинно" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12 годин" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "Щодня" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "Щотижневий" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30 днів" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "Створити" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "Оновити" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "Видалити" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "Синій" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "Індиго" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "Фіолетовий" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "Рожевий" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "Червоний" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "Помаранчевий" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "Жовтий" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "Зелений" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "Бірюзовий" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "Блакитний" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "Сірий" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "Чорний" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "Білий" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Веб-хук" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "Сценарій" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "Повідомлення" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "Невідомий оператор: {op}. Повинен бути один з: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "Тип значення, що не підтримується: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "Невірний тип для {op} операції: {value}" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "Набір правил повинен бути словником, а не {ruleset}." -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "" "Невірний тип логіки: має бути 'ТАК' або 'АБО'. Будь ласка, перевірте " "документацію." -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "" "Поінформовано про неправильний ключ(і). Будь ласка, перевірте документацію." -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "Тип віджету" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "Незареєстрований клас віджетів: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name} повинен визначити метод render()." -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "Примітка" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "" "Відображення будь-якого довільного користувацького вмісту. Підтримується " "розмітка Markdown." -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "Кількість об'єктів" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." @@ -6972,268 +7498,290 @@ msgstr "" "Відображення набору моделей NetBox та кількості об'єктів, створених для " "кожного типу." -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "Фільтри, які застосовуються при підрахунку кількості об'єктів" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "Невірний формат. Фільтри об'єктів повинні бути передані як словник." -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "Список об'єктів" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "Відображення довільного списку об'єктів." -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "Кількість об'єктів за замовченням для відображення" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "" "Невірний формат. Параметри URL-адреси повинні бути передані як словник." -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS-канал" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "Вбудовувати RSS-канал із зовнішнього веб-сайту." -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "URL-адреса каналу" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "Максимальна кількість об'єктів для відображення" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "Як довго зберігати кешований вміст (в секундах)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "Закладки" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "Показувати особисті закладки" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Невідомий тип дії для правила події: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Не вдається імпортувати конвеєр подій {name} Помилка: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "Модуль сценарію (ідентифікатор)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "Файл даних (ідентифікатор)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "Група (назва)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "Тип кластера" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "Кластерний тип (скорочення)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "Група орендарів" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "Група орендарів (скорочення)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "Мітка" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "Мітка (скорочення)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "Має локальні контекстні дані конфігурації" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "Назва групи" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "Обов'язково" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "Повинен бути унікальним" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "Видимий інтерфейс користувача" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "Редагований інтерфейс користувача" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "Чи можна клонувати" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "Мінімальне значення" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "Максимальне значення" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "Регулярний вираз перевірки" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "Поведінка" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "Нове вікно" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "Клас кнопок" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "Тип MIME" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "Розширення файлу" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "Як вкладення" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "Спільний" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "Метод HTTP" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "URL-адреса корисного навантаження" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "Перевірка SSL" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "Таємниця" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "Шляхи до файлу CA" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "Типи подій" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "Активний" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "Типи об'єктів" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "Один або кілька присвоєних типів об'єктів" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "Тип даних поля (наприклад, текст, ціле число тощо)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "Тип об'єкта" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "Тип об'єкта (для об'єктів або полів з кількома об'єктами)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "Набір для вибору" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "Набір для вибору (для полів виділення)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "Чи відображатиметься користувацьке поле в інтерфейсі користувача" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "Чи можна редагувати користувацьке поле в інтерфейсі користувача" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "" "Базовий набір попередньо визначених варіантів для використання (якщо є)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" @@ -7242,184 +7790,200 @@ msgstr "" "мітками, розділеними двокрапкою: \"Вибір1:Перший вибір, Вибір2:другий " "вибір\"" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "клас кнопок" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "" "Клас першого посилання в групі буде використовуватися для спадної кнопки" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "Тип(и) події, які ініціюватимуть це правило" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "Об'єкт дії" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Ім'я вебхука або скрипт у вигляді пунктирного шляху module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "Веб-хук {name} не знайдено" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "Сценарій {name} не знайдено" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "Призначений тип об'єкта" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "Класифікація вступу" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "Користувачі" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "Імена користувачів, розділені комами, укладені подвійними лапками" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "Групи" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "Імена груп, розділені комами, укладені подвійними лапками" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "Пов'язаний тип об'єкта" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "Тип поля" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "Вибір" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "Дані" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "Файл даних" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "Типи контенту" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "Тип вмісту HTTP" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "Тип події" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "Тип дії" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "Тип об'єкта з позначкою" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "Дозволений тип об'єкта" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "Регіони" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "Групи тех. майданчиків" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "Локації" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "Типи пристроїв" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "Ролі" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "Типи кластерів" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "Кластерні групи" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "Кластери" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "Групи орендарів" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "Тип(и) об'єкта, які мають користувацьке поле" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "Значення за замовчуванням" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "Тип пов'язаного об'єкта (лише для об'єктних/багатооб'єктних полів)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "Фільтр пов'язаних об'єктів" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "Вкажіть параметри запиту як об'єкт JSON." -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "Користувацьке поле" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." @@ -7427,7 +7991,7 @@ msgstr "" "Тип даних, що зберігаються в цьому полі. Для полів об'єкт/багатооб'єкт " "виберіть відповідний тип об'єкта нижче." -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." @@ -7435,11 +7999,11 @@ msgstr "" "Це відображатиметься як текст довідки для поля форми. Markdown " "підтримується." -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "Пов'язаний об'єкт" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" @@ -7447,15 +8011,16 @@ msgstr "" "Введіть один вибір на рядок. Додаткову мітку можна вказати для кожного " "вибору, додавши її двокрапкою. Приклад:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "Користувацьке посилання" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "Шаблони" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " @@ -7464,7 +8029,7 @@ msgstr "" "Код шаблону Jinja2 для тексту посилання. Посилання на об'єкт як {example}. " "Посилання, які відображаються як порожній текст, не відображатимуться." -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." @@ -7472,52 +8037,58 @@ msgstr "" "Код шаблону Jinja2 для URL-адреси посилання. Посилання на об'єкт як " "{example}." -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "Код шаблону" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "Експортувати шаблон" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "Відтворювати" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "Вміст шаблону заповнюється з віддаленого джерела, вибраного нижче." -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "Повинен вказати локальний вміст або файл даних" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "Збережений фільтр" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "Група сповіщень вказує принаймні одного користувача або групи." -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "Запит HTTP" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "Вибір дії" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "Введіть умови в JSON форматі." -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." @@ -7525,110 +8096,112 @@ msgstr "" "Введіть параметри для переходу до дії у JSON форматі." -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "Правило події" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "Тригери" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "Група повідомлень" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "Орендарі" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "Дані заповнюються з віддаленого джерела, вибраного нижче." -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "Необхідно вказати локальні дані або файл даних" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "Зміст" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "Графік роботи в" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "Заплануйте виконання звіту до встановленого часу" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "Повторюється кожного" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "Інтервал, з яким цей звіт повторно виконується (у хвилині)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (поточний час: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "Запланований час повинен бути в майбутньому." -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "Здійснити зміни" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "" "Здійснити внесення змін до бази даних (зніміть прапорець для сухого запуску)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "Заплануйте виконання сценарію до встановленого часу" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "Інтервал повторного запуску сценарію (у хвилині)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "Зміни бази даних були автоматично скасовані." -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "Скрипт перерваний з помилкою: " -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "Виняток стався: " -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "Зміни бази даних були скасовані через помилку." -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "Індексаторів не знайдено!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "контекст конфігурації" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "контексти конфігурації" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "Дані JSON повинні бути у формі об'єкта. Приклад:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" @@ -7636,19 +8209,19 @@ msgstr "" "Дані контексту локальної конфігурації мають перевагу над вихідними " "контекстами в кінцевому контексті конфігурації" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "код шаблону" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Код шаблону Jinja2." -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "параметри середовища" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7658,40 +8231,40 @@ msgstr "" "href=\"https://jinja.palletsprojects.com/en/3.1.x/api/#jinja2.Environment\">додаткові" " параметри пройти при побудові середовища Jinja2." -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "шаблон конфігурації" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "шаблони конфігурації" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "Об'єкт (и), до яких застосовується це поле." -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "Тип даних, які містить користувацьке поле" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "" "Тип об'єкта NetBox, з яким співвідноситься дане поле (для полів об'єкта)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "Ім'я внутрішнього поля" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "Дозволені лише буквено-цифрові символи та підкреслення." -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "Подвійне підкреслення не дозволено у користувацьких назвах полів." -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" @@ -7699,19 +8272,19 @@ msgstr "" "Назва поля, яке відображається користувачам (якщо не вказано, буде " "використано 'ім'я поля')" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "назва групи" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "Користувацькі поля в одній групі відображатимуться разом" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "обов'язковий" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." @@ -7719,19 +8292,19 @@ msgstr "" "Це поле обов'язкове для створення нових об'єктів або редагування існуючого " "об'єкта." -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "має бути унікальним" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "Значення цього поля має бути унікальним для призначеного об'єкта" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "вага пошуку" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." @@ -7739,11 +8312,11 @@ msgstr "" "Зважування для пошуку. Більш важливими вважаються нижчі значення. Поля з " "вагою пошуку нуль ігноруватимуться." -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "логіка фільтра" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." @@ -7751,11 +8324,11 @@ msgstr "" "Вільне відповідає будь-якому екземпляру заданого рядка; точно - відповідає " "всьому полю." -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "за замовчуванням" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." @@ -7763,7 +8336,7 @@ msgstr "" "Значення за замовчуванням для поля (має бути значення JSON). Інкапсулювати " "рядки з подвійними лапками (наприклад, \"Foo\")." -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." @@ -7772,35 +8345,35 @@ msgstr "" "(має бути значення JSON). Інкапсулюйте рядки подвійними лапками (наприклад, " "\"Foo\")." -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "відображення ваги" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "Поля з більшою вагою відображаються нижче у формі." -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "мінімальне значення" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "Мінімальне дозволене значення (для числових полів)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "максимальне значення" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "Максимально дозволене значення (для числових полів)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "регулярний вираз перевірки" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7811,190 +8384,192 @@ msgstr "" "і $ для примусового збігу всього рядка. Наприклад, ^ [А-Z]{3}$ " "обмежить значення рівно трьома великими літерами." -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "набір вибору" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "" "Визначає, чи відображатиметься користувацьке поле в інтерфейсі користувача" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "" "Визначає, чи можна редагувати значення користувацького поля в інтерфейсі" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "є клонованим" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "Повторюйте це значення під час клонування об'єктів" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "користувацьке поле" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "користувацькі поля" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "Невірне значення за замовчуванням \"{value}\": {error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "Мінімальне значення може бути встановлено лише для числових полів" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "Максимальне значення може бути встановлено лише для числових полів" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "" "Перевірка регулярних виразів підтримується лише для текстових та URL полів" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "Унікальність не може бути застосована для булевих полів" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "Поля виділення повинні вказувати набір варіантів." -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "Вибір можна встановити лише для виділених полів." -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "Поля об'єкта повинні визначати тип об'єкта." -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type} поля не можуть визначати тип об'єкта." -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "" "Пов'язаний об'єктний фільтр може бути визначений лише для полів об'єктів." -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "" "Фільтр повинен бути визначений як словник, що відображає атрибути зі " "значеннями." -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "Iстинна" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "Хибно" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "Значення повинні відповідати цьому регексу: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "Значення має бути рядком." -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "Значення має збігатися з регулярним виразом '{regex}'" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "Значення має бути цілим числом." -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "Значення повинно бути меньш, ніж {minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "Значення не повинно перевищувати {maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "Значення має бути десятковим." -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "Значення має бути істинним або хибним." -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "Значення дати повинні бути у форматі ISO 8601 (РРРР-ММ-ДД)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "" "Значення дати та часу повинні бути у форматі ISO 8601 (РРРР-ММ-ДД ГГ:ХХ:СС)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "Невірний вибір ({value}) для набору варіантів {choiceset}." -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "Невірний вибір(и) ({value}) для набору варіантів {choiceset}." -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "Значення має бути ідентифікатором об'єкта, а не {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "Значення має бути списком ідентифікаторів об'єктів, а не {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "Знайдено недійсний ідентифікатор об'єкта: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "Обов'язкове поле не може бути порожнім." -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "Базовий набір попередньо визначених варіантів (необов'язково)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "Вибір автоматично впорядковується за алфавітом" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "набір вибору користувацького поля" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "набори вибору користувацького поля" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "Повинен визначити базовий або додатковий вибори." -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8003,60 +8578,60 @@ msgstr "" "Не вдається видалити вибір {choice} так, як є {model} об'єкти, які " "посилаються на нього." -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "макет" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "конфігурація" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "інформаційна панель" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "інформаційні панелі" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "типи об'єктів" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "Об'єкт(и), до яких застосовується це правило." -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "Типи подій, які викличуть спрацьовання цього правила." -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "умови" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "Набір умов, які визначають, чи буде подія генеруватися." -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "тип дії" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "Додаткові дані для передачі об'єкту дії" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "правило події" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "правила подій" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" @@ -8066,7 +8641,7 @@ msgstr "" "виклику веб-хука. Обробка шаблонів Jinja2 підтримується в тому ж контексті, " "що і тіло запиту." -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available тут." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "додаткові заголовки" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -8092,11 +8667,11 @@ msgstr "" "Назва: Значення. Обробка шаблонів Jinja2 підтримується в тому ж" " контексті, що і тіло запиту (нижче)." -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "шаблон тіла" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -8109,11 +8684,11 @@ msgstr "" " ім'я користувача, ідентифікатор запиту, і " "дані." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "таємниця" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -8123,15 +8698,15 @@ msgstr "" "що містить шістнадцядковий дайджест HMAC тіла корисного навантаження з " "використанням секрету як ключа. Таємниця не передається у запиті." -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "Увімкнути перевірку сертифіката SSL. Відключайте з обережністю!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "Шляхи до файлу CA" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." @@ -8139,63 +8714,63 @@ msgstr "" "Конкретний файл сертифіката CA для перевірки SSL. Залиште порожнім, щоб " "використовувати параметри системи за замовчуванням." -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "веб-хук" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "веб-хуки" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "Не вказуйте файл сертифіката CA, якщо перевірка SSL вимкнена." -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "Тип(и) об'єкта, до яких застосовується це посилання." -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "текст посилання" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "Код шаблону Jinja2 для тексту посилання" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "URL-адреса посилання" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "Код шаблону Jinja2 для URL-адреси посилання" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "Посилання з тією ж групою відображатимуться у випадаючому меню" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "нове вікно" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "Примусове відкриття посилання в новому вікні" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "користувацьке посилання" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "користувацькі посилання" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "Тип(и) об'єкта, до яких застосовується цей шаблон." -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." @@ -8203,1084 +8778,1150 @@ msgstr "" "Код шаблону Jinja2. Список об'єктів, що експортуються, передається як " "контекстна змінна з назвою запит." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "За замовчуванням text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "розширення файлу" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "Розширення для додавання до відтвореної назви файлу" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "як вкладення" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "Завантажити файл як вкладення" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "експорт шаблону" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "експортувати шаблони" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "\"{name}\" - це зарезервована назва. Будь ласка, виберіть іншу назву." -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "Тип(и) об'єкта, до яких застосовується цей фільтр." -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "спільні" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "збережений фільтр" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "збережені фільтри" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "" "Параметри фільтра повинні зберігатися як словник аргументів ключових слів." -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "висота зображення" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "ширина зображення" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "вкладення зображення" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "вкладення зображень" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "" "Вкладені зображення не можуть бути призначені для цього типу об'єкта " "({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "добрий" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "запис журналу" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "записи журналу" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "Журналізація не підтримується для цього типу об'єктів ({type})." -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "закладка" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "закладки" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "Закладки не можуть бути призначені для цього типу об'єкта ({type})." -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "читати" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "подія" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "сповіщення" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "сповіщення" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "Об'єкти такого типу ({type}) не підтримують сповіщення." -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "груп" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "користувачів" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "група повідомлень" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "групи повідомлень" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "підписка" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "підписки" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "є виконуваним" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "сценарій" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "скриптів" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "модуль сценарію" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "модулі скриптів" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "мітка часу" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "поле" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "значення" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "кешоване значення" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "кешовані значення" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "гілка" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "гілки" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "поетапна зміна" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "поетапні зміни" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "Тип(и) об'єкта, до яких можна застосувати цю позначку." -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "мітка" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "мітки" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "позначений предмет" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "позначені предмети" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "Дані сценарію" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "Параметри виконання сценарію" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "Відхилити" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "Типи об'єктів" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "Перевірте унікальність" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "видимий" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "Редагований" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "Пов'язаний тип об'єкта" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "Набір вибору" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "Чи можна клонувати" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "Мінімальне значення" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "Максимальне значення" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "Перевірка регулярного вираза" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "Графік" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "Порядок за алфавітом" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "Нове вікно" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "Як вкладення" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "Файл даних" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "Синхронізовано" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "Зображення" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "Розмір (байт)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "Читати" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "Перевірка SSL" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "Типи подій" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "Ролі пристроїв" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "Коментарі (короткі)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "Лінія" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "Рівень" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "Повідомлення" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "Метод" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "Переконайтеся, що це значення дорівнює %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "Переконайтеся, що це значення не дорівнює %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "Це поле має бути порожнім." -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "Це поле не повинно бути порожнім." -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "Правила перевірки повинні бути передані як словник" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "" "Користувацька перевірка зіткнулася з невдачею через{attribute}: {exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "Невірний атрибут \"{name}\" за запитом" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "Невірний атрибут \"{name}\" для {model}" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "Ваша інформаційна панель була скинута." -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "Доданий віджет: " -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "Оновлений віджет: " -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "Видалений віджет: " -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "Помилка при видаленні віджета: " -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "Неможливо запустити скрипт: робочий процес RQ не запущений." -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "Введіть дійсну адресу IPv4 або IPv6 з необов'язковою маскою." -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "Невірний формат IP-адреси: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "" "Введіть дійсний мережевий префікс IPv4 або IPv6 та маску в позначенні CIDR." -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "Невірний формат префікса IP: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "Недостатньо місця для розміщення запитуваного розміру префікса" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "Контейнер" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Анікаст" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "Стандарт" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "Контрольна точка" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "Cisco" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "Простий текст" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "Невірний формат IP-адреси: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "Імпортувати ціль" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "Імпорт цілі (назва)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "Ціль експорту" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "Ціль експорту (назва)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "Імпортування VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "Імпорт VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "Експорт VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "Експорт VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "Імпорт L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "Імпорт L2VPN (ідентифікатор)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "Експорт L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "Експорт L2VPN (ідентифікатор)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Префікс" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR (ідентифікатор)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIR (скорочення)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "У межах префікса" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "У межах та включаючи префікс" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "Мережеві префікси, які містять цей префікс або IP" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Довжина маски" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ідентифікатор)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Номер VLAN (1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Адреса" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "Діапазони, які містять цей префікс або IP" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "Батьківський префікс" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Віртуальна машина (назва)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Віртуальна машина (ідентифікатор)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Інтерфейс (назва)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Інтерфейс віртуальної машини (назва)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Інтерфейс віртуальної машини (ідентифікатор)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "Група FHRP/VRRP (ідентифікатор)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "Призначений до інтерфейсу" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "призначається" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "Сервіс (ідентифікатор)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT внутрішня IP-адреса (ідентифікатор)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Призначений інтерфейс" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "Призначений інтерфейс віртуальної машини" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP-адреса (ідентифікатор)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP-адреса" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "Первинна адреса IPv4 (ідентифікатор)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "Первинна адреса IPv6 (ідентифікатор)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "Введіть дійсну адресу IPv4 або IPv6 (без маски)." -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "Невірний формат адреси IPv4/IPv6: {address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "Для цього поля потрібна IP-адреса без маски." -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "Будь ласка, вкажіть дійсну адресу IPv4 або IPv6." -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "Введіть дійсну адресу IPv4 або IPv6 (з маскою CIDR)." -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "Потрібна маска CIDR (наприклад, /24)." -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "Адресний шаблон" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "Забезпечте унікальність простору" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "Є приватним" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "RIR" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "Дата додавання" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "Група VLAN" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "Довжина префікса" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "Чи є пулом" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "Вважати повністю використаним" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "Призначення VLAN" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "Ім'я DNS" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "Протокол" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "Ідентифікатор групи" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "Тип аутентифікації" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "Ключ аутентифікації" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "Аутентифікація" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "Тип сфери застосування" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "Сфера застосування" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "Діапазони ідентифікаторів VLAN" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "Тех. майданчик і група" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "Порти" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "Імпортувати маршрути до цілей" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "Експортувати маршрути до цілей" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "Призначений RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "Група VLAN'ів (якщо така є)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "Батьківський пристрій призначеного інтерфейсу (якщо є)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "Віртуальна машина" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "Батьківська віртуальна машина призначеного інтерфейсу (якщо є)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "Є первинним" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "Зробіть це основним IP для призначеного пристрою" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" "Пристрій або віртуальна машина не вказано; неможливо встановити як первинний" " IP" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "Інтерфейс не вказано; неможливо встановити як первинний IP" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "Тип авторизації" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "Тип сфери застосування (додаток і модель)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "Призначена група VLAN" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "протокол IP" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "Необхідний, якщо він не був призначений для віртуальної машини" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "Обов'язково, якщо він не був призначений для пристрою" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} не призначається цьому пристрою/віртуальній машині." -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Маршрути до цілей" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "Імпортувати цілі" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "Експортувати цілі" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "Імпортований до VRF" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "Експортувати з VRF" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "Приватний" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "Сімейство адрес" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "Діапазон" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "Початок" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "Кінець" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "Пошук в межах" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "Присутній у VRF" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "Пристрій/віртуальна машина" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "Батьківський префікс" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "Призначено на пристрій" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "Призначено на віртуальну машину" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "Призначено на інтерфейс" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "Ім'я DNS" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLAN'и" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "Містить ідентифікатор VLAN" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "Ідентифікатор VLAN" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "Віртуальна машина" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "Маршрут до цілі" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "Агрегат" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "Діапазон ASN" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Призначення тех. майданчику/VLAN" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "Діапазон IP" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "Група FHRP/VRRP" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "Зробіть це основним IP для пристрою/віртуальної машини" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP (внутрішній)" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP-адреса може бути призначена лише одному об'єкту." -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -"Не вдається перепризначити IP-адресу, поки вона призначена як первинний IP " -"для батьківського об'єкта" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" "Тільки IP-адреси, призначені інтерфейсу, можуть бути визначені первинними " "IP-адресами." -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "Віртуальна IP-адреса" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "Призначення вже існує" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "Ідентифікатори VLAN" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "Підпорядковані VLAN'и" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." @@ -9288,132 +9929,133 @@ msgstr "" "Список одного або декількох номерів портів, розділених комами. Діапазон " "можна вказати за допомогою дефіса." -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "Шаблон сервісу" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "Порт (и)" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "Сервіс" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "Шаблон сервісу" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "З шаблону" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "Користувацький" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" "Необхідно вказати ім'я, протокол та порт(и), якщо не використовується шаблон" " служби." -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "старт" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "Діапазон ASN" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "Діапазони ASN" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "Початковий ASN ({start}) повинен бути нижчим за кінцевий ASN ({end})." -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "Регіональний інтернет-реєстр(RIR), відповідальний за цей номер AS" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16- або 32-розрядний номер автономної системи" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "ідентифікатор групи" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "протокол" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "тип аутентифікації" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "ключ аутентифікації" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "Група FHRP/VRRP" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "Групи FHRP/VRRP" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "Групове призначення FHRP/VRRP" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "Групові призначення FHRP/VRRP" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "приватне" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "Простір IP, керований цим RIR, вважається приватним" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "RIRи" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "Мережа IPv4 або IPv6" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "Регіональний Інтернет-реєстр(RIR), відповідальний за цей IP-простір" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "дата додавання" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "сукупний" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "сукупні мережі" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "Не вдається створити сукупну мережу з маскою /0." -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " @@ -9422,7 +10064,7 @@ msgstr "" "Сукупні мережі не можуть перекриватися. {prefix} вже покривається існуючим " "сукупною мережею ({aggregate})." -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " @@ -9431,235 +10073,245 @@ msgstr "" "Мережеві префікси не можуть перекривати сукупні мережі. {prefix} охоплює " "існуючий сукупну мережу ({aggregate})." -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "роль" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "ролі" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "префікс" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "Мережа IPv4 або IPv6 з маскою" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "Операційний стан цього префікса" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "Основна функція цього префікса" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "є у пулі" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "Усі IP-адреси в цьому префіксі вважаються придатними для використання" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "використовувана марка" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "мережеві префікси" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "Неможливо створити префікс з маскою /0." -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "глобальна таблиця" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "Дублікат префікса знайдений у {table}: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "стартова адреса" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "Адреса IPv4 або IPv6 (з маскою)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "кінцева адреса" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "Експлуатаційний стан даного діапазону" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "Основна функція цього діапазону" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "Діапазон IP" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "Діапазони IP" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "Початкова та кінцева версії IP-адреси повинні збігатися" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "Початкові та кінцеві маски IP-адреси повинні збігатися" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" "Кінцева адреса повинна бути більшою за початкову адресу ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" "Визначені адреси перекриваються з діапазоном {overlapping_range} в VRF {vrf}" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" "Визначений діапазон перевищує максимальний підтримуваний розмір ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "адреса" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "Операційний стан цього IP" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "Функціональна роль цього IP" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT (внутрішній)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "IP, для якого ця адреса є \"зовнішньою\"" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "Ім'я хоста або FQDN (не залежить від регістру регістру)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP-адреси" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "Не вдається створити IP-адресу з маскою /0." -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" "{ip} це ідентифікатор мережі, який не може бути присвоєний інтерфейсу." -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "{ip} це широкомовна адреса, яка може не бути присвоєна інтерфейсу." -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "Дублікати IP-адреси знайдено в {table}: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "" +"Не вдається перепризначити IP-адресу, поки вона призначена як первинний IP " +"для батьківського об'єкта" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "Статус SLAAC може бути призначений лише адресам IPv6" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "номери портів" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "шаблон сервісу" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "шаблони послуг" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "Конкретні IP-адреси (якщо такі є), до яких прив'язана ця послуга" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "послуга" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "послуги" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" "Сервіс не може бути пов'язаний як з пристроєм, так і з віртуальною машиною." -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "" "Служба повинна бути пов'язана або з пристроєм, або з віртуальною машиною." -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "Групи VLAN" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "Не вдається встановити scope_type без scope_id." -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "Не вдається встановити scope_id без scope_type." -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" "Початковий ідентифікатор VLAN в діапазоні ({value}) не може бути менше " "{minimum}" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" "Кінцевий ідентифікатор VLAN в діапазоні ({value}) не може перевищувати " "{maximum}" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " @@ -9668,31 +10320,31 @@ msgstr "" "Кінцевий ідентифікатор VLAN в діапазоні повинен бути більшим або дорівнювати" " початковому ідентифікатору VLAN ({range})" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "Діапазони не можуть перекриватися." -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "Конкретний тех. майданчик, якому присвоєно цей VLAN (якщо такий є)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "Група VLAN (необов'язково)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "Числовий ідентифікатор VLAN (1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "Операційний стан цього VLAN" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "Основна функція цього VLAN" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " @@ -9701,165 +10353,167 @@ msgstr "" "VLAN присвоюється групі {group} (сфера застосування: {scope}); також не може" " призначатися до тех. майданчику {site}." -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" "VID повинен знаходитися в діапазоні {ranges} для VLAN'ів у групі {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "розрізнювач маршруту (RD)" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "Унікальний розрізнювач маршруту (RD) (як визначено в RFC 4364)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "забезпечити унікальний простір" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "Запобігання дублікуванню префіксів/IP-адрес у цьому VRF" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRFи" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "Цільове значення маршруту (відформатоване відповідно до RFC 4360)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "маршрут до цілі" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "маршрут до цілей" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "Кількість тех. майданчиків" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "Кількість провайдерів" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "Сукупні мережі" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "Додано" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "Мережеві префікси" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "Утилізація" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "Діапазони IP" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "Префікс (Плоский)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "Глибина" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "Пул" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "Позначено як використане" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "Початкова адреса" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (внутрішній)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (зовнішній)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "Призначений" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "Призначений об'єкт" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "Тип сфери застосування" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "Діапазони VID" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VID" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "Унікальний" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "Імпортувати цілі" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "Експортувати цілі" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} не є дійсним префіксом. Ви мали на увазі {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "Довжина префікса повинна бути менше або дорівнює %(limit_value)sи." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "Довжина префікса повинна бути більше або дорівнює %(limit_value)sи." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" @@ -9867,31 +10521,31 @@ msgstr "" "У назвах DNS дозволені лише буквено-цифрові символи, зірочки, дефіси, крапки" " та підкреслення" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "Підпорядковані мережеві префікси" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "Підпорядковані діапазони" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "Пов'язані IP-адреси" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "Інтерфейси пристрою" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "Інтерфейси віртуальної машини" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "Це поле не може бути порожнім." -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." @@ -9899,328 +10553,341 @@ msgstr "" "Значення має бути передано безпосередньо (наприклад, \"foo\": 123); не " "використовуйте словник або список." -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value} не є дійсним вибором." -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "Невірний тип вмісту: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "Невірне значення. Вкажіть тип вмісту як '.'." -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "Діапазони повинні бути вказані у форматі (нижня межа, верхня межа)." -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "Межі діапазону повинні бути визначені як цілі числа." -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} повинен реалізувати get_view_name()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "Невірний дозвіл {permission} для моделі {model}" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "Темно-червоний" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "Трояндовий" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "Малиновий" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "Темно-фіолетовий" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "Світло-блакитний" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "Бирюзовый" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "Темно-зелений" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "Світло-зелений" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "Кислотно-зелений" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "Бурштиновий" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "Темно-помаранчевий" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "Коричневий" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "Сріблясто-сірий" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "Сірий" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "Антрацитовий" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "прямий" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "Вивантажити" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "Автоматичне виявлення" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "Кома" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "Крапка з комою" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Табуляція" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "Невірний параметр конфігурації: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "Банер для входу" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "Додатковий вміст для відображення на сторінці входу" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "Банер технічного обслуговування" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "Додатковий вміст для відображення в режимі технічного обслуговування" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "Верхній банер" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "Додатковий вміст для відображення у верхній частині кожної сторінки" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "Нижній банер" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "Додатковий вміст для відображення внизу кожної сторінки" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "Всесвітньо унікальний IP-простір" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "Забезпечити унікальну IP-адресацію в глобальній таблиці" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "Віддавайте перевагу IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "Віддавайте перевагу IPv4 адресам над IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "Висота стійки у юнітах" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "Висота одиниці за замовчуванням для візуалізованих стійки" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "Ширина стійки у юнітах" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "Ширина одиниці за замовчуванням для візуалізованих стійки" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "Напруга подачі живлення" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "Напруга за замовчуванням при подачі живлення" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "Сила струму подачі живлення" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "Сила струму за замовчуванням при подачі живлення" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "Максимальне використання при подачі живлення" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "Максимальне використання за замовчуванням при подачі живлення" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "Дозволені схеми URL-адрес" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "Дозволені схеми для URL-адрес у вмісті, наданому користувачем" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "Типовий розмір сторінки" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "Максимальний розмір сторінки" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "Користувацькі перевіряючі" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "Користувацькі правила перевірки (у форматі JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "Правила захисту" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "Правила захисту від видалення (JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "Налаштування за замовчуванням" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "Налаштування за замовчуванням для нових користувачів" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "Режим технічного обслуговування" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "Увімкнути режим технічного обслуговування" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL увімкнено" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "Увімкніть API GraphQL" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "Зберігання журналу змін" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "" "Дні для збереження історії журналу змін (встановлено нуль для необмеженої " "кількості)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "Зберігання результатів завдання" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "" "Дні для збереження історії результатів завдання (встановлено на нуль " "необмежено)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "Адреса карт" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "Базова URL-адреса для відображення географічних місць" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "Частковий збіг" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "Точний збіг" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "Починається з" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "Закінчується на" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "Регулярний вираз" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "Тип(и) об'єкта" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "Огляд" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" @@ -10228,409 +10895,424 @@ msgstr "" "Мітки скорочень, розділені комами, укладені подвійними лапками (наприклад, " "\"мітка1, мітка2, мітка3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "Додати мітки" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "Видалити мітки" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name} необхідно вказати клас моделі." -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "Невідоме ім'я поля '{name}' у призначених для користувача даних поля." -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "Невірне значення для користувацького поля '{name}': {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "Користувацьке поле '{name}' має мати унікальне значення." -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "Відсутнє обов'язкове користувацьке поле '{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "Віддалене джерело даних" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "шлях даних" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "Шлях до віддаленого файлу (відносно кореня джерела даних)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "увімкнути автоматичну синхронізацію" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "Увімкнути автоматичну синхронізацію даних при оновленні файлу даних" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "дата синхронізована" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name} повинен реалізувати метод sync_data()." -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "Організація" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "Групи тех. майданчиків" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "Групи орендарів" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "Контактні групи" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "Контактні ролі" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "Контактні завдання" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "Ролі в стійці" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "Графічний вид" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "Типи стійки" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "Модулі" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "Контексти віртуальних пристроїв" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "Виробники" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "Компоненти пристрою" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "Ролі елементів інвентаря" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "З'єднання" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "Кабелі" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "Бездротові зв'язки" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "Інтерфейсні підключення" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Консольні підключення" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "Підключення живлення" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "Групи WLAN" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "Префікс і ролі VLAN" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "Діапазони ASN" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "Групи VLAN" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "Шаблони послуг" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "Послуги" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "Тунелі" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "Тунельні групи" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "Кінці тунелів" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "Кінці" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "Налаштування IKE" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "Політика IKE" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "Налаштування IPsec" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "Політика IPsec" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "Профілі IPsec" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "Віртуальні диски" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "Типи кластерів" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "Кластерні групи" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "Типи схем" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "Групи каналів зв'язку" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "Групи завдань" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "Кінці каналу зв'язку" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "Провайдери" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "Облікові записи провайдера" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "Мережі провайдерів" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "Панелі живлення" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "Конфігурації" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "Контексти конфігурації" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "Конфігураційні шаблони" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "Персоналізація" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "Користувацькі поля" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "Вибір користувацьких полів" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "Користувацькі посилання" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "Експортувати шаблони" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "Збережені фільтри" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "Вкладення зображень" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "Операції" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "Інтеграція" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "Джерела даних" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "Правила події" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Веб-хуки" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "Завдання" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "Ведення журналу" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "Групи сповіщень" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "Записи журналу" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "Журнал змін" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "Адміністратор" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "Жетони API" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "Дозволи" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "Система" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "Плагіни" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "Історія налаштувань" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "Фонові завдання" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "Дозволи повинні бути передані у вигляді кортежу або списку." -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "Кнопки повинні бути передані у вигляді кортежу або списку." -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "Колір кнопки повинен бути вибором у ButtonColorChoices." -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " @@ -10639,7 +11321,7 @@ msgstr "" "Клас PluginTemplateExtension {template_extension} був переданий як " "екземпляр!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " @@ -10647,193 +11329,194 @@ msgid "" msgstr "" "{template_extension} не є підкласом netbox.plugins.PluginTemplateExtension!" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} повинен бути екземпляром netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} повинен бути екземпляром netbox.plugins.PluginMenuItem" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button} повинен бути екземпляром netbox.plugins.PluginMenuButton" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "extra_context повинен бути словником" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "Навігація по HTMX" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "Увімкнути динамічну навігацію інтерфейсом" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "Експериментальна функція" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "Мова" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "Примушує переклад інтерфейсу користувача на вказану мову" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "Підтримка перекладу вимкнена локально" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "Довжина сторінки" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "Кількість об'єктів за замовченням на сторінці для відображення" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "Розміщення пагінатора" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "Внизу" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "Верх" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "Обидва" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "Де елементи керування paginator відображатимуться відносно таблиці" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "Формат даних" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "" "Бажаний синтаксис для відображення загальних даних в інтерфейсі користувача" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "Невірний магазин: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "Не вдається додати магазини до реєстру після ініціалізації" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "Неможливо видалити магазини з реєстру" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "Чеська мова" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "Данська мова" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "Німецька мова" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "Англійська мова" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "Іспанська мова" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "Французька мова" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "Італійська мова" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "Японська мова" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "Голландська мова" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "Польська мова" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "Португальська мова" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "Російська мова" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "Турецька мова" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "Українська мова" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "Китайська мова" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "Вибрати все" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "Перемкнути всі" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "Переключити випадаюче меню" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "Помилка" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "{model_name} не знайдено" -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "Поле" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "Значення" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "Фіктивний плагін" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " @@ -10842,56 +11525,56 @@ msgstr "" "Виникла помилка при рендерингу вибраного шаблону експорту ({template}): " "{error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "Ряд {i}: Об'єкт з ідентифікатором {id} не існує" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "Ні {object_type} були обрані." -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "Перейменовано {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "Видалено {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "Журнал змін" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "Журнал" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "Неможливо синхронізувати дані: Файл даних не встановлено." -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "Синхронізовані дані для {object_type} {object}." -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "Синхронізовано {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name} повинен реалізувати get_children()" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." @@ -10899,1085 +11582,1145 @@ msgstr "" "Виникла помилка при завантаженні конфігурації інформаційної панелі. " "Використовується інформаційна панель за замовчуванням." -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "Доступ заборонений" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "У вас немає дозволу на доступ до цієї сторінки" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "Сторінка не знайдена" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "Запитувана сторінка не існує" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "Помилка сервера" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "" "Виникла проблема з вашим запитом. Будь ласка, зв'яжіться з адміністратором" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "Повне виключення наведено нижче" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Версія Python" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "Версія NetBox" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "Не встановлено" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "" "Якщо потрібна додаткова допомога, будь ласка, надішліть повідомлення на" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "Дискусійний форум NetBox" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "на GitHub" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "Головна сторінка" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "Профіль" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "Повідомлення" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "Підписки" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "Налаштування" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "Змінити пароль" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "Скасувати" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "Зберегти" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "Конфігурації таблиці" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "Очистити параметри таблиці" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "Перемкнути всі" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "Таблиця" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "Замовлення" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "Колонки" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "Не знайдено" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "Профіль користувача" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "Реквізити рахунку" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "Електронна скринька" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "Створено обліковий запис" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "Останній вхід" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "Суперкористувач" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "Персонал" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "Призначені групи" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "Жодного" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "Недавня діяльність" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "Мої жетони API" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Жетон" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "Запис увімкнено" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "Востаннє використано" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "Додати Жетон" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "Головна" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox Motif" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "Логотип NetBox" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "Документація" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "Документація REST API" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "Графічний інтерфейс QL" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "Підтримка NetBox Labs" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "Вихідний код" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "Спільнота" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "Дата встановлення" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "Дата припинення" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "Призначити у групу" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "Поміняти місцями кінці каналу зв'язку" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "Поміняти місцями кінці для каналу зв'язку %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "Сторона А" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Сторона Б" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "Призначити канал зв'язку" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "Призначення групи каналів зв'язку" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "Додати канал зв'язку" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "Тип каналу зв'язку" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "Додати" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "Редагувати" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "Поміняти місцями" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "Позначено як підключений" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "до" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "Слід" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "Редагувати кабель" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "Видаліть кабель" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "Відключити" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "Підключити" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "За течією" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "Вгору за течією" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "Перехресне з'єднання" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "Патч-панель/порт" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "Додати канал зв'язку" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "Обліковий запис постачальника" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "Дані конфігурації" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "Коментар" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "Відновити" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "Параметр" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "Поточна величина" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "Нова цінність" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "Змінено" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "Розмір" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "байтів" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "Хеш SHA256" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "Синхронізація" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "Востаннє синхронізовано" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "Бекенд" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "Параметри не визначені" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "Файли" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "Висота стійки" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "Висота монтажної одиниці за замовчуванням" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "Ширина одиниці за замовчуванням" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "Подача живлення" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "Напруга за замовчуванням" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "Сила струму за замовчуванням" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "Максимальне використання за замовчуванням" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "Забезпечити глобальну унікальність" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "Кількість сторінок" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "Максимальний розмір сторінки" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "Налаштування користувача" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "Зберігання завдання" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "Завдання" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "Створено" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "Планування" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "кожен %(interval)s хвилини" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "Змінити" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "Різниця" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "Попередній" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "Наступний" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "Об'єкт створений" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "Об'єкт видалений" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "Немає змін" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "Дані перед зміною" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "Попередження: Порівняння неатомних змін з попереднім записом змін" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "Дані після зміни" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "Дивитись все %(count)s Зміни" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "Зберігання журналу змін" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "днів" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "Невизначений" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "Не встановлено" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "Огляд" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "Встановити" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "Деталі плагіна" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "Підсумок" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "Ліцензія" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "Історія версій" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "Інструкції по локальній установці" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "Фонові черги" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "Налаштувати таблицю" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "Зупинити" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "Повторно поставлено у чергу" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "Поставлено у чергу" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "Черга" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "Час очікування" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "Результат TTL" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "Мета" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "Аргументи" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "Аргументи ключових слів" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "Залежить від" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "Виняток" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "завдання в " -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "Завдання у черзі" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" msgstr "Вибрати усі %(count)s %(object_type_plural)s запити" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Інформація по робочому процесу" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Робочий процес" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "Черги" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "Поточне завдання" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "Підрахунок кількості успішно виконаних завдань" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "Підрахунок кількості невдало виконаних завдань" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "Загальний робочий час" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "секунд" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "Фонові робочі процеси" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "Робочі процеси у %(queue_name)s" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "Експорт" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "Статус системи" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox реліз" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Версія Джанго" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "Версія PostgreSQL" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "Назва бази даних" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "Розмір бази даних" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "Недоступний" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "Робочі процеси RQ" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "черга за замовчуванням" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "Системний час" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "Поточне налаштування" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "Ви впевнені, що хочете відключити ці %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "Траса кабелю для %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "Завантажити SVG" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "Асиметричний шлях" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "" "Нижче наведені вузли не мають зв'язків і призводять до асиметричного контуру" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "Розділ шляху" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "Виберіть вузол нижче, щоб продовжити" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "Відстеження завершено" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "Всього сегментів" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "Загальна довжина" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "Не знайдено шляхів" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "Пов'язані шляхи" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "Походження" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "Пункт призначення" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "Сегменти" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "Неповні" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "Перейменувати вибране" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "Не підключено" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "Виділіть пристрій в стійці" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "Не в стійці" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS-координати" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "Карта" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "Призначеня мітки" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "Переглянути віртуальне шасі" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "Створіть джерело живлення постійного струму" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "Керування" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT для" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "НАТ" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "Використання електроенергії" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "Вхід" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "розетки" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "Виділено" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "ВА" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "Гілка (електричного кола)" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "Додати послугу" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "Додати компоненти" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "Додати консольні порти" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "Додати порти консольного сервера" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "Додати відсіки для пристроїв" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "Додати передні порти" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "Приховати усе, що увімкнено" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "Приховати усе, що вимкнено" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "Приховати усе, що має віртуальне походження" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "Приховати усе, що відключене" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "Додати інтерфейси" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "Додати предмет до інвентарю" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "Додати модульні відсіки" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "Додайте розетки" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "Додати порт живлення" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "Додати задні порти" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "Конфігурація" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "Контекстні дані" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "Відтворена конфігурація" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "Завантажити" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "Не знайдено шаблону конфігурації" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "Батьківський відсік" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "Відновити скорочення" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "Видалити" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "Контекстні дані локальної конфігурації" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "Перейменувати" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "Відсік для пристроїв" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "Встановлений пристрій" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "Видалити %(device)s з %(device_bay)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " @@ -11986,430 +12729,449 @@ msgstr "" "Ви впевнені, що хочете видалити %(device)s з " "%(device_bay)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "Заповнити" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "Відсік" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "Додати пристрій" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "Роль віртуальної машини" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "Назва моделі" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "Номер частини" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "Виключити з використання" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "Батько/Дитина" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "Зображення спереду" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "Зображення ззаду" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "Положення порту ззаду" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "Позначено як підключений" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "Статус підключення" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "Сторона А" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "Сторона Б" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "Без кінця" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "Позначка запланова" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "Позначка встановлена" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "Статус шляху" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "Недосяжний" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "Кінцеві точки контуру" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "Не підключено" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "Без позначки" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "Не присвоєно VLAN'ів" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "Очистити" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "Очистити все" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "Глибина монтажу" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "Початковий юніт" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "Юніти у низхідному порядку" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "Висота стійки" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "Додати дочірній інтерфейс" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "Швидкість/Дуплекс" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "Режим PoE" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "Тип PoE" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "Режим 802.1Q" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC-адреса" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "Бездротове з'єднання" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "Мережевий сусід" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "Канал" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "Частота каналу" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "МГц" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "Ширина каналу" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "Члени LAG" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "Немає інтерфейсів учасників" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "Додати IP-адресу" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "Батьківський елемент" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "Ідентифікатор частини" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "Додати підпорядковане місцезнаходження" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "Підпорядковані місцезнаходження" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "Додати місцезнаходження" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "Додати пристрою" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "Додати тип пристрою" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "Додати тип модуля" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "Підключений пристрій" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "Утилізація (виділено" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "Електричні характеристики" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "В" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "А" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "Фідер живлення" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "Додати подачі живлення" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "Максимальна потужність" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "Виділена потужність" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "Використання простору" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "Вага стійки" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "Максимальна вага" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "Загальна вага" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "Зображення та етикетки" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "Лише зображення" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "Тільки етикетки" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "Додати бронювання" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "Переглянути список" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "Виберіть вид на стійку" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "Сортувати за" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "Стійки не знайдено" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "Переглянути висоти" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "Деталі бронювання" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "Додати стійку" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "Позиції" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "Додати тех. майданчик" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "Підпорядковані регіони" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "Додати регіон" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "Часовий пояс" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "Час роботи тех. майданчику" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "Фізична адреса" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "Адреса доставки" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "Підпорядковані групи" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "Додати групу тех. майданчиків" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "Вкладення" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "Додати учасника" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "Учасника пристроїв" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "Додати нового учасника до віртуального шасі %(virtual_chassis)s" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "Додати нового учасника" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "Дії" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "Зберегти та додати інший" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "Редагування віртуального шасі %(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "Стійка/юніт" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "Вилучити віртуального учасника шасі" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " @@ -12418,11 +13180,12 @@ msgstr "" "Ви впевнені, що хочете видалити %(device)s з віртуального " "шасі %(name)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "Ідентифікатор" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" @@ -12430,11 +13193,11 @@ msgstr "" "Під час цього запиту сталася помилка імпорту модуля. До поширених причин " "можна віднести наступне:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "Відсутні необхідні пакети" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12450,11 +13213,11 @@ msgstr "" "запустіть pip freeze з консолі і порівняйте вихід зі списком " "необхідних пакетів." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "Сервіс WSGI не перезапущений після оновлення" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" @@ -12463,7 +13226,7 @@ msgstr "" "Якщо цю установку нещодавно оновили, перевірте, чи було перезапущено службу " "WSGI (наприклад, gunicorn або uWSGi). Це гарантує запуск нового коду." -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" @@ -12471,11 +13234,11 @@ msgstr "" "Під час обробки цього запиту була виявлена помилка дозволу на файл. До " "поширених причин можна віднести наступне:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "Недостатній дозвіл на запис до кореня медіа" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12486,7 +13249,7 @@ msgstr "" "користувач NetBox працює так, як має доступ до запису файлів у всі місця в " "межах цього шляху." -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" @@ -12494,11 +13257,11 @@ msgstr "" "Під час обробки цього запиту була виявлена програмна помилка бази даних. До " "поширених причин можна віднести наступне:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "Відсутні міграції баз даних" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12509,11 +13272,11 @@ msgstr "" "запустити міграцію вручну, виконавши міграція python3 manage.py" " з командного рядка." -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "Непідтримувана версія PostgreSQL" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12523,99 +13286,102 @@ msgstr "" "Перевірити це можна, підключившись до бази даних за допомогою облікових " "даних NetBox і оформивши запит на SELECT VERSION()." -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "Файл даних, пов'язаний з цим об'єктом, видалено" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "Дані синхронізовані" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "Синхронізація даних" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "Параметри середовища" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "Шаблон" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "Назва групи" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "Повинен бути унікальним" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "Клонований" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "Значення за замовчуванням" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "Вага пошуку" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "Логіка фільтра" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "Вага дисплея" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "Видимий інтерфейс користувача" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "Редагований інтерфейс користувача" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "Правила перевірки" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "Регулярний вираз" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "Клас кнопок" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "Призначені моделі" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "Текст посилання" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "URL-адреса посилання" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "Скинути інформаційну панель" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." @@ -12623,7 +13389,7 @@ msgstr "" "Це видалить усі налаштовані віджети та відновить " "конфігурацію інформаційної панелі за замовчуванням." -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." @@ -12631,159 +13397,161 @@ msgstr "" "Ця зміна зачіпає тільки вашу особисту інформаційну панель, і не " "вплине на інших користувачів." -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "конфігурація віджетів" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "Закрити віджет" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "Додати віджет" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "Жодних закладок ще не додано." -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "Немає дозволу" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "Немає дозволу на перегляд цього вмісту" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "Не вдається завантажити вміст. Невірна назва перегляду" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "Вмісту не знайдено" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "Виникла проблема з отриманням RSS-каналу" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "Умови" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "Тип MIME" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "Розширення файлу" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "Заплановано на" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "Тривалість" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "Підсумок тесту" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "Журнал" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "вихід" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "Завантаження" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "Результати очікуються" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "Запис журналу" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "Група повідомлень" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "Не призначено" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "Локальний контекст конфігурації перезаписує всі вихідні контексти" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "Джерело контекстів" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "Новий запис журналу" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "Звіт" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "У вас немає дозволу на запуск скриптів" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "Запустити скрипт" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "Помилка завантаження скрипту" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "Скрипт більше не існує у вихідному файлі." -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "Останній запуск" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "Скрипт більше не присутній у вихідному файлі" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "Ніколи" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "Запустіть знову" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "Не вдалося завантажити скрипти з модуля %(module)s" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "Скриптів не знайдено" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " @@ -12792,81 +13560,83 @@ msgstr "" "Почніть з створення сценарію з " "вивантаженого файлу або джерела даних." -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "Результати" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "Поріг журналу" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "Усе" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "Позначені предмети" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "Дозволені типи об'єктів" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "Будь-який" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "Позначені типи предметів" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "Позначені об'єкти" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "Метод HTTP" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "Тип вмісту HTTP" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "Перевірка SSL" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "Додаткові заголовки" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "Шаблон тіла (запросу)" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "Масове створення" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "Вибрані об'єкти" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "Додати" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "Масове видалення" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "Підтвердити масове видалення" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12876,65 +13646,68 @@ msgstr "" "Наступна операція видалить %(count)s %(type_plural)s. Будь " "ласка, уважно перегляньте вибрані об'єкти та підтвердіть цю дію." -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "Редагування" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "Масове редагування" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "Застосувати" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "Масовий імпорт" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "Прямий імпорт" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "Вивантажити файл" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "Надіслати" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "Параметри поля" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Аксесуар" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "вибір" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "Імпорт вартості" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "Формат: РРРР-ММ-ДД" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "Вкажіть істинна або хибно" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "" "Обов'язкові поля повинен буде вказано для всіх об'єктів." -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " @@ -12944,15 +13717,15 @@ msgstr "" "Наприклад, %(example)s ідентифікує VRF за його розрізнювачем " "маршруту." -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "Масове видалення" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "Підтвердити масове видалення" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12963,72 +13736,72 @@ msgstr "" "Будь ласка, уважно перегляньте %(obj_type_plural)s буде видалено і " "підтверджено нижче." -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "Видаліть ці %(count)s %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "Перейменування" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "Масове перейменування" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "Поточне ім'я" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "Нове ім'я" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "Попередній перегляд" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "Ви впевнені" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "Підтвердити" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "Редагувати вибрані" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "Вилучити вибрані" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "Додати новий %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "Переглянути документацію моделі" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "Підказка" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "Створити та додати інший" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "Фільтри" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -13037,40 +13810,40 @@ msgstr "" "Вибрати усі %(count)s " "%(object_type_plural)s відповідний запит" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "Новий реліз доступний" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "є" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "Інструкції з оновлення" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "Розблокування інформаційної панелі" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "Блокування інформаційної панелі" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "Додати віджет" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "Зберегти макет" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "Підтвердити видалення" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -13079,40 +13852,40 @@ msgstr "" "Ви впевнені, що хочете видалити " "%(object_type)s %(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "Наступні об'єкти будуть видалені в результаті цієї дії." -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "тому" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "Немає непрочитаних повідомлень" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "Усі повідомлення" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "Вибрати" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "Скинути" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "Увімкнути темний режим" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "Увімкнути світловий режим" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " @@ -13121,281 +13894,283 @@ msgstr "" "Перш ніж ви зможете додати %(model)s, спочатку потрібно створити " "%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "Вибір сторінки" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "Показ %(start)s-%(end)s із %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "Параметри нумерації сторінок" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "На сторінку" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "Прикріпити зображення" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "Пов'язані об'єкти" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "Немає зроблених позначок" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "Дані не синхронізуються з файлом висхідного потоку" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "Швидкий пошук" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "Збережений фільтр" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "Почистити замовлення" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "Довідковий центр" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Адміністратор Django" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "Вийти" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "Увійти" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Сім'я" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "Дата додавання" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "Додати префікс" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "Номер AS" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "Тип аутентифікації" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "Ключ аутентифікації" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "Віртуальні IP-адреси" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "Призначити IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "Масове створення" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "Створити групу" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "Віртуальні IP-адреси" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "Показати присвоєні" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "Показати Доступно" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "Показати все" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "Глобальний" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT (зовні)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "Призначити IP-адресу" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "Виберіть IP-адресу" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "Результати пошуку" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "Масове додавання IP-адрес" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "Початкова адреса" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "Кінцева адреса" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "Позначений повністю використаний" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "Деталі адресації" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "Підпорядковані IP-адреси" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "Доступні IP-адреси" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "Перший доступний IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "Деталі префікса" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "Мережева адреса" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "Мережева маска" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "Маска підстановки" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "Широкомовна адреса" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "Додати діапазон IP" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "Приховати індикатори глибини" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "Максимальна глибина" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "Максимальна довжина" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "Додати агрегат" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "Імпортування VRF" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "Експорт VRF" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "Імпорт L2VPN'ів" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "Експорт L2VPN'ів" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "Додати префікс" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "Додати VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "Розрізнювач маршруту" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "Унікальний IP простір" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "Помилки" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "Увійти" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "Або" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "Помилка статичних медіа-файлів - NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "Помилка статичних медіа-файлів" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "Не вдалося завантажити наступний файл статичного медіа" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "Перевірте наступне" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13405,7 +14180,7 @@ msgstr "" "оновлення. Це встановлює останню ітерацію кожного статичного файлу в " "статичний кореневий шлях." -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13416,7 +14191,7 @@ msgstr "" "файлів з STATIC_ROOT шляха. Зверніться до документація по установці для подальших вказівок." -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " @@ -13425,548 +14200,571 @@ msgstr "" "Файл %(filename)s існує в статичному кореневому каталозі і " "читається HTTP-сервером." -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "" "Клацніть тут щоб спробувати завантажити NetBox " "знову." -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "Контакт" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "Назва" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "Телефон" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "Контактна група" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "Додати групу контактів" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "Контактна роль" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "Додати контакт" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "Додати орендаря" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "Група орендарів" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "Додати групу орендарів" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "Призначені дозволи" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "Дозвіл" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "Перегляд" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "Обмеження" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "Призначені користувачі" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "Виділені ресурси" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "Віртуальні процесори" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "Пам'ять" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "Місце на диску" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "Додати віртуальну машину" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "Призначити пристрій" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "Вилучити вибрані" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "Додати пристрій до кластера %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "Вибір пристрою" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "Додати пристрої" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "Додати кластер" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "Кластерна група" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "Тип кластера" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "Віртуальний диск" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "Ресурси" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "Додати віртуальний диск" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "Політика IKE" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "Версія IKE" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "Попередньо спільний ключ" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "Показати таємницю" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Налаштування" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "Налаштування IKE" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "Метод аутентифікації" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "Алгоритм шифрування" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "Алгоритм авторизації" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "Група DH" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "Термін служби SA (секунди)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "Політика IPsec" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "Група PFS" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "Профіль IPsec" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "Група PFS" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "Пропозиція IPsec" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "Термін служби SA (КБ)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN Атрибути" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "Додати кінець" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "Додати кінець" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "Інкапсуляція" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "Профіль IPsec" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "ID тунелю" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "Додати тунель" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Тунельна група" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Кінець тунелю" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "За межами IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "Роз'єднання мережевих сусідів" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "Шифр" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "Попередньо спільний ключ (PSK)" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "МГц" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "Прикріплені інтерфейси" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "Додати бездротову локальну мережу" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "Група бездротової локальної мережі" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "Додати групу бездротової локальної мережі" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "Властивості посилання" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "Відстань" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "Батьківська контактна група (ідентифікатор)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "Батьківська контактна група (скорочення)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "Контактна група (ідентифікатор)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "Контактна група (скорочення)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "Контакт (ідентифікатор)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "Роль контакту (ідентифікатор)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "Контактна роль (скорочення)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "Контактна група" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "Батьківська група орендарів (ідентифікатор)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "Батьківська група орендарів (скорочення)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "Група орендарів (ідентифікатор)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "Група орендарів (ідентифікатор)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "Група орендарів (скорочення)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "Опис" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "Призначений контакт" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "контактна група" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "контактні групи" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "контактна роль" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "контактні ролі" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "назва" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "телефон" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "електронна скринька" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "посилання" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "контакт" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "контакти" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "призначення контакта" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "призначення контакта" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "Контакти не можуть бути призначені для цього типу об'єкта ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "група орендарів" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "групи орендарів" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "Ім'я орендаря має бути унікальним для кожної групи." -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "Скоречення орендаря повинен бути унікальним для кожної групи." -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "орендар" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "орендарі" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "Назва контакту" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "Телефон контакту" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "Контактний Email" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "Адреса контакту" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "Посилання контакту" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "Опис контакту" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "Дозвіл (ідентифікатор)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "Група повідомлень (ідентифікатор)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "Ім'я" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "Прізвище" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "Статус персоналу" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "Статус суперкористувача" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "Якщо ключ не надано, він буде згенерований автоматично." -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "Є персоналом" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "Є суперкористувачем" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "Може переглядати" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "Можете додати" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "Може змінитися" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "Може видалити" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "Інтерфейс користувача" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13976,7 +14774,7 @@ msgstr "" "запишіть свій ключ перед відправкою цієї форми, оскільки вона може " "більше не бути доступною після створення токена." -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13986,32 +14784,32 @@ msgstr "" "порожнім без обмежень. Приклад: " "10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "Підтвердити пароль" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "Введіть той же пароль, що і раніше, для перевірки." -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "" "Паролі не збігаються! Будь ласка, перевірте свої дані та спробуйте ще раз." -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "Додаткові дії" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "Дії, надані на додаток до перерахованих вище" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "Об'єкти" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " @@ -14021,77 +14819,77 @@ msgstr "" "null, щоб відповідати всім об'єктам цього типу. Список декількох об'єктів " "призведе до логічної операції OR." -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "Необхідно вибрати хоча б одну дію." -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "Невірний фільтр для {model}: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "Перелік дій, наданих цим дозволом" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "обмеження" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "Фільтр Queryset, що відповідає відповідним об'єктам вибраних типів" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "дозвіл" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "дозволи" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "налаштування користувача" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Ключ '{path}'є листовим вузлом; не вдається призначити нові ключі" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "" "Ключ '{path}'є словником; не може призначити значення, яке не є словником" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "спливає" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "востаннє використаний" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "ключ" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "запис увімкнено" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "" "Дозволити створення/оновлення/видалення операцій за допомогою цього ключа" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "дозволені IP-адреси" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -14100,42 +14898,42 @@ msgstr "" "порожнім без обмежень. Наприклад: \"10.1.1.0/24, 192.168.10.16/32, " "2001:DB8:1::/64\"" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "жетон" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "жетонів" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "групи" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "користувач" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "Користувач з цим ім'ям користувача вже існує." -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "Користувацькі дії" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "" "Пов'язаний об'єкт не знайдено за допомогою наданих атрибутів: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "Кілька об'єктів відповідають наданим атрибутам: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " @@ -14144,42 +14942,42 @@ msgstr "" "Пов'язані об'єкти повинні посилатися числовим ідентифікатором або словником " "атрибутів. Отримано невизнане значення: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "" "Пов'язаний об'єкт не знайдено за допомогою вказаного числового " "ідентифікатора: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} має визначений ключ, але ВИБІР не є списком" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "Вага повинна бути додатним числом" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "Невірне значення '{weight}' для ваги (має бути число)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "Невідома одиниця {unit}. Повинна бути одна з наступних: {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "Довжина повинна бути додатним числом" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "Невірне значення '{length}' для довжини (має бути число)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " @@ -14188,15 +14986,15 @@ msgstr "" "Неможливо видалити {objects}. {count} знайдені залежні " "об'єкти: " -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "Більше 50" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "RGB-колір шістнадцятковим представленням. Приклад: " -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " @@ -14205,7 +15003,7 @@ msgstr "" "%s(%r) невірний. Параметр to_model до CounterCacheField повинен бути рядком " "у форматі 'app.model'" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14214,36 +15012,36 @@ msgstr "" "%s(%r) невірний. Параметр to_field до CounterCacheField повинен бути рядком " "у форматі 'field'" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "Введіть дані об'єкта у форматі CSV, JSON або YAML." -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "Розмежувач CSV" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "Символ, який розмежовує поля CSV. Застосовується лише до формату CSV." -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "Дані форми повинні бути порожніми під час вивантаження/вибору файлу." -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "Невідомий формат даних: {format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "Не вдається визначити формат даних. Будь ласка, уточніть." -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "Невірний роздільник CSV" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." @@ -14251,7 +15049,7 @@ msgstr "" "Невірні дані YAML. Дані повинні бути у вигляді декількох документів або " "одного документа, що містить перелік словників." -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " @@ -14260,7 +15058,7 @@ msgstr "" "Невірний список ({value}). Повинен бути числовим, а діапазони повинні бути в" " порядку зростання." -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" @@ -14268,7 +15066,7 @@ msgstr "" "Вкажіть один або кілька числових діапазонів, розділених комами. Приклад: " "1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." @@ -14276,17 +15074,18 @@ msgstr "" "Недійсні діапазони ({value}). Повинен бути діапазон цілих чисел у порядку " "зростання." -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "Невірне значення для поля з множинним вибором: {value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "Об'єкт не знайдено: %(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " @@ -14295,20 +15094,20 @@ msgstr "" "\"{value}\" не є унікальним значенням для цього поля; було знайдено декілька" " об'єктів" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "\"{field_name}\" є недійсним ім'ям поля доступу." -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "Тип об'єкта повинен бути вказаний як \".\"" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "Невірний тип об'єкта" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " @@ -14318,7 +15117,7 @@ msgstr "" "відмінки і типи в межах одного діапазону не підтримуються (приклад: " "[ge,xe]-0/0/[0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" @@ -14326,7 +15125,7 @@ msgstr "" "Вкажіть числовий діапазон для створення декількох IP-адрес.
    Приклад: " "192.0.2.[1,5,100-254]/24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Підтримується синтаксис Markdown " -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "Унікальна скорочення, зручна для URL-адреси" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "Введіть контекстні дані в JSON формат." -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC-адреса повинна бути у форматі EUI-48" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "Використання регулярних виразів" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "" "Числовий ідентифікатор існуючого об'єкта для оновлення (якщо не створюється " "новий об'єкт)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "Нерозпізнаний заголовок: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "Доступні стовпці" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "Вибрані стовпці" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." @@ -14379,13 +15178,13 @@ msgstr "" "Цей об'єкт був змінений з моменту візуалізації форми. Будь ласка, зверніться" " до журналу змін об'єкта для отримання детальної інформації." -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "Діапазон \"{value}\" є невірним." -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " @@ -14394,71 +15193,71 @@ msgstr "" "Невірний діапазон: Кінцеве значення ({end}) має бути більше початкового " "значення ({begin})." -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "Дублювання або конфлікт заголовка стовпця для \"{field}\"" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "Дублювання або конфлікт заголовка стовпця для \"{header}\"" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "" "Ряд {row}: Очікується {count_expected} стовпці, але знайдено {count_found}" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "Знайдено несподіваний заголовок стовпця \"{field}\"." -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "" "Стовпчик \"{field}\" не є спорідненим об'єктом; не може використовувати " "точки" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "Невірний атрибут пов'язаного об'єкта для стовпця \"{field}\": {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "Не знайдено необхідний заголовок стовпця \"{header}\"." -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" "Відсутнє необхідне значення для параметра динамічного запиту: " "'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" "Відсутнє необхідне значення для параметра статичного запиту: " "'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "Пароль повинен мати хоча б одну цифру." -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "Пароль повинен мати хоча б одну велику літеру." -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "Пароль повинен мати хоча б одну малу літеру." -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." @@ -14466,7 +15265,7 @@ msgstr "" "Ваш пароль повинен містити принаймні одну цифру, одну велику літеру та одну " "малу літеру." -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " @@ -14475,126 +15274,126 @@ msgstr "" "Невірна назва дозволу: {name}. Повинен бути у форматі " "._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "Невідома мітка_додатка/назва_моделі для {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "Невірна IP-адреса, встановлена для {header}: {ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "Стовпчик з назвою {name} вже визначено для таблиці {table_name}" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "Не визначено" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "Зняти закладку" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "Закладка" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "Клонувати" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "Поточний вид" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "Всі дані" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "Додати шаблон експорту" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "Імпорт" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "Відписатися" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "Підписатися" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "Копіювати в буфер обміну" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "Це обов'язкове поле для заповнення" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "Встановити нуль (Null)" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "Очистити все" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "Налаштування таблиці" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "Рухати угору" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "Рухати вниз" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "Пошук…" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "Пошук у NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "Відкрити селектор" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "Написати" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "Тест повинен визначити csv_update_data." -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} не є дійсним регулярним виразом." -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "" "{self.__class__.__name__} повинен реалізувати get_required_permissions ()" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name} повинен реалізувати get_required_permissions()" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" @@ -14604,61 +15403,63 @@ msgstr "" "ObjectPermissionRequiredMixin можна використовувати лише у представленнях, " "які визначають базовий набір запитів" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "Батьківська група (ідентифікатор)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "Батьківська група (скорочення)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "Тип кластера (ідентифікатор)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "Кластер (ідентифікатор)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPU" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "Пам'ять (МБ)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "Диск (МБ)" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "Розмір (МБ)" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "Тип кластера" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "Призначена група кластерів" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "Призначений кластер" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "Призначений пристрій у кластері" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "Серійний номер" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " @@ -14667,52 +15468,52 @@ msgstr "" "{device} належить до іншого тех. майданчику ({device_site}) ніж кластер " "({cluster_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" "За бажанням прикріпити цю віртуальну машину до певного хост-пристрою в " "кластері" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "Тех. майданчик/Кластер" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" "Управління розміром диска здійснюється за допомогою приєднання віртуальних " "дисків." -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "Диск" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "тип кластера" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "типи кластерів" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "кластерна група" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "кластерні групи" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "кластер" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "кластери" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " @@ -14721,51 +15522,51 @@ msgstr "" "{count} пристрої призначені як хости для цього кластера, але не знаходяться " "на тех. майданчику{site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "пам'ять (МБ)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "диск (МБ)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "Ім'я віртуальної машини має бути унікальним для кожного кластера." -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "віртуальна машина" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "віртуальні машини" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" "Віртуальна машина повинна бути призначена для тех. майданчику та/або " "кластеру." -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" "Вибраний кластер ({cluster}) не присвоюється цьому тех. майданчику ({site})." -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "Необхідно вказати кластер при призначенні хост-пристрою." -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" "Обраний пристрій ({device}) не присвоюється цьому кластеру ({cluster})." -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " @@ -14774,17 +15575,17 @@ msgstr "" "Зазначений розмір диска ({size}) повинен відповідати сукупному розміру " "призначених віртуальних дисків ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "Повинен бути IPv{family} адреса. ({ip} є IPv{version} адреса.)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "Зазначена IP-адреса ({ip}) не присвоюється цієї віртуальній машині." -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " @@ -14793,7 +15594,7 @@ msgstr "" "Вибраний батьківський інтерфейс ({parent}) належить до іншої віртуальної " "машини ({virtual_machine})." -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " @@ -14802,7 +15603,7 @@ msgstr "" "Вибраний інтерфейс моста ({bridge}) належить до іншої віртуальної машини " "({virtual_machine})." -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " @@ -14812,392 +15613,415 @@ msgstr "" " і батьківська віртуальна машина інтерфейсу, або ж вона повинна бути " "глобальною." -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "розмір (МБ)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "віртуальний диск" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "віртуальні диски" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "Додано {count} пристроїв для кластеризації {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "Вилучено {count} пристроїв з кластера {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec - Транспорт" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - тунель" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-в-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "Хаб" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "Спиця (в колесі)" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "Агресивно" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "Головний" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "Попередньо спільні ключі" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "Сертифікати" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "Підписи RSA" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "Підписи DSA" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Група {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Приватна мережа Ethernet" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Віртуальна приватна локальна мережа Ethernet" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Приватне дерево Ethernet" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Віртуальне приватне дерево Ethernet" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "Тунельна група (ідентифікатор)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "Тунельна група (скорочення)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "Профіль IPsec (ідентифікатор)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "Профіль IPsec (ім'я)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "Тунель (ідентифікатор)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "Тунель (назва)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "Зовнішній IP (ідентифікатор)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "Політика IKE (ідентифікатор)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "Політика IKE (назва)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "Політика IPsec (ідентифікатор)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "Політика IPsec (назва)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN (скорочення)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "Інтерфейс віртуальної машини (ідентифікатор)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN (назва)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "Тунельна група" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "Термін служби SA" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "Попередньо спільний ключ" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "Політика IKE" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "Політика IPsec" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "Інкапсуляція тунелю" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "Операційна роль" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "Батьківський пристрій призначеного інтерфейсу" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "Батьківська віртуальна машина призначеного інтерфейсу" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "Інтерфейс пристрою або віртуальної машини" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "Пропозиція/iї IKE" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "Група Діффі-Хеллмана для Perfect Forward Secrecy" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "Пропозиція/iї IPsec" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "протокол IPsec" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "Тип L2VPN" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "Батьківський пристрій (для інтерфейсу)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "Батьківська віртуальна машина (для інтерфейсу)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "Призначений інтерфейс (пристрій або віртуальна машина)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "" "Не вдається імпортувати завершення інтерфейсу пристрою та віртуальної машини" " одночасно." -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "Кожне завершення повинно вказувати або інтерфейс, або VLAN." -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "Не вдається призначити як інтерфейс, так і VLAN." -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "Версія IKE" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "Пропозиція" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "Призначений тип об'єкта" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "Інтерфейс тунелю" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "Перший кінець" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "Другий кінець" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "Цей параметр обов'язковий при визначенні кінця." -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "Політика" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "Кінець повинен підключатися до інтерфейсу або VLAN." -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "Кінець може мати лише один кінцевий об'єкт (інтерфейс або VLAN)." -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "алгоритм шифрування" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "алгоритм аутентифікації" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "Ідентифікатор групи Діффі-Хеллмана" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "Термін служби асоціації безпеки (в секундах)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "Пропозиція IKE" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "Налаштування IKE" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "версія" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "налаштування" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "попередньо спільний ключ" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "Політика IKE" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "Режим необхідний для вибраної версії IKE" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "Режим не може бути використаний для вибраної версії IKE" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "шифрування" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "аутентифікація" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "Термін служби асоціації безпеки (секунди)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "Термін служби асоціації безпеки (в кілобайтах)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "Пропозиція IPsec" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "Пропозиції IPsec" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "Необхідно визначити алгоритм шифрування та/або аутентифікації" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "Політики IPsec" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "Профілі IPsec" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "Кінець L2VPN" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "Кінці L2VPN" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "Кінець L2VPN вже призначено ({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15206,188 +16030,196 @@ msgstr "" "{l2vpn_type} L2VPN не може мати більше двох кінців; знайдено " "{terminations_count} вже визначено." -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "тунельна група" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "тунельні групи" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "інкапсуляція" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "ідентифікатор тунелю" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "тунель" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "тунелі" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "Об'єкт може бути кінцем лише в одному тунелі одночасно." -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "кинець тунелю" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "кінці тунелів" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name} вже прикріплений до тунелю ({tunnel})." -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "Метод аутентифікації" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "Алгоритм шифрування" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "Алгоритм аутентифікації" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "Тривалість життя SA" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "Попередньо спільний ключ" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "Тривалість життя SA (секунди)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "Тривалість життя SA (КБ)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "Батьківський об'єкт" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "Тех. майданчик об'єкта" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "Точка доступу" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "Станція" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "Відкрита" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "Персональний WPA (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA для підприємства" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "Аутентифікаційний шифр" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "Одиниця відстані" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "Мостові VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "Інтерфейс A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "Інтерфейс Б" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "Сторона Б" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "шифр аутентифікації" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "група бездротової локальної мережі" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "групи бездротових локальних мереж" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "бездротова локальна мережа" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "інтерфейс А" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "інтерфейс Б" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "відстань" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "одиниця відстані" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "бездротовий канал зв'язок" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "бездротові канали зв'язку" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "" "Необхідно вказати одиницю виміру при установці відстані бездротового каналу " "зв'язку" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} не є бездротовим інтерфейсом." -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "Невірне значення каналу: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "Невірний атрибут каналу: {name}" diff --git a/netbox/translations/zh/LC_MESSAGES/django.mo b/netbox/translations/zh/LC_MESSAGES/django.mo index c06f982fd6c1be52f9e881f7d06d7e10570507ef..52e676825ea6e94e0278b6a72e72fe212ae91efc 100644 GIT binary patch delta 65942 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" msgstr "当前变量: {value}" -#: core/forms/model_forms.py:218 +#: netbox/core/forms/model_forms.py:218 msgid " (default)" msgstr "(默认)" -#: core/models/change_logging.py:29 +#: netbox/core/models/change_logging.py:29 msgid "time" msgstr "时间" -#: core/models/change_logging.py:42 +#: netbox/core/models/change_logging.py:42 msgid "user name" msgstr "用户名" -#: core/models/change_logging.py:47 +#: netbox/core/models/change_logging.py:47 msgid "request ID" msgstr "请求ID" -#: core/models/change_logging.py:52 extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 msgid "action" msgstr "动作" -#: core/models/change_logging.py:86 +#: netbox/core/models/change_logging.py:86 msgid "pre-change data" msgstr "变更前配置" -#: core/models/change_logging.py:92 +#: netbox/core/models/change_logging.py:92 msgid "post-change data" msgstr "变更后配置" -#: core/models/change_logging.py:106 +#: netbox/core/models/change_logging.py:106 msgid "object change" msgstr "变更的对象" -#: core/models/change_logging.py:107 +#: netbox/core/models/change_logging.py:107 msgid "object changes" msgstr "变更的对象" -#: core/models/change_logging.py:123 +#: netbox/core/models/change_logging.py:123 #, python-brace-format msgid "Change logging is not supported for this object type ({type})." msgstr "此对象类型 ({type}) 不支持更改日志记录。" -#: core/models/config.py:18 core/models/data.py:266 core/models/files.py:27 -#: core/models/jobs.py:49 extras/models/models.py:730 -#: extras/models/notifications.py:39 extras/models/notifications.py:186 -#: netbox/models/features.py:53 users/models/tokens.py:32 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 +#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/notifications.py:186 +#: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" msgstr "已创建" -#: core/models/config.py:22 +#: netbox/core/models/config.py:22 msgid "comment" msgstr "评论/注释" -#: core/models/config.py:29 +#: netbox/core/models/config.py:29 msgid "configuration data" msgstr "配置数据" -#: core/models/config.py:36 +#: netbox/core/models/config.py:36 msgid "config revision" msgstr "配置修订" -#: core/models/config.py:37 +#: netbox/core/models/config.py:37 msgid "config revisions" msgstr "配置修订" -#: core/models/config.py:41 +#: netbox/core/models/config.py:41 msgid "Default configuration" msgstr "默认配置" -#: core/models/config.py:43 +#: netbox/core/models/config.py:43 msgid "Current configuration" msgstr "当前配置" -#: core/models/config.py:44 +#: netbox/core/models/config.py:44 #, python-brace-format msgid "Config revision #{id}" msgstr "配置修订#{id}" -#: core/models/data.py:44 dcim/models/cables.py:43 -#: dcim/models/device_component_templates.py:203 -#: dcim/models/device_component_templates.py:237 -#: dcim/models/device_component_templates.py:272 -#: dcim/models/device_component_templates.py:334 -#: dcim/models/device_component_templates.py:413 -#: dcim/models/device_component_templates.py:512 -#: dcim/models/device_component_templates.py:612 -#: dcim/models/device_components.py:283 dcim/models/device_components.py:312 -#: dcim/models/device_components.py:345 dcim/models/device_components.py:463 -#: dcim/models/device_components.py:605 dcim/models/device_components.py:970 -#: dcim/models/device_components.py:1044 dcim/models/power.py:102 -#: extras/models/customfields.py:78 extras/models/search.py:41 -#: virtualization/models/clusters.py:61 vpn/models/l2vpn.py:32 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 +#: netbox/dcim/models/device_component_templates.py:203 +#: netbox/dcim/models/device_component_templates.py:237 +#: netbox/dcim/models/device_component_templates.py:272 +#: netbox/dcim/models/device_component_templates.py:334 +#: netbox/dcim/models/device_component_templates.py:413 +#: netbox/dcim/models/device_component_templates.py:512 +#: netbox/dcim/models/device_component_templates.py:612 +#: netbox/dcim/models/device_components.py:283 +#: netbox/dcim/models/device_components.py:312 +#: netbox/dcim/models/device_components.py:345 +#: netbox/dcim/models/device_components.py:463 +#: netbox/dcim/models/device_components.py:605 +#: netbox/dcim/models/device_components.py:970 +#: netbox/dcim/models/device_components.py:1044 +#: netbox/dcim/models/power.py:102 netbox/extras/models/customfields.py:78 +#: netbox/extras/models/search.py:41 +#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "类型" -#: core/models/data.py:49 extras/choices.py:37 extras/models/models.py:164 -#: extras/tables/tables.py:656 templates/core/datasource.html:58 -#: templates/core/plugin.html:66 +#: netbox/core/models/data.py:49 netbox/extras/choices.py:37 +#: netbox/extras/models/models.py:164 netbox/extras/tables/tables.py:656 +#: netbox/templates/core/datasource.html:58 +#: netbox/templates/core/plugin.html:66 msgid "URL" msgstr "URL" -#: core/models/data.py:59 dcim/models/device_component_templates.py:418 -#: dcim/models/device_components.py:512 extras/models/models.py:70 -#: extras/models/models.py:301 extras/models/models.py:526 -#: users/models/permissions.py:29 +#: netbox/core/models/data.py:59 +#: netbox/dcim/models/device_component_templates.py:418 +#: netbox/dcim/models/device_components.py:512 +#: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 +#: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" msgstr "已启用" -#: core/models/data.py:63 +#: netbox/core/models/data.py:63 msgid "ignore rules" msgstr "忽略规则" -#: core/models/data.py:65 +#: netbox/core/models/data.py:65 msgid "Patterns (one per line) matching files to ignore when syncing" msgstr "模式(每行一个)匹配同步时要忽略的文件" -#: core/models/data.py:68 extras/models/models.py:534 +#: netbox/core/models/data.py:68 netbox/extras/models/models.py:534 msgid "parameters" msgstr "参数" -#: core/models/data.py:73 +#: netbox/core/models/data.py:73 msgid "last synced" msgstr "最后同步" -#: core/models/data.py:81 +#: netbox/core/models/data.py:81 msgid "data source" msgstr "数据源" -#: core/models/data.py:82 +#: netbox/core/models/data.py:82 msgid "data sources" msgstr "数据源" -#: core/models/data.py:122 +#: netbox/core/models/data.py:122 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "未知后端类型: {type}" -#: core/models/data.py:164 +#: netbox/core/models/data.py:164 msgid "Cannot initiate sync; syncing already in progress." msgstr "无法启动同步; 同步已在进行中。" -#: core/models/data.py:177 +#: netbox/core/models/data.py:177 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "初始化后端时出错。 需要安装依赖:" -#: core/models/data.py:270 core/models/files.py:31 -#: netbox/models/features.py:59 +#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "最后更新" -#: core/models/data.py:280 dcim/models/cables.py:444 +#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 msgid "path" msgstr "路径" -#: core/models/data.py:283 +#: netbox/core/models/data.py:283 msgid "File path relative to the data source's root" msgstr "相对于数据源根目录的文件路径" -#: core/models/data.py:287 ipam/models/ip.py:503 +#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 msgid "size" msgstr "大小" -#: core/models/data.py:290 +#: netbox/core/models/data.py:290 msgid "hash" msgstr "哈希值" -#: core/models/data.py:294 +#: netbox/core/models/data.py:294 msgid "Length must be 64 hexadecimal characters." msgstr "长度必须为 64 个十六进制字符。" -#: core/models/data.py:296 +#: netbox/core/models/data.py:296 msgid "SHA256 hash of the file data" msgstr "文件数据的 SHA256 哈希值" -#: core/models/data.py:313 +#: netbox/core/models/data.py:313 msgid "data file" msgstr "数据文件" -#: core/models/data.py:314 +#: netbox/core/models/data.py:314 msgid "data files" msgstr "数据文件" -#: core/models/data.py:401 +#: netbox/core/models/data.py:401 msgid "auto sync record" msgstr "自动同步记录" -#: core/models/data.py:402 +#: netbox/core/models/data.py:402 msgid "auto sync records" msgstr "自动同步记录" -#: core/models/files.py:37 +#: netbox/core/models/files.py:37 msgid "file root" msgstr "根目录" -#: core/models/files.py:42 +#: netbox/core/models/files.py:42 msgid "file path" msgstr "文件路径" -#: core/models/files.py:44 +#: netbox/core/models/files.py:44 msgid "File path relative to the designated root path" msgstr "相对于指定根路径的文件路径" -#: core/models/files.py:61 +#: netbox/core/models/files.py:61 msgid "managed file" msgstr "托管文件" -#: core/models/files.py:62 +#: netbox/core/models/files.py:62 msgid "managed files" msgstr "托管文件" -#: core/models/jobs.py:53 +#: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "计划" -#: core/models/jobs.py:58 +#: netbox/core/models/jobs.py:59 msgid "interval" msgstr "间隔" -#: core/models/jobs.py:64 +#: netbox/core/models/jobs.py:65 msgid "Recurrence interval (in minutes)" msgstr "重复间隔(以分钟为单位)" -#: core/models/jobs.py:67 +#: netbox/core/models/jobs.py:68 msgid "started" msgstr "已经开始" -#: core/models/jobs.py:72 +#: netbox/core/models/jobs.py:73 msgid "completed" msgstr "已经完成" -#: core/models/jobs.py:90 extras/models/models.py:101 -#: extras/models/staging.py:87 +#: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 +#: netbox/extras/models/staging.py:87 msgid "data" msgstr "数据" -#: core/models/jobs.py:95 +#: netbox/core/models/jobs.py:96 msgid "error" msgstr "错误" -#: core/models/jobs.py:100 +#: netbox/core/models/jobs.py:101 msgid "job ID" msgstr "任务ID" -#: core/models/jobs.py:111 +#: netbox/core/models/jobs.py:112 msgid "job" msgstr "任务" -#: core/models/jobs.py:112 +#: netbox/core/models/jobs.py:113 msgid "jobs" msgstr "任务" -#: core/models/jobs.py:135 +#: netbox/core/models/jobs.py:136 #, python-brace-format msgid "Jobs cannot be assigned to this object type ({type})." msgstr "任务不能分配给此对象类型 ({type})" -#: core/models/jobs.py:185 +#: netbox/core/models/jobs.py:190 #, python-brace-format msgid "Invalid status for job termination. Choices are: {choices}" msgstr "作业终止状态无效。选项有:{choices}" -#: core/models/jobs.py:216 +#: netbox/core/models/jobs.py:221 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "不能使用 schedule_at 和 immediate 的值调用 enqueue ()。" -#: core/signals.py:126 +#: netbox/core/signals.py:126 #, python-brace-format msgid "Deletion is prevented by a protection rule: {message}" msgstr "保护规则阻止删除: {message}" -#: core/tables/change_logging.py:25 templates/account/profile.html:19 -#: templates/users/user.html:21 +#: netbox/core/tables/change_logging.py:25 +#: netbox/templates/account/profile.html:19 +#: netbox/templates/users/user.html:21 msgid "Full Name" msgstr "全名" -#: core/tables/change_logging.py:37 core/tables/jobs.py:21 -#: extras/choices.py:41 extras/tables/tables.py:279 -#: extras/tables/tables.py:297 extras/tables/tables.py:329 -#: extras/tables/tables.py:409 extras/tables/tables.py:470 -#: extras/tables/tables.py:576 extras/tables/tables.py:616 -#: extras/tables/tables.py:653 netbox/tables/tables.py:244 -#: templates/core/objectchange.html:58 templates/extras/eventrule.html:78 -#: templates/extras/journalentry.html:18 tenancy/tables/contacts.py:93 -#: vpn/tables/l2vpn.py:64 +#: netbox/core/tables/change_logging.py:37 netbox/core/tables/jobs.py:21 +#: netbox/extras/choices.py:41 netbox/extras/tables/tables.py:279 +#: netbox/extras/tables/tables.py:297 netbox/extras/tables/tables.py:329 +#: netbox/extras/tables/tables.py:409 netbox/extras/tables/tables.py:470 +#: netbox/extras/tables/tables.py:576 netbox/extras/tables/tables.py:616 +#: netbox/extras/tables/tables.py:653 netbox/netbox/tables/tables.py:244 +#: netbox/templates/core/objectchange.html:58 +#: netbox/templates/extras/eventrule.html:78 +#: netbox/templates/extras/journalentry.html:18 +#: netbox/tenancy/tables/contacts.py:93 netbox/vpn/tables/l2vpn.py:64 msgid "Object" msgstr "对象" -#: core/tables/change_logging.py:42 templates/core/objectchange.html:68 +#: netbox/core/tables/change_logging.py:42 +#: netbox/templates/core/objectchange.html:68 msgid "Request ID" msgstr "请求ID" -#: core/tables/config.py:21 users/forms/filtersets.py:44 users/tables.py:39 +#: netbox/core/tables/config.py:21 netbox/users/forms/filtersets.py:44 +#: netbox/users/tables.py:39 msgid "Is Active" msgstr "激活的" -#: core/tables/data.py:50 templates/core/datafile.html:31 +#: netbox/core/tables/data.py:50 netbox/templates/core/datafile.html:31 msgid "Path" msgstr "路径" -#: core/tables/data.py:54 templates/extras/inc/result_pending.html:7 +#: netbox/core/tables/data.py:54 +#: netbox/templates/extras/inc/result_pending.html:7 msgid "Last updated" msgstr "最后更新日期" -#: core/tables/jobs.py:10 core/tables/tasks.py:76 -#: dcim/tables/devicetypes.py:164 extras/tables/tables.py:216 -#: extras/tables/tables.py:460 netbox/tables/tables.py:189 -#: templates/dcim/virtualchassis_edit.html:52 utilities/forms/forms.py:73 -#: wireless/tables/wirelesslink.py:17 +#: netbox/core/tables/jobs.py:10 netbox/core/tables/tasks.py:76 +#: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 +#: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 +#: netbox/templates/dcim/virtualchassis_edit.html:52 +#: netbox/utilities/forms/forms.py:73 +#: netbox/wireless/tables/wirelesslink.py:17 msgid "ID" msgstr "ID" -#: core/tables/jobs.py:35 +#: netbox/core/tables/jobs.py:35 msgid "Interval" msgstr "间隔" -#: core/tables/plugins.py:14 templates/vpn/ipsecprofile.html:44 -#: vpn/forms/bulk_edit.py:141 vpn/forms/bulk_import.py:172 -#: vpn/tables/crypto.py:61 +#: netbox/core/tables/plugins.py:14 netbox/templates/vpn/ipsecprofile.html:44 +#: netbox/vpn/forms/bulk_edit.py:141 netbox/vpn/forms/bulk_import.py:172 +#: netbox/vpn/tables/crypto.py:61 msgid "Version" msgstr "版本" -#: core/tables/plugins.py:19 templates/core/datafile.html:38 +#: netbox/core/tables/plugins.py:19 netbox/templates/core/datafile.html:38 msgid "Last Updated" msgstr "最后更新" -#: core/tables/plugins.py:23 +#: netbox/core/tables/plugins.py:23 msgid "Minimum NetBox Version" msgstr "Netbox 最低版本" -#: core/tables/plugins.py:27 +#: netbox/core/tables/plugins.py:27 msgid "Maximum NetBox Version" msgstr "Netbox 最高版本" -#: core/tables/plugins.py:31 core/tables/plugins.py:74 +#: netbox/core/tables/plugins.py:31 netbox/core/tables/plugins.py:74 msgid "No plugin data found" msgstr "未找到插件数据" -#: core/tables/plugins.py:48 templates/core/plugin.html:62 +#: netbox/core/tables/plugins.py:48 netbox/templates/core/plugin.html:62 msgid "Author" msgstr "作者" -#: core/tables/plugins.py:54 +#: netbox/core/tables/plugins.py:54 msgid "Installed" msgstr "已安装" -#: core/tables/plugins.py:57 templates/core/plugin.html:84 +#: netbox/core/tables/plugins.py:57 netbox/templates/core/plugin.html:84 msgid "Certified" msgstr "已认证" -#: core/tables/plugins.py:60 +#: netbox/core/tables/plugins.py:60 msgid "Published" msgstr "已出版" -#: core/tables/plugins.py:66 +#: netbox/core/tables/plugins.py:66 msgid "Installed Version" msgstr "已安装的版本" -#: core/tables/plugins.py:70 +#: netbox/core/tables/plugins.py:70 msgid "Latest Version" msgstr "最新版本" -#: core/tables/tasks.py:18 +#: netbox/core/tables/tasks.py:18 msgid "Oldest Task" msgstr "最早的任务" -#: core/tables/tasks.py:42 templates/core/rq_worker_list.html:39 +#: netbox/core/tables/tasks.py:42 netbox/templates/core/rq_worker_list.html:39 msgid "Workers" msgstr "Workers" -#: core/tables/tasks.py:46 vpn/tables/tunnels.py:88 +#: netbox/core/tables/tasks.py:46 netbox/vpn/tables/tunnels.py:88 msgid "Host" msgstr "主机" -#: core/tables/tasks.py:50 ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 msgid "Port" msgstr "端口" -#: core/tables/tasks.py:54 +#: netbox/core/tables/tasks.py:54 msgid "DB" msgstr "数据库" -#: core/tables/tasks.py:58 +#: netbox/core/tables/tasks.py:58 msgid "Scheduler PID" msgstr "定时任务进程 PID" -#: core/tables/tasks.py:62 +#: netbox/core/tables/tasks.py:62 msgid "No queues found" msgstr "未找到队列" -#: core/tables/tasks.py:82 +#: netbox/core/tables/tasks.py:82 msgid "Enqueued" msgstr "已加入队列" -#: core/tables/tasks.py:85 +#: netbox/core/tables/tasks.py:85 msgid "Ended" msgstr "已完结" -#: core/tables/tasks.py:93 templates/core/rq_task.html:85 +#: netbox/core/tables/tasks.py:93 netbox/templates/core/rq_task.html:85 msgid "Callable" msgstr "可调用" -#: core/tables/tasks.py:97 +#: netbox/core/tables/tasks.py:97 msgid "No tasks found" msgstr "没有找到任务" -#: core/tables/tasks.py:118 templates/core/rq_worker.html:47 +#: netbox/core/tables/tasks.py:118 netbox/templates/core/rq_worker.html:47 msgid "State" msgstr "状态" -#: core/tables/tasks.py:121 templates/core/rq_worker.html:51 +#: netbox/core/tables/tasks.py:121 netbox/templates/core/rq_worker.html:51 msgid "Birth" msgstr "生成日期" -#: core/tables/tasks.py:124 templates/core/rq_worker.html:59 +#: netbox/core/tables/tasks.py:124 netbox/templates/core/rq_worker.html:59 msgid "PID" msgstr "PID" -#: core/tables/tasks.py:128 +#: netbox/core/tables/tasks.py:128 msgid "No workers found" msgstr "没有找到workers" -#: core/views.py:90 +#: netbox/core/views.py:90 #, python-brace-format msgid "Queued job #{id} to sync {datasource}" msgstr "已排队的作业 #{id} 同步 {datasource}" -#: core/views.py:319 +#: netbox/core/views.py:319 #, python-brace-format msgid "Restored configuration revision #{id}" msgstr "已恢复配置修订版 #{id}" -#: core/views.py:412 core/views.py:455 core/views.py:531 +#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 #, python-brace-format msgid "Job {job_id} not found" msgstr "任务{job_id} 未发现" -#: core/views.py:463 +#: netbox/core/views.py:463 #, python-brace-format msgid "Job {id} has been deleted." msgstr "工作 {id} 已被删除。" -#: core/views.py:465 +#: netbox/core/views.py:465 #, python-brace-format msgid "Error deleting job {id}: {error}" msgstr "删除任务时出错 {id}: {error}" -#: core/views.py:478 core/views.py:496 +#: netbox/core/views.py:478 netbox/core/views.py:496 #, python-brace-format msgid "Job {id} not found." msgstr "工作 {id} 未找到。" -#: core/views.py:484 +#: netbox/core/views.py:484 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "工作 {id} 已重新排队。" -#: core/views.py:519 +#: netbox/core/views.py:519 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "工作 {id} 已被排队。" -#: core/views.py:538 +#: netbox/core/views.py:538 #, python-brace-format msgid "Job {id} has been stopped." msgstr "工作 {id} 已停止。" -#: core/views.py:540 +#: netbox/core/views.py:540 #, python-brace-format msgid "Failed to stop job {id}" msgstr "无法停止作业 {id}" -#: core/views.py:674 +#: netbox/core/views.py:674 msgid "Plugins catalog could not be loaded" msgstr "无法加载插件目录" -#: core/views.py:708 +#: netbox/core/views.py:708 #, python-brace-format msgid "Plugin {name} not found" msgstr "插件 {name} 未找到" -#: dcim/api/serializers_/devices.py:49 dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:49 +#: netbox/dcim/api/serializers_/devicetypes.py:25 msgid "Position (U)" msgstr "具体U位" -#: dcim/api/serializers_/racks.py:112 templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:112 +#: netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "标识符ID" -#: dcim/choices.py:21 virtualization/choices.py:21 +#: netbox/dcim/choices.py:21 netbox/virtualization/choices.py:21 msgid "Staging" msgstr "暂存" -#: dcim/choices.py:23 dcim/choices.py:189 dcim/choices.py:240 -#: dcim/choices.py:1533 virtualization/choices.py:23 -#: virtualization/choices.py:48 +#: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 +#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "报废" -#: dcim/choices.py:24 +#: netbox/dcim/choices.py:24 msgid "Retired" msgstr "下架" -#: dcim/choices.py:65 +#: netbox/dcim/choices.py:65 msgid "2-post frame" msgstr "双立柱机架" -#: dcim/choices.py:66 +#: netbox/dcim/choices.py:66 msgid "4-post frame" msgstr "4立柱机架" -#: dcim/choices.py:67 +#: netbox/dcim/choices.py:67 msgid "4-post cabinet" msgstr "4立柱机柜" -#: dcim/choices.py:68 +#: netbox/dcim/choices.py:68 msgid "Wall-mounted frame" msgstr "壁挂式机架" -#: dcim/choices.py:69 +#: netbox/dcim/choices.py:69 msgid "Wall-mounted frame (vertical)" msgstr "壁挂式机架(竖式)" -#: dcim/choices.py:70 +#: netbox/dcim/choices.py:70 msgid "Wall-mounted cabinet" msgstr "壁挂式机柜" -#: dcim/choices.py:71 +#: netbox/dcim/choices.py:71 msgid "Wall-mounted cabinet (vertical)" msgstr "壁挂式机柜(立式)" -#: dcim/choices.py:83 dcim/choices.py:84 dcim/choices.py:85 dcim/choices.py:86 +#: netbox/dcim/choices.py:83 netbox/dcim/choices.py:84 +#: netbox/dcim/choices.py:85 netbox/dcim/choices.py:86 #, python-brace-format msgid "{n} inches" msgstr "{n} 英寸" -#: dcim/choices.py:100 ipam/choices.py:32 ipam/choices.py:50 -#: ipam/choices.py:70 ipam/choices.py:155 wireless/choices.py:26 +#: netbox/dcim/choices.py:100 netbox/ipam/choices.py:32 +#: netbox/ipam/choices.py:50 netbox/ipam/choices.py:70 +#: netbox/ipam/choices.py:155 netbox/wireless/choices.py:26 msgid "Reserved" msgstr "预留" -#: dcim/choices.py:101 templates/dcim/device.html:259 +#: netbox/dcim/choices.py:101 netbox/templates/dcim/device.html:259 msgid "Available" msgstr "可用" -#: dcim/choices.py:104 ipam/choices.py:33 ipam/choices.py:51 -#: ipam/choices.py:71 ipam/choices.py:156 wireless/choices.py:28 +#: netbox/dcim/choices.py:104 netbox/ipam/choices.py:33 +#: netbox/ipam/choices.py:51 netbox/ipam/choices.py:71 +#: netbox/ipam/choices.py:156 netbox/wireless/choices.py:28 msgid "Deprecated" msgstr "已弃用" -#: dcim/choices.py:114 templates/dcim/inc/panels/racktype_dimensions.html:41 +#: netbox/dcim/choices.py:114 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:41 msgid "Millimeters" msgstr "毫米" -#: dcim/choices.py:115 dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 msgid "Inches" msgstr "英寸" -#: dcim/choices.py:136 dcim/choices.py:207 dcim/choices.py:254 +#: netbox/dcim/choices.py:136 netbox/dcim/choices.py:207 +#: netbox/dcim/choices.py:254 msgid "Front to rear" msgstr "从前向后" -#: dcim/choices.py:137 dcim/choices.py:208 dcim/choices.py:255 +#: netbox/dcim/choices.py:137 netbox/dcim/choices.py:208 +#: netbox/dcim/choices.py:255 msgid "Rear to front" msgstr "从后向前" -#: dcim/choices.py:151 dcim/forms/bulk_edit.py:69 dcim/forms/bulk_edit.py:88 -#: dcim/forms/bulk_edit.py:174 dcim/forms/bulk_edit.py:1415 -#: dcim/forms/bulk_import.py:60 dcim/forms/bulk_import.py:74 -#: dcim/forms/bulk_import.py:137 dcim/forms/bulk_import.py:566 -#: dcim/forms/bulk_import.py:833 dcim/forms/bulk_import.py:1088 -#: dcim/forms/filtersets.py:234 dcim/forms/model_forms.py:74 -#: dcim/forms/model_forms.py:93 dcim/forms/model_forms.py:170 -#: dcim/forms/model_forms.py:1062 dcim/forms/model_forms.py:1502 -#: dcim/forms/object_import.py:176 dcim/tables/devices.py:656 -#: dcim/tables/devices.py:869 dcim/tables/devices.py:954 -#: extras/tables/tables.py:223 ipam/tables/fhrp.py:59 ipam/tables/ip.py:378 -#: ipam/tables/services.py:44 templates/dcim/interface.html:102 -#: templates/dcim/interface.html:309 templates/dcim/location.html:41 -#: templates/dcim/region.html:37 templates/dcim/sitegroup.html:37 -#: templates/ipam/service.html:28 templates/tenancy/contactgroup.html:29 -#: templates/tenancy/tenantgroup.html:37 -#: templates/virtualization/vminterface.html:39 -#: templates/wireless/wirelesslangroup.html:37 tenancy/forms/bulk_edit.py:27 -#: tenancy/forms/bulk_edit.py:61 tenancy/forms/bulk_import.py:24 -#: tenancy/forms/bulk_import.py:58 tenancy/forms/model_forms.py:25 -#: tenancy/forms/model_forms.py:68 virtualization/forms/bulk_edit.py:207 -#: virtualization/forms/bulk_import.py:151 -#: virtualization/tables/virtualmachines.py:162 wireless/forms/bulk_edit.py:24 -#: wireless/forms/bulk_import.py:21 wireless/forms/model_forms.py:21 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 +#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 +#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 +#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 +#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 +#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 +#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 +#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 +#: netbox/dcim/forms/model_forms.py:1509 +#: netbox/dcim/forms/object_import.py:176 netbox/dcim/tables/devices.py:656 +#: netbox/dcim/tables/devices.py:869 netbox/dcim/tables/devices.py:954 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:102 +#: netbox/templates/dcim/interface.html:309 +#: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 +#: netbox/templates/dcim/sitegroup.html:37 +#: netbox/templates/ipam/service.html:28 +#: netbox/templates/tenancy/contactgroup.html:29 +#: netbox/templates/tenancy/tenantgroup.html:37 +#: netbox/templates/virtualization/vminterface.html:39 +#: netbox/templates/wireless/wirelesslangroup.html:37 +#: netbox/tenancy/forms/bulk_edit.py:27 netbox/tenancy/forms/bulk_edit.py:61 +#: netbox/tenancy/forms/bulk_import.py:24 +#: netbox/tenancy/forms/bulk_import.py:58 +#: netbox/tenancy/forms/model_forms.py:25 +#: netbox/tenancy/forms/model_forms.py:68 +#: netbox/virtualization/forms/bulk_edit.py:207 +#: netbox/virtualization/forms/bulk_import.py:151 +#: netbox/virtualization/tables/virtualmachines.py:162 +#: netbox/wireless/forms/bulk_edit.py:24 +#: netbox/wireless/forms/bulk_import.py:21 +#: netbox/wireless/forms/model_forms.py:21 msgid "Parent" msgstr "上级" -#: dcim/choices.py:152 +#: netbox/dcim/choices.py:152 msgid "Child" msgstr "子类" -#: dcim/choices.py:166 templates/dcim/device.html:340 -#: templates/dcim/rack.html:133 templates/dcim/rack_elevation_list.html:20 -#: templates/dcim/rackreservation.html:76 +#: netbox/dcim/choices.py:166 netbox/templates/dcim/device.html:340 +#: netbox/templates/dcim/rack.html:133 +#: netbox/templates/dcim/rack_elevation_list.html:20 +#: netbox/templates/dcim/rackreservation.html:76 msgid "Front" msgstr "前" -#: dcim/choices.py:167 templates/dcim/device.html:346 -#: templates/dcim/rack.html:139 templates/dcim/rack_elevation_list.html:21 -#: templates/dcim/rackreservation.html:82 +#: netbox/dcim/choices.py:167 netbox/templates/dcim/device.html:346 +#: netbox/templates/dcim/rack.html:139 +#: netbox/templates/dcim/rack_elevation_list.html:21 +#: netbox/templates/dcim/rackreservation.html:82 msgid "Rear" msgstr "后" -#: dcim/choices.py:186 dcim/choices.py:238 virtualization/choices.py:46 +#: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 +#: netbox/virtualization/choices.py:46 msgid "Staged" msgstr "已暂存" -#: dcim/choices.py:188 +#: netbox/dcim/choices.py:188 msgid "Inventory" msgstr "库存中" -#: dcim/choices.py:209 dcim/choices.py:256 +#: netbox/dcim/choices.py:209 netbox/dcim/choices.py:256 msgid "Left to right" msgstr "从左向右" -#: dcim/choices.py:210 dcim/choices.py:257 +#: netbox/dcim/choices.py:210 netbox/dcim/choices.py:257 msgid "Right to left" msgstr "从右向左" -#: dcim/choices.py:211 dcim/choices.py:258 +#: netbox/dcim/choices.py:211 netbox/dcim/choices.py:258 msgid "Side to rear" msgstr "侧进风后出风" -#: dcim/choices.py:212 +#: netbox/dcim/choices.py:212 msgid "Rear to side" msgstr "从后到边" -#: dcim/choices.py:213 +#: netbox/dcim/choices.py:213 msgid "Bottom to top" msgstr "自下而上" -#: dcim/choices.py:214 +#: netbox/dcim/choices.py:214 msgid "Top to bottom" msgstr "从上到下" -#: dcim/choices.py:215 dcim/choices.py:259 dcim/choices.py:1305 +#: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 +#: netbox/dcim/choices.py:1305 msgid "Passive" msgstr "被动" -#: dcim/choices.py:216 +#: netbox/dcim/choices.py:216 msgid "Mixed" msgstr "混合风道" -#: dcim/choices.py:484 dcim/choices.py:733 +#: netbox/dcim/choices.py:484 netbox/dcim/choices.py:733 msgid "NEMA (Non-locking)" msgstr "NEMA(非锁定)" -#: dcim/choices.py:506 dcim/choices.py:755 +#: netbox/dcim/choices.py:506 netbox/dcim/choices.py:755 msgid "NEMA (Locking)" msgstr "NEMA(锁定)" -#: dcim/choices.py:530 dcim/choices.py:779 +#: netbox/dcim/choices.py:530 netbox/dcim/choices.py:779 msgid "California Style" msgstr "美标" -#: dcim/choices.py:538 +#: netbox/dcim/choices.py:538 msgid "International/ITA" msgstr "国际通用标准/ITA" -#: dcim/choices.py:573 dcim/choices.py:814 +#: netbox/dcim/choices.py:573 netbox/dcim/choices.py:814 msgid "Proprietary" msgstr "专用规格" -#: dcim/choices.py:581 dcim/choices.py:824 dcim/choices.py:1221 -#: dcim/choices.py:1223 dcim/choices.py:1449 dcim/choices.py:1451 -#: netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 +#: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 +#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 +#: netbox/netbox/navigation/menu.py:200 msgid "Other" msgstr "其他" -#: dcim/choices.py:787 +#: netbox/dcim/choices.py:787 msgid "ITA/International" msgstr "ITA/国际通用标准" -#: dcim/choices.py:854 +#: netbox/dcim/choices.py:854 msgid "Physical" msgstr "物理" -#: dcim/choices.py:855 dcim/choices.py:1024 +#: netbox/dcim/choices.py:855 netbox/dcim/choices.py:1024 msgid "Virtual" msgstr "虚拟" -#: dcim/choices.py:856 dcim/choices.py:1099 dcim/forms/bulk_edit.py:1558 -#: dcim/forms/filtersets.py:1330 dcim/forms/model_forms.py:988 -#: dcim/forms/model_forms.py:1397 netbox/navigation/menu.py:140 -#: netbox/navigation/menu.py:144 templates/dcim/interface.html:210 +#: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 +#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 +#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 +#: netbox/templates/dcim/interface.html:210 msgid "Wireless" msgstr "无线" -#: dcim/choices.py:1022 +#: netbox/dcim/choices.py:1022 msgid "Virtual interfaces" msgstr "虚拟接口" -#: dcim/choices.py:1025 dcim/forms/bulk_edit.py:1423 -#: dcim/forms/bulk_import.py:840 dcim/forms/model_forms.py:974 -#: dcim/tables/devices.py:660 templates/dcim/interface.html:106 -#: templates/virtualization/vminterface.html:43 -#: virtualization/forms/bulk_edit.py:212 -#: virtualization/forms/bulk_import.py:158 -#: virtualization/tables/virtualmachines.py:166 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 +#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 +#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/templates/virtualization/vminterface.html:43 +#: netbox/virtualization/forms/bulk_edit.py:212 +#: netbox/virtualization/forms/bulk_import.py:158 +#: netbox/virtualization/tables/virtualmachines.py:166 msgid "Bridge" msgstr "桥接" -#: dcim/choices.py:1026 +#: netbox/dcim/choices.py:1026 msgid "Link Aggregation Group (LAG)" msgstr "链路聚合组(LAG)" -#: dcim/choices.py:1030 +#: netbox/dcim/choices.py:1030 msgid "Ethernet (fixed)" msgstr "以太网(固定类型)" -#: dcim/choices.py:1046 +#: netbox/dcim/choices.py:1046 msgid "Ethernet (modular)" msgstr "以太网(模块)" -#: dcim/choices.py:1083 +#: netbox/dcim/choices.py:1083 msgid "Ethernet (backplane)" msgstr "以太网(背板)" -#: dcim/choices.py:1115 +#: netbox/dcim/choices.py:1115 msgid "Cellular" msgstr "蜂窝网络" -#: dcim/choices.py:1167 dcim/forms/filtersets.py:383 -#: dcim/forms/filtersets.py:809 dcim/forms/filtersets.py:963 -#: dcim/forms/filtersets.py:1542 templates/dcim/inventoryitem.html:52 -#: templates/dcim/virtualchassis_edit.html:54 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 +#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 +#: netbox/dcim/forms/filtersets.py:1542 +#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "串口" -#: dcim/choices.py:1182 +#: netbox/dcim/choices.py:1182 msgid "Coaxial" msgstr "同轴电缆接口" -#: dcim/choices.py:1202 +#: netbox/dcim/choices.py:1202 msgid "Stacking" msgstr "堆叠" -#: dcim/choices.py:1252 +#: netbox/dcim/choices.py:1252 msgid "Half" msgstr "半双工" -#: dcim/choices.py:1253 +#: netbox/dcim/choices.py:1253 msgid "Full" msgstr "全双工" -#: dcim/choices.py:1254 netbox/preferences.py:31 wireless/choices.py:480 +#: netbox/dcim/choices.py:1254 netbox/netbox/preferences.py:31 +#: netbox/wireless/choices.py:480 msgid "Auto" msgstr "自动" -#: dcim/choices.py:1265 +#: netbox/dcim/choices.py:1265 msgid "Access" msgstr "接入" -#: dcim/choices.py:1266 ipam/tables/vlans.py:172 ipam/tables/vlans.py:217 -#: templates/dcim/inc/interface_vlans_table.html:7 +#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 +#: netbox/ipam/tables/vlans.py:217 +#: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "Trunk口" -#: dcim/choices.py:1267 +#: netbox/dcim/choices.py:1267 msgid "Tagged (All)" msgstr "Trunk口(允许所有VLAN)" -#: dcim/choices.py:1296 +#: netbox/dcim/choices.py:1296 msgid "IEEE Standard" msgstr "IEEE标准" -#: dcim/choices.py:1307 +#: netbox/dcim/choices.py:1307 msgid "Passive 24V (2-pair)" msgstr "24V(2对供电)" -#: dcim/choices.py:1308 +#: netbox/dcim/choices.py:1308 msgid "Passive 24V (4-pair)" msgstr "24V(4对供电)" -#: dcim/choices.py:1309 +#: netbox/dcim/choices.py:1309 msgid "Passive 48V (2-pair)" msgstr "48V(2对供电)" -#: dcim/choices.py:1310 +#: netbox/dcim/choices.py:1310 msgid "Passive 48V (4-pair)" msgstr "48V(4对供电)" -#: dcim/choices.py:1380 dcim/choices.py:1490 +#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 msgid "Copper" msgstr "铜缆" -#: dcim/choices.py:1403 +#: netbox/dcim/choices.py:1403 msgid "Fiber Optic" msgstr "光纤" -#: dcim/choices.py:1436 dcim/choices.py:1519 +#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 msgid "USB" msgstr "USB" -#: dcim/choices.py:1506 +#: netbox/dcim/choices.py:1506 msgid "Fiber" msgstr "光纤" -#: dcim/choices.py:1531 dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 msgid "Connected" msgstr "已连接" -#: dcim/choices.py:1550 wireless/choices.py:497 +#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 msgid "Kilometers" msgstr "公里" -#: dcim/choices.py:1551 templates/dcim/cable_trace.html:65 -#: wireless/choices.py:498 +#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 +#: netbox/wireless/choices.py:498 msgid "Meters" msgstr "米" -#: dcim/choices.py:1552 +#: netbox/dcim/choices.py:1552 msgid "Centimeters" msgstr "厘米" -#: dcim/choices.py:1553 wireless/choices.py:499 +#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 msgid "Miles" msgstr "英里" -#: dcim/choices.py:1554 templates/dcim/cable_trace.html:66 -#: wireless/choices.py:500 +#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 +#: netbox/wireless/choices.py:500 msgid "Feet" msgstr "英尺" -#: dcim/choices.py:1570 templates/dcim/device.html:327 -#: templates/dcim/rack.html:107 +#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 msgid "Kilograms" msgstr "千克" -#: dcim/choices.py:1571 +#: netbox/dcim/choices.py:1571 msgid "Grams" msgstr "克" -#: dcim/choices.py:1572 templates/dcim/device.html:328 -#: templates/dcim/rack.html:108 +#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 msgid "Pounds" msgstr "磅" -#: dcim/choices.py:1573 +#: netbox/dcim/choices.py:1573 msgid "Ounces" msgstr "盎司" -#: dcim/choices.py:1620 +#: netbox/dcim/choices.py:1620 msgid "Redundant" msgstr "冗余" -#: dcim/choices.py:1641 +#: netbox/dcim/choices.py:1641 msgid "Single phase" msgstr "单相电" -#: dcim/choices.py:1642 +#: netbox/dcim/choices.py:1642 msgid "Three-phase" msgstr "三相" -#: dcim/fields.py:45 +#: netbox/dcim/fields.py:45 #, python-brace-format msgid "Invalid MAC address format: {value}" msgstr "MAC地址格式无效:{value}" -#: dcim/fields.py:71 +#: netbox/dcim/fields.py:71 #, python-brace-format msgid "Invalid WWN format: {value}" msgstr "WWN格式无效:{value}" -#: dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:86 msgid "Parent region (ID)" msgstr "上一级地区(ID)" -#: dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:92 msgid "Parent region (slug)" msgstr "上一级地区(缩写)" -#: dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:116 msgid "Parent site group (ID)" msgstr "上一级站点组(ID)" -#: dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:122 msgid "Parent site group (slug)" msgstr "上一级站点组(缩写)" -#: dcim/filtersets.py:164 extras/filtersets.py:364 ipam/filtersets.py:841 -#: ipam/filtersets.py:993 +#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 msgid "Group (ID)" msgstr "组(ID)" -#: dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:170 msgid "Group (slug)" msgstr "组(缩写)" -#: dcim/filtersets.py:176 dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 msgid "AS (ID)" msgstr "AS (ID)" -#: dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:246 msgid "Parent location (ID)" msgstr "父级位置(ID)" -#: dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:252 msgid "Parent location (slug)" msgstr "父级位置(缩写)" -#: dcim/filtersets.py:258 dcim/filtersets.py:369 dcim/filtersets.py:490 -#: dcim/filtersets.py:1057 dcim/filtersets.py:1404 dcim/filtersets.py:2182 +#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 +#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 +#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 msgid "Location (ID)" msgstr "位置(ID)" -#: dcim/filtersets.py:265 dcim/filtersets.py:376 dcim/filtersets.py:497 -#: dcim/filtersets.py:1410 extras/filtersets.py:542 +#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 +#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 +#: netbox/extras/filtersets.py:542 msgid "Location (slug)" msgstr "位置(缩写)" -#: dcim/filtersets.py:296 dcim/filtersets.py:381 dcim/filtersets.py:539 -#: dcim/filtersets.py:678 dcim/filtersets.py:882 dcim/filtersets.py:933 -#: dcim/filtersets.py:973 dcim/filtersets.py:1306 dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 +#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 +#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 +#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 +#: netbox/dcim/filtersets.py:1840 msgid "Manufacturer (ID)" msgstr "厂商(ID)" -#: dcim/filtersets.py:302 dcim/filtersets.py:387 dcim/filtersets.py:545 -#: dcim/filtersets.py:684 dcim/filtersets.py:888 dcim/filtersets.py:939 -#: dcim/filtersets.py:979 dcim/filtersets.py:1312 dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 +#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 +#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 +#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 +#: netbox/dcim/filtersets.py:1846 msgid "Manufacturer (slug)" msgstr "厂商 (缩写)" -#: dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" msgstr "机架类型(弹头)" -#: dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" msgstr "机架类型 (ID)" -#: dcim/filtersets.py:411 dcim/filtersets.py:892 dcim/filtersets.py:994 -#: dcim/filtersets.py:1850 ipam/filtersets.py:381 ipam/filtersets.py:493 -#: ipam/filtersets.py:1003 virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 +#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 +#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 +#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "角色(ID)" -#: dcim/filtersets.py:417 dcim/filtersets.py:898 dcim/filtersets.py:1000 -#: dcim/filtersets.py:1856 extras/filtersets.py:558 ipam/filtersets.py:387 -#: ipam/filtersets.py:499 ipam/filtersets.py:1009 -#: virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 +#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 +#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "角色 (缩写)" -#: dcim/filtersets.py:447 dcim/filtersets.py:1062 dcim/filtersets.py:1415 -#: dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 +#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 msgid "Rack (ID)" msgstr "机柜(ID)" -#: dcim/filtersets.py:507 extras/filtersets.py:293 extras/filtersets.py:337 -#: extras/filtersets.py:359 extras/filtersets.py:419 users/filtersets.py:113 -#: users/filtersets.py:180 +#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 +#: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 +#: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "用户(名称)" -#: dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:549 msgid "Default platform (ID)" msgstr "默认系统平台(ID)" -#: dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:555 msgid "Default platform (slug)" msgstr "默认系统平台(缩写)" -#: dcim/filtersets.py:558 dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 msgid "Has a front image" msgstr "有前面板图片" -#: dcim/filtersets.py:562 dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 msgid "Has a rear image" msgstr "有后面板图片" -#: dcim/filtersets.py:567 dcim/filtersets.py:688 dcim/filtersets.py:1131 -#: dcim/forms/filtersets.py:531 dcim/forms/filtersets.py:627 -#: dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 +#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 +#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 msgid "Has console ports" msgstr "具有console端口" -#: dcim/filtersets.py:571 dcim/filtersets.py:692 dcim/filtersets.py:1135 -#: dcim/forms/filtersets.py:538 dcim/forms/filtersets.py:634 -#: dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 +#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 +#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 msgid "Has console server ports" msgstr "具有console 服务器端口" -#: dcim/filtersets.py:575 dcim/filtersets.py:696 dcim/filtersets.py:1139 -#: dcim/forms/filtersets.py:545 dcim/forms/filtersets.py:641 -#: dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 +#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 +#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 msgid "Has power ports" msgstr "有电源接口" -#: dcim/filtersets.py:579 dcim/filtersets.py:700 dcim/filtersets.py:1143 -#: dcim/forms/filtersets.py:552 dcim/forms/filtersets.py:648 -#: dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 +#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 +#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 msgid "Has power outlets" msgstr "有电源插座" -#: dcim/filtersets.py:583 dcim/filtersets.py:704 dcim/filtersets.py:1147 -#: dcim/forms/filtersets.py:559 dcim/forms/filtersets.py:655 -#: dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 +#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 +#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 msgid "Has interfaces" msgstr "有接口" -#: dcim/filtersets.py:587 dcim/filtersets.py:708 dcim/filtersets.py:1151 -#: dcim/forms/filtersets.py:566 dcim/forms/filtersets.py:662 -#: dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 +#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 +#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 msgid "Has pass-through ports" msgstr "有直通端口" -#: dcim/filtersets.py:591 dcim/filtersets.py:1155 dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 +#: netbox/dcim/forms/filtersets.py:580 msgid "Has module bays" msgstr "有模块托架" -#: dcim/filtersets.py:595 dcim/filtersets.py:1159 dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 +#: netbox/dcim/forms/filtersets.py:573 msgid "Has device bays" msgstr "有设备托架" -#: dcim/filtersets.py:599 dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 msgid "Has inventory items" msgstr "有库存项" -#: dcim/filtersets.py:756 dcim/filtersets.py:989 dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 +#: netbox/dcim/filtersets.py:1436 msgid "Device type (ID)" msgstr "设备型号(ID)" -#: dcim/filtersets.py:772 dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 msgid "Module type (ID)" msgstr "模块类型(ID)" -#: dcim/filtersets.py:804 dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 msgid "Power port (ID)" msgstr "电源接口(ID)" -#: dcim/filtersets.py:878 dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 msgid "Parent inventory item (ID)" msgstr "上一级库存项(ID)" -#: dcim/filtersets.py:921 dcim/filtersets.py:947 dcim/filtersets.py:1127 -#: virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 +#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 msgid "Config template (ID)" msgstr "配置模板(ID)" -#: dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:985 msgid "Device type (slug)" msgstr "设备型号 (缩写)" -#: dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1005 msgid "Parent Device (ID)" msgstr "上一级设备(ID)" -#: dcim/filtersets.py:1009 virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 msgid "Platform (ID)" msgstr "平台(ID)" -#: dcim/filtersets.py:1015 extras/filtersets.py:569 -#: virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:226 msgid "Platform (slug)" msgstr "平台(缩写)" -#: dcim/filtersets.py:1051 dcim/filtersets.py:1399 dcim/filtersets.py:1934 -#: dcim/filtersets.py:2176 dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 +#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 +#: netbox/dcim/filtersets.py:2235 msgid "Site name (slug)" msgstr "站点名字 (缩写)" -#: dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1067 msgid "Parent bay (ID)" msgstr "父级托架(IE)" -#: dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1071 msgid "VM cluster (ID)" msgstr "虚拟机集群(ID)" -#: dcim/filtersets.py:1077 extras/filtersets.py:591 -#: virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:136 msgid "Cluster group (slug)" msgstr "集群组(缩写)" -#: dcim/filtersets.py:1082 virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 msgid "Cluster group (ID)" msgstr "集群组(ID)" -#: dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1088 msgid "Device model (slug)" msgstr "设备模块(缩写)" -#: dcim/filtersets.py:1099 dcim/forms/bulk_edit.py:517 +#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 msgid "Is full depth" msgstr "是否全尺寸" -#: dcim/filtersets.py:1103 dcim/forms/common.py:18 -#: dcim/forms/filtersets.py:818 dcim/forms/filtersets.py:1385 -#: dcim/models/device_components.py:518 virtualization/filtersets.py:230 -#: virtualization/filtersets.py:301 virtualization/forms/filtersets.py:172 -#: virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 +#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 +#: netbox/dcim/models/device_components.py:518 +#: netbox/virtualization/filtersets.py:230 +#: netbox/virtualization/filtersets.py:301 +#: netbox/virtualization/forms/filtersets.py:172 +#: netbox/virtualization/forms/filtersets.py:223 msgid "MAC address" msgstr "MAC 地址" -#: dcim/filtersets.py:1110 dcim/filtersets.py:1274 -#: dcim/forms/filtersets.py:827 dcim/forms/filtersets.py:930 -#: virtualization/filtersets.py:234 virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 +#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 +#: netbox/virtualization/filtersets.py:234 +#: netbox/virtualization/forms/filtersets.py:176 msgid "Has a primary IP" msgstr "有主IP" -#: dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1114 msgid "Has an out-of-band IP" msgstr "有带外管理IP" -#: dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1119 msgid "Virtual chassis (ID)" msgstr "堆叠 (ID)" -#: dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1123 msgid "Is a virtual chassis member" msgstr "是堆叠成员" -#: dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1164 msgid "OOB IP (ID)" msgstr "带外管理IP(ID)" -#: dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1168 msgid "Has virtual device context" msgstr "有虚拟设备上下文" -#: dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1257 msgid "VDC (ID)" msgstr "VDC (ID)" -#: dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1262 msgid "Device model" msgstr "设备型号" -#: dcim/filtersets.py:1267 ipam/filtersets.py:632 vpn/filtersets.py:102 -#: vpn/filtersets.py:401 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "接口(ID)" -#: dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1323 msgid "Module type (model)" msgstr "模块类型(模块)" -#: dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1329 msgid "Module bay (ID)" msgstr "模块托架 (ID)" -#: dcim/filtersets.py:1333 dcim/filtersets.py:1425 ipam/filtersets.py:611 -#: ipam/filtersets.py:851 ipam/filtersets.py:1115 -#: virtualization/filtersets.py:161 vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 +#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 +#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "设备(ID)" -#: dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1421 msgid "Rack (name)" msgstr "机柜(名称)" -#: dcim/filtersets.py:1431 ipam/filtersets.py:606 ipam/filtersets.py:846 -#: ipam/filtersets.py:1121 vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 +#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "设备(名称)" -#: dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1442 msgid "Device type (model)" msgstr "设备型号 (model)" -#: dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1447 msgid "Device role (ID)" msgstr "设备角色(ID)" -#: dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1453 msgid "Device role (slug)" msgstr "设备角色(缩写)" -#: dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1458 msgid "Virtual Chassis (ID)" msgstr "堆叠(ID)" -#: dcim/filtersets.py:1464 dcim/forms/filtersets.py:109 -#: dcim/tables/devices.py:206 netbox/navigation/menu.py:79 -#: templates/dcim/device.html:120 templates/dcim/device_edit.html:93 -#: templates/dcim/virtualchassis.html:20 -#: templates/dcim/virtualchassis_add.html:8 -#: templates/dcim/virtualchassis_edit.html:24 +#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 +#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/templates/dcim/device.html:120 +#: netbox/templates/dcim/device_edit.html:93 +#: netbox/templates/dcim/virtualchassis.html:20 +#: netbox/templates/dcim/virtualchassis_add.html:8 +#: netbox/templates/dcim/virtualchassis_edit.html:24 msgid "Virtual Chassis" msgstr "堆叠" -#: dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1488 msgid "Module (ID)" msgstr "模块(ID)" -#: dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1495 msgid "Cable (ID)" msgstr "线缆(ID)" -#: dcim/filtersets.py:1604 ipam/forms/bulk_import.py:189 -#: vpn/forms/bulk_import.py:308 +#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "指定VLAN" -#: dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1608 msgid "Assigned VID" msgstr "指定VID" -#: dcim/filtersets.py:1613 dcim/forms/bulk_edit.py:1526 -#: dcim/forms/bulk_import.py:891 dcim/forms/filtersets.py:1428 -#: dcim/forms/model_forms.py:1378 dcim/models/device_components.py:711 -#: dcim/tables/devices.py:626 ipam/filtersets.py:316 ipam/filtersets.py:327 -#: ipam/filtersets.py:483 ipam/filtersets.py:584 ipam/filtersets.py:595 -#: ipam/forms/bulk_edit.py:242 ipam/forms/bulk_edit.py:298 -#: ipam/forms/bulk_edit.py:340 ipam/forms/bulk_import.py:157 -#: ipam/forms/bulk_import.py:243 ipam/forms/bulk_import.py:279 -#: ipam/forms/filtersets.py:67 ipam/forms/filtersets.py:172 -#: ipam/forms/filtersets.py:309 ipam/forms/model_forms.py:62 -#: ipam/forms/model_forms.py:202 ipam/forms/model_forms.py:247 -#: ipam/forms/model_forms.py:300 ipam/forms/model_forms.py:431 -#: ipam/forms/model_forms.py:445 ipam/forms/model_forms.py:459 -#: ipam/models/ip.py:233 ipam/models/ip.py:512 ipam/models/ip.py:720 -#: ipam/models/vrfs.py:62 ipam/tables/ip.py:242 ipam/tables/ip.py:309 -#: ipam/tables/ip.py:360 ipam/tables/ip.py:450 -#: templates/dcim/interface.html:133 templates/ipam/ipaddress.html:18 -#: templates/ipam/iprange.html:40 templates/ipam/prefix.html:19 -#: templates/ipam/vrf.html:7 templates/ipam/vrf.html:13 -#: templates/virtualization/vminterface.html:47 -#: virtualization/forms/bulk_edit.py:261 -#: virtualization/forms/bulk_import.py:171 -#: virtualization/forms/filtersets.py:228 -#: virtualization/forms/model_forms.py:344 -#: virtualization/models/virtualmachines.py:355 -#: virtualization/tables/virtualmachines.py:143 +#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 +#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 +#: netbox/dcim/forms/model_forms.py:1385 +#: netbox/dcim/models/device_components.py:711 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 +#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 +#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 +#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 +#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 +#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 +#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 +#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 +#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 +#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 +#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 +#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 +#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 +#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 +#: netbox/templates/dcim/interface.html:133 +#: netbox/templates/ipam/ipaddress.html:18 +#: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 +#: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 +#: netbox/templates/virtualization/vminterface.html:47 +#: netbox/virtualization/forms/bulk_edit.py:261 +#: netbox/virtualization/forms/bulk_import.py:171 +#: netbox/virtualization/forms/filtersets.py:228 +#: netbox/virtualization/forms/model_forms.py:344 +#: netbox/virtualization/models/virtualmachines.py:355 +#: netbox/virtualization/tables/virtualmachines.py:143 msgid "VRF" msgstr "VRF" -#: dcim/filtersets.py:1619 ipam/filtersets.py:322 ipam/filtersets.py:333 -#: ipam/filtersets.py:489 ipam/filtersets.py:590 ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 +#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 +#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 msgid "VRF (RD)" msgstr "VRF (RD)" -#: dcim/filtersets.py:1624 ipam/filtersets.py:1030 vpn/filtersets.py:342 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" -#: dcim/filtersets.py:1630 dcim/forms/filtersets.py:1433 -#: dcim/tables/devices.py:570 ipam/filtersets.py:1036 -#: ipam/forms/filtersets.py:518 ipam/tables/vlans.py:137 -#: templates/dcim/interface.html:93 templates/ipam/vlan.html:66 -#: templates/vpn/l2vpntermination.html:12 -#: virtualization/forms/filtersets.py:233 vpn/forms/bulk_import.py:280 -#: vpn/forms/filtersets.py:246 vpn/forms/model_forms.py:409 -#: vpn/forms/model_forms.py:427 vpn/models/l2vpn.py:63 vpn/tables/l2vpn.py:55 +#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 +#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/templates/vpn/l2vpntermination.html:12 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 +#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "L2VPN" -#: dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1662 msgid "Virtual Chassis Interfaces for Device" msgstr "设备的集群接口" -#: dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1667 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "设备的集群接口(ID)" -#: dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1671 msgid "Kind of interface" msgstr "接口类型" -#: dcim/filtersets.py:1676 virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 msgid "Parent interface (ID)" msgstr "父级接口(ID)" -#: dcim/filtersets.py:1681 virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 msgid "Bridged interface (ID)" msgstr "桥接接口(ID)" -#: dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1686 msgid "LAG interface (ID)" msgstr "链路聚合接口(ID)" -#: dcim/filtersets.py:1713 dcim/filtersets.py:1725 -#: dcim/forms/filtersets.py:1345 dcim/forms/model_forms.py:1690 -#: templates/dcim/virtualdevicecontext.html:15 +#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 +#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "虚拟设备上下文" -#: dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1719 msgid "Virtual Device Context (Identifier)" msgstr "虚拟设备上下文(ID)" -#: dcim/filtersets.py:1730 templates/wireless/wirelesslan.html:11 -#: wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1730 +#: netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:53 msgid "Wireless LAN" msgstr "无线局域网" -#: dcim/filtersets.py:1734 dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 msgid "Wireless link" msgstr "无线连接" -#: dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1803 msgid "Parent module bay (ID)" msgstr "父模块托架 (ID)" -#: dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1808 msgid "Installed module (ID)" msgstr "已安装模块(ID)" -#: dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1819 msgid "Installed device (ID)" msgstr "已安装设备(ID)" -#: dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1825 msgid "Installed device (name)" msgstr "已安装设备(名称)" -#: dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:1891 msgid "Master (ID)" msgstr "主设备(ID)" -#: dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:1897 msgid "Master (name)" msgstr "主设备(名称)" -#: dcim/filtersets.py:1939 tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "租户(ID)" -#: dcim/filtersets.py:1945 extras/filtersets.py:618 tenancy/filtersets.py:251 +#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "租户(缩写)" -#: dcim/filtersets.py:1981 dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 msgid "Unterminated" msgstr "未接终端" -#: dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" msgstr "电源面板(ID)" -#: dcim/forms/bulk_create.py:40 extras/forms/filtersets.py:401 -#: extras/forms/model_forms.py:567 extras/forms/model_forms.py:619 -#: netbox/forms/base.py:86 netbox/forms/mixins.py:81 -#: netbox/tables/columns.py:478 -#: templates/circuits/inc/circuit_termination.html:32 -#: templates/generic/bulk_edit.html:65 templates/inc/panels/tags.html:5 -#: utilities/forms/fields/fields.py:81 +#: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 +#: netbox/extras/forms/model_forms.py:567 +#: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/templates/circuits/inc/circuit_termination.html:32 +#: netbox/templates/generic/bulk_edit.html:65 +#: netbox/templates/inc/panels/tags.html:5 +#: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" msgstr "标签" -#: dcim/forms/bulk_create.py:112 dcim/forms/filtersets.py:1498 -#: dcim/forms/model_forms.py:488 dcim/forms/model_forms.py:546 -#: dcim/forms/object_create.py:197 dcim/forms/object_create.py:353 -#: dcim/tables/devices.py:165 dcim/tables/devices.py:707 -#: dcim/tables/devicetypes.py:246 templates/dcim/device.html:43 -#: templates/dcim/device.html:131 templates/dcim/modulebay.html:38 -#: templates/dcim/virtualchassis.html:66 -#: templates/dcim/virtualchassis_edit.html:55 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 +#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/object_create.py:197 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 +#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 +#: netbox/templates/dcim/modulebay.html:38 +#: netbox/templates/dcim/virtualchassis.html:66 +#: netbox/templates/dcim/virtualchassis_edit.html:55 msgid "Position" msgstr "位置" -#: dcim/forms/bulk_create.py:114 +#: netbox/dcim/forms/bulk_create.py:114 msgid "" "Alphanumeric ranges are supported. (Must match the number of names being " "created.)" msgstr "支持字母和数字。(必须与正在创建的名称数相匹配)" -#: dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:133 msgid "Contact name" msgstr "联系人名字" -#: dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:138 msgid "Contact phone" msgstr "联系人手机" -#: dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:144 msgid "Contact E-mail" msgstr "联系人电子邮箱" -#: dcim/forms/bulk_edit.py:147 dcim/forms/bulk_import.py:123 -#: dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/model_forms.py:128 msgid "Time zone" msgstr "时区" -#: dcim/forms/bulk_edit.py:225 dcim/forms/bulk_edit.py:496 -#: dcim/forms/bulk_edit.py:560 dcim/forms/bulk_edit.py:633 -#: dcim/forms/bulk_edit.py:657 dcim/forms/bulk_edit.py:750 -#: dcim/forms/bulk_edit.py:1277 dcim/forms/bulk_edit.py:1698 -#: dcim/forms/bulk_import.py:182 dcim/forms/bulk_import.py:371 -#: dcim/forms/bulk_import.py:405 dcim/forms/bulk_import.py:450 -#: dcim/forms/bulk_import.py:486 dcim/forms/bulk_import.py:1082 -#: dcim/forms/filtersets.py:313 dcim/forms/filtersets.py:372 -#: dcim/forms/filtersets.py:494 dcim/forms/filtersets.py:619 -#: dcim/forms/filtersets.py:700 dcim/forms/filtersets.py:782 -#: dcim/forms/filtersets.py:947 dcim/forms/filtersets.py:1539 -#: dcim/forms/model_forms.py:207 dcim/forms/model_forms.py:337 -#: dcim/forms/model_forms.py:349 dcim/forms/model_forms.py:395 -#: dcim/forms/model_forms.py:436 dcim/forms/model_forms.py:1075 -#: dcim/forms/model_forms.py:1515 dcim/forms/object_import.py:187 -#: dcim/tables/devices.py:96 dcim/tables/devices.py:172 -#: dcim/tables/devices.py:940 dcim/tables/devicetypes.py:80 -#: dcim/tables/devicetypes.py:308 dcim/tables/modules.py:20 -#: dcim/tables/modules.py:60 dcim/tables/racks.py:58 dcim/tables/racks.py:132 -#: templates/dcim/devicetype.html:14 templates/dcim/inventoryitem.html:44 -#: templates/dcim/manufacturer.html:33 templates/dcim/modulebay.html:62 -#: templates/dcim/moduletype.html:25 templates/dcim/platform.html:37 -#: templates/dcim/racktype.html:16 +#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 +#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 +#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 +#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 +#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 +#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 +#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 +#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 +#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 +#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 +#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 +#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 +#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1522 +#: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 +#: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 +#: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 +#: netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/templates/dcim/manufacturer.html:33 +#: netbox/templates/dcim/modulebay.html:62 +#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/platform.html:37 +#: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" msgstr "厂商" -#: dcim/forms/bulk_edit.py:230 dcim/forms/bulk_edit.py:373 -#: dcim/forms/bulk_import.py:191 dcim/forms/bulk_import.py:263 -#: dcim/forms/filtersets.py:255 -#: templates/dcim/inc/panels/racktype_dimensions.html:6 +#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 +#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 +#: netbox/dcim/forms/filtersets.py:255 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "外形规格" -#: dcim/forms/bulk_edit.py:235 dcim/forms/bulk_edit.py:378 -#: dcim/forms/bulk_import.py:199 dcim/forms/bulk_import.py:266 -#: dcim/forms/filtersets.py:260 -#: templates/dcim/inc/panels/racktype_dimensions.html:10 +#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 +#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 +#: netbox/dcim/forms/filtersets.py:260 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "宽度" -#: dcim/forms/bulk_edit.py:241 dcim/forms/bulk_edit.py:384 -#: templates/dcim/devicetype.html:37 +#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 +#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "高度(U)" -#: dcim/forms/bulk_edit.py:250 dcim/forms/bulk_edit.py:389 -#: dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 +#: netbox/dcim/forms/filtersets.py:274 msgid "Descending units" msgstr "U位显示降序" -#: dcim/forms/bulk_edit.py:253 dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 msgid "Outer width" msgstr "外部宽度" -#: dcim/forms/bulk_edit.py:258 dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 msgid "Outer depth" msgstr "外部深度" -#: dcim/forms/bulk_edit.py:263 dcim/forms/bulk_edit.py:402 -#: dcim/forms/bulk_import.py:204 dcim/forms/bulk_import.py:271 +#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 msgid "Outer unit" msgstr "外部单元" -#: dcim/forms/bulk_edit.py:268 dcim/forms/bulk_edit.py:407 +#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 msgid "Mounting depth" msgstr "安装深度" -#: dcim/forms/bulk_edit.py:273 dcim/forms/bulk_edit.py:300 -#: dcim/forms/bulk_edit.py:417 dcim/forms/bulk_edit.py:447 -#: dcim/forms/bulk_edit.py:530 dcim/forms/bulk_edit.py:553 -#: dcim/forms/bulk_edit.py:574 dcim/forms/bulk_edit.py:596 -#: dcim/forms/bulk_import.py:384 dcim/forms/bulk_import.py:416 -#: dcim/forms/filtersets.py:285 dcim/forms/filtersets.py:307 -#: dcim/forms/filtersets.py:327 dcim/forms/filtersets.py:401 -#: dcim/forms/filtersets.py:488 dcim/forms/filtersets.py:594 -#: dcim/forms/filtersets.py:613 dcim/forms/filtersets.py:674 -#: dcim/forms/model_forms.py:221 dcim/forms/model_forms.py:298 -#: dcim/tables/devicetypes.py:106 dcim/tables/modules.py:35 -#: dcim/tables/racks.py:74 dcim/tables/racks.py:172 -#: extras/forms/bulk_edit.py:53 extras/forms/bulk_edit.py:133 -#: extras/forms/bulk_edit.py:183 extras/forms/bulk_edit.py:288 -#: extras/forms/filtersets.py:64 extras/forms/filtersets.py:156 -#: extras/forms/filtersets.py:243 ipam/forms/bulk_edit.py:190 -#: templates/dcim/device.html:324 templates/dcim/devicetype.html:49 -#: templates/dcim/moduletype.html:45 templates/dcim/rack.html:81 -#: templates/dcim/racktype.html:41 templates/extras/configcontext.html:17 -#: templates/extras/customlink.html:25 templates/extras/savedfilter.html:33 -#: templates/ipam/role.html:30 +#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 +#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 +#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 +#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 +#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 +#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 +#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 +#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 +#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 +#: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 +#: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/templates/dcim/device.html:324 +#: netbox/templates/dcim/devicetype.html:49 +#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/racktype.html:41 +#: netbox/templates/extras/configcontext.html:17 +#: netbox/templates/extras/customlink.html:25 +#: netbox/templates/extras/savedfilter.html:33 +#: netbox/templates/ipam/role.html:30 msgid "Weight" msgstr "重量" -#: dcim/forms/bulk_edit.py:278 dcim/forms/bulk_edit.py:422 -#: dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 +#: netbox/dcim/forms/filtersets.py:290 msgid "Max weight" msgstr "最大承重" -#: dcim/forms/bulk_edit.py:283 dcim/forms/bulk_edit.py:427 -#: dcim/forms/bulk_edit.py:535 dcim/forms/bulk_edit.py:579 -#: dcim/forms/bulk_import.py:210 dcim/forms/bulk_import.py:283 -#: dcim/forms/bulk_import.py:389 dcim/forms/bulk_import.py:421 -#: dcim/forms/filtersets.py:295 dcim/forms/filtersets.py:598 -#: dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 +#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 +#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 +#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 +#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 +#: netbox/dcim/forms/filtersets.py:678 msgid "Weight unit" msgstr "重量单位" -#: dcim/forms/bulk_edit.py:297 dcim/forms/filtersets.py:305 -#: dcim/forms/model_forms.py:217 dcim/forms/model_forms.py:256 -#: templates/dcim/rack.html:45 templates/dcim/racktype.html:13 +#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "机架类型" -#: dcim/forms/bulk_edit.py:299 dcim/forms/model_forms.py:220 -#: dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 +#: netbox/dcim/forms/model_forms.py:297 msgid "Outer Dimensions" msgstr "外部尺寸" -#: dcim/forms/bulk_edit.py:302 dcim/forms/model_forms.py:222 -#: dcim/forms/model_forms.py:299 templates/dcim/device.html:315 -#: templates/dcim/inc/panels/racktype_dimensions.html:3 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 +#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "外部尺寸" -#: dcim/forms/bulk_edit.py:304 dcim/forms/filtersets.py:306 -#: dcim/forms/filtersets.py:326 dcim/forms/model_forms.py:224 -#: templates/dcim/inc/panels/racktype_numbering.html:3 +#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "编号" -#: dcim/forms/bulk_edit.py:358 dcim/forms/bulk_edit.py:1272 -#: dcim/forms/bulk_edit.py:1693 dcim/forms/bulk_import.py:253 -#: dcim/forms/bulk_import.py:1076 dcim/forms/filtersets.py:367 -#: dcim/forms/filtersets.py:777 dcim/forms/filtersets.py:1534 -#: dcim/forms/model_forms.py:251 dcim/forms/model_forms.py:1070 -#: dcim/forms/model_forms.py:1510 dcim/forms/object_import.py:181 -#: dcim/tables/devices.py:169 dcim/tables/devices.py:809 -#: dcim/tables/devices.py:937 dcim/tables/devicetypes.py:304 -#: dcim/tables/racks.py:129 extras/filtersets.py:552 -#: ipam/forms/bulk_edit.py:261 ipam/forms/bulk_edit.py:311 -#: ipam/forms/bulk_edit.py:359 ipam/forms/bulk_edit.py:511 -#: ipam/forms/bulk_import.py:197 ipam/forms/bulk_import.py:262 -#: ipam/forms/bulk_import.py:298 ipam/forms/bulk_import.py:455 -#: ipam/forms/filtersets.py:237 ipam/forms/filtersets.py:289 -#: ipam/forms/filtersets.py:360 ipam/forms/filtersets.py:509 -#: ipam/forms/model_forms.py:188 ipam/forms/model_forms.py:221 -#: ipam/forms/model_forms.py:250 ipam/forms/model_forms.py:643 -#: ipam/tables/ip.py:258 ipam/tables/ip.py:316 ipam/tables/ip.py:367 -#: ipam/tables/vlans.py:130 ipam/tables/vlans.py:235 -#: templates/dcim/device.html:182 -#: templates/dcim/inc/panels/inventory_items.html:20 -#: templates/dcim/interface.html:223 templates/dcim/inventoryitem.html:36 -#: templates/dcim/rack.html:49 templates/ipam/ipaddress.html:41 -#: templates/ipam/iprange.html:50 templates/ipam/prefix.html:77 -#: templates/ipam/role.html:19 templates/ipam/vlan.html:52 -#: templates/virtualization/virtualmachine.html:23 -#: templates/vpn/tunneltermination.html:17 -#: templates/wireless/inc/wirelesslink_interface.html:20 -#: tenancy/forms/bulk_edit.py:142 tenancy/forms/filtersets.py:107 -#: tenancy/forms/model_forms.py:137 tenancy/tables/contacts.py:102 -#: virtualization/forms/bulk_edit.py:145 -#: virtualization/forms/bulk_import.py:106 -#: virtualization/forms/filtersets.py:157 -#: virtualization/forms/model_forms.py:195 -#: virtualization/tables/virtualmachines.py:75 vpn/forms/bulk_edit.py:87 -#: vpn/forms/bulk_import.py:81 vpn/forms/filtersets.py:85 -#: vpn/forms/model_forms.py:78 vpn/forms/model_forms.py:113 -#: vpn/tables/tunnels.py:82 +#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 +#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 +#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 +#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 +#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 +#: netbox/dcim/forms/model_forms.py:1517 +#: netbox/dcim/forms/object_import.py:181 netbox/dcim/tables/devices.py:169 +#: netbox/dcim/tables/devices.py:809 netbox/dcim/tables/devices.py:937 +#: netbox/dcim/tables/devicetypes.py:304 netbox/dcim/tables/racks.py:129 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:261 +#: netbox/ipam/forms/bulk_edit.py:311 netbox/ipam/forms/bulk_edit.py:359 +#: netbox/ipam/forms/bulk_edit.py:511 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:262 netbox/ipam/forms/bulk_import.py:298 +#: netbox/ipam/forms/bulk_import.py:479 netbox/ipam/forms/filtersets.py:237 +#: netbox/ipam/forms/filtersets.py:289 netbox/ipam/forms/filtersets.py:360 +#: netbox/ipam/forms/filtersets.py:509 netbox/ipam/forms/model_forms.py:188 +#: netbox/ipam/forms/model_forms.py:221 netbox/ipam/forms/model_forms.py:250 +#: netbox/ipam/forms/model_forms.py:676 netbox/ipam/tables/ip.py:258 +#: netbox/ipam/tables/ip.py:316 netbox/ipam/tables/ip.py:367 +#: netbox/ipam/tables/vlans.py:130 netbox/ipam/tables/vlans.py:235 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:223 +#: netbox/templates/dcim/inventoryitem.html:36 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 +#: netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:145 +#: netbox/virtualization/forms/bulk_import.py:106 +#: netbox/virtualization/forms/filtersets.py:157 +#: netbox/virtualization/forms/model_forms.py:195 +#: netbox/virtualization/tables/virtualmachines.py:75 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 +#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 msgid "Role" msgstr "角色" -#: dcim/forms/bulk_edit.py:365 dcim/forms/bulk_edit.py:713 -#: dcim/forms/bulk_edit.py:774 templates/dcim/device.html:104 -#: templates/dcim/module.html:77 templates/dcim/modulebay.html:70 -#: templates/dcim/rack.html:57 templates/virtualization/virtualmachine.html:35 +#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 +#: netbox/dcim/forms/filtersets.py:380 +msgid "Rack type" +msgstr "机柜类型" + +#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 +#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/templates/dcim/module.html:77 +#: netbox/templates/dcim/modulebay.html:70 netbox/templates/dcim/rack.html:57 +#: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "序列号" -#: dcim/forms/bulk_edit.py:368 dcim/forms/filtersets.py:387 -#: dcim/forms/filtersets.py:813 dcim/forms/filtersets.py:967 -#: dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 +#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 +#: netbox/dcim/forms/filtersets.py:1546 msgid "Asset tag" msgstr "资产标签" -#: dcim/forms/bulk_edit.py:412 dcim/forms/bulk_edit.py:525 -#: dcim/forms/bulk_edit.py:569 dcim/forms/bulk_edit.py:706 -#: dcim/forms/bulk_import.py:277 dcim/forms/bulk_import.py:410 -#: dcim/forms/bulk_import.py:580 dcim/forms/filtersets.py:280 -#: dcim/forms/filtersets.py:511 dcim/forms/filtersets.py:669 -#: dcim/forms/filtersets.py:804 templates/dcim/device.html:98 -#: templates/dcim/devicetype.html:65 templates/dcim/moduletype.html:41 -#: templates/dcim/rack.html:65 templates/dcim/racktype.html:28 +#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 +#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 +#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 +#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 +#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 +#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/templates/dcim/devicetype.html:65 +#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "气流方向" -#: dcim/forms/bulk_edit.py:441 dcim/forms/bulk_edit.py:920 -#: dcim/forms/bulk_import.py:322 dcim/forms/bulk_import.py:325 -#: dcim/forms/bulk_import.py:553 dcim/forms/bulk_import.py:1358 -#: dcim/forms/bulk_import.py:1362 dcim/forms/filtersets.py:104 -#: dcim/forms/filtersets.py:324 dcim/forms/filtersets.py:405 -#: dcim/forms/filtersets.py:419 dcim/forms/filtersets.py:457 -#: dcim/forms/filtersets.py:772 dcim/forms/filtersets.py:1035 -#: dcim/forms/filtersets.py:1167 dcim/forms/model_forms.py:264 -#: dcim/forms/model_forms.py:306 dcim/forms/model_forms.py:479 -#: dcim/forms/model_forms.py:755 dcim/forms/object_create.py:400 -#: dcim/tables/devices.py:161 dcim/tables/power.py:70 dcim/tables/racks.py:217 -#: ipam/forms/filtersets.py:442 templates/dcim/device.html:30 -#: templates/dcim/inc/cable_termination.html:16 -#: templates/dcim/powerfeed.html:28 templates/dcim/rack.html:13 -#: templates/dcim/rack/base.html:4 templates/dcim/rackreservation.html:19 -#: templates/dcim/rackreservation.html:36 -#: virtualization/forms/model_forms.py:113 +#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 +#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 +#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 +#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 +#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 +#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 +#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 +#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 +#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 +#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/templates/dcim/device.html:30 +#: netbox/templates/dcim/inc/cable_termination.html:16 +#: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 +#: netbox/templates/dcim/rack/base.html:4 +#: netbox/templates/dcim/rackreservation.html:19 +#: netbox/templates/dcim/rackreservation.html:36 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "机柜" -#: dcim/forms/bulk_edit.py:445 dcim/forms/bulk_edit.py:739 -#: dcim/forms/filtersets.py:325 dcim/forms/filtersets.py:398 -#: dcim/forms/filtersets.py:481 dcim/forms/filtersets.py:608 -#: dcim/forms/filtersets.py:721 dcim/forms/filtersets.py:942 -#: dcim/forms/model_forms.py:670 dcim/forms/model_forms.py:1580 -#: templates/dcim/device_edit.html:20 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 +#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 +#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 +#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "硬件" -#: dcim/forms/bulk_edit.py:501 dcim/forms/bulk_import.py:377 -#: dcim/forms/filtersets.py:499 dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 +#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 msgid "Default platform" msgstr "默认系统平台" -#: dcim/forms/bulk_edit.py:506 dcim/forms/bulk_edit.py:565 -#: dcim/forms/filtersets.py:502 dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 +#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 msgid "Part number" msgstr "部件编码(PN)" -#: dcim/forms/bulk_edit.py:510 +#: netbox/dcim/forms/bulk_edit.py:515 msgid "U height" msgstr "U高度" -#: dcim/forms/bulk_edit.py:522 dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "从利用率中排除" -#: dcim/forms/bulk_edit.py:551 dcim/forms/model_forms.py:368 -#: dcim/tables/devicetypes.py:77 templates/dcim/device.html:88 -#: templates/dcim/devicebay.html:52 templates/dcim/module.html:61 +#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 +#: netbox/templates/dcim/devicebay.html:52 +#: netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "设备型号" -#: dcim/forms/bulk_edit.py:593 dcim/forms/model_forms.py:401 -#: dcim/tables/modules.py:17 dcim/tables/modules.py:65 -#: templates/dcim/module.html:65 templates/dcim/modulebay.html:66 -#: templates/dcim/moduletype.html:22 +#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/templates/dcim/module.html:65 +#: netbox/templates/dcim/modulebay.html:66 +#: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "设备配件类型" -#: dcim/forms/bulk_edit.py:597 dcim/forms/model_forms.py:371 -#: dcim/forms/model_forms.py:402 templates/dcim/devicetype.html:11 +#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:402 +#: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "机箱" -#: dcim/forms/bulk_edit.py:611 dcim/models/devices.py:484 -#: dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 +#: netbox/dcim/tables/devices.py:67 msgid "VM role" msgstr "VM 角色" -#: dcim/forms/bulk_edit.py:614 dcim/forms/bulk_edit.py:638 -#: dcim/forms/bulk_edit.py:721 dcim/forms/bulk_import.py:434 -#: dcim/forms/bulk_import.py:438 dcim/forms/bulk_import.py:457 -#: dcim/forms/bulk_import.py:461 dcim/forms/bulk_import.py:586 -#: dcim/forms/bulk_import.py:590 dcim/forms/filtersets.py:689 -#: dcim/forms/filtersets.py:705 dcim/forms/filtersets.py:823 -#: dcim/forms/model_forms.py:415 dcim/forms/model_forms.py:441 -#: dcim/forms/model_forms.py:555 virtualization/forms/bulk_import.py:132 -#: virtualization/forms/bulk_import.py:133 -#: virtualization/forms/filtersets.py:188 -#: virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 +#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 +#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 +#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 +#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 +#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 +#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 +#: netbox/dcim/forms/model_forms.py:555 +#: netbox/virtualization/forms/bulk_import.py:132 +#: netbox/virtualization/forms/bulk_import.py:133 +#: netbox/virtualization/forms/filtersets.py:188 +#: netbox/virtualization/forms/model_forms.py:215 msgid "Config template" msgstr "配置模版" -#: dcim/forms/bulk_edit.py:662 dcim/forms/bulk_edit.py:1071 -#: dcim/forms/bulk_import.py:492 dcim/forms/filtersets.py:114 -#: dcim/forms/model_forms.py:501 dcim/forms/model_forms.py:872 -#: dcim/forms/model_forms.py:889 extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 +#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 +#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 +#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "设备型号" -#: dcim/forms/bulk_edit.py:673 dcim/forms/bulk_import.py:473 -#: dcim/forms/filtersets.py:119 dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 msgid "Device role" msgstr "设备角色" -#: dcim/forms/bulk_edit.py:696 dcim/forms/bulk_import.py:498 -#: dcim/forms/filtersets.py:796 dcim/forms/model_forms.py:451 -#: dcim/forms/model_forms.py:513 dcim/tables/devices.py:182 -#: extras/filtersets.py:563 templates/dcim/device.html:186 -#: templates/dcim/platform.html:26 -#: templates/virtualization/virtualmachine.html:27 -#: virtualization/forms/bulk_edit.py:160 -#: virtualization/forms/bulk_import.py:122 -#: virtualization/forms/filtersets.py:168 -#: virtualization/forms/model_forms.py:203 -#: virtualization/tables/virtualmachines.py:79 +#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 +#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 +#: netbox/templates/dcim/platform.html:26 +#: netbox/templates/virtualization/virtualmachine.html:27 +#: netbox/virtualization/forms/bulk_edit.py:160 +#: netbox/virtualization/forms/bulk_import.py:122 +#: netbox/virtualization/forms/filtersets.py:168 +#: netbox/virtualization/forms/model_forms.py:203 +#: netbox/virtualization/tables/virtualmachines.py:79 msgid "Platform" msgstr "平台" -#: dcim/forms/bulk_edit.py:726 dcim/forms/bulk_import.py:517 -#: dcim/forms/filtersets.py:728 dcim/forms/filtersets.py:898 -#: dcim/forms/model_forms.py:522 dcim/tables/devices.py:202 -#: extras/filtersets.py:596 extras/forms/filtersets.py:322 -#: ipam/forms/filtersets.py:415 ipam/forms/filtersets.py:447 -#: templates/dcim/device.html:239 templates/virtualization/cluster.html:10 -#: templates/virtualization/virtualmachine.html:92 -#: templates/virtualization/virtualmachine.html:101 -#: virtualization/filtersets.py:157 virtualization/filtersets.py:277 -#: virtualization/forms/bulk_edit.py:129 -#: virtualization/forms/bulk_import.py:92 -#: virtualization/forms/filtersets.py:99 -#: virtualization/forms/filtersets.py:123 -#: virtualization/forms/filtersets.py:204 -#: virtualization/forms/model_forms.py:79 -#: virtualization/forms/model_forms.py:176 -#: virtualization/tables/virtualmachines.py:67 +#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 +#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 +#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 +#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/templates/dcim/device.html:239 +#: netbox/templates/virtualization/cluster.html:10 +#: netbox/templates/virtualization/virtualmachine.html:92 +#: netbox/templates/virtualization/virtualmachine.html:101 +#: netbox/virtualization/filtersets.py:157 +#: netbox/virtualization/filtersets.py:277 +#: netbox/virtualization/forms/bulk_edit.py:129 +#: netbox/virtualization/forms/bulk_import.py:92 +#: netbox/virtualization/forms/filtersets.py:99 +#: netbox/virtualization/forms/filtersets.py:123 +#: netbox/virtualization/forms/filtersets.py:204 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:176 +#: netbox/virtualization/tables/virtualmachines.py:67 msgid "Cluster" msgstr "集群" -#: dcim/forms/bulk_edit.py:737 dcim/forms/bulk_edit.py:1291 -#: dcim/forms/bulk_edit.py:1688 dcim/forms/bulk_edit.py:1734 -#: dcim/forms/bulk_import.py:641 dcim/forms/bulk_import.py:703 -#: dcim/forms/bulk_import.py:729 dcim/forms/bulk_import.py:755 -#: dcim/forms/bulk_import.py:775 dcim/forms/bulk_import.py:828 -#: dcim/forms/bulk_import.py:946 dcim/forms/bulk_import.py:994 -#: dcim/forms/bulk_import.py:1011 dcim/forms/bulk_import.py:1023 -#: dcim/forms/bulk_import.py:1071 dcim/forms/bulk_import.py:1422 -#: dcim/forms/connections.py:24 dcim/forms/filtersets.py:131 -#: dcim/forms/filtersets.py:921 dcim/forms/filtersets.py:1051 -#: dcim/forms/filtersets.py:1242 dcim/forms/filtersets.py:1267 -#: dcim/forms/filtersets.py:1291 dcim/forms/filtersets.py:1311 -#: dcim/forms/filtersets.py:1334 dcim/forms/filtersets.py:1444 -#: dcim/forms/filtersets.py:1469 dcim/forms/filtersets.py:1493 -#: dcim/forms/filtersets.py:1511 dcim/forms/filtersets.py:1528 -#: dcim/forms/filtersets.py:1592 dcim/forms/filtersets.py:1616 -#: dcim/forms/filtersets.py:1640 dcim/forms/model_forms.py:633 -#: dcim/forms/model_forms.py:849 dcim/forms/model_forms.py:1208 -#: dcim/forms/model_forms.py:1664 dcim/forms/object_create.py:257 -#: dcim/tables/connections.py:22 dcim/tables/connections.py:41 -#: dcim/tables/connections.py:60 dcim/tables/devices.py:285 -#: dcim/tables/devices.py:371 dcim/tables/devices.py:412 -#: dcim/tables/devices.py:454 dcim/tables/devices.py:505 -#: dcim/tables/devices.py:597 dcim/tables/devices.py:697 -#: dcim/tables/devices.py:754 dcim/tables/devices.py:801 -#: dcim/tables/devices.py:861 dcim/tables/devices.py:930 -#: dcim/tables/devices.py:1057 dcim/tables/modules.py:52 -#: extras/forms/filtersets.py:321 ipam/forms/bulk_import.py:304 -#: ipam/forms/bulk_import.py:481 ipam/forms/filtersets.py:551 -#: ipam/forms/model_forms.py:319 ipam/forms/model_forms.py:679 -#: ipam/forms/model_forms.py:712 ipam/forms/model_forms.py:738 -#: ipam/tables/vlans.py:180 templates/dcim/consoleport.html:20 -#: templates/dcim/consoleserverport.html:20 templates/dcim/device.html:15 -#: templates/dcim/device.html:130 templates/dcim/device_edit.html:10 -#: templates/dcim/devicebay.html:20 templates/dcim/devicebay.html:48 -#: templates/dcim/frontport.html:20 templates/dcim/interface.html:30 -#: templates/dcim/interface.html:161 templates/dcim/inventoryitem.html:20 -#: templates/dcim/module.html:57 templates/dcim/modulebay.html:20 -#: templates/dcim/poweroutlet.html:20 templates/dcim/powerport.html:20 -#: templates/dcim/rearport.html:20 templates/dcim/virtualchassis.html:65 -#: templates/dcim/virtualchassis_edit.html:51 -#: templates/dcim/virtualdevicecontext.html:22 -#: templates/virtualization/virtualmachine.html:114 -#: templates/vpn/tunneltermination.html:23 -#: templates/wireless/inc/wirelesslink_interface.html:6 -#: virtualization/filtersets.py:167 virtualization/forms/bulk_edit.py:137 -#: virtualization/forms/bulk_import.py:99 -#: virtualization/forms/filtersets.py:128 -#: virtualization/forms/model_forms.py:185 -#: virtualization/tables/virtualmachines.py:71 vpn/choices.py:44 -#: vpn/forms/bulk_import.py:86 vpn/forms/bulk_import.py:283 -#: vpn/forms/filtersets.py:275 vpn/forms/model_forms.py:90 -#: vpn/forms/model_forms.py:125 vpn/forms/model_forms.py:236 -#: vpn/forms/model_forms.py:453 wireless/forms/model_forms.py:99 -#: wireless/forms/model_forms.py:141 wireless/tables/wirelesslan.py:75 +#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 +#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 +#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 +#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 +#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 +#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 +#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 +#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 +#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 +#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 +#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 +#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 +#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 +#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 +#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 +#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 +#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 +#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 +#: netbox/dcim/forms/model_forms.py:1671 +#: netbox/dcim/forms/object_create.py:249 netbox/dcim/tables/connections.py:22 +#: netbox/dcim/tables/connections.py:41 netbox/dcim/tables/connections.py:60 +#: netbox/dcim/tables/devices.py:285 netbox/dcim/tables/devices.py:371 +#: netbox/dcim/tables/devices.py:412 netbox/dcim/tables/devices.py:454 +#: netbox/dcim/tables/devices.py:505 netbox/dcim/tables/devices.py:597 +#: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 +#: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 +#: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 +#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 +#: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 +#: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 +#: netbox/ipam/forms/model_forms.py:771 netbox/ipam/tables/vlans.py:180 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:161 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 +#: netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:167 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:99 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/model_forms.py:185 +#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 +#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 +#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 +#: netbox/wireless/forms/model_forms.py:141 +#: netbox/wireless/tables/wirelesslan.py:75 msgid "Device" msgstr "设备" -#: dcim/forms/bulk_edit.py:740 templates/extras/dashboard/widget_config.html:7 -#: virtualization/forms/bulk_edit.py:191 +#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/templates/extras/dashboard/widget_config.html:7 +#: netbox/virtualization/forms/bulk_edit.py:191 msgid "Configuration" msgstr "配置" -#: dcim/forms/bulk_edit.py:741 netbox/navigation/menu.py:243 -#: templates/dcim/device_edit.html:78 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "虚拟化" -#: dcim/forms/bulk_edit.py:755 dcim/forms/bulk_import.py:653 -#: dcim/forms/model_forms.py:647 dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 +#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 msgid "Module type" msgstr "模块类型" -#: dcim/forms/bulk_edit.py:809 dcim/forms/bulk_edit.py:994 -#: dcim/forms/bulk_edit.py:1013 dcim/forms/bulk_edit.py:1036 -#: dcim/forms/bulk_edit.py:1078 dcim/forms/bulk_edit.py:1122 -#: dcim/forms/bulk_edit.py:1173 dcim/forms/bulk_edit.py:1200 -#: dcim/forms/bulk_edit.py:1227 dcim/forms/bulk_edit.py:1245 -#: dcim/forms/bulk_edit.py:1263 dcim/forms/filtersets.py:67 -#: dcim/forms/object_create.py:46 templates/dcim/cable.html:32 -#: templates/dcim/consoleport.html:32 templates/dcim/consoleserverport.html:32 -#: templates/dcim/devicebay.html:28 templates/dcim/frontport.html:32 -#: templates/dcim/inc/panels/inventory_items.html:19 -#: templates/dcim/interface.html:42 templates/dcim/inventoryitem.html:32 -#: templates/dcim/modulebay.html:34 templates/dcim/poweroutlet.html:32 -#: templates/dcim/powerport.html:32 templates/dcim/rearport.html:32 -#: templates/extras/customfield.html:26 templates/generic/bulk_import.html:162 +#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 +#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 +#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 +#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 +#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 +#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 +#: netbox/templates/dcim/consoleport.html:32 +#: netbox/templates/dcim/consoleserverport.html:32 +#: netbox/templates/dcim/devicebay.html:28 +#: netbox/templates/dcim/frontport.html:32 +#: netbox/templates/dcim/inc/panels/inventory_items.html:19 +#: netbox/templates/dcim/interface.html:42 +#: netbox/templates/dcim/inventoryitem.html:32 +#: netbox/templates/dcim/modulebay.html:34 +#: netbox/templates/dcim/poweroutlet.html:32 +#: netbox/templates/dcim/powerport.html:32 +#: netbox/templates/dcim/rearport.html:32 +#: netbox/templates/extras/customfield.html:26 +#: netbox/templates/generic/bulk_import.html:162 msgid "Label" msgstr "标记" -#: dcim/forms/bulk_edit.py:818 dcim/forms/filtersets.py:1068 -#: templates/dcim/cable.html:50 +#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "长度" -#: dcim/forms/bulk_edit.py:823 dcim/forms/bulk_import.py:1226 -#: dcim/forms/bulk_import.py:1229 dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 +#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 msgid "Length unit" msgstr "长度单位" -#: dcim/forms/bulk_edit.py:847 templates/dcim/virtualchassis.html:23 +#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "域" -#: dcim/forms/bulk_edit.py:915 dcim/forms/bulk_import.py:1345 -#: dcim/forms/filtersets.py:1158 dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 +#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" msgstr "电源面版" -#: dcim/forms/bulk_edit.py:937 dcim/forms/bulk_import.py:1381 -#: dcim/forms/filtersets.py:1180 templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 +#: netbox/dcim/forms/filtersets.py:1180 +#: netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "供应" -#: dcim/forms/bulk_edit.py:943 dcim/forms/bulk_import.py:1386 -#: dcim/forms/filtersets.py:1185 templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 +#: netbox/dcim/forms/filtersets.py:1185 +#: netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "相位" -#: dcim/forms/bulk_edit.py:949 dcim/forms/filtersets.py:1190 -#: templates/dcim/powerfeed.html:87 +#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "电压" -#: dcim/forms/bulk_edit.py:953 dcim/forms/filtersets.py:1194 -#: templates/dcim/powerfeed.html:91 +#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "电流" -#: dcim/forms/bulk_edit.py:957 dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 msgid "Max utilization" msgstr "最大利用率" -#: dcim/forms/bulk_edit.py:1046 +#: netbox/dcim/forms/bulk_edit.py:1051 msgid "Maximum draw" msgstr "最大功率" -#: dcim/forms/bulk_edit.py:1049 dcim/models/device_component_templates.py:282 -#: dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1054 +#: netbox/dcim/models/device_component_templates.py:282 +#: netbox/dcim/models/device_components.py:356 msgid "Maximum power draw (watts)" msgstr "最大功率(瓦)" -#: dcim/forms/bulk_edit.py:1052 +#: netbox/dcim/forms/bulk_edit.py:1057 msgid "Allocated draw" msgstr "分配功率" -#: dcim/forms/bulk_edit.py:1055 dcim/models/device_component_templates.py:289 -#: dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1060 +#: netbox/dcim/models/device_component_templates.py:289 +#: netbox/dcim/models/device_components.py:363 msgid "Allocated power draw (watts)" msgstr "分配功率(瓦)" -#: dcim/forms/bulk_edit.py:1088 dcim/forms/bulk_import.py:786 -#: dcim/forms/model_forms.py:953 dcim/forms/model_forms.py:1278 -#: dcim/forms/model_forms.py:1567 dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 +#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 +#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "电源接口" -#: dcim/forms/bulk_edit.py:1093 dcim/forms/bulk_import.py:793 +#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 msgid "Feed leg" msgstr "馈电线路" -#: dcim/forms/bulk_edit.py:1139 dcim/forms/bulk_edit.py:1457 +#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 msgid "Management only" msgstr "仅限管理" -#: dcim/forms/bulk_edit.py:1149 dcim/forms/bulk_edit.py:1463 -#: dcim/forms/bulk_import.py:876 dcim/forms/filtersets.py:1394 -#: dcim/forms/object_import.py:90 -#: dcim/models/device_component_templates.py:437 -#: dcim/models/device_components.py:670 +#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/object_import.py:90 +#: netbox/dcim/models/device_component_templates.py:437 +#: netbox/dcim/models/device_components.py:670 msgid "PoE mode" msgstr "PoE模式" -#: dcim/forms/bulk_edit.py:1155 dcim/forms/bulk_edit.py:1469 -#: dcim/forms/bulk_import.py:882 dcim/forms/filtersets.py:1399 -#: dcim/forms/object_import.py:95 -#: dcim/models/device_component_templates.py:443 -#: dcim/models/device_components.py:676 +#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 +#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/object_import.py:95 +#: netbox/dcim/models/device_component_templates.py:443 +#: netbox/dcim/models/device_components.py:676 msgid "PoE type" msgstr "PoE类型" -#: dcim/forms/bulk_edit.py:1161 dcim/forms/filtersets.py:1404 -#: dcim/forms/object_import.py:100 +#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "无线角色" -#: dcim/forms/bulk_edit.py:1298 dcim/forms/model_forms.py:669 -#: dcim/forms/model_forms.py:1223 dcim/tables/devices.py:313 -#: templates/dcim/consoleport.html:24 templates/dcim/consoleserverport.html:24 -#: templates/dcim/frontport.html:24 templates/dcim/interface.html:34 -#: templates/dcim/module.html:54 templates/dcim/modulebay.html:26 -#: templates/dcim/modulebay.html:58 templates/dcim/poweroutlet.html:24 -#: templates/dcim/powerport.html:24 templates/dcim/rearport.html:24 +#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 +#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/templates/dcim/consoleport.html:24 +#: netbox/templates/dcim/consoleserverport.html:24 +#: netbox/templates/dcim/frontport.html:24 +#: netbox/templates/dcim/interface.html:34 +#: netbox/templates/dcim/module.html:54 +#: netbox/templates/dcim/modulebay.html:26 +#: netbox/templates/dcim/modulebay.html:58 +#: netbox/templates/dcim/poweroutlet.html:24 +#: netbox/templates/dcim/powerport.html:24 +#: netbox/templates/dcim/rearport.html:24 msgid "Module" msgstr "模块" -#: dcim/forms/bulk_edit.py:1437 dcim/tables/devices.py:665 -#: templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 +#: netbox/templates/dcim/interface.html:110 msgid "LAG" msgstr "链路聚合" -#: dcim/forms/bulk_edit.py:1442 dcim/forms/model_forms.py:1305 +#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 msgid "Virtual device contexts" msgstr "设备虚拟上下文" -#: dcim/forms/bulk_edit.py:1448 dcim/forms/bulk_import.py:714 -#: dcim/forms/bulk_import.py:740 dcim/forms/filtersets.py:1252 -#: dcim/forms/filtersets.py:1277 dcim/forms/filtersets.py:1358 -#: dcim/tables/devices.py:610 -#: templates/circuits/inc/circuit_termination_fields.html:67 -#: templates/dcim/consoleport.html:40 templates/dcim/consoleserverport.html:40 +#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 +#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 +#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 +#: netbox/dcim/tables/devices.py:610 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/templates/dcim/consoleport.html:40 +#: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "速率" -#: dcim/forms/bulk_edit.py:1477 dcim/forms/bulk_import.py:885 -#: templates/vpn/ikepolicy.html:25 templates/vpn/ipsecprofile.html:21 -#: templates/vpn/ipsecprofile.html:48 virtualization/forms/bulk_edit.py:233 -#: virtualization/forms/bulk_import.py:165 vpn/forms/bulk_edit.py:146 -#: vpn/forms/bulk_edit.py:232 vpn/forms/bulk_import.py:176 -#: vpn/forms/bulk_import.py:234 vpn/forms/filtersets.py:135 -#: vpn/forms/filtersets.py:178 vpn/forms/filtersets.py:192 -#: vpn/tables/crypto.py:64 vpn/tables/crypto.py:162 +#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/templates/vpn/ikepolicy.html:25 +#: netbox/templates/vpn/ipsecprofile.html:21 +#: netbox/templates/vpn/ipsecprofile.html:48 +#: netbox/virtualization/forms/bulk_edit.py:233 +#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 +#: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 +#: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 +#: netbox/vpn/forms/filtersets.py:192 netbox/vpn/tables/crypto.py:64 +#: netbox/vpn/tables/crypto.py:162 msgid "Mode" msgstr "模式" -#: dcim/forms/bulk_edit.py:1485 dcim/forms/model_forms.py:1354 -#: ipam/forms/bulk_import.py:178 ipam/forms/filtersets.py:498 -#: ipam/models/vlans.py:84 virtualization/forms/bulk_edit.py:240 -#: virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 +#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 +#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 +#: netbox/virtualization/forms/model_forms.py:321 msgid "VLAN group" msgstr "VLAN 组" -#: dcim/forms/bulk_edit.py:1494 dcim/forms/model_forms.py:1360 -#: dcim/tables/devices.py:579 virtualization/forms/bulk_edit.py:248 -#: virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 +#: netbox/dcim/tables/devices.py:579 +#: netbox/virtualization/forms/bulk_edit.py:248 +#: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" msgstr "未标记的VLAN" -#: dcim/forms/bulk_edit.py:1503 dcim/forms/model_forms.py:1369 -#: dcim/tables/devices.py:585 virtualization/forms/bulk_edit.py:256 -#: virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 +#: netbox/dcim/tables/devices.py:585 +#: netbox/virtualization/forms/bulk_edit.py:256 +#: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" msgstr "已标记 VLANs" -#: dcim/forms/bulk_edit.py:1506 +#: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1515 +#: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" msgstr "" -#: dcim/forms/bulk_edit.py:1531 dcim/forms/model_forms.py:1341 +#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" msgstr "无线局域网组" -#: dcim/forms/bulk_edit.py:1536 dcim/forms/model_forms.py:1346 -#: dcim/tables/devices.py:619 netbox/navigation/menu.py:146 -#: templates/dcim/interface.html:280 wireless/tables/wirelesslan.py:24 +#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 +#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 +#: netbox/templates/dcim/interface.html:280 +#: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "无线局域网" -#: dcim/forms/bulk_edit.py:1545 dcim/forms/filtersets.py:1328 -#: dcim/forms/model_forms.py:1390 ipam/forms/bulk_edit.py:286 -#: ipam/forms/bulk_edit.py:378 ipam/forms/filtersets.py:169 -#: templates/dcim/interface.html:122 templates/ipam/prefix.html:95 -#: virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 +#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 +#: netbox/templates/dcim/interface.html:122 +#: netbox/templates/ipam/prefix.html:95 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Addressing" msgstr "寻址" -#: dcim/forms/bulk_edit.py:1546 dcim/forms/filtersets.py:720 -#: dcim/forms/model_forms.py:1391 virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 +#: netbox/dcim/forms/model_forms.py:1398 +#: netbox/virtualization/forms/model_forms.py:350 msgid "Operation" msgstr "操作" -#: dcim/forms/bulk_edit.py:1547 dcim/forms/filtersets.py:1329 -#: dcim/forms/model_forms.py:987 dcim/forms/model_forms.py:1393 +#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 +#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 msgid "PoE" msgstr "PoE" -#: dcim/forms/bulk_edit.py:1548 dcim/forms/model_forms.py:1392 -#: templates/dcim/interface.html:99 virtualization/forms/bulk_edit.py:267 -#: virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 +#: netbox/templates/dcim/interface.html:99 +#: netbox/virtualization/forms/bulk_edit.py:267 +#: netbox/virtualization/forms/model_forms.py:351 msgid "Related Interfaces" msgstr "相关接口" -#: dcim/forms/bulk_edit.py:1549 dcim/forms/model_forms.py:1394 -#: virtualization/forms/bulk_edit.py:268 -#: virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/bulk_edit.py:268 +#: netbox/virtualization/forms/model_forms.py:352 msgid "802.1Q Switching" msgstr "802.1Q 交换" -#: dcim/forms/bulk_edit.py:1553 +#: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" msgstr "" -#: dcim/forms/bulk_edit.py:1612 dcim/forms/bulk_edit.py:1614 +#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" msgstr "该接口模式下,必须指定VLAN" -#: dcim/forms/bulk_edit.py:1619 dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "access接口不允许指定Tag的VLAN" -#: dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" msgstr "上一级区域的名称" -#: dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:78 msgid "Name of parent site group" msgstr "上一级站点组的名称" -#: dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:97 msgid "Assigned region" msgstr "指定地区" -#: dcim/forms/bulk_import.py:104 tenancy/forms/bulk_import.py:44 -#: tenancy/forms/bulk_import.py:85 wireless/forms/bulk_import.py:40 +#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/tenancy/forms/bulk_import.py:85 +#: netbox/wireless/forms/bulk_import.py:40 msgid "Assigned group" msgstr "指定组" -#: dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:123 msgid "available options" msgstr "可用选项" -#: dcim/forms/bulk_import.py:134 dcim/forms/bulk_import.py:543 -#: dcim/forms/bulk_import.py:1342 ipam/forms/bulk_import.py:175 -#: ipam/forms/bulk_import.py:433 virtualization/forms/bulk_import.py:63 -#: virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 +#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 +#: netbox/ipam/forms/bulk_import.py:457 +#: netbox/virtualization/forms/bulk_import.py:63 +#: netbox/virtualization/forms/bulk_import.py:89 msgid "Assigned site" msgstr "指定站点" -#: dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:141 msgid "Parent location" msgstr "上一级位置" -#: dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Location not found." msgstr "未找到该位置" -#: dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" msgstr "这种机架类型的制造商" -#: dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" msgstr "机架中编号最低的位置" -#: dcim/forms/bulk_import.py:201 dcim/forms/bulk_import.py:268 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" msgstr "设备安装宽度(英寸)" -#: dcim/forms/bulk_import.py:207 dcim/forms/bulk_import.py:274 +#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 msgid "Unit for outer dimensions" msgstr "外形尺寸单位" -#: dcim/forms/bulk_import.py:213 dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" msgstr "机柜重量单位" -#: dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" msgstr "指定租户名称" -#: dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:257 msgid "Name of assigned role" msgstr "指定规则名称" -#: dcim/forms/bulk_import.py:280 dcim/forms/bulk_import.py:413 -#: dcim/forms/bulk_import.py:583 +#: netbox/dcim/forms/bulk_import.py:264 +msgid "Rack type model" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 +#: netbox/dcim/forms/bulk_import.py:605 msgid "Airflow direction" msgstr "风道方向" -#: dcim/forms/bulk_import.py:312 +#: netbox/dcim/forms/bulk_import.py:324 +msgid "Width must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:326 +msgid "U height must be set if not specifying a rack type." +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" msgstr "上一级站点" -#: dcim/forms/bulk_import.py:319 dcim/forms/bulk_import.py:1355 +#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 msgid "Rack's location (if any)" msgstr "机柜所在位置(如果有)" -#: dcim/forms/bulk_import.py:328 dcim/forms/model_forms.py:311 -#: dcim/tables/racks.py:222 templates/dcim/rackreservation.html:12 -#: templates/dcim/rackreservation.html:45 +#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 +#: netbox/dcim/tables/racks.py:222 +#: netbox/templates/dcim/rackreservation.html:12 +#: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "单元(U)" -#: dcim/forms/bulk_import.py:331 +#: netbox/dcim/forms/bulk_import.py:353 msgid "Comma-separated list of individual unit numbers" msgstr "占用U位号列表,以逗号分隔" -#: dcim/forms/bulk_import.py:374 +#: netbox/dcim/forms/bulk_import.py:396 msgid "The manufacturer which produces this device type" msgstr "生产这种类型设备的制造商" -#: dcim/forms/bulk_import.py:381 +#: netbox/dcim/forms/bulk_import.py:403 msgid "The default platform for devices of this type (optional)" msgstr "此类型设备的默认平台(可选)" -#: dcim/forms/bulk_import.py:386 +#: netbox/dcim/forms/bulk_import.py:408 msgid "Device weight" msgstr "设备重量" -#: dcim/forms/bulk_import.py:392 +#: netbox/dcim/forms/bulk_import.py:414 msgid "Unit for device weight" msgstr "设备重量单位" -#: dcim/forms/bulk_import.py:418 +#: netbox/dcim/forms/bulk_import.py:440 msgid "Module weight" msgstr "模块重量" -#: dcim/forms/bulk_import.py:424 +#: netbox/dcim/forms/bulk_import.py:446 msgid "Unit for module weight" msgstr "模块重量单位" -#: dcim/forms/bulk_import.py:454 +#: netbox/dcim/forms/bulk_import.py:476 msgid "Limit platform assignments to this manufacturer" msgstr "限定此系统平台的制造商" -#: dcim/forms/bulk_import.py:476 dcim/forms/bulk_import.py:1425 -#: tenancy/forms/bulk_import.py:106 +#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "指定规则" -#: dcim/forms/bulk_import.py:489 +#: netbox/dcim/forms/bulk_import.py:511 msgid "Device type manufacturer" msgstr "设备制造商" -#: dcim/forms/bulk_import.py:495 +#: netbox/dcim/forms/bulk_import.py:517 msgid "Device type model" msgstr "设备型号" -#: dcim/forms/bulk_import.py:502 virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:524 +#: netbox/virtualization/forms/bulk_import.py:126 msgid "Assigned platform" msgstr "指定系统平台" -#: dcim/forms/bulk_import.py:510 dcim/forms/bulk_import.py:514 -#: dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 +#: netbox/dcim/forms/model_forms.py:536 msgid "Virtual chassis" msgstr "堆叠" -#: dcim/forms/bulk_import.py:521 +#: netbox/dcim/forms/bulk_import.py:543 msgid "Virtualization cluster" msgstr "虚拟化集群" -#: dcim/forms/bulk_import.py:550 +#: netbox/dcim/forms/bulk_import.py:572 msgid "Assigned location (if any)" msgstr "指定位置(如果有)" -#: dcim/forms/bulk_import.py:557 +#: netbox/dcim/forms/bulk_import.py:579 msgid "Assigned rack (if any)" msgstr "指定机柜(如果有)" -#: dcim/forms/bulk_import.py:560 +#: netbox/dcim/forms/bulk_import.py:582 msgid "Face" msgstr "朝向" -#: dcim/forms/bulk_import.py:563 +#: netbox/dcim/forms/bulk_import.py:585 msgid "Mounted rack face" msgstr "机架正面安装" -#: dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:592 msgid "Parent device (for child devices)" msgstr "上一级设备(用于子设备)" -#: dcim/forms/bulk_import.py:573 +#: netbox/dcim/forms/bulk_import.py:595 msgid "Device bay" msgstr "设备托架" -#: dcim/forms/bulk_import.py:577 +#: netbox/dcim/forms/bulk_import.py:599 msgid "Device bay in which this device is installed (for child devices)" msgstr "安装此设备的设备托架(用于子设备)" -#: dcim/forms/bulk_import.py:644 +#: netbox/dcim/forms/bulk_import.py:666 msgid "The device in which this module is installed" msgstr "安装此模块的设备" -#: dcim/forms/bulk_import.py:647 dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 msgid "Module bay" msgstr "设备板卡插槽" -#: dcim/forms/bulk_import.py:650 +#: netbox/dcim/forms/bulk_import.py:672 msgid "The module bay in which this module is installed" msgstr "安装此模块的模块托架" -#: dcim/forms/bulk_import.py:656 +#: netbox/dcim/forms/bulk_import.py:678 msgid "The type of module" msgstr "模块类型" -#: dcim/forms/bulk_import.py:664 dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 msgid "Replicate components" msgstr "组件冗余" -#: dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:688 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" msgstr "自动填充此模块类型关联的组件(默认启用)" -#: dcim/forms/bulk_import.py:669 dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 msgid "Adopt components" msgstr "选定组件" -#: dcim/forms/bulk_import.py:671 dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 msgid "Adopt already existing components" msgstr "选定已经存在的组件" -#: dcim/forms/bulk_import.py:711 dcim/forms/bulk_import.py:737 -#: dcim/forms/bulk_import.py:763 +#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 +#: netbox/dcim/forms/bulk_import.py:785 msgid "Port type" msgstr "端口类型" -#: dcim/forms/bulk_import.py:719 dcim/forms/bulk_import.py:745 +#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 msgid "Port speed in bps" msgstr "端口速率(bps)" -#: dcim/forms/bulk_import.py:783 +#: netbox/dcim/forms/bulk_import.py:805 msgid "Outlet type" msgstr "插座类型" -#: dcim/forms/bulk_import.py:790 +#: netbox/dcim/forms/bulk_import.py:812 msgid "Local power port which feeds this outlet" msgstr "该插座供电的电源端口" -#: dcim/forms/bulk_import.py:796 +#: netbox/dcim/forms/bulk_import.py:818 msgid "Electrical phase (for three-phase circuits)" msgstr "供电相位(用于三相电)" -#: dcim/forms/bulk_import.py:837 dcim/forms/model_forms.py:1316 -#: virtualization/forms/bulk_import.py:155 -#: virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 +#: netbox/virtualization/forms/bulk_import.py:155 +#: netbox/virtualization/forms/model_forms.py:305 msgid "Parent interface" msgstr "上一级接口" -#: dcim/forms/bulk_import.py:844 dcim/forms/model_forms.py:1324 -#: virtualization/forms/bulk_import.py:162 -#: virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 +#: netbox/virtualization/forms/bulk_import.py:162 +#: netbox/virtualization/forms/model_forms.py:313 msgid "Bridged interface" msgstr "桥接接口" -#: dcim/forms/bulk_import.py:847 +#: netbox/dcim/forms/bulk_import.py:869 msgid "Lag" msgstr "聚合接口" -#: dcim/forms/bulk_import.py:851 +#: netbox/dcim/forms/bulk_import.py:873 msgid "Parent LAG interface" msgstr "上一级聚合接口" -#: dcim/forms/bulk_import.py:854 +#: netbox/dcim/forms/bulk_import.py:876 msgid "Vdcs" msgstr "Vdcs" -#: dcim/forms/bulk_import.py:859 +#: netbox/dcim/forms/bulk_import.py:881 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "VDC名称,用逗号分隔,用双引号包含。例如:" -#: dcim/forms/bulk_import.py:865 +#: netbox/dcim/forms/bulk_import.py:887 msgid "Physical medium" msgstr "物理接口类型" -#: dcim/forms/bulk_import.py:868 dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 msgid "Duplex" msgstr "双工" -#: dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Poe mode" msgstr "POE模式" -#: dcim/forms/bulk_import.py:879 +#: netbox/dcim/forms/bulk_import.py:901 msgid "Poe type" msgstr "POE类型" -#: dcim/forms/bulk_import.py:888 virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:910 +#: netbox/virtualization/forms/bulk_import.py:168 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "IEEE 802.1Q 运作模式(针对二层接口)" -#: dcim/forms/bulk_import.py:895 ipam/forms/bulk_import.py:161 -#: ipam/forms/bulk_import.py:247 ipam/forms/bulk_import.py:283 -#: ipam/forms/filtersets.py:201 ipam/forms/filtersets.py:277 -#: ipam/forms/filtersets.py:336 virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 +#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 +#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 +#: netbox/ipam/forms/filtersets.py:336 +#: netbox/virtualization/forms/bulk_import.py:175 msgid "Assigned VRF" msgstr "指定VRF" -#: dcim/forms/bulk_import.py:898 +#: netbox/dcim/forms/bulk_import.py:920 msgid "Rf role" msgstr "射频类型" -#: dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:923 msgid "Wireless role (AP/station)" msgstr "无线角色(AP/基站)" -#: dcim/forms/bulk_import.py:937 +#: netbox/dcim/forms/bulk_import.py:959 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "VDC {vdc} 没有指定给设备 {device}" -#: dcim/forms/bulk_import.py:951 dcim/forms/model_forms.py:1000 -#: dcim/forms/model_forms.py:1575 dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 +#: netbox/dcim/forms/model_forms.py:1582 +#: netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "后置端口" -#: dcim/forms/bulk_import.py:954 +#: netbox/dcim/forms/bulk_import.py:976 msgid "Corresponding rear port" msgstr "对应后置端口" -#: dcim/forms/bulk_import.py:959 dcim/forms/bulk_import.py:1000 -#: dcim/forms/bulk_import.py:1216 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 +#: netbox/dcim/forms/bulk_import.py:1238 msgid "Physical medium classification" msgstr "物理端口类型" -#: dcim/forms/bulk_import.py:1028 dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 msgid "Installed device" msgstr "安装设备" -#: dcim/forms/bulk_import.py:1032 +#: netbox/dcim/forms/bulk_import.py:1054 msgid "Child device installed within this bay" msgstr "此托架内安装的子设备" -#: dcim/forms/bulk_import.py:1034 +#: netbox/dcim/forms/bulk_import.py:1056 msgid "Child device not found." msgstr "子设备未找到" -#: dcim/forms/bulk_import.py:1092 +#: netbox/dcim/forms/bulk_import.py:1114 msgid "Parent inventory item" msgstr "上一级库存项" -#: dcim/forms/bulk_import.py:1095 +#: netbox/dcim/forms/bulk_import.py:1117 msgid "Component type" msgstr "组件类型" -#: dcim/forms/bulk_import.py:1099 +#: netbox/dcim/forms/bulk_import.py:1121 msgid "Component Type" msgstr "组件类型" -#: dcim/forms/bulk_import.py:1102 +#: netbox/dcim/forms/bulk_import.py:1124 msgid "Compnent name" msgstr "组件名称" -#: dcim/forms/bulk_import.py:1104 +#: netbox/dcim/forms/bulk_import.py:1126 msgid "Component Name" msgstr "组件名称" -#: dcim/forms/bulk_import.py:1146 +#: netbox/dcim/forms/bulk_import.py:1168 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "组件未找到: {device} - {component_name}" -#: dcim/forms/bulk_import.py:1171 +#: netbox/dcim/forms/bulk_import.py:1193 msgid "Side A device" msgstr "A端设备" -#: dcim/forms/bulk_import.py:1174 dcim/forms/bulk_import.py:1192 +#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 msgid "Device name" msgstr "设备名字" -#: dcim/forms/bulk_import.py:1177 +#: netbox/dcim/forms/bulk_import.py:1199 msgid "Side A type" msgstr "A端线缆类型" -#: dcim/forms/bulk_import.py:1180 dcim/forms/bulk_import.py:1198 +#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 msgid "Termination type" msgstr "线缆接口类型" -#: dcim/forms/bulk_import.py:1183 +#: netbox/dcim/forms/bulk_import.py:1205 msgid "Side A name" msgstr "A端设备名称" -#: dcim/forms/bulk_import.py:1184 dcim/forms/bulk_import.py:1202 +#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 msgid "Termination name" msgstr "线缆类型名称" -#: dcim/forms/bulk_import.py:1189 +#: netbox/dcim/forms/bulk_import.py:1211 msgid "Side B device" msgstr "B端设备" -#: dcim/forms/bulk_import.py:1195 +#: netbox/dcim/forms/bulk_import.py:1217 msgid "Side B type" msgstr "B端线缆类型" -#: dcim/forms/bulk_import.py:1201 +#: netbox/dcim/forms/bulk_import.py:1223 msgid "Side B name" msgstr "B端设备名称" -#: dcim/forms/bulk_import.py:1210 wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1232 +#: netbox/wireless/forms/bulk_import.py:86 msgid "Connection status" msgstr "连接状态" -#: dcim/forms/bulk_import.py:1262 +#: netbox/dcim/forms/bulk_import.py:1284 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr " {side_upper}端: {device} {termination_object}已连接" -#: dcim/forms/bulk_import.py:1268 +#: netbox/dcim/forms/bulk_import.py:1290 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "{side_upper} 端接口类型未发现: {device} {name}" -#: dcim/forms/bulk_import.py:1293 dcim/forms/model_forms.py:785 -#: dcim/tables/devices.py:1027 templates/dcim/device.html:132 -#: templates/dcim/virtualchassis.html:27 templates/dcim/virtualchassis.html:67 +#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 +#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/templates/dcim/virtualchassis.html:27 +#: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "Master" -#: dcim/forms/bulk_import.py:1297 +#: netbox/dcim/forms/bulk_import.py:1319 msgid "Master device" msgstr "主设备" -#: dcim/forms/bulk_import.py:1314 +#: netbox/dcim/forms/bulk_import.py:1336 msgid "Name of parent site" msgstr "父站点名称" -#: dcim/forms/bulk_import.py:1348 +#: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" msgstr "上一级电源面板" -#: dcim/forms/bulk_import.py:1378 +#: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" msgstr "主线路/备用线路" -#: dcim/forms/bulk_import.py:1383 +#: netbox/dcim/forms/bulk_import.py:1405 msgid "Supply type (AC/DC)" msgstr "供应类型(AC/DC)" -#: dcim/forms/bulk_import.py:1388 +#: netbox/dcim/forms/bulk_import.py:1410 msgid "Single or three-phase" msgstr "单相或三相" -#: dcim/forms/bulk_import.py:1439 dcim/forms/model_forms.py:1670 -#: templates/dcim/device.html:190 templates/dcim/virtualdevicecontext.html:30 -#: templates/virtualization/virtualmachine.html:52 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/templates/dcim/device.html:190 +#: netbox/templates/dcim/virtualdevicecontext.html:30 +#: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "主 IPv4" -#: dcim/forms/bulk_import.py:1443 +#: netbox/dcim/forms/bulk_import.py:1465 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "带掩码的 IPv4 地址,例如 1.2.3.4/24" -#: dcim/forms/bulk_import.py:1446 dcim/forms/model_forms.py:1679 -#: templates/dcim/device.html:206 templates/dcim/virtualdevicecontext.html:41 -#: templates/virtualization/virtualmachine.html:68 +#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/templates/dcim/device.html:206 +#: netbox/templates/dcim/virtualdevicecontext.html:41 +#: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "主 IPv6" -#: dcim/forms/bulk_import.py:1450 +#: netbox/dcim/forms/bulk_import.py:1472 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "带有前缀长度的 IPv6 地址,例如 2001:db8:: 1/64" -#: dcim/forms/common.py:24 dcim/models/device_components.py:527 -#: templates/dcim/interface.html:57 -#: templates/virtualization/vminterface.html:55 -#: virtualization/forms/bulk_edit.py:225 +#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/templates/dcim/interface.html:57 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/bulk_edit.py:225 msgid "MTU" msgstr "MTU" -#: dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:65 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" msgstr "标记的VLAN ({vlans}) 必须与接口所属设备/虚拟机属于同一站点,或者是全局VLAN" -#: dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:126 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." msgstr "无法在未定义位置的模块托架中安装具有占位符值的模块。" -#: dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:131 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " "in tree but {tokens} placeholders given." msgstr "无法在模块月桂树中安装具有占位符值的模块 {level} 在树里但是 {tokens} 给定的占位符。" -#: dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:144 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "无法选定 {model} {name} ,因为它已属于某个模块" -#: dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:153 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "名为 {name} 的 {model} 已存在" -#: dcim/forms/connections.py:49 dcim/forms/model_forms.py:738 -#: dcim/tables/power.py:66 templates/dcim/inc/cable_termination.html:37 -#: templates/dcim/powerfeed.html:24 templates/dcim/powerpanel.html:19 -#: templates/dcim/trace/powerpanel.html:4 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/tables/power.py:66 +#: netbox/templates/dcim/inc/cable_termination.html:37 +#: netbox/templates/dcim/powerfeed.html:24 +#: netbox/templates/dcim/powerpanel.html:19 +#: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" msgstr "电源面板" -#: dcim/forms/connections.py:58 dcim/forms/model_forms.py:765 -#: templates/dcim/powerfeed.html:21 templates/dcim/powerport.html:80 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/templates/dcim/powerfeed.html:21 +#: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "电力供给" -#: dcim/forms/connections.py:81 +#: netbox/dcim/forms/connections.py:81 msgid "Side" msgstr "端" -#: dcim/forms/filtersets.py:136 dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 msgid "Device Status" msgstr "设备状态" -#: dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:149 msgid "Parent region" msgstr "上一级地区" -#: dcim/forms/filtersets.py:163 tenancy/forms/bulk_import.py:28 -#: tenancy/forms/bulk_import.py:62 tenancy/forms/filtersets.py:33 -#: tenancy/forms/filtersets.py:62 wireless/forms/bulk_import.py:25 -#: wireless/forms/filtersets.py:25 +#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/tenancy/forms/bulk_import.py:62 +#: netbox/tenancy/forms/filtersets.py:33 netbox/tenancy/forms/filtersets.py:62 +#: netbox/wireless/forms/bulk_import.py:25 +#: netbox/wireless/forms/filtersets.py:25 msgid "Parent group" msgstr "上一级组" -#: dcim/forms/filtersets.py:242 templates/dcim/location.html:58 -#: templates/dcim/site.html:56 +#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "设施" -#: dcim/forms/filtersets.py:380 -msgid "Rack type" -msgstr "机柜类型" - -#: dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:397 msgid "Function" msgstr "功能用途" -#: dcim/forms/filtersets.py:483 dcim/forms/model_forms.py:373 -#: templates/inc/panels/image_attachments.html:6 +#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "图片" -#: dcim/forms/filtersets.py:486 dcim/forms/filtersets.py:611 -#: dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 +#: netbox/dcim/forms/filtersets.py:726 msgid "Components" msgstr "组件" -#: dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:506 msgid "Subdevice role" msgstr "子设备角色" -#: dcim/forms/filtersets.py:790 dcim/tables/racks.py:54 -#: templates/dcim/racktype.html:20 +#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "型号" -#: dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:834 msgid "Has an OOB IP" msgstr "有带外管理IP" -#: dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:841 msgid "Virtual chassis member" msgstr "堆叠数量" -#: dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:890 msgid "Has virtual device contexts" msgstr "有虚拟设备上下文" -#: dcim/forms/filtersets.py:903 extras/filtersets.py:585 -#: ipam/forms/filtersets.py:452 virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:452 +#: netbox/virtualization/forms/filtersets.py:112 msgid "Cluster group" msgstr "堆叠组" -#: dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1210 msgid "Cabled" msgstr "已连接" -#: dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1217 msgid "Occupied" msgstr "已占用" -#: dcim/forms/filtersets.py:1244 dcim/forms/filtersets.py:1269 -#: dcim/forms/filtersets.py:1293 dcim/forms/filtersets.py:1313 -#: dcim/forms/filtersets.py:1336 dcim/tables/devices.py:364 -#: templates/dcim/consoleport.html:55 templates/dcim/consoleserverport.html:55 -#: templates/dcim/frontport.html:69 templates/dcim/interface.html:140 -#: templates/dcim/powerfeed.html:110 templates/dcim/poweroutlet.html:59 -#: templates/dcim/powerport.html:59 templates/dcim/rearport.html:65 +#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 +#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/templates/dcim/consoleport.html:55 +#: netbox/templates/dcim/consoleserverport.html:55 +#: netbox/templates/dcim/frontport.html:69 +#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/powerfeed.html:110 +#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/powerport.html:59 +#: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "连接" -#: dcim/forms/filtersets.py:1348 extras/forms/bulk_edit.py:326 -#: extras/forms/bulk_import.py:247 extras/forms/filtersets.py:464 -#: extras/forms/model_forms.py:675 extras/tables/tables.py:579 -#: templates/extras/journalentry.html:30 +#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/extras/forms/bulk_import.py:247 +#: netbox/extras/forms/filtersets.py:464 +#: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 +#: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "类型" -#: dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1377 msgid "Mgmt only" msgstr "仅用于管理" -#: dcim/forms/filtersets.py:1389 dcim/forms/model_forms.py:1383 -#: dcim/models/device_components.py:629 templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 +#: netbox/dcim/models/device_components.py:629 +#: netbox/templates/dcim/interface.html:129 msgid "WWN" msgstr "WWN" -#: dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1409 msgid "Wireless channel" msgstr "无线信道" -#: dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1413 msgid "Channel frequency (MHz)" msgstr "信道频率(MHz)" -#: dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1417 msgid "Channel width (MHz)" msgstr "信道频宽(MHz)" -#: dcim/forms/filtersets.py:1421 templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1421 +#: netbox/templates/dcim/interface.html:85 msgid "Transmit power (dBm)" msgstr "信道功率(dBm)" -#: dcim/forms/filtersets.py:1446 dcim/forms/filtersets.py:1471 -#: dcim/tables/devices.py:327 templates/dcim/cable.html:12 -#: templates/dcim/cable_trace.html:46 templates/dcim/frontport.html:77 -#: templates/dcim/htmx/cable_edit.html:50 -#: templates/dcim/inc/connection_endpoints.html:4 -#: templates/dcim/rearport.html:73 templates/dcim/trace/cable.html:7 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 +#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/templates/dcim/cable_trace.html:46 +#: netbox/templates/dcim/frontport.html:77 +#: netbox/templates/dcim/htmx/cable_edit.html:50 +#: netbox/templates/dcim/inc/connection_endpoints.html:4 +#: netbox/templates/dcim/rearport.html:73 +#: netbox/templates/dcim/trace/cable.html:7 msgid "Cable" msgstr "电缆" -#: dcim/forms/filtersets.py:1550 dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 msgid "Discovered" msgstr "已发现" -#: dcim/forms/formsets.py:20 +#: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "在 {vc_position}中已存在虚拟机箱成员。" -#: dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/model_forms.py:140 msgid "Contact Info" msgstr "联系方式" -#: dcim/forms/model_forms.py:195 templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "机柜角色" -#: dcim/forms/model_forms.py:212 dcim/forms/model_forms.py:362 -#: dcim/forms/model_forms.py:446 utilities/forms/fields/fields.py:47 +#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 +#: netbox/dcim/forms/model_forms.py:446 +#: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "缩写" -#: dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "选择预定义的机架类型,或在下面设置物理特征。" -#: dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:265 msgid "Inventory Control" msgstr "库存管理" -#: dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:313 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." msgstr "以逗号分隔的数字U位 列表。 可以使用-字符指定范围。" -#: dcim/forms/model_forms.py:322 dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 msgid "Reservation" msgstr "预留" -#: dcim/forms/model_forms.py:423 templates/dcim/devicerole.html:23 +#: netbox/dcim/forms/model_forms.py:423 +#: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "设备角色" -#: dcim/forms/model_forms.py:490 dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 msgid "The lowest-numbered unit occupied by the device" msgstr "设备在机柜上最下面的U位" -#: dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:547 msgid "The position in the virtual chassis this device is identified by" msgstr "该设备在虚拟机箱中的位置由以下方式标识" -#: dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:552 msgid "The priority of the device in the virtual chassis" msgstr "堆叠中设备的优先级" -#: dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:659 msgid "Automatically populate components associated with this module type" msgstr "自动填充与此模块类型关联的组件" -#: dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:767 msgid "Characteristics" msgstr "特性" -#: dcim/forms/model_forms.py:1087 +#: netbox/dcim/forms/model_forms.py:914 +#, python-brace-format +msgid "" +"Alphanumeric ranges are supported for bulk creation. Mixed cases and types " +"within a single range are not supported (example: " +"[ge,xe]-0/0/[0-9]). The token {module}, if " +"present, will be automatically replaced with the position value when " +"creating a new module." +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" msgstr "控制台端口模板" -#: dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1102 msgid "Console server port template" msgstr "控制口模版" -#: dcim/forms/model_forms.py:1103 +#: netbox/dcim/forms/model_forms.py:1110 msgid "Front port template" msgstr "前向端口模版" -#: dcim/forms/model_forms.py:1111 +#: netbox/dcim/forms/model_forms.py:1118 msgid "Interface template" msgstr "接口模版" -#: dcim/forms/model_forms.py:1119 +#: netbox/dcim/forms/model_forms.py:1126 msgid "Power outlet template" msgstr "电源插座模版" -#: dcim/forms/model_forms.py:1127 +#: netbox/dcim/forms/model_forms.py:1134 msgid "Power port template" msgstr "电源接口模版" -#: dcim/forms/model_forms.py:1135 +#: netbox/dcim/forms/model_forms.py:1142 msgid "Rear port template" msgstr "后置接口模版" -#: dcim/forms/model_forms.py:1144 dcim/forms/model_forms.py:1388 -#: dcim/forms/model_forms.py:1551 dcim/forms/model_forms.py:1583 -#: dcim/tables/connections.py:65 ipam/forms/bulk_import.py:318 -#: ipam/forms/model_forms.py:280 ipam/forms/model_forms.py:289 -#: ipam/tables/fhrp.py:64 ipam/tables/ip.py:372 ipam/tables/vlans.py:169 -#: templates/circuits/inc/circuit_termination_fields.html:51 -#: templates/dcim/frontport.html:106 templates/dcim/interface.html:27 -#: templates/dcim/interface.html:184 templates/dcim/interface.html:310 -#: templates/dcim/rearport.html:102 -#: templates/virtualization/vminterface.html:18 -#: templates/vpn/tunneltermination.html:31 -#: templates/wireless/inc/wirelesslink_interface.html:10 -#: templates/wireless/wirelesslink.html:10 -#: templates/wireless/wirelesslink.html:55 -#: virtualization/forms/model_forms.py:348 vpn/forms/bulk_import.py:297 -#: vpn/forms/model_forms.py:436 vpn/forms/model_forms.py:445 -#: wireless/forms/model_forms.py:113 wireless/forms/model_forms.py:155 +#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 +#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 +#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 +#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 +#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 +#: netbox/ipam/tables/vlans.py:169 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:184 +#: netbox/templates/dcim/interface.html:310 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:348 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 +#: netbox/vpn/forms/model_forms.py:445 +#: netbox/wireless/forms/model_forms.py:113 +#: netbox/wireless/forms/model_forms.py:155 msgid "Interface" msgstr "接口" -#: dcim/forms/model_forms.py:1145 dcim/forms/model_forms.py:1584 -#: dcim/tables/connections.py:27 templates/dcim/consoleport.html:17 -#: templates/dcim/consoleserverport.html:74 templates/dcim/frontport.html:112 +#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/tables/connections.py:27 +#: netbox/templates/dcim/consoleport.html:17 +#: netbox/templates/dcim/consoleserverport.html:74 +#: netbox/templates/dcim/frontport.html:112 msgid "Console Port" msgstr "Console 端口" -#: dcim/forms/model_forms.py:1146 dcim/forms/model_forms.py:1585 -#: templates/dcim/consoleport.html:73 templates/dcim/consoleserverport.html:17 -#: templates/dcim/frontport.html:109 +#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/templates/dcim/consoleport.html:73 +#: netbox/templates/dcim/consoleserverport.html:17 +#: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "Console 服务器端口" -#: dcim/forms/model_forms.py:1147 dcim/forms/model_forms.py:1586 -#: templates/circuits/inc/circuit_termination_fields.html:52 -#: templates/dcim/consoleport.html:76 templates/dcim/consoleserverport.html:77 -#: templates/dcim/frontport.html:17 templates/dcim/frontport.html:115 -#: templates/dcim/interface.html:187 templates/dcim/rearport.html:105 +#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/dcim/consoleport.html:76 +#: netbox/templates/dcim/consoleserverport.html:77 +#: netbox/templates/dcim/frontport.html:17 +#: netbox/templates/dcim/frontport.html:115 +#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "前置接口" -#: dcim/forms/model_forms.py:1148 dcim/forms/model_forms.py:1587 -#: dcim/tables/devices.py:710 -#: templates/circuits/inc/circuit_termination_fields.html:53 -#: templates/dcim/consoleport.html:79 templates/dcim/consoleserverport.html:80 -#: templates/dcim/frontport.html:50 templates/dcim/frontport.html:118 -#: templates/dcim/interface.html:190 templates/dcim/rearport.html:17 -#: templates/dcim/rearport.html:108 +#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 +#: netbox/dcim/tables/devices.py:710 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/templates/dcim/consoleport.html:79 +#: netbox/templates/dcim/consoleserverport.html:80 +#: netbox/templates/dcim/frontport.html:50 +#: netbox/templates/dcim/frontport.html:118 +#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/rearport.html:17 +#: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "后置接口" -#: dcim/forms/model_forms.py:1149 dcim/forms/model_forms.py:1588 -#: dcim/tables/connections.py:46 dcim/tables/devices.py:512 -#: templates/dcim/poweroutlet.html:44 templates/dcim/powerport.html:17 +#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 +#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "电源接口" -#: dcim/forms/model_forms.py:1150 dcim/forms/model_forms.py:1589 -#: templates/dcim/poweroutlet.html:17 templates/dcim/powerport.html:77 +#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/templates/dcim/poweroutlet.html:17 +#: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "电源插座" -#: dcim/forms/model_forms.py:1152 dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 msgid "Component Assignment" msgstr "组件分配" -#: dcim/forms/model_forms.py:1195 dcim/forms/model_forms.py:1638 +#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 msgid "An InventoryItem can only be assigned to a single component." msgstr "库存项只能分配给单个组件" -#: dcim/forms/model_forms.py:1332 +#: netbox/dcim/forms/model_forms.py:1339 msgid "LAG interface" msgstr "链路聚合接口" -#: dcim/forms/model_forms.py:1355 +#: netbox/dcim/forms/model_forms.py:1362 msgid "Filter VLANs available for assignment by group." msgstr "按组筛选可供分配的 VLAN。" -#: dcim/forms/model_forms.py:1484 +#: netbox/dcim/forms/model_forms.py:1491 msgid "Child Device" msgstr "子设备" -#: dcim/forms/model_forms.py:1485 +#: netbox/dcim/forms/model_forms.py:1492 msgid "" "Child devices must first be created and assigned to the site and rack of the" " parent device." msgstr "必须首先创建子设备,并将其分配给父设备的站点和机柜。" -#: dcim/forms/model_forms.py:1527 +#: netbox/dcim/forms/model_forms.py:1534 msgid "Console port" msgstr "Console 接口" -#: dcim/forms/model_forms.py:1535 +#: netbox/dcim/forms/model_forms.py:1542 msgid "Console server port" msgstr "Console 服务器端口" -#: dcim/forms/model_forms.py:1543 +#: netbox/dcim/forms/model_forms.py:1550 msgid "Front port" msgstr "前置接口" -#: dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/model_forms.py:1566 msgid "Power outlet" msgstr "电源插座" -#: dcim/forms/model_forms.py:1579 templates/dcim/inventoryitem.html:17 +#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "库存项" -#: dcim/forms/model_forms.py:1652 templates/dcim/inventoryitemrole.html:15 +#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "库存物品分类" -#: dcim/forms/object_create.py:48 dcim/forms/object_create.py:199 -#: dcim/forms/object_create.py:355 +#: netbox/dcim/forms/object_create.py:48 +#: netbox/dcim/forms/object_create.py:199 +#: netbox/dcim/forms/object_create.py:347 msgid "" "Alphanumeric ranges are supported. (Must match the number of objects being " "created.)" msgstr "支持字母数字范围。(必须与正在创建的对象数相匹配。)" -#: dcim/forms/object_create.py:68 +#: netbox/dcim/forms/object_create.py:68 #, python-brace-format msgid "" "The provided pattern specifies {value_count} values, but {pattern_count} are" " expected." msgstr "提供了 {value_count}个参数,实际需要{pattern_count}个。" -#: dcim/forms/object_create.py:110 dcim/forms/object_create.py:271 -#: dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:110 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 msgid "Rear ports" msgstr "后置接口" -#: dcim/forms/object_create.py:111 dcim/forms/object_create.py:272 +#: netbox/dcim/forms/object_create.py:111 +#: netbox/dcim/forms/object_create.py:264 msgid "Select one rear port assignment for each front port being created." msgstr "为正在创建的每个前置接口指定一个后置接口" -#: dcim/forms/object_create.py:164 +#: netbox/dcim/forms/object_create.py:164 #, python-brace-format msgid "" "The number of front port templates to be created ({frontport_count}) must " "match the selected number of rear port positions ({rearport_count})." msgstr "要创建的前置端口数({frontport_count}) 必须与所选的后置端口数({rearport_count})匹配。" -#: dcim/forms/object_create.py:251 -#, python-brace-format -msgid "" -"The string {module} will be replaced with the position of the " -"assigned module, if any." -msgstr "字符串{module} 将替换为指定位置的模块, (如果有的话)。" - -#: dcim/forms/object_create.py:320 +#: netbox/dcim/forms/object_create.py:312 #, python-brace-format msgid "" "The number of front ports to be created ({frontport_count}) must match the " "selected number of rear port positions ({rearport_count})." msgstr "要创建的前置端口数 ({frontport_count}) 必须与所选的后置端口数({rearport_count})匹配。" -#: dcim/forms/object_create.py:409 dcim/tables/devices.py:1033 -#: ipam/tables/fhrp.py:31 templates/dcim/virtualchassis.html:53 -#: templates/dcim/virtualchassis_edit.html:47 templates/ipam/fhrpgroup.html:38 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:47 +#: netbox/templates/ipam/fhrpgroup.html:38 msgid "Members" msgstr "成员" -#: dcim/forms/object_create.py:418 +#: netbox/dcim/forms/object_create.py:410 msgid "Initial position" msgstr "初始位置" -#: dcim/forms/object_create.py:421 +#: netbox/dcim/forms/object_create.py:413 msgid "" "Position of the first member device. Increases by one for each additional " "member." msgstr "第一个成员设备的位置。每增加一个成员增加一个。" -#: dcim/forms/object_create.py:435 +#: netbox/dcim/forms/object_create.py:427 msgid "A position must be specified for the first VC member." msgstr "必须为第一个VC成员指定一个位置。" -#: dcim/models/cables.py:62 dcim/models/device_component_templates.py:55 -#: dcim/models/device_components.py:62 extras/models/customfields.py:111 +#: netbox/dcim/models/cables.py:62 +#: netbox/dcim/models/device_component_templates.py:55 +#: netbox/dcim/models/device_components.py:62 +#: netbox/extras/models/customfields.py:111 msgid "label" msgstr "标记" -#: dcim/models/cables.py:71 +#: netbox/dcim/models/cables.py:71 msgid "length" msgstr "长度" -#: dcim/models/cables.py:78 +#: netbox/dcim/models/cables.py:78 msgid "length unit" msgstr "长度单位" -#: dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:95 msgid "cable" msgstr "线缆" -#: dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:96 msgid "cables" msgstr "线缆" -#: dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:165 msgid "Must specify a unit when setting a cable length" msgstr "设置线缆长度时必须指定单位" -#: dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:168 msgid "Must define A and B terminations when creating a new cable." msgstr "创建新线缆时必须定义A端和B端。" -#: dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:175 msgid "Cannot connect different termination types to same end of cable." msgstr "无法将不同的端点类型连接到线缆的两端。" -#: dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:183 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "不兼容的端点类型: {type_a} 和{type_b}" -#: dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:193 msgid "A and B terminations cannot connect to the same object." msgstr "A B端不能连接到同一个对象" -#: dcim/models/cables.py:260 ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 msgid "end" msgstr "结束" -#: dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:313 msgid "cable termination" msgstr "线缆端点" -#: dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:314 msgid "cable terminations" msgstr "线缆端点" -#: dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:333 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " "{cable_pk}" msgstr "发现{app_label}重复的终端:{model} {termination_id}: 线缆 {cable_pk}" -#: dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:343 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "线缆不能连接至{type_display} 接口" -#: dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:350 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "运营商网络的线路可能没有连接。" -#: dcim/models/cables.py:448 extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 msgid "is active" msgstr "激活的" -#: dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:452 msgid "is complete" msgstr "完成的" -#: dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:456 msgid "is split" msgstr "被拆分的" -#: dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:464 msgid "cable path" msgstr "线缆连接路径" -#: dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:465 msgid "cable paths" msgstr "线缆连接路径" -#: dcim/models/device_component_templates.py:46 +#: netbox/dcim/models/device_component_templates.py:46 #, python-brace-format msgid "" "{module} is accepted as a substitution for the module bay position when " "attached to a module type." msgstr "当连接到模块类型时,{module} 被认定为模块托架位置的替代。" -#: dcim/models/device_component_templates.py:58 -#: dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:58 +#: netbox/dcim/models/device_components.py:65 msgid "Physical label" msgstr "物理标签" -#: dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:103 msgid "Component templates cannot be moved to a different device type." msgstr "组件模板无法移动到其他设备类型。" -#: dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "组件模板不能同时与设备类型和模块类型相关联。" -#: dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:158 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "组件模板必须与设备类型或模块类型相关联。" -#: dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:212 msgid "console port template" msgstr "console端口模板" -#: dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:213 msgid "console port templates" msgstr "console端口模板" -#: dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:246 msgid "console server port template" msgstr "console服务器端口模板" -#: dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:247 msgid "console server port templates" msgstr "console服务器端口模板" -#: dcim/models/device_component_templates.py:278 -#: dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:278 +#: netbox/dcim/models/device_components.py:352 msgid "maximum draw" msgstr "最大功率" -#: dcim/models/device_component_templates.py:285 -#: dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:285 +#: netbox/dcim/models/device_components.py:359 msgid "allocated draw" msgstr "分配功率" -#: dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port template" msgstr "电源端口模版" -#: dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:296 msgid "power port templates" msgstr "电源端口模版" -#: dcim/models/device_component_templates.py:315 -#: dcim/models/device_components.py:382 +#: netbox/dcim/models/device_component_templates.py:315 +#: netbox/dcim/models/device_components.py:382 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "分配功率不能超过最大功率({maximum_draw}瓦)" -#: dcim/models/device_component_templates.py:347 -#: dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:347 +#: netbox/dcim/models/device_components.py:477 msgid "feed leg" msgstr "馈电线路" -#: dcim/models/device_component_templates.py:351 -#: dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:351 +#: netbox/dcim/models/device_components.py:481 msgid "Phase (for three-phase feeds)" msgstr "相位(用于三相电)" -#: dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:357 msgid "power outlet template" msgstr "电源插座模版" -#: dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:358 msgid "power outlet templates" msgstr "电源插座模版" -#: dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:367 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "父电源端口 ({power_port}) 必须属于相同的设备类型" -#: dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:371 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "父电源端口 ({power_port}) 必须属于相同的设备类型" -#: dcim/models/device_component_templates.py:423 -#: dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:423 +#: netbox/dcim/models/device_components.py:611 msgid "management only" msgstr "仅限管理" -#: dcim/models/device_component_templates.py:431 -#: dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:431 +#: netbox/dcim/models/device_components.py:550 msgid "bridge interface" msgstr "桥接接口" -#: dcim/models/device_component_templates.py:449 -#: dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:449 +#: netbox/dcim/models/device_components.py:636 msgid "wireless role" msgstr "无线角色" -#: dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:455 msgid "interface template" msgstr "接口模版" -#: dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:456 msgid "interface templates" msgstr "接口模版" -#: dcim/models/device_component_templates.py:463 -#: dcim/models/device_components.py:804 -#: virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:463 +#: netbox/dcim/models/device_components.py:804 +#: netbox/virtualization/models/virtualmachines.py:405 msgid "An interface cannot be bridged to itself." msgstr "接口不能桥接到自己" -#: dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:466 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "桥接接口({bridge}) 必须属于相同的设备类型" -#: dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:470 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "桥接接口({bridge}) 必须属于相同的模块类型" -#: dcim/models/device_component_templates.py:526 -#: dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_components.py:984 msgid "rear port position" msgstr "后置接口位置" -#: dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:551 msgid "front port template" msgstr "前置接口模板" -#: dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:552 msgid "front port templates" msgstr "前置接口模板" -#: dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:562 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "后置接口({name})必须属于相同的设备类型" -#: dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:568 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " "positions" msgstr "无效的后端口位置 ({position});后端口{name}只有{count}个" -#: dcim/models/device_component_templates.py:621 -#: dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:621 +#: netbox/dcim/models/device_components.py:1053 msgid "positions" msgstr "位置" -#: dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:632 msgid "rear port template" msgstr "后置端口模版" -#: dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:633 msgid "rear port templates" msgstr "后置端口模版" -#: dcim/models/device_component_templates.py:662 -#: dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:662 +#: netbox/dcim/models/device_components.py:1103 msgid "position" msgstr "位置" -#: dcim/models/device_component_templates.py:665 -#: dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:665 +#: netbox/dcim/models/device_components.py:1106 msgid "Identifier to reference when renaming installed components" msgstr "重命名已安装组件时要引用的标识符" -#: dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:671 msgid "module bay template" msgstr "模块托架模版" -#: dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:672 msgid "module bay templates" msgstr "模块托架模版" -#: dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:699 msgid "device bay template" msgstr "设备托架模版" -#: dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:700 msgid "device bay templates" msgstr "设备托架模版" -#: dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:713 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " "allow device bays." msgstr "设备类型({device_type})的子设备角色必须设置为“父设备”,才能允许设备托架。" -#: dcim/models/device_component_templates.py:768 -#: dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:768 +#: netbox/dcim/models/device_components.py:1262 msgid "part ID" msgstr "零件ID" -#: dcim/models/device_component_templates.py:770 -#: dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:770 +#: netbox/dcim/models/device_components.py:1264 msgid "Manufacturer-assigned part identifier" msgstr "制造商指定的零件标识符" -#: dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:787 msgid "inventory item template" msgstr "库存项模版" -#: dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:788 msgid "inventory item templates" msgstr "库存项模版" -#: dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:105 msgid "Components cannot be moved to a different device." msgstr "组件模板无法移动到其他设备类型。" -#: dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:144 msgid "cable end" msgstr "线缆终点" -#: dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:150 msgid "mark connected" msgstr "标记已连接" -#: dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:152 msgid "Treat as if a cable is connected" msgstr "视为电缆已连接" -#: dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:170 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "连接电缆时必须指定电缆末端(A或B)。" -#: dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:174 msgid "Cable end must not be set without a cable." msgstr "不得在没有线缆的情况下设置线缆末端。" -#: dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:178 msgid "Cannot mark as connected with a cable attached." msgstr "无法标记为已连接线缆。" -#: dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:202 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "{class_name}模块必须声明上架类型" -#: dcim/models/device_components.py:287 dcim/models/device_components.py:316 -#: dcim/models/device_components.py:349 dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:316 +#: netbox/dcim/models/device_components.py:349 +#: netbox/dcim/models/device_components.py:467 msgid "Physical port type" msgstr "物理端口类型" -#: dcim/models/device_components.py:290 dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:290 +#: netbox/dcim/models/device_components.py:319 msgid "speed" msgstr "速率" -#: dcim/models/device_components.py:294 dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:294 +#: netbox/dcim/models/device_components.py:323 msgid "Port speed in bits per second" msgstr "端口速度(单位bps)" -#: dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:300 msgid "console port" msgstr "console端口" -#: dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:301 msgid "console ports" msgstr "console端口" -#: dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:329 msgid "console server port" msgstr "console服务器端口" -#: dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:330 msgid "console server ports" msgstr "console服务器端口" -#: dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:369 msgid "power port" msgstr "电源接口" -#: dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:370 msgid "power ports" msgstr "电源接口" -#: dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:487 msgid "power outlet" msgstr "电源插座" -#: dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:488 msgid "power outlets" msgstr "电源插座" -#: dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:499 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "父电源端口({power_port})必须属于同一设备" -#: dcim/models/device_components.py:530 vpn/models/crypto.py:81 -#: vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 +#: netbox/vpn/models/crypto.py:226 msgid "mode" msgstr "模式" -#: dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:534 msgid "IEEE 802.1Q tagging strategy" msgstr "IEEE 802.1Q VLAN 标记策略" -#: dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:542 msgid "parent interface" msgstr "父接口" -#: dcim/models/device_components.py:602 +#: netbox/dcim/models/device_components.py:602 msgid "parent LAG" msgstr "父聚合组" -#: dcim/models/device_components.py:612 +#: netbox/dcim/models/device_components.py:612 msgid "This interface is used only for out-of-band management" msgstr "该接口仅用于带外管理" -#: dcim/models/device_components.py:617 +#: netbox/dcim/models/device_components.py:617 msgid "speed (Kbps)" msgstr "速率(Kbps)" -#: dcim/models/device_components.py:620 +#: netbox/dcim/models/device_components.py:620 msgid "duplex" msgstr "双工" -#: dcim/models/device_components.py:630 +#: netbox/dcim/models/device_components.py:630 msgid "64-bit World Wide Name" msgstr "64位全球唯一标识符" -#: dcim/models/device_components.py:642 +#: netbox/dcim/models/device_components.py:642 msgid "wireless channel" msgstr "无线信道" -#: dcim/models/device_components.py:649 +#: netbox/dcim/models/device_components.py:649 msgid "channel frequency (MHz)" msgstr "信道频率(MHz)" -#: dcim/models/device_components.py:650 dcim/models/device_components.py:658 +#: netbox/dcim/models/device_components.py:650 +#: netbox/dcim/models/device_components.py:658 msgid "Populated by selected channel (if set)" msgstr "由所选通道填充(如有)" -#: dcim/models/device_components.py:664 +#: netbox/dcim/models/device_components.py:664 msgid "transmit power (dBm)" msgstr "发射功率(dBm)" -#: dcim/models/device_components.py:689 wireless/models.py:117 +#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 msgid "wireless LANs" msgstr "无线局域网" -#: dcim/models/device_components.py:697 -#: virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:697 +#: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" msgstr "未标记VLAN" -#: dcim/models/device_components.py:703 -#: virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:703 +#: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" msgstr "已标记 VLANs" -#: dcim/models/device_components.py:745 -#: virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:745 +#: netbox/virtualization/models/virtualmachines.py:377 msgid "interface" msgstr "接口" -#: dcim/models/device_components.py:746 -#: virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:746 +#: netbox/virtualization/models/virtualmachines.py:378 msgid "interfaces" msgstr "接口" -#: dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:757 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "{display_type}接口不能连接线缆。" -#: dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:765 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "{display_type}接口不能标记为已连接。" -#: dcim/models/device_components.py:774 -#: virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:774 +#: netbox/virtualization/models/virtualmachines.py:390 msgid "An interface cannot be its own parent." msgstr "接口不能是自己的父级。" -#: dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:778 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "只能将虚拟接口分配给父接口。" -#: dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:785 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " "({device})" msgstr "所选父接口({interface}) 属于另一个设备 ({device})" -#: dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:791 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "所选的父接口({interface})属于 {device},该设备不是虚拟机箱{virtual_chassis}的一部分。" -#: dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:811 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "所选桥接接口 ({bridge})属于另一个设备({device})。" -#: dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:817 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "所选的桥接接口({interface})属于 {device},该设备不是虚拟机箱{virtual_chassis}的一部分。" -#: dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:828 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "虚拟接口不能具有父聚合接口。" -#: dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:832 msgid "A LAG interface cannot be its own parent." msgstr "聚合接口不能是自己的父级。" -#: dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:839 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "选择的LAG接口 ({lag}) 属于不同的设备 ({device})." -#: dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:845 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of" " virtual chassis {virtual_chassis}." msgstr "选择的LAG接口 ({lag}) 属于 {device}, 它不是虚拟机箱的一部分 {virtual_chassis}." -#: dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:856 msgid "Virtual interfaces cannot have a PoE mode." msgstr "虚拟接口不能具有PoE模式。" -#: dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:860 msgid "Virtual interfaces cannot have a PoE type." msgstr "虚拟接口不能是PoE类型。" -#: dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:866 msgid "Must specify PoE mode when designating a PoE type." msgstr "指定PoE类型时必须指定PoE模式。" -#: dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:873 msgid "Wireless role may be set only on wireless interfaces." msgstr "只能在无线接口上设置无线角色。" -#: dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:875 msgid "Channel may be set only on wireless interfaces." msgstr "只能在无线接口上设置信道。" -#: dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:881 msgid "Channel frequency may be set only on wireless interfaces." msgstr "信道频率仅在无线接口上设置。" -#: dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:885 msgid "Cannot specify custom frequency with channel selected." msgstr "无法在选定频道的情况下指定自定义频率。" -#: dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:891 msgid "Channel width may be set only on wireless interfaces." msgstr "只能在无线接口上设置频宽。" -#: dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:893 msgid "Cannot specify custom width with channel selected." msgstr "无法在选定通道的情况下指定自定义频宽。" -#: dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:901 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent device, or it must be global." msgstr "不打标记的VLAN({untagged_vlan})必须与接口所属设备/虚拟机属于同一站点,或者是全局VLAN" -#: dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:990 msgid "Mapped position on corresponding rear port" msgstr "对应后置端口上的映射位置" -#: dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1006 msgid "front port" msgstr "前置端口" -#: dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1007 msgid "front ports" msgstr "前置端口" -#: dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1021 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "后置端口({rear_port})必须属于同一设备" -#: dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1029 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only" " {positions} positions." msgstr "无效的后端口位置({rear_port_position});后端口{name}只有 {positions}个" -#: dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1059 msgid "Number of front ports which may be mapped" msgstr "可以映射的前置端口数" -#: dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1064 msgid "rear port" msgstr "后置端口" -#: dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1065 msgid "rear ports" msgstr "后置端口" -#: dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1079 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports" " ({frontport_count})" msgstr "位置数不能小于映射的前置端口数({frontport_count})" -#: dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1120 msgid "module bay" msgstr "设备板卡插槽" -#: dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1121 msgid "module bays" msgstr "设备板卡插槽" -#: dcim/models/device_components.py:1138 dcim/models/devices.py:1224 +#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "模块托架不能属于安装在其中的模块。" -#: dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1164 msgid "device bay" msgstr "设备托架" -#: dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1165 msgid "device bays" msgstr "设备托架" -#: dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1175 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "此类型的设备 ({device_type}) 不支持设备托架。" -#: dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1181 msgid "Cannot install a device into itself." msgstr "无法将设备安装到自身中。" -#: dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1189 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "无法安装指定的设备;设备已安装在{bay}中。" -#: dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1210 msgid "inventory item role" msgstr "库存物品分类" -#: dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1211 msgid "inventory item roles" msgstr "库存物品分类" -#: dcim/models/device_components.py:1268 dcim/models/devices.py:607 -#: dcim/models/devices.py:1181 dcim/models/racks.py:313 -#: virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1268 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 +#: netbox/dcim/models/racks.py:313 +#: netbox/virtualization/models/virtualmachines.py:131 msgid "serial number" msgstr "序列号" -#: dcim/models/device_components.py:1276 dcim/models/devices.py:615 -#: dcim/models/devices.py:1188 dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1276 +#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 +#: netbox/dcim/models/racks.py:320 msgid "asset tag" msgstr "资产标签" -#: dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1277 msgid "A unique tag used to identify this item" msgstr "用于识别该项目的唯一标识" -#: dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1280 msgid "discovered" msgstr "已发现" -#: dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1282 msgid "This item was automatically discovered" msgstr "此项目是自动发现的" -#: dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1300 msgid "inventory item" msgstr "库存项" -#: dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1301 msgid "inventory items" msgstr "库存项" -#: dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1312 msgid "Cannot assign self as parent." msgstr "无法将自身分配为父级。" -#: dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1320 msgid "Parent inventory item does not belong to the same device." msgstr "父库存项不能属于同一设备。" -#: dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1326 msgid "Cannot move an inventory item with dependent children" msgstr "无法移动具有子项的库存项目" -#: dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1334 msgid "Cannot assign inventory item to component on another device" msgstr "无法将库存项分配给其他设备上的组件" -#: dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:54 msgid "manufacturer" msgstr "厂商" -#: dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:55 msgid "manufacturers" msgstr "厂商" -#: dcim/models/devices.py:82 dcim/models/devices.py:382 -#: dcim/models/racks.py:133 +#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/racks.py:133 msgid "model" msgstr "型号" -#: dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:95 msgid "default platform" msgstr "默认系统平台" -#: dcim/models/devices.py:98 dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "部件编码(PN)" -#: dcim/models/devices.py:101 dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "独立部件编码(PN) (可选)" -#: dcim/models/devices.py:107 dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 msgid "height (U)" msgstr "高度(U)" -#: dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:111 msgid "exclude from utilization" msgstr "从利用率中排除" -#: dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:112 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "计算机柜利用率时,不包括此类设备。" -#: dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:116 msgid "is full depth" msgstr "是否全尺寸" -#: dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:117 msgid "Device consumes both front and rear rack faces." msgstr "设备同时使用机柜的前面板和后面板。" -#: dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:123 msgid "parent/child status" msgstr "父设备/子设备状态" -#: dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:124 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." msgstr "父设备将子设备放置在设备托架中。如果此设备类型既不是父设备也不是子设备,请保留为空。" -#: dcim/models/devices.py:128 dcim/models/devices.py:392 -#: dcim/models/devices.py:659 dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 msgid "airflow" msgstr "气流方向" -#: dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:204 msgid "device type" msgstr "设备型号" -#: dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:205 msgid "device types" msgstr "设备型号" -#: dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:290 msgid "U height must be in increments of 0.5 rack units." msgstr "U位数必须以0.5U为增量。" -#: dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:307 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate" " a height of {height}U" msgstr "机柜 {rack}没有足够的空间容纳{height}U的设备 {device}" -#: dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:322 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " "instances already mounted within racks." msgstr "无法设置高度为0U: 发现 {racked_instance_count}个设备已经安装在机柜中。" -#: dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:331 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." msgstr "必须删除与此设备关联的所有设备托架模板,然后才能将其修改为父设备。" -#: dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:337 msgid "Child device types must be 0U." msgstr "子设备类型高度必须为0U。" -#: dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:411 msgid "module type" msgstr "模块类型" -#: dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:412 msgid "module types" msgstr "模块类型" -#: dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:485 msgid "Virtual machines may be assigned to this role" msgstr "虚拟机可以使用该型号/角色" -#: dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:497 msgid "device role" msgstr "设备角色" -#: dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:498 msgid "device roles" msgstr "设备角色" -#: dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:515 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "可选择将此平台限定为特定制造商的设备" -#: dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:527 msgid "platform" msgstr "操作系统" -#: dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:528 msgid "platforms" msgstr "操作系统" -#: dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:576 msgid "The function this device serves" msgstr "该设备的功能" -#: dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:608 msgid "Chassis serial number, assigned by the manufacturer" msgstr "制造商分配的机箱序列号" -#: dcim/models/devices.py:616 dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 msgid "A unique tag used to identify this device" msgstr "用于识别该设备的唯一标签" -#: dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:643 msgid "position (U)" msgstr "机柜位置(U)" -#: dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:650 msgid "rack face" msgstr "机柜安装方向" -#: dcim/models/devices.py:670 dcim/models/devices.py:1415 -#: virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 +#: netbox/virtualization/models/virtualmachines.py:100 msgid "primary IPv4" msgstr "首选 IPv4" -#: dcim/models/devices.py:678 dcim/models/devices.py:1423 -#: virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 +#: netbox/virtualization/models/virtualmachines.py:108 msgid "primary IPv6" msgstr "首选 IPv6" -#: dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:686 msgid "out-of-band IP" msgstr "带外管理IP地址" -#: dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:703 msgid "VC position" msgstr "堆叠位置" -#: dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis position" msgstr "堆叠位置" -#: dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:709 msgid "VC priority" msgstr "VC优先级" -#: dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:713 msgid "Virtual chassis master election priority" msgstr "堆叠主设备优先级" -#: dcim/models/devices.py:716 dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 msgid "latitude" msgstr "纬度" -#: dcim/models/devices.py:721 dcim/models/devices.py:729 -#: dcim/models/sites.py:212 dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 +#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "GPS坐标(十进制格式, xx.yyyyyy)" -#: dcim/models/devices.py:724 dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 msgid "longitude" msgstr "经度" -#: dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:797 msgid "Device name must be unique per site." msgstr "每个站点的设备名称必须唯一。" -#: dcim/models/devices.py:808 ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 msgid "device" msgstr "设备" -#: dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:809 msgid "devices" msgstr "设备" -#: dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "机柜 {rack} 不属于 {site}站点." -#: dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:840 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "地点 {location} 不属于 {site}站点." -#: dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:846 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "机柜{rack}不属于{location}地点." -#: dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:853 msgid "Cannot select a rack face without assigning a rack." msgstr "在未分配机柜的情况下,无法选择安装在机柜的哪一面。" -#: dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:857 msgid "Cannot select a rack position without assigning a rack." msgstr "在未分配机柜的情况下,无法选择安装在机柜的哪个位置。" -#: dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:863 msgid "Position must be in increments of 0.5 rack units." msgstr "机柜位置必须以0.5个U位递增。" -#: dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:867 msgid "Must specify rack face when defining rack position." msgstr "指定机柜安装位置时必须指定安装在机柜的哪一面。" -#: dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:875 #, python-brace-format msgid "" "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "无法将0U的设备类型({device_type})的设备安装在机柜中。" -#: dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:886 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "子设备类型不能安装到机柜的前/后面。这是父设备的一个属性。" -#: dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:893 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." msgstr "子设备类型不能安装到机柜某个位置。这是父设备的一个属性。" -#: dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:907 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " "accommodate this device type: {device_type} ({u_height}U)" msgstr "{position}U已被占用或没有足够的空间容纳此设备类型:{device_type} ({u_height}U)" -#: dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:922 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "{ip} 不是有效的IPv4地址" -#: dcim/models/devices.py:931 dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "指定的IP地址 ({ip}) 未分配给该设备。" -#: dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:937 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "{ip} 不是有效的IPv6地址" -#: dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:964 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " @@ -5638,1845 +6099,1955 @@ msgid "" msgstr "" "指定的平台仅限于{platform_manufacturer} 的设备类型,但此设备的类型属于{devicetype_manufacturer}。" -#: dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:975 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "分配的群集属于其他站点({site})" -#: dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:983 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "分配给集群的设备必须定义其位置。" -#: dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:988 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " "is currently designated as its master." msgstr "无法从虚拟机箱中移除设备 {virtual_chassis} 因为它目前被指定为主节点。" -#: dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1196 msgid "module" msgstr "模块" -#: dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1197 msgid "modules" msgstr "模块" -#: dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1213 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "模块必须安装在属于指定设备({device})的模块托架内。" -#: dcim/models/devices.py:1334 +#: netbox/dcim/models/devices.py:1339 msgid "domain" msgstr "域" -#: dcim/models/devices.py:1347 dcim/models/devices.py:1348 +#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 msgid "virtual chassis" msgstr "堆叠" -#: dcim/models/devices.py:1363 +#: netbox/dcim/models/devices.py:1368 #, python-brace-format msgid "" "The selected master ({master}) is not assigned to this virtual chassis." msgstr "所选主设备({master})未分配给此堆叠。" -#: dcim/models/devices.py:1379 +#: netbox/dcim/models/devices.py:1384 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "无法删除堆叠 {self}。有成员接口属于跨机箱聚合。" -#: dcim/models/devices.py:1404 vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "标识符" -#: dcim/models/devices.py:1405 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "父设备唯一的标识符" -#: dcim/models/devices.py:1433 extras/models/customfields.py:225 -#: extras/models/models.py:107 extras/models/models.py:694 -#: netbox/models/__init__.py:115 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 +#: netbox/netbox/models/__init__.py:115 msgid "comments" msgstr "评论" -#: dcim/models/devices.py:1449 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "设备虚拟实例" -#: dcim/models/devices.py:1450 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "设备虚拟实例" -#: dcim/models/devices.py:1482 +#: netbox/dcim/models/devices.py:1487 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "{ip} 不是有效的 IPv{family} 地址" -#: dcim/models/devices.py:1488 +#: netbox/dcim/models/devices.py:1493 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "首选 IP 地址必须属于指定设备上的接口。" -#: dcim/models/mixins.py:15 extras/models/configs.py:41 -#: extras/models/models.py:313 extras/models/models.py:522 -#: extras/models/search.py:48 ipam/models/ip.py:194 +#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 +#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 +#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 msgid "weight" msgstr "重量" -#: dcim/models/mixins.py:22 +#: netbox/dcim/models/mixins.py:22 msgid "weight unit" msgstr "重量单位" -#: dcim/models/mixins.py:51 +#: netbox/dcim/models/mixins.py:51 msgid "Must specify a unit when setting a weight" msgstr "设置重量时必须指定单位" -#: dcim/models/power.py:55 +#: netbox/dcim/models/power.py:55 msgid "power panel" msgstr "电源面板" -#: dcim/models/power.py:56 +#: netbox/dcim/models/power.py:56 msgid "power panels" msgstr "电源面板" -#: dcim/models/power.py:70 +#: netbox/dcim/models/power.py:70 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "位置 {location} ({location_site}) 位于不同的站点 {site}" -#: dcim/models/power.py:108 +#: netbox/dcim/models/power.py:108 msgid "supply" msgstr "供应" -#: dcim/models/power.py:114 +#: netbox/dcim/models/power.py:114 msgid "phase" msgstr "相位" -#: dcim/models/power.py:120 +#: netbox/dcim/models/power.py:120 msgid "voltage" msgstr "电压" -#: dcim/models/power.py:125 +#: netbox/dcim/models/power.py:125 msgid "amperage" msgstr "电流" -#: dcim/models/power.py:130 +#: netbox/dcim/models/power.py:130 msgid "max utilization" msgstr "最大利用率" -#: dcim/models/power.py:133 +#: netbox/dcim/models/power.py:133 msgid "Maximum permissible draw (percentage)" msgstr "最大允许利用率(百分比)" -#: dcim/models/power.py:136 +#: netbox/dcim/models/power.py:136 msgid "available power" msgstr "可用功率" -#: dcim/models/power.py:164 +#: netbox/dcim/models/power.py:164 msgid "power feed" msgstr "电力来源" -#: dcim/models/power.py:165 +#: netbox/dcim/models/power.py:165 msgid "power feeds" msgstr "电力来源" -#: dcim/models/power.py:179 +#: netbox/dcim/models/power.py:179 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " "are in different sites." msgstr "机柜{rack} ({rack_site})和电源面板{powerpanel} ({powerpanel_site})位于不同的站点。" -#: dcim/models/power.py:190 +#: netbox/dcim/models/power.py:190 msgid "Voltage cannot be negative for AC supply" msgstr "交流电源的电压不能为负" -#: dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:47 msgid "width" msgstr "宽度" -#: dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:48 msgid "Rail-to-rail width" msgstr "机柜间宽度" -#: dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:56 msgid "Height in rack units" msgstr "以U为单位的机柜高度" -#: dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:60 msgid "starting unit" msgstr "起始U位" -#: dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:62 msgid "Starting unit for rack" msgstr "此机柜的起始U位" -#: dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:66 msgid "descending units" msgstr "U位显示降序" -#: dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:67 msgid "Units are numbered top-to-bottom" msgstr "U位从上到下编号" -#: dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:72 msgid "outer width" msgstr "外部宽度" -#: dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:75 msgid "Outer dimension of rack (width)" msgstr "机柜外部尺寸(宽)" -#: dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:78 msgid "outer depth" msgstr "外部长度/深度" -#: dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:81 msgid "Outer dimension of rack (depth)" msgstr "机架外形尺寸(深度)" -#: dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:84 msgid "outer unit" msgstr "外框尺寸的单位" -#: dcim/models/racks.py:90 +#: netbox/dcim/models/racks.py:90 msgid "mounting depth" msgstr "安装深度" -#: dcim/models/racks.py:94 +#: netbox/dcim/models/racks.py:94 msgid "" "Maximum depth of a mounted device, in millimeters. For four-post racks, this" " is the distance between the front and rear rails." msgstr "已安装设备的最大深度(以毫米为单位)。 对于四柱机架,这是前导轨和后导轨之间的距离。" -#: dcim/models/racks.py:102 +#: netbox/dcim/models/racks.py:102 msgid "max weight" msgstr "最大承重" -#: dcim/models/racks.py:105 +#: netbox/dcim/models/racks.py:105 msgid "Maximum load capacity for the rack" msgstr "机柜最大承重" -#: dcim/models/racks.py:125 dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 msgid "form factor" msgstr "外形规格" -#: dcim/models/racks.py:162 +#: netbox/dcim/models/racks.py:162 msgid "rack type" msgstr "机架类型" -#: dcim/models/racks.py:163 +#: netbox/dcim/models/racks.py:163 msgid "rack types" msgstr "机架类型" -#: dcim/models/racks.py:180 dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" msgstr "设置外部宽度/深度时必须指定单位" -#: dcim/models/racks.py:184 dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 msgid "Must specify a unit when setting a maximum weight" msgstr "设置最大承重时必须指定单位" -#: dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:230 msgid "rack role" msgstr "机柜角色" -#: dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:231 msgid "rack roles" msgstr "机柜角色" -#: dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:274 msgid "facility ID" msgstr "标识符ID" -#: dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:275 msgid "Locally-assigned identifier" msgstr "本地分配的标识符" -#: dcim/models/racks.py:308 ipam/forms/bulk_import.py:201 -#: ipam/forms/bulk_import.py:266 ipam/forms/bulk_import.py:301 -#: ipam/forms/bulk_import.py:459 virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 +#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 +#: netbox/ipam/forms/bulk_import.py:483 +#: netbox/virtualization/forms/bulk_import.py:112 msgid "Functional role" msgstr "功能角色" -#: dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:321 msgid "A unique tag used to identify this rack" msgstr "用于识别该机柜的唯一标识" -#: dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:359 msgid "rack" msgstr "机柜" -#: dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:360 msgid "racks" msgstr "机柜" -#: dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:375 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "指定的位置必须属于父站点({site})。" -#: dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:393 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "机柜必须有至少{min_height}U高,才可以容纳当前安装的设备。" -#: dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:400 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "机柜单元编号必须从{position}或以上开始,才能容纳当前安装的设备。" -#: dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:408 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "位置必须来自同一站点 {site}。" -#: dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:670 msgid "units" msgstr "位置" -#: dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:696 msgid "rack reservation" msgstr "机柜预留" -#: dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:697 msgid "rack reservations" msgstr "机柜预留" -#: dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:714 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "{height}U机柜中无效的U位: {unit_list}" -#: dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:727 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "以下U位已被保留:{unit_list}" -#: dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:49 msgid "A top-level region with this name already exists." msgstr "具有此名称的顶级区域已存在。" -#: dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:59 msgid "A top-level region with this slug already exists." msgstr "具有此缩写的顶级区域已经存在。" -#: dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:62 msgid "region" msgstr "地区" -#: dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:63 msgid "regions" msgstr "地区" -#: dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:102 msgid "A top-level site group with this name already exists." msgstr "具有此名称的顶级站点组已存在。" -#: dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:112 msgid "A top-level site group with this slug already exists." msgstr "具有此缩写的顶级站点组已存在。" -#: dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:115 msgid "site group" msgstr "站点组" -#: dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:116 msgid "site groups" msgstr "站点组" -#: dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:141 msgid "Full name of the site" msgstr "站点全名" -#: dcim/models/sites.py:181 dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 msgid "facility" msgstr "设施" -#: dcim/models/sites.py:184 dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 msgid "Local facility ID or description" msgstr "本地设施 ID 或描述" -#: dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:195 msgid "physical address" msgstr "物理地址" -#: dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:198 msgid "Physical location of the building" msgstr "机房的实体位置" -#: dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:201 msgid "shipping address" msgstr "快递地址" -#: dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:204 msgid "If different from the physical address" msgstr "若与实体地址不同" -#: dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:238 msgid "site" msgstr "站点" -#: dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:239 msgid "sites" msgstr "站点" -#: dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:309 msgid "A location with this name already exists within the specified site." msgstr "指定的站点中已存在此名称的位置。" -#: dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:319 msgid "A location with this slug already exists within the specified site." msgstr "指定的站点中已存在此缩写的位置。" -#: dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:322 msgid "location" msgstr "位置" -#: dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:323 msgid "locations" msgstr "位置" -#: dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:337 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "父位置({parent})必须属于同一站点({site})。" -#: dcim/tables/cables.py:55 +#: netbox/dcim/tables/cables.py:55 msgid "Termination A" msgstr "本端A" -#: dcim/tables/cables.py:60 +#: netbox/dcim/tables/cables.py:60 msgid "Termination B" msgstr "对端B" -#: dcim/tables/cables.py:66 wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 msgid "Device A" msgstr "设备A" -#: dcim/tables/cables.py:72 wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 msgid "Device B" msgstr "设备B" -#: dcim/tables/cables.py:78 +#: netbox/dcim/tables/cables.py:78 msgid "Location A" msgstr "位置A" -#: dcim/tables/cables.py:84 +#: netbox/dcim/tables/cables.py:84 msgid "Location B" msgstr "位置B" -#: dcim/tables/cables.py:90 +#: netbox/dcim/tables/cables.py:90 msgid "Rack A" msgstr "机柜A" -#: dcim/tables/cables.py:96 +#: netbox/dcim/tables/cables.py:96 msgid "Rack B" msgstr "机柜B" -#: dcim/tables/cables.py:102 +#: netbox/dcim/tables/cables.py:102 msgid "Site A" msgstr "站点A" -#: dcim/tables/cables.py:108 +#: netbox/dcim/tables/cables.py:108 msgid "Site B" msgstr "站点B" -#: dcim/tables/connections.py:31 dcim/tables/connections.py:50 -#: dcim/tables/connections.py:71 -#: templates/dcim/inc/connection_endpoints.html:16 +#: netbox/dcim/tables/connections.py:31 netbox/dcim/tables/connections.py:50 +#: netbox/dcim/tables/connections.py:71 +#: netbox/templates/dcim/inc/connection_endpoints.html:16 msgid "Reachable" msgstr "可达性" -#: dcim/tables/devices.py:58 dcim/tables/devices.py:106 -#: dcim/tables/racks.py:150 dcim/tables/sites.py:105 dcim/tables/sites.py:148 -#: extras/tables/tables.py:545 netbox/navigation/menu.py:69 -#: netbox/navigation/menu.py:73 netbox/navigation/menu.py:75 -#: virtualization/forms/model_forms.py:122 -#: virtualization/tables/clusters.py:83 virtualization/views.py:206 +#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 +#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 +#: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 +#: netbox/netbox/navigation/menu.py:75 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:83 +#: netbox/virtualization/views.py:204 msgid "Devices" msgstr "设备" -#: dcim/tables/devices.py:63 dcim/tables/devices.py:111 -#: virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 +#: netbox/virtualization/tables/clusters.py:88 msgid "VMs" msgstr "VMs" -#: dcim/tables/devices.py:100 dcim/tables/devices.py:216 -#: extras/forms/model_forms.py:630 templates/dcim/device.html:112 -#: templates/dcim/device/render_config.html:11 -#: templates/dcim/device/render_config.html:14 -#: templates/dcim/devicerole.html:44 templates/dcim/platform.html:41 -#: templates/extras/configtemplate.html:10 -#: templates/virtualization/virtualmachine.html:48 -#: templates/virtualization/virtualmachine/render_config.html:11 -#: templates/virtualization/virtualmachine/render_config.html:14 -#: virtualization/tables/virtualmachines.py:107 +#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/extras/forms/model_forms.py:630 +#: netbox/templates/dcim/device.html:112 +#: netbox/templates/dcim/device/render_config.html:11 +#: netbox/templates/dcim/device/render_config.html:14 +#: netbox/templates/dcim/devicerole.html:44 +#: netbox/templates/dcim/platform.html:41 +#: netbox/templates/extras/configtemplate.html:10 +#: netbox/templates/virtualization/virtualmachine.html:48 +#: netbox/templates/virtualization/virtualmachine/render_config.html:11 +#: netbox/templates/virtualization/virtualmachine/render_config.html:14 +#: netbox/virtualization/tables/virtualmachines.py:107 msgid "Config Template" msgstr "配置模版" -#: dcim/tables/devices.py:150 templates/dcim/sitegroup.html:26 +#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 msgid "Site Group" msgstr "站点组" -#: dcim/tables/devices.py:187 dcim/tables/devices.py:1068 -#: ipam/forms/bulk_import.py:503 ipam/forms/model_forms.py:306 -#: ipam/forms/model_forms.py:315 ipam/tables/ip.py:356 ipam/tables/ip.py:423 -#: ipam/tables/ip.py:446 templates/ipam/ipaddress.html:11 -#: virtualization/tables/virtualmachines.py:95 +#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 +#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 +#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 +#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/templates/ipam/ipaddress.html:11 +#: netbox/virtualization/tables/virtualmachines.py:95 msgid "IP Address" msgstr "IP地址" -#: dcim/tables/devices.py:191 dcim/tables/devices.py:1072 -#: virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 +#: netbox/virtualization/tables/virtualmachines.py:86 msgid "IPv4 Address" msgstr "IPv4 地址" -#: dcim/tables/devices.py:195 dcim/tables/devices.py:1076 -#: virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 +#: netbox/virtualization/tables/virtualmachines.py:90 msgid "IPv6 Address" msgstr "IPv6 地址" -#: dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:210 msgid "VC Position" msgstr "堆叠位置" -#: dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:213 msgid "VC Priority" msgstr "堆叠优先级" -#: dcim/tables/devices.py:220 templates/dcim/device_edit.html:38 -#: templates/dcim/devicebay_populate.html:16 +#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "父设备" -#: dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:225 msgid "Position (Device Bay)" msgstr "位置(设备托架)" -#: dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:234 msgid "Console ports" msgstr "Console 端口" -#: dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:237 msgid "Console server ports" msgstr "Console 服务器端口" -#: dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:240 msgid "Power ports" msgstr "电源接口" -#: dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:243 msgid "Power outlets" msgstr "电源插座" -#: dcim/tables/devices.py:246 dcim/tables/devices.py:1081 -#: dcim/tables/devicetypes.py:128 dcim/views.py:1042 dcim/views.py:1281 -#: dcim/views.py:1977 netbox/navigation/menu.py:94 -#: netbox/navigation/menu.py:250 templates/dcim/device/base.html:37 -#: templates/dcim/device_list.html:43 templates/dcim/devicetype/base.html:34 -#: templates/dcim/inc/moduletype_buttons.html:25 templates/dcim/module.html:34 -#: templates/dcim/virtualdevicecontext.html:61 -#: templates/dcim/virtualdevicecontext.html:81 -#: templates/virtualization/virtualmachine/base.html:27 -#: templates/virtualization/virtualmachine_list.html:14 -#: virtualization/tables/virtualmachines.py:101 virtualization/views.py:366 -#: wireless/tables/wirelesslan.py:55 +#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 +#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/templates/dcim/device/base.html:37 +#: netbox/templates/dcim/device_list.html:43 +#: netbox/templates/dcim/devicetype/base.html:34 +#: netbox/templates/dcim/inc/moduletype_buttons.html:25 +#: netbox/templates/dcim/module.html:34 +#: netbox/templates/dcim/virtualdevicecontext.html:61 +#: netbox/templates/dcim/virtualdevicecontext.html:81 +#: netbox/templates/virtualization/virtualmachine/base.html:27 +#: netbox/templates/virtualization/virtualmachine_list.html:14 +#: netbox/virtualization/tables/virtualmachines.py:101 +#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 msgid "Interfaces" msgstr "接口" -#: dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:249 msgid "Front ports" msgstr "前置端口" -#: dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:255 msgid "Device bays" msgstr "设备托架" -#: dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:258 msgid "Module bays" msgstr "设备板卡插槽" -#: dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:261 msgid "Inventory items" msgstr "库存项" -#: dcim/tables/devices.py:305 dcim/tables/modules.py:56 -#: templates/dcim/modulebay.html:17 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "设备板卡插槽" -#: dcim/tables/devices.py:318 dcim/tables/devicetypes.py:47 -#: dcim/tables/devicetypes.py:143 dcim/views.py:1117 dcim/views.py:2075 -#: netbox/navigation/menu.py:103 templates/dcim/device/base.html:52 -#: templates/dcim/device_list.html:71 templates/dcim/devicetype/base.html:49 -#: templates/dcim/inc/panels/inventory_items.html:6 -#: templates/dcim/inventoryitemrole.html:32 +#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 +#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/templates/dcim/device/base.html:52 +#: netbox/templates/dcim/device_list.html:71 +#: netbox/templates/dcim/devicetype/base.html:49 +#: netbox/templates/dcim/inc/panels/inventory_items.html:6 +#: netbox/templates/dcim/inventoryitemrole.html:32 msgid "Inventory Items" msgstr "库存项目" -#: dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:333 msgid "Cable Color" msgstr "线缆颜色" -#: dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:339 msgid "Link Peers" msgstr "链接对等体" -#: dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:342 msgid "Mark Connected" msgstr "标记已连接" -#: dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:461 msgid "Maximum draw (W)" msgstr "最大功率(W)" -#: dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:464 msgid "Allocated draw (W)" msgstr "分配功率(W)" -#: dcim/tables/devices.py:558 ipam/forms/model_forms.py:701 -#: ipam/tables/fhrp.py:28 ipam/views.py:596 ipam/views.py:696 -#: netbox/navigation/menu.py:158 netbox/navigation/menu.py:160 -#: templates/dcim/interface.html:339 templates/ipam/ipaddress_bulk_add.html:15 -#: templates/ipam/service.html:40 templates/virtualization/vminterface.html:85 -#: vpn/tables/tunnels.py:98 +#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 +#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 +#: netbox/netbox/navigation/menu.py:160 +#: netbox/templates/dcim/interface.html:339 +#: netbox/templates/ipam/ipaddress_bulk_add.html:15 +#: netbox/templates/ipam/service.html:40 +#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "IP地址" -#: dcim/tables/devices.py:564 netbox/navigation/menu.py:202 -#: templates/ipam/inc/panels/fhrp_groups.html:6 +#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "网关冗余协议组" -#: dcim/tables/devices.py:576 templates/dcim/interface.html:89 -#: templates/virtualization/vminterface.html:67 templates/vpn/tunnel.html:18 -#: templates/vpn/tunneltermination.html:13 vpn/forms/bulk_edit.py:76 -#: vpn/forms/bulk_import.py:76 vpn/forms/filtersets.py:42 -#: vpn/forms/filtersets.py:82 vpn/forms/model_forms.py:60 -#: vpn/forms/model_forms.py:145 vpn/tables/tunnels.py:78 +#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 +#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/templates/vpn/tunnel.html:18 +#: netbox/templates/vpn/tunneltermination.html:13 +#: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 +#: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 +#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "隧道" -#: dcim/tables/devices.py:604 dcim/tables/devicetypes.py:227 -#: templates/dcim/interface.html:65 +#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "仅限管理" -#: dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:623 msgid "VDCs" msgstr "VDCs" -#: dcim/tables/devices.py:873 templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "已安装的模块" -#: dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:876 msgid "Module Serial" msgstr "模块状态" -#: dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:880 msgid "Module Asset Tag" msgstr "模块资产标签" -#: dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:889 msgid "Module Status" msgstr "模块状态" -#: dcim/tables/devices.py:944 dcim/tables/devicetypes.py:312 -#: templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 +#: netbox/templates/dcim/inventoryitem.html:40 msgid "Component" msgstr "组件" -#: dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1000 msgid "Items" msgstr "项目" -#: dcim/tables/devicetypes.py:37 netbox/navigation/menu.py:84 -#: netbox/navigation/menu.py:86 +#: netbox/dcim/tables/devicetypes.py:37 netbox/netbox/navigation/menu.py:84 +#: netbox/netbox/navigation/menu.py:86 msgid "Device Types" msgstr "设备型号" -#: dcim/tables/devicetypes.py:42 netbox/navigation/menu.py:87 +#: netbox/dcim/tables/devicetypes.py:42 netbox/netbox/navigation/menu.py:87 msgid "Module Types" msgstr "设备配件类型" -#: dcim/tables/devicetypes.py:52 extras/forms/filtersets.py:371 -#: extras/forms/model_forms.py:537 extras/tables/tables.py:540 -#: netbox/navigation/menu.py:78 +#: netbox/dcim/tables/devicetypes.py:52 netbox/extras/forms/filtersets.py:371 +#: netbox/extras/forms/model_forms.py:537 netbox/extras/tables/tables.py:540 +#: netbox/netbox/navigation/menu.py:78 msgid "Platforms" msgstr "操作系统" -#: dcim/tables/devicetypes.py:84 templates/dcim/devicetype.html:29 +#: netbox/dcim/tables/devicetypes.py:84 +#: netbox/templates/dcim/devicetype.html:29 msgid "Default Platform" msgstr "默认系统平台" -#: dcim/tables/devicetypes.py:88 templates/dcim/devicetype.html:45 +#: netbox/dcim/tables/devicetypes.py:88 +#: netbox/templates/dcim/devicetype.html:45 msgid "Full Depth" msgstr "全尺寸" -#: dcim/tables/devicetypes.py:98 +#: netbox/dcim/tables/devicetypes.py:98 msgid "U Height" msgstr "U高度" -#: dcim/tables/devicetypes.py:113 dcim/tables/modules.py:26 -#: dcim/tables/racks.py:89 +#: netbox/dcim/tables/devicetypes.py:113 netbox/dcim/tables/modules.py:26 +#: netbox/dcim/tables/racks.py:89 msgid "Instances" msgstr "实例" -#: dcim/tables/devicetypes.py:116 dcim/views.py:982 dcim/views.py:1221 -#: dcim/views.py:1913 netbox/navigation/menu.py:97 -#: templates/dcim/device/base.html:25 templates/dcim/device_list.html:15 -#: templates/dcim/devicetype/base.html:22 -#: templates/dcim/inc/moduletype_buttons.html:13 templates/dcim/module.html:22 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 +#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/netbox/navigation/menu.py:97 +#: netbox/templates/dcim/device/base.html:25 +#: netbox/templates/dcim/device_list.html:15 +#: netbox/templates/dcim/devicetype/base.html:22 +#: netbox/templates/dcim/inc/moduletype_buttons.html:13 +#: netbox/templates/dcim/module.html:22 msgid "Console Ports" msgstr "Console口" -#: dcim/tables/devicetypes.py:119 dcim/views.py:997 dcim/views.py:1236 -#: dcim/views.py:1929 netbox/navigation/menu.py:98 -#: templates/dcim/device/base.html:28 templates/dcim/device_list.html:22 -#: templates/dcim/devicetype/base.html:25 -#: templates/dcim/inc/moduletype_buttons.html:16 templates/dcim/module.html:25 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 +#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/netbox/navigation/menu.py:98 +#: netbox/templates/dcim/device/base.html:28 +#: netbox/templates/dcim/device_list.html:22 +#: netbox/templates/dcim/devicetype/base.html:25 +#: netbox/templates/dcim/inc/moduletype_buttons.html:16 +#: netbox/templates/dcim/module.html:25 msgid "Console Server Ports" msgstr "Console 服务端口" -#: dcim/tables/devicetypes.py:122 dcim/views.py:1012 dcim/views.py:1251 -#: dcim/views.py:1945 netbox/navigation/menu.py:99 -#: templates/dcim/device/base.html:31 templates/dcim/device_list.html:29 -#: templates/dcim/devicetype/base.html:28 -#: templates/dcim/inc/moduletype_buttons.html:19 templates/dcim/module.html:28 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 +#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/netbox/navigation/menu.py:99 +#: netbox/templates/dcim/device/base.html:31 +#: netbox/templates/dcim/device_list.html:29 +#: netbox/templates/dcim/devicetype/base.html:28 +#: netbox/templates/dcim/inc/moduletype_buttons.html:19 +#: netbox/templates/dcim/module.html:28 msgid "Power Ports" msgstr "电源接口" -#: dcim/tables/devicetypes.py:125 dcim/views.py:1027 dcim/views.py:1266 -#: dcim/views.py:1961 netbox/navigation/menu.py:100 -#: templates/dcim/device/base.html:34 templates/dcim/device_list.html:36 -#: templates/dcim/devicetype/base.html:31 -#: templates/dcim/inc/moduletype_buttons.html:22 templates/dcim/module.html:31 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 +#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/netbox/navigation/menu.py:100 +#: netbox/templates/dcim/device/base.html:34 +#: netbox/templates/dcim/device_list.html:36 +#: netbox/templates/dcim/devicetype/base.html:31 +#: netbox/templates/dcim/inc/moduletype_buttons.html:22 +#: netbox/templates/dcim/module.html:31 msgid "Power Outlets" msgstr "PDU" -#: dcim/tables/devicetypes.py:131 dcim/views.py:1057 dcim/views.py:1296 -#: dcim/views.py:1999 netbox/navigation/menu.py:95 -#: templates/dcim/device/base.html:40 templates/dcim/devicetype/base.html:37 -#: templates/dcim/inc/moduletype_buttons.html:28 templates/dcim/module.html:37 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 +#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/netbox/navigation/menu.py:95 +#: netbox/templates/dcim/device/base.html:40 +#: netbox/templates/dcim/devicetype/base.html:37 +#: netbox/templates/dcim/inc/moduletype_buttons.html:28 +#: netbox/templates/dcim/module.html:37 msgid "Front Ports" msgstr "前置端口" -#: dcim/tables/devicetypes.py:134 dcim/views.py:1072 dcim/views.py:1311 -#: dcim/views.py:2015 netbox/navigation/menu.py:96 -#: templates/dcim/device/base.html:43 templates/dcim/device_list.html:50 -#: templates/dcim/devicetype/base.html:40 -#: templates/dcim/inc/moduletype_buttons.html:31 templates/dcim/module.html:40 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 +#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/netbox/navigation/menu.py:96 +#: netbox/templates/dcim/device/base.html:43 +#: netbox/templates/dcim/device_list.html:50 +#: netbox/templates/dcim/devicetype/base.html:40 +#: netbox/templates/dcim/inc/moduletype_buttons.html:31 +#: netbox/templates/dcim/module.html:40 msgid "Rear Ports" msgstr "后置端口" -#: dcim/tables/devicetypes.py:137 dcim/views.py:1102 dcim/views.py:2055 -#: netbox/navigation/menu.py:102 templates/dcim/device/base.html:49 -#: templates/dcim/device_list.html:57 templates/dcim/devicetype/base.html:46 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 +#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/templates/dcim/device/base.html:49 +#: netbox/templates/dcim/device_list.html:57 +#: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "机柜托架" -#: dcim/tables/devicetypes.py:140 dcim/views.py:1087 dcim/views.py:1326 -#: dcim/views.py:2035 netbox/navigation/menu.py:101 -#: templates/dcim/device/base.html:46 templates/dcim/device_list.html:64 -#: templates/dcim/devicetype/base.html:43 -#: templates/dcim/inc/moduletype_buttons.html:34 templates/dcim/module.html:43 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 +#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/netbox/navigation/menu.py:101 +#: netbox/templates/dcim/device/base.html:46 +#: netbox/templates/dcim/device_list.html:64 +#: netbox/templates/dcim/devicetype/base.html:43 +#: netbox/templates/dcim/inc/moduletype_buttons.html:34 +#: netbox/templates/dcim/module.html:43 msgid "Module Bays" msgstr "设备板卡插槽" -#: dcim/tables/power.py:36 netbox/navigation/menu.py:297 -#: templates/dcim/powerpanel.html:51 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "电力来源" -#: dcim/tables/power.py:80 templates/dcim/powerfeed.html:99 +#: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" msgstr "最大利用率" -#: dcim/tables/power.py:84 +#: netbox/dcim/tables/power.py:84 msgid "Available Power (VA)" msgstr "可用功率 (VA)" -#: dcim/tables/racks.py:30 dcim/tables/sites.py:143 -#: netbox/navigation/menu.py:43 netbox/navigation/menu.py:47 -#: netbox/navigation/menu.py:49 +#: netbox/dcim/tables/racks.py:30 netbox/dcim/tables/sites.py:143 +#: netbox/netbox/navigation/menu.py:43 netbox/netbox/navigation/menu.py:47 +#: netbox/netbox/navigation/menu.py:49 msgid "Racks" msgstr "机柜" -#: dcim/tables/racks.py:63 dcim/tables/racks.py:142 -#: templates/dcim/device.html:318 -#: templates/dcim/inc/panels/racktype_dimensions.html:14 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/templates/dcim/device.html:318 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "高度" -#: dcim/tables/racks.py:67 dcim/tables/racks.py:165 -#: templates/dcim/inc/panels/racktype_dimensions.html:18 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "外部宽度" -#: dcim/tables/racks.py:71 dcim/tables/racks.py:169 -#: templates/dcim/inc/panels/racktype_dimensions.html:28 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "外部长度/深度" -#: dcim/tables/racks.py:79 dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 msgid "Max Weight" msgstr "最大承重" -#: dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:154 msgid "Space" msgstr "空间" -#: dcim/tables/sites.py:30 dcim/tables/sites.py:57 -#: extras/forms/filtersets.py:351 extras/forms/model_forms.py:517 -#: ipam/forms/bulk_edit.py:131 ipam/forms/model_forms.py:153 -#: ipam/tables/asn.py:66 netbox/navigation/menu.py:15 -#: netbox/navigation/menu.py:17 +#: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 +#: netbox/extras/forms/filtersets.py:351 +#: netbox/extras/forms/model_forms.py:517 netbox/ipam/forms/bulk_edit.py:131 +#: netbox/ipam/forms/model_forms.py:153 netbox/ipam/tables/asn.py:66 +#: netbox/netbox/navigation/menu.py:15 netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "站点" -#: dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:47 msgid "Test case must set peer_termination_type" msgstr "测试用例必须设置对端端点类型" -#: dcim/views.py:140 +#: netbox/dcim/views.py:138 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "已断开连接{count} {type}" -#: dcim/views.py:740 netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "机柜预留" -#: dcim/views.py:759 templates/dcim/location.html:90 -#: templates/dcim/site.html:140 +#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "未上架设备" -#: dcim/views.py:2088 extras/forms/model_forms.py:577 -#: templates/extras/configcontext.html:10 -#: virtualization/forms/model_forms.py:225 virtualization/views.py:407 +#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/templates/extras/configcontext.html:10 +#: netbox/virtualization/forms/model_forms.py:225 +#: netbox/virtualization/views.py:405 msgid "Config Context" msgstr "配置实例" -#: dcim/views.py:2098 virtualization/views.py:417 +#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 msgid "Render Config" msgstr "提交配置" -#: dcim/views.py:2131 virtualization/views.py:450 +#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "渲染模板时出错: {error}" -#: dcim/views.py:2149 extras/tables/tables.py:550 -#: netbox/navigation/menu.py:247 netbox/navigation/menu.py:249 -#: virtualization/views.py:180 +#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 +#: netbox/virtualization/views.py:178 msgid "Virtual Machines" msgstr "虚拟机" -#: dcim/views.py:2907 +#: netbox/dcim/views.py:2907 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "已安装的设备 {device} 在海湾里 {device_bay}。" -#: dcim/views.py:2948 +#: netbox/dcim/views.py:2948 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "已移除的设备 {device} 来自海湾 {device_bay}。" -#: dcim/views.py:3054 ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 msgid "Children" msgstr "子网" -#: dcim/views.py:3520 +#: netbox/dcim/views.py:3520 #, python-brace-format msgid "Added member {device}" msgstr "已添加成员 {device}" -#: dcim/views.py:3567 +#: netbox/dcim/views.py:3567 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "无法移除主设备 {device} 来自虚拟机箱。" -#: dcim/views.py:3580 +#: netbox/dcim/views.py:3580 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "已移除 {device} 来自虚拟机箱 {chassis}" -#: extras/api/customfields.py:89 +#: netbox/extras/api/customfields.py:89 #, python-brace-format msgid "Unknown related object(s): {name}" msgstr "未知的相关对象: {name}" -#: extras/api/serializers_/customfields.py:73 +#: netbox/extras/api/serializers_/customfields.py:73 msgid "Changing the type of custom fields is not supported." msgstr "不支持更改自定义字段的类型。" -#: extras/api/serializers_/scripts.py:70 extras/api/serializers_/scripts.py:75 +#: netbox/extras/api/serializers_/scripts.py:70 +#: netbox/extras/api/serializers_/scripts.py:75 msgid "Scheduling is not enabled for this script." msgstr "脚本计划未启用。" -#: extras/choices.py:30 extras/forms/misc.py:14 +#: netbox/extras/choices.py:30 netbox/extras/forms/misc.py:14 msgid "Text" msgstr "文本" -#: extras/choices.py:31 +#: netbox/extras/choices.py:31 msgid "Text (long)" msgstr "长文本" -#: extras/choices.py:32 +#: netbox/extras/choices.py:32 msgid "Integer" msgstr "整数" -#: extras/choices.py:33 +#: netbox/extras/choices.py:33 msgid "Decimal" msgstr "十进制" -#: extras/choices.py:34 +#: netbox/extras/choices.py:34 msgid "Boolean (true/false)" msgstr "布尔值(true/false)" -#: extras/choices.py:35 +#: netbox/extras/choices.py:35 msgid "Date" msgstr "日期" -#: extras/choices.py:36 +#: netbox/extras/choices.py:36 msgid "Date & time" msgstr "日期&时间" -#: extras/choices.py:38 +#: netbox/extras/choices.py:38 msgid "JSON" msgstr "JSON" -#: extras/choices.py:39 +#: netbox/extras/choices.py:39 msgid "Selection" msgstr "单选框" -#: extras/choices.py:40 +#: netbox/extras/choices.py:40 msgid "Multiple selection" msgstr "复选框" -#: extras/choices.py:42 +#: netbox/extras/choices.py:42 msgid "Multiple objects" msgstr "多个对象" -#: extras/choices.py:53 netbox/preferences.py:21 -#: templates/extras/customfield.html:78 vpn/choices.py:20 -#: wireless/choices.py:27 +#: netbox/extras/choices.py:53 netbox/netbox/preferences.py:21 +#: netbox/templates/extras/customfield.html:78 netbox/vpn/choices.py:20 +#: netbox/wireless/choices.py:27 msgid "Disabled" msgstr "禁用" -#: extras/choices.py:54 +#: netbox/extras/choices.py:54 msgid "Loose" msgstr "松散匹配" -#: extras/choices.py:55 +#: netbox/extras/choices.py:55 msgid "Exact" msgstr "严格匹配" -#: extras/choices.py:66 +#: netbox/extras/choices.py:66 msgid "Always" msgstr "总是可见" -#: extras/choices.py:67 +#: netbox/extras/choices.py:67 msgid "If set" msgstr "设置才可见" -#: extras/choices.py:68 extras/choices.py:81 +#: netbox/extras/choices.py:68 netbox/extras/choices.py:81 msgid "Hidden" msgstr "隐藏" -#: extras/choices.py:79 +#: netbox/extras/choices.py:79 msgid "Yes" msgstr "是" -#: extras/choices.py:80 +#: netbox/extras/choices.py:80 msgid "No" msgstr "否" -#: extras/choices.py:108 templates/tenancy/contact.html:57 -#: tenancy/forms/bulk_edit.py:118 wireless/forms/model_forms.py:168 +#: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 +#: netbox/tenancy/forms/bulk_edit.py:118 +#: netbox/wireless/forms/model_forms.py:168 msgid "Link" msgstr "链接" -#: extras/choices.py:124 +#: netbox/extras/choices.py:124 msgid "Newest" msgstr "最新排序" -#: extras/choices.py:125 +#: netbox/extras/choices.py:125 msgid "Oldest" msgstr "最久排序" -#: extras/choices.py:126 +#: netbox/extras/choices.py:126 msgid "Alphabetical (A-Z)" msgstr "按字母顺序 (A-Z)" -#: extras/choices.py:127 +#: netbox/extras/choices.py:127 msgid "Alphabetical (Z-A)" msgstr "按字母顺序 (Z-A)" -#: extras/choices.py:144 extras/choices.py:167 +#: netbox/extras/choices.py:144 netbox/extras/choices.py:167 msgid "Info" msgstr "信息" -#: extras/choices.py:145 extras/choices.py:168 +#: netbox/extras/choices.py:145 netbox/extras/choices.py:168 msgid "Success" msgstr "成功" -#: extras/choices.py:146 extras/choices.py:169 +#: netbox/extras/choices.py:146 netbox/extras/choices.py:169 msgid "Warning" msgstr "警告" -#: extras/choices.py:147 +#: netbox/extras/choices.py:147 msgid "Danger" msgstr "危急" -#: extras/choices.py:165 +#: netbox/extras/choices.py:165 msgid "Debug" msgstr "调试" -#: extras/choices.py:166 netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 msgid "Default" msgstr "默认" -#: extras/choices.py:170 +#: netbox/extras/choices.py:170 msgid "Failure" msgstr "失败" -#: extras/choices.py:186 +#: netbox/extras/choices.py:186 msgid "Hourly" msgstr "每小时" -#: extras/choices.py:187 +#: netbox/extras/choices.py:187 msgid "12 hours" msgstr "12小时制" -#: extras/choices.py:188 +#: netbox/extras/choices.py:188 msgid "Daily" msgstr "每天" -#: extras/choices.py:189 +#: netbox/extras/choices.py:189 msgid "Weekly" msgstr "周" -#: extras/choices.py:190 +#: netbox/extras/choices.py:190 msgid "30 days" msgstr "30天" -#: extras/choices.py:226 templates/dcim/virtualchassis_edit.html:107 -#: templates/generic/bulk_add_component.html:68 -#: templates/generic/object_edit.html:47 templates/generic/object_edit.html:80 -#: templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/extras/choices.py:226 +#: netbox/templates/dcim/virtualchassis_edit.html:107 +#: netbox/templates/generic/bulk_add_component.html:68 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "创建" -#: extras/choices.py:227 +#: netbox/extras/choices.py:227 msgid "Update" msgstr "更新" -#: extras/choices.py:228 templates/circuits/inc/circuit_termination.html:23 -#: templates/dcim/inc/panels/inventory_items.html:37 -#: templates/dcim/powerpanel.html:66 templates/extras/script_list.html:35 -#: templates/generic/bulk_delete.html:20 templates/generic/bulk_delete.html:66 -#: templates/generic/object_delete.html:19 templates/htmx/delete_form.html:57 -#: templates/ipam/inc/panels/fhrp_groups.html:48 -#: templates/users/objectpermission.html:46 -#: utilities/templates/buttons/delete.html:11 +#: netbox/extras/choices.py:228 +#: netbox/templates/circuits/inc/circuit_termination.html:23 +#: netbox/templates/dcim/inc/panels/inventory_items.html:37 +#: netbox/templates/dcim/powerpanel.html:66 +#: netbox/templates/extras/script_list.html:35 +#: netbox/templates/generic/bulk_delete.html:20 +#: netbox/templates/generic/bulk_delete.html:66 +#: netbox/templates/generic/object_delete.html:19 +#: netbox/templates/htmx/delete_form.html:57 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:48 +#: netbox/templates/users/objectpermission.html:46 +#: netbox/utilities/templates/buttons/delete.html:11 msgid "Delete" msgstr "删除" -#: extras/choices.py:252 netbox/choices.py:57 netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 +#: netbox/netbox/choices.py:102 msgid "Blue" msgstr "蓝色" -#: extras/choices.py:253 netbox/choices.py:56 netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:103 msgid "Indigo" msgstr "靛青色" -#: extras/choices.py:254 netbox/choices.py:54 netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 +#: netbox/netbox/choices.py:104 msgid "Purple" msgstr "紫色" -#: extras/choices.py:255 netbox/choices.py:51 netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 +#: netbox/netbox/choices.py:105 msgid "Pink" msgstr "粉红色" -#: extras/choices.py:256 netbox/choices.py:50 netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 +#: netbox/netbox/choices.py:106 msgid "Red" msgstr "红色" -#: extras/choices.py:257 netbox/choices.py:68 netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:107 msgid "Orange" msgstr "橙色" -#: extras/choices.py:258 netbox/choices.py:66 netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 +#: netbox/netbox/choices.py:108 msgid "Yellow" msgstr "黄色" -#: extras/choices.py:259 netbox/choices.py:63 netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 +#: netbox/netbox/choices.py:109 msgid "Green" msgstr "绿色" -#: extras/choices.py:260 netbox/choices.py:60 netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 +#: netbox/netbox/choices.py:110 msgid "Teal" msgstr "蓝色" -#: extras/choices.py:261 netbox/choices.py:59 netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:111 msgid "Cyan" msgstr "蓝绿色" -#: extras/choices.py:262 netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 msgid "Gray" msgstr "灰色" -#: extras/choices.py:263 netbox/choices.py:74 netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 +#: netbox/netbox/choices.py:113 msgid "Black" msgstr "黑色" -#: extras/choices.py:264 netbox/choices.py:75 netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 +#: netbox/netbox/choices.py:114 msgid "White" msgstr "白色" -#: extras/choices.py:279 extras/forms/model_forms.py:353 -#: extras/forms/model_forms.py:430 templates/extras/webhook.html:10 +#: netbox/extras/choices.py:279 netbox/extras/forms/model_forms.py:353 +#: netbox/extras/forms/model_forms.py:430 +#: netbox/templates/extras/webhook.html:10 msgid "Webhook" msgstr "Webhook" -#: extras/choices.py:280 extras/forms/model_forms.py:418 -#: templates/extras/script/base.html:29 +#: netbox/extras/choices.py:280 netbox/extras/forms/model_forms.py:418 +#: netbox/templates/extras/script/base.html:29 msgid "Script" msgstr "脚本" -#: extras/choices.py:281 +#: netbox/extras/choices.py:281 msgid "Notification" msgstr "通知" -#: extras/conditions.py:54 +#: netbox/extras/conditions.py:54 #, python-brace-format msgid "Unknown operator: {op}. Must be one of: {operators}" msgstr "未知运算符: {op}。必须是以下项之一: {operators}" -#: extras/conditions.py:58 +#: netbox/extras/conditions.py:58 #, python-brace-format msgid "Unsupported value type: {value}" msgstr "不支持的值类型: {value}" -#: extras/conditions.py:60 +#: netbox/extras/conditions.py:60 #, python-brace-format msgid "Invalid type for {op} operation: {value}" msgstr "{op}的操作类型 {value}无效" -#: extras/conditions.py:137 +#: netbox/extras/conditions.py:137 #, python-brace-format msgid "Ruleset must be a dictionary, not {ruleset}." msgstr "规则集必须是字典,而不是 {ruleset}.。" -#: extras/conditions.py:142 +#: netbox/extras/conditions.py:142 msgid "Invalid logic type: must be 'AND' or 'OR'. Please check documentation." msgstr "无效的逻辑类型:必须是“与”或“或”中之一。请查看文档。" -#: extras/conditions.py:154 +#: netbox/extras/conditions.py:154 msgid "Incorrect key(s) informed. Please check documentation." msgstr "提供了错误的密钥。请检查文档。" -#: extras/dashboard/forms.py:38 +#: netbox/extras/dashboard/forms.py:38 msgid "Widget type" msgstr "小组件类型" -#: extras/dashboard/utils.py:36 +#: netbox/extras/dashboard/utils.py:36 #, python-brace-format msgid "Unregistered widget class: {name}" msgstr "未注册的小组件类型: {name}" -#: extras/dashboard/widgets.py:125 +#: netbox/extras/dashboard/widgets.py:125 #, python-brace-format msgid "{class_name} must define a render() method." msgstr "{class_name}必须定义render() 方法。" -#: extras/dashboard/widgets.py:144 +#: netbox/extras/dashboard/widgets.py:144 msgid "Note" msgstr "公告" -#: extras/dashboard/widgets.py:145 +#: netbox/extras/dashboard/widgets.py:145 msgid "Display some arbitrary custom content. Markdown is supported." msgstr "显示任意的自定义内容。支持Markdown。" -#: extras/dashboard/widgets.py:158 +#: netbox/extras/dashboard/widgets.py:158 msgid "Object Counts" msgstr "对象统计" -#: extras/dashboard/widgets.py:159 +#: netbox/extras/dashboard/widgets.py:159 msgid "" "Display a set of NetBox models and the number of objects created for each " "type." msgstr "显示NetBox模型以及为每种类型创建的对象数。" -#: extras/dashboard/widgets.py:169 +#: netbox/extras/dashboard/widgets.py:169 msgid "Filters to apply when counting the number of objects" msgstr "统计对象数时要应用的筛选器" -#: extras/dashboard/widgets.py:177 +#: netbox/extras/dashboard/widgets.py:177 msgid "Invalid format. Object filters must be passed as a dictionary." msgstr "无效的格式。对象筛选器必须作为字典传递。" -#: extras/dashboard/widgets.py:208 +#: netbox/extras/dashboard/widgets.py:208 msgid "Object List" msgstr "对象列表" -#: extras/dashboard/widgets.py:209 +#: netbox/extras/dashboard/widgets.py:209 msgid "Display an arbitrary list of objects." msgstr "显示任意的对象列表。" -#: extras/dashboard/widgets.py:222 +#: netbox/extras/dashboard/widgets.py:222 msgid "The default number of objects to display" msgstr "要显示的默认对象数" -#: extras/dashboard/widgets.py:234 +#: netbox/extras/dashboard/widgets.py:234 msgid "Invalid format. URL parameters must be passed as a dictionary." msgstr "无效的格式。URL参数必须作为字典传递。" -#: extras/dashboard/widgets.py:274 +#: netbox/extras/dashboard/widgets.py:274 msgid "RSS Feed" msgstr "RSS订阅" -#: extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:279 msgid "Embed an RSS feed from an external website." msgstr "嵌入来自外部网站的 RSS 源。" -#: extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:286 msgid "Feed URL" msgstr "订阅链接" -#: extras/dashboard/widgets.py:291 +#: netbox/extras/dashboard/widgets.py:291 msgid "The maximum number of objects to display" msgstr "要多显示的对象数" -#: extras/dashboard/widgets.py:296 +#: netbox/extras/dashboard/widgets.py:296 msgid "How long to stored the cached content (in seconds)" msgstr "存储缓存内容的时间(秒)" -#: extras/dashboard/widgets.py:348 templates/account/base.html:10 -#: templates/account/bookmarks.html:7 templates/inc/user_menu.html:48 +#: netbox/extras/dashboard/widgets.py:348 +#: netbox/templates/account/base.html:10 +#: netbox/templates/account/bookmarks.html:7 +#: netbox/templates/inc/user_menu.html:48 msgid "Bookmarks" msgstr "书签" -#: extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:352 msgid "Show your personal bookmarks" msgstr "显示您的个人书签" -#: extras/events.py:147 +#: netbox/extras/events.py:147 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "事件规则的未知操作类型: {action_type}" -#: extras/events.py:192 +#: netbox/extras/events.py:192 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "无法导入事件管道 {name}错误: {error}" -#: extras/filtersets.py:45 +#: netbox/extras/filtersets.py:45 msgid "Script module (ID)" msgstr "脚本模版(ID)" -#: extras/filtersets.py:254 extras/filtersets.py:637 extras/filtersets.py:665 +#: netbox/extras/filtersets.py:254 netbox/extras/filtersets.py:637 +#: netbox/extras/filtersets.py:665 msgid "Data file (ID)" msgstr "数据文件(ID)" -#: extras/filtersets.py:370 users/filtersets.py:68 users/filtersets.py:191 +#: netbox/extras/filtersets.py:370 netbox/users/filtersets.py:68 +#: netbox/users/filtersets.py:191 msgid "Group (name)" msgstr "组 (名字)" -#: extras/filtersets.py:574 virtualization/forms/filtersets.py:118 +#: netbox/extras/filtersets.py:574 +#: netbox/virtualization/forms/filtersets.py:118 msgid "Cluster type" msgstr "堆叠类型" -#: extras/filtersets.py:580 virtualization/filtersets.py:95 -#: virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 +#: netbox/virtualization/filtersets.py:147 msgid "Cluster type (slug)" msgstr "堆叠类型(缩写)" -#: extras/filtersets.py:601 tenancy/forms/forms.py:16 -#: tenancy/forms/forms.py:39 +#: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 +#: netbox/tenancy/forms/forms.py:39 msgid "Tenant group" msgstr "租户组" -#: extras/filtersets.py:607 tenancy/filtersets.py:188 -#: tenancy/filtersets.py:208 +#: netbox/extras/filtersets.py:607 netbox/tenancy/filtersets.py:188 +#: netbox/tenancy/filtersets.py:208 msgid "Tenant group (slug)" msgstr "租户组(缩写)" -#: extras/filtersets.py:623 extras/forms/model_forms.py:495 -#: templates/extras/tag.html:11 +#: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 +#: netbox/templates/extras/tag.html:11 msgid "Tag" msgstr "标签" -#: extras/filtersets.py:629 +#: netbox/extras/filtersets.py:629 msgid "Tag (slug)" msgstr "标签(缩写)" -#: extras/filtersets.py:689 extras/forms/filtersets.py:429 +#: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" msgstr "具有本地配置实例" -#: extras/forms/bulk_edit.py:35 extras/forms/filtersets.py:60 +#: netbox/extras/forms/bulk_edit.py:35 netbox/extras/forms/filtersets.py:60 msgid "Group name" msgstr "组名称" -#: extras/forms/bulk_edit.py:43 extras/forms/filtersets.py:68 -#: extras/tables/tables.py:65 templates/extras/customfield.html:38 -#: templates/generic/bulk_import.html:118 +#: netbox/extras/forms/bulk_edit.py:43 netbox/extras/forms/filtersets.py:68 +#: netbox/extras/tables/tables.py:65 +#: netbox/templates/extras/customfield.html:38 +#: netbox/templates/generic/bulk_import.html:118 msgid "Required" msgstr "必须" -#: extras/forms/bulk_edit.py:48 extras/forms/filtersets.py:75 +#: netbox/extras/forms/bulk_edit.py:48 netbox/extras/forms/filtersets.py:75 msgid "Must be unique" msgstr "必须是唯一的" -#: extras/forms/bulk_edit.py:61 extras/forms/bulk_import.py:60 -#: extras/forms/filtersets.py:89 extras/models/customfields.py:209 +#: netbox/extras/forms/bulk_edit.py:61 netbox/extras/forms/bulk_import.py:60 +#: netbox/extras/forms/filtersets.py:89 +#: netbox/extras/models/customfields.py:209 msgid "UI visible" msgstr "页面可见" -#: extras/forms/bulk_edit.py:66 extras/forms/bulk_import.py:66 -#: extras/forms/filtersets.py:94 extras/models/customfields.py:216 +#: netbox/extras/forms/bulk_edit.py:66 netbox/extras/forms/bulk_import.py:66 +#: netbox/extras/forms/filtersets.py:94 +#: netbox/extras/models/customfields.py:216 msgid "UI editable" msgstr "页面可编辑" -#: extras/forms/bulk_edit.py:71 extras/forms/filtersets.py:97 +#: netbox/extras/forms/bulk_edit.py:71 netbox/extras/forms/filtersets.py:97 msgid "Is cloneable" msgstr "可复制" -#: extras/forms/bulk_edit.py:76 extras/forms/filtersets.py:104 +#: netbox/extras/forms/bulk_edit.py:76 netbox/extras/forms/filtersets.py:104 msgid "Minimum value" msgstr "最小值" -#: extras/forms/bulk_edit.py:80 extras/forms/filtersets.py:108 +#: netbox/extras/forms/bulk_edit.py:80 netbox/extras/forms/filtersets.py:108 msgid "Maximum value" msgstr "最大值" -#: extras/forms/bulk_edit.py:84 extras/forms/filtersets.py:112 +#: netbox/extras/forms/bulk_edit.py:84 netbox/extras/forms/filtersets.py:112 msgid "Validation regex" msgstr "验证正则表达式" -#: extras/forms/bulk_edit.py:91 extras/forms/filtersets.py:46 -#: extras/forms/model_forms.py:76 templates/extras/customfield.html:70 +#: netbox/extras/forms/bulk_edit.py:91 netbox/extras/forms/filtersets.py:46 +#: netbox/extras/forms/model_forms.py:76 +#: netbox/templates/extras/customfield.html:70 msgid "Behavior" msgstr "行为" -#: extras/forms/bulk_edit.py:128 extras/forms/filtersets.py:149 +#: netbox/extras/forms/bulk_edit.py:128 netbox/extras/forms/filtersets.py:149 msgid "New window" msgstr "新窗口" -#: extras/forms/bulk_edit.py:137 +#: netbox/extras/forms/bulk_edit.py:137 msgid "Button class" msgstr "按钮类型" -#: extras/forms/bulk_edit.py:154 extras/forms/filtersets.py:187 -#: extras/models/models.py:409 +#: netbox/extras/forms/bulk_edit.py:154 netbox/extras/forms/filtersets.py:187 +#: netbox/extras/models/models.py:409 msgid "MIME type" msgstr "MIME类型" -#: extras/forms/bulk_edit.py:159 extras/forms/filtersets.py:190 +#: netbox/extras/forms/bulk_edit.py:159 netbox/extras/forms/filtersets.py:190 msgid "File extension" msgstr "文件扩展名" -#: extras/forms/bulk_edit.py:164 extras/forms/filtersets.py:194 +#: netbox/extras/forms/bulk_edit.py:164 netbox/extras/forms/filtersets.py:194 msgid "As attachment" msgstr "作为附件" -#: extras/forms/bulk_edit.py:192 extras/forms/filtersets.py:236 -#: extras/tables/tables.py:256 templates/extras/savedfilter.html:29 +#: netbox/extras/forms/bulk_edit.py:192 netbox/extras/forms/filtersets.py:236 +#: netbox/extras/tables/tables.py:256 +#: netbox/templates/extras/savedfilter.html:29 msgid "Shared" msgstr "共享性" -#: extras/forms/bulk_edit.py:215 extras/forms/filtersets.py:265 -#: extras/models/models.py:174 +#: netbox/extras/forms/bulk_edit.py:215 netbox/extras/forms/filtersets.py:265 +#: netbox/extras/models/models.py:174 msgid "HTTP method" msgstr "HTTP方法" -#: extras/forms/bulk_edit.py:219 extras/forms/filtersets.py:259 -#: templates/extras/webhook.html:30 +#: netbox/extras/forms/bulk_edit.py:219 netbox/extras/forms/filtersets.py:259 +#: netbox/templates/extras/webhook.html:30 msgid "Payload URL" msgstr "有效URL" -#: extras/forms/bulk_edit.py:224 extras/models/models.py:214 +#: netbox/extras/forms/bulk_edit.py:224 netbox/extras/models/models.py:214 msgid "SSL verification" msgstr "SSL验证" -#: extras/forms/bulk_edit.py:227 templates/extras/webhook.html:38 +#: netbox/extras/forms/bulk_edit.py:227 +#: netbox/templates/extras/webhook.html:38 msgid "Secret" msgstr "密钥" -#: extras/forms/bulk_edit.py:232 +#: netbox/extras/forms/bulk_edit.py:232 msgid "CA file path" msgstr "CA证书文件路径" -#: extras/forms/bulk_edit.py:253 extras/forms/bulk_import.py:192 -#: extras/forms/model_forms.py:377 +#: netbox/extras/forms/bulk_edit.py:253 netbox/extras/forms/bulk_import.py:192 +#: netbox/extras/forms/model_forms.py:377 msgid "Event types" msgstr "事件类型" -#: extras/forms/bulk_edit.py:293 +#: netbox/extras/forms/bulk_edit.py:293 msgid "Is active" msgstr "激活的" -#: extras/forms/bulk_import.py:37 extras/forms/bulk_import.py:118 -#: extras/forms/bulk_import.py:139 extras/forms/bulk_import.py:162 -#: extras/forms/bulk_import.py:186 extras/forms/filtersets.py:137 -#: extras/forms/filtersets.py:224 extras/forms/model_forms.py:47 -#: extras/forms/model_forms.py:205 extras/forms/model_forms.py:237 -#: extras/forms/model_forms.py:278 extras/forms/model_forms.py:372 -#: extras/forms/model_forms.py:489 users/forms/model_forms.py:276 +#: netbox/extras/forms/bulk_import.py:37 +#: netbox/extras/forms/bulk_import.py:118 +#: netbox/extras/forms/bulk_import.py:139 +#: netbox/extras/forms/bulk_import.py:162 +#: netbox/extras/forms/bulk_import.py:186 +#: netbox/extras/forms/filtersets.py:137 netbox/extras/forms/filtersets.py:224 +#: netbox/extras/forms/model_forms.py:47 +#: netbox/extras/forms/model_forms.py:205 +#: netbox/extras/forms/model_forms.py:237 +#: netbox/extras/forms/model_forms.py:278 +#: netbox/extras/forms/model_forms.py:372 +#: netbox/extras/forms/model_forms.py:489 +#: netbox/users/forms/model_forms.py:276 msgid "Object types" msgstr "对象类型" -#: extras/forms/bulk_import.py:39 extras/forms/bulk_import.py:120 -#: extras/forms/bulk_import.py:141 extras/forms/bulk_import.py:164 -#: extras/forms/bulk_import.py:188 tenancy/forms/bulk_import.py:96 +#: netbox/extras/forms/bulk_import.py:39 +#: netbox/extras/forms/bulk_import.py:120 +#: netbox/extras/forms/bulk_import.py:141 +#: netbox/extras/forms/bulk_import.py:164 +#: netbox/extras/forms/bulk_import.py:188 +#: netbox/tenancy/forms/bulk_import.py:96 msgid "One or more assigned object types" msgstr "一个或多个分配对象类型" -#: extras/forms/bulk_import.py:44 +#: netbox/extras/forms/bulk_import.py:44 msgid "Field data type (e.g. text, integer, etc.)" msgstr "字段数据类型(例如文本、整数等)" -#: extras/forms/bulk_import.py:47 extras/forms/filtersets.py:208 -#: extras/forms/filtersets.py:281 extras/forms/model_forms.py:304 -#: extras/forms/model_forms.py:341 tenancy/forms/filtersets.py:92 +#: netbox/extras/forms/bulk_import.py:47 netbox/extras/forms/filtersets.py:208 +#: netbox/extras/forms/filtersets.py:281 +#: netbox/extras/forms/model_forms.py:304 +#: netbox/extras/forms/model_forms.py:341 +#: netbox/tenancy/forms/filtersets.py:92 msgid "Object type" msgstr "对象类型" -#: extras/forms/bulk_import.py:50 +#: netbox/extras/forms/bulk_import.py:50 msgid "Object type (for object or multi-object fields)" msgstr "对象类型(用于对象或多对象字段)" -#: extras/forms/bulk_import.py:53 extras/forms/filtersets.py:84 +#: netbox/extras/forms/bulk_import.py:53 netbox/extras/forms/filtersets.py:84 msgid "Choice set" msgstr "可选项" -#: extras/forms/bulk_import.py:57 +#: netbox/extras/forms/bulk_import.py:57 msgid "Choice set (for selection fields)" msgstr "可选项(用于单选框)" -#: extras/forms/bulk_import.py:63 +#: netbox/extras/forms/bulk_import.py:63 msgid "Whether the custom field is displayed in the UI" msgstr "自定义字段是否显示在页面中" -#: extras/forms/bulk_import.py:69 +#: netbox/extras/forms/bulk_import.py:69 msgid "Whether the custom field is editable in the UI" msgstr "自定义字段在页面中是否可编辑" -#: extras/forms/bulk_import.py:85 +#: netbox/extras/forms/bulk_import.py:85 msgid "The base set of predefined choices to use (if any)" msgstr "预定义选项的基本集合(如有)" -#: extras/forms/bulk_import.py:91 +#: netbox/extras/forms/bulk_import.py:91 msgid "" "Quoted string of comma-separated field choices with optional labels " "separated by colon: \"choice1:First Choice,choice2:Second Choice\"" msgstr "用逗号分隔字段选项,可选标签用冒号分隔,并用引号包围:“选项1:第一选项,选项2:第二选项”" -#: extras/forms/bulk_import.py:123 extras/models/models.py:323 +#: netbox/extras/forms/bulk_import.py:123 netbox/extras/models/models.py:323 msgid "button class" msgstr "按钮类" -#: extras/forms/bulk_import.py:126 extras/models/models.py:327 +#: netbox/extras/forms/bulk_import.py:126 netbox/extras/models/models.py:327 msgid "" "The class of the first link in a group will be used for the dropdown button" msgstr "列表中第一个类将用于下拉按钮" -#: extras/forms/bulk_import.py:193 +#: netbox/extras/forms/bulk_import.py:193 msgid "The event type(s) which will trigger this rule" msgstr "将触发此规则的事件类型" -#: extras/forms/bulk_import.py:196 +#: netbox/extras/forms/bulk_import.py:196 msgid "Action object" msgstr "动作对象" -#: extras/forms/bulk_import.py:198 +#: netbox/extras/forms/bulk_import.py:198 msgid "Webhook name or script as dotted path module.Class" msgstr "Webhook名称或脚本的路径为module.Class" -#: extras/forms/bulk_import.py:219 +#: netbox/extras/forms/bulk_import.py:219 #, python-brace-format msgid "Webhook {name} not found" msgstr "未找到 Webhook {name}" -#: extras/forms/bulk_import.py:228 +#: netbox/extras/forms/bulk_import.py:228 #, python-brace-format msgid "Script {name} not found" msgstr "未找到脚本{name}" -#: extras/forms/bulk_import.py:244 +#: netbox/extras/forms/bulk_import.py:244 msgid "Assigned object type" msgstr "分配的对象类型" -#: extras/forms/bulk_import.py:249 +#: netbox/extras/forms/bulk_import.py:249 msgid "The classification of entry" msgstr "条目的分类" -#: extras/forms/bulk_import.py:261 extras/forms/model_forms.py:320 -#: netbox/navigation/menu.py:390 templates/extras/notificationgroup.html:41 -#: templates/users/group.html:29 users/forms/model_forms.py:236 -#: users/forms/model_forms.py:248 users/forms/model_forms.py:300 -#: users/tables.py:102 +#: netbox/extras/forms/bulk_import.py:261 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/templates/extras/notificationgroup.html:41 +#: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 +#: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 +#: netbox/users/tables.py:102 msgid "Users" msgstr "用户" -#: extras/forms/bulk_import.py:265 +#: netbox/extras/forms/bulk_import.py:265 msgid "User names separated by commas, encased with double quotes" msgstr "用户名用逗号分隔,用双引号括起来" -#: extras/forms/bulk_import.py:268 extras/forms/model_forms.py:315 -#: netbox/navigation/menu.py:410 templates/extras/notificationgroup.html:31 -#: users/forms/model_forms.py:181 users/forms/model_forms.py:193 -#: users/forms/model_forms.py:305 users/tables.py:35 users/tables.py:106 +#: netbox/extras/forms/bulk_import.py:268 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/templates/extras/notificationgroup.html:31 +#: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 +#: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 +#: netbox/users/tables.py:106 msgid "Groups" msgstr "组" -#: extras/forms/bulk_import.py:272 +#: netbox/extras/forms/bulk_import.py:272 msgid "Group names separated by commas, encased with double quotes" msgstr "群组名称用逗号分隔,用双引号括起来" -#: extras/forms/filtersets.py:52 extras/forms/model_forms.py:56 +#: netbox/extras/forms/filtersets.py:52 netbox/extras/forms/model_forms.py:56 msgid "Related object type" msgstr "连接的对象类型" -#: extras/forms/filtersets.py:57 +#: netbox/extras/forms/filtersets.py:57 msgid "Field type" msgstr "字段类型" -#: extras/forms/filtersets.py:120 extras/forms/model_forms.py:157 -#: extras/tables/tables.py:91 templates/generic/bulk_import.html:154 +#: netbox/extras/forms/filtersets.py:120 +#: netbox/extras/forms/model_forms.py:157 netbox/extras/tables/tables.py:91 +#: netbox/templates/generic/bulk_import.html:154 msgid "Choices" msgstr "选项" -#: extras/forms/filtersets.py:164 extras/forms/filtersets.py:319 -#: extras/forms/filtersets.py:408 extras/forms/model_forms.py:572 -#: templates/core/job.html:96 templates/extras/eventrule.html:84 +#: netbox/extras/forms/filtersets.py:164 netbox/extras/forms/filtersets.py:319 +#: netbox/extras/forms/filtersets.py:408 +#: netbox/extras/forms/model_forms.py:572 netbox/templates/core/job.html:96 +#: netbox/templates/extras/eventrule.html:84 msgid "Data" msgstr "数据" -#: extras/forms/filtersets.py:175 extras/forms/filtersets.py:333 -#: extras/forms/filtersets.py:418 netbox/choices.py:130 -#: utilities/forms/bulk_import.py:26 +#: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "数据文件" -#: extras/forms/filtersets.py:183 +#: netbox/extras/forms/filtersets.py:183 msgid "Content types" msgstr "内容类型" -#: extras/forms/filtersets.py:255 extras/models/models.py:179 +#: netbox/extras/forms/filtersets.py:255 netbox/extras/models/models.py:179 msgid "HTTP content type" msgstr "HTTP内容类型" -#: extras/forms/filtersets.py:286 +#: netbox/extras/forms/filtersets.py:286 msgid "Event type" msgstr "事件类型" -#: extras/forms/filtersets.py:291 +#: netbox/extras/forms/filtersets.py:291 msgid "Action type" msgstr "动作类型" -#: extras/forms/filtersets.py:307 +#: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" msgstr "标记的对象类型" -#: extras/forms/filtersets.py:312 +#: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" msgstr "允许的对象类型" -#: extras/forms/filtersets.py:341 extras/forms/model_forms.py:507 -#: netbox/navigation/menu.py:18 +#: netbox/extras/forms/filtersets.py:341 +#: netbox/extras/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:18 msgid "Regions" msgstr "地区" -#: extras/forms/filtersets.py:346 extras/forms/model_forms.py:512 +#: netbox/extras/forms/filtersets.py:346 +#: netbox/extras/forms/model_forms.py:512 msgid "Site groups" msgstr "站点组" -#: extras/forms/filtersets.py:356 extras/forms/model_forms.py:522 -#: netbox/navigation/menu.py:20 templates/dcim/site.html:127 +#: netbox/extras/forms/filtersets.py:356 +#: netbox/extras/forms/model_forms.py:522 netbox/netbox/navigation/menu.py:20 +#: netbox/templates/dcim/site.html:127 msgid "Locations" msgstr "位置" -#: extras/forms/filtersets.py:361 extras/forms/model_forms.py:527 +#: netbox/extras/forms/filtersets.py:361 +#: netbox/extras/forms/model_forms.py:527 msgid "Device types" msgstr "设备型号" -#: extras/forms/filtersets.py:366 extras/forms/model_forms.py:532 +#: netbox/extras/forms/filtersets.py:366 +#: netbox/extras/forms/model_forms.py:532 msgid "Roles" msgstr "角色" -#: extras/forms/filtersets.py:376 extras/forms/model_forms.py:542 +#: netbox/extras/forms/filtersets.py:376 +#: netbox/extras/forms/model_forms.py:542 msgid "Cluster types" msgstr "集群类型" -#: extras/forms/filtersets.py:381 extras/forms/model_forms.py:547 +#: netbox/extras/forms/filtersets.py:381 +#: netbox/extras/forms/model_forms.py:547 msgid "Cluster groups" msgstr "集群组" -#: extras/forms/filtersets.py:386 extras/forms/model_forms.py:552 -#: netbox/navigation/menu.py:255 netbox/navigation/menu.py:257 -#: templates/virtualization/clustertype.html:30 -#: virtualization/tables/clusters.py:23 virtualization/tables/clusters.py:45 +#: netbox/extras/forms/filtersets.py:386 +#: netbox/extras/forms/model_forms.py:552 netbox/netbox/navigation/menu.py:255 +#: netbox/netbox/navigation/menu.py:257 +#: netbox/templates/virtualization/clustertype.html:30 +#: netbox/virtualization/tables/clusters.py:23 +#: netbox/virtualization/tables/clusters.py:45 msgid "Clusters" msgstr "集群" -#: extras/forms/filtersets.py:391 extras/forms/model_forms.py:557 +#: netbox/extras/forms/filtersets.py:391 +#: netbox/extras/forms/model_forms.py:557 msgid "Tenant groups" msgstr "租户组" -#: extras/forms/model_forms.py:49 +#: netbox/extras/forms/model_forms.py:49 msgid "The type(s) of object that have this custom field" msgstr "具有此自定义字段的对象的类型" -#: extras/forms/model_forms.py:52 +#: netbox/extras/forms/model_forms.py:52 msgid "Default value" msgstr "默认值" -#: extras/forms/model_forms.py:58 +#: netbox/extras/forms/model_forms.py:58 msgid "Type of the related object (for object/multi-object fields only)" msgstr "相关对象的类型(仅适用于对象/多对象字段)" -#: extras/forms/model_forms.py:61 templates/extras/customfield.html:60 +#: netbox/extras/forms/model_forms.py:61 +#: netbox/templates/extras/customfield.html:60 msgid "Related object filter" msgstr "相关对象过滤器" -#: extras/forms/model_forms.py:63 +#: netbox/extras/forms/model_forms.py:63 msgid "Specify query parameters as a JSON object." msgstr "将查询参数指定为 JSON 对象。" -#: extras/forms/model_forms.py:73 templates/extras/customfield.html:10 +#: netbox/extras/forms/model_forms.py:73 +#: netbox/templates/extras/customfield.html:10 msgid "Custom Field" msgstr "自定义字段" -#: extras/forms/model_forms.py:85 +#: netbox/extras/forms/model_forms.py:85 msgid "" "The type of data stored in this field. For object/multi-object fields, " "select the related object type below." msgstr "存储在此字段中的数据类型。对于对象/多对象字段,请选择下面的相关对象类型。" -#: extras/forms/model_forms.py:88 +#: netbox/extras/forms/model_forms.py:88 msgid "" "This will be displayed as help text for the form field. Markdown is " "supported." msgstr "这将显示为表单字段的帮助文本。支持Markdown。" -#: extras/forms/model_forms.py:143 +#: netbox/extras/forms/model_forms.py:143 msgid "Related Object" msgstr "相关对象" -#: extras/forms/model_forms.py:169 +#: netbox/extras/forms/model_forms.py:169 msgid "" "Enter one choice per line. An optional label may be specified for each " "choice by appending it with a colon. Example:" msgstr "每行输入一个选项。可以为每个选项指定一个可选标签,方法是在其后面附加一个冒号。例如:" -#: extras/forms/model_forms.py:212 templates/extras/customlink.html:10 +#: netbox/extras/forms/model_forms.py:212 +#: netbox/templates/extras/customlink.html:10 msgid "Custom Link" msgstr "自定义链接" -#: extras/forms/model_forms.py:214 +#: netbox/extras/forms/model_forms.py:214 msgid "Templates" msgstr "模版" -#: extras/forms/model_forms.py:226 +#: netbox/extras/forms/model_forms.py:226 #, python-brace-format msgid "" "Jinja2 template code for the link text. Reference the object as {example}. " "Links which render as empty text will not be displayed." msgstr "用于链接的Jinja2模板代码。将对象引用为{example}。空链接将不会显示。" -#: extras/forms/model_forms.py:230 +#: netbox/extras/forms/model_forms.py:230 #, python-brace-format msgid "" "Jinja2 template code for the link URL. Reference the object as {example}." msgstr "URL链接的Jinja2模板代码。将对象引用为 {example}。" -#: extras/forms/model_forms.py:241 extras/forms/model_forms.py:624 +#: netbox/extras/forms/model_forms.py:241 +#: netbox/extras/forms/model_forms.py:624 msgid "Template code" msgstr "模版代码" -#: extras/forms/model_forms.py:247 templates/extras/exporttemplate.html:12 +#: netbox/extras/forms/model_forms.py:247 +#: netbox/templates/extras/exporttemplate.html:12 msgid "Export Template" msgstr "导出模版" -#: extras/forms/model_forms.py:249 +#: netbox/extras/forms/model_forms.py:249 msgid "Rendering" msgstr "转换" -#: extras/forms/model_forms.py:263 extras/forms/model_forms.py:649 +#: netbox/extras/forms/model_forms.py:263 +#: netbox/extras/forms/model_forms.py:649 msgid "Template content is populated from the remote source selected below." msgstr "模板内容是从下面选择的远程源填充的。" -#: extras/forms/model_forms.py:270 extras/forms/model_forms.py:656 +#: netbox/extras/forms/model_forms.py:270 +#: netbox/extras/forms/model_forms.py:656 msgid "Must specify either local content or a data file" msgstr "必须指定本地内容或数据文件" -#: extras/forms/model_forms.py:284 netbox/forms/mixins.py:70 -#: templates/extras/savedfilter.html:10 +#: netbox/extras/forms/model_forms.py:284 netbox/netbox/forms/mixins.py:70 +#: netbox/templates/extras/savedfilter.html:10 msgid "Saved Filter" msgstr "已保存的过滤器" -#: extras/forms/model_forms.py:334 +#: netbox/extras/forms/model_forms.py:334 msgid "A notification group specify at least one user or group." msgstr "通知组至少指定一个用户或组。" -#: extras/forms/model_forms.py:356 templates/extras/webhook.html:23 +#: netbox/extras/forms/model_forms.py:356 +#: netbox/templates/extras/webhook.html:23 msgid "HTTP Request" msgstr "HTTP 请求" -#: extras/forms/model_forms.py:358 templates/extras/webhook.html:44 +#: netbox/extras/forms/model_forms.py:358 +#: netbox/templates/extras/webhook.html:44 msgid "SSL" msgstr "SSL" -#: extras/forms/model_forms.py:380 +#: netbox/extras/forms/model_forms.py:380 msgid "Action choice" msgstr "选择动作" -#: extras/forms/model_forms.py:385 +#: netbox/extras/forms/model_forms.py:385 msgid "Enter conditions in JSON format." msgstr "已JSON格式输入条件。" -#: extras/forms/model_forms.py:389 +#: netbox/extras/forms/model_forms.py:389 msgid "" "Enter parameters to pass to the action in JSON format." msgstr "输入以 JSON格式传递的参数。" -#: extras/forms/model_forms.py:394 templates/extras/eventrule.html:10 +#: netbox/extras/forms/model_forms.py:394 +#: netbox/templates/extras/eventrule.html:10 msgid "Event Rule" msgstr "事件规则" -#: extras/forms/model_forms.py:395 +#: netbox/extras/forms/model_forms.py:395 msgid "Triggers" msgstr "触发器" -#: extras/forms/model_forms.py:442 +#: netbox/extras/forms/model_forms.py:442 msgid "Notification group" msgstr "通知组" -#: extras/forms/model_forms.py:562 netbox/navigation/menu.py:26 -#: tenancy/tables/tenants.py:22 +#: netbox/extras/forms/model_forms.py:562 netbox/netbox/navigation/menu.py:26 +#: netbox/tenancy/tables/tenants.py:22 msgid "Tenants" msgstr "租户" -#: extras/forms/model_forms.py:606 +#: netbox/extras/forms/model_forms.py:606 msgid "Data is populated from the remote source selected below." msgstr "数据是从下面选择的远程源填充的。" -#: extras/forms/model_forms.py:612 +#: netbox/extras/forms/model_forms.py:612 msgid "Must specify either local data or a data file" msgstr "必须指定本地内容或数据文件" -#: extras/forms/model_forms.py:631 templates/core/datafile.html:55 +#: netbox/extras/forms/model_forms.py:631 +#: netbox/templates/core/datafile.html:55 msgid "Content" msgstr "内容" -#: extras/forms/reports.py:17 extras/forms/scripts.py:23 +#: netbox/extras/forms/reports.py:17 netbox/extras/forms/scripts.py:23 msgid "Schedule at" msgstr "计划在" -#: extras/forms/reports.py:18 +#: netbox/extras/forms/reports.py:18 msgid "Schedule execution of report to a set time" msgstr "在指定的时间执行报告" -#: extras/forms/reports.py:23 extras/forms/scripts.py:29 +#: netbox/extras/forms/reports.py:23 netbox/extras/forms/scripts.py:29 msgid "Recurs every" msgstr "重复间隔" -#: extras/forms/reports.py:27 +#: netbox/extras/forms/reports.py:27 msgid "Interval at which this report is re-run (in minutes)" msgstr "重新运行此报表的间隔(分钟)" -#: extras/forms/reports.py:35 extras/forms/scripts.py:41 +#: netbox/extras/forms/reports.py:35 netbox/extras/forms/scripts.py:41 #, python-brace-format msgid " (current time: {now})" msgstr " (当前时间: {now})" -#: extras/forms/reports.py:45 extras/forms/scripts.py:51 +#: netbox/extras/forms/reports.py:45 netbox/extras/forms/scripts.py:51 msgid "Scheduled time must be in the future." msgstr "预定时间需设置在当前时间之后。" -#: extras/forms/scripts.py:17 +#: netbox/extras/forms/scripts.py:17 msgid "Commit changes" msgstr "提交更改" -#: extras/forms/scripts.py:18 +#: netbox/extras/forms/scripts.py:18 msgid "Commit changes to the database (uncheck for a dry-run)" msgstr "提交对数据库的更改(取消选中以进行试运行)" -#: extras/forms/scripts.py:24 +#: netbox/extras/forms/scripts.py:24 msgid "Schedule execution of script to a set time" msgstr "在指定的时间执行脚本" -#: extras/forms/scripts.py:33 +#: netbox/extras/forms/scripts.py:33 msgid "Interval at which this script is re-run (in minutes)" msgstr "重新运行此脚本的间隔(分钟)" -#: extras/jobs.py:47 +#: netbox/extras/jobs.py:47 msgid "Database changes have been reverted automatically." msgstr "数据库更改已自动恢复。" -#: extras/jobs.py:53 +#: netbox/extras/jobs.py:53 msgid "Script aborted with error: " msgstr "脚本因错误而中止:" -#: extras/jobs.py:63 +#: netbox/extras/jobs.py:63 msgid "An exception occurred: " msgstr "出现异常:" -#: extras/jobs.py:68 +#: netbox/extras/jobs.py:68 msgid "Database changes have been reverted due to error." msgstr "由于出现错误,数据库更改已回滚。" -#: extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:66 msgid "No indexers found!" msgstr "找不到索引!" -#: extras/models/configs.py:130 +#: netbox/extras/models/configs.py:130 msgid "config context" msgstr "配置实例" -#: extras/models/configs.py:131 +#: netbox/extras/models/configs.py:131 msgid "config contexts" msgstr "配置实例" -#: extras/models/configs.py:149 extras/models/configs.py:205 +#: netbox/extras/models/configs.py:149 netbox/extras/models/configs.py:205 msgid "JSON data must be in object form. Example:" msgstr "JSON数据必须为对象形式。例如:" -#: extras/models/configs.py:169 +#: netbox/extras/models/configs.py:169 msgid "" "Local config context data takes precedence over source contexts in the final" " rendered config context" msgstr "在最终渲染的配置实例中,本地配置实例数据优先于数据源中的实力" -#: extras/models/configs.py:224 +#: netbox/extras/models/configs.py:224 msgid "template code" msgstr "模版代码" -#: extras/models/configs.py:225 +#: netbox/extras/models/configs.py:225 msgid "Jinja2 template code." msgstr "Jinja2模版代码" -#: extras/models/configs.py:228 +#: netbox/extras/models/configs.py:228 msgid "environment parameters" msgstr "环境参数" -#: extras/models/configs.py:233 +#: netbox/extras/models/configs.py:233 msgid "" "Any additional" @@ -7485,135 +8056,135 @@ msgstr "" "构建Jinja2环境时要传递的 附加参数" -#: extras/models/configs.py:240 +#: netbox/extras/models/configs.py:240 msgid "config template" msgstr "配置模版" -#: extras/models/configs.py:241 +#: netbox/extras/models/configs.py:241 msgid "config templates" msgstr "配置模版" -#: extras/models/customfields.py:75 +#: netbox/extras/models/customfields.py:75 msgid "The object(s) to which this field applies." msgstr "此字段所应用的对象。" -#: extras/models/customfields.py:82 +#: netbox/extras/models/customfields.py:82 msgid "The type of data this custom field holds" msgstr "该自定义字段保存的数据类型" -#: extras/models/customfields.py:89 +#: netbox/extras/models/customfields.py:89 msgid "The type of NetBox object this field maps to (for object fields)" msgstr "此字段映射到的NetBox对象的类型(对于对象字段)" -#: extras/models/customfields.py:95 +#: netbox/extras/models/customfields.py:95 msgid "Internal field name" msgstr "内部字段名称" -#: extras/models/customfields.py:99 +#: netbox/extras/models/customfields.py:99 msgid "Only alphanumeric characters and underscores are allowed." msgstr "仅允许输入英文字符、数字和下划线。" -#: extras/models/customfields.py:104 +#: netbox/extras/models/customfields.py:104 msgid "Double underscores are not permitted in custom field names." msgstr "自定义字段名称中不允许使用双下划线。" -#: extras/models/customfields.py:115 +#: netbox/extras/models/customfields.py:115 msgid "" "Name of the field as displayed to users (if not provided, 'the field's name " "will be used)" msgstr "向用户显示的字段名称(如果未提供,则使用字段名称)" -#: extras/models/customfields.py:119 extras/models/models.py:317 +#: netbox/extras/models/customfields.py:119 netbox/extras/models/models.py:317 msgid "group name" msgstr "组名称" -#: extras/models/customfields.py:122 +#: netbox/extras/models/customfields.py:122 msgid "Custom fields within the same group will be displayed together" msgstr "同一组内的自定义字段将一起显示" -#: extras/models/customfields.py:130 +#: netbox/extras/models/customfields.py:130 msgid "required" msgstr "必须" -#: extras/models/customfields.py:132 +#: netbox/extras/models/customfields.py:132 msgid "" "This field is required when creating new objects or editing an existing " "object." msgstr "创建新对象或编辑现有对象时,此字段是必填字段。" -#: extras/models/customfields.py:135 +#: netbox/extras/models/customfields.py:135 msgid "must be unique" msgstr "必须是唯一的" -#: extras/models/customfields.py:137 +#: netbox/extras/models/customfields.py:137 msgid "The value of this field must be unique for the assigned object" msgstr "对于分配的对象,该字段的值必须是唯一的" -#: extras/models/customfields.py:140 +#: netbox/extras/models/customfields.py:140 msgid "search weight" msgstr "搜索权重" -#: extras/models/customfields.py:143 +#: netbox/extras/models/customfields.py:143 msgid "" "Weighting for search. Lower values are considered more important. Fields " "with a search weight of zero will be ignored." msgstr "搜索权重。值越低越被有限搜索。权重为零的字段将被忽略搜索。" -#: extras/models/customfields.py:148 +#: netbox/extras/models/customfields.py:148 msgid "filter logic" msgstr "过滤器规则" -#: extras/models/customfields.py:152 +#: netbox/extras/models/customfields.py:152 msgid "" "Loose matches any instance of a given string; exact matches the entire " "field." msgstr "松散匹配是匹配字段中的任意位置;严格匹配是与整个字段完全匹配。" -#: extras/models/customfields.py:155 +#: netbox/extras/models/customfields.py:155 msgid "default" msgstr "默认" -#: extras/models/customfields.py:159 +#: netbox/extras/models/customfields.py:159 msgid "" "Default value for the field (must be a JSON value). Encapsulate strings with" " double quotes (e.g. \"Foo\")." msgstr "字段的默认值(必须是JSON值)。字符串要包含在双引号中(例如“Foo”)。" -#: extras/models/customfields.py:166 +#: netbox/extras/models/customfields.py:166 msgid "" "Filter the object selection choices using a query_params dict (must be a " "JSON value).Encapsulate strings with double quotes (e.g. \"Foo\")." msgstr "使用 query_params 字典(必须是 JSON 值)筛选对象选择选项。用双引号(例如 “Foo”)封装字符串。" -#: extras/models/customfields.py:172 +#: netbox/extras/models/customfields.py:172 msgid "display weight" msgstr "显示权重" -#: extras/models/customfields.py:173 +#: netbox/extras/models/customfields.py:173 msgid "Fields with higher weights appear lower in a form." msgstr "权重约高的字段在页面中显示得位置越低。" -#: extras/models/customfields.py:178 +#: netbox/extras/models/customfields.py:178 msgid "minimum value" msgstr "最小值" -#: extras/models/customfields.py:179 +#: netbox/extras/models/customfields.py:179 msgid "Minimum allowed value (for numeric fields)" msgstr "允许的最小值(对于数字字段)" -#: extras/models/customfields.py:184 +#: netbox/extras/models/customfields.py:184 msgid "maximum value" msgstr "最大值" -#: extras/models/customfields.py:185 +#: netbox/extras/models/customfields.py:185 msgid "Maximum allowed value (for numeric fields)" msgstr "允许的最大值(对于数字字段)" -#: extras/models/customfields.py:191 +#: netbox/extras/models/customfields.py:191 msgid "validation regex" msgstr "验证正则表达式" -#: extras/models/customfields.py:193 +#: netbox/extras/models/customfields.py:193 #, python-brace-format msgid "" "Regular expression to enforce on text field values. Use ^ and $ to force " @@ -7623,250 +8194,252 @@ msgstr "" "要在文本字段值上强制执行的正则表达式。使用^和$可以强制匹配整个字符串。例如, " "^[A-Z]{3}$将限制值只能有三个大写字母。" -#: extras/models/customfields.py:201 +#: netbox/extras/models/customfields.py:201 msgid "choice set" msgstr "可选项" -#: extras/models/customfields.py:210 +#: netbox/extras/models/customfields.py:210 msgid "Specifies whether the custom field is displayed in the UI" msgstr "是否在UI中显示此字段" -#: extras/models/customfields.py:217 +#: netbox/extras/models/customfields.py:217 msgid "Specifies whether the custom field value can be edited in the UI" msgstr "是否在UI中可编辑此字段" -#: extras/models/customfields.py:221 +#: netbox/extras/models/customfields.py:221 msgid "is cloneable" msgstr "可复制" -#: extras/models/customfields.py:222 +#: netbox/extras/models/customfields.py:222 msgid "Replicate this value when cloning objects" msgstr "复制对象时同时复制此值" -#: extras/models/customfields.py:239 +#: netbox/extras/models/customfields.py:239 msgid "custom field" msgstr "自定义字段" -#: extras/models/customfields.py:240 +#: netbox/extras/models/customfields.py:240 msgid "custom fields" msgstr "自定义字段" -#: extras/models/customfields.py:329 +#: netbox/extras/models/customfields.py:329 #, python-brace-format msgid "Invalid default value \"{value}\": {error}" msgstr "无效的默认值:“{value}”:{error}" -#: extras/models/customfields.py:336 +#: netbox/extras/models/customfields.py:336 msgid "A minimum value may be set only for numeric fields" msgstr "只能为数字字段设置最小值" -#: extras/models/customfields.py:338 +#: netbox/extras/models/customfields.py:338 msgid "A maximum value may be set only for numeric fields" msgstr "只能为数字字段设置最大值" -#: extras/models/customfields.py:348 +#: netbox/extras/models/customfields.py:348 msgid "" "Regular expression validation is supported only for text and URL fields" msgstr "仅对文本和URL字段支持正则表达式验证" -#: extras/models/customfields.py:354 +#: netbox/extras/models/customfields.py:354 msgid "Uniqueness cannot be enforced for boolean fields" msgstr "无法强制布尔字段的唯一性" -#: extras/models/customfields.py:364 +#: netbox/extras/models/customfields.py:364 msgid "Selection fields must specify a set of choices." msgstr "选择字段必须指定一组可用选项。" -#: extras/models/customfields.py:368 +#: netbox/extras/models/customfields.py:368 msgid "Choices may be set only on selection fields." msgstr "只能在选择字段上设置选项。" -#: extras/models/customfields.py:375 +#: netbox/extras/models/customfields.py:375 msgid "Object fields must define an object type." msgstr "对象字段必须定义对象类型。" -#: extras/models/customfields.py:379 +#: netbox/extras/models/customfields.py:379 #, python-brace-format msgid "{type} fields may not define an object type." msgstr "{type}字段不能定义对象类型。" -#: extras/models/customfields.py:386 +#: netbox/extras/models/customfields.py:386 msgid "A related object filter can be defined only for object fields." msgstr "只能为对象字段定义相关对象过滤器。" -#: extras/models/customfields.py:390 +#: netbox/extras/models/customfields.py:390 msgid "Filter must be defined as a dictionary mapping attributes to values." msgstr "过滤器必须定义为将属性映射到值的字典。" -#: extras/models/customfields.py:469 +#: netbox/extras/models/customfields.py:469 msgid "True" msgstr "是" -#: extras/models/customfields.py:470 +#: netbox/extras/models/customfields.py:470 msgid "False" msgstr "否" -#: extras/models/customfields.py:560 +#: netbox/extras/models/customfields.py:560 #, python-brace-format msgid "Values must match this regex: {regex}" msgstr "值必须与此正则表达式匹配: {regex}" -#: extras/models/customfields.py:654 +#: netbox/extras/models/customfields.py:654 msgid "Value must be a string." msgstr "值必须为字符串" -#: extras/models/customfields.py:656 +#: netbox/extras/models/customfields.py:656 #, python-brace-format msgid "Value must match regex '{regex}'" msgstr "值必须与正则表达式'{regex}'匹配" -#: extras/models/customfields.py:661 +#: netbox/extras/models/customfields.py:661 msgid "Value must be an integer." msgstr "值必须是整数。" -#: extras/models/customfields.py:664 extras/models/customfields.py:679 +#: netbox/extras/models/customfields.py:664 +#: netbox/extras/models/customfields.py:679 #, python-brace-format msgid "Value must be at least {minimum}" msgstr "值最少为{minimum}" -#: extras/models/customfields.py:668 extras/models/customfields.py:683 +#: netbox/extras/models/customfields.py:668 +#: netbox/extras/models/customfields.py:683 #, python-brace-format msgid "Value must not exceed {maximum}" msgstr "值最大为{maximum}" -#: extras/models/customfields.py:676 +#: netbox/extras/models/customfields.py:676 msgid "Value must be a decimal." msgstr "值必须是十进制。" -#: extras/models/customfields.py:688 +#: netbox/extras/models/customfields.py:688 msgid "Value must be true or false." msgstr "值必须为true或false。" -#: extras/models/customfields.py:696 +#: netbox/extras/models/customfields.py:696 msgid "Date values must be in ISO 8601 format (YYYY-MM-DD)." msgstr "日期格式必须为 ISO 8601 格式(YYYY-MM-DD)." -#: extras/models/customfields.py:705 +#: netbox/extras/models/customfields.py:705 msgid "Date and time values must be in ISO 8601 format (YYYY-MM-DD HH:MM:SS)." msgstr "日期和时间必须遵循 ISO 8601 格式 (YYYY-MM-DD HH:MM:SS)." -#: extras/models/customfields.py:712 +#: netbox/extras/models/customfields.py:712 #, python-brace-format msgid "Invalid choice ({value}) for choice set {choiceset}." msgstr "选项集{choiceset}的选项({value})无效。" -#: extras/models/customfields.py:722 +#: netbox/extras/models/customfields.py:722 #, python-brace-format msgid "Invalid choice(s) ({value}) for choice set {choiceset}." msgstr "选项集{choiceset}的选项({value})无效。" -#: extras/models/customfields.py:731 +#: netbox/extras/models/customfields.py:731 #, python-brace-format msgid "Value must be an object ID, not {type}" msgstr "值必须为对象ID, 不是 {type}" -#: extras/models/customfields.py:737 +#: netbox/extras/models/customfields.py:737 #, python-brace-format msgid "Value must be a list of object IDs, not {type}" msgstr "值必须为对象ID的列表,不是 {type}" -#: extras/models/customfields.py:741 +#: netbox/extras/models/customfields.py:741 #, python-brace-format msgid "Found invalid object ID: {id}" msgstr "发现错误的对象ID: {id}" -#: extras/models/customfields.py:744 +#: netbox/extras/models/customfields.py:744 msgid "Required field cannot be empty." msgstr "必填字段不能为空。" -#: extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:763 msgid "Base set of predefined choices (optional)" msgstr "预定义选项的基本集合(可选)" -#: extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:775 msgid "Choices are automatically ordered alphabetically" msgstr "选项会自动按字母顺序排列" -#: extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:782 msgid "custom field choice set" msgstr "自定义字段选择集" -#: extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice sets" msgstr "自定义字段选择集" -#: extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:825 msgid "Must define base or extra choices." msgstr "必须定义基本选项或额外选项。" -#: extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:849 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " "it." msgstr "无法删除选择 {choice} 正如有 {model} 引用它的对象。" -#: extras/models/dashboard.py:18 +#: netbox/extras/models/dashboard.py:18 msgid "layout" msgstr "布局" -#: extras/models/dashboard.py:22 +#: netbox/extras/models/dashboard.py:22 msgid "config" msgstr "配置" -#: extras/models/dashboard.py:27 +#: netbox/extras/models/dashboard.py:27 msgid "dashboard" msgstr "仪表盘" -#: extras/models/dashboard.py:28 +#: netbox/extras/models/dashboard.py:28 msgid "dashboards" msgstr "仪表盘" -#: extras/models/models.py:52 +#: netbox/extras/models/models.py:52 msgid "object types" msgstr "对象类型" -#: extras/models/models.py:53 +#: netbox/extras/models/models.py:53 msgid "The object(s) to which this rule applies." msgstr "应用此规则的对象。" -#: extras/models/models.py:67 +#: netbox/extras/models/models.py:67 msgid "The types of event which will trigger this rule." msgstr "将触发此规则的事件类型。" -#: extras/models/models.py:74 +#: netbox/extras/models/models.py:74 msgid "conditions" msgstr "限制条件" -#: extras/models/models.py:77 +#: netbox/extras/models/models.py:77 msgid "" "A set of conditions which determine whether the event will be generated." msgstr "一组条件,用于确定是否会生成事件。" -#: extras/models/models.py:85 +#: netbox/extras/models/models.py:85 msgid "action type" msgstr "动作类型" -#: extras/models/models.py:104 +#: netbox/extras/models/models.py:104 msgid "Additional data to pass to the action object" msgstr "要传递给动作对象的其他数据" -#: extras/models/models.py:116 +#: netbox/extras/models/models.py:116 msgid "event rule" msgstr "事件规则" -#: extras/models/models.py:117 +#: netbox/extras/models/models.py:117 msgid "event rules" msgstr "事件规则" -#: extras/models/models.py:166 +#: netbox/extras/models/models.py:166 msgid "" "This URL will be called using the HTTP method defined when the webhook is " "called. Jinja2 template processing is supported with the same context as the" " request body." msgstr "此URL将使用调用webhook时定义的HTTP方法进行调用。Jinja2模板处理支持与请求主体相同的描述。" -#: extras/models/models.py:181 +#: netbox/extras/models/models.py:181 msgid "" "The complete list of official content types is available 点击这里." -#: extras/models/models.py:186 +#: netbox/extras/models/models.py:186 msgid "additional headers" msgstr "附加标头" -#: extras/models/models.py:189 +#: netbox/extras/models/models.py:189 msgid "" "User-supplied HTTP headers to be sent with the request in addition to the " "HTTP content type. Headers should be defined in the format Name: " @@ -7889,11 +8462,11 @@ msgstr "" "除了HTTP内容类型之外,还要与请求一起发送用户提供的HTTP标头。标头的定义格式应为 名称: 值. " "Jinja2模板处理支持与请求主体相同的实例(如下)。" -#: extras/models/models.py:195 +#: netbox/extras/models/models.py:195 msgid "body template" msgstr "内容模版" -#: extras/models/models.py:198 +#: netbox/extras/models/models.py:198 msgid "" "Jinja2 template for a custom request body. If blank, a JSON object " "representing the change will be included. Available context data includes: " @@ -7904,11 +8477,11 @@ msgstr "" "模块, 时间戳, 用户名, 请求id, 和 " "数据." -#: extras/models/models.py:204 +#: netbox/extras/models/models.py:204 msgid "secret" msgstr "秘钥" -#: extras/models/models.py:208 +#: netbox/extras/models/models.py:208 msgid "" "When provided, the request will include a X-Hook-Signature " "header containing a HMAC hex digest of the payload body using the secret as " @@ -7917,4253 +8490,4441 @@ msgstr "" "当提供时,请求将包括一个X-Hook-Signature " "该标头包含使用机密作为密钥的有效载荷主体的HMAC十六进制摘要。秘钥不会在请求中传输。" -#: extras/models/models.py:215 +#: netbox/extras/models/models.py:215 msgid "Enable SSL certificate verification. Disable with caution!" msgstr "启用 SSL 证书验证。请谨慎禁用!" -#: extras/models/models.py:221 templates/extras/webhook.html:51 +#: netbox/extras/models/models.py:221 netbox/templates/extras/webhook.html:51 msgid "CA File Path" msgstr "CA证书文件路径" -#: extras/models/models.py:223 +#: netbox/extras/models/models.py:223 msgid "" "The specific CA certificate file to use for SSL verification. Leave blank to" " use the system defaults." msgstr "用于SSL验证的CA证书文件。空为使用系统默认值。" -#: extras/models/models.py:234 +#: netbox/extras/models/models.py:234 msgid "webhook" msgstr "webhook" -#: extras/models/models.py:235 +#: netbox/extras/models/models.py:235 msgid "webhooks" msgstr "webhooks" -#: extras/models/models.py:253 +#: netbox/extras/models/models.py:253 msgid "Do not specify a CA certificate file if SSL verification is disabled." msgstr "如果禁用了SSL验证,请不要指定CA证书文件。" -#: extras/models/models.py:293 +#: netbox/extras/models/models.py:293 msgid "The object type(s) to which this link applies." msgstr "此链接所应用的对象类型。" -#: extras/models/models.py:305 +#: netbox/extras/models/models.py:305 msgid "link text" msgstr "链接文本" -#: extras/models/models.py:306 +#: netbox/extras/models/models.py:306 msgid "Jinja2 template code for link text" msgstr "链接文本的Jinja2模板代码" -#: extras/models/models.py:309 +#: netbox/extras/models/models.py:309 msgid "link URL" msgstr "链接URL" -#: extras/models/models.py:310 +#: netbox/extras/models/models.py:310 msgid "Jinja2 template code for link URL" msgstr "链接URL的Jinja2模板代码" -#: extras/models/models.py:320 +#: netbox/extras/models/models.py:320 msgid "Links with the same group will appear as a dropdown menu" msgstr "同一类的链接将显示为下拉菜单" -#: extras/models/models.py:330 +#: netbox/extras/models/models.py:330 msgid "new window" msgstr "新窗口" -#: extras/models/models.py:332 +#: netbox/extras/models/models.py:332 msgid "Force link to open in a new window" msgstr "强制链接在新窗口中打开" -#: extras/models/models.py:341 +#: netbox/extras/models/models.py:341 msgid "custom link" msgstr "自定义链接" -#: extras/models/models.py:342 +#: netbox/extras/models/models.py:342 msgid "custom links" msgstr "自定义链接" -#: extras/models/models.py:389 +#: netbox/extras/models/models.py:389 msgid "The object type(s) to which this template applies." msgstr "应用此模板的对象类型。" -#: extras/models/models.py:402 +#: netbox/extras/models/models.py:402 msgid "" "Jinja2 template code. The list of objects being exported is passed as a " "context variable named queryset." msgstr "Jinja2模板代码。要导出的对象列表作为queryset的实例变量传递." -#: extras/models/models.py:410 +#: netbox/extras/models/models.py:410 msgid "Defaults to text/plain; charset=utf-8" msgstr "默认为text/plain; charset=utf-8" -#: extras/models/models.py:413 +#: netbox/extras/models/models.py:413 msgid "file extension" msgstr "文件扩展名" -#: extras/models/models.py:416 +#: netbox/extras/models/models.py:416 msgid "Extension to append to the rendered filename" msgstr "附加到文件名的扩展名" -#: extras/models/models.py:419 +#: netbox/extras/models/models.py:419 msgid "as attachment" msgstr "作为附件" -#: extras/models/models.py:421 +#: netbox/extras/models/models.py:421 msgid "Download file as attachment" msgstr "将文件作为附件下载" -#: extras/models/models.py:430 +#: netbox/extras/models/models.py:430 msgid "export template" msgstr "导出模版" -#: extras/models/models.py:431 +#: netbox/extras/models/models.py:431 msgid "export templates" msgstr "导出模版" -#: extras/models/models.py:448 +#: netbox/extras/models/models.py:448 #, python-brace-format msgid "\"{name}\" is a reserved name. Please choose a different name." msgstr "\"{name}\"是保留名称。请选择其他名称。" -#: extras/models/models.py:498 +#: netbox/extras/models/models.py:498 msgid "The object type(s) to which this filter applies." msgstr "应用此筛选器的对象类型。" -#: extras/models/models.py:530 +#: netbox/extras/models/models.py:530 msgid "shared" msgstr "共享性" -#: extras/models/models.py:543 +#: netbox/extras/models/models.py:543 msgid "saved filter" msgstr "已保存的过滤器" -#: extras/models/models.py:544 +#: netbox/extras/models/models.py:544 msgid "saved filters" msgstr "已保存的过滤器" -#: extras/models/models.py:562 +#: netbox/extras/models/models.py:562 msgid "Filter parameters must be stored as a dictionary of keyword arguments." msgstr "筛选器参数必须存储为关键字参数的字典。" -#: extras/models/models.py:590 +#: netbox/extras/models/models.py:590 msgid "image height" msgstr "图片高度" -#: extras/models/models.py:593 +#: netbox/extras/models/models.py:593 msgid "image width" msgstr "图片宽度" -#: extras/models/models.py:610 +#: netbox/extras/models/models.py:610 msgid "image attachment" msgstr "图片附件" -#: extras/models/models.py:611 +#: netbox/extras/models/models.py:611 msgid "image attachments" msgstr "图片附件" -#: extras/models/models.py:625 +#: netbox/extras/models/models.py:625 #, python-brace-format msgid "Image attachments cannot be assigned to this object type ({type})." msgstr "无法将图片附件分配给此对象类型({type})." -#: extras/models/models.py:688 +#: netbox/extras/models/models.py:688 msgid "kind" msgstr "类型" -#: extras/models/models.py:702 +#: netbox/extras/models/models.py:702 msgid "journal entry" msgstr "日志条目" -#: extras/models/models.py:703 +#: netbox/extras/models/models.py:703 msgid "journal entries" msgstr "日志条目" -#: extras/models/models.py:718 +#: netbox/extras/models/models.py:718 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "此对象类型({type})不支持备忘。" -#: extras/models/models.py:760 +#: netbox/extras/models/models.py:760 msgid "bookmark" msgstr "书签" -#: extras/models/models.py:761 +#: netbox/extras/models/models.py:761 msgid "bookmarks" msgstr "书签" -#: extras/models/models.py:774 +#: netbox/extras/models/models.py:774 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "无法将书签分配给此对象类型({type})。" -#: extras/models/notifications.py:43 +#: netbox/extras/models/notifications.py:43 msgid "read" msgstr "读" -#: extras/models/notifications.py:66 +#: netbox/extras/models/notifications.py:66 msgid "event" msgstr "事件" -#: extras/models/notifications.py:84 +#: netbox/extras/models/notifications.py:84 msgid "notification" msgstr "通知" -#: extras/models/notifications.py:85 +#: netbox/extras/models/notifications.py:85 msgid "notifications" msgstr "通知" -#: extras/models/notifications.py:99 extras/models/notifications.py:234 +#: netbox/extras/models/notifications.py:99 +#: netbox/extras/models/notifications.py:234 #, python-brace-format msgid "Objects of this type ({type}) do not support notifications." msgstr "这种类型的对象 ({type}) 不支持通知。" -#: extras/models/notifications.py:137 users/models/users.py:58 -#: users/models/users.py:77 +#: netbox/extras/models/notifications.py:137 netbox/users/models/users.py:58 +#: netbox/users/models/users.py:77 msgid "groups" msgstr "组" -#: extras/models/notifications.py:143 users/models/users.py:93 +#: netbox/extras/models/notifications.py:143 netbox/users/models/users.py:93 msgid "users" msgstr "用户" -#: extras/models/notifications.py:152 +#: netbox/extras/models/notifications.py:152 msgid "notification group" msgstr "通知组" -#: extras/models/notifications.py:153 +#: netbox/extras/models/notifications.py:153 msgid "notification groups" msgstr "通知组" -#: extras/models/notifications.py:217 +#: netbox/extras/models/notifications.py:217 msgid "subscription" msgstr "订阅" -#: extras/models/notifications.py:218 +#: netbox/extras/models/notifications.py:218 msgid "subscriptions" msgstr "订阅" -#: extras/models/scripts.py:42 +#: netbox/extras/models/scripts.py:42 msgid "is executable" msgstr "是可执行的" -#: extras/models/scripts.py:64 +#: netbox/extras/models/scripts.py:64 msgid "script" msgstr "脚本" -#: extras/models/scripts.py:65 +#: netbox/extras/models/scripts.py:65 msgid "scripts" msgstr "脚本" -#: extras/models/scripts.py:111 +#: netbox/extras/models/scripts.py:111 msgid "script module" msgstr "脚本模块" -#: extras/models/scripts.py:112 +#: netbox/extras/models/scripts.py:112 msgid "script modules" msgstr "脚本模块" -#: extras/models/search.py:22 +#: netbox/extras/models/search.py:22 msgid "timestamp" msgstr "时间戳" -#: extras/models/search.py:37 +#: netbox/extras/models/search.py:37 msgid "field" msgstr "字段" -#: extras/models/search.py:45 +#: netbox/extras/models/search.py:45 msgid "value" msgstr "值" -#: extras/models/search.py:56 +#: netbox/extras/models/search.py:56 msgid "cached value" msgstr "缓存的值" -#: extras/models/search.py:57 +#: netbox/extras/models/search.py:57 msgid "cached values" msgstr "缓存的值" -#: extras/models/staging.py:44 +#: netbox/extras/models/staging.py:44 msgid "branch" msgstr "分支" -#: extras/models/staging.py:45 +#: netbox/extras/models/staging.py:45 msgid "branches" msgstr "分支" -#: extras/models/staging.py:97 +#: netbox/extras/models/staging.py:97 msgid "staged change" msgstr "暂存变更" -#: extras/models/staging.py:98 +#: netbox/extras/models/staging.py:98 msgid "staged changes" msgstr "暂存变更" -#: extras/models/tags.py:40 +#: netbox/extras/models/tags.py:40 msgid "The object type(s) to which this tag can be applied." msgstr "可以应用此标记的对象类型。" -#: extras/models/tags.py:49 +#: netbox/extras/models/tags.py:49 msgid "tag" msgstr "标签" -#: extras/models/tags.py:50 +#: netbox/extras/models/tags.py:50 msgid "tags" msgstr "标签" -#: extras/models/tags.py:78 +#: netbox/extras/models/tags.py:78 msgid "tagged item" msgstr "标记的项目" -#: extras/models/tags.py:79 +#: netbox/extras/models/tags.py:79 msgid "tagged items" msgstr "标记的项目" -#: extras/scripts.py:429 +#: netbox/extras/scripts.py:429 msgid "Script Data" msgstr "脚本数据" -#: extras/scripts.py:433 +#: netbox/extras/scripts.py:433 msgid "Script Execution Parameters" msgstr "脚本执行参数" -#: extras/tables/columns.py:12 templates/htmx/notifications.html:18 +#: netbox/extras/tables/columns.py:12 +#: netbox/templates/htmx/notifications.html:18 msgid "Dismiss" msgstr "解雇" -#: extras/tables/tables.py:62 extras/tables/tables.py:159 -#: extras/tables/tables.py:184 extras/tables/tables.py:250 -#: extras/tables/tables.py:276 extras/tables/tables.py:412 -#: extras/tables/tables.py:446 templates/extras/customfield.html:105 -#: templates/extras/eventrule.html:27 templates/users/objectpermission.html:64 -#: users/tables.py:80 +#: netbox/extras/tables/tables.py:62 netbox/extras/tables/tables.py:159 +#: netbox/extras/tables/tables.py:184 netbox/extras/tables/tables.py:250 +#: netbox/extras/tables/tables.py:276 netbox/extras/tables/tables.py:412 +#: netbox/extras/tables/tables.py:446 +#: netbox/templates/extras/customfield.html:105 +#: netbox/templates/extras/eventrule.html:27 +#: netbox/templates/users/objectpermission.html:64 netbox/users/tables.py:80 msgid "Object Types" msgstr "对象类型" -#: extras/tables/tables.py:69 +#: netbox/extras/tables/tables.py:69 msgid "Validate Uniqueness" msgstr "验证唯一性" -#: extras/tables/tables.py:73 +#: netbox/extras/tables/tables.py:73 msgid "Visible" msgstr "可见" -#: extras/tables/tables.py:76 +#: netbox/extras/tables/tables.py:76 msgid "Editable" msgstr "可编辑" -#: extras/tables/tables.py:82 +#: netbox/extras/tables/tables.py:82 msgid "Related Object Type" msgstr "相关对象类型" -#: extras/tables/tables.py:86 templates/extras/customfield.html:51 +#: netbox/extras/tables/tables.py:86 +#: netbox/templates/extras/customfield.html:51 msgid "Choice Set" msgstr "选项集" -#: extras/tables/tables.py:94 +#: netbox/extras/tables/tables.py:94 msgid "Is Cloneable" msgstr "可复制" -#: extras/tables/tables.py:98 templates/extras/customfield.html:118 +#: netbox/extras/tables/tables.py:98 +#: netbox/templates/extras/customfield.html:118 msgid "Minimum Value" msgstr "最小值" -#: extras/tables/tables.py:101 templates/extras/customfield.html:122 +#: netbox/extras/tables/tables.py:101 +#: netbox/templates/extras/customfield.html:122 msgid "Maximum Value" msgstr "最大值" -#: extras/tables/tables.py:104 +#: netbox/extras/tables/tables.py:104 msgid "Validation Regex" msgstr "验证正则表达式" -#: extras/tables/tables.py:137 +#: netbox/extras/tables/tables.py:137 msgid "Count" msgstr "计数" -#: extras/tables/tables.py:140 +#: netbox/extras/tables/tables.py:140 msgid "Order Alphabetically" msgstr "按字母顺序排列" -#: extras/tables/tables.py:165 templates/extras/customlink.html:33 +#: netbox/extras/tables/tables.py:165 +#: netbox/templates/extras/customlink.html:33 msgid "New Window" msgstr "新窗口" -#: extras/tables/tables.py:187 +#: netbox/extras/tables/tables.py:187 msgid "As Attachment" msgstr "作为附件" -#: extras/tables/tables.py:195 extras/tables/tables.py:487 -#: extras/tables/tables.py:522 templates/core/datafile.html:24 -#: templates/dcim/device/render_config.html:22 -#: templates/extras/configcontext.html:39 -#: templates/extras/configtemplate.html:31 -#: templates/extras/exporttemplate.html:45 -#: templates/generic/bulk_import.html:35 -#: templates/virtualization/virtualmachine/render_config.html:22 +#: netbox/extras/tables/tables.py:195 netbox/extras/tables/tables.py:487 +#: netbox/extras/tables/tables.py:522 netbox/templates/core/datafile.html:24 +#: netbox/templates/dcim/device/render_config.html:22 +#: netbox/templates/extras/configcontext.html:39 +#: netbox/templates/extras/configtemplate.html:31 +#: netbox/templates/extras/exporttemplate.html:45 +#: netbox/templates/generic/bulk_import.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:22 msgid "Data File" msgstr "数据文件" -#: extras/tables/tables.py:200 extras/tables/tables.py:499 -#: extras/tables/tables.py:527 +#: netbox/extras/tables/tables.py:200 netbox/extras/tables/tables.py:499 +#: netbox/extras/tables/tables.py:527 msgid "Synced" msgstr "同步" -#: extras/tables/tables.py:227 +#: netbox/extras/tables/tables.py:227 msgid "Image" msgstr "图片" -#: extras/tables/tables.py:232 +#: netbox/extras/tables/tables.py:232 msgid "Size (Bytes)" msgstr "大小 (Bytes)" -#: extras/tables/tables.py:339 +#: netbox/extras/tables/tables.py:339 msgid "Read" msgstr "阅读" -#: extras/tables/tables.py:382 +#: netbox/extras/tables/tables.py:382 msgid "SSL Validation" msgstr "SSL验证" -#: extras/tables/tables.py:418 templates/extras/eventrule.html:37 +#: netbox/extras/tables/tables.py:418 +#: netbox/templates/extras/eventrule.html:37 msgid "Event Types" msgstr "事件类型" -#: extras/tables/tables.py:535 netbox/navigation/menu.py:77 -#: templates/dcim/devicerole.html:8 +#: netbox/extras/tables/tables.py:535 netbox/netbox/navigation/menu.py:77 +#: netbox/templates/dcim/devicerole.html:8 msgid "Device Roles" msgstr "设备角色" -#: extras/tables/tables.py:587 +#: netbox/extras/tables/tables.py:587 msgid "Comments (Short)" msgstr "评论(简短)" -#: extras/tables/tables.py:606 extras/tables/tables.py:640 +#: netbox/extras/tables/tables.py:606 netbox/extras/tables/tables.py:640 msgid "Line" msgstr "线" -#: extras/tables/tables.py:613 extras/tables/tables.py:650 +#: netbox/extras/tables/tables.py:613 netbox/extras/tables/tables.py:650 msgid "Level" msgstr "等级" -#: extras/tables/tables.py:619 extras/tables/tables.py:659 +#: netbox/extras/tables/tables.py:619 netbox/extras/tables/tables.py:659 msgid "Message" msgstr "信息" -#: extras/tables/tables.py:643 +#: netbox/extras/tables/tables.py:643 msgid "Method" msgstr "方法" -#: extras/validators.py:15 +#: netbox/extras/validators.py:15 #, python-format msgid "Ensure this value is equal to %(limit_value)s." msgstr "请确保值等于 %(limit_value)s." -#: extras/validators.py:26 +#: netbox/extras/validators.py:26 #, python-format msgid "Ensure this value does not equal %(limit_value)s." msgstr "请确保值不等于 %(limit_value)s." -#: extras/validators.py:37 +#: netbox/extras/validators.py:37 msgid "This field must be empty." msgstr "此字段必须为空" -#: extras/validators.py:52 +#: netbox/extras/validators.py:52 msgid "This field must not be empty." msgstr "此字段必须不为空" -#: extras/validators.py:94 +#: netbox/extras/validators.py:94 msgid "Validation rules must be passed as a dictionary" msgstr "验证规则必须以字典形式传递" -#: extras/validators.py:119 +#: netbox/extras/validators.py:119 #, python-brace-format msgid "Custom validation failed for {attribute}: {exception}" msgstr "{attribute} 的自定义验证失败:{exception}" -#: extras/validators.py:133 +#: netbox/extras/validators.py:133 #, python-brace-format msgid "Invalid attribute \"{name}\" for request" msgstr "请求的属性“{name}”无效" -#: extras/validators.py:150 +#: netbox/extras/validators.py:150 #, python-brace-format msgid "Invalid attribute \"{name}\" for {model}" msgstr "{model}的属性 \"{name}\"无效" -#: extras/views.py:960 +#: netbox/extras/views.py:960 msgid "Your dashboard has been reset." msgstr "仪表盘已重置。" -#: extras/views.py:1006 +#: netbox/extras/views.py:1006 msgid "Added widget: " msgstr "添加小组件:" -#: extras/views.py:1047 +#: netbox/extras/views.py:1047 msgid "Updated widget: " msgstr "更新小组件:" -#: extras/views.py:1083 +#: netbox/extras/views.py:1083 msgid "Deleted widget: " msgstr "删除小组件:" -#: extras/views.py:1085 +#: netbox/extras/views.py:1085 msgid "Error deleting widget: " msgstr "删除小组件错误:" -#: extras/views.py:1172 +#: netbox/extras/views.py:1175 msgid "Unable to run script: RQ worker process not running." msgstr "无法运行脚本:RQ worker 进程未运行。" -#: ipam/api/field_serializers.py:17 +#: netbox/ipam/api/field_serializers.py:17 msgid "Enter a valid IPv4 or IPv6 address with optional mask." msgstr "输入有效的 IPv4 或 IPv6 地址以及可选掩码。" -#: ipam/api/field_serializers.py:24 +#: netbox/ipam/api/field_serializers.py:24 #, python-brace-format msgid "Invalid IP address format: {data}" msgstr "IP 地址格式无效: {data}" -#: ipam/api/field_serializers.py:37 +#: netbox/ipam/api/field_serializers.py:37 msgid "Enter a valid IPv4 or IPv6 prefix and mask in CIDR notation." msgstr "请输入有效的IPv4或IPv6前缀和掩码(格式为 CIDR)。" -#: ipam/api/field_serializers.py:44 +#: netbox/ipam/api/field_serializers.py:44 #, python-brace-format msgid "Invalid IP prefix format: {data}" msgstr "无效的IP前缀格式: {data}" -#: ipam/api/views.py:358 +#: netbox/ipam/api/views.py:358 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "可用 IP 不足,无法容纳此请求的前缀大小" -#: ipam/choices.py:30 +#: netbox/ipam/choices.py:30 msgid "Container" msgstr "容器" -#: ipam/choices.py:72 +#: netbox/ipam/choices.py:72 msgid "DHCP" msgstr "DHCP" -#: ipam/choices.py:73 +#: netbox/ipam/choices.py:73 msgid "SLAAC" msgstr "SLAAC" -#: ipam/choices.py:89 +#: netbox/ipam/choices.py:89 msgid "Loopback" msgstr "Loopback" -#: ipam/choices.py:91 +#: netbox/ipam/choices.py:91 msgid "Anycast" msgstr "Anycast" -#: ipam/choices.py:115 +#: netbox/ipam/choices.py:115 msgid "Standard" msgstr "标准的" -#: ipam/choices.py:120 +#: netbox/ipam/choices.py:120 msgid "CheckPoint" msgstr "检查点" -#: ipam/choices.py:123 +#: netbox/ipam/choices.py:123 msgid "Cisco" msgstr "思科" -#: ipam/choices.py:137 +#: netbox/ipam/choices.py:137 msgid "Plaintext" msgstr "明文" -#: ipam/fields.py:36 +#: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "IP 地址格式无效: {address}" -#: ipam/filtersets.py:48 vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "引入target" -#: ipam/filtersets.py:54 vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "引入target(名称)" -#: ipam/filtersets.py:59 vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "输出target" -#: ipam/filtersets.py:65 vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "输出target(名称)" -#: ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:86 msgid "Importing VRF" msgstr "导入VRF" -#: ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:92 msgid "Import VRF (RD)" msgstr "导入 VRF (RD)" -#: ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:97 msgid "Exporting VRF" msgstr "导出 VRF" -#: ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:103 msgid "Export VRF (RD)" msgstr "导出 VRF (RD)" -#: ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:108 msgid "Importing L2VPN" msgstr "导入 L2VPN" -#: ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:114 msgid "Importing L2VPN (identifier)" msgstr "导入 L2VPN (identifier)" -#: ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:119 msgid "Exporting L2VPN" msgstr "导出 L2VPN" -#: ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:125 msgid "Exporting L2VPN (identifier)" msgstr "导出L2VPN(标识符)" -#: ipam/filtersets.py:155 ipam/filtersets.py:281 ipam/forms/model_forms.py:229 -#: ipam/tables/ip.py:212 templates/ipam/prefix.html:12 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "前缀" -#: ipam/filtersets.py:159 ipam/filtersets.py:198 ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 +#: netbox/ipam/filtersets.py:221 msgid "RIR (ID)" msgstr "RIR(ID)" -#: ipam/filtersets.py:165 ipam/filtersets.py:204 ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 +#: netbox/ipam/filtersets.py:227 msgid "RIR (slug)" msgstr "RIP(缩写)" -#: ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:285 msgid "Within prefix" msgstr "此前缀包含的" -#: ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:289 msgid "Within and including prefix" msgstr "此前缀包含的(包含此前缀)" -#: ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:293 msgid "Prefixes which contain this prefix or IP" msgstr "包含此前缀或IP的前缀" -#: ipam/filtersets.py:304 ipam/filtersets.py:572 ipam/forms/bulk_edit.py:343 -#: ipam/forms/filtersets.py:196 ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 +#: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "掩码长度" -#: ipam/filtersets.py:373 vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: ipam/filtersets.py:377 vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN 号(1-4094)" -#: ipam/filtersets.py:471 ipam/filtersets.py:475 ipam/filtersets.py:567 -#: ipam/forms/model_forms.py:463 templates/tenancy/contact.html:53 -#: tenancy/forms/bulk_edit.py:113 +#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 +#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/templates/tenancy/contact.html:53 +#: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "地址" -#: ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:479 msgid "Ranges which contain this prefix or IP" msgstr "包含此前缀或IP的范围" -#: ipam/filtersets.py:507 ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 msgid "Parent prefix" msgstr "上级前缀" -#: ipam/filtersets.py:616 ipam/filtersets.py:856 ipam/filtersets.py:1131 -#: vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 +#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "虚拟机(名称)" -#: ipam/filtersets.py:621 ipam/filtersets.py:861 ipam/filtersets.py:1125 -#: virtualization/filtersets.py:282 virtualization/filtersets.py:321 -#: vpn/filtersets.py:390 +#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 +#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "虚拟机(ID)" -#: ipam/filtersets.py:627 vpn/filtersets.py:97 vpn/filtersets.py:396 +#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "接口(名称)" -#: ipam/filtersets.py:638 vpn/filtersets.py:108 vpn/filtersets.py:407 +#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "虚拟接口(名称)" -#: ipam/filtersets.py:643 vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "虚拟接口(ID)" -#: ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:648 msgid "FHRP group (ID)" msgstr "FHRP 组 (ID)" -#: ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:652 msgid "Is assigned to an interface" msgstr "分配给接口" -#: ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:656 msgid "Is assigned" msgstr "已分配" -#: ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:668 msgid "Service (ID)" msgstr "服务 (ID)" -#: ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:673 msgid "NAT inside IP address (ID)" msgstr "NAT 内部 IP 地址 (ID)" -#: ipam/filtersets.py:1041 ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "分配的接口" -#: ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1046 msgid "Assigned VM interface" msgstr "分配的虚拟机接口" -#: ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1136 msgid "IP address (ID)" msgstr "IP 地址 (ID)" -#: ipam/filtersets.py:1142 ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP 地址" -#: ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1167 msgid "Primary IPv4 (ID)" msgstr "首选 IPv4(ID)" -#: ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1172 msgid "Primary IPv6 (ID)" msgstr "首选IPv6(ID)" -#: ipam/formfields.py:14 +#: netbox/ipam/formfields.py:14 msgid "Enter a valid IPv4 or IPv6 address (without a mask)." msgstr "输入有效的 IPv4 或 IPv6 地址(不带掩码)。" -#: ipam/formfields.py:32 +#: netbox/ipam/formfields.py:32 #, python-brace-format msgid "Invalid IPv4/IPv6 address format: {address}" msgstr "IPv4/IPv6 地址格式无效:{address}" -#: ipam/formfields.py:37 +#: netbox/ipam/formfields.py:37 msgid "This field requires an IP address without a mask." msgstr "该字段需要一个不带掩码的 IP 地址。" -#: ipam/formfields.py:39 ipam/formfields.py:61 +#: netbox/ipam/formfields.py:39 netbox/ipam/formfields.py:61 msgid "Please specify a valid IPv4 or IPv6 address." msgstr "请指定有效的 IPv4 或 IPv6 地址。" -#: ipam/formfields.py:44 +#: netbox/ipam/formfields.py:44 msgid "Enter a valid IPv4 or IPv6 address (with CIDR mask)." msgstr "输入有效的 IPv4 或 IPv6 地址(带有 CIDR 掩码)。" -#: ipam/formfields.py:56 +#: netbox/ipam/formfields.py:56 msgid "CIDR mask (e.g. /24) is required." msgstr "需要 CIDR 掩码(例如/24)" -#: ipam/forms/bulk_create.py:13 +#: netbox/ipam/forms/bulk_create.py:13 msgid "Address pattern" msgstr "地址模式" -#: ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:50 msgid "Enforce unique space" msgstr "强制使用唯一空间" -#: ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:88 msgid "Is private" msgstr "私有的" -#: ipam/forms/bulk_edit.py:109 ipam/forms/bulk_edit.py:138 -#: ipam/forms/bulk_edit.py:163 ipam/forms/bulk_import.py:89 -#: ipam/forms/bulk_import.py:109 ipam/forms/bulk_import.py:129 -#: ipam/forms/filtersets.py:110 ipam/forms/filtersets.py:125 -#: ipam/forms/filtersets.py:148 ipam/forms/model_forms.py:96 -#: ipam/forms/model_forms.py:109 ipam/forms/model_forms.py:131 -#: ipam/forms/model_forms.py:149 ipam/models/asns.py:31 -#: ipam/models/asns.py:103 ipam/models/ip.py:71 ipam/models/ip.py:90 -#: ipam/tables/asn.py:20 ipam/tables/asn.py:45 -#: templates/ipam/aggregate.html:18 templates/ipam/asn.html:27 -#: templates/ipam/asnrange.html:19 templates/ipam/rir.html:19 +#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 +#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 +#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 +#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 +#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 +#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 +#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 +#: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 +#: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "区域互联网注册管理机构" -#: ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:171 msgid "Date added" msgstr "添加日期" -#: ipam/forms/bulk_edit.py:229 ipam/forms/model_forms.py:586 -#: ipam/forms/model_forms.py:633 ipam/tables/ip.py:251 -#: templates/ipam/vlan_edit.html:37 templates/ipam/vlangroup.html:27 +#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 +#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 +#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "VLAN组" -#: ipam/forms/bulk_edit.py:234 ipam/forms/bulk_import.py:185 -#: ipam/forms/filtersets.py:256 ipam/forms/model_forms.py:218 -#: ipam/models/vlans.py:250 ipam/tables/ip.py:255 -#: templates/ipam/prefix.html:60 templates/ipam/vlan.html:12 -#: templates/ipam/vlan/base.html:6 templates/ipam/vlan_edit.html:10 -#: templates/wireless/wirelesslan.html:30 vpn/forms/bulk_import.py:304 -#: vpn/forms/filtersets.py:284 vpn/forms/model_forms.py:433 -#: vpn/forms/model_forms.py:452 wireless/forms/bulk_edit.py:55 -#: wireless/forms/bulk_import.py:48 wireless/forms/model_forms.py:48 -#: wireless/models.py:102 +#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 +#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 +#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 +#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/templates/ipam/vlan/base.html:6 +#: netbox/templates/ipam/vlan_edit.html:10 +#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 +#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 +#: netbox/wireless/forms/bulk_edit.py:55 +#: netbox/wireless/forms/bulk_import.py:48 +#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 msgid "VLAN" msgstr "VLAN" -#: ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:245 msgid "Prefix length" msgstr "前缀长度" -#: ipam/forms/bulk_edit.py:268 ipam/forms/filtersets.py:241 -#: templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 +#: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" msgstr "是一个池" -#: ipam/forms/bulk_edit.py:273 ipam/forms/bulk_edit.py:318 -#: ipam/forms/filtersets.py:248 ipam/forms/filtersets.py:293 -#: ipam/models/ip.py:272 ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 +#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 +#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 msgid "Treat as fully utilized" msgstr "设置为已被全部占用" -#: ipam/forms/bulk_edit.py:287 ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 msgid "VLAN Assignment" msgstr "VLAN 分配" -#: ipam/forms/bulk_edit.py:366 ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "DNS 名称" -#: ipam/forms/bulk_edit.py:387 ipam/forms/bulk_edit.py:534 -#: ipam/forms/bulk_import.py:394 ipam/forms/bulk_import.py:469 -#: ipam/forms/bulk_import.py:495 ipam/forms/filtersets.py:390 -#: ipam/forms/filtersets.py:530 templates/ipam/fhrpgroup.html:22 -#: templates/ipam/inc/panels/fhrp_groups.html:24 -#: templates/ipam/service.html:32 templates/ipam/servicetemplate.html:19 +#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 +#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 +#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 +#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 +#: netbox/templates/ipam/service.html:32 +#: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "协议" -#: ipam/forms/bulk_edit.py:394 ipam/forms/filtersets.py:397 -#: ipam/tables/fhrp.py:22 templates/ipam/fhrpgroup.html:26 +#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "组 ID" -#: ipam/forms/bulk_edit.py:399 ipam/forms/filtersets.py:402 -#: wireless/forms/bulk_edit.py:68 wireless/forms/bulk_edit.py:115 -#: wireless/forms/bulk_import.py:62 wireless/forms/bulk_import.py:65 -#: wireless/forms/bulk_import.py:104 wireless/forms/bulk_import.py:107 -#: wireless/forms/filtersets.py:54 wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 +#: netbox/wireless/forms/bulk_edit.py:68 +#: netbox/wireless/forms/bulk_edit.py:115 +#: netbox/wireless/forms/bulk_import.py:62 +#: netbox/wireless/forms/bulk_import.py:65 +#: netbox/wireless/forms/bulk_import.py:104 +#: netbox/wireless/forms/bulk_import.py:107 +#: netbox/wireless/forms/filtersets.py:54 +#: netbox/wireless/forms/filtersets.py:88 msgid "Authentication type" msgstr "认证类型" -#: ipam/forms/bulk_edit.py:404 ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 msgid "Authentication key" msgstr "认证秘钥" -#: ipam/forms/bulk_edit.py:421 ipam/forms/filtersets.py:383 -#: ipam/forms/model_forms.py:474 netbox/navigation/menu.py:386 -#: templates/ipam/fhrpgroup.html:49 -#: templates/wireless/inc/authentication_attrs.html:5 -#: wireless/forms/bulk_edit.py:91 wireless/forms/bulk_edit.py:149 -#: wireless/forms/filtersets.py:36 wireless/forms/filtersets.py:76 -#: wireless/forms/model_forms.py:55 wireless/forms/model_forms.py:171 +#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 +#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/templates/ipam/fhrpgroup.html:49 +#: netbox/templates/wireless/inc/authentication_attrs.html:5 +#: netbox/wireless/forms/bulk_edit.py:91 +#: netbox/wireless/forms/bulk_edit.py:149 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:76 +#: netbox/wireless/forms/model_forms.py:55 +#: netbox/wireless/forms/model_forms.py:171 msgid "Authentication" msgstr "身份验证" -#: ipam/forms/bulk_edit.py:436 ipam/forms/model_forms.py:575 +#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 msgid "Scope type" msgstr "作用域类型" -#: ipam/forms/bulk_edit.py:439 ipam/forms/bulk_edit.py:453 -#: ipam/forms/model_forms.py:578 ipam/forms/model_forms.py:588 -#: ipam/tables/vlans.py:71 templates/ipam/vlangroup.html:38 +#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 +#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 msgid "Scope" msgstr "作用域" -#: ipam/forms/bulk_edit.py:446 ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 msgid "VLAN ID ranges" msgstr "VLAN ID 范围" -#: ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:525 msgid "Site & Group" msgstr "站点 & 组" -#: ipam/forms/bulk_edit.py:539 ipam/forms/model_forms.py:659 -#: ipam/forms/model_forms.py:691 ipam/tables/services.py:19 -#: ipam/tables/services.py:49 templates/ipam/service.html:36 -#: templates/ipam/servicetemplate.html:23 +#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 +#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 +#: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "端口" -#: ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:48 msgid "Import route targets" msgstr "导入的 Route Targets" -#: ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:54 msgid "Export route targets" msgstr "导出的Route Targets" -#: ipam/forms/bulk_import.py:92 ipam/forms/bulk_import.py:112 -#: ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 +#: netbox/ipam/forms/bulk_import.py:132 msgid "Assigned RIR" msgstr "指定的 RIR" -#: ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:182 msgid "VLAN's group (if any)" msgstr "VLAN 组(若存在)" -#: ipam/forms/bulk_import.py:308 +#: netbox/ipam/forms/bulk_import.py:308 msgid "Parent device of assigned interface (if any)" msgstr "指定接口的父设备(如果有)" -#: ipam/forms/bulk_import.py:311 ipam/forms/bulk_import.py:488 -#: ipam/forms/model_forms.py:685 virtualization/filtersets.py:288 -#: virtualization/filtersets.py:327 virtualization/forms/bulk_edit.py:200 -#: virtualization/forms/bulk_edit.py:326 -#: virtualization/forms/bulk_import.py:146 -#: virtualization/forms/bulk_import.py:207 -#: virtualization/forms/filtersets.py:212 -#: virtualization/forms/filtersets.py:248 -#: virtualization/forms/model_forms.py:288 vpn/forms/bulk_import.py:93 -#: vpn/forms/bulk_import.py:290 +#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 +#: netbox/ipam/forms/model_forms.py:718 +#: netbox/virtualization/filtersets.py:288 +#: netbox/virtualization/filtersets.py:327 +#: netbox/virtualization/forms/bulk_edit.py:200 +#: netbox/virtualization/forms/bulk_edit.py:326 +#: netbox/virtualization/forms/bulk_import.py:146 +#: netbox/virtualization/forms/bulk_import.py:207 +#: netbox/virtualization/forms/filtersets.py:212 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/virtualization/forms/model_forms.py:288 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "虚拟机" -#: ipam/forms/bulk_import.py:315 +#: netbox/ipam/forms/bulk_import.py:315 msgid "Parent VM of assigned interface (if any)" msgstr "指定接口的父虚拟机(如果有)" -#: ipam/forms/bulk_import.py:325 +#: netbox/ipam/forms/bulk_import.py:325 msgid "Is primary" msgstr "首选" -#: ipam/forms/bulk_import.py:326 +#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "设置为设备的首选 IP" -#: ipam/forms/bulk_import.py:365 +#: netbox/ipam/forms/bulk_import.py:330 +msgid "Is out-of-band" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:331 +msgid "Designate this as the out-of-band IP address for the assigned device" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "未指定设备或虚拟机;无法设置为首选 IP" -#: ipam/forms/bulk_import.py:369 +#: netbox/ipam/forms/bulk_import.py:375 +msgid "No device specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:379 +msgid "Cannot set out-of-band IP for virtual machines" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" msgstr "未指定接口;无法设置为首选 IP" -#: ipam/forms/bulk_import.py:398 +#: netbox/ipam/forms/bulk_import.py:387 +msgid "No interface specified; cannot set as out-of-band IP" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" msgstr "认证类型" -#: ipam/forms/bulk_import.py:413 +#: netbox/ipam/forms/bulk_import.py:437 msgid "Scope type (app & model)" msgstr "作用域类型(应用程序&型号)" -#: ipam/forms/bulk_import.py:440 +#: netbox/ipam/forms/bulk_import.py:464 msgid "Assigned VLAN group" msgstr "分配的VLAN组" -#: ipam/forms/bulk_import.py:471 ipam/forms/bulk_import.py:497 +#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 msgid "IP protocol" msgstr "IP 协议" -#: ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/bulk_import.py:509 msgid "Required if not assigned to a VM" msgstr "如果未分配给虚拟机,则为必需" -#: ipam/forms/bulk_import.py:492 +#: netbox/ipam/forms/bulk_import.py:516 msgid "Required if not assigned to a device" msgstr "如果未分配给设备,则为必需" -#: ipam/forms/bulk_import.py:517 +#: netbox/ipam/forms/bulk_import.py:541 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "{ip} 未分配给此设备/虚拟机。" -#: ipam/forms/filtersets.py:47 ipam/forms/model_forms.py:63 -#: netbox/navigation/menu.py:189 vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 +#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 msgid "Route Targets" msgstr "Route Targets" -#: ipam/forms/filtersets.py:53 ipam/forms/model_forms.py:50 -#: vpn/forms/filtersets.py:224 vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 msgid "Import targets" msgstr "导入 target" -#: ipam/forms/filtersets.py:58 ipam/forms/model_forms.py:55 -#: vpn/forms/filtersets.py:229 vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 msgid "Export targets" msgstr "导出 target" -#: ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:73 msgid "Imported by VRF" msgstr "由VRF引入" -#: ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:78 msgid "Exported by VRF" msgstr "由VRF输出" -#: ipam/forms/filtersets.py:87 ipam/tables/ip.py:89 templates/ipam/rir.html:30 +#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "私有的" -#: ipam/forms/filtersets.py:105 ipam/forms/filtersets.py:191 -#: ipam/forms/filtersets.py:272 ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 +#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 msgid "Address family" msgstr "地址类型" -#: ipam/forms/filtersets.py:119 templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "范围" -#: ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:128 msgid "Start" msgstr "开始" -#: ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:132 msgid "End" msgstr "结束" -#: ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:186 msgid "Search within" msgstr "在此前缀内查找" -#: ipam/forms/filtersets.py:207 ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 msgid "Present in VRF" msgstr "存在于VRF中" -#: ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:311 msgid "Device/VM" msgstr "设备/虚拟机" -#: ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:321 msgid "Parent Prefix" msgstr "上级IP前缀" -#: ipam/forms/filtersets.py:347 +#: netbox/ipam/forms/filtersets.py:347 msgid "Assigned Device" msgstr "指定设备" -#: ipam/forms/filtersets.py:352 +#: netbox/ipam/forms/filtersets.py:352 msgid "Assigned VM" msgstr "指定虚拟机" -#: ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:366 msgid "Assigned to an interface" msgstr "指定给一个接口" -#: ipam/forms/filtersets.py:373 templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "DNS名称" -#: ipam/forms/filtersets.py:416 ipam/models/vlans.py:251 ipam/tables/ip.py:176 -#: ipam/tables/vlans.py:82 ipam/views.py:971 netbox/navigation/menu.py:193 -#: netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 +#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 +#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 +#: netbox/netbox/navigation/menu.py:195 msgid "VLANs" msgstr "VLANs" -#: ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" msgstr "包含 VLAN ID" -#: ipam/forms/filtersets.py:513 ipam/models/vlans.py:192 -#: templates/ipam/vlan.html:31 +#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "VLAN ID" -#: ipam/forms/filtersets.py:556 ipam/forms/model_forms.py:320 -#: ipam/forms/model_forms.py:713 ipam/forms/model_forms.py:739 -#: ipam/tables/vlans.py:195 templates/virtualization/virtualdisk.html:21 -#: templates/virtualization/virtualmachine.html:12 -#: templates/virtualization/vminterface.html:21 -#: templates/vpn/tunneltermination.html:25 -#: virtualization/forms/filtersets.py:197 -#: virtualization/forms/filtersets.py:242 -#: virtualization/forms/model_forms.py:220 -#: virtualization/tables/virtualmachines.py:135 -#: virtualization/tables/virtualmachines.py:190 vpn/choices.py:45 -#: vpn/forms/filtersets.py:293 vpn/forms/model_forms.py:160 -#: vpn/forms/model_forms.py:171 vpn/forms/model_forms.py:273 -#: vpn/forms/model_forms.py:454 +#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 +#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 +#: netbox/ipam/tables/vlans.py:195 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:197 +#: netbox/virtualization/forms/filtersets.py:242 +#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/tables/virtualmachines.py:135 +#: netbox/virtualization/tables/virtualmachines.py:190 +#: netbox/vpn/choices.py:53 netbox/vpn/forms/filtersets.py:293 +#: netbox/vpn/forms/model_forms.py:160 netbox/vpn/forms/model_forms.py:171 +#: netbox/vpn/forms/model_forms.py:273 netbox/vpn/forms/model_forms.py:454 msgid "Virtual Machine" msgstr "虚拟机" -#: ipam/forms/model_forms.py:80 templates/ipam/routetarget.html:10 +#: netbox/ipam/forms/model_forms.py:80 +#: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "路由目标" -#: ipam/forms/model_forms.py:114 ipam/tables/ip.py:117 -#: templates/ipam/aggregate.html:11 templates/ipam/prefix.html:38 +#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/templates/ipam/aggregate.html:11 +#: netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "聚合IP" -#: ipam/forms/model_forms.py:135 templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "ASN范围" -#: ipam/forms/model_forms.py:231 +#: netbox/ipam/forms/model_forms.py:231 msgid "Site/VLAN Assignment" msgstr "Site/VLAN 分配" -#: ipam/forms/model_forms.py:259 templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "IP范围" -#: ipam/forms/model_forms.py:295 ipam/forms/model_forms.py:321 -#: ipam/forms/model_forms.py:473 templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:506 +#: netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "FHRP组" -#: ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:310 msgid "Make this the primary IP for the device/VM" msgstr "将此IP设置为分配设备/虚拟机的首选 IP" -#: ipam/forms/model_forms.py:325 +#: netbox/ipam/forms/model_forms.py:314 +msgid "Make this the out-of-band IP for the device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" msgstr "NAT IP(内部)地址" -#: ipam/forms/model_forms.py:384 +#: netbox/ipam/forms/model_forms.py:391 msgid "An IP address can only be assigned to a single object." msgstr "IP 地址只能分配给单个对象。" -#: ipam/forms/model_forms.py:390 ipam/models/ip.py:897 -msgid "" -"Cannot reassign IP address while it is designated as the primary IP for the " -"parent object" -msgstr "当 IP 地址被指定为父对象的首选 IP 时,无法重新分配 IP 地址" +#: netbox/ipam/forms/model_forms.py:398 +msgid "Cannot reassign primary IP address for the parent device/VM" +msgstr "" -#: ipam/forms/model_forms.py:400 +#: netbox/ipam/forms/model_forms.py:402 +msgid "Cannot reassign out-of-Band IP address for the parent device" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:412 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "只有分配给接口的 IP 地址才能指定为首选 IP。" -#: ipam/forms/model_forms.py:475 +#: netbox/ipam/forms/model_forms.py:420 +msgid "" +"Only IP addresses assigned to a device interface can be designated as the " +"out-of-band IP for a device." +msgstr "" + +#: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" msgstr "虚拟IP地址" -#: ipam/forms/model_forms.py:560 +#: netbox/ipam/forms/model_forms.py:593 msgid "Assignment already exists" msgstr "已被分配" -#: ipam/forms/model_forms.py:569 templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:602 +#: netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "VLAN ID" -#: ipam/forms/model_forms.py:587 +#: netbox/ipam/forms/model_forms.py:620 msgid "Child VLANs" msgstr "子类 VLANs" -#: ipam/forms/model_forms.py:664 ipam/forms/model_forms.py:696 +#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." msgstr "一个或多个端口号的列表,逗号分隔。可以使用连字符指定范围。" -#: ipam/forms/model_forms.py:669 templates/ipam/servicetemplate.html:12 +#: netbox/ipam/forms/model_forms.py:702 +#: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "服务模版" -#: ipam/forms/model_forms.py:716 +#: netbox/ipam/forms/model_forms.py:749 msgid "Port(s)" msgstr "端口" -#: ipam/forms/model_forms.py:717 ipam/forms/model_forms.py:745 -#: templates/ipam/service.html:21 +#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 +#: netbox/templates/ipam/service.html:21 msgid "Service" msgstr "服务" -#: ipam/forms/model_forms.py:730 +#: netbox/ipam/forms/model_forms.py:763 msgid "Service template" msgstr "服务模版" -#: ipam/forms/model_forms.py:742 +#: netbox/ipam/forms/model_forms.py:775 msgid "From Template" msgstr "来自模版" -#: ipam/forms/model_forms.py:743 +#: netbox/ipam/forms/model_forms.py:776 msgid "Custom" msgstr "自定义" -#: ipam/forms/model_forms.py:773 +#: netbox/ipam/forms/model_forms.py:806 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "如果不使用服务模板,则必须指定名称、协议和端口。" -#: ipam/models/asns.py:34 +#: netbox/ipam/models/asns.py:34 msgid "start" msgstr "开始" -#: ipam/models/asns.py:51 +#: netbox/ipam/models/asns.py:51 msgid "ASN range" msgstr "ASN范围" -#: ipam/models/asns.py:52 +#: netbox/ipam/models/asns.py:52 msgid "ASN ranges" msgstr "ASN范围" -#: ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:72 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "开始的ASN ({start}) 必须低于结束的ASN({end})。" -#: ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:104 msgid "Regional Internet Registry responsible for this AS number space" msgstr "负责此AS号码的区域互联网注册处" -#: ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:109 msgid "16- or 32-bit autonomous system number" msgstr "16或32位自主系统编号" -#: ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:22 msgid "group ID" msgstr "组ID" -#: ipam/models/fhrp.py:30 ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 msgid "protocol" msgstr "协议" -#: ipam/models/fhrp.py:38 wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 msgid "authentication type" msgstr "认证类型" -#: ipam/models/fhrp.py:43 +#: netbox/ipam/models/fhrp.py:43 msgid "authentication key" msgstr "认证秘钥" -#: ipam/models/fhrp.py:56 +#: netbox/ipam/models/fhrp.py:56 msgid "FHRP group" msgstr "FHRP组" -#: ipam/models/fhrp.py:57 +#: netbox/ipam/models/fhrp.py:57 msgid "FHRP groups" msgstr "网关冗余协议组" -#: ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:113 msgid "FHRP group assignment" msgstr "指定FHRP组" -#: ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:114 msgid "FHRP group assignments" msgstr "指定FHRP组" -#: ipam/models/ip.py:65 +#: netbox/ipam/models/ip.py:65 msgid "private" msgstr "私有" -#: ipam/models/ip.py:66 +#: netbox/ipam/models/ip.py:66 msgid "IP space managed by this RIR is considered private" msgstr "由该RIR管理的IP地址空间被认为是私有的" -#: ipam/models/ip.py:72 netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 msgid "RIRs" msgstr "区域互联网注册管理机构" -#: ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:84 msgid "IPv4 or IPv6 network" msgstr "IPv4或IPv6网络" -#: ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:91 msgid "Regional Internet Registry responsible for this IP space" msgstr "负责此IP地址空间的区域互联网注册管理机构" -#: ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:101 msgid "date added" msgstr "添加日期" -#: ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:115 msgid "aggregate" msgstr "聚合" -#: ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:116 msgid "aggregates" msgstr "聚合" -#: ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:132 msgid "Cannot create aggregate with /0 mask." msgstr "无法使用/0掩码创建聚合IP。" -#: ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:144 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " "aggregate ({aggregate})." msgstr "聚合不能重叠。{prefix}已被现有聚合({aggregate})包含。" -#: ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:158 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " "({aggregate})." msgstr "前缀不能与聚合重叠。{prefix} 包含现有聚合({aggregate})。" -#: ipam/models/ip.py:200 ipam/models/ip.py:737 vpn/models/tunnels.py:114 +#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 +#: netbox/vpn/models/tunnels.py:114 msgid "role" msgstr "角色" -#: ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:201 msgid "roles" msgstr "角色" -#: ipam/models/ip.py:217 ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 msgid "prefix" msgstr "前缀" -#: ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:218 msgid "IPv4 or IPv6 network with mask" msgstr "带掩码的IPv4或IPv6网络" -#: ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:254 msgid "Operational status of this prefix" msgstr "此前缀的操作状态" -#: ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:262 msgid "The primary function of this prefix" msgstr "此前缀的主要功能" -#: ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:265 msgid "is a pool" msgstr "地址池" -#: ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" msgstr "此前缀内的所有IP地址都可用" -#: ipam/models/ip.py:270 ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 msgid "mark utilized" msgstr "使用标记" -#: ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:294 msgid "prefixes" msgstr "前缀" -#: ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:317 msgid "Cannot create prefix with /0 mask." msgstr "无法创建/0掩码的IP地址前缀。" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 #, python-brace-format msgid "VRF {vrf}" msgstr "VRF {vrf}" -#: ipam/models/ip.py:324 ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 msgid "global table" msgstr "全局表" -#: ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:326 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "在{table}中发现重复的前缀: {prefix}" -#: ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:495 msgid "start address" msgstr "起始地址" -#: ipam/models/ip.py:496 ipam/models/ip.py:500 ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 +#: netbox/ipam/models/ip.py:712 msgid "IPv4 or IPv6 address (with mask)" msgstr "IPv4 或 IPv6 地址(带掩码)" -#: ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:499 msgid "end address" msgstr "结束地址" -#: ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:526 msgid "Operational status of this range" msgstr "此IP范围的操作状态" -#: ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:534 msgid "The primary function of this range" msgstr "此IP范围的主要功能" -#: ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:548 msgid "IP range" msgstr "IP范围" -#: ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:549 msgid "IP ranges" msgstr "IP范围" -#: ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:565 msgid "Starting and ending IP address versions must match" msgstr "起始和结束IP地址的版本必须一致" -#: ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:571 msgid "Starting and ending IP address masks must match" msgstr "起始和结束IP地址的掩码必须一致" -#: ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:578 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "结束地址必须大于起始地址 ({start_address})" -#: ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:590 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "定义的地址与 VRF {vrf} 中的范围 {overlapping_range} 重叠" -#: ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:599 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "定义的范围超过了支持的最大大小 ({max_size})" -#: ipam/models/ip.py:711 tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 msgid "address" msgstr "地址" -#: ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:734 msgid "The operational status of this IP" msgstr "此IP的运行状态" -#: ipam/models/ip.py:741 +#: netbox/ipam/models/ip.py:741 msgid "The functional role of this IP" msgstr "此IP的功能作用" -#: ipam/models/ip.py:765 templates/ipam/ipaddress.html:72 +#: netbox/ipam/models/ip.py:765 netbox/templates/ipam/ipaddress.html:72 msgid "NAT (inside)" msgstr "NAT(内部 IP)" -#: ipam/models/ip.py:766 +#: netbox/ipam/models/ip.py:766 msgid "The IP for which this address is the \"outside\" IP" msgstr "此IP地址为外部IP" -#: ipam/models/ip.py:773 +#: netbox/ipam/models/ip.py:773 msgid "Hostname or FQDN (not case-sensitive)" msgstr "主机名或 FQDN(不区分大小写)" -#: ipam/models/ip.py:789 ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 msgid "IP addresses" msgstr "IP地址" -#: ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:845 msgid "Cannot create IP address with /0 mask." msgstr "无法创建/0掩码的IP地址。" -#: ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:851 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "{ip}是一个网络号,不能分配给接口。" -#: ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:862 #, python-brace-format msgid "" "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "{ip}是一个广播地址,不能分配给接口。" -#: ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:876 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "在 {table}中发现重复的IP地址: {ipaddress}" -#: ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:897 +msgid "" +"Cannot reassign IP address while it is designated as the primary IP for the " +"parent object" +msgstr "当 IP 地址被指定为父对象的首选 IP 时,无法重新分配 IP 地址" + +#: netbox/ipam/models/ip.py:903 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "只能为IPv6地址分配SLAAC状态" -#: ipam/models/services.py:33 +#: netbox/ipam/models/services.py:33 msgid "port numbers" msgstr "端口号" -#: ipam/models/services.py:59 +#: netbox/ipam/models/services.py:59 msgid "service template" msgstr "服务模版" -#: ipam/models/services.py:60 +#: netbox/ipam/models/services.py:60 msgid "service templates" msgstr "服务模板" -#: ipam/models/services.py:95 +#: netbox/ipam/models/services.py:95 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "此服务绑定到的特定IP地址(如果有)" -#: ipam/models/services.py:102 +#: netbox/ipam/models/services.py:102 msgid "service" msgstr "服务" -#: ipam/models/services.py:103 +#: netbox/ipam/models/services.py:103 msgid "services" msgstr "服务" -#: ipam/models/services.py:117 +#: netbox/ipam/models/services.py:117 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "服务不能同时与设备和虚拟机相关联。" -#: ipam/models/services.py:119 +#: netbox/ipam/models/services.py:119 msgid "" "A service must be associated with either a device or a virtual machine." msgstr "服务必须与设备或虚拟机相关联。" -#: ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:85 msgid "VLAN groups" msgstr "VLAN 组" -#: ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:95 msgid "Cannot set scope_type without scope_id." msgstr "没有作用域id,无法设置作用域。" -#: ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:97 msgid "Cannot set scope_id without scope_type." msgstr "没有作用域类型,无法设置作用域。" -#: ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." msgstr "范围不能重叠。" -#: ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:181 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "此VLAN所属的站点(如果有)" -#: ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:189 msgid "VLAN group (optional)" msgstr "VLAN组(可选)" -#: ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:197 msgid "Numeric VLAN ID (1-4094)" msgstr "VLAN ID(1-4094)" -#: ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:215 msgid "Operational status of this VLAN" msgstr "此VLAN的操作状态" -#: ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:223 msgid "The primary function of this VLAN" msgstr "此VLAN的主要功能" -#: ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:266 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " "site {site}." msgstr "VLAN 已分配给组 {group}(作用域:{scope}); 不能再分配给站点:{site}。" -#: ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:275 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "VID 必须在范围内 {ranges} 对于组中的 VLAN {group}" -#: ipam/models/vrfs.py:30 +#: netbox/ipam/models/vrfs.py:30 msgid "route distinguisher" msgstr "路由区分符" -#: ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:31 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "唯一的路由区分符(如 RFC 4364 中定义)" -#: ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:42 msgid "enforce unique space" msgstr "强制使用唯一空间" -#: ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:43 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "防止此 VRF 内出现重复的前缀/IP 地址" -#: ipam/models/vrfs.py:63 netbox/navigation/menu.py:186 -#: netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 +#: netbox/netbox/navigation/menu.py:188 msgid "VRFs" msgstr "VRFs" -#: ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:82 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "RT值(按照 RFC 4360 格式)" -#: ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:94 msgid "route target" msgstr "路由目标" -#: ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:95 msgid "route targets" msgstr "路由目标" -#: ipam/tables/asn.py:52 +#: netbox/ipam/tables/asn.py:52 msgid "ASDOT" msgstr "ASDOT" -#: ipam/tables/asn.py:57 +#: netbox/ipam/tables/asn.py:57 msgid "Site Count" msgstr "站点统计" -#: ipam/tables/asn.py:62 +#: netbox/ipam/tables/asn.py:62 msgid "Provider Count" msgstr "运营商统计" -#: ipam/tables/ip.py:95 netbox/navigation/menu.py:179 -#: netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 +#: netbox/netbox/navigation/menu.py:181 msgid "Aggregates" msgstr "聚合" -#: ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:125 msgid "Added" msgstr "已添加" -#: ipam/tables/ip.py:128 ipam/tables/ip.py:166 ipam/tables/vlans.py:142 -#: ipam/views.py:346 netbox/navigation/menu.py:165 -#: netbox/navigation/menu.py:167 templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 +#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 +#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 +#: netbox/templates/ipam/vlan.html:84 msgid "Prefixes" msgstr "前缀" -#: ipam/tables/ip.py:131 ipam/tables/ip.py:270 ipam/tables/ip.py:324 -#: ipam/tables/vlans.py:86 templates/dcim/device.html:260 -#: templates/ipam/aggregate.html:24 templates/ipam/iprange.html:29 -#: templates/ipam/prefix.html:106 +#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/templates/dcim/device.html:260 +#: netbox/templates/ipam/aggregate.html:24 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 msgid "Utilization" msgstr "利用率" -#: ipam/tables/ip.py:171 netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 msgid "IP Ranges" msgstr "IP范围" -#: ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:221 msgid "Prefix (Flat)" msgstr "前缀(标记)" -#: ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:225 msgid "Depth" msgstr "深度" -#: ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:262 msgid "Pool" msgstr "地址池" -#: ipam/tables/ip.py:266 ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" msgstr "标记为已使用" -#: ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:304 msgid "Start address" msgstr "起始地址" -#: ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:383 msgid "NAT (Inside)" msgstr "NAT (内部地址)" -#: ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:388 msgid "NAT (Outside)" msgstr "NAT (外部地址)" -#: ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:393 msgid "Assigned" msgstr "分配" -#: ipam/tables/ip.py:429 templates/vpn/l2vpntermination.html:16 -#: vpn/forms/filtersets.py:240 +#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "指定对象" -#: ipam/tables/vlans.py:68 +#: netbox/ipam/tables/vlans.py:68 msgid "Scope Type" msgstr "作用域类型" -#: ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:76 msgid "VID Ranges" msgstr "VID 范围" -#: ipam/tables/vlans.py:111 ipam/tables/vlans.py:214 -#: templates/dcim/inc/interface_vlans_table.html:4 +#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "VLAN号" -#: ipam/tables/vrfs.py:30 +#: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "RD" -#: ipam/tables/vrfs.py:33 +#: netbox/ipam/tables/vrfs.py:33 msgid "Unique" msgstr "唯一的" -#: ipam/tables/vrfs.py:37 vpn/tables/l2vpn.py:27 +#: netbox/ipam/tables/vrfs.py:37 netbox/vpn/tables/l2vpn.py:27 msgid "Import Targets" msgstr "引入targets" -#: ipam/tables/vrfs.py:42 vpn/tables/l2vpn.py:32 +#: netbox/ipam/tables/vrfs.py:42 netbox/vpn/tables/l2vpn.py:32 msgid "Export Targets" msgstr "输出targets" -#: ipam/validators.py:9 +#: netbox/ipam/validators.py:9 #, python-brace-format msgid "{prefix} is not a valid prefix. Did you mean {suggested}?" msgstr "{prefix} 不是有效的前缀。您是想 {suggested}?" -#: ipam/validators.py:16 +#: netbox/ipam/validators.py:16 #, python-format msgid "The prefix length must be less than or equal to %(limit_value)s." msgstr "前缀长度必须≤ %(limit_value)s." -#: ipam/validators.py:24 +#: netbox/ipam/validators.py:24 #, python-format msgid "The prefix length must be greater than or equal to %(limit_value)s." msgstr "前缀长度必须≥ %(limit_value)s." -#: ipam/validators.py:33 +#: netbox/ipam/validators.py:33 msgid "" "Only alphanumeric characters, asterisks, hyphens, periods, and underscores " "are allowed in DNS names" msgstr "DNS 名称中仅允许使用字母数字字符、星号、连字符、句点和下划线" -#: ipam/views.py:533 +#: netbox/ipam/views.py:533 msgid "Child Prefixes" msgstr "下级前缀" -#: ipam/views.py:569 +#: netbox/ipam/views.py:569 msgid "Child Ranges" msgstr "子类地址访问" -#: ipam/views.py:898 +#: netbox/ipam/views.py:898 msgid "Related IPs" msgstr "关联IP" -#: ipam/views.py:1127 +#: netbox/ipam/views.py:1127 msgid "Device Interfaces" msgstr "设备接口" -#: ipam/views.py:1145 +#: netbox/ipam/views.py:1145 msgid "VM Interfaces" msgstr "VM接口" -#: netbox/api/fields.py:65 +#: netbox/netbox/api/fields.py:65 msgid "This field may not be blank." msgstr "此字段不能为空。" -#: netbox/api/fields.py:70 +#: netbox/netbox/api/fields.py:70 msgid "" "Value must be passed directly (e.g. \"foo\": 123); do not use a dictionary " "or list." msgstr "值必须直接传递(e.g. \"foo\": 123); 不要使用字典或列表。" -#: netbox/api/fields.py:91 +#: netbox/netbox/api/fields.py:91 #, python-brace-format msgid "{value} is not a valid choice." msgstr "{value}不是一个有效的选项。" -#: netbox/api/fields.py:104 +#: netbox/netbox/api/fields.py:104 #, python-brace-format msgid "Invalid content type: {content_type}" msgstr "无效的内容类型: {content_type}" -#: netbox/api/fields.py:105 +#: netbox/netbox/api/fields.py:105 msgid "Invalid value. Specify a content type as '.'." msgstr "无效的值。需要将内容类型指定为 '.'。" -#: netbox/api/fields.py:167 +#: netbox/netbox/api/fields.py:167 msgid "Ranges must be specified in the form (lower, upper)." msgstr "必须以表单(下限、上限)指定范围。" -#: netbox/api/fields.py:169 +#: netbox/netbox/api/fields.py:169 msgid "Range boundaries must be defined as integers." msgstr "范围边界必须定义为整数。" -#: netbox/api/serializers/fields.py:40 +#: netbox/netbox/api/serializers/fields.py:40 #, python-brace-format msgid "{class_name} must implement get_view_name()" msgstr "{class_name} 必须实现 get_view_name ()" -#: netbox/authentication/__init__.py:138 +#: netbox/netbox/authentication/__init__.py:138 #, python-brace-format msgid "Invalid permission {permission} for model {model}" msgstr "模型{model}的权限{permission}无效" -#: netbox/choices.py:49 +#: netbox/netbox/choices.py:49 msgid "Dark Red" msgstr "深红" -#: netbox/choices.py:52 +#: netbox/netbox/choices.py:52 msgid "Rose" msgstr "玫瑰红" -#: netbox/choices.py:53 +#: netbox/netbox/choices.py:53 msgid "Fuchsia" msgstr "紫红色" -#: netbox/choices.py:55 +#: netbox/netbox/choices.py:55 msgid "Dark Purple" msgstr "深紫色" -#: netbox/choices.py:58 +#: netbox/netbox/choices.py:58 msgid "Light Blue" msgstr "浅蓝色" -#: netbox/choices.py:61 +#: netbox/netbox/choices.py:61 msgid "Aqua" msgstr "水绿色" -#: netbox/choices.py:62 +#: netbox/netbox/choices.py:62 msgid "Dark Green" msgstr "深绿色" -#: netbox/choices.py:64 +#: netbox/netbox/choices.py:64 msgid "Light Green" msgstr "浅绿色" -#: netbox/choices.py:65 +#: netbox/netbox/choices.py:65 msgid "Lime" msgstr "草绿色" -#: netbox/choices.py:67 +#: netbox/netbox/choices.py:67 msgid "Amber" msgstr "琥珀色" -#: netbox/choices.py:69 +#: netbox/netbox/choices.py:69 msgid "Dark Orange" msgstr "深橙色" -#: netbox/choices.py:70 +#: netbox/netbox/choices.py:70 msgid "Brown" msgstr "棕色" -#: netbox/choices.py:71 +#: netbox/netbox/choices.py:71 msgid "Light Grey" msgstr "浅灰色" -#: netbox/choices.py:72 +#: netbox/netbox/choices.py:72 msgid "Grey" msgstr "灰色" -#: netbox/choices.py:73 +#: netbox/netbox/choices.py:73 msgid "Dark Grey" msgstr "深灰色" -#: netbox/choices.py:128 +#: netbox/netbox/choices.py:128 msgid "Direct" msgstr "直连" -#: netbox/choices.py:129 +#: netbox/netbox/choices.py:129 msgid "Upload" msgstr "上传" -#: netbox/choices.py:141 netbox/choices.py:155 +#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 msgid "Auto-detect" msgstr "自动检测" -#: netbox/choices.py:156 +#: netbox/netbox/choices.py:156 msgid "Comma" msgstr "逗号" -#: netbox/choices.py:157 +#: netbox/netbox/choices.py:157 msgid "Semicolon" msgstr "分号" -#: netbox/choices.py:158 +#: netbox/netbox/choices.py:158 msgid "Tab" msgstr "Tab" -#: netbox/config/__init__.py:67 +#: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" msgstr "无效的配置参数: {item}" -#: netbox/config/parameters.py:22 templates/core/inc/config_data.html:62 +#: netbox/netbox/config/parameters.py:22 +#: netbox/templates/core/inc/config_data.html:62 msgid "Login banner" msgstr "登录提示" -#: netbox/config/parameters.py:24 +#: netbox/netbox/config/parameters.py:24 msgid "Additional content to display on the login page" msgstr "要在登录页面上显示的其他内容" -#: netbox/config/parameters.py:33 templates/core/inc/config_data.html:66 +#: netbox/netbox/config/parameters.py:33 +#: netbox/templates/core/inc/config_data.html:66 msgid "Maintenance banner" msgstr "维护提示" -#: netbox/config/parameters.py:35 +#: netbox/netbox/config/parameters.py:35 msgid "Additional content to display when in maintenance mode" msgstr "要在维护页面上显示的其他内容" -#: netbox/config/parameters.py:44 templates/core/inc/config_data.html:70 +#: netbox/netbox/config/parameters.py:44 +#: netbox/templates/core/inc/config_data.html:70 msgid "Top banner" msgstr "顶部提示" -#: netbox/config/parameters.py:46 +#: netbox/netbox/config/parameters.py:46 msgid "Additional content to display at the top of every page" msgstr "要在顶部提示显示的其他内容" -#: netbox/config/parameters.py:55 templates/core/inc/config_data.html:74 +#: netbox/netbox/config/parameters.py:55 +#: netbox/templates/core/inc/config_data.html:74 msgid "Bottom banner" msgstr "底部提示" -#: netbox/config/parameters.py:57 +#: netbox/netbox/config/parameters.py:57 msgid "Additional content to display at the bottom of every page" msgstr "要在每页底部提示显示的其他内容" -#: netbox/config/parameters.py:68 +#: netbox/netbox/config/parameters.py:68 msgid "Globally unique IP space" msgstr "全局唯一 IP 地址空间" -#: netbox/config/parameters.py:70 +#: netbox/netbox/config/parameters.py:70 msgid "Enforce unique IP addressing within the global table" msgstr "在全局表中强制执行唯一的 IP 寻址" -#: netbox/config/parameters.py:75 templates/core/inc/config_data.html:44 +#: netbox/netbox/config/parameters.py:75 +#: netbox/templates/core/inc/config_data.html:44 msgid "Prefer IPv4" msgstr "首选 IPv4" -#: netbox/config/parameters.py:77 +#: netbox/netbox/config/parameters.py:77 msgid "Prefer IPv4 addresses over IPv6" msgstr "优先选择 IPv4 地址而不是 IPv6" -#: netbox/config/parameters.py:84 +#: netbox/netbox/config/parameters.py:84 msgid "Rack unit height" msgstr "机柜每U高度" -#: netbox/config/parameters.py:86 +#: netbox/netbox/config/parameters.py:86 msgid "Default unit height for rendered rack elevations" msgstr "渲染机架标高的默认单位高度" -#: netbox/config/parameters.py:91 +#: netbox/netbox/config/parameters.py:91 msgid "Rack unit width" msgstr "机柜每U宽度" -#: netbox/config/parameters.py:93 +#: netbox/netbox/config/parameters.py:93 msgid "Default unit width for rendered rack elevations" msgstr "渲染机架标高的默认单位宽度" -#: netbox/config/parameters.py:100 +#: netbox/netbox/config/parameters.py:100 msgid "Powerfeed voltage" msgstr "供电电压" -#: netbox/config/parameters.py:102 +#: netbox/netbox/config/parameters.py:102 msgid "Default voltage for powerfeeds" msgstr "电源默认电压" -#: netbox/config/parameters.py:107 +#: netbox/netbox/config/parameters.py:107 msgid "Powerfeed amperage" msgstr "供电电流" -#: netbox/config/parameters.py:109 +#: netbox/netbox/config/parameters.py:109 msgid "Default amperage for powerfeeds" msgstr "电源的默认电流" -#: netbox/config/parameters.py:114 +#: netbox/netbox/config/parameters.py:114 msgid "Powerfeed max utilization" msgstr "电源最大利用率" -#: netbox/config/parameters.py:116 +#: netbox/netbox/config/parameters.py:116 msgid "Default max utilization for powerfeeds" msgstr "默认的电源最大利用率" -#: netbox/config/parameters.py:123 templates/core/inc/config_data.html:53 +#: netbox/netbox/config/parameters.py:123 +#: netbox/templates/core/inc/config_data.html:53 msgid "Allowed URL schemes" msgstr "允许的URL方案" -#: netbox/config/parameters.py:128 +#: netbox/netbox/config/parameters.py:128 msgid "Permitted schemes for URLs in user-provided content" msgstr "用户提供的内容中允许的URL方案" -#: netbox/config/parameters.py:136 +#: netbox/netbox/config/parameters.py:136 msgid "Default page size" msgstr "默认页面大小" -#: netbox/config/parameters.py:142 +#: netbox/netbox/config/parameters.py:142 msgid "Maximum page size" msgstr "最大页面大小" -#: netbox/config/parameters.py:150 templates/core/inc/config_data.html:96 +#: netbox/netbox/config/parameters.py:150 +#: netbox/templates/core/inc/config_data.html:96 msgid "Custom validators" msgstr "自定义验证器" -#: netbox/config/parameters.py:152 +#: netbox/netbox/config/parameters.py:152 msgid "Custom validation rules (JSON)" msgstr "自定义验证规则(JSON)" -#: netbox/config/parameters.py:160 templates/core/inc/config_data.html:104 +#: netbox/netbox/config/parameters.py:160 +#: netbox/templates/core/inc/config_data.html:104 msgid "Protection rules" msgstr "保护规则" -#: netbox/config/parameters.py:162 +#: netbox/netbox/config/parameters.py:162 msgid "Deletion protection rules (JSON)" msgstr "删除动作的保护规则(JSON)" -#: netbox/config/parameters.py:172 templates/core/inc/config_data.html:117 +#: netbox/netbox/config/parameters.py:172 +#: netbox/templates/core/inc/config_data.html:117 msgid "Default preferences" msgstr "默认首选项" -#: netbox/config/parameters.py:174 +#: netbox/netbox/config/parameters.py:174 msgid "Default preferences for new users" msgstr "新用户默认首选项" -#: netbox/config/parameters.py:181 templates/core/inc/config_data.html:129 +#: netbox/netbox/config/parameters.py:181 +#: netbox/templates/core/inc/config_data.html:129 msgid "Maintenance mode" msgstr "维护模式" -#: netbox/config/parameters.py:183 +#: netbox/netbox/config/parameters.py:183 msgid "Enable maintenance mode" msgstr "开启维护模式" -#: netbox/config/parameters.py:188 templates/core/inc/config_data.html:133 +#: netbox/netbox/config/parameters.py:188 +#: netbox/templates/core/inc/config_data.html:133 msgid "GraphQL enabled" msgstr "GraphQL 已启用" -#: netbox/config/parameters.py:190 +#: netbox/netbox/config/parameters.py:190 msgid "Enable the GraphQL API" msgstr "启用 GraphQL API" -#: netbox/config/parameters.py:195 templates/core/inc/config_data.html:137 +#: netbox/netbox/config/parameters.py:195 +#: netbox/templates/core/inc/config_data.html:137 msgid "Changelog retention" msgstr "变更日志保留" -#: netbox/config/parameters.py:197 +#: netbox/netbox/config/parameters.py:197 msgid "Days to retain changelog history (set to zero for unlimited)" msgstr "变更日志的保留天数(0表示无限制)" -#: netbox/config/parameters.py:202 +#: netbox/netbox/config/parameters.py:202 msgid "Job result retention" msgstr "任务结果保留" -#: netbox/config/parameters.py:204 +#: netbox/netbox/config/parameters.py:204 msgid "Days to retain job result history (set to zero for unlimited)" msgstr "任务结果的保留天数(0表示无限制)" -#: netbox/config/parameters.py:209 templates/core/inc/config_data.html:145 +#: netbox/netbox/config/parameters.py:209 +#: netbox/templates/core/inc/config_data.html:145 msgid "Maps URL" msgstr "地图链接" -#: netbox/config/parameters.py:211 +#: netbox/netbox/config/parameters.py:211 msgid "Base URL for mapping geographic locations" msgstr "用于映射地理位置的基本 URL" -#: netbox/forms/__init__.py:12 +#: netbox/netbox/forms/__init__.py:12 msgid "Partial match" msgstr "部分匹配" -#: netbox/forms/__init__.py:13 +#: netbox/netbox/forms/__init__.py:13 msgid "Exact match" msgstr "完全匹配" -#: netbox/forms/__init__.py:14 +#: netbox/netbox/forms/__init__.py:14 msgid "Starts with" msgstr "开始于" -#: netbox/forms/__init__.py:15 +#: netbox/netbox/forms/__init__.py:15 msgid "Ends with" msgstr "结束于" -#: netbox/forms/__init__.py:16 +#: netbox/netbox/forms/__init__.py:16 msgid "Regex" msgstr "正则表达式" -#: netbox/forms/__init__.py:34 +#: netbox/netbox/forms/__init__.py:34 msgid "Object type(s)" msgstr "对象类型" -#: netbox/forms/__init__.py:40 +#: netbox/netbox/forms/__init__.py:40 msgid "Lookup" msgstr "查找" -#: netbox/forms/base.py:90 +#: netbox/netbox/forms/base.py:90 msgid "" "Tag slugs separated by commas, encased with double quotes (e.g. " "\"tag1,tag2,tag3\")" msgstr "用逗号分隔的标签段,用双引号括起来(例如\"tag1,tag2,tag3\")" -#: netbox/forms/base.py:120 +#: netbox/netbox/forms/base.py:120 msgid "Add tags" msgstr "增加标签" -#: netbox/forms/base.py:125 +#: netbox/netbox/forms/base.py:125 msgid "Remove tags" msgstr "移除标签" -#: netbox/forms/mixins.py:38 +#: netbox/netbox/forms/mixins.py:38 #, python-brace-format msgid "{class_name} must specify a model class." msgstr "{class_name}必须指定一个模型类。" -#: netbox/models/features.py:280 +#: netbox/netbox/models/features.py:280 #, python-brace-format msgid "Unknown field name '{name}' in custom field data." msgstr "自定义字段中的字段名称 '{name}' 未知。" -#: netbox/models/features.py:286 +#: netbox/netbox/models/features.py:286 #, python-brace-format msgid "Invalid value for custom field '{name}': {error}" msgstr "自定义字段'{name}'的值无效: {error}" -#: netbox/models/features.py:295 +#: netbox/netbox/models/features.py:295 #, python-brace-format msgid "Custom field '{name}' must have a unique value." msgstr "自定义字段 '{name}'必须具有唯一值。" -#: netbox/models/features.py:302 +#: netbox/netbox/models/features.py:302 #, python-brace-format msgid "Missing required custom field '{name}'." msgstr "缺少必需的自定义字段'{name}'." -#: netbox/models/features.py:462 +#: netbox/netbox/models/features.py:462 msgid "Remote data source" msgstr "远程数据源" -#: netbox/models/features.py:472 +#: netbox/netbox/models/features.py:472 msgid "data path" msgstr "文件路径" -#: netbox/models/features.py:476 +#: netbox/netbox/models/features.py:476 msgid "Path to remote file (relative to data source root)" msgstr "数据源文件路径(相对路径)" -#: netbox/models/features.py:479 +#: netbox/netbox/models/features.py:479 msgid "auto sync enabled" msgstr "自动同步已启用" -#: netbox/models/features.py:481 +#: netbox/netbox/models/features.py:481 msgid "Enable automatic synchronization of data when the data file is updated" msgstr "数据文件更新时启用数据自动同步" -#: netbox/models/features.py:484 +#: netbox/netbox/models/features.py:484 msgid "date synced" msgstr "数据已同步" -#: netbox/models/features.py:578 +#: netbox/netbox/models/features.py:578 #, python-brace-format msgid "{class_name} must implement a sync_data() method." msgstr "{class_name}必须包含sync_data()方法。" -#: netbox/navigation/menu.py:11 +#: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "组织机构" -#: netbox/navigation/menu.py:19 +#: netbox/netbox/navigation/menu.py:19 msgid "Site Groups" msgstr "站点组" -#: netbox/navigation/menu.py:27 +#: netbox/netbox/navigation/menu.py:27 msgid "Tenant Groups" msgstr "租户组" -#: netbox/navigation/menu.py:34 +#: netbox/netbox/navigation/menu.py:34 msgid "Contact Groups" msgstr "联系组" -#: netbox/navigation/menu.py:35 templates/tenancy/contactrole.html:8 +#: netbox/netbox/navigation/menu.py:35 +#: netbox/templates/tenancy/contactrole.html:8 msgid "Contact Roles" msgstr "联系角色" -#: netbox/navigation/menu.py:36 +#: netbox/netbox/navigation/menu.py:36 msgid "Contact Assignments" msgstr "联系分配" -#: netbox/navigation/menu.py:50 +#: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" msgstr "机柜角色" -#: netbox/navigation/menu.py:54 +#: netbox/netbox/navigation/menu.py:54 msgid "Elevations" msgstr "机柜立面图" -#: netbox/navigation/menu.py:60 netbox/navigation/menu.py:62 +#: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" msgstr "机架类型" -#: netbox/navigation/menu.py:76 +#: netbox/netbox/navigation/menu.py:76 msgid "Modules" msgstr "设备板卡" -#: netbox/navigation/menu.py:80 templates/dcim/device.html:160 -#: templates/dcim/virtualdevicecontext.html:8 +#: netbox/netbox/navigation/menu.py:80 netbox/templates/dcim/device.html:160 +#: netbox/templates/dcim/virtualdevicecontext.html:8 msgid "Virtual Device Contexts" msgstr "设备虚拟实例" -#: netbox/navigation/menu.py:88 +#: netbox/netbox/navigation/menu.py:88 msgid "Manufacturers" msgstr "厂商" -#: netbox/navigation/menu.py:92 +#: netbox/netbox/navigation/menu.py:92 msgid "Device Components" msgstr "设备详情" -#: netbox/navigation/menu.py:104 templates/dcim/inventoryitemrole.html:8 +#: netbox/netbox/navigation/menu.py:104 +#: netbox/templates/dcim/inventoryitemrole.html:8 msgid "Inventory Item Roles" msgstr "库存物品分类" -#: netbox/navigation/menu.py:111 netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 msgid "Connections" msgstr "连接" -#: netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:117 msgid "Cables" msgstr "链路" -#: netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:118 msgid "Wireless Links" msgstr "无线连接" -#: netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:121 msgid "Interface Connections" msgstr "接口连接" -#: netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:126 msgid "Console Connections" msgstr "Console 连接" -#: netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:131 msgid "Power Connections" msgstr "电源连接" -#: netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:147 msgid "Wireless LAN Groups" msgstr "无线局域网组" -#: netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:168 msgid "Prefix & VLAN Roles" msgstr "前缀和VLAN角色" -#: netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:174 msgid "ASN Ranges" msgstr "ASN 范围" -#: netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:196 msgid "VLAN Groups" msgstr "VLAN 组" -#: netbox/navigation/menu.py:203 +#: netbox/netbox/navigation/menu.py:203 msgid "Service Templates" msgstr "服务模版" -#: netbox/navigation/menu.py:204 templates/dcim/device.html:302 -#: templates/ipam/ipaddress.html:118 -#: templates/virtualization/virtualmachine.html:154 +#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/templates/ipam/ipaddress.html:118 +#: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "服务" -#: netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:211 msgid "VPN" msgstr "VPN" -#: netbox/navigation/menu.py:215 netbox/navigation/menu.py:217 -#: vpn/tables/tunnels.py:24 +#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "隧道" -#: netbox/navigation/menu.py:218 templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:218 +#: netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "隧道组" -#: netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:219 msgid "Tunnel Terminations" msgstr "隧道终端" -#: netbox/navigation/menu.py:223 netbox/navigation/menu.py:225 -#: vpn/models/l2vpn.py:64 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "L2VPN" -#: netbox/navigation/menu.py:226 templates/vpn/l2vpn.html:56 -#: templates/vpn/tunnel.html:72 vpn/tables/tunnels.py:58 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 +#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 msgid "Terminations" msgstr "终端" -#: netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:232 msgid "IKE Proposals" msgstr "IKE 协议提案" -#: netbox/navigation/menu.py:233 templates/vpn/ikeproposal.html:41 +#: netbox/netbox/navigation/menu.py:233 +#: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "IKE策略" -#: netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:234 msgid "IPSec Proposals" msgstr "IPSec 协议提案" -#: netbox/navigation/menu.py:235 templates/vpn/ipsecproposal.html:37 +#: netbox/netbox/navigation/menu.py:235 +#: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "IPSec策略" -#: netbox/navigation/menu.py:236 templates/vpn/ikepolicy.html:38 -#: templates/vpn/ipsecpolicy.html:25 +#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "IPSec 配置文件" -#: netbox/navigation/menu.py:251 -#: templates/virtualization/virtualmachine.html:174 -#: templates/virtualization/virtualmachine/base.html:32 -#: templates/virtualization/virtualmachine_list.html:21 -#: virtualization/tables/virtualmachines.py:104 virtualization/views.py:388 +#: netbox/netbox/navigation/menu.py:251 +#: netbox/templates/virtualization/virtualmachine.html:174 +#: netbox/templates/virtualization/virtualmachine/base.html:32 +#: netbox/templates/virtualization/virtualmachine_list.html:21 +#: netbox/virtualization/tables/virtualmachines.py:104 +#: netbox/virtualization/views.py:386 msgid "Virtual Disks" msgstr "虚拟磁盘" -#: netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:258 msgid "Cluster Types" msgstr "集群类型" -#: netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:259 msgid "Cluster Groups" msgstr "集群组" -#: netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:273 msgid "Circuit Types" msgstr "链路类型" -#: netbox/navigation/menu.py:274 +#: netbox/netbox/navigation/menu.py:274 msgid "Circuit Groups" msgstr "电路组" -#: netbox/navigation/menu.py:275 templates/circuits/circuit.html:66 +#: netbox/netbox/navigation/menu.py:275 +#: netbox/templates/circuits/circuit.html:66 msgid "Group Assignments" msgstr "小组作业" -#: netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:276 msgid "Circuit Terminations" msgstr "链路终端" -#: netbox/navigation/menu.py:280 netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 msgid "Providers" msgstr "运营商" -#: netbox/navigation/menu.py:283 templates/circuits/provider.html:51 +#: netbox/netbox/navigation/menu.py:283 +#: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "运营商账户" -#: netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:284 msgid "Provider Networks" msgstr "运营商网络" -#: netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" msgstr "电源面板" -#: netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:309 msgid "Configurations" msgstr "配置" -#: netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:311 msgid "Config Contexts" msgstr "配置实例" -#: netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:312 msgid "Config Templates" msgstr "配置模板" -#: netbox/navigation/menu.py:319 netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 msgid "Customization" msgstr "自定义" -#: netbox/navigation/menu.py:325 templates/dcim/device_edit.html:103 -#: templates/dcim/htmx/cable_edit.html:81 -#: templates/dcim/virtualchassis_add.html:31 -#: templates/dcim/virtualchassis_edit.html:40 -#: templates/generic/bulk_edit.html:76 templates/htmx/form.html:19 -#: templates/inc/filter_list.html:30 templates/inc/panels/custom_fields.html:7 -#: templates/ipam/ipaddress_bulk_add.html:35 templates/ipam/vlan_edit.html:59 +#: netbox/netbox/navigation/menu.py:325 +#: netbox/templates/dcim/device_edit.html:103 +#: netbox/templates/dcim/htmx/cable_edit.html:81 +#: netbox/templates/dcim/virtualchassis_add.html:31 +#: netbox/templates/dcim/virtualchassis_edit.html:40 +#: netbox/templates/generic/bulk_edit.html:76 +#: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 +#: netbox/templates/inc/panels/custom_fields.html:7 +#: netbox/templates/ipam/ipaddress_bulk_add.html:35 +#: netbox/templates/ipam/vlan_edit.html:59 msgid "Custom Fields" msgstr "自定义字段" -#: netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:326 msgid "Custom Field Choices" msgstr "自定义字段选项" -#: netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:327 msgid "Custom Links" msgstr "自定义链接" -#: netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:328 msgid "Export Templates" msgstr "导出模板" -#: netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:329 msgid "Saved Filters" msgstr "已保存的过滤器" -#: netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:331 msgid "Image Attachments" msgstr "图片附件" -#: netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:349 msgid "Operations" msgstr "操作" -#: netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:353 msgid "Integrations" msgstr "系统集成" -#: netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:355 msgid "Data Sources" msgstr "数据源" -#: netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:356 msgid "Event Rules" msgstr "事件规则" -#: netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:357 msgid "Webhooks" msgstr "Webhook" -#: netbox/navigation/menu.py:361 netbox/navigation/menu.py:365 -#: netbox/views/generic/feature_views.py:153 -#: templates/extras/report/base.html:37 templates/extras/script/base.html:36 +#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 +#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/templates/extras/report/base.html:37 +#: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "任务" -#: netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:371 msgid "Logging" msgstr "日志" -#: netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:373 msgid "Notification Groups" msgstr "通知组" -#: netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:374 msgid "Journal Entries" msgstr "日志条目" -#: netbox/navigation/menu.py:375 templates/core/objectchange.html:9 -#: templates/core/objectchange_list.html:4 +#: netbox/netbox/navigation/menu.py:375 +#: netbox/templates/core/objectchange.html:9 +#: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "修改日志" -#: netbox/navigation/menu.py:382 templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "管理员" -#: netbox/navigation/menu.py:430 templates/account/base.html:27 -#: templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:57 msgid "API Tokens" msgstr "API Token" -#: netbox/navigation/menu.py:437 users/forms/model_forms.py:187 -#: users/forms/model_forms.py:195 users/forms/model_forms.py:242 -#: users/forms/model_forms.py:249 +#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 +#: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "权限" -#: netbox/navigation/menu.py:445 netbox/navigation/menu.py:449 -#: templates/core/system.html:7 +#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/templates/core/system.html:7 msgid "System" msgstr "系统" -#: netbox/navigation/menu.py:454 netbox/navigation/menu.py:502 -#: templates/500.html:35 templates/account/preferences.html:22 -#: templates/core/plugin.html:13 templates/core/plugin_list.html:7 -#: templates/core/plugin_list.html:12 +#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 +#: netbox/templates/core/plugin.html:13 +#: netbox/templates/core/plugin_list.html:7 +#: netbox/templates/core/plugin_list.html:12 msgid "Plugins" msgstr "插件" -#: netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:459 msgid "Configuration History" msgstr "配置历史记录" -#: netbox/navigation/menu.py:465 templates/core/rq_task.html:8 -#: templates/core/rq_task_list.html:22 +#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "后台任务" -#: netbox/plugins/navigation.py:47 netbox/plugins/navigation.py:69 +#: netbox/netbox/plugins/navigation.py:47 +#: netbox/netbox/plugins/navigation.py:69 msgid "Permissions must be passed as a tuple or list." msgstr "权限必须以元组或列表的形式传递。" -#: netbox/plugins/navigation.py:51 +#: netbox/netbox/plugins/navigation.py:51 msgid "Buttons must be passed as a tuple or list." msgstr "按钮必须作为元组或列表传递。" -#: netbox/plugins/navigation.py:73 +#: netbox/netbox/plugins/navigation.py:73 msgid "Button color must be a choice within ButtonColorChoices." msgstr "按钮颜色必须是颜色可选项中的一个。" -#: netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:25 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an " "instance!" msgstr "PluginTemplateExtension类{template_extension}已作为实例传递!" -#: netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:31 #, python-brace-format msgid "" "{template_extension} is not a subclass of " "netbox.plugins.PluginTemplateExtension!" msgstr "{template_extension} 不是netbox.plugins.PluginTemplateExtension的子类。" -#: netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:51 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{item} 必须是netbox.plugins.PluginMenuItem的实例。" -#: netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:62 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "{menu_link} 必须是netbox.plugins.PluginMenuItem的实例。" -#: netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:67 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "{button}必须是netbox.plugins.PluginMenuButton的实例。" -#: netbox/plugins/templates.py:37 +#: netbox/netbox/plugins/templates.py:37 msgid "extra_context must be a dictionary" msgstr "附加实例必须是字典" -#: netbox/preferences.py:19 +#: netbox/netbox/preferences.py:19 msgid "HTMX Navigation" msgstr "HTMX 导航" -#: netbox/preferences.py:24 +#: netbox/netbox/preferences.py:24 msgid "Enable dynamic UI navigation" msgstr "启用动态 UI 导航" -#: netbox/preferences.py:26 +#: netbox/netbox/preferences.py:26 msgid "Experimental feature" msgstr "实验性功能" -#: netbox/preferences.py:29 +#: netbox/netbox/preferences.py:29 msgid "Language" msgstr "语言" -#: netbox/preferences.py:34 +#: netbox/netbox/preferences.py:34 msgid "Forces UI translation to the specified language" msgstr "强制将 UI 翻译成指定语言" -#: netbox/preferences.py:36 +#: netbox/netbox/preferences.py:36 msgid "Support for translation has been disabled locally" msgstr "对翻译的支持已在本地禁用" -#: netbox/preferences.py:42 +#: netbox/netbox/preferences.py:42 msgid "Page length" msgstr "页面长度" -#: netbox/preferences.py:44 +#: netbox/netbox/preferences.py:44 msgid "The default number of objects to display per page" msgstr "每页默认显示的对象数" -#: netbox/preferences.py:48 +#: netbox/netbox/preferences.py:48 msgid "Paginator placement" msgstr "分页器位置" -#: netbox/preferences.py:50 +#: netbox/netbox/preferences.py:50 msgid "Bottom" msgstr "底部" -#: netbox/preferences.py:51 +#: netbox/netbox/preferences.py:51 msgid "Top" msgstr "顶部" -#: netbox/preferences.py:52 +#: netbox/netbox/preferences.py:52 msgid "Both" msgstr "两者皆有" -#: netbox/preferences.py:55 +#: netbox/netbox/preferences.py:55 msgid "Where the paginator controls will be displayed relative to a table" msgstr "分页器控件相对于表格的显示位置" -#: netbox/preferences.py:60 +#: netbox/netbox/preferences.py:60 msgid "Data format" msgstr "数据格式" -#: netbox/preferences.py:65 +#: netbox/netbox/preferences.py:65 msgid "The preferred syntax for displaying generic data within the UI" msgstr "在UI中显示通用数据的首选语法" -#: netbox/registry.py:14 +#: netbox/netbox/registry.py:14 #, python-brace-format msgid "Invalid store: {key}" msgstr "无效商店: {key}" -#: netbox/registry.py:17 +#: netbox/netbox/registry.py:17 msgid "Cannot add stores to registry after initialization" msgstr "初始化后无法在注册表中添加存储空间" -#: netbox/registry.py:20 +#: netbox/netbox/registry.py:20 msgid "Cannot delete stores from registry" msgstr "无法从注册表中删除存储" -#: netbox/settings.py:760 +#: netbox/netbox/settings.py:760 msgid "Czech" msgstr "捷克语" -#: netbox/settings.py:761 +#: netbox/netbox/settings.py:761 msgid "Danish" msgstr "丹麦语" -#: netbox/settings.py:762 +#: netbox/netbox/settings.py:762 msgid "German" msgstr "德语" -#: netbox/settings.py:763 +#: netbox/netbox/settings.py:763 msgid "English" msgstr "英语" -#: netbox/settings.py:764 +#: netbox/netbox/settings.py:764 msgid "Spanish" msgstr "西班牙语" -#: netbox/settings.py:765 +#: netbox/netbox/settings.py:765 msgid "French" msgstr "法语" -#: netbox/settings.py:766 +#: netbox/netbox/settings.py:766 msgid "Italian" msgstr "意大利语" -#: netbox/settings.py:767 +#: netbox/netbox/settings.py:767 msgid "Japanese" msgstr "日语" -#: netbox/settings.py:768 +#: netbox/netbox/settings.py:768 msgid "Dutch" msgstr "荷兰语" -#: netbox/settings.py:769 +#: netbox/netbox/settings.py:769 msgid "Polish" msgstr "波兰语" -#: netbox/settings.py:770 +#: netbox/netbox/settings.py:770 msgid "Portuguese" msgstr "葡萄牙语" -#: netbox/settings.py:771 +#: netbox/netbox/settings.py:771 msgid "Russian" msgstr "俄语" -#: netbox/settings.py:772 +#: netbox/netbox/settings.py:772 msgid "Turkish" msgstr "土耳其语" -#: netbox/settings.py:773 +#: netbox/netbox/settings.py:773 msgid "Ukrainian" msgstr "乌克兰语" -#: netbox/settings.py:774 +#: netbox/netbox/settings.py:774 msgid "Chinese" msgstr "中文" -#: netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:176 msgid "Select all" msgstr "选择全部" -#: netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:189 msgid "Toggle all" msgstr "全部切换" -#: netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:300 msgid "Toggle Dropdown" msgstr "切换下拉菜单" -#: netbox/tables/columns.py:572 templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 msgid "Error" msgstr "错误" -#: netbox/tables/tables.py:58 +#: netbox/netbox/tables/tables.py:58 #, python-brace-format msgid "No {model_name} found" msgstr "找不到 {model_name} " -#: netbox/tables/tables.py:249 templates/generic/bulk_import.html:117 +#: netbox/netbox/tables/tables.py:249 +#: netbox/templates/generic/bulk_import.html:117 msgid "Field" msgstr "字段" -#: netbox/tables/tables.py:252 +#: netbox/netbox/tables/tables.py:252 msgid "Value" msgstr "值" -#: netbox/tests/dummy_plugin/navigation.py:29 +#: netbox/netbox/tests/dummy_plugin/navigation.py:29 msgid "Dummy Plugin" msgstr "虚拟插件" -#: netbox/views/generic/bulk_views.py:114 +#: netbox/netbox/views/generic/bulk_views.py:114 #, python-brace-format msgid "" "There was an error rendering the selected export template ({template}): " "{error}" msgstr "渲染所选导出模板时出错 ({template}): {error}" -#: netbox/views/generic/bulk_views.py:416 +#: netbox/netbox/views/generic/bulk_views.py:416 #, python-brace-format msgid "Row {i}: Object with ID {id} does not exist" msgstr "第{i}行: ID为{id}的对象不存在" -#: netbox/views/generic/bulk_views.py:709 -#: netbox/views/generic/bulk_views.py:907 -#: netbox/views/generic/bulk_views.py:955 +#: netbox/netbox/views/generic/bulk_views.py:709 +#: netbox/netbox/views/generic/bulk_views.py:910 +#: netbox/netbox/views/generic/bulk_views.py:958 #, python-brace-format msgid "No {object_type} were selected." msgstr "没有 {object_type} 被选中。" -#: netbox/views/generic/bulk_views.py:789 +#: netbox/netbox/views/generic/bulk_views.py:788 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "重命名 {count} {object_type}" -#: netbox/views/generic/bulk_views.py:885 +#: netbox/netbox/views/generic/bulk_views.py:888 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "已删除 {count} {object_type}" -#: netbox/views/generic/feature_views.py:40 +#: netbox/netbox/views/generic/feature_views.py:40 msgid "Changelog" msgstr "变更日志" -#: netbox/views/generic/feature_views.py:93 +#: netbox/netbox/views/generic/feature_views.py:93 msgid "Journal" msgstr "日志" -#: netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:207 msgid "Unable to synchronize data: No data file set." msgstr "无法同步数据:未设置任何数据文件。" -#: netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:211 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "的同步数据 {object_type} {object}。" -#: netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:236 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "已同步 {count} {object_type}" -#: netbox/views/generic/object_views.py:108 +#: netbox/netbox/views/generic/object_views.py:108 #, python-brace-format msgid "{class_name} must implement get_children()" msgstr "{class_name}必须实现get_children()方法" -#: netbox/views/misc.py:46 +#: netbox/netbox/views/misc.py:46 msgid "" "There was an error loading the dashboard configuration. A default dashboard " "is in use." msgstr "加载仪表盘配置时出错。正在使用默认仪表盘。" -#: templates/403.html:4 +#: netbox/templates/403.html:4 msgid "Access Denied" msgstr "拒绝访问" -#: templates/403.html:9 +#: netbox/templates/403.html:9 msgid "You do not have permission to access this page" msgstr "你没有权限访问该页面" -#: templates/404.html:4 +#: netbox/templates/404.html:4 msgid "Page Not Found" msgstr "找不到页面" -#: templates/404.html:9 +#: netbox/templates/404.html:9 msgid "The requested page does not exist" msgstr "请求的页面不存在" -#: templates/500.html:7 templates/500.html:18 +#: netbox/templates/500.html:7 netbox/templates/500.html:18 msgid "Server Error" msgstr "服务器错误" -#: templates/500.html:23 +#: netbox/templates/500.html:23 msgid "There was a problem with your request. Please contact an administrator" msgstr "请求出错。 请联系管理员" -#: templates/500.html:28 +#: netbox/templates/500.html:28 msgid "The complete exception is provided below" msgstr "异常信息如下" -#: templates/500.html:33 templates/core/system.html:40 +#: netbox/templates/500.html:33 netbox/templates/core/system.html:40 msgid "Python version" msgstr "Python 版本" -#: templates/500.html:34 +#: netbox/templates/500.html:34 msgid "NetBox version" msgstr "NetBox 版本" -#: templates/500.html:36 +#: netbox/templates/500.html:36 msgid "None installed" msgstr "未安装" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "If further assistance is required, please post to the" msgstr "如果需要进一步帮助,请提交到" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "NetBox discussion forum" msgstr "NetBox 论坛" -#: templates/500.html:39 +#: netbox/templates/500.html:39 msgid "on GitHub" msgstr "在GitHub上" -#: templates/500.html:42 templates/base/40x.html:17 +#: netbox/templates/500.html:42 netbox/templates/base/40x.html:17 msgid "Home Page" msgstr "主页" -#: templates/account/base.html:7 templates/inc/user_menu.html:45 -#: vpn/forms/bulk_edit.py:255 vpn/forms/filtersets.py:189 -#: vpn/forms/model_forms.py:379 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 +#: netbox/vpn/forms/model_forms.py:379 msgid "Profile" msgstr "个人资料" -#: templates/account/base.html:13 templates/account/notifications.html:7 -#: templates/inc/user_menu.html:15 +#: netbox/templates/account/base.html:13 +#: netbox/templates/account/notifications.html:7 +#: netbox/templates/inc/user_menu.html:15 msgid "Notifications" msgstr "通知" -#: templates/account/base.html:16 templates/account/subscriptions.html:7 -#: templates/inc/user_menu.html:51 +#: netbox/templates/account/base.html:16 +#: netbox/templates/account/subscriptions.html:7 +#: netbox/templates/inc/user_menu.html:51 msgid "Subscriptions" msgstr "订阅" -#: templates/account/base.html:19 templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 +#: netbox/templates/inc/user_menu.html:54 msgid "Preferences" msgstr "首选项" -#: templates/account/password.html:5 +#: netbox/templates/account/password.html:5 msgid "Change Password" msgstr "修改密码" -#: templates/account/password.html:19 templates/account/preferences.html:77 -#: templates/core/configrevision_restore.html:63 -#: templates/dcim/devicebay_populate.html:34 -#: templates/dcim/virtualchassis_add_member.html:26 -#: templates/dcim/virtualchassis_edit.html:103 -#: templates/extras/object_journal.html:26 templates/extras/script.html:38 -#: templates/generic/bulk_add_component.html:67 -#: templates/generic/bulk_delete.html:65 templates/generic/bulk_edit.html:106 -#: templates/generic/bulk_import.html:56 templates/generic/bulk_import.html:78 -#: templates/generic/bulk_import.html:100 -#: templates/generic/bulk_remove.html:62 templates/generic/bulk_rename.html:63 -#: templates/generic/confirmation_form.html:19 -#: templates/generic/object_edit.html:72 templates/htmx/delete_form.html:53 -#: templates/htmx/delete_form.html:55 templates/ipam/ipaddress_assign.html:28 -#: templates/virtualization/cluster_add_devices.html:30 +#: netbox/templates/account/password.html:19 +#: netbox/templates/account/preferences.html:77 +#: netbox/templates/core/configrevision_restore.html:63 +#: netbox/templates/dcim/devicebay_populate.html:34 +#: netbox/templates/dcim/virtualchassis_add_member.html:26 +#: netbox/templates/dcim/virtualchassis_edit.html:103 +#: netbox/templates/extras/object_journal.html:26 +#: netbox/templates/extras/script.html:38 +#: netbox/templates/generic/bulk_add_component.html:67 +#: netbox/templates/generic/bulk_delete.html:65 +#: netbox/templates/generic/bulk_edit.html:106 +#: netbox/templates/generic/bulk_import.html:56 +#: netbox/templates/generic/bulk_import.html:78 +#: netbox/templates/generic/bulk_import.html:100 +#: netbox/templates/generic/bulk_remove.html:62 +#: netbox/templates/generic/bulk_rename.html:63 +#: netbox/templates/generic/confirmation_form.html:19 +#: netbox/templates/generic/object_edit.html:72 +#: netbox/templates/htmx/delete_form.html:53 +#: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/ipam/ipaddress_assign.html:28 +#: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" msgstr "取消" -#: templates/account/password.html:20 templates/account/preferences.html:78 -#: templates/dcim/devicebay_populate.html:35 -#: templates/dcim/virtualchassis_add_member.html:28 -#: templates/dcim/virtualchassis_edit.html:105 -#: templates/extras/dashboard/widget_add.html:26 -#: templates/extras/dashboard/widget_config.html:19 -#: templates/extras/object_journal.html:27 -#: templates/generic/object_edit.html:75 -#: utilities/templates/helpers/applied_filters.html:16 -#: utilities/templates/helpers/table_config_form.html:40 +#: netbox/templates/account/password.html:20 +#: netbox/templates/account/preferences.html:78 +#: netbox/templates/dcim/devicebay_populate.html:35 +#: netbox/templates/dcim/virtualchassis_add_member.html:28 +#: netbox/templates/dcim/virtualchassis_edit.html:105 +#: netbox/templates/extras/dashboard/widget_add.html:26 +#: netbox/templates/extras/dashboard/widget_config.html:19 +#: netbox/templates/extras/object_journal.html:27 +#: netbox/templates/generic/object_edit.html:75 +#: netbox/utilities/templates/helpers/applied_filters.html:16 +#: netbox/utilities/templates/helpers/table_config_form.html:40 msgid "Save" msgstr "保存" -#: templates/account/preferences.html:34 +#: netbox/templates/account/preferences.html:34 msgid "Table Configurations" msgstr "配置查看列表" -#: templates/account/preferences.html:39 +#: netbox/templates/account/preferences.html:39 msgid "Clear table preferences" msgstr "清理列表自定义选项" -#: templates/account/preferences.html:47 +#: netbox/templates/account/preferences.html:47 msgid "Toggle All" msgstr "全部切换" -#: templates/account/preferences.html:49 +#: netbox/templates/account/preferences.html:49 msgid "Table" msgstr "列表" -#: templates/account/preferences.html:50 +#: netbox/templates/account/preferences.html:50 msgid "Ordering" msgstr "订阅" -#: templates/account/preferences.html:51 +#: netbox/templates/account/preferences.html:51 msgid "Columns" msgstr "专栏" -#: templates/account/preferences.html:71 templates/dcim/cable_trace.html:113 -#: templates/extras/object_configcontext.html:43 +#: netbox/templates/account/preferences.html:71 +#: netbox/templates/dcim/cable_trace.html:113 +#: netbox/templates/extras/object_configcontext.html:43 msgid "None found" msgstr "未找到任何内容" -#: templates/account/profile.html:6 +#: netbox/templates/account/profile.html:6 msgid "User Profile" msgstr "用户个人资料" -#: templates/account/profile.html:12 +#: netbox/templates/account/profile.html:12 msgid "Account Details" msgstr "账户详情" -#: templates/account/profile.html:29 templates/tenancy/contact.html:43 -#: templates/users/user.html:25 tenancy/forms/bulk_edit.py:109 +#: netbox/templates/account/profile.html:29 +#: netbox/templates/tenancy/contact.html:43 +#: netbox/templates/users/user.html:25 netbox/tenancy/forms/bulk_edit.py:109 msgid "Email" msgstr "电子邮箱" -#: templates/account/profile.html:33 templates/users/user.html:29 +#: netbox/templates/account/profile.html:33 +#: netbox/templates/users/user.html:29 msgid "Account Created" msgstr "创建账号" -#: templates/account/profile.html:37 templates/users/user.html:33 +#: netbox/templates/account/profile.html:37 +#: netbox/templates/users/user.html:33 msgid "Last Login" msgstr "最后登录" -#: templates/account/profile.html:41 templates/users/user.html:45 +#: netbox/templates/account/profile.html:41 +#: netbox/templates/users/user.html:45 msgid "Superuser" msgstr "超级管理员用户" -#: templates/account/profile.html:45 templates/inc/user_menu.html:31 -#: templates/users/user.html:41 +#: netbox/templates/account/profile.html:45 +#: netbox/templates/inc/user_menu.html:31 netbox/templates/users/user.html:41 msgid "Staff" msgstr "工作人员" -#: templates/account/profile.html:53 templates/users/objectpermission.html:82 -#: templates/users/user.html:53 +#: netbox/templates/account/profile.html:53 +#: netbox/templates/users/objectpermission.html:82 +#: netbox/templates/users/user.html:53 msgid "Assigned Groups" msgstr "指定用户组" -#: templates/account/profile.html:58 -#: templates/circuits/circuit_terminations_swap.html:18 -#: templates/circuits/circuit_terminations_swap.html:26 -#: templates/circuits/circuittermination.html:34 -#: templates/circuits/inc/circuit_termination.html:68 -#: templates/core/objectchange.html:124 templates/core/objectchange.html:142 -#: templates/dcim/devicebay.html:59 -#: templates/dcim/inc/panels/inventory_items.html:45 -#: templates/dcim/interface.html:296 templates/dcim/modulebay.html:80 -#: templates/extras/configcontext.html:70 templates/extras/eventrule.html:66 -#: templates/extras/htmx/script_result.html:60 -#: templates/extras/webhook.html:65 templates/extras/webhook.html:75 -#: templates/inc/panel_table.html:13 templates/inc/panels/comments.html:10 -#: templates/ipam/inc/panels/fhrp_groups.html:56 templates/users/group.html:34 -#: templates/users/group.html:44 templates/users/objectpermission.html:77 -#: templates/users/objectpermission.html:87 templates/users/user.html:58 -#: templates/users/user.html:68 +#: netbox/templates/account/profile.html:58 +#: netbox/templates/circuits/circuit_terminations_swap.html:18 +#: netbox/templates/circuits/circuit_terminations_swap.html:26 +#: netbox/templates/circuits/circuittermination.html:34 +#: netbox/templates/circuits/inc/circuit_termination.html:68 +#: netbox/templates/core/objectchange.html:124 +#: netbox/templates/core/objectchange.html:142 +#: netbox/templates/dcim/devicebay.html:59 +#: netbox/templates/dcim/inc/panels/inventory_items.html:45 +#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/modulebay.html:80 +#: netbox/templates/extras/configcontext.html:70 +#: netbox/templates/extras/eventrule.html:66 +#: netbox/templates/extras/htmx/script_result.html:60 +#: netbox/templates/extras/webhook.html:65 +#: netbox/templates/extras/webhook.html:75 +#: netbox/templates/inc/panel_table.html:13 +#: netbox/templates/inc/panels/comments.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:56 +#: netbox/templates/users/group.html:34 netbox/templates/users/group.html:44 +#: netbox/templates/users/objectpermission.html:77 +#: netbox/templates/users/objectpermission.html:87 +#: netbox/templates/users/user.html:58 netbox/templates/users/user.html:68 msgid "None" msgstr "无" -#: templates/account/profile.html:68 templates/users/user.html:78 +#: netbox/templates/account/profile.html:68 +#: netbox/templates/users/user.html:78 msgid "Recent Activity" msgstr "近期活动" -#: templates/account/token.html:8 templates/account/token_list.html:6 +#: netbox/templates/account/token.html:8 +#: netbox/templates/account/token_list.html:6 msgid "My API Tokens" msgstr "我的 API Token" -#: templates/account/token.html:11 templates/account/token.html:19 -#: templates/users/token.html:6 templates/users/token.html:14 -#: users/forms/filtersets.py:120 +#: netbox/templates/account/token.html:11 +#: netbox/templates/account/token.html:19 netbox/templates/users/token.html:6 +#: netbox/templates/users/token.html:14 netbox/users/forms/filtersets.py:120 msgid "Token" msgstr "Token" -#: templates/account/token.html:39 templates/users/token.html:31 -#: users/forms/bulk_edit.py:107 +#: netbox/templates/account/token.html:39 netbox/templates/users/token.html:31 +#: netbox/users/forms/bulk_edit.py:107 msgid "Write enabled" msgstr "启用写入" -#: templates/account/token.html:51 templates/users/token.html:43 +#: netbox/templates/account/token.html:51 netbox/templates/users/token.html:43 msgid "Last used" msgstr "最后使用" -#: templates/account/token_list.html:12 +#: netbox/templates/account/token_list.html:12 msgid "Add a Token" msgstr "添加 Token" -#: templates/base/base.html:22 templates/home.html:27 +#: netbox/templates/base/base.html:22 netbox/templates/home.html:27 msgid "Home" msgstr "主页" -#: templates/base/layout.html:25 +#: netbox/templates/base/layout.html:25 msgid "NetBox Motif" msgstr "NetBox 图案" -#: templates/base/layout.html:38 templates/base/layout.html:39 -#: templates/login.html:14 templates/login.html:15 +#: netbox/templates/base/layout.html:38 netbox/templates/base/layout.html:39 +#: netbox/templates/login.html:14 netbox/templates/login.html:15 msgid "NetBox Logo" msgstr "NetBox Logo" -#: templates/base/layout.html:150 templates/base/layout.html:151 +#: netbox/templates/base/layout.html:150 netbox/templates/base/layout.html:151 msgid "Docs" msgstr "文档" -#: templates/base/layout.html:156 templates/base/layout.html:157 -#: templates/rest_framework/api.html:10 +#: netbox/templates/base/layout.html:156 netbox/templates/base/layout.html:157 +#: netbox/templates/rest_framework/api.html:10 msgid "REST API" msgstr "REST API" -#: templates/base/layout.html:162 templates/base/layout.html:163 +#: netbox/templates/base/layout.html:162 netbox/templates/base/layout.html:163 msgid "REST API documentation" msgstr "REST API 文档" -#: templates/base/layout.html:169 templates/base/layout.html:170 +#: netbox/templates/base/layout.html:169 netbox/templates/base/layout.html:170 msgid "GraphQL API" msgstr "GraphQL API" -#: templates/base/layout.html:185 templates/base/layout.html:186 +#: netbox/templates/base/layout.html:185 netbox/templates/base/layout.html:186 msgid "NetBox Labs Support" msgstr "NetBox 实验室支持" -#: templates/base/layout.html:194 templates/base/layout.html:195 +#: netbox/templates/base/layout.html:194 netbox/templates/base/layout.html:195 msgid "Source Code" msgstr "源代码" -#: templates/base/layout.html:200 templates/base/layout.html:201 +#: netbox/templates/base/layout.html:200 netbox/templates/base/layout.html:201 msgid "Community" msgstr "社区" -#: templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:47 msgid "Install Date" msgstr "安装时间" -#: templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:51 msgid "Termination Date" msgstr "维护模式" -#: templates/circuits/circuit.html:70 -#: templates/ipam/inc/panels/fhrp_groups.html:15 +#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "分配组" -#: templates/circuits/circuit_terminations_swap.html:4 +#: netbox/templates/circuits/circuit_terminations_swap.html:4 msgid "Swap Circuit Terminations" msgstr "交换线路终点" -#: templates/circuits/circuit_terminations_swap.html:8 +#: netbox/templates/circuits/circuit_terminations_swap.html:8 #, python-format msgid "Swap these terminations for circuit %(circuit)s?" msgstr "将这些终结换成线路 %(circuit)s?" -#: templates/circuits/circuit_terminations_swap.html:14 +#: netbox/templates/circuits/circuit_terminations_swap.html:14 msgid "A side" msgstr "A端" -#: templates/circuits/circuit_terminations_swap.html:22 +#: netbox/templates/circuits/circuit_terminations_swap.html:22 msgid "Z side" msgstr "Z端" -#: templates/circuits/circuitgroup.html:16 +#: netbox/templates/circuits/circuitgroup.html:16 msgid "Assign Circuit" msgstr "分配电路" -#: templates/circuits/circuitgroupassignment.html:19 +#: netbox/templates/circuits/circuitgroupassignment.html:19 msgid "Circuit Group Assignment" msgstr "电路组分配" -#: templates/circuits/circuittype.html:10 +#: netbox/templates/circuits/circuittype.html:10 msgid "Add Circuit" msgstr "增加线路" -#: templates/circuits/circuittype.html:19 +#: netbox/templates/circuits/circuittype.html:19 msgid "Circuit Type" msgstr "线路类型" -#: templates/circuits/inc/circuit_termination.html:10 -#: templates/dcim/manufacturer.html:11 -#: templates/generic/bulk_add_component.html:22 -#: templates/users/objectpermission.html:38 -#: utilities/templates/buttons/add.html:4 -#: utilities/templates/helpers/table_config_form.html:20 +#: netbox/templates/circuits/inc/circuit_termination.html:10 +#: netbox/templates/dcim/manufacturer.html:11 +#: netbox/templates/generic/bulk_add_component.html:22 +#: netbox/templates/users/objectpermission.html:38 +#: netbox/utilities/templates/buttons/add.html:4 +#: netbox/utilities/templates/helpers/table_config_form.html:20 msgid "Add" msgstr "添加" -#: templates/circuits/inc/circuit_termination.html:15 -#: templates/circuits/inc/circuit_termination_fields.html:36 -#: templates/dcim/inc/panels/inventory_items.html:32 -#: templates/dcim/powerpanel.html:56 templates/extras/script_list.html:30 -#: templates/generic/object_edit.html:47 -#: templates/ipam/inc/ipaddress_edit_header.html:7 -#: templates/ipam/inc/panels/fhrp_groups.html:43 -#: utilities/templates/buttons/edit.html:3 +#: netbox/templates/circuits/inc/circuit_termination.html:15 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/dcim/inc/panels/inventory_items.html:32 +#: netbox/templates/dcim/powerpanel.html:56 +#: netbox/templates/extras/script_list.html:30 +#: netbox/templates/generic/object_edit.html:47 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:43 +#: netbox/utilities/templates/buttons/edit.html:3 msgid "Edit" msgstr "编辑" -#: templates/circuits/inc/circuit_termination.html:18 +#: netbox/templates/circuits/inc/circuit_termination.html:18 msgid "Swap" msgstr "交换" -#: templates/circuits/inc/circuit_termination_fields.html:19 -#: templates/dcim/consoleport.html:59 templates/dcim/consoleserverport.html:60 -#: templates/dcim/powerfeed.html:114 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/dcim/consoleport.html:59 +#: netbox/templates/dcim/consoleserverport.html:60 +#: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "标记为已连接" -#: templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 msgid "to" msgstr "到" -#: templates/circuits/inc/circuit_termination_fields.html:31 -#: templates/circuits/inc/circuit_termination_fields.html:32 -#: templates/dcim/frontport.html:80 -#: templates/dcim/inc/connection_endpoints.html:7 -#: templates/dcim/interface.html:154 templates/dcim/rearport.html:76 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/dcim/frontport.html:80 +#: netbox/templates/dcim/inc/connection_endpoints.html:7 +#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "跟踪" -#: templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 msgid "Edit cable" msgstr "编辑线缆" -#: templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 msgid "Remove cable" msgstr "删除线缆" -#: templates/circuits/inc/circuit_termination_fields.html:41 -#: templates/dcim/bulk_disconnect.html:5 -#: templates/dcim/device/consoleports.html:12 -#: templates/dcim/device/consoleserverports.html:12 -#: templates/dcim/device/frontports.html:12 -#: templates/dcim/device/interfaces.html:16 -#: templates/dcim/device/poweroutlets.html:12 -#: templates/dcim/device/powerports.html:12 -#: templates/dcim/device/rearports.html:12 templates/dcim/powerpanel.html:61 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/dcim/bulk_disconnect.html:5 +#: netbox/templates/dcim/device/consoleports.html:12 +#: netbox/templates/dcim/device/consoleserverports.html:12 +#: netbox/templates/dcim/device/frontports.html:12 +#: netbox/templates/dcim/device/interfaces.html:16 +#: netbox/templates/dcim/device/poweroutlets.html:12 +#: netbox/templates/dcim/device/powerports.html:12 +#: netbox/templates/dcim/device/rearports.html:12 +#: netbox/templates/dcim/powerpanel.html:61 msgid "Disconnect" msgstr "断开" -#: templates/circuits/inc/circuit_termination_fields.html:48 -#: templates/dcim/consoleport.html:69 templates/dcim/consoleserverport.html:70 -#: templates/dcim/frontport.html:102 templates/dcim/interface.html:180 -#: templates/dcim/interface.html:200 templates/dcim/powerfeed.html:127 -#: templates/dcim/poweroutlet.html:71 templates/dcim/poweroutlet.html:72 -#: templates/dcim/powerport.html:73 templates/dcim/rearport.html:98 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/dcim/consoleport.html:69 +#: netbox/templates/dcim/consoleserverport.html:70 +#: netbox/templates/dcim/frontport.html:102 +#: netbox/templates/dcim/interface.html:180 +#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/powerfeed.html:127 +#: netbox/templates/dcim/poweroutlet.html:71 +#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/powerport.html:73 +#: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "连接" -#: templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 msgid "Downstream" msgstr "下游" -#: templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 msgid "Upstream" msgstr "上游" -#: templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 msgid "Cross-Connect" msgstr "交叉连接" -#: templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 msgid "Patch Panel/Port" msgstr "配线架/端口" -#: templates/circuits/provider.html:11 +#: netbox/templates/circuits/provider.html:11 msgid "Add circuit" msgstr "添加线路" -#: templates/circuits/provideraccount.html:17 +#: netbox/templates/circuits/provideraccount.html:17 msgid "Provider Account" msgstr "运营商帐户" -#: templates/core/configrevision.html:35 +#: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "配置数据" -#: templates/core/configrevision.html:40 +#: netbox/templates/core/configrevision.html:40 msgid "Comment" msgstr "评论" -#: templates/core/configrevision_restore.html:8 -#: templates/core/configrevision_restore.html:25 -#: templates/core/configrevision_restore.html:64 +#: netbox/templates/core/configrevision_restore.html:8 +#: netbox/templates/core/configrevision_restore.html:25 +#: netbox/templates/core/configrevision_restore.html:64 msgid "Restore" msgstr "还原" -#: templates/core/configrevision_restore.html:36 +#: netbox/templates/core/configrevision_restore.html:36 msgid "Parameter" msgstr "参数" -#: templates/core/configrevision_restore.html:37 +#: netbox/templates/core/configrevision_restore.html:37 msgid "Current Value" msgstr "当前变量" -#: templates/core/configrevision_restore.html:38 +#: netbox/templates/core/configrevision_restore.html:38 msgid "New Value" msgstr "新变量" -#: templates/core/configrevision_restore.html:50 +#: netbox/templates/core/configrevision_restore.html:50 msgid "Changed" msgstr "已更改" -#: templates/core/datafile.html:42 templates/ipam/iprange.html:25 -#: templates/virtualization/virtualdisk.html:29 -#: virtualization/tables/virtualmachines.py:198 +#: netbox/templates/core/datafile.html:42 +#: netbox/templates/ipam/iprange.html:25 +#: netbox/templates/virtualization/virtualdisk.html:29 +#: netbox/virtualization/tables/virtualmachines.py:198 msgid "Size" msgstr "大小" -#: templates/core/datafile.html:43 +#: netbox/templates/core/datafile.html:43 msgid "bytes" msgstr "bytes" -#: templates/core/datafile.html:46 +#: netbox/templates/core/datafile.html:46 msgid "SHA256 Hash" msgstr "SHA256 Hash" -#: templates/core/datasource.html:14 templates/core/datasource.html:20 -#: utilities/templates/buttons/sync.html:5 +#: netbox/templates/core/datasource.html:14 +#: netbox/templates/core/datasource.html:20 +#: netbox/utilities/templates/buttons/sync.html:5 msgid "Sync" msgstr "同步" -#: templates/core/datasource.html:50 +#: netbox/templates/core/datasource.html:50 msgid "Last synced" msgstr "最后同步" -#: templates/core/datasource.html:84 +#: netbox/templates/core/datasource.html:84 msgid "Backend" msgstr "后台" -#: templates/core/datasource.html:99 +#: netbox/templates/core/datasource.html:99 msgid "No parameters defined" msgstr "未定义参数" -#: templates/core/datasource.html:114 +#: netbox/templates/core/datasource.html:114 msgid "Files" msgstr "文件" -#: templates/core/inc/config_data.html:7 +#: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" msgstr "机柜立面图" -#: templates/core/inc/config_data.html:10 +#: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" msgstr "默认U位高度" -#: templates/core/inc/config_data.html:14 +#: netbox/templates/core/inc/config_data.html:14 msgid "Default unit width" msgstr "默认U位宽度" -#: templates/core/inc/config_data.html:20 +#: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" msgstr "供电线路" -#: templates/core/inc/config_data.html:23 +#: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" msgstr "默认电压" -#: templates/core/inc/config_data.html:27 +#: netbox/templates/core/inc/config_data.html:27 msgid "Default amperage" msgstr "默认电流" -#: templates/core/inc/config_data.html:31 +#: netbox/templates/core/inc/config_data.html:31 msgid "Default max utilization" msgstr "默认最高功率" -#: templates/core/inc/config_data.html:40 +#: netbox/templates/core/inc/config_data.html:40 msgid "Enforce global unique" msgstr "执行全局唯一" -#: templates/core/inc/config_data.html:83 +#: netbox/templates/core/inc/config_data.html:83 msgid "Paginate count" msgstr "分页数量" -#: templates/core/inc/config_data.html:87 +#: netbox/templates/core/inc/config_data.html:87 msgid "Max page size" msgstr "最大页面大小" -#: templates/core/inc/config_data.html:114 +#: netbox/templates/core/inc/config_data.html:114 msgid "User preferences" msgstr "用户首选项" -#: templates/core/inc/config_data.html:141 +#: netbox/templates/core/inc/config_data.html:141 msgid "Job retention" msgstr "任务保留" -#: templates/core/job.html:35 templates/core/rq_task.html:12 -#: templates/core/rq_task.html:49 templates/core/rq_task.html:58 +#: netbox/templates/core/job.html:35 netbox/templates/core/rq_task.html:12 +#: netbox/templates/core/rq_task.html:49 netbox/templates/core/rq_task.html:58 msgid "Job" msgstr "任务" -#: templates/core/job.html:58 templates/extras/journalentry.html:26 +#: netbox/templates/core/job.html:58 +#: netbox/templates/extras/journalentry.html:26 msgid "Created By" msgstr "创建者" -#: templates/core/job.html:66 +#: netbox/templates/core/job.html:66 msgid "Scheduling" msgstr "日程安排" -#: templates/core/job.html:77 +#: netbox/templates/core/job.html:77 #, python-format msgid "every %(interval)s minutes" msgstr "每 %(interval)s 分钟" -#: templates/core/objectchange.html:29 -#: templates/users/objectpermission.html:42 +#: netbox/templates/core/objectchange.html:29 +#: netbox/templates/users/objectpermission.html:42 msgid "Change" msgstr "更改" -#: templates/core/objectchange.html:79 +#: netbox/templates/core/objectchange.html:79 msgid "Difference" msgstr "差异" -#: templates/core/objectchange.html:82 +#: netbox/templates/core/objectchange.html:82 msgid "Previous" msgstr "上一个" -#: templates/core/objectchange.html:85 +#: netbox/templates/core/objectchange.html:85 msgid "Next" msgstr "下一个" -#: templates/core/objectchange.html:93 +#: netbox/templates/core/objectchange.html:93 msgid "Object Created" msgstr "对象已创建" -#: templates/core/objectchange.html:95 +#: netbox/templates/core/objectchange.html:95 msgid "Object Deleted" msgstr "对象已删除" -#: templates/core/objectchange.html:97 +#: netbox/templates/core/objectchange.html:97 msgid "No Changes" msgstr "没有改变" -#: templates/core/objectchange.html:111 +#: netbox/templates/core/objectchange.html:111 msgid "Pre-Change Data" msgstr "变更前配置" -#: templates/core/objectchange.html:122 +#: netbox/templates/core/objectchange.html:122 msgid "Warning: Comparing non-atomic change to previous change record" msgstr "警告:将非原子更改与以前的更改记录进行比较" -#: templates/core/objectchange.html:131 +#: netbox/templates/core/objectchange.html:131 msgid "Post-Change Data" msgstr "变更后配置" -#: templates/core/objectchange.html:162 +#: netbox/templates/core/objectchange.html:162 #, python-format msgid "See All %(count)s Changes" msgstr "查看所有的%(count)s个变更" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Change log retention" msgstr "变更日志保留" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "days" msgstr "天" -#: templates/core/objectchange_list.html:9 -#: templates/extras/object_changelog.html:15 +#: netbox/templates/core/objectchange_list.html:9 +#: netbox/templates/extras/object_changelog.html:15 msgid "Indefinite" msgstr "无限期的" -#: templates/core/plugin.html:22 +#: netbox/templates/core/plugin.html:22 msgid "Not installed" msgstr "未安装" -#: templates/core/plugin.html:33 +#: netbox/templates/core/plugin.html:33 msgid "Overview" msgstr "概述" -#: templates/core/plugin.html:39 +#: netbox/templates/core/plugin.html:39 msgid "Install" msgstr "安装" -#: templates/core/plugin.html:51 +#: netbox/templates/core/plugin.html:51 msgid "Plugin Details" msgstr "插件详情" -#: templates/core/plugin.html:58 +#: netbox/templates/core/plugin.html:58 msgid "Summary" msgstr "摘要" -#: templates/core/plugin.html:76 +#: netbox/templates/core/plugin.html:76 msgid "License" msgstr "执照" -#: templates/core/plugin.html:96 +#: netbox/templates/core/plugin.html:96 msgid "Version History" msgstr "版本历史" -#: templates/core/plugin.html:107 +#: netbox/templates/core/plugin.html:107 msgid "Local Installation Instructions" msgstr "本地安装说明" -#: templates/core/rq_queue_list.html:5 templates/core/rq_queue_list.html:13 -#: templates/core/rq_task_list.html:14 templates/core/rq_worker.html:7 +#: netbox/templates/core/rq_queue_list.html:5 +#: netbox/templates/core/rq_queue_list.html:13 +#: netbox/templates/core/rq_task_list.html:14 +#: netbox/templates/core/rq_worker.html:7 msgid "Background Queues" msgstr "后台队列" -#: templates/core/rq_queue_list.html:24 templates/core/rq_queue_list.html:25 -#: templates/core/rq_worker_list.html:49 templates/core/rq_worker_list.html:50 -#: templates/extras/script_result.html:67 -#: templates/extras/script_result.html:69 -#: templates/inc/table_controls_htmx.html:30 -#: templates/inc/table_controls_htmx.html:33 +#: netbox/templates/core/rq_queue_list.html:24 +#: netbox/templates/core/rq_queue_list.html:25 +#: netbox/templates/core/rq_worker_list.html:49 +#: netbox/templates/core/rq_worker_list.html:50 +#: netbox/templates/extras/script_result.html:67 +#: netbox/templates/extras/script_result.html:69 +#: netbox/templates/inc/table_controls_htmx.html:30 +#: netbox/templates/inc/table_controls_htmx.html:33 msgid "Configure Table" msgstr "列设置" -#: templates/core/rq_task.html:29 +#: netbox/templates/core/rq_task.html:29 msgid "Stop" msgstr "停止" -#: templates/core/rq_task.html:34 +#: netbox/templates/core/rq_task.html:34 msgid "Requeue" msgstr "请求" -#: templates/core/rq_task.html:39 +#: netbox/templates/core/rq_task.html:39 msgid "Enqueue" msgstr "排队" -#: templates/core/rq_task.html:61 +#: netbox/templates/core/rq_task.html:61 msgid "Queue" msgstr "队列" -#: templates/core/rq_task.html:65 +#: netbox/templates/core/rq_task.html:65 msgid "Timeout" msgstr "超时" -#: templates/core/rq_task.html:69 +#: netbox/templates/core/rq_task.html:69 msgid "Result TTL" msgstr "TTL 结果" -#: templates/core/rq_task.html:89 +#: netbox/templates/core/rq_task.html:89 msgid "Meta" msgstr "元数据" -#: templates/core/rq_task.html:93 +#: netbox/templates/core/rq_task.html:93 msgid "Arguments" msgstr "参数" -#: templates/core/rq_task.html:97 +#: netbox/templates/core/rq_task.html:97 msgid "Keyword Arguments" msgstr "关键参数" -#: templates/core/rq_task.html:103 +#: netbox/templates/core/rq_task.html:103 msgid "Depends on" msgstr "取决于" -#: templates/core/rq_task.html:109 +#: netbox/templates/core/rq_task.html:109 msgid "Exception" msgstr "例外" -#: templates/core/rq_task_list.html:28 +#: netbox/templates/core/rq_task_list.html:28 msgid "tasks in " msgstr "任务进行中" -#: templates/core/rq_task_list.html:33 +#: netbox/templates/core/rq_task_list.html:33 msgid "Queued Jobs" msgstr "排队中的任务" -#: templates/core/rq_task_list.html:64 templates/extras/script_result.html:86 +#: netbox/templates/core/rq_task_list.html:64 +#: netbox/templates/extras/script_result.html:86 #, python-format msgid "" "Select all %(count)s %(object_type_plural)s matching query" msgstr "选择 所有的 %(count)s 个 %(object_type_plural)s进行查找" -#: templates/core/rq_worker.html:10 +#: netbox/templates/core/rq_worker.html:10 msgid "Worker Info" msgstr "Worker 信息" -#: templates/core/rq_worker.html:31 templates/core/rq_worker.html:40 +#: netbox/templates/core/rq_worker.html:31 +#: netbox/templates/core/rq_worker.html:40 msgid "Worker" msgstr "Worker" -#: templates/core/rq_worker.html:55 +#: netbox/templates/core/rq_worker.html:55 msgid "Queues" msgstr "队列" -#: templates/core/rq_worker.html:63 +#: netbox/templates/core/rq_worker.html:63 msgid "Curent Job" msgstr "当前任务" -#: templates/core/rq_worker.html:67 +#: netbox/templates/core/rq_worker.html:67 msgid "Successful job count" msgstr "完成的任务数" -#: templates/core/rq_worker.html:71 +#: netbox/templates/core/rq_worker.html:71 msgid "Failed job count" msgstr "失败的任务数" -#: templates/core/rq_worker.html:75 +#: netbox/templates/core/rq_worker.html:75 msgid "Total working time" msgstr "任务总计时长" -#: templates/core/rq_worker.html:76 +#: netbox/templates/core/rq_worker.html:76 msgid "seconds" msgstr "秒" -#: templates/core/rq_worker_list.html:13 templates/core/rq_worker_list.html:21 +#: netbox/templates/core/rq_worker_list.html:13 +#: netbox/templates/core/rq_worker_list.html:21 msgid "Background Workers" msgstr "后台任务" -#: templates/core/rq_worker_list.html:29 +#: netbox/templates/core/rq_worker_list.html:29 #, python-format msgid "Workers in %(queue_name)s" msgstr "在%(queue_name)s的 Worker" -#: templates/core/system.html:11 utilities/templates/buttons/export.html:4 +#: netbox/templates/core/system.html:11 +#: netbox/utilities/templates/buttons/export.html:4 msgid "Export" msgstr "导出" -#: templates/core/system.html:28 +#: netbox/templates/core/system.html:28 msgid "System Status" msgstr "系统状态" -#: templates/core/system.html:31 +#: netbox/templates/core/system.html:31 msgid "NetBox release" msgstr "NetBox 发布" -#: templates/core/system.html:44 +#: netbox/templates/core/system.html:44 msgid "Django version" msgstr "Django版本" -#: templates/core/system.html:48 +#: netbox/templates/core/system.html:48 msgid "PostgreSQL version" msgstr "PostgreSQL 版本" -#: templates/core/system.html:52 +#: netbox/templates/core/system.html:52 msgid "Database name" msgstr "数据库名称" -#: templates/core/system.html:56 +#: netbox/templates/core/system.html:56 msgid "Database size" msgstr "数据库大小" -#: templates/core/system.html:61 +#: netbox/templates/core/system.html:61 msgid "Unavailable" msgstr "不可用" -#: templates/core/system.html:66 +#: netbox/templates/core/system.html:66 msgid "RQ workers" msgstr "RQ workers" -#: templates/core/system.html:69 +#: netbox/templates/core/system.html:69 msgid "default queue" msgstr "默认队列" -#: templates/core/system.html:73 +#: netbox/templates/core/system.html:73 msgid "System time" msgstr "系统时间" -#: templates/core/system.html:85 +#: netbox/templates/core/system.html:85 msgid "Current Configuration" msgstr "当前配置" -#: templates/dcim/bulk_disconnect.html:9 +#: netbox/templates/dcim/bulk_disconnect.html:9 #, python-format msgid "" "Are you sure you want to disconnect these %(count)s %(obj_type_plural)s?" msgstr "您确定要断开这些连接 %(count)s %(obj_type_plural)s?" -#: templates/dcim/cable_trace.html:10 +#: netbox/templates/dcim/cable_trace.html:10 #, python-format msgid "Cable Trace for %(object_type)s %(object)s" msgstr "电缆走线用于 %(object_type)s %(object)s" -#: templates/dcim/cable_trace.html:24 templates/dcim/inc/rack_elevation.html:7 +#: netbox/templates/dcim/cable_trace.html:24 +#: netbox/templates/dcim/inc/rack_elevation.html:7 msgid "Download SVG" msgstr "下载 SVG文件" -#: templates/dcim/cable_trace.html:30 +#: netbox/templates/dcim/cable_trace.html:30 msgid "Asymmetric Path" msgstr "非对称路径" -#: templates/dcim/cable_trace.html:31 +#: netbox/templates/dcim/cable_trace.html:31 msgid "The nodes below have no links and result in an asymmetric path" msgstr "下面的节点没有链接,因此路径不对称" -#: templates/dcim/cable_trace.html:38 +#: netbox/templates/dcim/cable_trace.html:38 msgid "Path split" msgstr "(意见) 分歧" -#: templates/dcim/cable_trace.html:39 +#: netbox/templates/dcim/cable_trace.html:39 msgid "Select a node below to continue" msgstr "选择以下节点继续" -#: templates/dcim/cable_trace.html:55 +#: netbox/templates/dcim/cable_trace.html:55 msgid "Trace Completed" msgstr "跟踪已完成" -#: templates/dcim/cable_trace.html:58 +#: netbox/templates/dcim/cable_trace.html:58 msgid "Total segments" msgstr "总分段" -#: templates/dcim/cable_trace.html:62 +#: netbox/templates/dcim/cable_trace.html:62 msgid "Total length" msgstr "总计长度" -#: templates/dcim/cable_trace.html:77 +#: netbox/templates/dcim/cable_trace.html:77 msgid "No paths found" msgstr "未找到路径" -#: templates/dcim/cable_trace.html:85 +#: netbox/templates/dcim/cable_trace.html:85 msgid "Related Paths" msgstr "关联路径" -#: templates/dcim/cable_trace.html:89 +#: netbox/templates/dcim/cable_trace.html:89 msgid "Origin" msgstr "源" -#: templates/dcim/cable_trace.html:90 +#: netbox/templates/dcim/cable_trace.html:90 msgid "Destination" msgstr "目的" -#: templates/dcim/cable_trace.html:91 +#: netbox/templates/dcim/cable_trace.html:91 msgid "Segments" msgstr "分隔符" -#: templates/dcim/cable_trace.html:104 +#: netbox/templates/dcim/cable_trace.html:104 msgid "Incomplete" msgstr "未完成" -#: templates/dcim/component_list.html:14 +#: netbox/templates/dcim/component_list.html:14 msgid "Rename Selected" msgstr "重命名选中项" -#: templates/dcim/consoleport.html:65 templates/dcim/consoleserverport.html:66 -#: templates/dcim/frontport.html:98 templates/dcim/interface.html:176 -#: templates/dcim/poweroutlet.html:69 templates/dcim/powerport.html:69 +#: netbox/templates/dcim/consoleport.html:65 +#: netbox/templates/dcim/consoleserverport.html:66 +#: netbox/templates/dcim/frontport.html:98 +#: netbox/templates/dcim/interface.html:176 +#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "未连接" -#: templates/dcim/device.html:34 +#: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" msgstr "突出显示机架中的设备" -#: templates/dcim/device.html:55 +#: netbox/templates/dcim/device.html:55 msgid "Not racked" msgstr "未上架" -#: templates/dcim/device.html:62 templates/dcim/site.html:94 +#: netbox/templates/dcim/device.html:62 netbox/templates/dcim/site.html:94 msgid "GPS Coordinates" msgstr "GPS坐标" -#: templates/dcim/device.html:68 templates/dcim/site.html:81 -#: templates/dcim/site.html:100 +#: netbox/templates/dcim/device.html:68 netbox/templates/dcim/site.html:81 +#: netbox/templates/dcim/site.html:100 msgid "Map" msgstr "地图" -#: templates/dcim/device.html:108 templates/dcim/inventoryitem.html:56 -#: templates/dcim/module.html:81 templates/dcim/modulebay.html:74 -#: templates/dcim/rack.html:61 +#: netbox/templates/dcim/device.html:108 +#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/module.html:81 +#: netbox/templates/dcim/modulebay.html:74 netbox/templates/dcim/rack.html:61 msgid "Asset Tag" msgstr "资产标签" -#: templates/dcim/device.html:123 +#: netbox/templates/dcim/device.html:123 msgid "View Virtual Chassis" msgstr "查看堆叠设备" -#: templates/dcim/device.html:164 +#: netbox/templates/dcim/device.html:164 msgid "Create VDC" msgstr "创建VDC" -#: templates/dcim/device.html:175 templates/dcim/device_edit.html:64 -#: virtualization/forms/model_forms.py:223 +#: netbox/templates/dcim/device.html:175 +#: netbox/templates/dcim/device_edit.html:64 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Management" msgstr "管理" -#: templates/dcim/device.html:195 templates/dcim/device.html:211 -#: templates/dcim/device.html:227 -#: templates/virtualization/virtualmachine.html:57 -#: templates/virtualization/virtualmachine.html:73 +#: netbox/templates/dcim/device.html:195 netbox/templates/dcim/device.html:211 +#: netbox/templates/dcim/device.html:227 +#: netbox/templates/virtualization/virtualmachine.html:57 +#: netbox/templates/virtualization/virtualmachine.html:73 msgid "NAT for" msgstr "NAT for" -#: templates/dcim/device.html:197 templates/dcim/device.html:213 -#: templates/dcim/device.html:229 -#: templates/virtualization/virtualmachine.html:59 -#: templates/virtualization/virtualmachine.html:75 +#: netbox/templates/dcim/device.html:197 netbox/templates/dcim/device.html:213 +#: netbox/templates/dcim/device.html:229 +#: netbox/templates/virtualization/virtualmachine.html:59 +#: netbox/templates/virtualization/virtualmachine.html:75 msgid "NAT" msgstr "NAT" -#: templates/dcim/device.html:252 templates/dcim/rack.html:73 +#: netbox/templates/dcim/device.html:252 netbox/templates/dcim/rack.html:73 msgid "Power Utilization" msgstr "电力容量利用率" -#: templates/dcim/device.html:256 +#: netbox/templates/dcim/device.html:256 msgid "Input" msgstr "输入" -#: templates/dcim/device.html:257 +#: netbox/templates/dcim/device.html:257 msgid "Outlets" msgstr "电源插座" -#: templates/dcim/device.html:258 +#: netbox/templates/dcim/device.html:258 msgid "Allocated" msgstr "分配" -#: templates/dcim/device.html:268 templates/dcim/device.html:270 -#: templates/dcim/device.html:286 templates/dcim/powerfeed.html:67 +#: netbox/templates/dcim/device.html:268 netbox/templates/dcim/device.html:270 +#: netbox/templates/dcim/device.html:286 +#: netbox/templates/dcim/powerfeed.html:67 msgid "VA" msgstr "VA" -#: templates/dcim/device.html:280 +#: netbox/templates/dcim/device.html:280 msgctxt "Leg of a power feed" msgid "Leg" msgstr "针" -#: templates/dcim/device.html:306 -#: templates/virtualization/virtualmachine.html:158 +#: netbox/templates/dcim/device.html:306 +#: netbox/templates/virtualization/virtualmachine.html:158 msgid "Add a service" msgstr "添加服务" -#: templates/dcim/device/base.html:21 templates/dcim/device_list.html:9 -#: templates/dcim/devicetype/base.html:18 -#: templates/dcim/inc/moduletype_buttons.html:9 templates/dcim/module.html:18 -#: templates/virtualization/virtualmachine/base.html:22 -#: templates/virtualization/virtualmachine_list.html:8 +#: netbox/templates/dcim/device/base.html:21 +#: netbox/templates/dcim/device_list.html:9 +#: netbox/templates/dcim/devicetype/base.html:18 +#: netbox/templates/dcim/inc/moduletype_buttons.html:9 +#: netbox/templates/dcim/module.html:18 +#: netbox/templates/virtualization/virtualmachine/base.html:22 +#: netbox/templates/virtualization/virtualmachine_list.html:8 msgid "Add Components" msgstr "添加组件" -#: templates/dcim/device/consoleports.html:24 +#: netbox/templates/dcim/device/consoleports.html:24 msgid "Add Console Ports" msgstr "增加 Console 端口" -#: templates/dcim/device/consoleserverports.html:24 +#: netbox/templates/dcim/device/consoleserverports.html:24 msgid "Add Console Server Ports" msgstr "增加 Console 服务器端口" -#: templates/dcim/device/devicebays.html:10 +#: netbox/templates/dcim/device/devicebays.html:10 msgid "Add Device Bays" msgstr "添加设备托架" -#: templates/dcim/device/frontports.html:24 +#: netbox/templates/dcim/device/frontports.html:24 msgid "Add Front Ports" msgstr "添加前置接口" -#: templates/dcim/device/inc/interface_table_controls.html:9 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:9 msgid "Hide Enabled" msgstr "已启用隐藏" -#: templates/dcim/device/inc/interface_table_controls.html:10 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:10 msgid "Hide Disabled" msgstr "已禁用隐藏" -#: templates/dcim/device/inc/interface_table_controls.html:11 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:11 msgid "Hide Virtual" msgstr "隐藏虚拟对象" -#: templates/dcim/device/inc/interface_table_controls.html:12 +#: netbox/templates/dcim/device/inc/interface_table_controls.html:12 msgid "Hide Disconnected" msgstr "隐藏未连接的" -#: templates/dcim/device/interfaces.html:27 +#: netbox/templates/dcim/device/interfaces.html:27 msgid "Add Interfaces" msgstr "增加接口" -#: templates/dcim/device/inventory.html:10 -#: templates/dcim/inc/panels/inventory_items.html:10 +#: netbox/templates/dcim/device/inventory.html:10 +#: netbox/templates/dcim/inc/panels/inventory_items.html:10 msgid "Add Inventory Item" msgstr "添加库存项" -#: templates/dcim/device/modulebays.html:10 +#: netbox/templates/dcim/device/modulebays.html:10 msgid "Add Module Bays" msgstr "增加设备板卡插槽" -#: templates/dcim/device/poweroutlets.html:24 +#: netbox/templates/dcim/device/poweroutlets.html:24 msgid "Add Power Outlets" msgstr "添加电源插座" -#: templates/dcim/device/powerports.html:24 +#: netbox/templates/dcim/device/powerports.html:24 msgid "Add Power Port" msgstr "添加电源接口" -#: templates/dcim/device/rearports.html:24 +#: netbox/templates/dcim/device/rearports.html:24 msgid "Add Rear Ports" msgstr "添加后置端口" -#: templates/dcim/device/render_config.html:5 -#: templates/virtualization/virtualmachine/render_config.html:5 +#: netbox/templates/dcim/device/render_config.html:5 +#: netbox/templates/virtualization/virtualmachine/render_config.html:5 msgid "Config" msgstr "配置" -#: templates/dcim/device/render_config.html:35 -#: templates/virtualization/virtualmachine/render_config.html:35 +#: netbox/templates/dcim/device/render_config.html:35 +#: netbox/templates/virtualization/virtualmachine/render_config.html:35 msgid "Context Data" msgstr "实例数据" -#: templates/dcim/device/render_config.html:53 -#: templates/virtualization/virtualmachine/render_config.html:53 +#: netbox/templates/dcim/device/render_config.html:55 +#: netbox/templates/virtualization/virtualmachine/render_config.html:55 msgid "Rendered Config" msgstr "提交配置" -#: templates/dcim/device/render_config.html:55 -#: templates/virtualization/virtualmachine/render_config.html:55 +#: netbox/templates/dcim/device/render_config.html:57 +#: netbox/templates/virtualization/virtualmachine/render_config.html:57 msgid "Download" msgstr "下载" -#: templates/dcim/device/render_config.html:61 -#: templates/virtualization/virtualmachine/render_config.html:61 -msgid "No configuration template found" -msgstr "找不到配置模板" +#: netbox/templates/dcim/device/render_config.html:64 +#: netbox/templates/virtualization/virtualmachine/render_config.html:64 +msgid "Error rendering template" +msgstr "" -#: templates/dcim/device_edit.html:44 +#: netbox/templates/dcim/device/render_config.html:70 +msgid "No configuration template has been assigned for this device." +msgstr "" + +#: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" msgstr "父托架" -#: templates/dcim/device_edit.html:48 -#: utilities/templates/form_helpers/render_field.html:22 +#: netbox/templates/dcim/device_edit.html:48 +#: netbox/utilities/templates/form_helpers/render_field.html:22 msgid "Regenerate Slug" msgstr "重新生成缩写" -#: templates/dcim/device_edit.html:49 templates/generic/bulk_remove.html:21 -#: utilities/templates/helpers/table_config_form.html:23 +#: netbox/templates/dcim/device_edit.html:49 +#: netbox/templates/generic/bulk_remove.html:21 +#: netbox/utilities/templates/helpers/table_config_form.html:23 msgid "Remove" msgstr "删除" -#: templates/dcim/device_edit.html:110 +#: netbox/templates/dcim/device_edit.html:110 msgid "Local Config Context Data" msgstr "本地配置数据实例" -#: templates/dcim/device_list.html:82 templates/generic/bulk_rename.html:57 -#: templates/virtualization/virtualmachine/interfaces.html:11 -#: templates/virtualization/virtualmachine/virtual_disks.html:11 +#: netbox/templates/dcim/device_list.html:82 +#: netbox/templates/generic/bulk_rename.html:57 +#: netbox/templates/virtualization/virtualmachine/interfaces.html:11 +#: netbox/templates/virtualization/virtualmachine/virtual_disks.html:11 msgid "Rename" msgstr "重命名" -#: templates/dcim/devicebay.html:17 +#: netbox/templates/dcim/devicebay.html:17 msgid "Device Bay" msgstr "设备托架" -#: templates/dcim/devicebay.html:43 +#: netbox/templates/dcim/devicebay.html:43 msgid "Installed Device" msgstr "已安装设备" -#: templates/dcim/devicebay_depopulate.html:6 +#: netbox/templates/dcim/devicebay_depopulate.html:6 #, python-format msgid "Remove %(device)s from %(device_bay)s?" msgstr "确认从%(device_bay)s移除%(device)s?" -#: templates/dcim/devicebay_depopulate.html:13 +#: netbox/templates/dcim/devicebay_depopulate.html:13 #, python-format msgid "" "Are you sure you want to remove %(device)s from " "%(device_bay)s?" msgstr "确认从%(device_bay)s移除%(device)s?" -#: templates/dcim/devicebay_populate.html:13 +#: netbox/templates/dcim/devicebay_populate.html:13 msgid "Populate" msgstr "填充" -#: templates/dcim/devicebay_populate.html:22 +#: netbox/templates/dcim/devicebay_populate.html:22 msgid "Bay" msgstr "托架" -#: templates/dcim/devicerole.html:14 templates/dcim/platform.html:17 +#: netbox/templates/dcim/devicerole.html:14 +#: netbox/templates/dcim/platform.html:17 msgid "Add Device" msgstr "增加设备" -#: templates/dcim/devicerole.html:40 +#: netbox/templates/dcim/devicerole.html:40 msgid "VM Role" msgstr "虚拟机角色" -#: templates/dcim/devicetype.html:18 templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/devicetype.html:18 +#: netbox/templates/dcim/moduletype.html:29 msgid "Model Name" msgstr "模块名称" -#: templates/dcim/devicetype.html:25 templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/devicetype.html:25 +#: netbox/templates/dcim/moduletype.html:33 msgid "Part Number" msgstr "部件编码(PN)" -#: templates/dcim/devicetype.html:41 +#: netbox/templates/dcim/devicetype.html:41 msgid "Exclude From Utilization" msgstr "从利用率中排除" -#: templates/dcim/devicetype.html:59 +#: netbox/templates/dcim/devicetype.html:59 msgid "Parent/Child" msgstr "父/子" -#: templates/dcim/devicetype.html:71 +#: netbox/templates/dcim/devicetype.html:71 msgid "Front Image" msgstr "正视图" -#: templates/dcim/devicetype.html:83 +#: netbox/templates/dcim/devicetype.html:83 msgid "Rear Image" msgstr "后视图" -#: templates/dcim/frontport.html:54 +#: netbox/templates/dcim/frontport.html:54 msgid "Rear Port Position" msgstr "后置端口位置" -#: templates/dcim/frontport.html:72 templates/dcim/interface.html:144 -#: templates/dcim/poweroutlet.html:63 templates/dcim/powerport.html:63 -#: templates/dcim/rearport.html:68 +#: netbox/templates/dcim/frontport.html:72 +#: netbox/templates/dcim/interface.html:144 +#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/powerport.html:63 +#: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" msgstr "标记为已连接" -#: templates/dcim/frontport.html:86 templates/dcim/rearport.html:82 +#: netbox/templates/dcim/frontport.html:86 +#: netbox/templates/dcim/rearport.html:82 msgid "Connection Status" msgstr "连接状态" -#: templates/dcim/htmx/cable_edit.html:10 +#: netbox/templates/dcim/htmx/cable_edit.html:10 msgid "A Side" msgstr "A端" -#: templates/dcim/htmx/cable_edit.html:30 +#: netbox/templates/dcim/htmx/cable_edit.html:30 msgid "B Side" msgstr "B端" -#: templates/dcim/inc/cable_termination.html:65 +#: netbox/templates/dcim/inc/cable_termination.html:65 msgid "No termination" msgstr "未成端" -#: templates/dcim/inc/cable_toggle_buttons.html:3 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:3 msgid "Mark Planned" msgstr "标记为计划中" -#: templates/dcim/inc/cable_toggle_buttons.html:6 +#: netbox/templates/dcim/inc/cable_toggle_buttons.html:6 msgid "Mark Installed" msgstr "标记为已安装" -#: templates/dcim/inc/connection_endpoints.html:13 +#: netbox/templates/dcim/inc/connection_endpoints.html:13 msgid "Path Status" msgstr "路径状态" -#: templates/dcim/inc/connection_endpoints.html:18 +#: netbox/templates/dcim/inc/connection_endpoints.html:18 msgid "Not Reachable" msgstr "不可达" -#: templates/dcim/inc/connection_endpoints.html:23 +#: netbox/templates/dcim/inc/connection_endpoints.html:23 msgid "Path Endpoints" msgstr "路径终点" -#: templates/dcim/inc/endpoint_connection.html:8 -#: templates/dcim/powerfeed.html:120 templates/dcim/rearport.html:94 +#: netbox/templates/dcim/inc/endpoint_connection.html:8 +#: netbox/templates/dcim/powerfeed.html:120 +#: netbox/templates/dcim/rearport.html:94 msgid "Not connected" msgstr "未连接" -#: templates/dcim/inc/interface_vlans_table.html:6 +#: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" msgstr "未标记的" -#: templates/dcim/inc/interface_vlans_table.html:37 +#: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" msgstr "未分配 VLAN" -#: templates/dcim/inc/interface_vlans_table.html:44 -#: templates/ipam/prefix_list.html:16 templates/ipam/prefix_list.html:33 +#: netbox/templates/dcim/inc/interface_vlans_table.html:44 +#: netbox/templates/ipam/prefix_list.html:16 +#: netbox/templates/ipam/prefix_list.html:33 msgid "Clear" msgstr "清除" -#: templates/dcim/inc/interface_vlans_table.html:47 +#: netbox/templates/dcim/inc/interface_vlans_table.html:47 msgid "Clear All" msgstr "清除所有" -#: templates/dcim/inc/panels/racktype_dimensions.html:38 +#: netbox/templates/dcim/inc/panels/racktype_dimensions.html:38 msgid "Mounting Depth" msgstr "安装深度" -#: templates/dcim/inc/panels/racktype_numbering.html:6 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:6 msgid "Starting Unit" msgstr "起始U位" -#: templates/dcim/inc/panels/racktype_numbering.html:10 +#: netbox/templates/dcim/inc/panels/racktype_numbering.html:10 msgid "Descending Units" msgstr "降序单位" -#: templates/dcim/inc/rack_elevation.html:3 +#: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" msgstr "机架仰角" -#: templates/dcim/interface.html:17 +#: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" msgstr "添加子接口" -#: templates/dcim/interface.html:50 +#: netbox/templates/dcim/interface.html:50 msgid "Speed/Duplex" msgstr "速率/双工模式" -#: templates/dcim/interface.html:73 +#: netbox/templates/dcim/interface.html:73 msgid "PoE Mode" msgstr "PoE模式" -#: templates/dcim/interface.html:77 +#: netbox/templates/dcim/interface.html:77 msgid "PoE Type" msgstr "PoE类型" -#: templates/dcim/interface.html:81 -#: templates/virtualization/vminterface.html:63 +#: netbox/templates/dcim/interface.html:81 +#: netbox/templates/virtualization/vminterface.html:63 msgid "802.1Q Mode" msgstr "802.1Q 模式" -#: templates/dcim/interface.html:125 -#: templates/virtualization/vminterface.html:59 +#: netbox/templates/dcim/interface.html:125 +#: netbox/templates/virtualization/vminterface.html:59 msgid "MAC Address" msgstr "MAC 地址" -#: templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:151 msgid "Wireless Link" msgstr "无线连接" -#: templates/dcim/interface.html:218 vpn/choices.py:55 +#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 msgid "Peer" msgstr "对端" -#: templates/dcim/interface.html:230 -#: templates/wireless/inc/wirelesslink_interface.html:26 +#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "通道" -#: templates/dcim/interface.html:239 -#: templates/wireless/inc/wirelesslink_interface.html:32 +#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "通道频率" -#: templates/dcim/interface.html:242 templates/dcim/interface.html:250 -#: templates/dcim/interface.html:261 templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:242 +#: netbox/templates/dcim/interface.html:250 +#: netbox/templates/dcim/interface.html:261 +#: netbox/templates/dcim/interface.html:269 msgid "MHz" msgstr "MHz" -#: templates/dcim/interface.html:258 -#: templates/wireless/inc/wirelesslink_interface.html:42 +#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "信道频率" -#: templates/dcim/interface.html:285 templates/wireless/wirelesslan.html:14 -#: templates/wireless/wirelesslink.html:21 wireless/forms/bulk_edit.py:60 -#: wireless/forms/bulk_edit.py:102 wireless/forms/filtersets.py:40 -#: wireless/forms/filtersets.py:80 wireless/models.py:82 -#: wireless/models.py:156 wireless/tables/wirelesslan.py:44 +#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/wireless/wirelesslan.html:14 +#: netbox/templates/wireless/wirelesslink.html:21 +#: netbox/wireless/forms/bulk_edit.py:60 +#: netbox/wireless/forms/bulk_edit.py:102 +#: netbox/wireless/forms/filtersets.py:40 +#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "SSID" -#: templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:305 msgid "LAG Members" msgstr "聚合组成员" -#: templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:323 msgid "No member interfaces" msgstr "无成员接口" -#: templates/dcim/interface.html:343 templates/ipam/fhrpgroup.html:73 -#: templates/ipam/iprange/ip_addresses.html:7 -#: templates/ipam/prefix/ip_addresses.html:7 -#: templates/virtualization/vminterface.html:89 +#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/ipam/fhrpgroup.html:73 +#: netbox/templates/ipam/iprange/ip_addresses.html:7 +#: netbox/templates/ipam/prefix/ip_addresses.html:7 +#: netbox/templates/virtualization/vminterface.html:89 msgid "Add IP Address" msgstr "增加 IP 地址" -#: templates/dcim/inventoryitem.html:24 +#: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "父项" -#: templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:48 msgid "Part ID" msgstr "零件ID" -#: templates/dcim/location.html:17 +#: netbox/templates/dcim/location.html:17 msgid "Add Child Location" msgstr "增加子类位置" -#: templates/dcim/location.html:77 +#: netbox/templates/dcim/location.html:77 msgid "Child Locations" msgstr "子位置" -#: templates/dcim/location.html:81 templates/dcim/site.html:131 +#: netbox/templates/dcim/location.html:81 netbox/templates/dcim/site.html:131 msgid "Add a Location" msgstr "添加一个位置" -#: templates/dcim/location.html:94 templates/dcim/site.html:144 +#: netbox/templates/dcim/location.html:94 netbox/templates/dcim/site.html:144 msgid "Add a Device" msgstr "增加设备" -#: templates/dcim/manufacturer.html:16 +#: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "增加设备型号" -#: templates/dcim/manufacturer.html:21 +#: netbox/templates/dcim/manufacturer.html:21 msgid "Add Module Type" msgstr "添加一个模块类型" -#: templates/dcim/powerfeed.html:53 +#: netbox/templates/dcim/powerfeed.html:53 msgid "Connected Device" msgstr "连接设备" -#: templates/dcim/powerfeed.html:63 +#: netbox/templates/dcim/powerfeed.html:63 msgid "Utilization (Allocated" msgstr "利用率(已分配" -#: templates/dcim/powerfeed.html:80 +#: netbox/templates/dcim/powerfeed.html:80 msgid "Electrical Characteristics" msgstr "电气特性" -#: templates/dcim/powerfeed.html:88 +#: netbox/templates/dcim/powerfeed.html:88 msgctxt "Abbreviation for volts" msgid "V" msgstr "V" -#: templates/dcim/powerfeed.html:92 +#: netbox/templates/dcim/powerfeed.html:92 msgctxt "Abbreviation for amperes" msgid "A" msgstr "A" -#: templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:48 msgid "Feed Leg" msgstr "电源针脚" -#: templates/dcim/powerpanel.html:72 +#: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" msgstr "添加供电线路" -#: templates/dcim/powerport.html:44 +#: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" msgstr "最大功率" -#: templates/dcim/powerport.html:48 +#: netbox/templates/dcim/powerport.html:48 msgid "Allocated Draw" msgstr "允许功率" -#: templates/dcim/rack.html:69 +#: netbox/templates/dcim/rack.html:69 msgid "Space Utilization" msgstr "机柜空间利用率" -#: templates/dcim/rack.html:84 templates/dcim/racktype.html:44 +#: netbox/templates/dcim/rack.html:84 netbox/templates/dcim/racktype.html:44 msgid "Rack Weight" msgstr "机柜重量" -#: templates/dcim/rack.html:94 templates/dcim/racktype.html:54 +#: netbox/templates/dcim/rack.html:94 netbox/templates/dcim/racktype.html:54 msgid "Maximum Weight" msgstr "最大承重" -#: templates/dcim/rack.html:104 +#: netbox/templates/dcim/rack.html:104 msgid "Total Weight" msgstr "总重量" -#: templates/dcim/rack.html:125 templates/dcim/rack_elevation_list.html:15 +#: netbox/templates/dcim/rack.html:125 +#: netbox/templates/dcim/rack_elevation_list.html:15 msgid "Images and Labels" msgstr "图片和标签" -#: templates/dcim/rack.html:126 templates/dcim/rack_elevation_list.html:16 +#: netbox/templates/dcim/rack.html:126 +#: netbox/templates/dcim/rack_elevation_list.html:16 msgid "Images only" msgstr "仅图像" -#: templates/dcim/rack.html:127 templates/dcim/rack_elevation_list.html:17 +#: netbox/templates/dcim/rack.html:127 +#: netbox/templates/dcim/rack_elevation_list.html:17 msgid "Labels only" msgstr "仅标签" -#: templates/dcim/rack/reservations.html:8 +#: netbox/templates/dcim/rack/reservations.html:8 msgid "Add reservation" msgstr "增加预留" -#: templates/dcim/rack_elevation_list.html:12 +#: netbox/templates/dcim/rack_elevation_list.html:12 msgid "View List" msgstr "查看列表" -#: templates/dcim/rack_elevation_list.html:14 +#: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" msgstr "选择机架视图" -#: templates/dcim/rack_elevation_list.html:25 +#: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" msgstr "排序方式" -#: templates/dcim/rack_elevation_list.html:74 +#: netbox/templates/dcim/rack_elevation_list.html:74 msgid "No Racks Found" msgstr "找不到机柜" -#: templates/dcim/rack_list.html:8 +#: netbox/templates/dcim/rack_list.html:8 msgid "View Elevations" msgstr "查看机柜立面图" -#: templates/dcim/rackreservation.html:42 +#: netbox/templates/dcim/rackreservation.html:42 msgid "Reservation Details" msgstr "预留详情" -#: templates/dcim/rackrole.html:10 +#: netbox/templates/dcim/rackrole.html:10 msgid "Add Rack" msgstr "增加机柜" -#: templates/dcim/rearport.html:50 +#: netbox/templates/dcim/rearport.html:50 msgid "Positions" msgstr "位置" -#: templates/dcim/region.html:17 templates/dcim/sitegroup.html:17 +#: netbox/templates/dcim/region.html:17 +#: netbox/templates/dcim/sitegroup.html:17 msgid "Add Site" msgstr "增加站点" -#: templates/dcim/region.html:55 +#: netbox/templates/dcim/region.html:55 msgid "Child Regions" msgstr "子区域" -#: templates/dcim/region.html:59 +#: netbox/templates/dcim/region.html:59 msgid "Add Region" msgstr "增加地区" -#: templates/dcim/site.html:64 +#: netbox/templates/dcim/site.html:64 msgid "Time Zone" msgstr "时区" -#: templates/dcim/site.html:67 +#: netbox/templates/dcim/site.html:67 msgid "UTC" msgstr "UTC" -#: templates/dcim/site.html:68 +#: netbox/templates/dcim/site.html:68 msgid "Site time" msgstr "站点时区" -#: templates/dcim/site.html:75 +#: netbox/templates/dcim/site.html:75 msgid "Physical Address" msgstr "实体地址" -#: templates/dcim/site.html:90 +#: netbox/templates/dcim/site.html:90 msgid "Shipping Address" msgstr "物流地址" -#: templates/dcim/sitegroup.html:55 templates/tenancy/contactgroup.html:46 -#: templates/tenancy/tenantgroup.html:55 -#: templates/wireless/wirelesslangroup.html:55 +#: netbox/templates/dcim/sitegroup.html:55 +#: netbox/templates/tenancy/contactgroup.html:46 +#: netbox/templates/tenancy/tenantgroup.html:55 +#: netbox/templates/wireless/wirelesslangroup.html:55 msgid "Child Groups" msgstr "子类组" -#: templates/dcim/sitegroup.html:59 +#: netbox/templates/dcim/sitegroup.html:59 msgid "Add Site Group" msgstr "增加站点组" -#: templates/dcim/trace/attachment.html:5 -#: templates/extras/exporttemplate.html:31 +#: netbox/templates/dcim/trace/attachment.html:5 +#: netbox/templates/extras/exporttemplate.html:31 msgid "Attachment" msgstr "附件" -#: templates/dcim/virtualchassis.html:57 +#: netbox/templates/dcim/virtualchassis.html:57 msgid "Add Member" msgstr "增加成员" -#: templates/dcim/virtualchassis_add.html:18 +#: netbox/templates/dcim/virtualchassis_add.html:18 msgid "Member Devices" msgstr "成员设备" -#: templates/dcim/virtualchassis_add_member.html:10 +#: netbox/templates/dcim/virtualchassis_add_member.html:10 #, python-format msgid "Add New Member to Virtual Chassis %(virtual_chassis)s" msgstr "添加新成员到堆叠%(virtual_chassis)s中" -#: templates/dcim/virtualchassis_add_member.html:19 +#: netbox/templates/dcim/virtualchassis_add_member.html:19 msgid "Add New Member" msgstr "新增成员" -#: templates/dcim/virtualchassis_add_member.html:27 -#: templates/generic/object_edit.html:78 -#: templates/users/objectpermission.html:31 users/forms/filtersets.py:67 -#: users/forms/model_forms.py:312 +#: netbox/templates/dcim/virtualchassis_add_member.html:27 +#: netbox/templates/generic/object_edit.html:78 +#: netbox/templates/users/objectpermission.html:31 +#: netbox/users/forms/filtersets.py:67 netbox/users/forms/model_forms.py:312 msgid "Actions" msgstr "激活" -#: templates/dcim/virtualchassis_add_member.html:29 +#: netbox/templates/dcim/virtualchassis_add_member.html:29 msgid "Save & Add Another" msgstr "保存并添加另一个" -#: templates/dcim/virtualchassis_edit.html:7 +#: netbox/templates/dcim/virtualchassis_edit.html:7 #, python-format msgid "Editing Virtual Chassis %(name)s" msgstr "编辑堆叠%(name)s" -#: templates/dcim/virtualchassis_edit.html:53 +#: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" msgstr "机柜/单元" -#: templates/dcim/virtualchassis_remove_member.html:5 +#: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" msgstr "移除堆叠成员" -#: templates/dcim/virtualchassis_remove_member.html:9 +#: netbox/templates/dcim/virtualchassis_remove_member.html:9 #, python-format msgid "" "Are you sure you want to remove %(device)s from virtual " "chassis %(name)s?" msgstr "确认从%(name)s中移除%(device)s?" -#: templates/dcim/virtualdevicecontext.html:26 templates/vpn/l2vpn.html:18 +#: netbox/templates/dcim/virtualdevicecontext.html:26 +#: netbox/templates/vpn/l2vpn.html:18 msgid "Identifier" msgstr "标识符" -#: templates/exceptions/import_error.html:6 +#: netbox/templates/exceptions/import_error.html:6 msgid "" "A module import error occurred during this request. Common causes include " "the following:" msgstr "此请求过程中发生模块导入错误。常见原因包括:" -#: templates/exceptions/import_error.html:10 +#: netbox/templates/exceptions/import_error.html:10 msgid "Missing required packages" msgstr "缺少必需的程序包" -#: templates/exceptions/import_error.html:11 +#: netbox/templates/exceptions/import_error.html:11 msgid "" "This installation of NetBox might be missing one or more required Python " "packages. These packages are listed in requirements.txt and " @@ -12178,28 +12939,28 @@ msgstr "" "pip freeze from the console and compare the output to the list " "of required packages." -#: templates/exceptions/import_error.html:20 +#: netbox/templates/exceptions/import_error.html:20 msgid "WSGI service not restarted after upgrade" msgstr "升级后未重新启动WSGI服务" -#: templates/exceptions/import_error.html:21 +#: netbox/templates/exceptions/import_error.html:21 msgid "" "If this installation has recently been upgraded, check that the WSGI service" " (e.g. gunicorn or uWSGI) has been restarted. This ensures that the new code" " is running." msgstr "如果系统最近已升级,请检查WSGI服务(例如gunicorn或uWSGI)是否已重新启动。这样可以确保正在运行新代码。" -#: templates/exceptions/permission_error.html:6 +#: netbox/templates/exceptions/permission_error.html:6 msgid "" "A file permission error was detected while processing this request. Common " "causes include the following:" msgstr "处理此请求时检测到文件权限错误。常见原因包括:" -#: templates/exceptions/permission_error.html:10 +#: netbox/templates/exceptions/permission_error.html:10 msgid "Insufficient write permission to the media root" msgstr "对media目录的写入权限不足" -#: templates/exceptions/permission_error.html:11 +#: netbox/templates/exceptions/permission_error.html:11 #, python-format msgid "" "The configured media root is %(media_root)s. Ensure that the " @@ -12207,17 +12968,17 @@ msgid "" "path." msgstr "media目录为%(media_root)s。确保用户NetBox已有权将文件写入此路径" -#: templates/exceptions/programming_error.html:6 +#: netbox/templates/exceptions/programming_error.html:6 msgid "" "A database programming error was detected while processing this request. " "Common causes include the following:" msgstr "处理此请求时检测到数据库错误。常见原因包括:" -#: templates/exceptions/programming_error.html:10 +#: netbox/templates/exceptions/programming_error.html:10 msgid "Database migrations missing" msgstr "缺少数据库迁移" -#: templates/exceptions/programming_error.html:11 +#: netbox/templates/exceptions/programming_error.html:11 msgid "" "When upgrading to a new NetBox release, the upgrade script must be run to " "apply any new database migrations. You can run migrations manually by " @@ -12226,11 +12987,11 @@ msgstr "" "升级到新的NetBox版本时,必须运行升级脚本才能应用任何新的数据库迁移。您可以通过从命令行执行python3 manage.py " "migrate手动进行迁移。" -#: templates/exceptions/programming_error.html:18 +#: netbox/templates/exceptions/programming_error.html:18 msgid "Unsupported PostgreSQL version" msgstr "不支持当前PostgreSQL版本" -#: templates/exceptions/programming_error.html:19 +#: netbox/templates/exceptions/programming_error.html:19 msgid "" "Ensure that PostgreSQL version 12 or later is in use. You can check this by " "connecting to the database using NetBox's credentials and issuing a query " @@ -12239,344 +13000,351 @@ msgstr "" "请确保正在使用PostgreSQL版本12或更高版本。您可以通过使用NetBox用户连接到数据库并执行SELECT " "VERSION()来进行检查。" -#: templates/extras/configcontext.html:45 -#: templates/extras/configtemplate.html:37 -#: templates/extras/exporttemplate.html:51 +#: netbox/templates/extras/configcontext.html:45 +#: netbox/templates/extras/configtemplate.html:37 +#: netbox/templates/extras/exporttemplate.html:51 msgid "The data file associated with this object has been deleted" msgstr "与此对象关联的数据文件已被删除" -#: templates/extras/configcontext.html:54 -#: templates/extras/configtemplate.html:46 -#: templates/extras/exporttemplate.html:60 +#: netbox/templates/extras/configcontext.html:54 +#: netbox/templates/extras/configtemplate.html:46 +#: netbox/templates/extras/exporttemplate.html:60 msgid "Data Synced" msgstr "数据已同步" -#: templates/extras/configcontext_list.html:7 -#: templates/extras/configtemplate_list.html:7 -#: templates/extras/exporttemplate_list.html:7 +#: netbox/templates/extras/configcontext_list.html:7 +#: netbox/templates/extras/configtemplate_list.html:7 +#: netbox/templates/extras/exporttemplate_list.html:7 msgid "Sync Data" msgstr "同步数据" -#: templates/extras/configtemplate.html:56 +#: netbox/templates/extras/configtemplate.html:56 msgid "Environment Parameters" msgstr "环境参数" -#: templates/extras/configtemplate.html:67 -#: templates/extras/exporttemplate.html:79 +#: netbox/templates/extras/configtemplate.html:67 +#: netbox/templates/extras/exporttemplate.html:79 msgid "Template" msgstr "模版" -#: templates/extras/customfield.html:30 templates/extras/customlink.html:21 +#: netbox/templates/extras/customfield.html:30 +#: netbox/templates/extras/customlink.html:21 msgid "Group Name" msgstr "组名称" -#: templates/extras/customfield.html:42 +#: netbox/templates/extras/customfield.html:42 msgid "Must be Unique" msgstr "必须是唯一的" -#: templates/extras/customfield.html:46 +#: netbox/templates/extras/customfield.html:46 msgid "Cloneable" msgstr "可复制" -#: templates/extras/customfield.html:56 +#: netbox/templates/extras/customfield.html:56 msgid "Default Value" msgstr "默认值" -#: templates/extras/customfield.html:73 +#: netbox/templates/extras/customfield.html:73 msgid "Search Weight" msgstr "搜索权重" -#: templates/extras/customfield.html:83 +#: netbox/templates/extras/customfield.html:83 msgid "Filter Logic" msgstr "过滤器规则" -#: templates/extras/customfield.html:87 +#: netbox/templates/extras/customfield.html:87 msgid "Display Weight" msgstr "显示权重" -#: templates/extras/customfield.html:91 +#: netbox/templates/extras/customfield.html:91 msgid "UI Visible" msgstr "页面中可见" -#: templates/extras/customfield.html:95 +#: netbox/templates/extras/customfield.html:95 msgid "UI Editable" msgstr "页面中可编辑" -#: templates/extras/customfield.html:115 +#: netbox/templates/extras/customfield.html:115 msgid "Validation Rules" msgstr "验证规则" -#: templates/extras/customfield.html:126 +#: netbox/templates/extras/customfield.html:126 msgid "Regular Expression" msgstr "正则表达式" -#: templates/extras/customlink.html:29 +#: netbox/templates/extras/customlink.html:29 msgid "Button Class" msgstr "按钮类型" -#: templates/extras/customlink.html:39 templates/extras/exporttemplate.html:66 -#: templates/extras/savedfilter.html:39 +#: netbox/templates/extras/customlink.html:39 +#: netbox/templates/extras/exporttemplate.html:66 +#: netbox/templates/extras/savedfilter.html:39 msgid "Assigned Models" msgstr "指定模块" -#: templates/extras/customlink.html:52 +#: netbox/templates/extras/customlink.html:52 msgid "Link Text" msgstr "链接文本" -#: templates/extras/customlink.html:58 +#: netbox/templates/extras/customlink.html:58 msgid "Link URL" msgstr "链接URL" -#: templates/extras/dashboard/reset.html:4 templates/home.html:66 +#: netbox/templates/extras/dashboard/reset.html:4 +#: netbox/templates/home.html:66 msgid "Reset Dashboard" msgstr "重置仪表盘" -#: templates/extras/dashboard/reset.html:8 +#: netbox/templates/extras/dashboard/reset.html:8 msgid "" "This will remove all configured widgets and restore the " "default dashboard configuration." msgstr "这将删除所有小组件,并恢复默认的仪表板配置。" -#: templates/extras/dashboard/reset.html:13 +#: netbox/templates/extras/dashboard/reset.html:13 msgid "" "This change affects only your dashboard, and will not impact other " "users." msgstr "此更改仅影响的仪表盘,不会影响其他用户。" -#: templates/extras/dashboard/widget.html:21 +#: netbox/templates/extras/dashboard/widget.html:21 msgid "widget configuration" msgstr "小部件配置" -#: templates/extras/dashboard/widget.html:36 +#: netbox/templates/extras/dashboard/widget.html:36 msgid "Close widget" msgstr "关闭小部件" -#: templates/extras/dashboard/widget_add.html:7 +#: netbox/templates/extras/dashboard/widget_add.html:7 msgid "Add a Widget" msgstr "添加小组件" -#: templates/extras/dashboard/widgets/bookmarks.html:14 +#: netbox/templates/extras/dashboard/widgets/bookmarks.html:14 msgid "No bookmarks have been added yet." msgstr "尚未添加书签。" -#: templates/extras/dashboard/widgets/objectcounts.html:10 +#: netbox/templates/extras/dashboard/widgets/objectcounts.html:10 msgid "No permission" msgstr "无权限" -#: templates/extras/dashboard/widgets/objectlist.html:6 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:6 msgid "No permission to view this content" msgstr "没有查看此内容的权限" -#: templates/extras/dashboard/widgets/objectlist.html:10 +#: netbox/templates/extras/dashboard/widgets/objectlist.html:10 msgid "Unable to load content. Invalid view name" msgstr "无法加载内容。无效的视图名称" -#: templates/extras/dashboard/widgets/rssfeed.html:12 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:12 msgid "No content found" msgstr "未找到内容" -#: templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 msgid "There was a problem fetching the RSS feed" msgstr "获取RSS源时出现问题" -#: templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 msgid "HTTP" msgstr "HTTP" -#: templates/extras/eventrule.html:61 +#: netbox/templates/extras/eventrule.html:61 msgid "Conditions" msgstr "条件" -#: templates/extras/exporttemplate.html:23 +#: netbox/templates/extras/exporttemplate.html:23 msgid "MIME Type" msgstr "MIME类型" -#: templates/extras/exporttemplate.html:27 +#: netbox/templates/extras/exporttemplate.html:27 msgid "File Extension" msgstr "文件扩展名" -#: templates/extras/htmx/script_result.html:10 +#: netbox/templates/extras/htmx/script_result.html:10 msgid "Scheduled for" msgstr "计划为" -#: templates/extras/htmx/script_result.html:15 +#: netbox/templates/extras/htmx/script_result.html:15 msgid "Duration" msgstr "持续时间" -#: templates/extras/htmx/script_result.html:23 +#: netbox/templates/extras/htmx/script_result.html:23 msgid "Test Summary" msgstr "测试总结" -#: templates/extras/htmx/script_result.html:43 +#: netbox/templates/extras/htmx/script_result.html:43 msgid "Log" msgstr "日志" -#: templates/extras/htmx/script_result.html:56 +#: netbox/templates/extras/htmx/script_result.html:56 msgid "Output" msgstr "输出" -#: templates/extras/inc/result_pending.html:4 +#: netbox/templates/extras/inc/result_pending.html:4 msgid "Loading" msgstr "加载中" -#: templates/extras/inc/result_pending.html:6 +#: netbox/templates/extras/inc/result_pending.html:6 msgid "Results pending" msgstr "结果待定" -#: templates/extras/journalentry.html:15 +#: netbox/templates/extras/journalentry.html:15 msgid "Journal Entry" msgstr "日志条目" -#: templates/extras/notificationgroup.html:11 +#: netbox/templates/extras/notificationgroup.html:11 msgid "Notification Group" msgstr "通知组" -#: templates/extras/notificationgroup.html:36 -#: templates/extras/notificationgroup.html:46 -#: utilities/templates/widgets/clearable_file_input.html:12 +#: netbox/templates/extras/notificationgroup.html:36 +#: netbox/templates/extras/notificationgroup.html:46 +#: netbox/utilities/templates/widgets/clearable_file_input.html:12 msgid "None assigned" msgstr "未指定" -#: templates/extras/object_configcontext.html:19 +#: netbox/templates/extras/object_configcontext.html:19 msgid "The local config context overwrites all source contexts" msgstr "本地实例覆盖数据源上的实例" -#: templates/extras/object_configcontext.html:25 +#: netbox/templates/extras/object_configcontext.html:25 msgid "Source Contexts" msgstr "数据源实例" -#: templates/extras/object_journal.html:17 +#: netbox/templates/extras/object_journal.html:17 msgid "New Journal Entry" msgstr "新的日志条目" -#: templates/extras/report/base.html:30 +#: netbox/templates/extras/report/base.html:30 msgid "Report" msgstr "报告" -#: templates/extras/script.html:14 +#: netbox/templates/extras/script.html:14 msgid "You do not have permission to run scripts" msgstr "您没有权限执行脚本" -#: templates/extras/script.html:41 templates/extras/script.html:45 -#: templates/extras/script_list.html:87 +#: netbox/templates/extras/script.html:41 +#: netbox/templates/extras/script.html:45 +#: netbox/templates/extras/script_list.html:87 msgid "Run Script" msgstr "保存运行脚本计划" -#: templates/extras/script.html:51 templates/extras/script/source.html:10 +#: netbox/templates/extras/script.html:51 +#: netbox/templates/extras/script/source.html:10 msgid "Error loading script" msgstr "加载脚本时出错" -#: templates/extras/script/jobs.html:16 +#: netbox/templates/extras/script/jobs.html:16 msgid "Script no longer exists in the source file." msgstr "源文件中没有该脚本。" -#: templates/extras/script_list.html:47 +#: netbox/templates/extras/script_list.html:47 msgid "Last Run" msgstr "上一次运行" -#: templates/extras/script_list.html:62 +#: netbox/templates/extras/script_list.html:62 msgid "Script is no longer present in the source file" msgstr "源文件中没有该脚本。" -#: templates/extras/script_list.html:75 +#: netbox/templates/extras/script_list.html:75 msgid "Never" msgstr "从不" -#: templates/extras/script_list.html:85 +#: netbox/templates/extras/script_list.html:85 msgid "Run Again" msgstr "重新运行" -#: templates/extras/script_list.html:133 +#: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" msgstr "" -#: templates/extras/script_list.html:141 +#: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" msgstr "找不到脚本" -#: templates/extras/script_list.html:144 +#: netbox/templates/extras/script_list.html:144 #, python-format msgid "" "Get started by creating a script from " "an uploaded file or data source." msgstr "从上传的文件或数据源开始创建脚本。" -#: templates/extras/script_result.html:35 -#: templates/generic/object_list.html:50 templates/search.html:13 +#: netbox/templates/extras/script_result.html:35 +#: netbox/templates/generic/object_list.html:50 +#: netbox/templates/search.html:13 msgid "Results" msgstr "结果" -#: templates/extras/script_result.html:46 +#: netbox/templates/extras/script_result.html:46 msgid "Log threshold" msgstr "日志阈值" -#: templates/extras/script_result.html:56 +#: netbox/templates/extras/script_result.html:56 msgid "All" msgstr "全部" -#: templates/extras/tag.html:32 +#: netbox/templates/extras/tag.html:32 msgid "Tagged Items" msgstr "标记的项目" -#: templates/extras/tag.html:43 +#: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" msgstr "允许的对象类型" -#: templates/extras/tag.html:51 +#: netbox/templates/extras/tag.html:51 msgid "Any" msgstr "所有" -#: templates/extras/tag.html:57 +#: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" msgstr "标记的项目类型" -#: templates/extras/tag.html:81 +#: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" msgstr "标记的对象" -#: templates/extras/webhook.html:26 +#: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" msgstr "HTTP方法" -#: templates/extras/webhook.html:34 +#: netbox/templates/extras/webhook.html:34 msgid "HTTP Content Type" msgstr "HTTP内容类型" -#: templates/extras/webhook.html:47 +#: netbox/templates/extras/webhook.html:47 msgid "SSL Verification" msgstr "SSL验证" -#: templates/extras/webhook.html:60 +#: netbox/templates/extras/webhook.html:60 msgid "Additional Headers" msgstr "附加标头" -#: templates/extras/webhook.html:70 +#: netbox/templates/extras/webhook.html:70 msgid "Body Template" msgstr "内容模版" -#: templates/generic/bulk_add_component.html:29 +#: netbox/templates/generic/bulk_add_component.html:29 msgid "Bulk Creation" msgstr "批量创建" -#: templates/generic/bulk_add_component.html:34 -#: templates/generic/bulk_delete.html:32 templates/generic/bulk_edit.html:33 +#: netbox/templates/generic/bulk_add_component.html:34 +#: netbox/templates/generic/bulk_delete.html:32 +#: netbox/templates/generic/bulk_edit.html:33 msgid "Selected Objects" msgstr "选定的对象" -#: templates/generic/bulk_add_component.html:58 +#: netbox/templates/generic/bulk_add_component.html:58 msgid "to Add" msgstr "添加" -#: templates/generic/bulk_delete.html:27 +#: netbox/templates/generic/bulk_delete.html:27 msgid "Bulk Delete" msgstr "批量删除" -#: templates/generic/bulk_delete.html:49 +#: netbox/templates/generic/bulk_delete.html:49 msgid "Confirm Bulk Deletion" msgstr "批量删除确认" -#: templates/generic/bulk_delete.html:50 +#: netbox/templates/generic/bulk_delete.html:50 #, python-format msgid "" "The following operation will delete %(count)s " @@ -12584,79 +13352,82 @@ msgid "" "this action." msgstr "以下操作将删除 %(count)s %(type_plural)s。请仔细检查所选对象并确认此操作。" -#: templates/generic/bulk_edit.html:21 templates/generic/object_edit.html:22 +#: netbox/templates/generic/bulk_edit.html:21 +#: netbox/templates/generic/object_edit.html:22 msgid "Editing" msgstr "编辑中" -#: templates/generic/bulk_edit.html:28 +#: netbox/templates/generic/bulk_edit.html:28 msgid "Bulk Edit" msgstr "批量编辑" -#: templates/generic/bulk_edit.html:107 templates/generic/bulk_rename.html:66 +#: netbox/templates/generic/bulk_edit.html:107 +#: netbox/templates/generic/bulk_rename.html:66 msgid "Apply" msgstr "应用" -#: templates/generic/bulk_import.html:19 +#: netbox/templates/generic/bulk_import.html:19 msgid "Bulk Import" msgstr "批量导入" -#: templates/generic/bulk_import.html:25 +#: netbox/templates/generic/bulk_import.html:25 msgid "Direct Import" msgstr "直接导入" -#: templates/generic/bulk_import.html:30 +#: netbox/templates/generic/bulk_import.html:30 msgid "Upload File" msgstr "上传文件" -#: templates/generic/bulk_import.html:58 templates/generic/bulk_import.html:80 -#: templates/generic/bulk_import.html:102 +#: netbox/templates/generic/bulk_import.html:58 +#: netbox/templates/generic/bulk_import.html:80 +#: netbox/templates/generic/bulk_import.html:102 msgid "Submit" msgstr "提交" -#: templates/generic/bulk_import.html:113 +#: netbox/templates/generic/bulk_import.html:113 msgid "Field Options" msgstr "字段选项" -#: templates/generic/bulk_import.html:119 +#: netbox/templates/generic/bulk_import.html:119 msgid "Accessor" msgstr "Accessor" -#: templates/generic/bulk_import.html:148 +#: netbox/templates/generic/bulk_import.html:148 msgid "choices" msgstr "选择" -#: templates/generic/bulk_import.html:161 +#: netbox/templates/generic/bulk_import.html:161 msgid "Import Value" msgstr "导入值" -#: templates/generic/bulk_import.html:181 +#: netbox/templates/generic/bulk_import.html:181 msgid "Format: YYYY-MM-DD" msgstr "格式:年-月-日" -#: templates/generic/bulk_import.html:183 +#: netbox/templates/generic/bulk_import.html:183 msgid "Specify true or false" msgstr "指定true或false" -#: templates/generic/bulk_import.html:195 +#: netbox/templates/generic/bulk_import.html:195 msgid "Required fields must be specified for all objects." msgstr "必须为所有对象指定必填字段" -#: templates/generic/bulk_import.html:201 +#: netbox/templates/generic/bulk_import.html:201 #, python-format msgid "" "Related objects may be referenced by any unique attribute. For example, " "%(example)s would identify a VRF by its route distinguisher." msgstr "相关对象可以由任何唯一的属性引用。例如,%(example)s将通过RD来识别VRF" -#: templates/generic/bulk_remove.html:28 +#: netbox/templates/generic/bulk_remove.html:28 msgid "Bulk Remove" msgstr "批量移除" -#: templates/generic/bulk_remove.html:42 +#: netbox/templates/generic/bulk_remove.html:42 msgid "Confirm Bulk Removal" msgstr "确认批量删除" -#: templates/generic/bulk_remove.html:43 +#: netbox/templates/generic/bulk_remove.html:43 #, python-format msgid "" "The following operation will remove %(count)s %(obj_type_plural)s from " @@ -12665,72 +13436,72 @@ msgid "" msgstr "" "以下操作将从%(parent_obj)s中删除%(count)s个%(obj_type_plural)s,请仔细查看要删除的%(obj_type_plural)s,并在下面进行确认。" -#: templates/generic/bulk_remove.html:64 +#: netbox/templates/generic/bulk_remove.html:64 #, python-format msgid "Remove these %(count)s %(obj_type_plural)s" msgstr "删除%(count)s个 %(obj_type_plural)s" -#: templates/generic/bulk_rename.html:20 +#: netbox/templates/generic/bulk_rename.html:20 msgid "Renaming" msgstr "重命名" -#: templates/generic/bulk_rename.html:27 +#: netbox/templates/generic/bulk_rename.html:27 msgid "Bulk Rename" msgstr "批量重命名" -#: templates/generic/bulk_rename.html:39 +#: netbox/templates/generic/bulk_rename.html:39 msgid "Current Name" msgstr "当前名称" -#: templates/generic/bulk_rename.html:40 +#: netbox/templates/generic/bulk_rename.html:40 msgid "New Name" msgstr "新名称" -#: templates/generic/bulk_rename.html:64 -#: utilities/templates/widgets/markdown_input.html:11 +#: netbox/templates/generic/bulk_rename.html:64 +#: netbox/utilities/templates/widgets/markdown_input.html:11 msgid "Preview" msgstr "预览" -#: templates/generic/confirmation_form.html:16 +#: netbox/templates/generic/confirmation_form.html:16 msgid "Are you sure" msgstr "确认吗" -#: templates/generic/confirmation_form.html:20 +#: netbox/templates/generic/confirmation_form.html:20 msgid "Confirm" msgstr "确认" -#: templates/generic/object_children.html:47 -#: utilities/templates/buttons/bulk_edit.html:4 +#: netbox/templates/generic/object_children.html:47 +#: netbox/utilities/templates/buttons/bulk_edit.html:4 msgid "Edit Selected" msgstr "修改选中项" -#: templates/generic/object_children.html:61 -#: utilities/templates/buttons/bulk_delete.html:4 +#: netbox/templates/generic/object_children.html:61 +#: netbox/utilities/templates/buttons/bulk_delete.html:4 msgid "Delete Selected" msgstr "删除选中项" -#: templates/generic/object_edit.html:24 +#: netbox/templates/generic/object_edit.html:24 #, python-format msgid "Add a new %(object_type)s" msgstr "添加一个新的 %(object_type)s" -#: templates/generic/object_edit.html:35 +#: netbox/templates/generic/object_edit.html:35 msgid "View model documentation" msgstr "查看model文档" -#: templates/generic/object_edit.html:36 +#: netbox/templates/generic/object_edit.html:36 msgid "Help" msgstr "帮助" -#: templates/generic/object_edit.html:83 +#: netbox/templates/generic/object_edit.html:83 msgid "Create & Add Another" msgstr "创建并添加另一个" -#: templates/generic/object_list.html:57 +#: netbox/templates/generic/object_list.html:57 msgid "Filters" msgstr "筛选" -#: templates/generic/object_list.html:88 +#: netbox/templates/generic/object_list.html:88 #, python-format msgid "" "Select all %(count)s " @@ -12739,40 +13510,40 @@ msgstr "" "选择 所有的 %(count)s个 " "%(object_type_plural)s 查询到的记录" -#: templates/home.html:15 +#: netbox/templates/home.html:15 msgid "New Release Available" msgstr "有新版本可用" -#: templates/home.html:16 +#: netbox/templates/home.html:16 msgid "is available" msgstr "可用" -#: templates/home.html:18 +#: netbox/templates/home.html:18 msgctxt "Document title" msgid "Upgrade Instructions" msgstr "升级说明" -#: templates/home.html:40 +#: netbox/templates/home.html:40 msgid "Unlock Dashboard" msgstr "解锁仪表板" -#: templates/home.html:49 +#: netbox/templates/home.html:49 msgid "Lock Dashboard" msgstr "锁定仪表板" -#: templates/home.html:60 +#: netbox/templates/home.html:60 msgid "Add Widget" msgstr "添加小组件" -#: templates/home.html:63 +#: netbox/templates/home.html:63 msgid "Save Layout" msgstr "保存仪表盘" -#: templates/htmx/delete_form.html:7 +#: netbox/templates/htmx/delete_form.html:7 msgid "Confirm Deletion" msgstr "删除确认" -#: templates/htmx/delete_form.html:11 +#: netbox/templates/htmx/delete_form.html:11 #, python-format msgid "" "Are you sure you want to delete " @@ -12781,321 +13552,323 @@ msgstr "" "确认删除 %(object_type)s " "%(object)s?" -#: templates/htmx/delete_form.html:17 +#: netbox/templates/htmx/delete_form.html:17 msgid "The following objects will be deleted as a result of this action." msgstr "此操作将删除以下对象。" -#: templates/htmx/notifications.html:15 +#: netbox/templates/htmx/notifications.html:15 msgid "ago" msgstr "以前" -#: templates/htmx/notifications.html:26 +#: netbox/templates/htmx/notifications.html:26 msgid "No unread notifications" msgstr "没有未读通知" -#: templates/htmx/notifications.html:31 +#: netbox/templates/htmx/notifications.html:31 msgid "All notifications" msgstr "所有通知" -#: templates/htmx/object_selector.html:5 +#: netbox/templates/htmx/object_selector.html:5 msgid "Select" msgstr "选择" -#: templates/inc/filter_list.html:43 -#: utilities/templates/helpers/table_config_form.html:39 +#: netbox/templates/inc/filter_list.html:43 +#: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" msgstr "重置" -#: templates/inc/light_toggle.html:4 +#: netbox/templates/inc/light_toggle.html:4 msgid "Enable dark mode" msgstr "启用深色模式" -#: templates/inc/light_toggle.html:7 +#: netbox/templates/inc/light_toggle.html:7 msgid "Enable light mode" msgstr "启用浅色模式" -#: templates/inc/missing_prerequisites.html:8 +#: netbox/templates/inc/missing_prerequisites.html:8 #, python-format msgid "" "Before you can add a %(model)s you must first create a " "%(prerequisite_model)s." msgstr "添加%(model)s之前,必须先创建%(prerequisite_model)s." -#: templates/inc/paginator.html:15 +#: netbox/templates/inc/paginator.html:15 msgid "Page selection" msgstr "页面选择" -#: templates/inc/paginator.html:75 +#: netbox/templates/inc/paginator.html:75 #, python-format msgid "Showing %(start)s-%(end)s of %(total)s" msgstr "显示 %(start)s-%(end)s 共 %(total)s" -#: templates/inc/paginator.html:82 +#: netbox/templates/inc/paginator.html:82 msgid "Pagination options" msgstr "分页选项" -#: templates/inc/paginator.html:86 +#: netbox/templates/inc/paginator.html:86 msgid "Per Page" msgstr "每页" -#: templates/inc/panels/image_attachments.html:10 +#: netbox/templates/inc/panels/image_attachments.html:10 msgid "Attach an image" msgstr "增加图片" -#: templates/inc/panels/related_objects.html:5 +#: netbox/templates/inc/panels/related_objects.html:5 msgid "Related Objects" msgstr "相关对象" -#: templates/inc/panels/tags.html:11 +#: netbox/templates/inc/panels/tags.html:11 msgid "No tags assigned" msgstr "没有分配标签" -#: templates/inc/sync_warning.html:10 +#: netbox/templates/inc/sync_warning.html:10 msgid "Data is out of sync with upstream file" msgstr "数据与上游文件不同步" -#: templates/inc/table_controls_htmx.html:7 +#: netbox/templates/inc/table_controls_htmx.html:7 msgid "Quick search" msgstr "快速搜索" -#: templates/inc/table_controls_htmx.html:20 +#: netbox/templates/inc/table_controls_htmx.html:20 msgid "Saved filter" msgstr "保存的筛选" -#: templates/inc/table_htmx.html:18 +#: netbox/templates/inc/table_htmx.html:18 msgid "Clear ordering" msgstr "清除订单" -#: templates/inc/user_menu.html:6 +#: netbox/templates/inc/user_menu.html:6 msgid "Help center" msgstr "帮助中心" -#: templates/inc/user_menu.html:41 +#: netbox/templates/inc/user_menu.html:41 msgid "Django Admin" msgstr "Django Admin" -#: templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:61 msgid "Log Out" msgstr "登出" -#: templates/inc/user_menu.html:68 templates/login.html:38 +#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 msgid "Log In" msgstr "登录" -#: templates/ipam/aggregate.html:14 templates/ipam/ipaddress.html:14 -#: templates/ipam/iprange.html:13 templates/ipam/prefix.html:15 +#: netbox/templates/ipam/aggregate.html:14 +#: netbox/templates/ipam/ipaddress.html:14 +#: netbox/templates/ipam/iprange.html:13 netbox/templates/ipam/prefix.html:15 msgid "Family" msgstr "Family" -#: templates/ipam/aggregate.html:39 +#: netbox/templates/ipam/aggregate.html:39 msgid "Date Added" msgstr "添加日期" -#: templates/ipam/aggregate/prefixes.html:8 -#: templates/ipam/prefix/prefixes.html:8 templates/ipam/role.html:10 +#: netbox/templates/ipam/aggregate/prefixes.html:8 +#: netbox/templates/ipam/prefix/prefixes.html:8 +#: netbox/templates/ipam/role.html:10 msgid "Add Prefix" msgstr "增加IP前缀" -#: templates/ipam/asn.html:23 +#: netbox/templates/ipam/asn.html:23 msgid "AS Number" msgstr "AS号码" -#: templates/ipam/fhrpgroup.html:52 +#: netbox/templates/ipam/fhrpgroup.html:52 msgid "Authentication Type" msgstr "认证类型" -#: templates/ipam/fhrpgroup.html:56 +#: netbox/templates/ipam/fhrpgroup.html:56 msgid "Authentication Key" msgstr "认证密钥" -#: templates/ipam/fhrpgroup.html:69 +#: netbox/templates/ipam/fhrpgroup.html:69 msgid "Virtual IP Addresses" msgstr "虚拟IP地址" -#: templates/ipam/inc/ipaddress_edit_header.html:13 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:13 msgid "Assign IP" msgstr "分配IP" -#: templates/ipam/inc/ipaddress_edit_header.html:19 +#: netbox/templates/ipam/inc/ipaddress_edit_header.html:19 msgid "Bulk Create" msgstr "批量创建" -#: templates/ipam/inc/panels/fhrp_groups.html:10 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:10 msgid "Create Group" msgstr "创建组" -#: templates/ipam/inc/panels/fhrp_groups.html:25 +#: netbox/templates/ipam/inc/panels/fhrp_groups.html:25 msgid "Virtual IPs" msgstr "虚拟IP" -#: templates/ipam/inc/toggle_available.html:7 +#: netbox/templates/ipam/inc/toggle_available.html:7 msgid "Show Assigned" msgstr "查看指定的" -#: templates/ipam/inc/toggle_available.html:10 +#: netbox/templates/ipam/inc/toggle_available.html:10 msgid "Show Available" msgstr "查看可用" -#: templates/ipam/inc/toggle_available.html:13 +#: netbox/templates/ipam/inc/toggle_available.html:13 msgid "Show All" msgstr "全部显示" -#: templates/ipam/ipaddress.html:23 templates/ipam/iprange.html:45 -#: templates/ipam/prefix.html:24 +#: netbox/templates/ipam/ipaddress.html:23 +#: netbox/templates/ipam/iprange.html:45 netbox/templates/ipam/prefix.html:24 msgid "Global" msgstr "全局" -#: templates/ipam/ipaddress.html:85 +#: netbox/templates/ipam/ipaddress.html:85 msgid "NAT (outside)" msgstr "NAT(外部ip)" -#: templates/ipam/ipaddress_assign.html:8 +#: netbox/templates/ipam/ipaddress_assign.html:8 msgid "Assign an IP Address" msgstr "分配IP地址" -#: templates/ipam/ipaddress_assign.html:22 +#: netbox/templates/ipam/ipaddress_assign.html:22 msgid "Select IP Address" msgstr "选择IP地址" -#: templates/ipam/ipaddress_assign.html:35 +#: netbox/templates/ipam/ipaddress_assign.html:35 msgid "Search Results" msgstr "搜索结果" -#: templates/ipam/ipaddress_bulk_add.html:6 +#: netbox/templates/ipam/ipaddress_bulk_add.html:6 msgid "Bulk Add IP Addresses" msgstr "批量创建IP地址" -#: templates/ipam/iprange.html:17 +#: netbox/templates/ipam/iprange.html:17 msgid "Starting Address" msgstr "开始地址" -#: templates/ipam/iprange.html:21 +#: netbox/templates/ipam/iprange.html:21 msgid "Ending Address" msgstr "结束地址" -#: templates/ipam/iprange.html:33 templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 msgid "Marked fully utilized" msgstr "标记为已全部被使用" -#: templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:99 msgid "Addressing Details" msgstr "IP地址详细信息" -#: templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:118 msgid "Child IPs" msgstr "子IP" -#: templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:126 msgid "Available IPs" msgstr "可用IP" -#: templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:138 msgid "First available IP" msgstr "第一个可用IP" -#: templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:179 msgid "Prefix Details" msgstr "前缀详细信息" -#: templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Address" msgstr "网络地址" -#: templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:189 msgid "Network Mask" msgstr "网络掩码/子网掩码" -#: templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:193 msgid "Wildcard Mask" msgstr "反掩码" -#: templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:197 msgid "Broadcast Address" msgstr "广播地址" -#: templates/ipam/prefix/ip_ranges.html:7 +#: netbox/templates/ipam/prefix/ip_ranges.html:7 msgid "Add IP Range" msgstr "添加IP范围" -#: templates/ipam/prefix_list.html:7 +#: netbox/templates/ipam/prefix_list.html:7 msgid "Hide Depth Indicators" msgstr "隐藏深度值" -#: templates/ipam/prefix_list.html:11 +#: netbox/templates/ipam/prefix_list.html:11 msgid "Max Depth" msgstr "最大深度" -#: templates/ipam/prefix_list.html:28 +#: netbox/templates/ipam/prefix_list.html:28 msgid "Max Length" msgstr "最大长度" -#: templates/ipam/rir.html:10 +#: netbox/templates/ipam/rir.html:10 msgid "Add Aggregate" msgstr "添加聚合IP" -#: templates/ipam/routetarget.html:38 +#: netbox/templates/ipam/routetarget.html:38 msgid "Importing VRFs" msgstr "导入VFR" -#: templates/ipam/routetarget.html:44 +#: netbox/templates/ipam/routetarget.html:44 msgid "Exporting VRFs" msgstr "导出VFR" -#: templates/ipam/routetarget.html:52 +#: netbox/templates/ipam/routetarget.html:52 msgid "Importing L2VPNs" msgstr "导入L2VPN" -#: templates/ipam/routetarget.html:58 +#: netbox/templates/ipam/routetarget.html:58 msgid "Exporting L2VPNs" msgstr "导出L2VPN" -#: templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:88 msgid "Add a Prefix" msgstr "添加一个前缀" -#: templates/ipam/vlangroup.html:18 +#: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "添加VLAN" -#: templates/ipam/vrf.html:16 +#: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "路由实例" -#: templates/ipam/vrf.html:29 +#: netbox/templates/ipam/vrf.html:29 msgid "Unique IP Space" msgstr "独立IP空间" -#: templates/login.html:29 -#: utilities/templates/form_helpers/render_errors.html:7 +#: netbox/templates/login.html:29 +#: netbox/utilities/templates/form_helpers/render_errors.html:7 msgid "Errors" msgstr "错误" -#: templates/login.html:69 +#: netbox/templates/login.html:69 msgid "Sign In" msgstr "登录" -#: templates/login.html:77 +#: netbox/templates/login.html:77 msgctxt "Denotes an alternative option" msgid "Or" msgstr "或" -#: templates/media_failure.html:7 +#: netbox/templates/media_failure.html:7 msgid "Static Media Failure - NetBox" msgstr "静态文件故障-NetBox" -#: templates/media_failure.html:21 +#: netbox/templates/media_failure.html:21 msgid "Static Media Failure" msgstr "静态文件故障" -#: templates/media_failure.html:23 +#: netbox/templates/media_failure.html:23 msgid "The following static media file failed to load" msgstr "无法加载以下静态文件" -#: templates/media_failure.html:26 +#: netbox/templates/media_failure.html:26 msgid "Check the following" msgstr "检查以下内容" -#: templates/media_failure.html:29 +#: netbox/templates/media_failure.html:29 msgid "" "manage.py collectstatic was run during the most recent upgrade." " This installs the most recent iteration of each static file into the static" @@ -13103,7 +13876,7 @@ msgid "" msgstr "" "在升级过程中执行manage.py collectstatic 。这会将每个静态文件的最新迭代版本安装到静态文件根路径中。" -#: templates/media_failure.html:35 +#: netbox/templates/media_failure.html:35 #, python-format msgid "" "The HTTP service (e.g. nginx or Apache) is configured to serve files from " @@ -13113,553 +13886,576 @@ msgstr "" "HTTP服务(例如nginx或Apache)被配置为从STATIC_ROOT路径提供文件。请参考the installation documentation以获取更多指导。" -#: templates/media_failure.html:47 +#: netbox/templates/media_failure.html:47 #, python-format msgid "" "The file %(filename)s exists in the static root directory and " "is readable by the HTTP server." msgstr "文件%(filename)s存在于静态文件根目录中,可由HTTP服务器读取。" -#: templates/media_failure.html:55 +#: netbox/templates/media_failure.html:55 #, python-format msgid "Click here to attempt loading NetBox again." msgstr "点击 这里重新加载NetBox" -#: templates/tenancy/contact.html:18 tenancy/filtersets.py:147 -#: tenancy/forms/bulk_edit.py:137 tenancy/forms/filtersets.py:102 -#: tenancy/forms/forms.py:56 tenancy/forms/model_forms.py:106 -#: tenancy/forms/model_forms.py:130 tenancy/tables/contacts.py:98 +#: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 +#: netbox/tenancy/forms/bulk_edit.py:137 +#: netbox/tenancy/forms/filtersets.py:102 netbox/tenancy/forms/forms.py:56 +#: netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/model_forms.py:130 +#: netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "联系人" -#: templates/tenancy/contact.html:29 tenancy/forms/bulk_edit.py:99 +#: netbox/templates/tenancy/contact.html:29 +#: netbox/tenancy/forms/bulk_edit.py:99 msgid "Title" msgstr "标题" -#: templates/tenancy/contact.html:33 tenancy/forms/bulk_edit.py:104 -#: tenancy/tables/contacts.py:64 +#: netbox/templates/tenancy/contact.html:33 +#: netbox/tenancy/forms/bulk_edit.py:104 netbox/tenancy/tables/contacts.py:64 msgid "Phone" msgstr "手机号" -#: templates/tenancy/contactgroup.html:18 tenancy/forms/forms.py:66 -#: tenancy/forms/model_forms.py:75 +#: netbox/templates/tenancy/contactgroup.html:18 +#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "联系人组" -#: templates/tenancy/contactgroup.html:50 +#: netbox/templates/tenancy/contactgroup.html:50 msgid "Add Contact Group" msgstr "增加联系人组" -#: templates/tenancy/contactrole.html:15 tenancy/filtersets.py:152 -#: tenancy/forms/forms.py:61 tenancy/forms/model_forms.py:87 +#: netbox/templates/tenancy/contactrole.html:15 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "联系人角色" -#: templates/tenancy/object_contacts.html:9 +#: netbox/templates/tenancy/object_contacts.html:9 msgid "Add a contact" msgstr "增加联系人" -#: templates/tenancy/tenantgroup.html:17 +#: netbox/templates/tenancy/tenantgroup.html:17 msgid "Add Tenant" msgstr "增加租户" -#: templates/tenancy/tenantgroup.html:26 tenancy/forms/model_forms.py:32 -#: tenancy/tables/columns.py:51 tenancy/tables/columns.py:61 +#: netbox/templates/tenancy/tenantgroup.html:26 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 +#: netbox/tenancy/tables/columns.py:61 msgid "Tenant Group" msgstr "租户组" -#: templates/tenancy/tenantgroup.html:59 +#: netbox/templates/tenancy/tenantgroup.html:59 msgid "Add Tenant Group" msgstr "增加租户组" -#: templates/users/group.html:39 templates/users/user.html:63 +#: netbox/templates/users/group.html:39 netbox/templates/users/user.html:63 msgid "Assigned Permissions" msgstr "分配的权限" -#: templates/users/objectpermission.html:6 -#: templates/users/objectpermission.html:14 users/forms/filtersets.py:66 +#: netbox/templates/users/objectpermission.html:6 +#: netbox/templates/users/objectpermission.html:14 +#: netbox/users/forms/filtersets.py:66 msgid "Permission" msgstr "权限" -#: templates/users/objectpermission.html:34 +#: netbox/templates/users/objectpermission.html:34 msgid "View" msgstr "查看" -#: templates/users/objectpermission.html:52 users/forms/model_forms.py:315 +#: netbox/templates/users/objectpermission.html:52 +#: netbox/users/forms/model_forms.py:315 msgid "Constraints" msgstr "限制因素" -#: templates/users/objectpermission.html:72 +#: netbox/templates/users/objectpermission.html:72 msgid "Assigned Users" msgstr "分配用户" -#: templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:52 msgid "Allocated Resources" msgstr "已分配资源" -#: templates/virtualization/cluster.html:55 -#: templates/virtualization/virtualmachine.html:125 +#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "虚拟CPU" -#: templates/virtualization/cluster.html:59 -#: templates/virtualization/virtualmachine.html:129 +#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "内存" -#: templates/virtualization/cluster.html:69 -#: templates/virtualization/virtualmachine.html:140 +#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "磁盘空间" -#: templates/virtualization/cluster/base.html:18 +#: netbox/templates/virtualization/cluster/base.html:18 msgid "Add Virtual Machine" msgstr "增加虚拟机" -#: templates/virtualization/cluster/base.html:24 +#: netbox/templates/virtualization/cluster/base.html:24 msgid "Assign Device" msgstr "分配设备" -#: templates/virtualization/cluster/devices.html:10 +#: netbox/templates/virtualization/cluster/devices.html:10 msgid "Remove Selected" msgstr "删除选定" -#: templates/virtualization/cluster_add_devices.html:9 +#: netbox/templates/virtualization/cluster_add_devices.html:9 #, python-format msgid "Add Device to Cluster %(cluster)s" msgstr "增加设备到虚拟化集群 %(cluster)s" -#: templates/virtualization/cluster_add_devices.html:23 +#: netbox/templates/virtualization/cluster_add_devices.html:23 msgid "Device Selection" msgstr "设备选择" -#: templates/virtualization/cluster_add_devices.html:31 +#: netbox/templates/virtualization/cluster_add_devices.html:31 msgid "Add Devices" msgstr "增加设备" -#: templates/virtualization/clustergroup.html:10 -#: templates/virtualization/clustertype.html:10 +#: netbox/templates/virtualization/clustergroup.html:10 +#: netbox/templates/virtualization/clustertype.html:10 msgid "Add Cluster" msgstr "增加集群" -#: templates/virtualization/clustergroup.html:19 -#: virtualization/forms/model_forms.py:50 +#: netbox/templates/virtualization/clustergroup.html:19 +#: netbox/virtualization/forms/model_forms.py:50 msgid "Cluster Group" msgstr "集群组" -#: templates/virtualization/clustertype.html:19 -#: templates/virtualization/virtualmachine.html:110 -#: virtualization/forms/model_forms.py:36 +#: netbox/templates/virtualization/clustertype.html:19 +#: netbox/templates/virtualization/virtualmachine.html:110 +#: netbox/virtualization/forms/model_forms.py:36 msgid "Cluster Type" msgstr "集群类型" -#: templates/virtualization/virtualdisk.html:18 +#: netbox/templates/virtualization/virtualdisk.html:18 msgid "Virtual Disk" msgstr "虚拟硬盘" -#: templates/virtualization/virtualmachine.html:122 -#: virtualization/forms/bulk_edit.py:190 -#: virtualization/forms/model_forms.py:224 +#: netbox/templates/virtualization/virtualmachine.html:122 +#: netbox/virtualization/forms/bulk_edit.py:190 +#: netbox/virtualization/forms/model_forms.py:224 msgid "Resources" msgstr "资源" -#: templates/virtualization/virtualmachine.html:178 +#: netbox/templates/virtualization/virtualmachine.html:178 msgid "Add Virtual Disk" msgstr "增加虚拟硬盘" -#: templates/vpn/ikepolicy.html:10 templates/vpn/ipsecprofile.html:33 -#: vpn/tables/crypto.py:166 +#: netbox/templates/virtualization/virtualmachine/render_config.html:70 +msgid "No configuration template has been assigned for this virtual machine." +msgstr "" + +#: netbox/templates/vpn/ikepolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 msgid "IKE Policy" msgstr "IKE Policy" -#: templates/vpn/ikepolicy.html:21 +#: netbox/templates/vpn/ikepolicy.html:21 msgid "IKE Version" msgstr "IKE 版本" -#: templates/vpn/ikepolicy.html:29 +#: netbox/templates/vpn/ikepolicy.html:29 msgid "Pre-Shared Key" msgstr "预共享密钥-PSK" -#: templates/vpn/ikepolicy.html:33 -#: templates/wireless/inc/authentication_attrs.html:20 +#: netbox/templates/vpn/ikepolicy.html:33 +#: netbox/templates/wireless/inc/authentication_attrs.html:20 msgid "Show Secret" msgstr "显示密码" -#: templates/vpn/ikepolicy.html:57 templates/vpn/ipsecpolicy.html:45 -#: templates/vpn/ipsecprofile.html:52 templates/vpn/ipsecprofile.html:77 -#: vpn/forms/model_forms.py:316 vpn/forms/model_forms.py:352 -#: vpn/tables/crypto.py:68 vpn/tables/crypto.py:134 +#: netbox/templates/vpn/ikepolicy.html:57 +#: netbox/templates/vpn/ipsecpolicy.html:45 +#: netbox/templates/vpn/ipsecprofile.html:52 +#: netbox/templates/vpn/ipsecprofile.html:77 +#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "Proposals" -#: templates/vpn/ikeproposal.html:10 +#: netbox/templates/vpn/ikeproposal.html:10 msgid "IKE Proposal" msgstr "IKE Proposal" -#: templates/vpn/ikeproposal.html:21 vpn/forms/bulk_edit.py:97 -#: vpn/forms/bulk_import.py:145 vpn/forms/filtersets.py:101 +#: netbox/templates/vpn/ikeproposal.html:21 netbox/vpn/forms/bulk_edit.py:97 +#: netbox/vpn/forms/bulk_import.py:145 netbox/vpn/forms/filtersets.py:101 msgid "Authentication method" msgstr "身份验证方法" -#: templates/vpn/ikeproposal.html:25 templates/vpn/ipsecproposal.html:21 -#: vpn/forms/bulk_edit.py:102 vpn/forms/bulk_edit.py:172 -#: vpn/forms/bulk_import.py:149 vpn/forms/bulk_import.py:195 -#: vpn/forms/filtersets.py:106 vpn/forms/filtersets.py:154 +#: netbox/templates/vpn/ikeproposal.html:25 +#: netbox/templates/vpn/ipsecproposal.html:21 +#: netbox/vpn/forms/bulk_edit.py:102 netbox/vpn/forms/bulk_edit.py:172 +#: netbox/vpn/forms/bulk_import.py:149 netbox/vpn/forms/bulk_import.py:195 +#: netbox/vpn/forms/filtersets.py:106 netbox/vpn/forms/filtersets.py:154 msgid "Encryption algorithm" msgstr "加密算法" -#: templates/vpn/ikeproposal.html:29 templates/vpn/ipsecproposal.html:25 -#: vpn/forms/bulk_edit.py:107 vpn/forms/bulk_edit.py:177 -#: vpn/forms/bulk_import.py:153 vpn/forms/bulk_import.py:200 -#: vpn/forms/filtersets.py:111 vpn/forms/filtersets.py:159 +#: netbox/templates/vpn/ikeproposal.html:29 +#: netbox/templates/vpn/ipsecproposal.html:25 +#: netbox/vpn/forms/bulk_edit.py:107 netbox/vpn/forms/bulk_edit.py:177 +#: netbox/vpn/forms/bulk_import.py:153 netbox/vpn/forms/bulk_import.py:200 +#: netbox/vpn/forms/filtersets.py:111 netbox/vpn/forms/filtersets.py:159 msgid "Authentication algorithm" msgstr "认证算法" -#: templates/vpn/ikeproposal.html:33 +#: netbox/templates/vpn/ikeproposal.html:33 msgid "DH group" msgstr "DH group" -#: templates/vpn/ikeproposal.html:37 templates/vpn/ipsecproposal.html:29 -#: vpn/forms/bulk_edit.py:182 vpn/models/crypto.py:146 +#: netbox/templates/vpn/ikeproposal.html:37 +#: netbox/templates/vpn/ipsecproposal.html:29 +#: netbox/vpn/forms/bulk_edit.py:182 netbox/vpn/models/crypto.py:146 msgid "SA lifetime (seconds)" msgstr "SA生存期(秒)" -#: templates/vpn/ipsecpolicy.html:10 templates/vpn/ipsecprofile.html:66 -#: vpn/tables/crypto.py:170 +#: netbox/templates/vpn/ipsecpolicy.html:10 +#: netbox/templates/vpn/ipsecprofile.html:66 netbox/vpn/tables/crypto.py:170 msgid "IPSec Policy" msgstr "IPSec Policy" -#: templates/vpn/ipsecpolicy.html:21 vpn/forms/bulk_edit.py:210 -#: vpn/models/crypto.py:193 +#: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 +#: netbox/vpn/models/crypto.py:193 msgid "PFS group" msgstr "PFS group" -#: templates/vpn/ipsecprofile.html:10 vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 +#: netbox/vpn/forms/model_forms.py:54 msgid "IPSec Profile" msgstr "IPSec Profile" -#: templates/vpn/ipsecprofile.html:89 vpn/tables/crypto.py:137 +#: netbox/templates/vpn/ipsecprofile.html:89 netbox/vpn/tables/crypto.py:137 msgid "PFS Group" msgstr "PFS Group" -#: templates/vpn/ipsecproposal.html:10 +#: netbox/templates/vpn/ipsecproposal.html:10 msgid "IPSec Proposal" msgstr "IPSec Proposal" -#: templates/vpn/ipsecproposal.html:33 vpn/forms/bulk_edit.py:186 -#: vpn/models/crypto.py:152 +#: netbox/templates/vpn/ipsecproposal.html:33 +#: netbox/vpn/forms/bulk_edit.py:186 netbox/vpn/models/crypto.py:152 msgid "SA lifetime (KB)" msgstr "SA生存大小(KB)" -#: templates/vpn/l2vpn.html:11 templates/vpn/l2vpntermination.html:9 +#: netbox/templates/vpn/l2vpn.html:11 +#: netbox/templates/vpn/l2vpntermination.html:9 msgid "L2VPN Attributes" msgstr "L2VPN 属性" -#: templates/vpn/l2vpn.html:60 templates/vpn/tunnel.html:76 +#: netbox/templates/vpn/l2vpn.html:60 netbox/templates/vpn/tunnel.html:76 msgid "Add a Termination" msgstr "增加接入点" -#: templates/vpn/tunnel.html:9 +#: netbox/templates/vpn/tunnel.html:9 msgid "Add Termination" msgstr "增加接入点" -#: templates/vpn/tunnel.html:37 vpn/forms/bulk_edit.py:49 -#: vpn/forms/bulk_import.py:48 vpn/forms/filtersets.py:57 +#: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 +#: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" msgstr "封装" -#: templates/vpn/tunnel.html:41 vpn/forms/bulk_edit.py:55 -#: vpn/forms/bulk_import.py:53 vpn/forms/filtersets.py:64 -#: vpn/models/crypto.py:250 vpn/tables/tunnels.py:51 +#: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 +#: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 +#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "IPSec profile" -#: templates/vpn/tunnel.html:45 vpn/forms/bulk_edit.py:69 -#: vpn/forms/filtersets.py:68 +#: netbox/templates/vpn/tunnel.html:45 netbox/vpn/forms/bulk_edit.py:69 +#: netbox/vpn/forms/filtersets.py:68 msgid "Tunnel ID" msgstr "Tunnel ID" -#: templates/vpn/tunnelgroup.html:14 +#: netbox/templates/vpn/tunnelgroup.html:14 msgid "Add Tunnel" msgstr "增加 Tunnel" -#: templates/vpn/tunnelgroup.html:23 vpn/forms/model_forms.py:36 -#: vpn/forms/model_forms.py:49 +#: netbox/templates/vpn/tunnelgroup.html:23 netbox/vpn/forms/model_forms.py:36 +#: netbox/vpn/forms/model_forms.py:49 msgid "Tunnel Group" msgstr "Tunnel 组" -#: templates/vpn/tunneltermination.html:10 +#: netbox/templates/vpn/tunneltermination.html:10 msgid "Tunnel Termination" msgstr "Tunnel 接入点" -#: templates/vpn/tunneltermination.html:35 vpn/forms/bulk_import.py:107 -#: vpn/forms/model_forms.py:102 vpn/forms/model_forms.py:138 -#: vpn/forms/model_forms.py:247 vpn/tables/tunnels.py:101 +#: netbox/templates/vpn/tunneltermination.html:35 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 +#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "外部 IP" -#: templates/vpn/tunneltermination.html:51 +#: netbox/templates/vpn/tunneltermination.html:51 msgid "Peer Terminations" msgstr "对等体接入点" -#: templates/wireless/inc/authentication_attrs.html:12 +#: netbox/templates/wireless/inc/authentication_attrs.html:12 msgid "Cipher" msgstr "加密" -#: templates/wireless/inc/authentication_attrs.html:16 +#: netbox/templates/wireless/inc/authentication_attrs.html:16 msgid "PSK" msgstr "PSK-共享密钥" -#: templates/wireless/inc/wirelesslink_interface.html:35 -#: templates/wireless/inc/wirelesslink_interface.html:45 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:35 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:45 msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "MHz" -#: templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:57 msgid "Attached Interfaces" msgstr "附加接口" -#: templates/wireless/wirelesslangroup.html:17 +#: netbox/templates/wireless/wirelesslangroup.html:17 msgid "Add Wireless LAN" msgstr "增加无线局域网" -#: templates/wireless/wirelesslangroup.html:26 -#: wireless/forms/model_forms.py:28 +#: netbox/templates/wireless/wirelesslangroup.html:26 +#: netbox/wireless/forms/model_forms.py:28 msgid "Wireless LAN Group" msgstr "无线局域网组" -#: templates/wireless/wirelesslangroup.html:59 +#: netbox/templates/wireless/wirelesslangroup.html:59 msgid "Add Wireless LAN Group" msgstr "增加无线局域网组" -#: templates/wireless/wirelesslink.html:14 +#: netbox/templates/wireless/wirelesslink.html:14 msgid "Link Properties" msgstr "链接属性" -#: templates/wireless/wirelesslink.html:38 wireless/forms/bulk_edit.py:129 -#: wireless/forms/filtersets.py:102 wireless/forms/model_forms.py:165 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:102 +#: netbox/wireless/forms/model_forms.py:165 msgid "Distance" msgstr "距离" -#: tenancy/filtersets.py:28 +#: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "父联系人组 (ID)" -#: tenancy/filtersets.py:34 +#: netbox/tenancy/filtersets.py:34 msgid "Parent contact group (slug)" msgstr "父联系人组 (缩写)" -#: tenancy/filtersets.py:40 tenancy/filtersets.py:67 tenancy/filtersets.py:110 +#: netbox/tenancy/filtersets.py:40 netbox/tenancy/filtersets.py:67 +#: netbox/tenancy/filtersets.py:110 msgid "Contact group (ID)" msgstr "联系人组 (ID)" -#: tenancy/filtersets.py:47 tenancy/filtersets.py:74 tenancy/filtersets.py:117 +#: netbox/tenancy/filtersets.py:47 netbox/tenancy/filtersets.py:74 +#: netbox/tenancy/filtersets.py:117 msgid "Contact group (slug)" msgstr "联系人组(缩写)" -#: tenancy/filtersets.py:104 +#: netbox/tenancy/filtersets.py:104 msgid "Contact (ID)" msgstr "联系人 (ID)" -#: tenancy/filtersets.py:121 +#: netbox/tenancy/filtersets.py:121 msgid "Contact role (ID)" msgstr "联系人角色 (ID)" -#: tenancy/filtersets.py:127 +#: netbox/tenancy/filtersets.py:127 msgid "Contact role (slug)" msgstr "联系人角色(缩写)" -#: tenancy/filtersets.py:158 +#: netbox/tenancy/filtersets.py:158 msgid "Contact group" msgstr "联系人组" -#: tenancy/filtersets.py:169 +#: netbox/tenancy/filtersets.py:169 msgid "Parent tenant group (ID)" msgstr "父租户组 (ID)" -#: tenancy/filtersets.py:175 +#: netbox/tenancy/filtersets.py:175 msgid "Parent tenant group (slug)" msgstr "上级租户组(slug)" -#: tenancy/filtersets.py:181 tenancy/filtersets.py:201 +#: netbox/tenancy/filtersets.py:181 netbox/tenancy/filtersets.py:201 msgid "Tenant group (ID)" msgstr "租户组 (ID)" -#: tenancy/filtersets.py:234 +#: netbox/tenancy/filtersets.py:234 msgid "Tenant Group (ID)" msgstr "租户组 (ID)" -#: tenancy/filtersets.py:241 +#: netbox/tenancy/filtersets.py:241 msgid "Tenant Group (slug)" msgstr "租户组(缩写)" -#: tenancy/forms/bulk_edit.py:66 +#: netbox/tenancy/forms/bulk_edit.py:66 msgid "Desciption" msgstr "描述" -#: tenancy/forms/bulk_import.py:101 +#: netbox/tenancy/forms/bulk_import.py:101 msgid "Assigned contact" msgstr "分配联系人" -#: tenancy/models/contacts.py:32 +#: netbox/tenancy/models/contacts.py:32 msgid "contact group" msgstr "联系人组" -#: tenancy/models/contacts.py:33 +#: netbox/tenancy/models/contacts.py:33 msgid "contact groups" msgstr "联系人组" -#: tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:48 msgid "contact role" msgstr "联系人角色" -#: tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:49 msgid "contact roles" msgstr "联系人角色" -#: tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:68 msgid "title" msgstr "职位" -#: tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:73 msgid "phone" msgstr "电话号" -#: tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:78 msgid "email" msgstr "电子邮箱" -#: tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:87 msgid "link" msgstr "链接" -#: tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:103 msgid "contact" msgstr "联系人" -#: tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:104 msgid "contacts" msgstr "联系人" -#: tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:153 msgid "contact assignment" msgstr "联系人分配" -#: tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:154 msgid "contact assignments" msgstr "联系人分配" -#: tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:170 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "无法将联系人分配给此对象类型 ({type})." -#: tenancy/models/tenants.py:32 +#: netbox/tenancy/models/tenants.py:32 msgid "tenant group" msgstr "租户组" -#: tenancy/models/tenants.py:33 +#: netbox/tenancy/models/tenants.py:33 msgid "tenant groups" msgstr "租户组" -#: tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:70 msgid "Tenant name must be unique per group." msgstr "每个组的租户名称必须唯一。" -#: tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:80 msgid "Tenant slug must be unique per group." msgstr "每个组的租户缩写必须是唯一的。" -#: tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:88 msgid "tenant" msgstr "租户" -#: tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:89 msgid "tenants" msgstr "租户" -#: tenancy/tables/contacts.py:112 +#: netbox/tenancy/tables/contacts.py:112 msgid "Contact Title" msgstr "联系人职位" -#: tenancy/tables/contacts.py:116 +#: netbox/tenancy/tables/contacts.py:116 msgid "Contact Phone" msgstr "联系人电话号" -#: tenancy/tables/contacts.py:121 +#: netbox/tenancy/tables/contacts.py:121 msgid "Contact Email" msgstr "联系人电子邮箱" -#: tenancy/tables/contacts.py:125 +#: netbox/tenancy/tables/contacts.py:125 msgid "Contact Address" msgstr "联系人地址" -#: tenancy/tables/contacts.py:129 +#: netbox/tenancy/tables/contacts.py:129 msgid "Contact Link" msgstr "联系人链接" -#: tenancy/tables/contacts.py:133 +#: netbox/tenancy/tables/contacts.py:133 msgid "Contact Description" msgstr "联系人描述" -#: users/filtersets.py:33 users/filtersets.py:73 +#: netbox/users/filtersets.py:33 netbox/users/filtersets.py:73 msgid "Permission (ID)" msgstr "权限(ID)" -#: users/filtersets.py:38 users/filtersets.py:78 +#: netbox/users/filtersets.py:38 netbox/users/filtersets.py:78 msgid "Notification group (ID)" msgstr "通知组 (ID)" -#: users/forms/bulk_edit.py:26 +#: netbox/users/forms/bulk_edit.py:26 msgid "First name" msgstr "名字" -#: users/forms/bulk_edit.py:31 +#: netbox/users/forms/bulk_edit.py:31 msgid "Last name" msgstr "姓氏" -#: users/forms/bulk_edit.py:43 +#: netbox/users/forms/bulk_edit.py:43 msgid "Staff status" msgstr "工作人员状态" -#: users/forms/bulk_edit.py:48 +#: netbox/users/forms/bulk_edit.py:48 msgid "Superuser status" msgstr "超级用户状态" -#: users/forms/bulk_import.py:41 +#: netbox/users/forms/bulk_import.py:41 msgid "If no key is provided, one will be generated automatically." msgstr "如果未提供密钥,则会自动生成一个。" -#: users/forms/filtersets.py:51 users/tables.py:42 +#: netbox/users/forms/filtersets.py:51 netbox/users/tables.py:42 msgid "Is Staff" msgstr "是工作人员" -#: users/forms/filtersets.py:58 users/tables.py:45 +#: netbox/users/forms/filtersets.py:58 netbox/users/tables.py:45 msgid "Is Superuser" msgstr "是超级用户" -#: users/forms/filtersets.py:91 users/tables.py:86 +#: netbox/users/forms/filtersets.py:91 netbox/users/tables.py:86 msgid "Can View" msgstr "可查看" -#: users/forms/filtersets.py:98 users/tables.py:89 +#: netbox/users/forms/filtersets.py:98 netbox/users/tables.py:89 msgid "Can Add" msgstr "可以添加" -#: users/forms/filtersets.py:105 users/tables.py:92 +#: netbox/users/forms/filtersets.py:105 netbox/users/tables.py:92 msgid "Can Change" msgstr "可更改" -#: users/forms/filtersets.py:112 users/tables.py:95 +#: netbox/users/forms/filtersets.py:112 netbox/users/tables.py:95 msgid "Can Delete" msgstr "可删除" -#: users/forms/model_forms.py:62 +#: netbox/users/forms/model_forms.py:62 msgid "User Interface" msgstr "用户接口" -#: users/forms/model_forms.py:114 +#: netbox/users/forms/model_forms.py:114 msgid "" "Keys must be at least 40 characters in length. Be sure to record " "your key prior to submitting this form, as it may no longer be " @@ -13667,7 +14463,7 @@ msgid "" msgstr "" "密钥的长度必须至少为40个字符。在提交此表单之前请务必记下您的密钥因为一旦创建了令牌,就可能无法再访问该密钥。" -#: users/forms/model_forms.py:126 +#: netbox/users/forms/model_forms.py:126 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Example: " @@ -13676,106 +14472,106 @@ msgstr "" "允许使用 Token 的 IPv4/IPv6 网络。留空表示无限制。示例: " "10.1.1.0/24,192.168.10.16/32,2001:db8:1::/64" -#: users/forms/model_forms.py:175 +#: netbox/users/forms/model_forms.py:175 msgid "Confirm password" msgstr "确认密码" -#: users/forms/model_forms.py:178 +#: netbox/users/forms/model_forms.py:178 msgid "Enter the same password as before, for verification." msgstr "输入与以前相同的密码进行验证。" -#: users/forms/model_forms.py:227 +#: netbox/users/forms/model_forms.py:227 msgid "Passwords do not match! Please check your input and try again." msgstr "密码错误!请检查您的输入,然后重试。" -#: users/forms/model_forms.py:294 +#: netbox/users/forms/model_forms.py:294 msgid "Additional actions" msgstr "其他操作" -#: users/forms/model_forms.py:297 +#: netbox/users/forms/model_forms.py:297 msgid "Actions granted in addition to those listed above" msgstr "除上述操作外,还批准了其他操作" -#: users/forms/model_forms.py:313 +#: netbox/users/forms/model_forms.py:313 msgid "Objects" msgstr "对象" -#: users/forms/model_forms.py:325 +#: netbox/users/forms/model_forms.py:325 msgid "" "JSON expression of a queryset filter that will return only permitted " "objects. Leave null to match all objects of this type. A list of multiple " "objects will result in a logical OR operation." msgstr "查询集筛选器的JSON表达式,该表达式将只返回允许的对象。保留null以匹配此类型的所有对象。多个对象的列表将执行“或”运算。" -#: users/forms/model_forms.py:364 +#: netbox/users/forms/model_forms.py:364 msgid "At least one action must be selected." msgstr "必须至少选择一个操作。" -#: users/forms/model_forms.py:382 +#: netbox/users/forms/model_forms.py:382 #, python-brace-format msgid "Invalid filter for {model}: {error}" msgstr "{model}的筛选器无效: {error}" -#: users/models/permissions.py:39 +#: netbox/users/models/permissions.py:39 msgid "The list of actions granted by this permission" msgstr "该权限授予的操作列表" -#: users/models/permissions.py:44 +#: netbox/users/models/permissions.py:44 msgid "constraints" msgstr "限制条件" -#: users/models/permissions.py:45 +#: netbox/users/models/permissions.py:45 msgid "" "Queryset filter matching the applicable objects of the selected type(s)" msgstr "与所选类型的适用对象匹配的查询集过滤器" -#: users/models/permissions.py:52 +#: netbox/users/models/permissions.py:52 msgid "permission" msgstr "允许" -#: users/models/permissions.py:53 users/models/users.py:47 +#: netbox/users/models/permissions.py:53 netbox/users/models/users.py:47 msgid "permissions" msgstr "权限" -#: users/models/preferences.py:29 users/models/preferences.py:30 +#: netbox/users/models/preferences.py:29 netbox/users/models/preferences.py:30 msgid "user preferences" msgstr "用户首选项" -#: users/models/preferences.py:97 +#: netbox/users/models/preferences.py:97 #, python-brace-format msgid "Key '{path}' is a leaf node; cannot assign new keys" msgstr "Key '{path}' 是一个子节点;无法分配新密钥" -#: users/models/preferences.py:109 +#: netbox/users/models/preferences.py:109 #, python-brace-format msgid "Key '{path}' is a dictionary; cannot assign a non-dictionary value" msgstr "Key '{path}'是一个字典;无法分配非字典值" -#: users/models/tokens.py:36 +#: netbox/users/models/tokens.py:36 msgid "expires" msgstr "过期" -#: users/models/tokens.py:41 +#: netbox/users/models/tokens.py:41 msgid "last used" msgstr "最后使用" -#: users/models/tokens.py:46 +#: netbox/users/models/tokens.py:46 msgid "key" msgstr "key" -#: users/models/tokens.py:52 +#: netbox/users/models/tokens.py:52 msgid "write enabled" msgstr "可写开启" -#: users/models/tokens.py:54 +#: netbox/users/models/tokens.py:54 msgid "Permit create/update/delete operations using this key" msgstr "允许使用此密钥进行创建/更新/删除操作" -#: users/models/tokens.py:65 +#: netbox/users/models/tokens.py:65 msgid "allowed IPs" msgstr "允许的 IP" -#: users/models/tokens.py:67 +#: netbox/users/models/tokens.py:67 msgid "" "Allowed IPv4/IPv6 networks from where the token can be used. Leave blank for" " no restrictions. Ex: \"10.1.1.0/24, 192.168.10.16/32, 2001:DB8:1::/64\"" @@ -13783,207 +14579,208 @@ msgstr "" "允许使用 token 的 IPv4/IPv6 网络。 留空表示没有限制。 " "例如:“10.1.1.0/24、192.168.10.16/32、2001:DB8:1::/64”" -#: users/models/tokens.py:75 +#: netbox/users/models/tokens.py:75 msgid "token" msgstr "token" -#: users/models/tokens.py:76 +#: netbox/users/models/tokens.py:76 msgid "tokens" msgstr "tokens" -#: users/models/users.py:57 vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 msgid "group" msgstr "组" -#: users/models/users.py:92 +#: netbox/users/models/users.py:92 msgid "user" msgstr "用户" -#: users/models/users.py:104 +#: netbox/users/models/users.py:104 msgid "A user with this username already exists." msgstr "用户名已使用。" -#: users/tables.py:98 +#: netbox/users/tables.py:98 msgid "Custom Actions" msgstr "自定义操作" -#: utilities/api.py:153 +#: netbox/utilities/api.py:153 #, python-brace-format msgid "Related object not found using the provided attributes: {params}" msgstr "使用提供的属性找不到相关对象: {params}" -#: utilities/api.py:156 +#: netbox/utilities/api.py:156 #, python-brace-format msgid "Multiple objects match the provided attributes: {params}" msgstr "多个对象与提供的属性匹配: {params}" -#: utilities/api.py:168 +#: netbox/utilities/api.py:168 #, python-brace-format msgid "" "Related objects must be referenced by numeric ID or by dictionary of " "attributes. Received an unrecognized value: {value}" msgstr "相关对象必须由数字ID或属性字典引用。接收到无法识别的值: {value}" -#: utilities/api.py:177 +#: netbox/utilities/api.py:177 #, python-brace-format msgid "Related object not found using the provided numeric ID: {id}" msgstr "使用提供的ID找不到相关对象: {id}" -#: utilities/choices.py:19 +#: netbox/utilities/choices.py:19 #, python-brace-format msgid "{name} has a key defined but CHOICES is not a list" msgstr "{name} 已定义键,但 CHOICES 不是列表" -#: utilities/conversion.py:19 +#: netbox/utilities/conversion.py:19 msgid "Weight must be a positive number" msgstr "重量必须是正数" -#: utilities/conversion.py:21 +#: netbox/utilities/conversion.py:21 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr " '{weight}' 为无效重量(必须是数字)" -#: utilities/conversion.py:32 utilities/conversion.py:62 +#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "{unit}无效。请使用 {valid_units}" -#: utilities/conversion.py:45 +#: netbox/utilities/conversion.py:45 msgid "Length must be a positive number" msgstr "长度必须是正数" -#: utilities/conversion.py:47 +#: netbox/utilities/conversion.py:47 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr " '{length}' 为无效的长度(必须是数字)" -#: utilities/error_handlers.py:31 +#: netbox/utilities/error_handlers.py:31 #, python-brace-format msgid "" "Unable to delete {objects}. {count} dependent objects were " "found: " msgstr "无法删除{objects}。 找到了 {count} 个依赖对象:" -#: utilities/error_handlers.py:33 +#: netbox/utilities/error_handlers.py:33 msgid "More than 50" msgstr "超过50个" -#: utilities/fields.py:30 +#: netbox/utilities/fields.py:30 msgid "RGB color in hexadecimal. Example: " msgstr "以十六进制表示的 RGB 颜色。例如:" -#: utilities/fields.py:159 +#: netbox/utilities/fields.py:159 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " "in the format 'app.model'" msgstr "%s(%r)无效。CounterCacheField的to_model参数必须是格式为“app.model”的字符串" -#: utilities/fields.py:169 +#: netbox/utilities/fields.py:169 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " "in the format 'field'" msgstr "%s(%r)无效。CounterCacheField的to_field参数必须是格式为“field”的字符串" -#: utilities/forms/bulk_import.py:23 +#: netbox/utilities/forms/bulk_import.py:23 msgid "Enter object data in CSV, JSON or YAML format." msgstr "输入 CSV、JSON 或 YAML 格式的对象数据。" -#: utilities/forms/bulk_import.py:36 +#: netbox/utilities/forms/bulk_import.py:36 msgid "CSV delimiter" msgstr "CSV 分隔符" -#: utilities/forms/bulk_import.py:37 +#: netbox/utilities/forms/bulk_import.py:37 msgid "The character which delimits CSV fields. Applies only to CSV format." msgstr "分隔 CSV 字段的字符。 仅适用于 CSV 格式。" -#: utilities/forms/bulk_import.py:51 +#: netbox/utilities/forms/bulk_import.py:51 msgid "Form data must be empty when uploading/selecting a file." msgstr "上传/选择文件时,表单数据必须为空。" -#: utilities/forms/bulk_import.py:80 +#: netbox/utilities/forms/bulk_import.py:80 #, python-brace-format msgid "Unknown data format: {format}" msgstr "未知数据格式:{format}" -#: utilities/forms/bulk_import.py:100 +#: netbox/utilities/forms/bulk_import.py:100 msgid "Unable to detect data format. Please specify." msgstr "无法检测数据格式。 请手动指定。" -#: utilities/forms/bulk_import.py:123 +#: netbox/utilities/forms/bulk_import.py:123 msgid "Invalid CSV delimiter" msgstr "CSV 分隔符无效" -#: utilities/forms/bulk_import.py:167 +#: netbox/utilities/forms/bulk_import.py:167 msgid "" "Invalid YAML data. Data must be in the form of multiple documents, or a " "single document comprising a list of dictionaries." msgstr "YAML 数据无效。 数据必须采用多个文档的形式,或包含字典列表的单个文档。" -#: utilities/forms/fields/array.py:20 +#: netbox/utilities/forms/fields/array.py:20 #, python-brace-format msgid "" "Invalid list ({value}). Must be numeric and ranges must be in ascending " "order." msgstr "列表 ({value}) 无效。 必须是数字,并且范围必须按升序排列。" -#: utilities/forms/fields/array.py:40 +#: netbox/utilities/forms/fields/array.py:40 msgid "" "Specify one or more numeric ranges separated by commas. Example: " "1-5,20-30" msgstr "指定一个或多个用逗号分隔的数字范围。示例: 1-5,20-30" -#: utilities/forms/fields/array.py:47 +#: netbox/utilities/forms/fields/array.py:47 #, python-brace-format msgid "" "Invalid ranges ({value}). Must be a range of integers in ascending order." msgstr "范围无效 ({value})。必须是按升序排列的整数范围。" -#: utilities/forms/fields/csv.py:44 +#: netbox/utilities/forms/fields/csv.py:44 #, python-brace-format msgid "Invalid value for a multiple choice field: {value}" msgstr "多项选择字段的值无效:{value}" -#: utilities/forms/fields/csv.py:57 utilities/forms/fields/csv.py:78 +#: netbox/utilities/forms/fields/csv.py:57 +#: netbox/utilities/forms/fields/csv.py:78 #, python-format msgid "Object not found: %(value)s" msgstr "未找到对象:·%(value)s" -#: utilities/forms/fields/csv.py:65 +#: netbox/utilities/forms/fields/csv.py:65 #, python-brace-format msgid "" "\"{value}\" is not a unique value for this field; multiple objects were " "found" msgstr "\"{value}\" 不是此字段的唯一值;找到多个对象" -#: utilities/forms/fields/csv.py:69 +#: netbox/utilities/forms/fields/csv.py:69 #, python-brace-format msgid "\"{field_name}\" is an invalid accessor field name." msgstr "“{field_name}“是无效的访问器字段名称。" -#: utilities/forms/fields/csv.py:101 +#: netbox/utilities/forms/fields/csv.py:101 msgid "Object type must be specified as \".\"" msgstr "对象类型必须定义为\".\"" -#: utilities/forms/fields/csv.py:105 +#: netbox/utilities/forms/fields/csv.py:105 msgid "Invalid object type" msgstr "无效的对象类型" -#: utilities/forms/fields/expandable.py:25 +#: netbox/utilities/forms/fields/expandable.py:25 msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " "within a single range are not supported (example: " "[ge,xe]-0/0/[0-9])." msgstr "批量创建时支持字母数字范围。不支持在单个范围内混合字符和数字 (例如: [ge,xe]-0/0/[0-9])." -#: utilities/forms/fields/expandable.py:46 +#: netbox/utilities/forms/fields/expandable.py:46 msgid "" "Specify a numeric range to create multiple IPs.
    Example: " "192.0.2.[1,5,100-254]/24" msgstr "指定一个范围以创建多个IP。示例
    示例: 192.0.2.[1,5,100-254]/24" -#: utilities/forms/fields/fields.py:31 +#: netbox/utilities/forms/fields/fields.py:31 #, python-brace-format msgid "" "
    Markdown 语法" -#: utilities/forms/fields/fields.py:48 +#: netbox/utilities/forms/fields/fields.py:48 msgid "URL-friendly unique shorthand" msgstr "URL友好的唯一简写,是URL中最后一个反斜杠之后的部分" -#: utilities/forms/fields/fields.py:101 +#: netbox/utilities/forms/fields/fields.py:101 msgid "Enter context data in JSON format." msgstr "以JSON格式输入数据。" -#: utilities/forms/fields/fields.py:124 +#: netbox/utilities/forms/fields/fields.py:124 msgid "MAC address must be in EUI-48 format" msgstr "MAC 地址必须采用 EUI-48 格式" -#: utilities/forms/forms.py:52 +#: netbox/utilities/forms/forms.py:52 msgid "Use regular expressions" msgstr "使用正则表达式" -#: utilities/forms/forms.py:75 +#: netbox/utilities/forms/forms.py:75 msgid "" "Numeric ID of an existing object to update (if not creating a new object)" msgstr "要更新的现有对象的数字 ID(如果不创建新对象)" -#: utilities/forms/forms.py:92 +#: netbox/utilities/forms/forms.py:92 #, python-brace-format msgid "Unrecognized header: {name}" msgstr "无法识别的列头: {name}" -#: utilities/forms/forms.py:118 +#: netbox/utilities/forms/forms.py:118 msgid "Available Columns" msgstr "可用列" -#: utilities/forms/forms.py:126 +#: netbox/utilities/forms/forms.py:126 msgid "Selected Columns" msgstr "选定的列" -#: utilities/forms/mixins.py:44 +#: netbox/utilities/forms/mixins.py:44 msgid "" "This object has been modified since the form was rendered. Please consult " "the object's change log for details." msgstr "自呈现表单以来,该对象已被修改。 有关详细信息,请查阅对象的更改日志。" -#: utilities/forms/utils.py:42 utilities/forms/utils.py:68 -#: utilities/forms/utils.py:85 utilities/forms/utils.py:87 +#: netbox/utilities/forms/utils.py:42 netbox/utilities/forms/utils.py:68 +#: netbox/utilities/forms/utils.py:85 netbox/utilities/forms/utils.py:87 #, python-brace-format msgid "Range \"{value}\" is invalid." msgstr "范围 \"{value}\"无效。" -#: utilities/forms/utils.py:74 +#: netbox/utilities/forms/utils.py:74 #, python-brace-format msgid "" "Invalid range: Ending value ({end}) must be greater than beginning value " "({begin})." msgstr "无效的范围:结束值({end})必须大于开始值({begin})。" -#: utilities/forms/utils.py:232 +#: netbox/utilities/forms/utils.py:232 #, python-brace-format msgid "Duplicate or conflicting column header for \"{field}\"" msgstr "\"{field}\"的列标题重复或冲突" -#: utilities/forms/utils.py:238 +#: netbox/utilities/forms/utils.py:238 #, python-brace-format msgid "Duplicate or conflicting column header for \"{header}\"" msgstr "\"{header}\"的列标题重复或冲突" -#: utilities/forms/utils.py:247 +#: netbox/utilities/forms/utils.py:247 #, python-brace-format msgid "Row {row}: Expected {count_expected} columns but found {count_found}" msgstr "第{row}行: 应该有{count_expected}列,但是发现了{count_found}列" -#: utilities/forms/utils.py:270 +#: netbox/utilities/forms/utils.py:270 #, python-brace-format msgid "Unexpected column header \"{field}\" found." msgstr "发现错误的列头\"{field}\"。" -#: utilities/forms/utils.py:272 +#: netbox/utilities/forms/utils.py:272 #, python-brace-format msgid "Column \"{field}\" is not a related object; cannot use dots" msgstr "字段\"{field}\"未与对象关联;不能使用“.”" -#: utilities/forms/utils.py:276 +#: netbox/utilities/forms/utils.py:276 #, python-brace-format msgid "Invalid related object attribute for column \"{field}\": {to_field}" msgstr "对象的属性关联无效 \"{field}\": {to_field}" -#: utilities/forms/utils.py:284 +#: netbox/utilities/forms/utils.py:284 #, python-brace-format msgid "Required column header \"{header}\" not found." msgstr "找不到必需的列标题\"{header}\"。" -#: utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:124 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "缺少动态查询参数:'{dynamic_params}'" -#: utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:141 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "缺少静态查询参数:'{static_params}'" -#: utilities/password_validation.py:13 +#: netbox/utilities/password_validation.py:13 msgid "Password must have at least one numeral." msgstr "密码必须至少包含一个数字。" -#: utilities/password_validation.py:18 +#: netbox/utilities/password_validation.py:18 msgid "Password must have at least one uppercase letter." msgstr "密码必须至少包含一个大写字母。" -#: utilities/password_validation.py:23 +#: netbox/utilities/password_validation.py:23 msgid "Password must have at least one lowercase letter." msgstr "密码必须至少包含一个小写字母。" -#: utilities/password_validation.py:27 +#: netbox/utilities/password_validation.py:27 msgid "" "Your password must contain at least one numeral, one uppercase letter and " "one lowercase letter." msgstr "您的密码必须包含至少一个数字、一个大写字母和一个小写字母。" -#: utilities/permissions.py:42 +#: netbox/utilities/permissions.py:42 #, python-brace-format msgid "" "Invalid permission name: {name}. Must be in the format " "._" msgstr "无效的权限名称: {name}. 格式必须是 ._" -#: utilities/permissions.py:60 +#: netbox/utilities/permissions.py:60 #, python-brace-format msgid "Unknown app_label/model_name for {name}" msgstr "未知的app_label/model_name: {name}" -#: utilities/request.py:76 +#: netbox/utilities/request.py:76 #, python-brace-format msgid "Invalid IP address set for {header}: {ip}" msgstr "为 {header} 设置的 IP 地址无效:{ip}" -#: utilities/tables.py:47 +#: netbox/utilities/tables.py:47 #, python-brace-format msgid "A column named {name} is already defined for table {table_name}" msgstr "名为{name}的列已在表{table_name}中定义了" -#: utilities/templates/builtins/customfield_value.html:30 +#: netbox/utilities/templates/builtins/customfield_value.html:30 msgid "Not defined" msgstr "未定义" -#: utilities/templates/buttons/bookmark.html:9 +#: netbox/utilities/templates/buttons/bookmark.html:9 msgid "Unbookmark" msgstr "取消书签" -#: utilities/templates/buttons/bookmark.html:13 +#: netbox/utilities/templates/buttons/bookmark.html:13 msgid "Bookmark" msgstr "书签" -#: utilities/templates/buttons/clone.html:4 +#: netbox/utilities/templates/buttons/clone.html:4 msgid "Clone" msgstr "克隆" -#: utilities/templates/buttons/export.html:7 +#: netbox/utilities/templates/buttons/export.html:7 msgid "Current View" msgstr "当前显示" -#: utilities/templates/buttons/export.html:8 +#: netbox/utilities/templates/buttons/export.html:8 msgid "All Data" msgstr "所有数据" -#: utilities/templates/buttons/export.html:28 +#: netbox/utilities/templates/buttons/export.html:28 msgid "Add export template" msgstr "添加导出模版" -#: utilities/templates/buttons/import.html:4 +#: netbox/utilities/templates/buttons/import.html:4 msgid "Import" msgstr "导入" -#: utilities/templates/buttons/subscribe.html:10 +#: netbox/utilities/templates/buttons/subscribe.html:10 msgid "Unsubscribe" msgstr "取消订阅" -#: utilities/templates/buttons/subscribe.html:14 +#: netbox/utilities/templates/buttons/subscribe.html:14 msgid "Subscribe" msgstr "订阅" -#: utilities/templates/form_helpers/render_field.html:41 +#: netbox/utilities/templates/form_helpers/render_field.html:41 msgid "Copy to clipboard" msgstr "复制到剪贴板" -#: utilities/templates/form_helpers/render_field.html:57 +#: netbox/utilities/templates/form_helpers/render_field.html:57 msgid "This field is required" msgstr "此字段必填" -#: utilities/templates/form_helpers/render_field.html:70 +#: netbox/utilities/templates/form_helpers/render_field.html:70 msgid "Set Null" msgstr "设置为空" -#: utilities/templates/helpers/applied_filters.html:11 +#: netbox/utilities/templates/helpers/applied_filters.html:11 msgid "Clear all" msgstr "清除所有内容" -#: utilities/templates/helpers/table_config_form.html:8 +#: netbox/utilities/templates/helpers/table_config_form.html:8 msgid "Table Configuration" msgstr "表单配置" -#: utilities/templates/helpers/table_config_form.html:31 +#: netbox/utilities/templates/helpers/table_config_form.html:31 msgid "Move Up" msgstr "上移" -#: utilities/templates/helpers/table_config_form.html:34 +#: netbox/utilities/templates/helpers/table_config_form.html:34 msgid "Move Down" msgstr "下移" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search…" msgstr "搜索…" -#: utilities/templates/navigation/menu.html:14 +#: netbox/utilities/templates/navigation/menu.html:14 msgid "Search NetBox" msgstr "搜索 NetBox" -#: utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:7 msgid "Open selector" msgstr "打开选择框" -#: utilities/templates/widgets/markdown_input.html:6 +#: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "编写" -#: utilities/testing/views.py:632 +#: netbox/utilities/testing/views.py:632 msgid "The test must define csv_update_data." msgstr "测试必须定义csv_update_data。" -#: utilities/validators.py:65 +#: netbox/utilities/validators.py:65 #, python-brace-format msgid "{value} is not a valid regular expression." msgstr "{value} 不是有效的正则表达式。" -#: utilities/views.py:57 +#: netbox/utilities/views.py:57 #, python-brace-format msgid "{self.__class__.__name__} must implement get_required_permission()" msgstr "{self.__class__.__name__}必须实现get_required_permission()方法" -#: utilities/views.py:93 +#: netbox/utilities/views.py:93 #, python-brace-format msgid "{class_name} must implement get_required_permission()" msgstr "{class_name}必须实现get_required_permission()方法" -#: utilities/views.py:117 +#: netbox/utilities/views.py:117 #, python-brace-format msgid "" "{class_name} has no queryset defined. ObjectPermissionRequiredMixin may only" " be used on views which define a base queryset" msgstr "{class_name} 没有定义查询集。ObjectPermissionRequiredMixin 只能在定义了基本查询集的视图中使用" -#: virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:79 msgid "Parent group (ID)" msgstr "父组(ID)" -#: virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:85 msgid "Parent group (slug)" msgstr "父组(缩写)" -#: virtualization/filtersets.py:89 virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:89 +#: netbox/virtualization/filtersets.py:141 msgid "Cluster type (ID)" msgstr "集群类型(ID)" -#: virtualization/filtersets.py:151 virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:151 +#: netbox/virtualization/filtersets.py:271 msgid "Cluster (ID)" msgstr "集群 (ID)" -#: virtualization/forms/bulk_edit.py:166 -#: virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:166 +#: netbox/virtualization/models/virtualmachines.py:115 msgid "vCPUs" msgstr "vCPUs" -#: virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:170 msgid "Memory (MB)" msgstr "内存 (MB)" -#: virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" msgstr "" -#: virtualization/forms/bulk_edit.py:334 -#: virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:334 +#: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" msgstr "" -#: virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" msgstr "集群类型" -#: virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:51 msgid "Assigned cluster group" msgstr "指定集群组" -#: virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:96 msgid "Assigned cluster" msgstr "指定集群" -#: virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:103 msgid "Assigned device within cluster" msgstr "指定集群内部设备" -#: virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:183 msgid "Serial number" msgstr "序列号" -#: virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:153 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " "({cluster_site})" msgstr "{device} 属于与集群({cluster_site})不同的站点({device_site})" -#: virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:192 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "可将此虚拟机固定到集群中的特定主机设备" -#: virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:221 msgid "Site/Cluster" msgstr "站点/集群" -#: virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:244 msgid "Disk size is managed via the attachment of virtual disks." msgstr "通过附加虚拟磁盘来管理磁盘大小。" -#: virtualization/forms/model_forms.py:372 -#: virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/tables/virtualmachines.py:111 msgid "Disk" msgstr "硬盘" -#: virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:25 msgid "cluster type" msgstr "集群类型" -#: virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster types" msgstr "集群类型" -#: virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:45 msgid "cluster group" msgstr "集群组" -#: virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:46 msgid "cluster groups" msgstr "集群组" -#: virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:121 msgid "cluster" msgstr "集群" -#: virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:122 msgid "clusters" msgstr "集群组" -#: virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:141 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " "{site}" msgstr "{count} 个设备被分配为此集群的主机,但不在站点{site}" -#: virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "memory (MB)" msgstr "内存 (MB)" -#: virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:128 msgid "disk (MB)" msgstr "磁盘 (MB)" -#: virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:166 msgid "Virtual machine name must be unique per cluster." msgstr "集群中的虚拟机名称必须唯一。" -#: virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:169 msgid "virtual machine" msgstr "虚拟机" -#: virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:170 msgid "virtual machines" msgstr "虚拟机" -#: virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:184 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "虚拟机必须分配给站点和/或集群。" -#: virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:191 #, python-brace-format msgid "" "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "所选集群({cluster}) 未分配给此站点 ({site})。" -#: virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:198 msgid "Must specify a cluster when assigning a host device." msgstr "分配主机设备时必须指定集群。" -#: virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:203 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "所选设备 ({device})未分配给此集群({cluster})。" -#: virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:215 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " "virtual disks ({total_size})." msgstr "指定的磁盘大小 ({size}) 必须与分配的虚拟磁盘的总大小相匹配 ({total_size})." -#: virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:229 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "必须是 IPv{family} 地址。 ({ip} 是 IPv{version} 地址。)" -#: virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:238 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "指定的IP地址 ({ip}) 未分配给该虚拟机。" -#: virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:396 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "所选父接口 ({parent}) 属于另一个虚拟机 ({virtual_machine})" -#: virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:411 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "所选桥接接口 ({bridge})属于另一个虚拟机({virtual_machine})。" -#: virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:422 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent virtual machine, or it must be global." msgstr "未标记 VLAN ({untagged_vlan}) 必须与接口的父虚拟机属于同一站点,或者必须是全局的。" -#: virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:434 msgid "size (MB)" msgstr "大小 (MB)" -#: virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:438 msgid "virtual disk" msgstr "虚拟磁盘" -#: virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:439 msgid "virtual disks" msgstr "虚拟磁盘" -#: virtualization/views.py:275 +#: netbox/virtualization/views.py:273 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "已添加 {count} 要集群的设备 {cluster}" -#: virtualization/views.py:310 +#: netbox/virtualization/views.py:308 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "已移除 {count} 来自集群的设备 {cluster}" -#: vpn/choices.py:31 +#: netbox/vpn/choices.py:35 msgid "IPsec - Transport" msgstr "IPsec-传输模式" -#: vpn/choices.py:32 +#: netbox/vpn/choices.py:36 msgid "IPsec - Tunnel" msgstr "IPsec - Tunnel" -#: vpn/choices.py:33 +#: netbox/vpn/choices.py:37 msgid "IP-in-IP" msgstr "IP-in-IP" -#: vpn/choices.py:34 +#: netbox/vpn/choices.py:38 msgid "GRE" msgstr "GRE" -#: vpn/choices.py:56 +#: netbox/vpn/choices.py:39 +msgid "WireGuard" +msgstr "" + +#: netbox/vpn/choices.py:40 +msgid "OpenVPN" +msgstr "" + +#: netbox/vpn/choices.py:41 +msgid "L2TP" +msgstr "" + +#: netbox/vpn/choices.py:42 +msgid "PPTP" +msgstr "" + +#: netbox/vpn/choices.py:64 msgid "Hub" msgstr "中心节点" -#: vpn/choices.py:57 +#: netbox/vpn/choices.py:65 msgid "Spoke" msgstr "分支节点" -#: vpn/choices.py:80 +#: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "野蛮模式" -#: vpn/choices.py:81 +#: netbox/vpn/choices.py:89 msgid "Main" msgstr "主模式" -#: vpn/choices.py:92 +#: netbox/vpn/choices.py:100 msgid "Pre-shared keys" msgstr "预共享密钥" -#: vpn/choices.py:93 +#: netbox/vpn/choices.py:101 msgid "Certificates" msgstr "证书" -#: vpn/choices.py:94 +#: netbox/vpn/choices.py:102 msgid "RSA signatures" msgstr "RSA 签名" -#: vpn/choices.py:95 +#: netbox/vpn/choices.py:103 msgid "DSA signatures" msgstr "DSA 签名" -#: vpn/choices.py:178 vpn/choices.py:179 vpn/choices.py:180 vpn/choices.py:181 -#: vpn/choices.py:182 vpn/choices.py:183 vpn/choices.py:184 vpn/choices.py:185 -#: vpn/choices.py:186 vpn/choices.py:187 vpn/choices.py:188 vpn/choices.py:189 -#: vpn/choices.py:190 vpn/choices.py:191 vpn/choices.py:192 vpn/choices.py:193 -#: vpn/choices.py:194 vpn/choices.py:195 vpn/choices.py:196 vpn/choices.py:197 -#: vpn/choices.py:198 vpn/choices.py:199 vpn/choices.py:200 vpn/choices.py:201 +#: netbox/vpn/choices.py:186 netbox/vpn/choices.py:187 +#: netbox/vpn/choices.py:188 netbox/vpn/choices.py:189 +#: netbox/vpn/choices.py:190 netbox/vpn/choices.py:191 +#: netbox/vpn/choices.py:192 netbox/vpn/choices.py:193 +#: netbox/vpn/choices.py:194 netbox/vpn/choices.py:195 +#: netbox/vpn/choices.py:196 netbox/vpn/choices.py:197 +#: netbox/vpn/choices.py:198 netbox/vpn/choices.py:199 +#: netbox/vpn/choices.py:200 netbox/vpn/choices.py:201 +#: netbox/vpn/choices.py:202 netbox/vpn/choices.py:203 +#: netbox/vpn/choices.py:204 netbox/vpn/choices.py:205 +#: netbox/vpn/choices.py:206 netbox/vpn/choices.py:207 +#: netbox/vpn/choices.py:208 netbox/vpn/choices.py:209 #, python-brace-format msgid "Group {n}" msgstr "Group {n}" -#: vpn/choices.py:243 +#: netbox/vpn/choices.py:251 msgid "Ethernet Private LAN" msgstr "Ethernet Private LAN" -#: vpn/choices.py:244 +#: netbox/vpn/choices.py:252 msgid "Ethernet Virtual Private LAN" msgstr "Ethernet Virtual Private LAN" -#: vpn/choices.py:247 +#: netbox/vpn/choices.py:255 msgid "Ethernet Private Tree" msgstr "Ethernet Private Tree" -#: vpn/choices.py:248 +#: netbox/vpn/choices.py:256 msgid "Ethernet Virtual Private Tree" msgstr "Ethernet Virtual Private Tree" -#: vpn/filtersets.py:41 +#: netbox/vpn/filtersets.py:41 msgid "Tunnel group (ID)" msgstr "隧道组(ID)" -#: vpn/filtersets.py:47 +#: netbox/vpn/filtersets.py:47 msgid "Tunnel group (slug)" msgstr "隧道组(缩写)" -#: vpn/filtersets.py:54 +#: netbox/vpn/filtersets.py:54 msgid "IPSec profile (ID)" msgstr "IPSec 通道(ID)" -#: vpn/filtersets.py:60 +#: netbox/vpn/filtersets.py:60 msgid "IPSec profile (name)" msgstr "IPSec 通道(名称)" -#: vpn/filtersets.py:81 +#: netbox/vpn/filtersets.py:81 msgid "Tunnel (ID)" msgstr "隧道 (ID)" -#: vpn/filtersets.py:87 +#: netbox/vpn/filtersets.py:87 msgid "Tunnel (name)" msgstr "隧道(名称)" -#: vpn/filtersets.py:118 +#: netbox/vpn/filtersets.py:118 msgid "Outside IP (ID)" msgstr "外部 IP (ID)" -#: vpn/filtersets.py:130 vpn/filtersets.py:263 +#: netbox/vpn/filtersets.py:130 netbox/vpn/filtersets.py:263 msgid "IKE policy (ID)" msgstr "IKE 策略 (ID)" -#: vpn/filtersets.py:136 vpn/filtersets.py:269 +#: netbox/vpn/filtersets.py:136 netbox/vpn/filtersets.py:269 msgid "IKE policy (name)" msgstr "IKE 策略(名称)" -#: vpn/filtersets.py:200 vpn/filtersets.py:273 +#: netbox/vpn/filtersets.py:200 netbox/vpn/filtersets.py:273 msgid "IPSec policy (ID)" msgstr "IPsec 策略 (ID)" -#: vpn/filtersets.py:206 vpn/filtersets.py:279 +#: netbox/vpn/filtersets.py:206 netbox/vpn/filtersets.py:279 msgid "IPSec policy (name)" msgstr "IPsec 策略(名称)" -#: vpn/filtersets.py:348 +#: netbox/vpn/filtersets.py:348 msgid "L2VPN (slug)" msgstr "L2VPN(缩写)" -#: vpn/filtersets.py:412 +#: netbox/vpn/filtersets.py:412 msgid "VM Interface (ID)" msgstr "虚拟接口 (ID)" -#: vpn/filtersets.py:418 +#: netbox/vpn/filtersets.py:418 msgid "VLAN (name)" msgstr "VLAN(名称)" -#: vpn/forms/bulk_edit.py:45 vpn/forms/bulk_import.py:42 -#: vpn/forms/filtersets.py:54 +#: netbox/vpn/forms/bulk_edit.py:45 netbox/vpn/forms/bulk_import.py:42 +#: netbox/vpn/forms/filtersets.py:54 msgid "Tunnel group" msgstr "隧道组" -#: vpn/forms/bulk_edit.py:117 vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 msgid "SA lifetime" msgstr "SA生存期" -#: vpn/forms/bulk_edit.py:151 wireless/forms/bulk_edit.py:79 -#: wireless/forms/bulk_edit.py:126 wireless/forms/filtersets.py:64 -#: wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 +#: netbox/wireless/forms/bulk_edit.py:126 +#: netbox/wireless/forms/filtersets.py:64 +#: netbox/wireless/forms/filtersets.py:98 msgid "Pre-shared key" msgstr "预共享密钥" -#: vpn/forms/bulk_edit.py:237 vpn/forms/bulk_import.py:239 -#: vpn/forms/filtersets.py:199 vpn/forms/model_forms.py:370 -#: vpn/models/crypto.py:104 +#: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "IKE 策略" -#: vpn/forms/bulk_edit.py:242 vpn/forms/bulk_import.py:244 -#: vpn/forms/filtersets.py:204 vpn/forms/model_forms.py:374 -#: vpn/models/crypto.py:209 +#: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 +#: netbox/vpn/models/crypto.py:209 msgid "IPSec policy" msgstr "IPSec 策略" -#: vpn/forms/bulk_import.py:50 +#: netbox/vpn/forms/bulk_import.py:50 msgid "Tunnel encapsulation" msgstr "隧道封装" -#: vpn/forms/bulk_import.py:83 +#: netbox/vpn/forms/bulk_import.py:83 msgid "Operational role" msgstr "操作角色" -#: vpn/forms/bulk_import.py:90 +#: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "指定接口的父设备" -#: vpn/forms/bulk_import.py:97 +#: netbox/vpn/forms/bulk_import.py:97 msgid "Parent VM of assigned interface" msgstr "指定接口的父虚拟机" -#: vpn/forms/bulk_import.py:104 +#: netbox/vpn/forms/bulk_import.py:104 msgid "Device or virtual machine interface" msgstr "设备/虚拟机接口" -#: vpn/forms/bulk_import.py:183 +#: netbox/vpn/forms/bulk_import.py:183 msgid "IKE proposal(s)" msgstr "IKE安全提议" -#: vpn/forms/bulk_import.py:215 vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "DH组" -#: vpn/forms/bulk_import.py:222 +#: netbox/vpn/forms/bulk_import.py:222 msgid "IPSec proposal(s)" msgstr "IPSEC安全提议" -#: vpn/forms/bulk_import.py:236 +#: netbox/vpn/forms/bulk_import.py:236 msgid "IPSec protocol" msgstr "IPSEC 协议" -#: vpn/forms/bulk_import.py:266 +#: netbox/vpn/forms/bulk_import.py:266 msgid "L2VPN type" msgstr "L2VPN 类型" -#: vpn/forms/bulk_import.py:287 +#: netbox/vpn/forms/bulk_import.py:287 msgid "Parent device (for interface)" msgstr "父设备(用于接口)" -#: vpn/forms/bulk_import.py:294 +#: netbox/vpn/forms/bulk_import.py:294 msgid "Parent virtual machine (for interface)" msgstr "父虚拟机(用于接口)" -#: vpn/forms/bulk_import.py:301 +#: netbox/vpn/forms/bulk_import.py:301 msgid "Assigned interface (device or VM)" msgstr "指定接口(设备/虚拟机)" -#: vpn/forms/bulk_import.py:334 +#: netbox/vpn/forms/bulk_import.py:334 msgid "Cannot import device and VM interface terminations simultaneously." msgstr "不能导入设备和虚拟机接口连接。" -#: vpn/forms/bulk_import.py:336 +#: netbox/vpn/forms/bulk_import.py:336 msgid "Each termination must specify either an interface or a VLAN." msgstr "每个接入点必须指定一个接口或一个 VLAN。" -#: vpn/forms/bulk_import.py:338 +#: netbox/vpn/forms/bulk_import.py:338 msgid "Cannot assign both an interface and a VLAN." msgstr "不能同时分配接口和VLAN。" -#: vpn/forms/filtersets.py:130 +#: netbox/vpn/forms/filtersets.py:130 msgid "IKE version" msgstr "IKE 版本" -#: vpn/forms/filtersets.py:142 vpn/forms/filtersets.py:175 -#: vpn/forms/model_forms.py:298 vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 +#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 msgid "Proposal" msgstr "安全提议" -#: vpn/forms/filtersets.py:251 +#: netbox/vpn/forms/filtersets.py:251 msgid "Assigned Object Type" msgstr "指定的对象类型" -#: vpn/forms/model_forms.py:95 vpn/forms/model_forms.py:130 -#: vpn/forms/model_forms.py:240 vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 +#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "隧道接口" -#: vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:150 msgid "First Termination" msgstr "第一端" -#: vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:153 msgid "Second Termination" msgstr "第二端" -#: vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:197 msgid "This parameter is required when defining a termination." msgstr "定义端点时需要此参数。" -#: vpn/forms/model_forms.py:320 vpn/forms/model_forms.py:356 +#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 msgid "Policy" msgstr "策略" -#: vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:487 msgid "A termination must specify an interface or VLAN." msgstr "接入点必须指定接口或 VLAN。" -#: vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:489 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "一个终端只能有一个终端对象(接口或VLAN)。" -#: vpn/models/crypto.py:33 +#: netbox/vpn/models/crypto.py:33 msgid "encryption algorithm" msgstr "加密算法" -#: vpn/models/crypto.py:37 +#: netbox/vpn/models/crypto.py:37 msgid "authentication algorithm" msgstr "认证算法" -#: vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:44 msgid "Diffie-Hellman group ID" msgstr "DH组" -#: vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:50 msgid "Security association lifetime (in seconds)" msgstr "SA生存期(秒)" -#: vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:59 msgid "IKE proposal" msgstr "IKE proposal" -#: vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposals" msgstr "IKE proposals" -#: vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:76 msgid "version" msgstr "版本" -#: vpn/models/crypto.py:88 vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 msgid "proposals" msgstr "proposals" -#: vpn/models/crypto.py:91 wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 msgid "pre-shared key" msgstr "pre-shared key" -#: vpn/models/crypto.py:105 +#: netbox/vpn/models/crypto.py:105 msgid "IKE policies" msgstr "IKE policies" -#: vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:118 msgid "Mode is required for selected IKE version" msgstr "所选IKE版本需要配置模式" -#: vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:122 msgid "Mode cannot be used for selected IKE version" msgstr "该模式不能用于所选的IKE版本" -#: vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:136 msgid "encryption" msgstr "加密算法" -#: vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:141 msgid "authentication" msgstr "认证" -#: vpn/models/crypto.py:149 +#: netbox/vpn/models/crypto.py:149 msgid "Security association lifetime (seconds)" msgstr "SA生存期(秒)" -#: vpn/models/crypto.py:155 +#: netbox/vpn/models/crypto.py:155 msgid "Security association lifetime (in kilobytes)" msgstr "SA生存大小(KB)" -#: vpn/models/crypto.py:164 +#: netbox/vpn/models/crypto.py:164 msgid "IPSec proposal" msgstr "IPSec proposal" -#: vpn/models/crypto.py:165 +#: netbox/vpn/models/crypto.py:165 msgid "IPSec proposals" msgstr "IPSec proposals" -#: vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:178 msgid "Encryption and/or authentication algorithm must be defined" msgstr "必须定义加密和身份验证算法" -#: vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:210 msgid "IPSec policies" msgstr "IPSec policies" -#: vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:251 msgid "IPSec profiles" msgstr "IPSec profiles" -#: vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:116 msgid "L2VPN termination" msgstr "L2VPN 终点" -#: vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:117 msgid "L2VPN terminations" msgstr "L2VPN 终点" -#: vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:135 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "L2VPN终端已分配({assigned_object})" -#: vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:147 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " "{terminations_count} already defined." msgstr "{l2vpn_type}L2VPN不能有两个以上的端点;已找到{terminations_count}个端点。" -#: vpn/models/tunnels.py:26 +#: netbox/vpn/models/tunnels.py:26 msgid "tunnel group" msgstr "隧道组" -#: vpn/models/tunnels.py:27 +#: netbox/vpn/models/tunnels.py:27 msgid "tunnel groups" msgstr "隧道组" -#: vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:53 msgid "encapsulation" msgstr "封装" -#: vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:72 msgid "tunnel ID" msgstr "隧道 ID" -#: vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:94 msgid "tunnel" msgstr "隧道" -#: vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:95 msgid "tunnels" msgstr "隧道" -#: vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:153 msgid "An object may be terminated to only one tunnel at a time." msgstr "一个对象一次只能被终止到一个隧道。" -#: vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:156 msgid "tunnel termination" msgstr "隧道终点" -#: vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:157 msgid "tunnel terminations" msgstr "隧道终点" -#: vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:174 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "{name}已附加到隧道({tunnel})。" -#: vpn/tables/crypto.py:22 +#: netbox/vpn/tables/crypto.py:22 msgid "Authentication Method" msgstr "认证方式" -#: vpn/tables/crypto.py:25 vpn/tables/crypto.py:97 +#: netbox/vpn/tables/crypto.py:25 netbox/vpn/tables/crypto.py:97 msgid "Encryption Algorithm" msgstr "加密算法" -#: vpn/tables/crypto.py:28 vpn/tables/crypto.py:100 +#: netbox/vpn/tables/crypto.py:28 netbox/vpn/tables/crypto.py:100 msgid "Authentication Algorithm" msgstr "认证算法" -#: vpn/tables/crypto.py:34 +#: netbox/vpn/tables/crypto.py:34 msgid "SA Lifetime" msgstr "SA生存期" -#: vpn/tables/crypto.py:71 +#: netbox/vpn/tables/crypto.py:71 msgid "Pre-shared Key" msgstr "预共享密钥" -#: vpn/tables/crypto.py:103 +#: netbox/vpn/tables/crypto.py:103 msgid "SA Lifetime (Seconds)" msgstr "SA生存期(秒)" -#: vpn/tables/crypto.py:106 +#: netbox/vpn/tables/crypto.py:106 msgid "SA Lifetime (KB)" msgstr "SA生存大小(KB)" -#: vpn/tables/l2vpn.py:69 +#: netbox/vpn/tables/l2vpn.py:69 msgid "Object Parent" msgstr "目标上级" -#: vpn/tables/l2vpn.py:74 +#: netbox/vpn/tables/l2vpn.py:74 msgid "Object Site" msgstr "目的站点" -#: wireless/choices.py:11 +#: netbox/wireless/choices.py:11 msgid "Access point" msgstr "AP" -#: wireless/choices.py:12 +#: netbox/wireless/choices.py:12 msgid "Station" msgstr "基站" -#: wireless/choices.py:467 +#: netbox/wireless/choices.py:467 msgid "Open" msgstr "开放" -#: wireless/choices.py:469 +#: netbox/wireless/choices.py:469 msgid "WPA Personal (PSK)" msgstr "WPA Personal (PSK)" -#: wireless/choices.py:470 +#: netbox/wireless/choices.py:470 msgid "WPA Enterprise" msgstr "WPA Enterprise" -#: wireless/forms/bulk_edit.py:73 wireless/forms/bulk_edit.py:120 -#: wireless/forms/bulk_import.py:68 wireless/forms/bulk_import.py:71 -#: wireless/forms/bulk_import.py:110 wireless/forms/bulk_import.py:113 -#: wireless/forms/filtersets.py:59 wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:73 +#: netbox/wireless/forms/bulk_edit.py:120 +#: netbox/wireless/forms/bulk_import.py:68 +#: netbox/wireless/forms/bulk_import.py:71 +#: netbox/wireless/forms/bulk_import.py:110 +#: netbox/wireless/forms/bulk_import.py:113 +#: netbox/wireless/forms/filtersets.py:59 +#: netbox/wireless/forms/filtersets.py:93 msgid "Authentication cipher" msgstr "认证密码" -#: wireless/forms/bulk_edit.py:134 wireless/forms/bulk_import.py:116 -#: wireless/forms/bulk_import.py:119 wireless/forms/filtersets.py:106 +#: netbox/wireless/forms/bulk_edit.py:134 +#: netbox/wireless/forms/bulk_import.py:116 +#: netbox/wireless/forms/bulk_import.py:119 +#: netbox/wireless/forms/filtersets.py:106 msgid "Distance unit" msgstr "距离单位" -#: wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:52 msgid "Bridged VLAN" msgstr "桥接 VLAN" -#: wireless/forms/bulk_import.py:89 wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/tables/wirelesslink.py:28 msgid "Interface A" msgstr "网络接口A" -#: wireless/forms/bulk_import.py:93 wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:93 +#: netbox/wireless/tables/wirelesslink.py:37 msgid "Interface B" msgstr "网络接口B" -#: wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:161 msgid "Side B" msgstr "B端" -#: wireless/models.py:31 +#: netbox/wireless/models.py:31 msgid "authentication cipher" msgstr "认证密码" -#: wireless/models.py:69 +#: netbox/wireless/models.py:69 msgid "wireless LAN group" msgstr "无线局域网组" -#: wireless/models.py:70 +#: netbox/wireless/models.py:70 msgid "wireless LAN groups" msgstr "无线局域网组" -#: wireless/models.py:116 +#: netbox/wireless/models.py:116 msgid "wireless LAN" msgstr "无线局域网" -#: wireless/models.py:144 +#: netbox/wireless/models.py:144 msgid "interface A" msgstr "接口 A" -#: wireless/models.py:151 +#: netbox/wireless/models.py:151 msgid "interface B" msgstr "接口 B" -#: wireless/models.py:165 +#: netbox/wireless/models.py:165 msgid "distance" msgstr "距离" -#: wireless/models.py:172 +#: netbox/wireless/models.py:172 msgid "distance unit" msgstr "距离单位" -#: wireless/models.py:219 +#: netbox/wireless/models.py:219 msgid "wireless link" msgstr "无线连接" -#: wireless/models.py:220 +#: netbox/wireless/models.py:220 msgid "wireless links" msgstr "无线连接" -#: wireless/models.py:236 +#: netbox/wireless/models.py:236 msgid "Must specify a unit when setting a wireless distance" msgstr "设置无线距离时必须指定单位" -#: wireless/models.py:242 wireless/models.py:248 +#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "{type} 不是无线接口。" -#: wireless/utils.py:16 +#: netbox/wireless/utils.py:16 #, python-brace-format msgid "Invalid channel value: {channel}" msgstr "通道值无效: {channel}" -#: wireless/utils.py:26 +#: netbox/wireless/utils.py:26 #, python-brace-format msgid "Invalid channel attribute: {name}" msgstr "通道属性无效: {name}" diff --git a/requirements.txt b/requirements.txt index 1af19d2c5..fb2a81dfa 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==5.0.9 +Django==5.0.10 django-cors-headers==4.6.0 django-debug-toolbar==4.4.6 django-filter==24.3 @@ -14,16 +14,16 @@ django-taggit==6.1.0 django-tables2==2.7.0 django-timezone-field==7.0 djangorestframework==3.15.2 -drf-spectacular==0.27.2 -drf-spectacular-sidecar==2024.11.1 +drf-spectacular==0.28.0 +drf-spectacular-sidecar==2024.12.1 feedparser==6.0.11 gunicorn==23.0.0 Jinja2==3.1.4 Markdown==3.7 -mkdocs-material==9.5.45 +mkdocs-material==9.5.48 mkdocstrings[python-legacy]==0.27.0 netaddr==1.3.0 -nh3==0.2.18 +nh3==0.2.19 Pillow==11.0.0 psycopg[c,pool]==3.2.3 PyYAML==6.0.2 @@ -31,8 +31,8 @@ requests==2.32.3 rq==2.0 social-auth-app-django==5.4.2 social-auth-core==4.5.4 -strawberry-graphql==0.251.0 -strawberry-graphql-django==0.50.0 +strawberry-graphql==0.253.1 +strawberry-graphql-django==0.51.0 svgwrite==1.4.3 tablib==3.7.0 tzdata==2024.2 From 8951aa815fe49922b3be5f6f87f82c495aef4b04 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 13 Dec 2024 05:02:21 +0000 Subject: [PATCH 098/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 126 +++++++++---------- 1 file changed, 63 insertions(+), 63 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 9bb609694..5f49057fb 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-12 05:02+0000\n" +"POT-Creation-Date: 2024-12-13 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -145,7 +145,7 @@ msgstr "" #: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 #: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 #: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 -#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/ipam/filtersets.py:341 netbox/ipam/filtersets.py:961 #: netbox/virtualization/filtersets.py:45 #: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" @@ -157,8 +157,8 @@ msgstr "" #: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 #: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 #: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 -#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 -#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:348 +#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52 #: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "" @@ -168,8 +168,8 @@ msgstr "" #: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 #: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 #: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 -#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 -#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:354 +#: netbox/ipam/filtersets.py:974 netbox/virtualization/filtersets.py:58 #: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "" @@ -180,7 +180,7 @@ msgstr "" #: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 #: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 #: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 -#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/ipam/filtersets.py:361 netbox/ipam/filtersets.py:981 #: netbox/virtualization/filtersets.py:65 #: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" @@ -250,8 +250,8 @@ msgstr "" #: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 #: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 #: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 -#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 -#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:240 +#: netbox/ipam/filtersets.py:371 netbox/ipam/filtersets.py:991 #: netbox/virtualization/filtersets.py:75 #: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" @@ -270,13 +270,13 @@ msgstr "" #: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 #: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 -#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:245 msgid "Provider (ID)" msgstr "" #: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 #: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 -#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:251 msgid "Provider (slug)" msgstr "" @@ -305,8 +305,8 @@ msgstr "" #: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 #: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 #: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 -#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 -#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/ipam/filtersets.py:234 netbox/ipam/filtersets.py:365 +#: netbox/ipam/filtersets.py:985 netbox/virtualization/filtersets.py:69 #: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "" @@ -1081,7 +1081,7 @@ msgstr "" #: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 #: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 #: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 -#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/filtersets.py:1001 netbox/ipam/forms/bulk_edit.py:493 #: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 #: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 #: netbox/ipam/tables/vlans.py:226 @@ -2891,7 +2891,7 @@ msgid "Parent site group (slug)" msgstr "" #: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 -#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 +#: netbox/ipam/filtersets.py:843 netbox/ipam/filtersets.py:995 msgid "Group (ID)" msgstr "" @@ -2949,15 +2949,15 @@ msgstr "" #: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 #: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 -#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 -#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 +#: netbox/ipam/filtersets.py:383 netbox/ipam/filtersets.py:495 +#: netbox/ipam/filtersets.py:1005 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "" #: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 #: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 -#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 -#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:389 +#: netbox/ipam/filtersets.py:501 netbox/ipam/filtersets.py:1011 #: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "" @@ -3155,7 +3155,7 @@ msgstr "" msgid "Device model" msgstr "" -#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:634 #: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "" @@ -3169,8 +3169,8 @@ msgid "Module bay (ID)" msgstr "" #: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 -#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 -#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/ipam/filtersets.py:613 netbox/ipam/filtersets.py:853 +#: netbox/ipam/filtersets.py:1117 netbox/virtualization/filtersets.py:161 #: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "" @@ -3179,8 +3179,8 @@ msgstr "" msgid "Rack (name)" msgstr "" -#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 -#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:608 +#: netbox/ipam/filtersets.py:848 netbox/ipam/filtersets.py:1123 #: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "" @@ -3232,9 +3232,9 @@ msgstr "" #: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 #: netbox/dcim/forms/model_forms.py:1385 #: netbox/dcim/models/device_components.py:711 -#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 -#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 -#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:318 +#: netbox/ipam/filtersets.py:329 netbox/ipam/filtersets.py:485 +#: netbox/ipam/filtersets.py:586 netbox/ipam/filtersets.py:597 #: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 #: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 #: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 @@ -3261,19 +3261,19 @@ msgstr "" msgid "VRF" msgstr "" -#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 -#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 -#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:324 +#: netbox/ipam/filtersets.py:335 netbox/ipam/filtersets.py:491 +#: netbox/ipam/filtersets.py:592 netbox/ipam/filtersets.py:603 msgid "VRF (RD)" msgstr "" -#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1032 #: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "" #: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 -#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1038 #: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 #: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 #: netbox/templates/vpn/l2vpntermination.html:12 @@ -9010,129 +9010,129 @@ msgstr "" msgid "Exporting L2VPN (identifier)" msgstr "" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 #: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "" #: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:223 msgid "RIR (ID)" msgstr "" #: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:229 msgid "RIR (slug)" msgstr "" -#: netbox/ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:287 msgid "Within prefix" msgstr "" -#: netbox/ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:291 msgid "Within and including prefix" msgstr "" -#: netbox/ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:295 msgid "Prefixes which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 #: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 #: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 +#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "" -#: netbox/ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:481 msgid "Ranges which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 msgid "Parent prefix" msgstr "" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 +#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 +#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 #: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 #: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 #: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "" -#: netbox/ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:650 msgid "FHRP group (ID)" msgstr "" -#: netbox/ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:654 msgid "Is assigned to an interface" msgstr "" -#: netbox/ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:658 msgid "Is assigned" msgstr "" -#: netbox/ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:670 msgid "Service (ID)" msgstr "" -#: netbox/ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:675 msgid "NAT inside IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "" -#: netbox/ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1048 msgid "Assigned VM interface" msgstr "" -#: netbox/ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1138 msgid "IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "" -#: netbox/ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1169 msgid "Primary IPv4 (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1174 msgid "Primary IPv6 (ID)" msgstr "" From fff4ec78ad0c14d80cb1f4619e401ac3bcfc4d2e Mon Sep 17 00:00:00 2001 From: Pieter Lambrecht Date: Fri, 13 Dec 2024 16:23:49 +0100 Subject: [PATCH 099/169] set disabled interface backgroundcolor to $gray-400 --- netbox/project-static/dist/netbox.css | Bin 554811 -> 554811 bytes .../styles/custom/_interfaces.scss | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/project-static/dist/netbox.css b/netbox/project-static/dist/netbox.css index cd66ffa0fc5dd4feecb08942203ae83d8d2c3549..cee6eda688f62b50695a128811bbdd7c68cfffca 100644 GIT binary patch delta 43 zcmdn}PI31;#fBEf7N!>F7M2#)7Pc1lEgTC9*(?$*%@dQR_Z4tRY~NSNQOgPdZsiY= delta 41 xcmdn}PI31;#fBEf7N!>F7M2#)7Pc1lEgTC9r#IwtuubnP;E>q9uaKjb6#!XL4^sdD diff --git a/netbox/project-static/styles/custom/_interfaces.scss b/netbox/project-static/styles/custom/_interfaces.scss index 2c363e7ff..9e6baa7e5 100644 --- a/netbox/project-static/styles/custom/_interfaces.scss +++ b/netbox/project-static/styles/custom/_interfaces.scss @@ -17,7 +17,7 @@ tr[data-virtual=true] { background-color: rgba(map.get($theme-colors, "primary"), 0.15); } tr[data-enabled=disabled] { - background-color: rgba(map.get($theme-colors, "danger"), 0.15); + background-color: rgba($gray-400, 0.15); } // Only show the correct button depending on the cable status From 382e246b2c0ac1726d3d23847319dbebde80c893 Mon Sep 17 00:00:00 2001 From: Kay Schroeder Date: Wed, 4 Dec 2024 17:25:07 +0100 Subject: [PATCH 100/169] Added the cable -> CableType-Annotation in CableTerminationType. --- netbox/dcim/graphql/types.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/graphql/types.py b/netbox/dcim/graphql/types.py index bce6f06ac..da219c754 100644 --- a/netbox/dcim/graphql/types.py +++ b/netbox/dcim/graphql/types.py @@ -116,7 +116,7 @@ class ModularComponentTemplateType(ComponentTemplateType): filters=CableTerminationFilter ) class CableTerminationType(NetBoxObjectType): - + cable: Annotated["CableType", strawberry.lazy('dcim.graphql.types')] | None termination: Annotated[Union[ Annotated["CircuitTerminationType", strawberry.lazy('circuits.graphql.types')], Annotated["ConsolePortType", strawberry.lazy('dcim.graphql.types')], From c0fec28b2ab6a0a74d04f7a13e7e4890d5da4e8c Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 13 Dec 2024 08:37:55 -0500 Subject: [PATCH 101/169] Handle editing IPAddresses on VMInterfaces without parent.oob_ip --- netbox/ipam/forms/model_forms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/ipam/forms/model_forms.py b/netbox/ipam/forms/model_forms.py index f595bf459..c7aeaa8e5 100644 --- a/netbox/ipam/forms/model_forms.py +++ b/netbox/ipam/forms/model_forms.py @@ -361,7 +361,7 @@ class IPAddressForm(TenancyForm, NetBoxModelForm): ): self.initial['primary_for_parent'] = True - if parent and (parent.oob_ip_id == self.instance.pk): + if parent and getattr(parent, 'oob_ip_id', None) == self.instance.pk: self.initial['oob_for_parent'] = True if type(instance.assigned_object) is Interface: From aa56b99566b5ef0603cd4fb2454eb58433d97ae5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 16 Dec 2024 10:57:09 -0500 Subject: [PATCH 102/169] Closes #18045: Enable adding a new MAC to an interface via quick add (#18200) * Closes #18045: Enable adding a new MAC to an interface via quick add * Misc cleanup --- netbox/dcim/forms/common.py | 8 ------ netbox/dcim/forms/model_forms.py | 7 +++++ netbox/utilities/forms/fields/dynamic.py | 26 ++++++++++++++----- netbox/utilities/forms/widgets/apiselect.py | 9 +++++++ .../templates/widgets/apiselect.html | 4 +-- netbox/virtualization/forms/model_forms.py | 9 ++++++- 6 files changed, 46 insertions(+), 17 deletions(-) diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index 65d0d0f23..8ca258f34 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -3,9 +3,7 @@ from django.utils.translation import gettext_lazy as _ from dcim.choices import * from dcim.constants import * -from dcim.models import MACAddress from utilities.forms import get_field_value -from utilities.forms.fields import DynamicModelChoiceField __all__ = ( 'InterfaceCommonForm', @@ -20,12 +18,6 @@ class InterfaceCommonForm(forms.Form): max_value=INTERFACE_MTU_MAX, label=_('MTU') ) - primary_mac_address = DynamicModelChoiceField( - queryset=MACAddress.objects.all(), - label=_('Primary MAC address'), - required=False, - quick_add=True - ) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index d6fdb21e2..9bc69e991 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1410,6 +1410,13 @@ class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm): required=False, label=_('VRF') ) + primary_mac_address = DynamicModelChoiceField( + queryset=MACAddress.objects.all(), + label=_('Primary MAC address'), + required=False, + quick_add=True, + quick_add_params={'interface': '$pk'} + ) wwn = forms.CharField( empty_value=None, required=False, diff --git a/netbox/utilities/forms/fields/dynamic.py b/netbox/utilities/forms/fields/dynamic.py index 13d5ffc70..793494b4b 100644 --- a/netbox/utilities/forms/fields/dynamic.py +++ b/netbox/utilities/forms/fields/dynamic.py @@ -68,6 +68,8 @@ class DynamicModelChoiceMixin: selector: Include an advanced object selection widget to assist the user in identifying the desired object quick_add: Include a widget to quickly create a new related object for assignment. NOTE: Nested usage of quick-add fields is not currently supported. + quick_add_params: A dictionary of initial data to include when launching the quick-add form (optional). The + token string "$pk" will be replaced with the primary key of the form's instance, if any. Context keys: value: The name of the attribute which contains the option's value (default: 'id') @@ -93,6 +95,7 @@ class DynamicModelChoiceMixin: context=None, selector=False, quick_add=False, + quick_add_params=None, **kwargs ): self.model = queryset.model @@ -103,6 +106,7 @@ class DynamicModelChoiceMixin: self.context = context or {} self.selector = selector self.quick_add = quick_add + self.quick_add_params = quick_add_params or {} super().__init__(queryset, **kwargs) @@ -125,12 +129,6 @@ class DynamicModelChoiceMixin: if self.selector: attrs['selector'] = self.model._meta.label_lower - # Include quick add? - if self.quick_add: - app_label = self.model._meta.app_label - model_name = self.model._meta.model_name - attrs['quick_add'] = reverse_lazy(f'{app_label}:{model_name}_add') - return attrs def get_bound_field(self, form, field_name): @@ -171,6 +169,22 @@ class DynamicModelChoiceMixin: viewname = get_viewname(self.queryset.model, action='list', rest_api=True) widget.attrs['data-url'] = reverse(viewname) + # Include quick add? + if self.quick_add: + app_label = self.model._meta.app_label + model_name = self.model._meta.model_name + widget.quick_add_context = { + 'url': reverse_lazy(f'{app_label}:{model_name}_add'), + 'params': {}, + } + for k, v in self.quick_add_params.items(): + if v == '$pk': + # Replace "$pk" token with the primary key of the form's instance (if any) + if getattr(form.instance, 'pk', None): + widget.quick_add_context['params'][k] = form.instance.pk + else: + widget.quick_add_context['params'][k] = v + return bound_field diff --git a/netbox/utilities/forms/widgets/apiselect.py b/netbox/utilities/forms/widgets/apiselect.py index 278371de6..7e9122922 100644 --- a/netbox/utilities/forms/widgets/apiselect.py +++ b/netbox/utilities/forms/widgets/apiselect.py @@ -22,6 +22,15 @@ class APISelect(forms.Select): dynamic_params: Dict[str, str] static_params: Dict[str, List[str]] + def get_context(self, name, value, attrs): + context = super().get_context(name, value, attrs) + + # Add quick-add context data, if enabled for the widget + if hasattr(self, 'quick_add_context'): + context['quick_add'] = self.quick_add_context + + return context + def __init__(self, api_url=None, full=False, *args, **kwargs): super().__init__(*args, **kwargs) diff --git a/netbox/utilities/templates/widgets/apiselect.html b/netbox/utilities/templates/widgets/apiselect.html index 51ee79e6a..2d5c9e493 100644 --- a/netbox/utilities/templates/widgets/apiselect.html +++ b/netbox/utilities/templates/widgets/apiselect.html @@ -15,7 +15,7 @@ {% endif %} - {% if widget.attrs.quick_add and not widget.attrs.disabled %} + {% if quick_add and not widget.attrs.disabled %} {# Opens the quick add modal #}

    +{% elif isolated_deployment %} + + {% trans "This RSS feed requires an external connection. Check the ISOLATED_DEPLOYMENT setting." %} + {% else %} {# There was an error retrieving/parsing the feed #} From 0b9ead3e8b6cb4b3ee51ea4c36ec8fef4b40852b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 12 Dec 2024 14:53:42 -0500 Subject: [PATCH 104/169] Closes #18224: Apply all registered request processors when running custom scripts --- netbox/extras/jobs.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/netbox/extras/jobs.py b/netbox/extras/jobs.py index 190166b5b..10d76e3aa 100644 --- a/netbox/extras/jobs.py +++ b/netbox/extras/jobs.py @@ -1,14 +1,14 @@ import logging import traceback -from contextlib import nullcontext +from contextlib import ExitStack from django.db import transaction from django.utils.translation import gettext as _ from core.signals import clear_events from extras.models import Script as ScriptModel -from netbox.context_managers import event_tracking from netbox.jobs import JobRunner +from netbox.registry import registry from utilities.exceptions import AbortScript, AbortTransaction from .utils import is_report @@ -100,5 +100,7 @@ class ScriptJob(JobRunner): # Execute the script. If commit is True, wrap it with the event_tracking context manager to ensure we process # change logging, event rules, etc. - with event_tracking(request) if commit else nullcontext(): + with ExitStack() as stack: + for request_processor in registry['request_processors']: + stack.enter_context(request_processor(request)) self.run_script(script, request, data, commit) From e7fcbffaf3e66c955a3e5c9a07dea0460caa401c Mon Sep 17 00:00:00 2001 From: bctiemann Date: Tue, 17 Dec 2024 14:46:52 -0500 Subject: [PATCH 105/169] Fixes: #16757 - Use table_htmx.html for assigning ipaddresses (#18226) * Use table_htmx.html for assigning ipaddresses * Add disable_htmx property on ObjectChildrenView to allow IP assignment flow to avoid htmx fragmentary rendering on object save * Revert "Add disable_htmx property on ObjectChildrenView to allow IP assignment flow to avoid htmx fragmentary rendering on object save" This reverts commit fa8f2ac3773780bdf9f2555843dae72ab1f185cc. --- netbox/templates/ipam/ipaddress_assign.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/ipam/ipaddress_assign.html b/netbox/templates/ipam/ipaddress_assign.html index d96ad7452..4711b286a 100644 --- a/netbox/templates/ipam/ipaddress_assign.html +++ b/netbox/templates/ipam/ipaddress_assign.html @@ -34,7 +34,7 @@

    {% trans "Search Results" %}

    - {% render_table table 'inc/table.html' %} + {% render_table table 'inc/table_htmx.html' %}
    From 8d6cec408cb8a50a1c98284185456ff6a96efd47 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Tue, 17 Dec 2024 15:39:29 -0500 Subject: [PATCH 106/169] Fixes: #17868 - Handle orphaned cable condition gracefully in SVG rendering (#18244) * Handle condition gracefully where an empty object list is passed in to draw_far_objects (e.g. orphaned cable where attached device has been deleted) * Move continue statement to right after draw_far_objects * Preferable falsy syntax Co-authored-by: Jeremy Stretch * Check far_ends rather than altering draw_far_objects --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/svg/cables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/svg/cables.py b/netbox/dcim/svg/cables.py index 4e0f7aea6..58fa27c6b 100644 --- a/netbox/dcim/svg/cables.py +++ b/netbox/dcim/svg/cables.py @@ -362,7 +362,7 @@ class CableTraceSVG: self.cursor += CABLE_HEIGHT # Connector (a Cable or WirelessLink) - if links: + if links and far_ends: obj_list = {end.parent_object for end in far_ends} parent_object_nodes, far_terminations = self.draw_far_objects(obj_list, far_ends) From e396097f3c362a319eb47a46a537ca5ae2e7e4d6 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 17 Dec 2024 15:59:39 -0500 Subject: [PATCH 107/169] Release v4.1.9 --- docs/release-notes/version-4.1.md | 16 ++ netbox/release.yaml | 4 +- netbox/translations/pt/LC_MESSAGES/django.mo | Bin 232267 -> 235682 bytes netbox/translations/pt/LC_MESSAGES/django.po | 176 ++++++++++--------- requirements.txt | 8 +- 5 files changed, 118 insertions(+), 86 deletions(-) diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index 06ff12fef..f843f676f 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,5 +1,21 @@ # NetBox v4.1 +## v4.1.9 (2024-12-17) + +### Enhancements + +* [#17215](https://github.com/netbox-community/netbox/issues/17215) - Change the highlighted color of disabled interfaces in interface lists +* [#18224](https://github.com/netbox-community/netbox/issues/18224) - Apply all registered request processors when running custom scripts + +### Bug Fixes + +* [#16757](https://github.com/netbox-community/netbox/issues/16757) - Fix rendering of IP addresses table when assigning an existing IP address to an interface with global HTMX navigation enabled +* [#17868](https://github.com/netbox-community/netbox/issues/17868) - Fix `ZeroDivisionError` exception under specific circumstances when generating a cable trace +* [#18124](https://github.com/netbox-community/netbox/issues/18124) - Enable referencing cable attributes when querying a `cabletermination_set` via the GraphQL API +* [#18230](https://github.com/netbox-community/netbox/issues/18230) - Fix `AttributeError` exception when attempting to edit an IP address assigned to a virtual machine interface + +--- + ## v4.1.8 (2024-12-12) ### Enhancements diff --git a/netbox/release.yaml b/netbox/release.yaml index f93458475..5055defb3 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.1.8" +version: "4.1.9" edition: "Community" -published: "2024-12-12" +published: "2024-12-17" diff --git a/netbox/translations/pt/LC_MESSAGES/django.mo b/netbox/translations/pt/LC_MESSAGES/django.mo index 644e274a473c9fbb8f592ed13e013bcac865cfd8..e6d410f9aded3682f2deff92278b880cc7ebea54 100644 GIT binary patch delta 68863 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 delta 66368 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[ge,xe]-0/0/[0-9]
    ). O token {module}, se presente," +" será automaticamente substituído pelo valor da posição ao criar um novo " +"módulo." #: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" @@ -6498,7 +6504,7 @@ msgstr "função do rack" #: netbox/dcim/models/racks.py:231 msgid "rack roles" -msgstr "funções de rack" +msgstr "funções do rack" #: netbox/dcim/models/racks.py:274 msgid "facility ID" @@ -9346,129 +9352,129 @@ msgstr "Exportando L2VPN" msgid "Exporting L2VPN (identifier)" msgstr "Exportando L2VPN (identificador)" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 #: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Prefixo" #: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:223 msgid "RIR (ID)" msgstr "RIR (ID)" #: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:229 msgid "RIR (slug)" msgstr "RIR (slug)" -#: netbox/ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:287 msgid "Within prefix" msgstr "Dentro do prefixo" -#: netbox/ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:291 msgid "Within and including prefix" msgstr "Dentro e incluindo o prefixo" -#: netbox/ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:295 msgid "Prefixes which contain this prefix or IP" msgstr "Prefixos que contêm este prefixo ou IP" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 #: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 #: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Tamanho da máscara" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Número da VLAN (1-4094)" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 +#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Endereço" -#: netbox/ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:481 msgid "Ranges which contain this prefix or IP" msgstr "Faixas que contêm este prefixo ou IP" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 msgid "Parent prefix" msgstr "Prefixo pai" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 +#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Máquina virtual (nome)" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 +#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 #: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Máquina virtual (ID)" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 #: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interface (nome)" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 #: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interface da VM (nome)" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interface da VM (ID)" -#: netbox/ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:650 msgid "FHRP group (ID)" msgstr "Grupo FHRP (ID)" -#: netbox/ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:654 msgid "Is assigned to an interface" msgstr "Está associado a uma interface" -#: netbox/ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:658 msgid "Is assigned" msgstr "Está associado" -#: netbox/ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:670 msgid "Service (ID)" msgstr "Serviço (ID)" -#: netbox/ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:675 msgid "NAT inside IP address (ID)" msgstr "NAT dentro do endereço IP (ID)" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interface associada" -#: netbox/ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1048 msgid "Assigned VM interface" msgstr "Interface de VM atribuída" -#: netbox/ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1138 msgid "IP address (ID)" msgstr "Endereço IP (ID)" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "Endereço IP" -#: netbox/ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1169 msgid "Primary IPv4 (ID)" msgstr "IPv4 Primário (ID)" -#: netbox/ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1174 msgid "Primary IPv6 (ID)" msgstr "IPv6 Primário (ID)" @@ -9692,11 +9698,12 @@ msgstr "Tornar este o IP primário do dispositivo associado" #: netbox/ipam/forms/bulk_import.py:330 msgid "Is out-of-band" -msgstr "" +msgstr "É out-of-band" #: netbox/ipam/forms/bulk_import.py:331 msgid "Designate this as the out-of-band IP address for the assigned device" msgstr "" +"Designar este como endereço IP out-f-band para o dispositvo associado." #: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" @@ -9707,10 +9714,11 @@ msgstr "" #: netbox/ipam/forms/bulk_import.py:375 msgid "No device specified; cannot set as out-of-band IP" msgstr "" +"Nenhum dispositivo especificado; não pode ser definido como IP out-of-band" #: netbox/ipam/forms/bulk_import.py:379 msgid "Cannot set out-of-band IP for virtual machines" -msgstr "" +msgstr "Não é possível definir IP out-of-band para máquinas virtuais" #: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" @@ -9720,6 +9728,7 @@ msgstr "" #: netbox/ipam/forms/bulk_import.py:387 msgid "No interface specified; cannot set as out-of-band IP" msgstr "" +"Nenhuma interface especificada; não pode ser definido como IP out-of-band" #: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" @@ -9896,7 +9905,7 @@ msgstr "Torne este o IP primário do dispositivo/VM" #: netbox/ipam/forms/model_forms.py:314 msgid "Make this the out-of-band IP for the device" -msgstr "" +msgstr "Definir este como endereço IP out-of-band para o dispositivo" #: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" @@ -9909,10 +9918,12 @@ msgstr "Um endereço IP só pode ser atribuído a um único objeto." #: netbox/ipam/forms/model_forms.py:398 msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" +"Não é possível reatribuir o endereço primário para o dispositivo/VM pai" #: netbox/ipam/forms/model_forms.py:402 msgid "Cannot reassign out-of-Band IP address for the parent device" msgstr "" +"Não é possível reatribuir o endereço IP out-of-band para o dispositivo pai" #: netbox/ipam/forms/model_forms.py:412 msgid "" @@ -9926,6 +9937,8 @@ msgid "" "Only IP addresses assigned to a device interface can be designated as the " "out-of-band IP for a device." msgstr "" +"Somente endereços IP atribuídos para uma interface podem ser designados como" +" IP out-of-band para o dispositivo." #: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" @@ -10327,12 +10340,12 @@ msgstr "Não é possível definir scope_id sem scope_type." #: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" -msgstr "" +msgstr "VLAN ID inicial no intervalo {value} não pode ser menor que {minimum}" #: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" -msgstr "" +msgstr "VLAN ID final no intervalo {value} não pode ser maior que {maximum}" #: netbox/ipam/models/vlans.py:118 #, python-brace-format @@ -10340,6 +10353,8 @@ msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" +"VLAN ID final do intervalo deve ser maior ou igual à VLAN ID inicial " +"({range})" #: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." @@ -11007,7 +11022,7 @@ msgstr "Atribuições dos Contatos" #: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" -msgstr "Funções de Rack" +msgstr "Funções do Rack" #: netbox/netbox/navigation/menu.py:54 msgid "Elevations" @@ -12701,11 +12716,11 @@ msgstr "Baixar" #: netbox/templates/dcim/device/render_config.html:64 #: netbox/templates/virtualization/virtualmachine/render_config.html:64 msgid "Error rendering template" -msgstr "" +msgstr "Erro ao renderizar o modelo" #: netbox/templates/dcim/device/render_config.html:70 msgid "No configuration template has been assigned for this device." -msgstr "" +msgstr "Nenhum modelo de configuração foi atribuído para este dispositivo." #: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" @@ -14388,6 +14403,7 @@ msgstr "Adicionar Disco Virtual" #: netbox/templates/virtualization/virtualmachine/render_config.html:70 msgid "No configuration template has been assigned for this virtual machine." msgstr "" +"Nenhum modelo de configuração foi atribuído para esta máquina virtual." #: netbox/templates/vpn/ikepolicy.html:10 #: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 @@ -15464,12 +15480,12 @@ msgstr "Memória (MB)" #: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" -msgstr "" +msgstr "Disco (MB)" #: netbox/virtualization/forms/bulk_edit.py:334 #: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" -msgstr "" +msgstr "Tamanho (MB)" #: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" @@ -15680,19 +15696,19 @@ msgstr "GRE" #: netbox/vpn/choices.py:39 msgid "WireGuard" -msgstr "" +msgstr "WireGuard" #: netbox/vpn/choices.py:40 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: netbox/vpn/choices.py:41 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: netbox/vpn/choices.py:42 msgid "PPTP" -msgstr "" +msgstr "PPTP" #: netbox/vpn/choices.py:64 msgid "Hub" diff --git a/requirements.txt b/requirements.txt index fb2a81dfa..08d06210c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,10 +20,10 @@ feedparser==6.0.11 gunicorn==23.0.0 Jinja2==3.1.4 Markdown==3.7 -mkdocs-material==9.5.48 +mkdocs-material==9.5.49 mkdocstrings[python-legacy]==0.27.0 netaddr==1.3.0 -nh3==0.2.19 +nh3==0.2.20 Pillow==11.0.0 psycopg[c,pool]==3.2.3 PyYAML==6.0.2 @@ -31,8 +31,8 @@ requests==2.32.3 rq==2.0 social-auth-app-django==5.4.2 social-auth-core==4.5.4 -strawberry-graphql==0.253.1 -strawberry-graphql-django==0.51.0 +strawberry-graphql==0.254.0 +strawberry-graphql-django==0.52.0 svgwrite==1.4.3 tablib==3.7.0 tzdata==2024.2 From 6ddd3cc779ec59106458fa96b613da5055e65ab9 Mon Sep 17 00:00:00 2001 From: Tobias Genannt Date: Thu, 19 Dec 2024 07:44:38 +0100 Subject: [PATCH 108/169] #18260 - Add context managers to registry --- netbox/core/apps.py | 1 + 1 file changed, 1 insertion(+) diff --git a/netbox/core/apps.py b/netbox/core/apps.py index 0811e5cb2..9674860b9 100644 --- a/netbox/core/apps.py +++ b/netbox/core/apps.py @@ -21,6 +21,7 @@ class CoreConfig(AppConfig): from core.api import schema # noqa: F401 from netbox.models.features import register_models from . import data_backends, events, search # noqa: F401 + from netbox import context_managers # noqa: F401 # Register models register_models(*self.get_models()) From 28eada13d32652cafad02cda60a66d18c0a78f6c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 23 Dec 2024 10:42:24 -0500 Subject: [PATCH 109/169] Release v4.1.10 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- docs/release-notes/version-4.1.md | 11 ++ netbox/release.yaml | 4 +- netbox/translations/ja/LC_MESSAGES/django.mo | Bin 251237 -> 254765 bytes netbox/translations/ja/LC_MESSAGES/django.po | 173 +++++++++--------- 6 files changed, 103 insertions(+), 89 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index 6714d1357..f486791e1 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.8 + placeholder: v4.1.10 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 72836017b..2e15c36cb 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.8 + placeholder: v4.1.10 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index f843f676f..e68aa2344 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,7 +1,18 @@ # NetBox v4.1 +## v4.1.10 (2024-12-23) + +### Bug Fixes + +* [#18260](https://github.com/netbox-community/netbox/issues/18260) - Fix object change logging + +--- + ## v4.1.9 (2024-12-17) +!!! danger "Do Not Use" + This release contains a regression which breaks change logging. Please use release v4.1.10 instead. + ### Enhancements * [#17215](https://github.com/netbox-community/netbox/issues/17215) - Change the highlighted color of disabled interfaces in interface lists diff --git a/netbox/release.yaml b/netbox/release.yaml index 5055defb3..e96c80cfa 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.1.9" +version: "4.1.10" edition: "Community" -published: "2024-12-17" +published: "2024-12-23" diff --git a/netbox/translations/ja/LC_MESSAGES/django.mo b/netbox/translations/ja/LC_MESSAGES/django.mo index f5dc65ae6652d8be288969d591d70deb979e0be0..c7b76e8cbea012b5cbbf5d3bf07a41e953b315b8 100644 GIT binary patch delta 68781 zcmXWkci`1iAHebZ`=wnf6s4uT_t2h78d^fqP&BAiBCAUz6&gmiN>s?EvMKQhNurGG z5DhCLJn#2CpXZ;~Ip=%6=X}oke($}h=i7%$t=Uv6yX&YUZq4w&<4a^R74f%`nM}>n znata-TAIm>%+Jfz#!*-d=VDX51>55$?2QEqOd;%mt+6|vf>&TK zd;>dSnZkLQ!8ia1;e$Al{xg4(=t04_B6*o{_!xG>>8t~%Ce~boPy##^Mf2JOZCO93P+6TiOXoJN{COe}ez8GDS zrQw@VegL~tUg5~JG-qQ?@^_+3_X;}oo3SWv!)!qkpOGklU!!aGT~s&_{)IMhM5%OR zDKuXmkH8vO2J2#3Y=;$a09M8e@Hm{0j(i1{#D`1eWpkTiJq32W35{?|RQL!>k^eUQ z9j#ZebZY2Gw4t(Lb#(7EMce6s≥K$Csc3or&Hzt8_Lmb2N#C6dZ*s&<56q8<1U^ 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 diff --git a/netbox/templates/circuits/circuitgroupassignment.html b/netbox/templates/circuits/circuitgroupassignment.html index bd277a5fc..f1bb9f5d4 100644 --- a/netbox/templates/circuits/circuitgroupassignment.html +++ b/netbox/templates/circuits/circuitgroupassignment.html @@ -22,9 +22,13 @@ {% trans "Group" %} {{ object.group|linkify }} + + {% trans "Provider" %} + {{ object.member.provider|linkify }} + {% trans "Circuit" %} - {{ object.circuit|linkify }} + {{ object.member|linkify }} {% trans "Priority" %} diff --git a/netbox/templates/circuits/virtualcircuit.html b/netbox/templates/circuits/virtualcircuit.html index 400f90524..20fad6af2 100644 --- a/netbox/templates/circuits/virtualcircuit.html +++ b/netbox/templates/circuits/virtualcircuit.html @@ -60,6 +60,19 @@
    {% include 'inc/panels/custom_fields.html' %} {% include 'inc/panels/comments.html' %} +
    +

    + {% trans "Group Assignments" %} + {% if perms.circuits.add_circuitgroupassignment %} + + {% endif %} +

    + {% htmx_table 'circuits:circuitgroupassignment_list' virtual_circuit_id=object.pk %} +
    {% plugin_right_page object %}
    From 40f22533d164c49dac5443e6d7f73758190f1462 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 4 Jan 2025 05:02:13 +0000 Subject: [PATCH 117/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 5f49057fb..5d1188333 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-13 05:02+0000\n" +"POT-Creation-Date: 2025-01-04 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -650,7 +650,7 @@ msgstr "" #: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 #: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 #: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 -#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:70 #: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 #: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 #: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 @@ -1508,7 +1508,7 @@ msgstr "" #: netbox/circuits/tables/providers.py:82 #: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 #: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 -#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/modules.py:73 netbox/dcim/tables/power.py:39 #: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 #: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 #: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 @@ -3432,7 +3432,7 @@ msgstr "" #: netbox/dcim/tables/devices.py:96 netbox/dcim/tables/devices.py:172 #: netbox/dcim/tables/devices.py:940 netbox/dcim/tables/devicetypes.py:80 #: netbox/dcim/tables/devicetypes.py:308 netbox/dcim/tables/modules.py:20 -#: netbox/dcim/tables/modules.py:60 netbox/dcim/tables/racks.py:58 +#: netbox/dcim/tables/modules.py:61 netbox/dcim/tables/racks.py:58 #: netbox/dcim/tables/racks.py:132 netbox/templates/dcim/devicetype.html:14 #: netbox/templates/dcim/inventoryitem.html:44 #: netbox/templates/dcim/manufacturer.html:33 @@ -3679,7 +3679,7 @@ msgid "Device Type" msgstr "" #: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 -#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:66 #: netbox/templates/dcim/module.html:65 netbox/templates/dcim/modulebay.html:66 #: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" @@ -3785,7 +3785,7 @@ msgstr "" #: netbox/dcim/tables/devices.py:597 netbox/dcim/tables/devices.py:697 #: netbox/dcim/tables/devices.py:754 netbox/dcim/tables/devices.py:801 #: netbox/dcim/tables/devices.py:861 netbox/dcim/tables/devices.py:930 -#: netbox/dcim/tables/devices.py:1057 netbox/dcim/tables/modules.py:52 +#: netbox/dcim/tables/devices.py:1057 netbox/dcim/tables/modules.py:53 #: netbox/extras/forms/filtersets.py:321 netbox/ipam/forms/bulk_import.py:304 #: netbox/ipam/forms/bulk_import.py:505 netbox/ipam/forms/filtersets.py:551 #: netbox/ipam/forms/model_forms.py:323 netbox/ipam/forms/model_forms.py:712 @@ -6617,7 +6617,7 @@ msgstr "" msgid "Inventory items" msgstr "" -#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:57 #: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "" @@ -7336,12 +7336,12 @@ msgstr "" msgid "Show your personal bookmarks" msgstr "" -#: netbox/extras/events.py:147 +#: netbox/extras/events.py:151 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "" -#: netbox/extras/events.py:192 +#: netbox/extras/events.py:196 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "" From 89d7487197bee00a5867727767fffd4ab76b5fe6 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Fri, 3 Jan 2025 14:13:36 -0500 Subject: [PATCH 118/169] Update some detail views with prefetch_related from 'site' to 'scope' --- netbox/ipam/views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f145716e9..c606c1088 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -713,7 +713,7 @@ class IPRangeView(generic.ObjectView): Q(prefix__net_contains_or_equals=str(instance.end_address.ip)), vrf=instance.vrf ).prefetch_related( - 'site', 'role', 'tenant', 'vlan', 'role' + 'scope', 'role', 'tenant', 'vlan', 'role' ) parent_prefixes_table = tables.PrefixTable( list(parent_prefixes), @@ -805,7 +805,7 @@ class IPAddressView(generic.ObjectView): vrf=instance.vrf, prefix__net_contains_or_equals=str(instance.address.ip) ).prefetch_related( - 'site', 'role' + 'scope', 'role' ) parent_prefixes_table = tables.PrefixTable( list(parent_prefixes), @@ -1288,7 +1288,7 @@ class VLANView(generic.ObjectView): def get_extra_context(self, request, instance): prefixes = Prefix.objects.restrict(request.user, 'view').filter(vlan=instance).prefetch_related( - 'vrf', 'site', 'role', 'tenant' + 'vrf', 'scope', 'role', 'tenant' ) prefix_table = tables.PrefixTable(list(prefixes), exclude=('vlan', 'utilization'), orderable=False) From c9ee699633a05c3ce2e2735b55cad7fb48822ea1 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 6 Jan 2025 09:54:13 -0500 Subject: [PATCH 119/169] Fixes: #18263 - Iterate through a freshly queried set of CableTerminations to find endpoints in update_connected_endpoints (#18264) * Iterate through a freshly queried set of CableTerminations to find endpoints in update_connected_endpoints * Add defensive break if q_filter has not been populated --- netbox/dcim/models/cables.py | 4 ++++ netbox/dcim/signals.py | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 2a4748610..2bdaa50eb 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -607,6 +607,10 @@ class CablePath(models.Model): cable_end = 'A' if lct.cable_end == 'B' else 'B' q_filter |= Q(cable=lct.cable, cable_end=cable_end) + # Make sure this filter has been populated; if not, we have probably been given invalid data + if not q_filter: + break + remote_cable_terminations = CableTermination.objects.filter(q_filter) remote_terminations = [ct.termination for ct in remote_cable_terminations] else: diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index a51872719..6c213d64c 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -85,7 +85,8 @@ def update_connected_endpoints(instance, created, raw=False, **kwargs): if instance._terminations_modified: a_terminations = [] b_terminations = [] - for t in instance.terminations.all(): + # Note: instance.terminations.all() is not safe to use here as it might be stale + for t in CableTermination.objects.filter(cable=instance): if t.cable_end == CableEndChoices.SIDE_A: a_terminations.append(t.termination) else: From 67657efe1c39f94592af249dd0b7830c0cb3eaf9 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Jan 2025 10:39:52 -0500 Subject: [PATCH 120/169] Release v4.1.11 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- base_requirements.txt | 2 +- docs/release-notes/version-4.1.md | 12 + netbox/release.yaml | 4 +- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 296938 -> 301883 bytes netbox/translations/ru/LC_MESSAGES/django.po | 244 ++++++++++-------- requirements.txt | 12 +- 8 files changed, 153 insertions(+), 125 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index f486791e1..cb39ae9be 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.10 + placeholder: v4.1.11 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 2e15c36cb..e42ff3045 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.10 + placeholder: v4.1.11 validations: required: true - type: dropdown diff --git a/base_requirements.txt b/base_requirements.txt index 3e5bcb0db..234859962 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -101,7 +101,7 @@ netaddr nh3 # Fork of PIL (Python Imaging Library) for image processing -# https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst +# https://github.com/python-pillow/Pillow/releases Pillow # PostgreSQL database adapter for Python diff --git a/docs/release-notes/version-4.1.md b/docs/release-notes/version-4.1.md index e68aa2344..9a2f79ece 100644 --- a/docs/release-notes/version-4.1.md +++ b/docs/release-notes/version-4.1.md @@ -1,5 +1,17 @@ # NetBox v4.1 +## v4.1.11 (2025-01-06) + +### Bug Fixes + +* [#17771](https://github.com/netbox-community/netbox/issues/17771) - Fix duplicate entries appearing on VLAN list when filtering by interface assignment +* [#18222](https://github.com/netbox-community/netbox/issues/18222) - Pass event rule action data to webhooks as context data +* [#18263](https://github.com/netbox-community/netbox/issues/18263) - Fix recalculation of cable paths when modifying cable terminations via the REST API +* [#18271](https://github.com/netbox-community/netbox/issues/18271) - Require only encryption _or_ authentication algorithm when creating an IPSec proposal via the REST API +* [#18289](https://github.com/netbox-community/netbox/issues/18289) - Enable ordering modules and module types by created & last updated times + +--- + ## v4.1.10 (2024-12-23) ### Bug Fixes diff --git a/netbox/release.yaml b/netbox/release.yaml index e96c80cfa..7126342db 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.1.10" +version: "4.1.11" edition: "Community" -published: "2024-12-23" +published: "2025-01-06" diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo index 65ede0d43ad754ab9da9b2b12e0340b2a9c3f444..4b62c2a5b1419eab25391b91fe2a9bd4a23066ac 100644 GIT binary patch delta 69906 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 S^UF-Z|9v+-SEC)NQ~xg!VuU;Z delta 66900 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 diff --git a/netbox/translations/ru/LC_MESSAGES/django.po b/netbox/translations/ru/LC_MESSAGES/django.po index da90e8efc..2cb2074cd 100644 --- a/netbox/translations/ru/LC_MESSAGES/django.po +++ b/netbox/translations/ru/LC_MESSAGES/django.po @@ -11,17 +11,18 @@ # stavr666, 2024 # Alexander Ryazanov (alryaz) , 2024 # Vladyslav V. Prodan, 2024 -# Artem Kotik, 2024 # Jeremy Stretch, 2024 +# Michail Tatarinov, 2024 +# Artem Kotik, 2025 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-12 05:02+0000\n" +"POT-Creation-Date: 2025-01-04 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" -"Last-Translator: Jeremy Stretch, 2024\n" +"Last-Translator: Artem Kotik, 2025\n" "Language-Team: Russian (https://app.transifex.com/netbox-community/teams/178115/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -157,7 +158,7 @@ msgstr "Неактивный" #: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 #: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 #: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 -#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/ipam/filtersets.py:341 netbox/ipam/filtersets.py:961 #: netbox/virtualization/filtersets.py:45 #: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" @@ -169,8 +170,8 @@ msgstr "Регион (ID)" #: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 #: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 #: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 -#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 -#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:348 +#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52 #: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Регион (подстрока)" @@ -180,8 +181,8 @@ msgstr "Регион (подстрока)" #: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 #: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 #: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 -#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 -#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:354 +#: netbox/ipam/filtersets.py:974 netbox/virtualization/filtersets.py:58 #: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Группа сайтов (ID)" @@ -192,7 +193,7 @@ msgstr "Группа сайтов (ID)" #: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 #: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 #: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 -#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/ipam/filtersets.py:361 netbox/ipam/filtersets.py:981 #: netbox/virtualization/filtersets.py:65 #: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" @@ -262,8 +263,8 @@ msgstr "Сайт" #: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 #: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 #: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 -#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 -#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:240 +#: netbox/ipam/filtersets.py:371 netbox/ipam/filtersets.py:991 #: netbox/virtualization/filtersets.py:75 #: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" @@ -282,13 +283,13 @@ msgstr "ASN" #: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 #: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 -#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:245 msgid "Provider (ID)" msgstr "Провайдер (ID)" #: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 #: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 -#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:251 msgid "Provider (slug)" msgstr "Провайдер (подстрока)" @@ -317,8 +318,8 @@ msgstr "Тип канала связи (подстрока)" #: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 #: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 #: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 -#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 -#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/ipam/filtersets.py:234 netbox/ipam/filtersets.py:365 +#: netbox/ipam/filtersets.py:985 netbox/virtualization/filtersets.py:69 #: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Сайт (ID)" @@ -672,7 +673,7 @@ msgstr "Аккаунт провайдера" #: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 #: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 #: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 -#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:70 #: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 #: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 #: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 @@ -1107,7 +1108,7 @@ msgstr "Задание" #: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 #: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 #: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 -#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/filtersets.py:1001 netbox/ipam/forms/bulk_edit.py:493 #: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 #: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 #: netbox/ipam/tables/vlans.py:226 @@ -1547,7 +1548,7 @@ msgstr "Гарантированная скорость" #: netbox/circuits/tables/providers.py:82 #: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 #: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 -#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/modules.py:73 netbox/dcim/tables/power.py:39 #: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 #: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 #: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 @@ -1955,7 +1956,7 @@ msgstr "Фасады стоек" #: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 #: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 msgid "Power" -msgstr "Мощность" +msgstr "Электропитание" #: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 #: netbox/templates/core/inc/config_data.html:37 @@ -2945,7 +2946,7 @@ msgid "Parent site group (slug)" msgstr "Группа сайтов родителя (подстрока)" #: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 -#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 +#: netbox/ipam/filtersets.py:843 netbox/ipam/filtersets.py:995 msgid "Group (ID)" msgstr "Группа (ID)" @@ -3003,15 +3004,15 @@ msgstr "Тип стойки (ID)" #: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 #: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 -#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 -#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 +#: netbox/ipam/filtersets.py:383 netbox/ipam/filtersets.py:495 +#: netbox/ipam/filtersets.py:1005 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Роль (ID)" #: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 #: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 -#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 -#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:389 +#: netbox/ipam/filtersets.py:501 netbox/ipam/filtersets.py:1011 #: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Роль (подстрока)" @@ -3209,7 +3210,7 @@ msgstr "VDC (ID)" msgid "Device model" msgstr "модель устройства" -#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:634 #: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Интерфейс (ID)" @@ -3223,8 +3224,8 @@ msgid "Module bay (ID)" msgstr "Отсек для модулей (ID)" #: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 -#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 -#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/ipam/filtersets.py:613 netbox/ipam/filtersets.py:853 +#: netbox/ipam/filtersets.py:1117 netbox/virtualization/filtersets.py:161 #: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Устройство (ID)" @@ -3233,8 +3234,8 @@ msgstr "Устройство (ID)" msgid "Rack (name)" msgstr "Стойка (имя)" -#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 -#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:608 +#: netbox/ipam/filtersets.py:848 netbox/ipam/filtersets.py:1123 #: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Устройство (имя)" @@ -3286,9 +3287,9 @@ msgstr "Назначенный VID" #: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 #: netbox/dcim/forms/model_forms.py:1385 #: netbox/dcim/models/device_components.py:711 -#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 -#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 -#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:318 +#: netbox/ipam/filtersets.py:329 netbox/ipam/filtersets.py:485 +#: netbox/ipam/filtersets.py:586 netbox/ipam/filtersets.py:597 #: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 #: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 #: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 @@ -3315,19 +3316,19 @@ msgstr "Назначенный VID" msgid "VRF" msgstr "VRF" -#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 -#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 -#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:324 +#: netbox/ipam/filtersets.py:335 netbox/ipam/filtersets.py:491 +#: netbox/ipam/filtersets.py:592 netbox/ipam/filtersets.py:603 msgid "VRF (RD)" msgstr "VRF (RD)" -#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1032 #: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (ID)" #: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 -#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1038 #: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 #: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 #: netbox/templates/vpn/l2vpntermination.html:12 @@ -3421,7 +3422,7 @@ msgstr "Нерасторгнутый" #: netbox/dcim/filtersets.py:2239 msgid "Power panel (ID)" -msgstr "Панель питания (ID)" +msgstr "Распределительный щит (ID)" #: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 #: netbox/extras/forms/model_forms.py:567 @@ -3489,7 +3490,7 @@ msgstr "Часовой пояс" #: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 #: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 #: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 -#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:61 #: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 #: netbox/templates/dcim/devicetype.html:14 #: netbox/templates/dcim/inventoryitem.html:44 @@ -3740,7 +3741,7 @@ msgid "Device Type" msgstr "Тип устройства" #: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 -#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:66 #: netbox/templates/dcim/module.html:65 #: netbox/templates/dcim/modulebay.html:66 #: netbox/templates/dcim/moduletype.html:22 @@ -3848,7 +3849,7 @@ msgstr "Кластер" #: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 #: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 #: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 -#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/dcim/tables/modules.py:53 netbox/extras/forms/filtersets.py:321 #: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 #: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 #: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 @@ -3946,7 +3947,7 @@ msgstr "Домен" #: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 #: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 msgid "Power panel" -msgstr "Панель питания" +msgstr "Распределительный щит" #: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 #: netbox/dcim/forms/filtersets.py:1180 @@ -4096,15 +4097,15 @@ msgstr "VLAN без тегов" #: netbox/virtualization/forms/bulk_edit.py:256 #: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" -msgstr "VLAN с тегами" +msgstr "Тегированные VLAN-ы" #: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" -msgstr "" +msgstr "Добавить тегированные VLAN-ы" #: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" -msgstr "" +msgstr "Удалить тегированные VLAN-ы" #: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" @@ -4152,7 +4153,7 @@ msgstr "Коммутация 802.1Q" #: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" -msgstr "" +msgstr "Добавить/удалить" #: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" @@ -4230,7 +4231,7 @@ msgstr "Название назначенной роли" #: netbox/dcim/forms/bulk_import.py:264 msgid "Rack type model" -msgstr "" +msgstr "Модель типа стойки" #: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 #: netbox/dcim/forms/bulk_import.py:605 @@ -4239,11 +4240,11 @@ msgstr "Направление воздушного потока" #: netbox/dcim/forms/bulk_import.py:324 msgid "Width must be set if not specifying a rack type." -msgstr "" +msgstr "Если не указан тип стойки, необходимо задать ширину." #: netbox/dcim/forms/bulk_import.py:326 msgid "U height must be set if not specifying a rack type." -msgstr "" +msgstr "Если не указан тип стойки, необходимо задать высоту в юнитах." #: netbox/dcim/forms/bulk_import.py:334 msgid "Parent site" @@ -4596,7 +4597,7 @@ msgstr "Имя родительского сайта" #: netbox/dcim/forms/bulk_import.py:1370 msgid "Upstream power panel" -msgstr "Панель питания в восходящем направлении" +msgstr "Распределительный щит" #: netbox/dcim/forms/bulk_import.py:1400 msgid "Primary or redundant" @@ -4684,13 +4685,13 @@ msgstr "A {model} названный {name} уже существует" #: netbox/templates/dcim/powerpanel.html:19 #: netbox/templates/dcim/trace/powerpanel.html:4 msgid "Power Panel" -msgstr "Панель питания" +msgstr "Распределительный щит" #: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 #: netbox/templates/dcim/powerfeed.html:21 #: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" -msgstr "Подача питания" +msgstr "Кабель питания" #: netbox/dcim/forms/connections.py:81 msgid "Side" @@ -4905,6 +4906,10 @@ msgid "" "present, will be automatically replaced with the position value when " "creating a new module." msgstr "" +"Для массового создания поддерживаются алфавитно-цифровые диапазоны. " +"Смешанные имена и номера в одном диапазоне не поддерживаются (например: " +"[ge, xe]-0/0/[0-9]). Переменная {module} будет " +"автоматически заменена значением позиции при создании нового модуля." #: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" @@ -5629,7 +5634,7 @@ msgstr "VLAN без тегов" #: netbox/dcim/models/device_components.py:703 #: netbox/virtualization/models/virtualmachines.py:341 msgid "tagged VLANs" -msgstr "VLAN без тегов" +msgstr "тегированные VLAN" #: netbox/dcim/models/device_components.py:745 #: netbox/virtualization/models/virtualmachines.py:377 @@ -6325,11 +6330,11 @@ msgstr "При установке веса необходимо указать #: netbox/dcim/models/power.py:55 msgid "power panel" -msgstr "панель питания" +msgstr "распределительный щит" #: netbox/dcim/models/power.py:56 msgid "power panels" -msgstr "панели питания" +msgstr "распределительный щиты" #: netbox/dcim/models/power.py:70 #, python-brace-format @@ -6369,11 +6374,11 @@ msgstr "доступная мощность" #: netbox/dcim/models/power.py:164 msgid "power feed" -msgstr "подача питания" +msgstr "Кабель питания" #: netbox/dcim/models/power.py:165 msgid "power feeds" -msgstr "источники питания" +msgstr "кабели питания" #: netbox/dcim/models/power.py:179 #, python-brace-format @@ -6381,7 +6386,7 @@ msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " "are in different sites." msgstr "" -"Стойка {rack} ({rack_site}) и панель питания {powerpanel} " +"Стойка {rack} ({rack_site}) и распределительный щит {powerpanel} " "({powerpanel_site}) расположены на разных сайтах." #: netbox/dcim/models/power.py:190 @@ -6821,7 +6826,7 @@ msgstr "Отсеки для модулей" msgid "Inventory items" msgstr "Комплектующие" -#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:57 #: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Модульный отсек" @@ -7040,7 +7045,7 @@ msgstr "Отсеки для модулей" #: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 #: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" -msgstr "Источники питания" +msgstr "Кабели питания" #: netbox/dcim/tables/power.py:80 netbox/templates/dcim/powerfeed.html:99 msgid "Max Utilization" @@ -7550,12 +7555,12 @@ msgstr "Закладки" msgid "Show your personal bookmarks" msgstr "Покажите свои личные закладки" -#: netbox/extras/events.py:147 +#: netbox/extras/events.py:151 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Неизвестный тип действия для правила события: {action_type}" -#: netbox/extras/events.py:192 +#: netbox/extras/events.py:196 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "Невозможно импортировать конвейер событий {name} ошибка: {error}" @@ -9326,129 +9331,129 @@ msgstr "Экспорт L2VPN" msgid "Exporting L2VPN (identifier)" msgstr "Экспорт L2VPN (идентификатор)" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 #: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Префикс" #: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:223 msgid "RIR (ID)" msgstr "RIR (ID)" #: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:229 msgid "RIR (slug)" msgstr "RIR (подстрока)" -#: netbox/ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:287 msgid "Within prefix" msgstr "В префиксе" -#: netbox/ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:291 msgid "Within and including prefix" msgstr "В префиксе и включительно" -#: netbox/ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:295 msgid "Prefixes which contain this prefix or IP" msgstr "Префиксы, содержащие этот префикс или IP-адрес" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 #: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 #: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Длина маски" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Номер VLAN (1-4094)" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 +#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Адрес" -#: netbox/ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:481 msgid "Ranges which contain this prefix or IP" msgstr "Диапазоны, содержащие этот префикс или IP-адрес" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 msgid "Parent prefix" msgstr "Родительский префикс" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 +#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Виртуальная машина (имя)" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 +#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 #: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Виртуальная машина (ID)" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 #: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Интерфейс (имя)" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 #: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Интерфейс виртуальной машины (имя)" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Интерфейс виртуальной машины (ID)" -#: netbox/ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:650 msgid "FHRP group (ID)" msgstr "FHRP группа (ID)" -#: netbox/ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:654 msgid "Is assigned to an interface" msgstr "Присвоен интерфейсу" -#: netbox/ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:658 msgid "Is assigned" msgstr "Назначено" -#: netbox/ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:670 msgid "Service (ID)" msgstr "Сервис (ID)" -#: netbox/ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:675 msgid "NAT inside IP address (ID)" msgstr "Внутренний NAT IP-адрес (ID)" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Назначенный интерфейс" -#: netbox/ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1048 msgid "Assigned VM interface" msgstr "Назначенный интерфейс виртуальной машины" -#: netbox/ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1138 msgid "IP address (ID)" msgstr "IP-адрес (ID)" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP-адрес" -#: netbox/ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1169 msgid "Primary IPv4 (ID)" msgstr "Основной IPv4 (ID)" -#: netbox/ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1174 msgid "Primary IPv6 (ID)" msgstr "Основной IPv6 (ID)" @@ -9672,11 +9677,11 @@ msgstr "Сделайте этот IP-адрес основным для назн #: netbox/ipam/forms/bulk_import.py:330 msgid "Is out-of-band" -msgstr "" +msgstr "Внеполосный IP-адрес" #: netbox/ipam/forms/bulk_import.py:331 msgid "Designate this as the out-of-band IP address for the assigned device" -msgstr "" +msgstr "Назначьте это как внеполосный IP-адрес для указанного устройства" #: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" @@ -9686,11 +9691,11 @@ msgstr "" #: netbox/ipam/forms/bulk_import.py:375 msgid "No device specified; cannot set as out-of-band IP" -msgstr "" +msgstr "Устройство не указано; невозможно установить как внеполосный IP-адрес" #: netbox/ipam/forms/bulk_import.py:379 msgid "Cannot set out-of-band IP for virtual machines" -msgstr "" +msgstr "Невозможно установить внеполосный IP-адрес для виртуальных машин" #: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" @@ -9699,7 +9704,7 @@ msgstr "" #: netbox/ipam/forms/bulk_import.py:387 msgid "No interface specified; cannot set as out-of-band IP" -msgstr "" +msgstr "Интерфейс не указан; невозможно установить как внеполосный IP-адрес" #: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" @@ -9812,7 +9817,7 @@ msgstr "DNS-имя" #: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 #: netbox/netbox/navigation/menu.py:195 msgid "VLANs" -msgstr "VLAN" +msgstr "VLAN-ы" #: netbox/ipam/forms/filtersets.py:457 msgid "Contains VLAN ID" @@ -9876,7 +9881,7 @@ msgstr "Сделайте этот IP-адрес основным для устр #: netbox/ipam/forms/model_forms.py:314 msgid "Make this the out-of-band IP for the device" -msgstr "" +msgstr "Назначить внеполосным IP-адресом устройства" #: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" @@ -9889,10 +9894,13 @@ msgstr "IP-адрес можно присвоить только одному о #: netbox/ipam/forms/model_forms.py:398 msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" +"Невозможно переназначить основной IP-адрес родительского " +"устройства/виртуальной машины" #: netbox/ipam/forms/model_forms.py:402 msgid "Cannot reassign out-of-Band IP address for the parent device" msgstr "" +"Невозможно переназначить внеполосный IP-адрес родительскому устройству" #: netbox/ipam/forms/model_forms.py:412 msgid "" @@ -9906,6 +9914,8 @@ msgid "" "Only IP addresses assigned to a device interface can be designated as the " "out-of-band IP for a device." msgstr "" +"В качестве внеполосного IP-адреса устройства можно указать только IP-адреса," +" назначенные интерфейсу устройства." #: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" @@ -10304,11 +10314,15 @@ msgstr "Невозможно установить scope_id без scope_type." #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" +"Начальный идентификатор VLAN в диапазоне ({value}) не может быть меньше " +"{minimum}" #: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" +"Последний идентификатор VLAN в диапазоне ({value}) не может превышать " +"{maximum}" #: netbox/ipam/models/vlans.py:118 #, python-brace-format @@ -10316,6 +10330,8 @@ msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" +"Последний идентификатор VLAN в диапазоне должен быть больше или равен " +"начальному идентификатору VLAN ({range})" #: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." @@ -11169,7 +11185,7 @@ msgstr "Сети провайдеров" #: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" -msgstr "Панели питания" +msgstr "Распределительный щиты" #: netbox/netbox/navigation/menu.py:309 msgid "Configurations" @@ -12109,7 +12125,7 @@ msgstr "Ширина юнита по умолчанию" #: netbox/templates/core/inc/config_data.html:20 msgid "Power feeds" -msgstr "Источники питания" +msgstr "Кабели питания" #: netbox/templates/core/inc/config_data.html:23 msgid "Default voltage" @@ -12684,11 +12700,11 @@ msgstr "Скачать" #: netbox/templates/dcim/device/render_config.html:64 #: netbox/templates/virtualization/virtualmachine/render_config.html:64 msgid "Error rendering template" -msgstr "" +msgstr "Ошибка при отображении шаблона" #: netbox/templates/dcim/device/render_config.html:70 msgid "No configuration template has been assigned for this device." -msgstr "" +msgstr "Для этого устройства не назначен шаблон конфигурации." #: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" @@ -12842,7 +12858,7 @@ msgstr "Без тегов" #: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" -msgstr "VLAN не назначены" +msgstr "VLAN-ы не назначены" #: netbox/templates/dcim/inc/interface_vlans_table.html:44 #: netbox/templates/ipam/prefix_list.html:16 @@ -13013,7 +13029,7 @@ msgstr "Фаза электропитания" #: netbox/templates/dcim/powerpanel.html:72 msgid "Add Power Feeds" -msgstr "Добавить каналы питания" +msgstr "Добавить кабели питания" #: netbox/templates/dcim/powerport.html:44 msgid "Maximum Draw" @@ -13555,7 +13571,7 @@ msgstr "Повторить" #: netbox/templates/extras/script_list.html:133 #, python-format msgid "Could not load scripts from module %(module)s" -msgstr "" +msgstr "Не удалось загрузить скрипты из модуля %(module)s" #: netbox/templates/extras/script_list.html:141 msgid "No Scripts Found" @@ -14369,7 +14385,7 @@ msgstr "Добавить виртуальный диск" #: netbox/templates/virtualization/virtualmachine/render_config.html:70 msgid "No configuration template has been assigned for this virtual machine." -msgstr "" +msgstr "Для этой виртуальной машины не назначен шаблон конфигурации." #: netbox/templates/vpn/ikepolicy.html:10 #: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 @@ -15448,12 +15464,12 @@ msgstr "Память (МБ)" #: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" -msgstr "" +msgstr "Диск (МБ)" #: netbox/virtualization/forms/bulk_edit.py:334 #: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" -msgstr "" +msgstr "Размер (МБ)" #: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" @@ -15664,19 +15680,19 @@ msgstr "GRE" #: netbox/vpn/choices.py:39 msgid "WireGuard" -msgstr "" +msgstr "WireGuard" #: netbox/vpn/choices.py:40 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: netbox/vpn/choices.py:41 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: netbox/vpn/choices.py:42 msgid "PPTP" -msgstr "" +msgstr "PPTP" #: netbox/vpn/choices.py:64 msgid "Hub" diff --git a/requirements.txt b/requirements.txt index 08d06210c..88d642d79 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,28 +11,28 @@ django-redis==5.4.0 django-rich==1.13.0 django-rq==3.0 django-taggit==6.1.0 -django-tables2==2.7.0 +django-tables2==2.7.5 django-timezone-field==7.0 djangorestframework==3.15.2 drf-spectacular==0.28.0 drf-spectacular-sidecar==2024.12.1 feedparser==6.0.11 gunicorn==23.0.0 -Jinja2==3.1.4 +Jinja2==3.1.5 Markdown==3.7 mkdocs-material==9.5.49 mkdocstrings[python-legacy]==0.27.0 netaddr==1.3.0 nh3==0.2.20 -Pillow==11.0.0 +Pillow==11.1.0 psycopg[c,pool]==3.2.3 PyYAML==6.0.2 requests==2.32.3 -rq==2.0 +rq==2.1.0 social-auth-app-django==5.4.2 social-auth-core==4.5.4 -strawberry-graphql==0.254.0 -strawberry-graphql-django==0.52.0 +strawberry-graphql==0.256.1 +strawberry-graphql-django==0.53.1 svgwrite==1.4.3 tablib==3.7.0 tzdata==2024.2 From 83d62315cc72260b01cda6e5262ba23dded372f5 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Jan 2025 13:37:43 -0500 Subject: [PATCH 121/169] Closes #18153: Introduce virtual circuit types (#18300) * Closes #18153: Introduce virtual circuit types * Fix TagTestCase * Fix GraphQL API test --- docs/models/circuits/virtualcircuit.md | 4 + docs/models/circuits/virtualcircuittype.md | 13 +++ netbox/circuits/api/serializers_/circuits.py | 22 +++- netbox/circuits/api/urls.py | 1 + netbox/circuits/api/views.py | 10 ++ netbox/circuits/filtersets.py | 18 +++ netbox/circuits/forms/bulk_edit.py | 24 ++++ netbox/circuits/forms/bulk_import.py | 18 ++- netbox/circuits/forms/filtersets.py | 22 +++- netbox/circuits/forms/model_forms.py | 24 +++- netbox/circuits/graphql/filters.py | 7 ++ netbox/circuits/graphql/schema.py | 3 + netbox/circuits/graphql/types.py | 15 +++ .../migrations/0050_virtual_circuits.py | 32 ++++++ netbox/circuits/models/base.py | 23 ++++ netbox/circuits/models/circuits.py | 11 +- netbox/circuits/models/virtual_circuits.py | 19 +++ netbox/circuits/search.py | 11 ++ netbox/circuits/tables/circuits.py | 6 +- netbox/circuits/tables/virtual_circuits.py | 37 +++++- netbox/circuits/tests/test_api.py | 58 +++++++++- netbox/circuits/tests/test_filtersets.py | 81 +++++++++++-- netbox/circuits/tests/test_views.py | 108 +++++++++++++++--- netbox/circuits/urls.py | 3 + netbox/circuits/views.py | 61 ++++++++++ netbox/extras/tests/test_filtersets.py | 1 + netbox/netbox/navigation/menu.py | 1 + netbox/templates/circuits/virtualcircuit.html | 4 + .../circuits/virtualcircuittype.html | 55 +++++++++ 29 files changed, 643 insertions(+), 49 deletions(-) create mode 100644 docs/models/circuits/virtualcircuittype.md create mode 100644 netbox/circuits/models/base.py create mode 100644 netbox/templates/circuits/virtualcircuittype.html diff --git a/docs/models/circuits/virtualcircuit.md b/docs/models/circuits/virtualcircuit.md index c81c654c8..17328b87a 100644 --- a/docs/models/circuits/virtualcircuit.md +++ b/docs/models/circuits/virtualcircuit.md @@ -18,6 +18,10 @@ The [provider account](./provideraccount.md) with which the virtual circuit is a The unique identifier assigned to the virtual circuit by its [provider](./provider.md). +### Type + +The assigned [virtual circuit type](./virtualcircuittype.md). + ### Status The operational status of the virtual circuit. By default, the following statuses are available: diff --git a/docs/models/circuits/virtualcircuittype.md b/docs/models/circuits/virtualcircuittype.md new file mode 100644 index 000000000..69cb0c027 --- /dev/null +++ b/docs/models/circuits/virtualcircuittype.md @@ -0,0 +1,13 @@ +# Virtual Circuit Types + +Like physical [circuits](./circuit.md), [virtual circuits](./virtualcircuit.md) are classified by functional type. These types are completely customizable, and can help categorize circuits by function or technology. + +## Fields + +### Name + +A unique human-friendly name. + +### Slug + +A unique URL-friendly identifier. (This value can be used for filtering.) diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 4f3dc5f35..70b57a688 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -6,7 +6,7 @@ from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, Virtu from circuits.constants import CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, CIRCUIT_TERMINATION_TERMINATION_TYPES from circuits.models import ( Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType, VirtualCircuit, - VirtualCircuitTermination, + VirtualCircuitTermination, VirtualCircuitType, ) from dcim.api.serializers_.device_components import InterfaceSerializer from dcim.api.serializers_.cables import CabledObjectSerializer @@ -25,6 +25,7 @@ __all__ = ( 'CircuitTypeSerializer', 'VirtualCircuitSerializer', 'VirtualCircuitTerminationSerializer', + 'VirtualCircuitTypeSerializer', ) @@ -175,17 +176,32 @@ class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): return serializer(obj.member, nested=True, context=context).data +class VirtualCircuitTypeSerializer(NetBoxModelSerializer): + + # Related object counts + virtual_circuit_count = RelatedObjectCountField('virtual_circuits') + + class Meta: + model = VirtualCircuitType + fields = [ + 'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'tags', 'custom_fields', + 'created', 'last_updated', 'virtual_circuit_count', + ] + brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'virtual_circuit_count') + + class VirtualCircuitSerializer(NetBoxModelSerializer): provider_network = ProviderNetworkSerializer(nested=True) provider_account = ProviderAccountSerializer(nested=True, required=False, allow_null=True, default=None) + type = VirtualCircuitTypeSerializer(nested=True) status = ChoiceField(choices=CircuitStatusChoices, required=False) tenant = TenantSerializer(nested=True, required=False, allow_null=True) class Meta: model = VirtualCircuit fields = [ - 'id', 'url', 'display_url', 'display', 'cid', 'provider_network', 'provider_account', 'status', 'tenant', - 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'cid', 'provider_network', 'provider_account', 'type', 'status', + 'tenant', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'provider_network', 'cid', 'description') diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index 6f257f694..3be620bd2 100644 --- a/netbox/circuits/api/urls.py +++ b/netbox/circuits/api/urls.py @@ -19,6 +19,7 @@ router.register('circuit-group-assignments', views.CircuitGroupAssignmentViewSet # Virtual circuits router.register('virtual-circuits', views.VirtualCircuitViewSet) +router.register('virtual-circuit-types', views.VirtualCircuitTypeViewSet) router.register('virtual-circuit-terminations', views.VirtualCircuitTerminationViewSet) app_name = 'circuits-api' diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index 3b49075be..05540d9ad 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -95,6 +95,16 @@ class ProviderNetworkViewSet(NetBoxModelViewSet): filterset_class = filtersets.ProviderNetworkFilterSet +# +# Virtual circuit types +# + +class VirtualCircuitTypeViewSet(NetBoxModelViewSet): + queryset = VirtualCircuitType.objects.all() + serializer_class = serializers.VirtualCircuitTypeSerializer + filterset_class = filtersets.VirtualCircuitTypeFilterSet + + # # Virtual circuits # diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 956e91d76..964f69f83 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -25,6 +25,7 @@ __all__ = ( 'ProviderFilterSet', 'VirtualCircuitFilterSet', 'VirtualCircuitTerminationFilterSet', + 'VirtualCircuitTypeFilterSet', ) @@ -462,6 +463,13 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): ) +class VirtualCircuitTypeFilterSet(OrganizationalModelFilterSet): + + class Meta: + model = VirtualCircuitType + fields = ('id', 'name', 'slug', 'color', 'description') + + class VirtualCircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( field_name='provider_network__provider', @@ -489,6 +497,16 @@ class VirtualCircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet): queryset=ProviderNetwork.objects.all(), label=_('Provider network (ID)'), ) + type_id = django_filters.ModelMultipleChoiceFilter( + queryset=VirtualCircuitType.objects.all(), + label=_('Virtual circuit type (ID)'), + ) + type = django_filters.ModelMultipleChoiceFilter( + field_name='type__slug', + queryset=VirtualCircuitType.objects.all(), + to_field_name='slug', + label=_('Virtual circuit type (slug)'), + ) status = django_filters.MultipleChoiceFilter( choices=CircuitStatusChoices, null_value=None diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index b8e6094f9..8d6e8dec1 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -32,6 +32,7 @@ __all__ = ( 'ProviderNetworkBulkEditForm', 'VirtualCircuitBulkEditForm', 'VirtualCircuitTerminationBulkEditForm', + 'VirtualCircuitTypeBulkEditForm', ) @@ -297,6 +298,24 @@ class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): nullable_fields = ('priority',) +class VirtualCircuitTypeBulkEditForm(NetBoxModelBulkEditForm): + color = ColorField( + label=_('Color'), + required=False + ) + description = forms.CharField( + label=_('Description'), + max_length=200, + required=False + ) + + model = VirtualCircuitType + fieldsets = ( + FieldSet('color', 'description'), + ) + nullable_fields = ('color', 'description') + + class VirtualCircuitBulkEditForm(NetBoxModelBulkEditForm): provider_network = DynamicModelChoiceField( label=_('Provider network'), @@ -308,6 +327,11 @@ class VirtualCircuitBulkEditForm(NetBoxModelBulkEditForm): queryset=ProviderAccount.objects.all(), required=False ) + type = DynamicModelChoiceField( + label=_('Type'), + queryset=VirtualCircuitType.objects.all(), + required=False + ) status = forms.ChoiceField( label=_('Status'), choices=add_blank_choice(CircuitStatusChoices), diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index 428c636b3..43700d16b 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -24,6 +24,7 @@ __all__ = ( 'VirtualCircuitImportForm', 'VirtualCircuitTerminationImportForm', 'VirtualCircuitTerminationImportRelatedForm', + 'VirtualCircuitTypeImportForm', ) @@ -194,6 +195,14 @@ class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): fields = ('member_type', 'member_id', 'group', 'priority') +class VirtualCircuitTypeImportForm(NetBoxModelImportForm): + slug = SlugField() + + class Meta: + model = VirtualCircuitType + fields = ('name', 'slug', 'color', 'description', 'tags') + + class VirtualCircuitImportForm(NetBoxModelImportForm): provider_network = CSVModelChoiceField( label=_('Provider network'), @@ -208,6 +217,12 @@ class VirtualCircuitImportForm(NetBoxModelImportForm): help_text=_('Assigned provider account (if any)'), required=False ) + type = CSVModelChoiceField( + label=_('Type'), + queryset=VirtualCircuitType.objects.all(), + to_field_name='name', + help_text=_('Type of virtual circuit') + ) status = CSVChoiceField( label=_('Status'), choices=CircuitStatusChoices, @@ -224,7 +239,8 @@ class VirtualCircuitImportForm(NetBoxModelImportForm): class Meta: model = VirtualCircuit fields = [ - 'cid', 'provider_network', 'provider_account', 'status', 'tenant', 'description', 'comments', 'tags', + 'cid', 'provider_network', 'provider_account', 'type', 'status', 'tenant', 'description', 'comments', + 'tags', ] diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 1359b7a6a..aefc62655 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -27,6 +27,7 @@ __all__ = ( 'ProviderNetworkFilterForm', 'VirtualCircuitFilterForm', 'VirtualCircuitTerminationFilterForm', + 'VirtualCircuitTypeFilterForm', ) @@ -302,12 +303,26 @@ class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): tag = TagFilterField(model) +class VirtualCircuitTypeFilterForm(NetBoxModelFilterSetForm): + model = VirtualCircuitType + fieldsets = ( + FieldSet('q', 'filter_id', 'tag'), + FieldSet('color', name=_('Attributes')), + ) + tag = TagFilterField(model) + + color = ColorField( + label=_('Color'), + required=False + ) + + class VirtualCircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBoxModelFilterSetForm): model = VirtualCircuit fieldsets = ( FieldSet('q', 'filter_id', 'tag'), FieldSet('provider_id', 'provider_account_id', 'provider_network_id', name=_('Provider')), - FieldSet('status', name=_('Attributes')), + FieldSet('type', 'status', name=_('Attributes')), FieldSet('tenant_group_id', 'tenant_id', name=_('Tenant')), ) selector_fields = ('filter_id', 'q', 'provider_id', 'provider_network_id') @@ -332,6 +347,11 @@ class VirtualCircuitFilterForm(TenancyFilterForm, ContactModelFilterForm, NetBox }, label=_('Provider network') ) + type_id = DynamicModelMultipleChoiceField( + queryset=VirtualCircuitType.objects.all(), + required=False, + label=_('Type') + ) status = forms.MultipleChoiceField( label=_('Status'), choices=CircuitStatusChoices, diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 94ab4db78..6f8ab783d 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -31,6 +31,7 @@ __all__ = ( 'ProviderNetworkForm', 'VirtualCircuitForm', 'VirtualCircuitTerminationForm', + 'VirtualCircuitTypeForm', ) @@ -305,6 +306,20 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): self.instance.member = self.cleaned_data.get('member') +class VirtualCircuitTypeForm(NetBoxModelForm): + slug = SlugField() + + fieldsets = ( + FieldSet('name', 'slug', 'color', 'description', 'tags'), + ) + + class Meta: + model = VirtualCircuitType + fields = [ + 'name', 'slug', 'color', 'description', 'tags', + ] + + class VirtualCircuitForm(TenancyForm, NetBoxModelForm): provider_network = DynamicModelChoiceField( label=_('Provider network'), @@ -316,11 +331,16 @@ class VirtualCircuitForm(TenancyForm, NetBoxModelForm): queryset=ProviderAccount.objects.all(), required=False ) + type = DynamicModelChoiceField( + queryset=VirtualCircuitType.objects.all(), + quick_add=True + ) comments = CommentField() fieldsets = ( FieldSet( - 'provider_network', 'provider_account', 'cid', 'status', 'description', 'tags', name=_('Virtual circuit'), + 'provider_network', 'provider_account', 'cid', 'type', 'status', 'description', 'tags', + name=_('Virtual circuit'), ), FieldSet('tenant_group', 'tenant', name=_('Tenancy')), ) @@ -328,7 +348,7 @@ class VirtualCircuitForm(TenancyForm, NetBoxModelForm): class Meta: model = VirtualCircuit fields = [ - 'cid', 'provider_network', 'provider_account', 'status', 'description', 'tenant_group', 'tenant', + 'cid', 'provider_network', 'provider_account', 'type', 'status', 'description', 'tenant_group', 'tenant', 'comments', 'tags', ] diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index 36ddc25b2..7d066f428 100644 --- a/netbox/circuits/graphql/filters.py +++ b/netbox/circuits/graphql/filters.py @@ -14,6 +14,7 @@ __all__ = ( 'ProviderNetworkFilter', 'VirtualCircuitFilter', 'VirtualCircuitTerminationFilter', + 'VirtualCircuitTypeFilter', ) @@ -65,6 +66,12 @@ class ProviderNetworkFilter(BaseFilterMixin): pass +@strawberry_django.filter(models.VirtualCircuitType, lookups=True) +@autotype_decorator(filtersets.VirtualCircuitTypeFilterSet) +class VirtualCircuitTypeFilter(BaseFilterMixin): + pass + + @strawberry_django.filter(models.VirtualCircuit, lookups=True) @autotype_decorator(filtersets.VirtualCircuitFilterSet) class VirtualCircuitFilter(BaseFilterMixin): diff --git a/netbox/circuits/graphql/schema.py b/netbox/circuits/graphql/schema.py index 9c683ce45..63bd7bba6 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -37,3 +37,6 @@ class CircuitsQuery: virtual_circuit_termination: VirtualCircuitTerminationType = strawberry_django.field() virtual_circuit_termination_list: List[VirtualCircuitTerminationType] = strawberry_django.field() + + virtual_circuit_type: VirtualCircuitTypeType = strawberry_django.field() + virtual_circuit_type_list: List[VirtualCircuitTypeType] = strawberry_django.field() diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index 1cffc8cd4..564b5ed6f 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -21,6 +21,7 @@ __all__ = ( 'ProviderNetworkType', 'VirtualCircuitTerminationType', 'VirtualCircuitType', + 'VirtualCircuitTypeType', ) @@ -130,6 +131,17 @@ class CircuitGroupAssignmentType(TagsMixin, BaseObjectType): return self.member +@strawberry_django.type( + models.VirtualCircuitType, + fields='__all__', + filters=VirtualCircuitTypeFilter +) +class VirtualCircuitTypeType(OrganizationalObjectType): + color: str + + virtual_circuits: List[Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')]] + + @strawberry_django.type( models.VirtualCircuitTermination, fields='__all__', @@ -154,6 +166,9 @@ class VirtualCircuitTerminationType(CustomFieldsMixin, TagsMixin, ObjectType): class VirtualCircuitType(NetBoxObjectType): provider_network: ProviderNetworkType = strawberry_django.field(select_related=["provider_network"]) provider_account: ProviderAccountType | None + type: Annotated["VirtualCircuitTypeType", strawberry.lazy('circuits.graphql.types')] = strawberry_django.field( + select_related=["type"] + ) tenant: TenantType | None terminations: List[VirtualCircuitTerminationType] diff --git a/netbox/circuits/migrations/0050_virtual_circuits.py b/netbox/circuits/migrations/0050_virtual_circuits.py index eb451b4ec..9987b95ac 100644 --- a/netbox/circuits/migrations/0050_virtual_circuits.py +++ b/netbox/circuits/migrations/0050_virtual_circuits.py @@ -2,6 +2,7 @@ import django.db.models.deletion import taggit.managers from django.db import migrations, models +import utilities.fields import utilities.json @@ -14,6 +15,29 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='VirtualCircuitType', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ('custom_field_data', models.JSONField( + blank=True, + default=dict, + encoder=utilities.json.CustomFieldJSONEncoder + )), + ('name', models.CharField(max_length=100, unique=True)), + ('slug', models.SlugField(max_length=100, unique=True)), + ('description', models.CharField(blank=True, max_length=200)), + ('color', utilities.fields.ColorField(blank=True, max_length=6)), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'virtual circuit type', + 'verbose_name_plural': 'virtual circuit types', + 'ordering': ('name',), + }, + ), migrations.CreateModel( name='VirtualCircuit', fields=[ @@ -47,6 +71,14 @@ class Migration(migrations.Migration): ), ), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ( + 'type', + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name='virtual_circuits', + to='circuits.virtualcircuittype' + ) + ), ( 'tenant', models.ForeignKey( diff --git a/netbox/circuits/models/base.py b/netbox/circuits/models/base.py new file mode 100644 index 000000000..5b2a3c1b8 --- /dev/null +++ b/netbox/circuits/models/base.py @@ -0,0 +1,23 @@ +from django.utils.translation import gettext_lazy as _ + +from netbox.models import OrganizationalModel +from utilities.fields import ColorField + +__all__ = ( + 'BaseCircuitType', +) + + +class BaseCircuitType(OrganizationalModel): + """ + Abstract base model to represent a type of physical or virtual circuit. + Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named + "Long Haul," "Metro," or "Out-of-Band". + """ + color = ColorField( + verbose_name=_('color'), + blank=True + ) + + class Meta: + abstract = True diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 8a8e4bdf9..9c7714153 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -13,7 +13,7 @@ from netbox.models.mixins import DistanceMixin from netbox.models.features import ( ContactsMixin, CustomFieldsMixin, CustomLinksMixin, ExportTemplatesMixin, ImageAttachmentsMixin, TagsMixin, ) -from utilities.fields import ColorField +from .base import BaseCircuitType __all__ = ( 'Circuit', @@ -24,16 +24,11 @@ __all__ = ( ) -class CircuitType(OrganizationalModel): +class CircuitType(BaseCircuitType): """ Circuits can be organized by their functional role. For example, a user might wish to define CircuitTypes named "Long Haul," "Metro," or "Out-of-Band". """ - color = ColorField( - verbose_name=_('color'), - blank=True - ) - class Meta: ordering = ('name',) verbose_name = _('circuit type') @@ -64,7 +59,7 @@ class Circuit(ContactsMixin, ImageAttachmentsMixin, DistanceMixin, PrimaryModel) null=True ) type = models.ForeignKey( - to='CircuitType', + to='circuits.CircuitType', on_delete=models.PROTECT, related_name='circuits' ) diff --git a/netbox/circuits/models/virtual_circuits.py b/netbox/circuits/models/virtual_circuits.py index 04255cd0d..ff910549d 100644 --- a/netbox/circuits/models/virtual_circuits.py +++ b/netbox/circuits/models/virtual_circuits.py @@ -9,13 +9,26 @@ from django.utils.translation import gettext_lazy as _ from circuits.choices import * from netbox.models import ChangeLoggedModel, PrimaryModel from netbox.models.features import CustomFieldsMixin, CustomLinksMixin, TagsMixin +from .base import BaseCircuitType __all__ = ( 'VirtualCircuit', 'VirtualCircuitTermination', + 'VirtualCircuitType', ) +class VirtualCircuitType(BaseCircuitType): + """ + Like physical circuits, virtual circuits can be organized by their functional role. For example, a user might wish + to categorize virtual circuits by their technological nature or by product name. + """ + class Meta: + ordering = ('name',) + verbose_name = _('virtual circuit type') + verbose_name_plural = _('virtual circuit types') + + class VirtualCircuit(PrimaryModel): """ A virtual connection between two or more endpoints, delivered across one or more physical circuits. @@ -37,6 +50,11 @@ class VirtualCircuit(PrimaryModel): blank=True, null=True ) + type = models.ForeignKey( + to='circuits.VirtualCircuitType', + on_delete=models.PROTECT, + related_name='virtual_circuits' + ) status = models.CharField( verbose_name=_('status'), max_length=50, @@ -63,6 +81,7 @@ class VirtualCircuit(PrimaryModel): ) prerequisite_models = ( 'circuits.ProviderNetwork', + 'circuits.VirtualCircuitType', ) class Meta: diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index 80725c1b8..2ea11b7fd 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -100,3 +100,14 @@ class VirtualCircuitTerminationIndex(SearchIndex): ('description', 500), ) display_attrs = ('virtual_circuit', 'role', 'description') + + +@register_search +class VirtualCircuitTypeIndex(SearchIndex): + model = models.VirtualCircuitType + fields = ( + ('name', 100), + ('slug', 110), + ('description', 500), + ) + display_attrs = ('description',) diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index ed9ecde2e..9e59ec019 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -45,7 +45,7 @@ class CircuitTypeTable(NetBoxTable): 'pk', 'id', 'name', 'circuit_count', 'color', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions', ) - default_columns = ('pk', 'name', 'circuit_count', 'description', 'slug') + default_columns = ('pk', 'name', 'circuit_count', 'color', 'description') class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): @@ -61,6 +61,10 @@ class CircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): linkify=True, verbose_name=_('Account') ) + type = tables.Column( + verbose_name=_('Type'), + linkify=True + ) status = columns.ChoiceFieldColumn() termination_a = columns.TemplateColumn( template_code=CIRCUITTERMINATION_LINK, diff --git a/netbox/circuits/tables/virtual_circuits.py b/netbox/circuits/tables/virtual_circuits.py index b7617f297..67ac03d59 100644 --- a/netbox/circuits/tables/virtual_circuits.py +++ b/netbox/circuits/tables/virtual_circuits.py @@ -8,9 +8,34 @@ from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin __all__ = ( 'VirtualCircuitTable', 'VirtualCircuitTerminationTable', + 'VirtualCircuitTypeTable', ) +class VirtualCircuitTypeTable(NetBoxTable): + name = tables.Column( + linkify=True, + verbose_name=_('Name'), + ) + color = columns.ColorColumn() + tags = columns.TagColumn( + url_name='circuits:virtualcircuittype_list' + ) + virtual_circuit_count = columns.LinkedCountColumn( + viewname='circuits:virtualcircuit_list', + url_params={'type_id': 'pk'}, + verbose_name=_('Circuits') + ) + + class Meta(NetBoxTable.Meta): + model = VirtualCircuitType + fields = ( + 'pk', 'id', 'name', 'virtual_circuit_count', 'color', 'description', 'slug', 'tags', 'created', + 'last_updated', 'actions', + ) + default_columns = ('pk', 'name', 'virtual_circuit_count', 'color', 'description') + + class VirtualCircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): cid = tables.Column( linkify=True, @@ -29,6 +54,10 @@ class VirtualCircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable) linkify=True, verbose_name=_('Account') ) + type = tables.Column( + verbose_name=_('Type'), + linkify=True + ) status = columns.ChoiceFieldColumn() termination_count = columns.LinkedCountColumn( viewname='circuits:virtualcircuittermination_list', @@ -45,12 +74,12 @@ class VirtualCircuitTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable) class Meta(NetBoxTable.Meta): model = VirtualCircuit fields = ( - 'pk', 'id', 'cid', 'provider', 'provider_account', 'provider_network', 'status', 'tenant', 'tenant_group', - 'description', 'comments', 'tags', 'created', 'last_updated', + 'pk', 'id', 'cid', 'provider', 'provider_account', 'provider_network', 'type', 'status', 'tenant', + 'tenant_group', 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( - 'pk', 'cid', 'provider', 'provider_account', 'provider_network', 'status', 'tenant', 'termination_count', - 'description', + 'pk', 'cid', 'provider', 'provider_account', 'provider_network', 'type', 'status', 'tenant', + 'termination_count', 'description', ) diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 291a2596c..3b8280236 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -409,6 +409,38 @@ class ProviderNetworkTest(APIViewTestCases.APIViewTestCase): } +class VirtualCircuitTypeTest(APIViewTestCases.APIViewTestCase): + model = VirtualCircuitType + brief_fields = ['description', 'display', 'id', 'name', 'slug', 'url', 'virtual_circuit_count'] + create_data = ( + { + 'name': 'Virtual Circuit Type 4', + 'slug': 'virtual-circuit-type-4', + }, + { + 'name': 'Virtual Circuit Type 5', + 'slug': 'virtual-circuit-type-5', + }, + { + 'name': 'Virtual Circuit Type 6', + 'slug': 'virtual-circuit-type-6', + }, + ) + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + + virtual_circuit_types = ( + VirtualCircuitType(name='Virtual Circuit Type 1', slug='virtual-circuit-type-1'), + VirtualCircuitType(name='Virtual Circuit Type 2', slug='virtual-circuit-type-2'), + VirtualCircuitType(name='Virtual Circuit Type 3', slug='virtual-circuit-type-3'), + ) + VirtualCircuitType.objects.bulk_create(virtual_circuit_types) + + class VirtualCircuitTest(APIViewTestCases.APIViewTestCase): model = VirtualCircuit brief_fields = ['cid', 'description', 'display', 'id', 'provider_network', 'url'] @@ -421,21 +453,28 @@ class VirtualCircuitTest(APIViewTestCases.APIViewTestCase): provider = Provider.objects.create(name='Provider 1', slug='provider-1') provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + virtual_circuit_type = VirtualCircuitType.objects.create( + name='Virtual Circuit Type 1', + slug='virtual-circuit-type-1' + ) virtual_circuits = ( VirtualCircuit( provider_network=provider_network, provider_account=provider_account, + type=virtual_circuit_type, cid='Virtual Circuit 1' ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, + type=virtual_circuit_type, cid='Virtual Circuit 2' ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, + type=virtual_circuit_type, cid='Virtual Circuit 3' ), ) @@ -446,18 +485,21 @@ class VirtualCircuitTest(APIViewTestCases.APIViewTestCase): 'cid': 'Virtual Circuit 4', 'provider_network': provider_network.pk, 'provider_account': provider_account.pk, + 'type': virtual_circuit_type.pk, 'status': CircuitStatusChoices.STATUS_PLANNED, }, { 'cid': 'Virtual Circuit 5', 'provider_network': provider_network.pk, 'provider_account': provider_account.pk, + 'type': virtual_circuit_type.pk, 'status': CircuitStatusChoices.STATUS_PLANNED, }, { 'cid': 'Virtual Circuit 6', 'provider_network': provider_network.pk, 'provider_account': provider_account.pk, + 'type': virtual_circuit_type.pk, 'status': CircuitStatusChoices.STATUS_PLANNED, }, ] @@ -563,27 +605,35 @@ class VirtualCircuitTerminationTest(APIViewTestCases.APIViewTestCase): provider = Provider.objects.create(name='Provider 1', slug='provider-1') provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + virtual_circuit_type = VirtualCircuitType.objects.create( + name='Virtual Circuit Type 1', + slug='virtual-circuit-type-1' + ) virtual_circuits = ( VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 1' + cid='Virtual Circuit 1', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 2' + cid='Virtual Circuit 2', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 3' + cid='Virtual Circuit 3', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 4' + cid='Virtual Circuit 4', + type=virtual_circuit_type ), ) VirtualCircuit.objects.bulk_create(virtual_circuits) diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index d9a5c1bc2..b32abd34e 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -656,12 +656,12 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): Provider(name='Provider 2', slug='provider-2'), Provider(name='Provider 3', slug='provider-3'), )) - circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') + circuit_type = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') circuits = ( - Circuit(cid='Circuit 1', provider=providers[0], type=circuittype), - Circuit(cid='Circuit 2', provider=providers[1], type=circuittype), - Circuit(cid='Circuit 3', provider=providers[2], type=circuittype), + Circuit(cid='Circuit 1', provider=providers[0], type=circuit_type), + Circuit(cid='Circuit 2', provider=providers[1], type=circuit_type), + Circuit(cid='Circuit 3', provider=providers[2], type=circuit_type), ) Circuit.objects.bulk_create(circuits) @@ -672,18 +672,25 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): ) ProviderNetwork.objects.bulk_create(provider_networks) + virtual_circuit_type = VirtualCircuitType.objects.create( + name='Virtual Circuit Type 1', + slug='virtual-circuit-type-1' + ) virtual_circuits = ( VirtualCircuit( provider_network=provider_networks[0], - cid='Virtual Circuit 1' + cid='Virtual Circuit 1', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_networks[1], - cid='Virtual Circuit 2' + cid='Virtual Circuit 2', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_networks[2], - cid='Virtual Circuit 3' + cid='Virtual Circuit 3', + type=virtual_circuit_type ), ) VirtualCircuit.objects.bulk_create(virtual_circuits) @@ -837,6 +844,36 @@ class ProviderAccountTestCase(TestCase, ChangeLoggedFilterSetTests): self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) +class VirtualCircuitTypeTestCase(TestCase, ChangeLoggedFilterSetTests): + queryset = VirtualCircuitType.objects.all() + filterset = VirtualCircuitTypeFilterSet + + @classmethod + def setUpTestData(cls): + + VirtualCircuitType.objects.bulk_create(( + VirtualCircuitType(name='Virtual Circuit Type 1', slug='virtual-circuit-type-1', description='foobar1'), + VirtualCircuitType(name='Virtual Circuit Type 2', slug='virtual-circuit-type-2', description='foobar2'), + VirtualCircuitType(name='Virtual Circuit Type 3', slug='virtual-circuit-type-3'), + )) + + def test_q(self): + params = {'q': 'foobar1'} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_name(self): + params = {'name': ['Virtual Circuit Type 1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_slug(self): + params = {'slug': ['virtual-circuit-type-1']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 1) + + def test_description(self): + params = {'description': ['foobar1', 'foobar2']} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + + class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): queryset = VirtualCircuit.objects.all() filterset = VirtualCircuitFilterSet @@ -880,12 +917,20 @@ class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): ) ProviderNetwork.objects.bulk_create(provider_networks) + virtual_circuit_types = ( + VirtualCircuitType(name='Virtual Circuit Type 1', slug='virtual-circuit-type-1'), + VirtualCircuitType(name='Virtual Circuit Type 2', slug='virtual-circuit-type-2'), + VirtualCircuitType(name='Virtual Circuit Type 3', slug='virtual-circuit-type-3'), + ) + VirtualCircuitType.objects.bulk_create(virtual_circuit_types) + virutal_circuits = ( VirtualCircuit( provider_network=provider_networks[0], provider_account=provider_accounts[0], tenant=tenants[0], cid='Virtual Circuit 1', + type=virtual_circuit_types[0], status=CircuitStatusChoices.STATUS_PLANNED, description='virtualcircuit1', ), @@ -894,6 +939,7 @@ class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): provider_account=provider_accounts[1], tenant=tenants[1], cid='Virtual Circuit 2', + type=virtual_circuit_types[1], status=CircuitStatusChoices.STATUS_ACTIVE, description='virtualcircuit2', ), @@ -902,6 +948,7 @@ class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): provider_account=provider_accounts[2], tenant=tenants[2], cid='Virtual Circuit 3', + type=virtual_circuit_types[2], status=CircuitStatusChoices.STATUS_DEPROVISIONING, description='virtualcircuit3', ), @@ -933,6 +980,13 @@ class VirtualCircuitTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'provider_network_id': [provider_networks[0].pk, provider_networks[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_type(self): + virtual_circuit_types = VirtualCircuitType.objects.all()[:2] + params = {'type_id': [virtual_circuit_types[0].pk, virtual_circuit_types[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'type': [virtual_circuit_types[0].slug, virtual_circuit_types[1].slug]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_status(self): params = {'status': [CircuitStatusChoices.STATUS_ACTIVE, CircuitStatusChoices.STATUS_PLANNED]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) @@ -1029,22 +1083,29 @@ class VirtualCircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): ProviderAccount(provider=providers[2], account='Provider Account 3'), ) ProviderAccount.objects.bulk_create(provider_accounts) + virtual_circuit_type = VirtualCircuitType.objects.create( + name='Virtual Circuit Type 1', + slug='virtual-circuit-type-1' + ) virtual_circuits = ( VirtualCircuit( provider_network=provider_networks[0], provider_account=provider_accounts[0], - cid='Virtual Circuit 1' + cid='Virtual Circuit 1', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_networks[1], provider_account=provider_accounts[1], - cid='Virtual Circuit 2' + cid='Virtual Circuit 2', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_networks[2], provider_account=provider_accounts[2], - cid='Virtual Circuit 3' + cid='Virtual Circuit 3', + type=virtual_circuit_type ), ) VirtualCircuit.objects.bulk_create(virtual_circuits) diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index 56f874c1a..6ced9a958 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -543,6 +543,47 @@ class CircuitGroupAssignmentTestCase( } +class VirtualCircuitTypeTestCase(ViewTestCases.OrganizationalObjectViewTestCase): + model = VirtualCircuitType + + @classmethod + def setUpTestData(cls): + + virtual_circuit_types = ( + VirtualCircuitType(name='Virtual Circuit Type 1', slug='circuit-type-1'), + VirtualCircuitType(name='Virtual Circuit Type 2', slug='circuit-type-2'), + VirtualCircuitType(name='Virtual Circuit Type 3', slug='circuit-type-3'), + ) + VirtualCircuitType.objects.bulk_create(virtual_circuit_types) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'name': 'Virtual Circuit Type X', + 'slug': 'virtual-circuit-type-x', + 'description': 'A new virtual circuit type', + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "name,slug", + "Virtual Circuit Type 4,circuit-type-4", + "Virtual Circuit Type 5,circuit-type-5", + "Virtual Circuit Type 6,circuit-type-6", + ) + + cls.csv_update_data = ( + "id,name,description", + f"{virtual_circuit_types[0].pk},Virtual Circuit Type 7,New description7", + f"{virtual_circuit_types[1].pk},Virtual Circuit Type 8,New description8", + f"{virtual_circuit_types[2].pk},Virtual Circuit Type 9,New description9", + ) + + cls.bulk_edit_data = { + 'description': 'Foo', + } + + class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): model = VirtualCircuit @@ -566,22 +607,30 @@ class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): ProviderAccount(provider=provider, account='Provider Account 2'), ) ProviderAccount.objects.bulk_create(provider_accounts) + virtual_circuit_types = ( + VirtualCircuitType(name='Virtual Circuit Type 1', slug='virtual-circuit-type-1'), + VirtualCircuitType(name='Virtual Circuit Type 2', slug='virtual-circuit-type-2'), + ) + VirtualCircuitType.objects.bulk_create(virtual_circuit_types) virtual_circuits = ( VirtualCircuit( provider_network=provider_networks[0], provider_account=provider_accounts[0], - cid='Virtual Circuit 1' + cid='Virtual Circuit 1', + type=virtual_circuit_types[0] ), VirtualCircuit( provider_network=provider_networks[0], provider_account=provider_accounts[0], - cid='Virtual Circuit 2' + cid='Virtual Circuit 2', + type=virtual_circuit_types[0] ), VirtualCircuit( provider_network=provider_networks[0], provider_account=provider_accounts[0], - cid='Virtual Circuit 3' + cid='Virtual Circuit 3', + type=virtual_circuit_types[0] ), ) VirtualCircuit.objects.bulk_create(virtual_circuits) @@ -600,6 +649,7 @@ class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): 'cid': 'Virtual Circuit X', 'provider_network': provider_networks[1].pk, 'provider_account': provider_accounts[1].pk, + 'type': virtual_circuit_types[1].pk, 'status': CircuitStatusChoices.STATUS_PLANNED, 'description': 'A new virtual circuit', 'comments': 'Some comments', @@ -607,22 +657,41 @@ class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): } cls.csv_data = ( - "cid,provider_network,provider_account,status", - f"Virtual Circuit 4,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", - f"Virtual Circuit 5,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", - f"Virtual Circuit 6,Provider Network 1,Provider Account 1,{CircuitStatusChoices.STATUS_PLANNED}", + "cid,provider_network,provider_account,type,status", + ( + f"Virtual Circuit 4,Provider Network 1,Provider Account 1,{virtual_circuit_types[0].name}," + f"{CircuitStatusChoices.STATUS_PLANNED}" + ), + ( + f"Virtual Circuit 5,Provider Network 1,Provider Account 1,{virtual_circuit_types[0].name}," + f"{CircuitStatusChoices.STATUS_PLANNED}" + ), + ( + f"Virtual Circuit 6,Provider Network 1,Provider Account 1,{virtual_circuit_types[0].name}," + f"{CircuitStatusChoices.STATUS_PLANNED}" + ), ) cls.csv_update_data = ( - "id,cid,description,status", - f"{virtual_circuits[0].pk},Virtual Circuit A,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", - f"{virtual_circuits[1].pk},Virtual Circuit B,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", - f"{virtual_circuits[2].pk},Virtual Circuit C,New description,{CircuitStatusChoices.STATUS_DECOMMISSIONED}", + "id,cid,description,type,status", + ( + f"{virtual_circuits[0].pk},Virtual Circuit A,New description,{virtual_circuit_types[1].name}," + f"{CircuitStatusChoices.STATUS_DECOMMISSIONED}" + ), + ( + f"{virtual_circuits[1].pk},Virtual Circuit B,New description,{virtual_circuit_types[1].name}," + f"{CircuitStatusChoices.STATUS_DECOMMISSIONED}" + ), + ( + f"{virtual_circuits[2].pk},Virtual Circuit C,New description,{virtual_circuit_types[1].name}," + f"{CircuitStatusChoices.STATUS_DECOMMISSIONED}" + ), ) cls.bulk_edit_data = { 'provider_network': provider_networks[1].pk, 'provider_account': provider_accounts[1].pk, + 'type': virtual_circuit_types[1].pk, 'status': CircuitStatusChoices.STATUS_DECOMMISSIONED, 'description': 'New description', 'comments': 'New comments', @@ -636,6 +705,7 @@ class VirtualCircuitTestCase(ViewTestCases.PrimaryObjectViewTestCase): {{ "cid": "Virtual Circuit 7", "provider_network": "Provider Network 1", + "type": "Virtual Circuit Type 1", "status": "active", "terminations": [ {{ @@ -774,27 +844,35 @@ class VirtualCircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase) provider = Provider.objects.create(name='Provider 1', slug='provider-1') provider_network = ProviderNetwork.objects.create(provider=provider, name='Provider Network 1') provider_account = ProviderAccount.objects.create(provider=provider, account='Provider Account 1') + virtual_circuit_type = VirtualCircuitType.objects.create( + name='Virtual Circuit Type 1', + slug='virtual-circuit-type-1' + ) virtual_circuits = ( VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 1' + cid='Virtual Circuit 1', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 2' + cid='Virtual Circuit 2', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 3' + cid='Virtual Circuit 3', + type=virtual_circuit_type ), VirtualCircuit( provider_network=provider_network, provider_account=provider_account, - cid='Virtual Circuit 4' + cid='Virtual Circuit 4', + type=virtual_circuit_type ), ) VirtualCircuit.objects.bulk_create(virtual_circuits) diff --git a/netbox/circuits/urls.py b/netbox/circuits/urls.py index 49eaa3910..90e9e511f 100644 --- a/netbox/circuits/urls.py +++ b/netbox/circuits/urls.py @@ -42,6 +42,9 @@ urlpatterns = [ path('virtual-circuits/delete/', views.VirtualCircuitBulkDeleteView.as_view(), name='virtualcircuit_bulk_delete'), path('virtual-circuits//', include(get_model_urls('circuits', 'virtualcircuit'))), + path('virtual-circuit-types/', include(get_model_urls('circuits', 'virtualcircuittype', detail=False))), + path('virtual-circuit-types//', include(get_model_urls('circuits', 'virtualcircuittype'))), + # Virtual circuit terminations path( 'virtual-circuit-terminations/', diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 09f79789e..3bd81c33a 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -579,6 +579,67 @@ class CircuitGroupAssignmentBulkDeleteView(generic.BulkDeleteView): table = tables.CircuitGroupAssignmentTable +# +# Virtual circuit Types +# + +@register_model_view(VirtualCircuitType, 'list', path='', detail=False) +class VirtualCircuitTypeListView(generic.ObjectListView): + queryset = VirtualCircuitType.objects.annotate( + virtual_circuit_count=count_related(VirtualCircuit, 'type') + ) + filterset = filtersets.VirtualCircuitTypeFilterSet + filterset_form = forms.VirtualCircuitTypeFilterForm + table = tables.VirtualCircuitTypeTable + + +@register_model_view(VirtualCircuitType) +class VirtualCircuitTypeView(GetRelatedModelsMixin, generic.ObjectView): + queryset = VirtualCircuitType.objects.all() + + def get_extra_context(self, request, instance): + return { + 'related_models': self.get_related_models(request, instance), + } + + +@register_model_view(VirtualCircuitType, 'add', detail=False) +@register_model_view(VirtualCircuitType, 'edit') +class VirtualCircuitTypeEditView(generic.ObjectEditView): + queryset = VirtualCircuitType.objects.all() + form = forms.VirtualCircuitTypeForm + + +@register_model_view(VirtualCircuitType, 'delete') +class VirtualCircuitTypeDeleteView(generic.ObjectDeleteView): + queryset = VirtualCircuitType.objects.all() + + +@register_model_view(VirtualCircuitType, 'bulk_import', detail=False) +class VirtualCircuitTypeBulkImportView(generic.BulkImportView): + queryset = VirtualCircuitType.objects.all() + model_form = forms.VirtualCircuitTypeImportForm + + +@register_model_view(VirtualCircuitType, 'bulk_edit', path='edit', detail=False) +class VirtualCircuitTypeBulkEditView(generic.BulkEditView): + queryset = VirtualCircuitType.objects.annotate( + circuit_count=count_related(Circuit, 'type') + ) + filterset = filtersets.VirtualCircuitTypeFilterSet + table = tables.VirtualCircuitTypeTable + form = forms.VirtualCircuitTypeBulkEditForm + + +@register_model_view(VirtualCircuitType, 'bulk_delete', path='delete', detail=False) +class VirtualCircuitTypeBulkDeleteView(generic.BulkDeleteView): + queryset = VirtualCircuitType.objects.annotate( + circuit_count=count_related(Circuit, 'type') + ) + filterset = filtersets.VirtualCircuitTypeFilterSet + table = tables.VirtualCircuitTypeTable + + # # Virtual circuits # diff --git a/netbox/extras/tests/test_filtersets.py b/netbox/extras/tests/test_filtersets.py index c94e36e4b..cf914e665 100644 --- a/netbox/extras/tests/test_filtersets.py +++ b/netbox/extras/tests/test_filtersets.py @@ -1170,6 +1170,7 @@ class TagTestCase(TestCase, ChangeLoggedFilterSetTests): 'virtualchassis', 'virtualcircuit', 'virtualcircuittermination', + 'virtualcircuittype', 'virtualdevicecontext', 'virtualdisk', 'virtualmachine', diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index 559c2860b..9148caa8e 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -286,6 +286,7 @@ CIRCUITS_MENU = Menu( label=_('Virtual Circuits'), items=( get_model_item('circuits', 'virtualcircuit', _('Virtual Circuits')), + get_model_item('circuits', 'virtualcircuittype', _('Virtual Circuit Types')), get_model_item('circuits', 'virtualcircuittermination', _('Virtual Circuit Terminations')), ), ), diff --git a/netbox/templates/circuits/virtualcircuit.html b/netbox/templates/circuits/virtualcircuit.html index 20fad6af2..8fac4a04e 100644 --- a/netbox/templates/circuits/virtualcircuit.html +++ b/netbox/templates/circuits/virtualcircuit.html @@ -35,6 +35,10 @@ {% trans "Circuit ID" %} {{ object.cid }} + + {% trans "Type" %} + {{ object.type|linkify }} + {% trans "Status" %} {% badge object.get_status_display bg_color=object.get_status_color %} diff --git a/netbox/templates/circuits/virtualcircuittype.html b/netbox/templates/circuits/virtualcircuittype.html new file mode 100644 index 000000000..594d9ef22 --- /dev/null +++ b/netbox/templates/circuits/virtualcircuittype.html @@ -0,0 +1,55 @@ +{% extends 'generic/object.html' %} +{% load helpers %} +{% load plugins %} +{% load render_table from django_tables2 %} +{% load i18n %} + +{% block extra_controls %} + {% if perms.circuits.add_virtualcircuit %} + + {% trans "Add Virtual Circuit" %} + + {% endif %} +{% endblock extra_controls %} + +{% block content %} +
    +
    +
    +

    {% trans "Virtual Circuit Type" %}

    + + + + + + + + + + + + + +
    {% trans "Name" %}{{ object.name }}
    {% trans "Description" %}{{ object.description|placeholder }}
    {% trans "Color" %} + {% if object.color %} +   + {% else %} + {{ ''|placeholder }} + {% endif %} +
    +
    + {% include 'inc/panels/tags.html' %} + {% plugin_left_page object %} +
    +
    + {% include 'inc/panels/related_objects.html' %} + {% include 'inc/panels/custom_fields.html' %} + {% plugin_right_page object %} +
    +
    +
    +
    + {% plugin_full_width_page object %} +
    +
    +{% endblock %} From b7610971c0a53ac1841131a7fa12d0bc1812ac43 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Jan 2025 15:29:03 -0500 Subject: [PATCH 122/169] Closes #13366: Update documentation for `main` branch (#18309) * Closes #13366: Update documentation for main branch * Clarify wording --- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/close-stale-issues.yml | 2 +- README.md | 6 +++--- docs/development/getting-started.md | 12 ++++------- docs/development/git-cheat-sheet.md | 4 ++-- docs/development/index.md | 9 ++++---- docs/development/release-checklist.md | 27 ++++++++++++++++-------- docs/development/translations.md | 4 ++-- docs/installation/3-netbox.md | 20 ++++++++++-------- docs/installation/upgrading.md | 27 +++++++++++------------- 10 files changed, 58 insertions(+), 55 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index efbf38932..5b18f4525 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,7 +2,7 @@ blank_issues_enabled: false contact_links: - name: 📖 Contributing Policy - url: https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md + url: https://github.com/netbox-community/netbox/blob/main/CONTRIBUTING.md about: "Please read through our contributing policy before opening an issue or pull request." - name: ❓ Discussion url: https://github.com/netbox-community/netbox/discussions diff --git a/.github/workflows/close-stale-issues.yml b/.github/workflows/close-stale-issues.yml index 1e0e193df..89b3d5f9a 100644 --- a/.github/workflows/close-stale-issues.yml +++ b/.github/workflows/close-stale-issues.yml @@ -38,7 +38,7 @@ jobs: issues may receive direct feedback. **Do not** attempt to circumvent this process by "bumping" the issue; doing so will result in its immediate closure and you may be barred from participating in any future discussions. Please see - our [contributing guide](https://github.com/netbox-community/netbox/blob/develop/CONTRIBUTING.md). + our [contributing guide](https://github.com/netbox-community/netbox/blob/main/CONTRIBUTING.md). # Pull request parameters close-pr-message: > diff --git a/README.md b/README.md index e3829c2cc..3a29a6fd2 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@
    - NetBox logo + NetBox logo

    The cornerstone of every automated network

    Latest release - License + License Contributors GitHub stars Languages supported - CI status + CI status

    NetBox Community | NetBox Cloud | diff --git a/docs/development/getting-started.md b/docs/development/getting-started.md index 6e425d5a3..0b77bfd4d 100644 --- a/docs/development/getting-started.md +++ b/docs/development/getting-started.md @@ -37,16 +37,12 @@ CHANGELOG.md CONTRIBUTING.md LICENSE.txt netbox README.md scri ### 2. Create a New Branch -The NetBox project utilizes three persistent git branches to track work: +The NetBox project utilizes two persistent git branches to track work: -* `master` - Serves as a snapshot of the current stable release -* `develop` - All development on the upcoming stable (patch) release occurs here -* `feature` - Tracks work on an upcoming minor release +* `main` - All development on the upcoming stable (patch) release occurs here. Releases are published from this branch. +* `feature` - All work planned for the upcoming minor release is done here. -Typically, you'll base pull requests off of the `develop` branch, or off of `feature` if you're working on a new major release. For example, assume that the current NetBox release is v3.3.5. Work applied to the `develop` branch will appear in v3.3.6, and work done under the `feature` branch will be included in the next minor release (v3.4.0). - -!!! warning - **Never** merge pull requests into the `master` branch: This branch only ever merges pull requests from the `develop` branch, to effect a new release. +Typically, you'll base pull requests off of the `main` branch, or off of `feature` if you're working on the upcoming minor or major release. For example, assume that the current NetBox release is v4.2.3. Work applied to the `main` branch will appear in v4.2.4, and work done under the `feature` branch will be included in the next minor release (v4.3.0). To create a new branch, first ensure that you've checked out the desired base branch, then run: diff --git a/docs/development/git-cheat-sheet.md b/docs/development/git-cheat-sheet.md index 35b8e90b5..794b25c65 100644 --- a/docs/development/git-cheat-sheet.md +++ b/docs/development/git-cheat-sheet.md @@ -128,7 +128,7 @@ Fast-forward ``` !!! warning "Avoid Merging Remote Branches" - You generally want to avoid merging branches that exist on the remote (upstream) repository, such as `develop` and `feature`: Merges into these branches should be done via a pull request on GitHub. Only merge branches when it is necessary to consolidate work you've done locally. + You generally want to avoid merging branches that exist on the remote (upstream) repository, namely `main` and `feature`: Merges into these branches should be done via a pull request on GitHub. Only merge branches when it is necessary to consolidate work you've done locally. ### Show Pending Changes @@ -196,7 +196,7 @@ index 93e125079..4344fb514 100644 +and here too +

    - NetBox logo + NetBox logo
    diff --git a/foo.py b/foo.py new file mode 100644 diff --git a/docs/development/index.md b/docs/development/index.md index 0d570abe6..09489ebdd 100644 --- a/docs/development/index.md +++ b/docs/development/index.md @@ -8,11 +8,10 @@ NetBox and many of its related projects are maintained on [GitHub](https://githu ![GitHub](../media/development/github.png) -There are three permanent branches in the repository: +There are two permanent branches in the repository: -* `master` - The current stable release. Individual changes should never be pushed directly to this branch, but rather merged from `develop`. -* `develop` - Active development for the upcoming patch release. Pull requests will typically be based on this branch unless they introduce breaking changes that must be deferred until the next minor release. -* `feature` - New feature work to be introduced in the next minor release (e.g. from v3.3 to v3.4). +* `main` - Active development for the upcoming patch release. Pull requests will typically be based on this branch unless they introduce breaking changes that must be deferred until the next minor release. +* `feature` - New feature work to be introduced in the next minor release (e.g. from v4.2 to v4.3). NetBox components are arranged into Django apps. Each app holds the models, views, and other resources relevant to a particular function: @@ -57,4 +56,4 @@ NetBox follows the [benevolent dictator](http://oss-watch.ac.uk/resources/benevo ## Licensing -The entire NetBox project is licensed as open source under the [Apache 2.0 license](https://github.com/netbox-community/netbox/blob/master/LICENSE.txt). This is a very permissive license which allows unlimited redistribution of all code within the project. Note that all submissions to the project are subject to the same license. +The entire NetBox project is licensed as open source under the [Apache 2.0 license](https://github.com/netbox-community/netbox/blob/main/LICENSE.txt). This is a very permissive license which allows unlimited redistribution of all code within the project. Note that all submissions to the project are subject to the same license. diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index 4e5fdeca8..557d01671 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -43,9 +43,9 @@ Follow these instructions to perform a new installation of NetBox in a temporary Upgrading from a previous version typically involves database migrations, which must work without errors. Supported upgrade paths include from one minor version to another within the same major version (i.e. 4.0 to 4.1), as well as from the latest patch version of the previous minor version (i.e. 3.7 to 4.0 or to 4.1). Prior to release, test all these supported paths by loading demo data from the source version and performing a `./manage.py migrate`. -### Merge the Release Branch +### Merge the `feature` Branch -Submit a pull request to merge the `feature` branch into the `develop` branch in preparation for its release. Once it has been merged, continue with the section for patch releases below. +Submit a pull request to merge the `feature` branch into the `main` branch in preparation for its release. Once it has been merged, continue with the section for patch releases below. ### Rebuild Demo Data (After Release) @@ -55,6 +55,15 @@ After the release of a new minor version, generate a new demo data snapshot comp ## Patch Releases +### Create a Release Branch + +Begin by creating a new branch (based off of `main`) to effect the release. This will comprise the changes listed below. + +``` +git checkout main +git checkout -B release-vX.Y.Z +``` + ### Notify netbox-docker Project of Any Relevant Changes Notify the [`netbox-docker`](https://github.com/netbox-community/netbox-docker) maintainers (in **#netbox-docker**) of any changes that may be relevant to their build process, including: @@ -111,25 +120,25 @@ Then, compile these portable (`.po`) files for use in the application: * Update the example version numbers in the feature request and bug report templates under `.github/ISSUE_TEMPLATES/`. * Replace the "FUTURE" placeholder in the release notes with the current date. -Commit these changes to the `develop` branch and push upstream. +Commit these changes to the `main` branch and push upstream. ### Verify CI Build Status -Ensure that continuous integration testing on the `develop` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release. +Ensure that continuous integration testing on the `main` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release. ### Submit a Pull Request -Submit a pull request titled **"Release vX.Y.Z"** to merge the `develop` branch into `master`. Copy the documented release notes into the pull request's body. +Submit a pull request titled **"Release vX.Y.Z"** to merge the current release branch (e.g. `release-vX.Y.Z`) into `main`. Copy the documented release notes into the pull request's body. -Once CI has completed on the PR, merge it. This effects a new release in the `master` branch. +Once CI has completed and a colleague has reviewed the PR, merge it. This effects a new release in the `main` branch. ### Create a New Release Create a [new release](https://github.com/netbox-community/netbox/releases/new) on GitHub with the following parameters. -* **Tag:** Current version (e.g. `v3.3.1`) -* **Target:** `master` -* **Title:** Version and date (e.g. `v3.3.1 - 2022-08-25`) +* **Tag:** Current version (e.g. `v4.2.1`) +* **Target:** `main` +* **Title:** Version and date (e.g. `v4.2.1 - 2025-01-17`) * **Description:** Copy from the pull request body, then promote the `###` headers to `##` ones Once created, the release will become available for users to install. diff --git a/docs/development/translations.md b/docs/development/translations.md index 43733c6d1..de8545b97 100644 --- a/docs/development/translations.md +++ b/docs/development/translations.md @@ -14,10 +14,10 @@ To update the English `.po` file from which all translations are derived, use th ./manage.py makemessages -l en -i "project-static/*" ``` -Then, commit the change and push to the `develop` branch on GitHub. Any new strings will appear for translation on Transifex automatically. +Then, commit the change and push to the `main` branch on GitHub. Any new strings will appear for translation on Transifex automatically. !!! note - It is typically not necessary to update source strings manually, as this is done nightly by a [GitHub action](https://github.com/netbox-community/netbox/blob/develop/.github/workflows/update-translation-strings.yml). + It is typically not necessary to update source strings manually, as this is done nightly by a [GitHub action](https://github.com/netbox-community/netbox/blob/main/.github/workflows/update-translation-strings.yml). ## Updating Translated Strings diff --git a/docs/installation/3-netbox.md b/docs/installation/3-netbox.md index 9a143319d..60d60d4f0 100644 --- a/docs/installation/3-netbox.md +++ b/docs/installation/3-netbox.md @@ -29,7 +29,7 @@ python3 -V ## Download NetBox -This documentation provides two options for installing NetBox: from a downloadable archive, or from the git repository. Installing from a package (option A below) requires manually fetching and extracting the archive for every future update, whereas installation via git (option B) allows for seamless upgrades by re-pulling the `master` branch. +This documentation provides two options for installing NetBox: from a downloadable archive, or from the git repository. Installing from a package (option A below) requires manually fetching and extracting the archive for every future update, whereas installation via git (option B) allows for seamless upgrades by checking out the latest release tag. ### Option A: Download a Release Archive @@ -67,16 +67,13 @@ If `git` is not already installed, install it: sudo yum install -y git ``` -Next, clone the **master** branch of the NetBox GitHub repository into the current directory. (This branch always holds the current stable release.) +Next, clone the git repository: ```no-highlight -sudo git clone -b master --depth 1 https://github.com/netbox-community/netbox.git . +sudo git clone https://github.com/netbox-community/netbox.git . ``` -!!! note - The `git clone` command above utilizes a "shallow clone" to retrieve only the most recent commit. If you need to download the entire history, omit the `--depth 1` argument. - -The `git clone` command should generate output similar to the following: +This command should generate output similar to the following: ``` Cloning into '.'... @@ -88,8 +85,13 @@ Receiving objects: 100% (996/996), 4.26 MiB | 9.81 MiB/s, done. Resolving deltas: 100% (148/148), done. ``` -!!! note - Installation via git also allows you to easily try out different versions of NetBox. To check out a [specific NetBox release](https://github.com/netbox-community/netbox/releases), use the `git checkout` command with the desired release tag. For example, `git checkout v3.0.8`. +Finally, check out the tag for the desired release. You can find these on our [releases page](https://github.com/netbox-community/netbox/releases). Replace `vX.Y.Z` with your selected release tag below. + +``` +sudo git checkout vX.Y.Z +``` + +Using this installation method enables easy upgrades in the future by simply checking out the latest release tag. ## Create the NetBox System User diff --git a/docs/installation/upgrading.md b/docs/installation/upgrading.md index 6093b226e..5b844f1c3 100644 --- a/docs/installation/upgrading.md +++ b/docs/installation/upgrading.md @@ -25,10 +25,10 @@ NetBox requires the following dependencies: ## 3. Install the Latest Release -As with the initial installation, you can upgrade NetBox by either downloading the latest release package or by cloning the `master` branch of the git repository. +As with the initial installation, you can upgrade NetBox by either downloading the latest release package or by checking out the latest production release from the git repository. !!! warning - Use the same method as you used to install NetBox originally + Use the same method as you used to install NetBox originally. If you are not sure how NetBox was installed originally, check with this command: @@ -36,10 +36,7 @@ If you are not sure how NetBox was installed originally, check with this command ls -ld /opt/netbox /opt/netbox/.git ``` -If NetBox was installed from a release package, then `/opt/netbox` will be a -symlink pointing to the current version, and `/opt/netbox/.git` will not -exist. If it was installed from git, then `/opt/netbox` and -`/opt/netbox/.git` will both exist as normal directories. +If NetBox was installed from a release package, then `/opt/netbox` will be a symlink pointing to the current version, and `/opt/netbox/.git` will not exist. If it was installed from git, then `/opt/netbox` and `/opt/netbox/.git` will both exist as normal directories. ### Option A: Download a Release @@ -84,20 +81,20 @@ If you followed the original installation guide to set up gunicorn, be sure to c sudo cp /opt/netbox-$OLDVER/gunicorn.py /opt/netbox/ ``` -### Option B: Clone the Git Repository +### Option B: Check Out a Git Release -This guide assumes that NetBox is installed at `/opt/netbox`. Pull down the most recent iteration of the master branch: +This guide assumes that NetBox is installed at `/opt/netbox`. First, determine the latest release either by visiting our [releases page](https://github.com/netbox-community/netbox/releases) or by running the following `git` commands: -```no-highlight -cd /opt/netbox -sudo git checkout master -sudo git pull origin master +``` +sudo git fetch --tags +git describe --tags $(git rev-list --tags --max-count=1) ``` -!!! info "Checking out an older release" - If you need to upgrade to an older version rather than the current stable release, you can check out any valid [git tag](https://github.com/netbox-community/netbox/tags), each of which represents a release. For example, to checkout the code for NetBox v2.11.11, do: +Check out the desired release by specifying its tag: - sudo git checkout v2.11.11 +``` +sudo git checkout v4.2.0 +``` ## 4. Run the Upgrade Script From 9d82a668a4a8a2762d8f1f6a9754234a99888313 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Jan 2025 15:54:16 -0500 Subject: [PATCH 123/169] Release v4.2.0 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- docs/development/release-checklist.md | 8 +- docs/release-notes/version-4.2.md | 5 +- mkdocs.yml | 1 + .../dist/graphiql/graphiql.min.js | 45260 +++++++++------- netbox/project-static/dist/netbox.js | Bin 390582 -> 390886 bytes netbox/project-static/dist/netbox.js.map | Bin 525040 -> 525356 bytes .../netbox-graphiql/package.json | 6 +- netbox/project-static/package.json | 4 +- netbox/project-static/yarn.lock | 66 +- netbox/translations/fr/LC_MESSAGES/django.mo | Bin 237343 -> 237945 bytes netbox/translations/fr/LC_MESSAGES/django.po | 244 +- requirements.txt | 2 +- 14 files changed, 25465 insertions(+), 20135 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index cb39ae9be..7cb6057ea 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.1.11 + placeholder: v4.2.0 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index e42ff3045..e2145543d 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.1.11 + placeholder: v4.2.0 validations: required: true - type: dropdown diff --git a/docs/development/release-checklist.md b/docs/development/release-checklist.md index 557d01671..c74fcf8f6 100644 --- a/docs/development/release-checklist.md +++ b/docs/development/release-checklist.md @@ -120,15 +120,9 @@ Then, compile these portable (`.po`) files for use in the application: * Update the example version numbers in the feature request and bug report templates under `.github/ISSUE_TEMPLATES/`. * Replace the "FUTURE" placeholder in the release notes with the current date. -Commit these changes to the `main` branch and push upstream. - -### Verify CI Build Status - -Ensure that continuous integration testing on the `main` branch is completing successfully. If it fails, take action to correct the failure before proceeding with the release. - ### Submit a Pull Request -Submit a pull request titled **"Release vX.Y.Z"** to merge the current release branch (e.g. `release-vX.Y.Z`) into `main`. Copy the documented release notes into the pull request's body. +Commit the above changes and submit a pull request titled **"Release vX.Y.Z"** to merge the current release branch (e.g. `release-vX.Y.Z`) into `main`. Copy the documented release notes into the pull request's body. Once CI has completed and a colleague has reviewed the PR, merge it. This effects a new release in the `main` branch. diff --git a/docs/release-notes/version-4.2.md b/docs/release-notes/version-4.2.md index f0ad3766c..75a776573 100644 --- a/docs/release-notes/version-4.2.md +++ b/docs/release-notes/version-4.2.md @@ -1,9 +1,6 @@ # NetBox v4.2 -## v4.2-beta1 (2024-12-02) - -!!! danger "Not for Production Use" - This is a beta release of NetBox intended for testing and evaluation. **Do not use this software in production.** Also be aware that no upgrade path is provided to future releases. +## v4.2.0 (2025-01-06) ### Breaking Changes diff --git a/mkdocs.yml b/mkdocs.yml index f870b69d6..db6798eae 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -176,6 +176,7 @@ nav: - Provider Network: 'models/circuits/providernetwork.md' - Virtual Circuit: 'models/circuits/virtualcircuit.md' - Virtual Circuit Termination: 'models/circuits/virtualcircuittermination.md' + - Virtual Circuit Type: 'models/circuits/virtualcircuittype.md' - Core: - DataFile: 'models/core/datafile.md' - DataSource: 'models/core/datasource.md' diff --git a/netbox/project-static/dist/graphiql/graphiql.min.js b/netbox/project-static/dist/graphiql/graphiql.min.js index 03d4ac1e1..229d3ebe6 100644 --- a/netbox/project-static/dist/graphiql/graphiql.min.js +++ b/netbox/project-static/dist/graphiql/graphiql.min.js @@ -1,5 +1,4 @@ /******/ (function() { // webpackBootstrap -/******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "../../../node_modules/@emotion/is-prop-valid/dist/is-prop-valid.browser.esm.js": @@ -8,6 +7,7 @@ \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34,6 +34,7 @@ var _default = exports["default"] = index; \**************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -57,6 +58,7 @@ var _default = exports["default"] = memoize; \****************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -1194,6 +1196,7 @@ exports.size = size; \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -1901,6 +1904,7 @@ exports.computePosition = computePosition; \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2256,6 +2260,7 @@ function useFloating(options) { \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2432,6 +2437,7 @@ exports.Animation = Animation; \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2460,6 +2466,7 @@ var _easingEs = __webpack_require__(/*! ./utils/easing.es.js */ "../../../node_m \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2501,6 +2508,7 @@ function getEasingFunction(definition) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2698,6 +2706,7 @@ function animateStyle(element, key, keyframesDefinition, options = {}) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2731,6 +2740,7 @@ function getMotionValue(motionValues, name) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2779,6 +2789,7 @@ function animate(elements, keyframes, options = {}) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2816,6 +2827,7 @@ const style = exports.style = { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2895,6 +2907,7 @@ const selectFinished = animation => animation.finished; \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2932,6 +2945,7 @@ function registerCssVariable(name) { \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2952,6 +2966,7 @@ exports.cubicBezierAsString = cubicBezierAsString; \***************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -2995,6 +3010,7 @@ for (const key in featureTests) { \************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3015,6 +3031,7 @@ function getStyleName(key) { \*******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3041,6 +3058,7 @@ exports.keyframesList = keyframesList; \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3064,6 +3082,7 @@ exports.getOptions = getOptions; \************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3091,6 +3110,7 @@ function stopAnimation(animation, needsCommit = true) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3134,6 +3154,7 @@ function createStyles(keyframes) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3161,6 +3182,7 @@ function createStyleString(target = {}) { \********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3253,6 +3275,7 @@ const transformListToString = (template, name) => `${template} ${name}(var(${asT \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3346,6 +3369,7 @@ const isNumberOrNull = value => typeof value !== "string"; \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3364,6 +3388,7 @@ const glide = exports.glide = (0, _createGeneratorEasingEs.createGeneratorEasing \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3382,6 +3407,7 @@ const spring = exports.spring = (0, _createGeneratorEasingEs.createGeneratorEasi \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3447,6 +3473,7 @@ function inView(elementOrSelector, onStart, { \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3529,6 +3556,7 @@ function resizeElement(target, handler) { \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3571,6 +3599,7 @@ function resizeWindow(callback) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3591,6 +3620,7 @@ function resize(a, b) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3682,6 +3712,7 @@ function scroll(onScroll, _a = {}) { \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3751,6 +3782,7 @@ function updateScrollInfo(element, info, time) { \************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3807,6 +3839,7 @@ function resolveEdge(edge, length, inset = 0) { \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3884,6 +3917,7 @@ function resolveOffsets(container, info, options) { \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3927,6 +3961,7 @@ function calcInset(element, container) { \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3973,6 +4008,7 @@ function resolveOffset(offset, containerLength, targetLength, targetInset) { \***************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -3994,6 +4030,7 @@ const ScrollOffset = exports.ScrollOffset = { \*****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4065,6 +4102,7 @@ function scrubAnimation(controls, axisInfo) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4204,6 +4242,7 @@ var _styleStringEs = __webpack_require__(/*! ./animate/utils/style-string.es.js \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4241,6 +4280,7 @@ const hover = exports.hover = { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4283,6 +4323,7 @@ const inView = exports.inView = { \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4322,6 +4363,7 @@ const press = exports.press = { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4511,6 +4553,7 @@ function createMotionState(options = {}, parent) { \**************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4548,6 +4591,7 @@ function dispatchViewEvent(element, name, entry) { \*******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4577,6 +4621,7 @@ function shallowCompare(next, prev) { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4595,6 +4640,7 @@ function isVariant(definition) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4618,6 +4664,7 @@ function resolveVariant(definition, variants) { \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4657,6 +4704,7 @@ const fireNext = iterator => iterator.next(); \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4869,6 +4917,7 @@ function getValueSequence(name, sequences) { \********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4897,6 +4946,7 @@ function calcNextTime(current, next, prev, labels) { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4939,6 +4989,7 @@ function addKeyframes(sequence, keyframes, easing, offset, startTime, endTime) { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4961,6 +5012,7 @@ function compareByTime(a, b) { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -4993,6 +5045,7 @@ function resolveElements(elements, selectorCache) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5040,6 +5093,7 @@ function resolveOption(option, i, total) { \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5102,6 +5156,7 @@ function cubicBezier(mX1, mY1, mX2, mY2) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5130,6 +5185,7 @@ var _stepsEs = __webpack_require__(/*! ./steps.es.js */ "../../../node_modules/@ \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5153,6 +5209,7 @@ exports.steps = steps; \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5264,6 +5321,7 @@ exports.glide = glide; \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5306,6 +5364,7 @@ var _velocityEs = __webpack_require__(/*! ./utils/velocity.es.js */ "../../../no \******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5326,6 +5385,7 @@ const defaults = exports.defaults = { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5388,6 +5448,7 @@ exports.spring = spring; \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5406,6 +5467,7 @@ exports.calcDampingRatio = calcDampingRatio; \***************************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5424,6 +5486,7 @@ function hasReachedTarget(origin, target, current) { \******************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5467,6 +5530,7 @@ function pregenerateKeyframes(generator, toUnit = _utils.noopReturn) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5488,6 +5552,7 @@ function calcGeneratorVelocity(resolveValue, t, current) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5519,6 +5584,7 @@ exports.MotionValue = MotionValue; \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5540,6 +5606,7 @@ var _MotionValueEs = __webpack_require__(/*! ./MotionValue.es.js */ "../../../no \***************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5563,6 +5630,7 @@ function removeItem(arr, item) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5580,6 +5648,7 @@ exports.clamp = clamp; \******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5602,6 +5671,7 @@ const defaults = exports.defaults = { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5622,6 +5692,7 @@ function getEasingForSegment(easing, i) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5780,6 +5851,7 @@ var _wrapEs = __webpack_require__(/*! ./wrap.es.js */ "../../../node_modules/@mo \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5822,6 +5894,7 @@ function interpolate(output, input = (0, _offsetEs.defaultOffset)(output.length) \*************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5840,6 +5913,7 @@ exports.isCubicBezier = isCubicBezier; \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5857,6 +5931,7 @@ exports.isEasingGenerator = isEasingGenerator; \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5875,6 +5950,7 @@ exports.isEasingList = isEasingList; \*********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5892,6 +5968,7 @@ exports.isFunction = isFunction; \*******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5909,6 +5986,7 @@ exports.isNumber = isNumber; \*******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5926,6 +6004,7 @@ exports.isString = isString; \*************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5943,6 +6022,7 @@ exports.mix = mix; \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5962,6 +6042,7 @@ exports.noopReturn = noopReturn; \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -5992,6 +6073,7 @@ function defaultOffset(length) { \******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -6009,6 +6091,7 @@ exports.progress = progress; \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -6028,6 +6111,7 @@ const time = exports.time = { \******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -6052,6 +6136,7 @@ function velocityPerSecond(velocity, frameDuration) { \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -6072,6 +6157,7 @@ exports.wrap = wrap; \********************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -6214,6 +6300,7 @@ exports.makePushPullAsyncIterableIterator = makePushPullAsyncIterableIterator; \***************************************************************/ /***/ (function(module) { +"use strict"; function $parcel$export(e, n, v, s) { @@ -6242,6 +6329,7 @@ function $1a6a90a521dcd173$export$b9ecd428b558ff10(originalEventHandler, ourEven \*****************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $eQpDd$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -6297,6 +6385,7 @@ const $09f4ad68a9251bc3$export$be92b6f5f03c0fe9 = $09f4ad68a9251bc3$export$21b07 \**********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $hnlpS$react = __webpack_require__(/*! react */ "react"); @@ -6428,6 +6517,7 @@ function $1a96635ec239608b$export$c74125a8e3af6bb2(name) { \************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $dJwbH$react = __webpack_require__(/*! react */ "react"); @@ -6473,6 +6563,7 @@ function $9c2aaba23466b352$export$c7b2cbe3552a0d05(...refs) { \*******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $4O1Ne$react = __webpack_require__(/*! react */ "react"); @@ -6606,6 +6697,7 @@ function $dec3cc0142d4f286$var$composeContextScopes(...scopes) { \******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $aJCrN$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -7041,6 +7133,7 @@ const $f4833395aa1bca1a$export$f39c2d165cd861fe = $f4833395aa1bca1a$export$fba2f \*********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $9g4ps$react = __webpack_require__(/*! react */ "react"); @@ -7083,6 +7176,7 @@ const $cc45c1b701a63adc$export$2881499e37b75b9a = $cc45c1b701a63adc$export$c760c \*****************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $g2vWm$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -7366,6 +7460,7 @@ const $d715e0554b679f1f$export$aecb2ddcb55c95be = $d715e0554b679f1f$export$4d5eb \*************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $7dQ7Q$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -7826,6 +7921,7 @@ const $d1bf075a6b218014$export$6d4de93b380beddf = $d1bf075a6b218014$export$f34ec \************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $cnctE$react = __webpack_require__(/*! react */ "react"); @@ -7881,6 +7977,7 @@ const $71476a6ed7dbbaf3$export$be92b6f5f03c0fe9 = $71476a6ed7dbbaf3$export$ac5b5 \***********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $buum9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -8186,6 +8283,7 @@ const $2bc01e66e04aa9ed$export$be92b6f5f03c0fe9 = $2bc01e66e04aa9ed$export$20e40 \**************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $47woD$react = __webpack_require__(/*! react */ "react"); @@ -8217,6 +8315,7 @@ function $dc478e4659f630c5$export$f680877a34711e37(deterministicId) { \****************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $cnSS2$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -9284,6 +9383,7 @@ const $213e4d2df823067d$export$6d4de93b380beddf = $213e4d2df823067d$export$e7142 \******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $50Iv9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -9639,6 +9739,7 @@ const $34310caa050a8d63$export$21b07c8f274aebd5 = $34310caa050a8d63$export$79d62 \******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $amzHf$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -9688,6 +9789,7 @@ const $913a70b877676c16$export$be92b6f5f03c0fe9 = $913a70b877676c16$export$602ea \********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $fnLeV$react = __webpack_require__(/*! react */ "react"); @@ -9829,6 +9931,7 @@ function $a2fa0214bb2735a1$var$getAnimationName(styles) { \*********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $iMixA$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -9927,6 +10030,7 @@ const $c3def6332c2749a6$export$be92b6f5f03c0fe9 = $c3def6332c2749a6$export$250ff \************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $9QJ9Y$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -10180,6 +10284,7 @@ const $0063afae63b3fa70$export$6d08773d2e66f8f2 = $0063afae63b3fa70$export$ab9df \****************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $dAvBt$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -10292,6 +10397,7 @@ const $82dc8d030dec7549$export$be92b6f5f03c0fe9 = $82dc8d030dec7549$export$8c6ed \*******************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $iVrL9$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -10873,6 +10979,7 @@ const $c34afbc43c90cc6f$export$21b07c8f274aebd5 = $c34afbc43c90cc6f$export$c27ee \****************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $92muK$react = __webpack_require__(/*! react */ "react"); @@ -10909,6 +11016,7 @@ function $28e03942f763e819$export$25bec8c6f54ee79a(callback) { \**********************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $ijazI$react = __webpack_require__(/*! react */ "react"); @@ -10968,6 +11076,7 @@ function $b84d42d44371bff7$var$useUncontrolledState({ \******************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $b0gz3$react = __webpack_require__(/*! react */ "react"); @@ -11004,6 +11113,7 @@ function $24c84e9f83c4454f$export$3a72a57244d6e765(onEscapeKeyDownProp, ownerDoc \*****************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $caHyQ$react = __webpack_require__(/*! react */ "react"); @@ -11034,6 +11144,7 @@ const $ca21affb0542a8a4$export$e5c5a5f917a5871c = Boolean(globalThis === null || \********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $ksDzM$react = __webpack_require__(/*! react */ "react"); @@ -11100,6 +11211,7 @@ function $d2c1d285af17635b$export$1ab7ae714698c4b8(element) { \***************************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var $awrN2$babelruntimehelpersextends = __webpack_require__(/*! @babel/runtime/helpers/extends */ "../../../node_modules/@babel/runtime/helpers/extends.js"); @@ -11157,6 +11269,7 @@ const $685371e9c20848e2$export$be92b6f5f03c0fe9 = $685371e9c20848e2$export$439d2 \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -11346,6 +11459,7 @@ exports.suppressOthers = suppressOthers; \*************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -11368,12 +11482,17149 @@ var _default = exports["default"] = clsx; /***/ }), +/***/ "../../../node_modules/codemirror/addon/comment/comment.js": +/*!*****************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/comment/comment.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + var noOptions = {}; + var nonWS = /[^\s\u00a0]/; + var Pos = CodeMirror.Pos, + cmp = CodeMirror.cmpPos; + function firstNonWS(str) { + var found = str.search(nonWS); + return found == -1 ? 0 : found; + } + CodeMirror.commands.toggleComment = function (cm) { + cm.toggleComment(); + }; + CodeMirror.defineExtension("toggleComment", function (options) { + if (!options) options = noOptions; + var cm = this; + var minLine = Infinity, + ranges = this.listSelections(), + mode = null; + for (var i = ranges.length - 1; i >= 0; i--) { + var from = ranges[i].from(), + to = ranges[i].to(); + if (from.line >= minLine) continue; + if (to.line >= minLine) to = Pos(minLine, 0); + minLine = from.line; + if (mode == null) { + if (cm.uncomment(from, to, options)) mode = "un";else { + cm.lineComment(from, to, options); + mode = "line"; + } + } else if (mode == "un") { + cm.uncomment(from, to, options); + } else { + cm.lineComment(from, to, options); + } + } + }); + + // Rough heuristic to try and detect lines that are part of multi-line string + function probablyInsideString(cm, pos, line) { + return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line); + } + function getMode(cm, pos) { + var mode = cm.getMode(); + return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos); + } + CodeMirror.defineExtension("lineComment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var firstLine = self.getLine(from.line); + if (firstLine == null || probablyInsideString(self, from, firstLine)) return; + var commentString = options.lineComment || mode.lineComment; + if (!commentString) { + if (options.blockCommentStart || mode.blockCommentStart) { + options.fullLines = true; + self.blockComment(from, to, options); + } + return; + } + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); + var pad = options.padding == null ? " " : options.padding; + var blankLines = options.commentBlankLines || from.line == to.line; + self.operation(function () { + if (options.indent) { + var baseString = null; + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i); + var whitespace = line.slice(0, firstNonWS(line)); + if (baseString == null || baseString.length > whitespace.length) { + baseString = whitespace; + } + } + for (var i = from.line; i < end; ++i) { + var line = self.getLine(i), + cut = baseString.length; + if (!blankLines && !nonWS.test(line)) continue; + if (line.slice(0, cut) != baseString) cut = firstNonWS(line); + self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); + } + } else { + for (var i = from.line; i < end; ++i) { + if (blankLines || nonWS.test(self.getLine(i))) self.replaceRange(commentString + pad, Pos(i, 0)); + } + } + }); + }); + CodeMirror.defineExtension("blockComment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) { + if ((options.lineComment || mode.lineComment) && options.fullLines != false) self.lineComment(from, to, options); + return; + } + if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return; + var end = Math.min(to.line, self.lastLine()); + if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; + var pad = options.padding == null ? " " : options.padding; + if (from.line > end) return; + self.operation(function () { + if (options.fullLines != false) { + var lastLineHasText = nonWS.test(self.getLine(end)); + self.replaceRange(pad + endString, Pos(end)); + self.replaceRange(startString + pad, Pos(from.line, 0)); + var lead = options.blockCommentLead || mode.blockCommentLead; + if (lead != null) for (var i = from.line + 1; i <= end; ++i) if (i != end || lastLineHasText) self.replaceRange(lead + pad, Pos(i, 0)); + } else { + var atCursor = cmp(self.getCursor("to"), to) == 0, + empty = !self.somethingSelected(); + self.replaceRange(endString, to); + if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to); + self.replaceRange(startString, from); + } + }); + }); + CodeMirror.defineExtension("uncomment", function (from, to, options) { + if (!options) options = noOptions; + var self = this, + mode = getMode(self, from); + var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), + start = Math.min(from.line, end); + + // Try finding line comments + var lineString = options.lineComment || mode.lineComment, + lines = []; + var pad = options.padding == null ? " " : options.padding, + didSomething; + lineComment: { + if (!lineString) break lineComment; + for (var i = start; i <= end; ++i) { + var line = self.getLine(i); + var found = line.indexOf(lineString); + if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; + if (found == -1 && nonWS.test(line)) break lineComment; + if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; + lines.push(line); + } + self.operation(function () { + for (var i = start; i <= end; ++i) { + var line = lines[i - start]; + var pos = line.indexOf(lineString), + endPos = pos + lineString.length; + if (pos < 0) continue; + if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; + didSomething = true; + self.replaceRange("", Pos(i, pos), Pos(i, endPos)); + } + }); + if (didSomething) return true; + } + + // Try block comments + var startString = options.blockCommentStart || mode.blockCommentStart; + var endString = options.blockCommentEnd || mode.blockCommentEnd; + if (!startString || !endString) return false; + var lead = options.blockCommentLead || mode.blockCommentLead; + var startLine = self.getLine(start), + open = startLine.indexOf(startString); + if (open == -1) return false; + var endLine = end == start ? startLine : self.getLine(end); + var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); + var insideStart = Pos(start, open + 1), + insideEnd = Pos(end, close + 1); + if (close == -1 || !/comment/.test(self.getTokenTypeAt(insideStart)) || !/comment/.test(self.getTokenTypeAt(insideEnd)) || self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) return false; + + // Avoid killing block comments completely outside the selection. + // Positions of the last startString before the start of the selection, and the first endString after it. + var lastStart = startLine.lastIndexOf(startString, from.ch); + var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); + if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; + // Positions of the first endString after the end of the selection, and the last startString before it. + firstEnd = endLine.indexOf(endString, to.ch); + var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); + lastStart = firstEnd == -1 || almostLastStart == -1 ? -1 : to.ch + almostLastStart; + if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; + self.operation(function () { + self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); + var openEnd = open + startString.length; + if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; + self.replaceRange("", Pos(start, open), Pos(start, openEnd)); + if (lead) for (var i = start + 1; i <= end; ++i) { + var line = self.getLine(i), + found = line.indexOf(lead); + if (found == -1 || nonWS.test(line.slice(0, found))) continue; + var foundEnd = found + lead.length; + if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; + self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); + } + }); + return true; + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/dialog/dialog.js": +/*!***************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/dialog/dialog.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Open simple dialogs on top of an editor. Relies on dialog.css. + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + function dialogDiv(cm, template, bottom) { + var wrap = cm.getWrapperElement(); + var dialog; + dialog = wrap.appendChild(document.createElement("div")); + if (bottom) dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom";else dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; + if (typeof template == "string") { + dialog.innerHTML = template; + } else { + // Assuming it's a detached DOM element. + dialog.appendChild(template); + } + CodeMirror.addClass(wrap, 'dialog-opened'); + return dialog; + } + function closeNotification(cm, newVal) { + if (cm.state.currentNotificationClose) cm.state.currentNotificationClose(); + cm.state.currentNotificationClose = newVal; + } + CodeMirror.defineExtension("openDialog", function (template, callback, options) { + if (!options) options = {}; + closeNotification(this, null); + var dialog = dialogDiv(this, template, options.bottom); + var closed = false, + me = this; + function close(newVal) { + if (typeof newVal == 'string') { + inp.value = newVal; + } else { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + me.focus(); + if (options.onClose) options.onClose(dialog); + } + } + var inp = dialog.getElementsByTagName("input")[0], + button; + if (inp) { + inp.focus(); + if (options.value) { + inp.value = options.value; + if (options.selectValueOnOpen !== false) { + inp.select(); + } + } + if (options.onInput) CodeMirror.on(inp, "input", function (e) { + options.onInput(e, inp.value, close); + }); + if (options.onKeyUp) CodeMirror.on(inp, "keyup", function (e) { + options.onKeyUp(e, inp.value, close); + }); + CodeMirror.on(inp, "keydown", function (e) { + if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { + return; + } + if (e.keyCode == 27 || options.closeOnEnter !== false && e.keyCode == 13) { + inp.blur(); + CodeMirror.e_stop(e); + close(); + } + if (e.keyCode == 13) callback(inp.value, e); + }); + if (options.closeOnBlur !== false) CodeMirror.on(dialog, "focusout", function (evt) { + if (evt.relatedTarget !== null) close(); + }); + } else if (button = dialog.getElementsByTagName("button")[0]) { + CodeMirror.on(button, "click", function () { + close(); + me.focus(); + }); + if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); + button.focus(); + } + return close; + }); + CodeMirror.defineExtension("openConfirm", function (template, callbacks, options) { + closeNotification(this, null); + var dialog = dialogDiv(this, template, options && options.bottom); + var buttons = dialog.getElementsByTagName("button"); + var closed = false, + me = this, + blurring = 1; + function close() { + if (closed) return; + closed = true; + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + me.focus(); + } + buttons[0].focus(); + for (var i = 0; i < buttons.length; ++i) { + var b = buttons[i]; + (function (callback) { + CodeMirror.on(b, "click", function (e) { + CodeMirror.e_preventDefault(e); + close(); + if (callback) callback(me); + }); + })(callbacks[i]); + CodeMirror.on(b, "blur", function () { + --blurring; + setTimeout(function () { + if (blurring <= 0) close(); + }, 200); + }); + CodeMirror.on(b, "focus", function () { + ++blurring; + }); + } + }); + + /* + * openNotification + * Opens a notification, that can be closed with an optional timer + * (default 5000ms timer) and always closes on click. + * + * If a notification is opened while another is opened, it will close the + * currently opened one and open the new one immediately. + */ + CodeMirror.defineExtension("openNotification", function (template, options) { + closeNotification(this, close); + var dialog = dialogDiv(this, template, options && options.bottom); + var closed = false, + doneTimer; + var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; + function close() { + if (closed) return; + closed = true; + clearTimeout(doneTimer); + CodeMirror.rmClass(dialog.parentNode, 'dialog-opened'); + dialog.parentNode.removeChild(dialog); + } + CodeMirror.on(dialog, 'click', function (e) { + CodeMirror.e_preventDefault(e); + close(); + }); + if (duration) doneTimer = setTimeout(close, duration); + return close; + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/edit/closebrackets.js": +/*!********************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/edit/closebrackets.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + var defaults = { + pairs: "()[]{}''\"\"", + closeBefore: ")]}'\":;>", + triples: "", + explode: "[]{}" + }; + var Pos = CodeMirror.Pos; + CodeMirror.defineOption("autoCloseBrackets", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.removeKeyMap(keyMap); + cm.state.closeBrackets = null; + } + if (val) { + ensureBound(getOption(val, "pairs")); + cm.state.closeBrackets = val; + cm.addKeyMap(keyMap); + } + }); + function getOption(conf, name) { + if (name == "pairs" && typeof conf == "string") return conf; + if (typeof conf == "object" && conf[name] != null) return conf[name]; + return defaults[name]; + } + var keyMap = { + Backspace: handleBackspace, + Enter: handleEnter + }; + function ensureBound(chars) { + for (var i = 0; i < chars.length; i++) { + var ch = chars.charAt(i), + key = "'" + ch + "'"; + if (!keyMap[key]) keyMap[key] = handler(ch); + } + } + ensureBound(defaults.pairs + "`"); + function handler(ch) { + return function (cm) { + return handleChar(cm, ch); + }; + } + function getConfig(cm) { + var deflt = cm.state.closeBrackets; + if (!deflt || deflt.override) return deflt; + var mode = cm.getModeAt(cm.getCursor()); + return mode.closeBrackets || deflt; + } + function handleBackspace(cm) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + for (var i = ranges.length - 1; i >= 0; i--) { + var cur = ranges[i].head; + cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); + } + } + function handleEnter(cm) { + var conf = getConfig(cm); + var explode = conf && getOption(conf, "explode"); + if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; + var ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) return CodeMirror.Pass; + var around = charsAround(cm, ranges[i].head); + if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; + } + cm.operation(function () { + var linesep = cm.lineSeparator() || "\n"; + cm.replaceSelection(linesep + linesep, null); + moveSel(cm, -1); + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var line = ranges[i].head.line; + cm.indentLine(line, null, true); + cm.indentLine(line + 1, null, true); + } + }); + } + function moveSel(cm, dir) { + var newRanges = [], + ranges = cm.listSelections(), + primary = 0; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.head == cm.getCursor()) primary = i; + var pos = range.head.ch || dir > 0 ? { + line: range.head.line, + ch: range.head.ch + dir + } : { + line: range.head.line - 1 + }; + newRanges.push({ + anchor: pos, + head: pos + }); + } + cm.setSelections(newRanges, primary); + } + function contractSelection(sel) { + var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; + return { + anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), + head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1)) + }; + } + function handleChar(cm, ch) { + var conf = getConfig(cm); + if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; + var pairs = getOption(conf, "pairs"); + var pos = pairs.indexOf(ch); + if (pos == -1) return CodeMirror.Pass; + var closeBefore = getOption(conf, "closeBefore"); + var triples = getOption(conf, "triples"); + var identical = pairs.charAt(pos + 1) == ch; + var ranges = cm.listSelections(); + var opening = pos % 2 == 0; + var type; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + cur = range.head, + curType; + var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); + if (opening && !range.empty()) { + curType = "surround"; + } else if ((identical || !opening) && next == ch) { + if (identical && stringStartsAfter(cm, cur)) curType = "both";else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) curType = "skipThree";else curType = "skip"; + } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) { + if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass; + curType = "addFour"; + } else if (identical) { + var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur); + if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";else return CodeMirror.Pass; + } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) { + curType = "both"; + } else { + return CodeMirror.Pass; + } + if (!type) type = curType;else if (type != curType) return CodeMirror.Pass; + } + var left = pos % 2 ? pairs.charAt(pos - 1) : ch; + var right = pos % 2 ? ch : pairs.charAt(pos + 1); + cm.operation(function () { + if (type == "skip") { + moveSel(cm, 1); + } else if (type == "skipThree") { + moveSel(cm, 3); + } else if (type == "surround") { + var sels = cm.getSelections(); + for (var i = 0; i < sels.length; i++) sels[i] = left + sels[i] + right; + cm.replaceSelections(sels, "around"); + sels = cm.listSelections().slice(); + for (var i = 0; i < sels.length; i++) sels[i] = contractSelection(sels[i]); + cm.setSelections(sels); + } else if (type == "both") { + cm.replaceSelection(left + right, null); + cm.triggerElectric(left + right); + moveSel(cm, -1); + } else if (type == "addFour") { + cm.replaceSelection(left + left + left + left, "before"); + moveSel(cm, 1); + } + }); + } + function charsAround(cm, pos) { + var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); + return str.length == 2 ? str : null; + } + function stringStartsAfter(cm, pos) { + var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)); + return /\bstring/.test(token.type) && token.start == pos.ch && (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))); + } +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/edit/matchbrackets.js": +/*!********************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/edit/matchbrackets.js ***! + \********************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); + var Pos = CodeMirror.Pos; + var matching = { + "(": ")>", + ")": "(<", + "[": "]>", + "]": "[<", + "{": "}>", + "}": "{<", + "<": ">>", + ">": "<<" + }; + function bracketRegex(config) { + return config && config.bracketRegex || /[(){}[\]]/; + } + function findMatchingBracket(cm, where, config) { + var line = cm.getLineHandle(where.line), + pos = where.ch - 1; + var afterCursor = config && config.afterCursor; + if (afterCursor == null) afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className); + var re = bracketRegex(config); + + // A cursor is defined as between two characters, but in in vim command mode + // (i.e. not insert mode), the cursor is visually represented as a + // highlighted box on top of the 2nd character. Otherwise, we allow matches + // from before or after the cursor. + var match = !afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)] || re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)]; + if (!match) return null; + var dir = match.charAt(1) == ">" ? 1 : -1; + if (config && config.strict && dir > 0 != (pos == where.ch)) return null; + var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); + var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config); + if (found == null) return null; + return { + from: Pos(where.line, pos), + to: found && found.pos, + match: found && found.ch == match.charAt(0), + forward: dir > 0 + }; + } + + // bracketRegex is used to specify which type of bracket to scan + // should be a regexp, e.g. /[[\]]/ + // + // Note: If "where" is on an open bracket, then this bracket is ignored. + // + // Returns false when no bracket was found, null when it reached + // maxScanLines and gave up + function scanForBracket(cm, where, dir, style, config) { + var maxScanLen = config && config.maxScanLineLength || 10000; + var maxScanLines = config && config.maxScanLines || 1000; + var stack = []; + var re = bracketRegex(config); + var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); + for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { + var line = cm.getLine(lineNo); + if (!line) continue; + var pos = dir > 0 ? 0 : line.length - 1, + end = dir > 0 ? line.length : -1; + if (line.length > maxScanLen) continue; + if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); + for (; pos != end; pos += dir) { + var ch = line.charAt(pos); + if (re.test(ch) && (style === undefined || (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) { + var match = matching[ch]; + if (match && match.charAt(1) == ">" == dir > 0) stack.push(ch);else if (!stack.length) return { + pos: Pos(lineNo, pos), + ch: ch + };else stack.pop(); + } + } + } + return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; + } + function matchBrackets(cm, autoclear, config) { + // Disable brace matching in long lines, since it'll cause hugely slow updates + var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000, + highlightNonMatching = config && config.highlightNonMatching; + var marks = [], + ranges = cm.listSelections(); + for (var i = 0; i < ranges.length; i++) { + var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); + if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) { + var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; + marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), { + className: style + })); + if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), { + className: style + })); + } + } + if (marks.length) { + // Kludge to work around the IE bug from issue #1193, where text + // input stops going to the textarea whenever this fires. + if (ie_lt8 && cm.state.focused) cm.focus(); + var clear = function () { + cm.operation(function () { + for (var i = 0; i < marks.length; i++) marks[i].clear(); + }); + }; + if (autoclear) setTimeout(clear, 800);else return clear; + } + } + function doMatchBrackets(cm) { + cm.operation(function () { + if (cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); + }); + } + function clearHighlighted(cm) { + if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) { + cm.state.matchBrackets.currentlyHighlighted(); + cm.state.matchBrackets.currentlyHighlighted = null; + } + } + CodeMirror.defineOption("matchBrackets", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.off("cursorActivity", doMatchBrackets); + cm.off("focus", doMatchBrackets); + cm.off("blur", clearHighlighted); + clearHighlighted(cm); + } + if (val) { + cm.state.matchBrackets = typeof val == "object" ? val : {}; + cm.on("cursorActivity", doMatchBrackets); + cm.on("focus", doMatchBrackets); + cm.on("blur", clearHighlighted); + } + }); + CodeMirror.defineExtension("matchBrackets", function () { + matchBrackets(this, true); + }); + CodeMirror.defineExtension("findMatchingBracket", function (pos, config, oldConfig) { + // Backwards-compatibility kludge + if (oldConfig || typeof config == "boolean") { + if (!oldConfig) { + config = config ? { + strict: true + } : null; + } else { + oldConfig.strict = config; + config = oldConfig; + } + } + return findMatchingBracket(this, pos, config); + }); + CodeMirror.defineExtension("scanForBracket", function (pos, dir, style, config) { + return scanForBracket(this, pos, dir, style, config); + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/fold/brace-fold.js": +/*!*****************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/fold/brace-fold.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + function bracketFolding(pairs) { + return function (cm, start) { + var line = start.line, + lineText = cm.getLine(line); + function findOpening(pair) { + var tokenType; + for (var at = start.ch, pass = 0;;) { + var found = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1); + if (found == -1) { + if (pass == 1) break; + pass = 1; + at = lineText.length; + continue; + } + if (pass == 1 && found < start.ch) break; + tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found + 1)); + if (!/^(comment|string)/.test(tokenType)) return { + ch: found + 1, + tokenType: tokenType, + pair: pair + }; + at = found - 1; + } + } + function findRange(found) { + var count = 1, + lastLine = cm.lastLine(), + end, + startCh = found.ch, + endCh; + outer: for (var i = line; i <= lastLine; ++i) { + var text = cm.getLine(i), + pos = i == line ? startCh : 0; + for (;;) { + var nextOpen = text.indexOf(found.pair[0], pos), + nextClose = text.indexOf(found.pair[1], pos); + if (nextOpen < 0) nextOpen = text.length; + if (nextClose < 0) nextClose = text.length; + pos = Math.min(nextOpen, nextClose); + if (pos == text.length) break; + if (cm.getTokenTypeAt(CodeMirror.Pos(i, pos + 1)) == found.tokenType) { + if (pos == nextOpen) ++count;else if (! --count) { + end = i; + endCh = pos; + break outer; + } + } + ++pos; + } + } + if (end == null || line == end) return null; + return { + from: CodeMirror.Pos(line, startCh), + to: CodeMirror.Pos(end, endCh) + }; + } + var found = []; + for (var i = 0; i < pairs.length; i++) { + var open = findOpening(pairs[i]); + if (open) found.push(open); + } + found.sort(function (a, b) { + return a.ch - b.ch; + }); + for (var i = 0; i < found.length; i++) { + var range = findRange(found[i]); + if (range) return range; + } + return null; + }; + } + CodeMirror.registerHelper("fold", "brace", bracketFolding([["{", "}"], ["[", "]"]])); + CodeMirror.registerHelper("fold", "brace-paren", bracketFolding([["{", "}"], ["[", "]"], ["(", ")"]])); + CodeMirror.registerHelper("fold", "import", function (cm, start) { + function hasImport(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type != "keyword" || start.string != "import") return null; + // Now find closing semicolon, return its position + for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { + var text = cm.getLine(i), + semi = text.indexOf(";"); + if (semi != -1) return { + startCh: start.end, + end: CodeMirror.Pos(i, semi) + }; + } + } + var startLine = start.line, + has = hasImport(startLine), + prev; + if (!has || hasImport(startLine - 1) || (prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1) return null; + for (var end = has.end;;) { + var next = hasImport(end.line + 1); + if (next == null) break; + end = next.end; + } + return { + from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), + to: end + }; + }); + CodeMirror.registerHelper("fold", "include", function (cm, start) { + function hasInclude(line) { + if (line < cm.firstLine() || line > cm.lastLine()) return null; + var start = cm.getTokenAt(CodeMirror.Pos(line, 1)); + if (!/\S/.test(start.string)) start = cm.getTokenAt(CodeMirror.Pos(line, start.end + 1)); + if (start.type == "meta" && start.string.slice(0, 8) == "#include") return start.start + 8; + } + var startLine = start.line, + has = hasInclude(startLine); + if (has == null || hasInclude(startLine - 1) != null) return null; + for (var end = startLine;;) { + var next = hasInclude(end + 1); + if (next == null) break; + ++end; + } + return { + from: CodeMirror.Pos(startLine, has + 1), + to: cm.clipPos(CodeMirror.Pos(end)) + }; + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/fold/foldcode.js": +/*!***************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/fold/foldcode.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + function doFold(cm, pos, options, force) { + if (options && options.call) { + var finder = options; + options = null; + } else { + var finder = getOption(cm, options, "rangeFinder"); + } + if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); + var minSize = getOption(cm, options, "minFoldSize"); + function getRange(allowFolded) { + var range = finder(cm, pos); + if (!range || range.to.line - range.from.line < minSize) return null; + if (force === "fold") return range; + var marks = cm.findMarksAt(range.from); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + if (!allowFolded) return null; + range.cleared = true; + marks[i].clear(); + } + } + return range; + } + var range = getRange(true); + if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { + pos = CodeMirror.Pos(pos.line - 1, 0); + range = getRange(false); + } + if (!range || range.cleared || force === "unfold") return; + var myWidget = makeWidget(cm, options, range); + CodeMirror.on(myWidget, "mousedown", function (e) { + myRange.clear(); + CodeMirror.e_preventDefault(e); + }); + var myRange = cm.markText(range.from, range.to, { + replacedWith: myWidget, + clearOnEnter: getOption(cm, options, "clearOnEnter"), + __isFold: true + }); + myRange.on("clear", function (from, to) { + CodeMirror.signal(cm, "unfold", cm, from, to); + }); + CodeMirror.signal(cm, "fold", cm, range.from, range.to); + } + function makeWidget(cm, options, range) { + var widget = getOption(cm, options, "widget"); + if (typeof widget == "function") { + widget = widget(range.from, range.to); + } + if (typeof widget == "string") { + var text = document.createTextNode(widget); + widget = document.createElement("span"); + widget.appendChild(text); + widget.className = "CodeMirror-foldmarker"; + } else if (widget) { + widget = widget.cloneNode(true); + } + return widget; + } + + // Clumsy backwards-compatible interface + CodeMirror.newFoldFunction = function (rangeFinder, widget) { + return function (cm, pos) { + doFold(cm, pos, { + rangeFinder: rangeFinder, + widget: widget + }); + }; + }; + + // New-style interface + CodeMirror.defineExtension("foldCode", function (pos, options, force) { + doFold(this, pos, options, force); + }); + CodeMirror.defineExtension("isFolded", function (pos) { + var marks = this.findMarksAt(pos); + for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true; + }); + CodeMirror.commands.toggleFold = function (cm) { + cm.foldCode(cm.getCursor()); + }; + CodeMirror.commands.fold = function (cm) { + cm.foldCode(cm.getCursor(), null, "fold"); + }; + CodeMirror.commands.unfold = function (cm) { + cm.foldCode(cm.getCursor(), { + scanUp: false + }, "unfold"); + }; + CodeMirror.commands.foldAll = function (cm) { + cm.operation(function () { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { + scanUp: false + }, "fold"); + }); + }; + CodeMirror.commands.unfoldAll = function (cm) { + cm.operation(function () { + for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { + scanUp: false + }, "unfold"); + }); + }; + CodeMirror.registerHelper("fold", "combine", function () { + var funcs = Array.prototype.slice.call(arguments, 0); + return function (cm, start) { + for (var i = 0; i < funcs.length; ++i) { + var found = funcs[i](cm, start); + if (found) return found; + } + }; + }); + CodeMirror.registerHelper("fold", "auto", function (cm, start) { + var helpers = cm.getHelpers(start, "fold"); + for (var i = 0; i < helpers.length; i++) { + var cur = helpers[i](cm, start); + if (cur) return cur; + } + }); + var defaultOptions = { + rangeFinder: CodeMirror.fold.auto, + widget: "\u2194", + minFoldSize: 0, + scanUp: false, + clearOnEnter: true + }; + CodeMirror.defineOption("foldOptions", null); + function getOption(cm, options, name) { + if (options && options[name] !== undefined) return options[name]; + var editorOptions = cm.options.foldOptions; + if (editorOptions && editorOptions[name] !== undefined) return editorOptions[name]; + return defaultOptions[name]; + } + CodeMirror.defineExtension("foldOption", function (options, name) { + return getOption(this, options, name); + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/fold/foldgutter.js": +/*!*****************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/fold/foldgutter.js ***! + \*****************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"), __webpack_require__(/*! ./foldcode */ "../../../node_modules/codemirror/addon/fold/foldcode.js"));else {} +})(function (CodeMirror) { + "use strict"; + + CodeMirror.defineOption("foldGutter", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + cm.clearGutter(cm.state.foldGutter.options.gutter); + cm.state.foldGutter = null; + cm.off("gutterClick", onGutterClick); + cm.off("changes", onChange); + cm.off("viewportChange", onViewportChange); + cm.off("fold", onFold); + cm.off("unfold", onFold); + cm.off("swapDoc", onChange); + } + if (val) { + cm.state.foldGutter = new State(parseOptions(val)); + updateInViewport(cm); + cm.on("gutterClick", onGutterClick); + cm.on("changes", onChange); + cm.on("viewportChange", onViewportChange); + cm.on("fold", onFold); + cm.on("unfold", onFold); + cm.on("swapDoc", onChange); + } + }); + var Pos = CodeMirror.Pos; + function State(options) { + this.options = options; + this.from = this.to = 0; + } + function parseOptions(opts) { + if (opts === true) opts = {}; + if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; + if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; + if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; + return opts; + } + function isFolded(cm, line) { + var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); + for (var i = 0; i < marks.length; ++i) { + if (marks[i].__isFold) { + var fromPos = marks[i].find(-1); + if (fromPos && fromPos.line === line) return marks[i]; + } + } + } + function marker(spec) { + if (typeof spec == "string") { + var elt = document.createElement("div"); + elt.className = spec + " CodeMirror-guttermarker-subtle"; + return elt; + } else { + return spec.cloneNode(true); + } + } + function updateFoldInfo(cm, from, to) { + var opts = cm.state.foldGutter.options, + cur = from - 1; + var minSize = cm.foldOption(opts, "minFoldSize"); + var func = cm.foldOption(opts, "rangeFinder"); + // we can reuse the built-in indicator element if its className matches the new state + var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded); + var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen); + cm.eachLine(from, to, function (line) { + ++cur; + var mark = null; + var old = line.gutterMarkers; + if (old) old = old[opts.gutter]; + if (isFolded(cm, cur)) { + if (clsFolded && old && clsFolded.test(old.className)) return; + mark = marker(opts.indicatorFolded); + } else { + var pos = Pos(cur, 0); + var range = func && func(cm, pos); + if (range && range.to.line - range.from.line >= minSize) { + if (clsOpen && old && clsOpen.test(old.className)) return; + mark = marker(opts.indicatorOpen); + } + } + if (!mark && !old) return; + cm.setGutterMarker(line, opts.gutter, mark); + }); + } + + // copied from CodeMirror/src/util/dom.js + function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); + } + function updateInViewport(cm) { + var vp = cm.getViewport(), + state = cm.state.foldGutter; + if (!state) return; + cm.operation(function () { + updateFoldInfo(cm, vp.from, vp.to); + }); + state.from = vp.from; + state.to = vp.to; + } + function onGutterClick(cm, line, gutter) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + if (gutter != opts.gutter) return; + var folded = isFolded(cm, line); + if (folded) folded.clear();else cm.foldCode(Pos(line, 0), opts); + } + function onChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + state.from = state.to = 0; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function () { + updateInViewport(cm); + }, opts.foldOnChangeTimeSpan || 600); + } + function onViewportChange(cm) { + var state = cm.state.foldGutter; + if (!state) return; + var opts = state.options; + clearTimeout(state.changeUpdate); + state.changeUpdate = setTimeout(function () { + var vp = cm.getViewport(); + if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { + updateInViewport(cm); + } else { + cm.operation(function () { + if (vp.from < state.from) { + updateFoldInfo(cm, vp.from, state.from); + state.from = vp.from; + } + if (vp.to > state.to) { + updateFoldInfo(cm, state.to, vp.to); + state.to = vp.to; + } + }); + } + }, opts.updateViewportTimeSpan || 400); + } + function onFold(cm, from) { + var state = cm.state.foldGutter; + if (!state) return; + var line = from.line; + if (line >= state.from && line < state.to) updateFoldInfo(cm, line, line + 1); + } +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/hint/show-hint.js": +/*!****************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/hint/show-hint.js ***! + \****************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// declare global: DOMRect + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + var HINT_ELEMENT_CLASS = "CodeMirror-hint"; + var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; + + // This is the old interface, kept around for now to stay + // backwards-compatible. + CodeMirror.showHint = function (cm, getHints, options) { + if (!getHints) return cm.showHint(options); + if (options && options.async) getHints.async = true; + var newOpts = { + hint: getHints + }; + if (options) for (var prop in options) newOpts[prop] = options[prop]; + return cm.showHint(newOpts); + }; + CodeMirror.defineExtension("showHint", function (options) { + options = parseOptions(this, this.getCursor("start"), options); + var selections = this.listSelections(); + if (selections.length > 1) return; + // By default, don't allow completion when something is selected. + // A hint function can have a `supportsSelection` property to + // indicate that it can handle selections. + if (this.somethingSelected()) { + if (!options.hint.supportsSelection) return; + // Don't try with cross-line selections + for (var i = 0; i < selections.length; i++) if (selections[i].head.line != selections[i].anchor.line) return; + } + if (this.state.completionActive) this.state.completionActive.close(); + var completion = this.state.completionActive = new Completion(this, options); + if (!completion.options.hint) return; + CodeMirror.signal(this, "startCompletion", this); + completion.update(true); + }); + CodeMirror.defineExtension("closeHint", function () { + if (this.state.completionActive) this.state.completionActive.close(); + }); + function Completion(cm, options) { + this.cm = cm; + this.options = options; + this.widget = null; + this.debounce = 0; + this.tick = 0; + this.startPos = this.cm.getCursor("start"); + this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; + if (this.options.updateOnCursorActivity) { + var self = this; + cm.on("cursorActivity", this.activityFunc = function () { + self.cursorActivity(); + }); + } + } + var requestAnimationFrame = window.requestAnimationFrame || function (fn) { + return setTimeout(fn, 1000 / 60); + }; + var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; + Completion.prototype = { + close: function () { + if (!this.active()) return; + this.cm.state.completionActive = null; + this.tick = null; + if (this.options.updateOnCursorActivity) { + this.cm.off("cursorActivity", this.activityFunc); + } + if (this.widget && this.data) CodeMirror.signal(this.data, "close"); + if (this.widget) this.widget.close(); + CodeMirror.signal(this.cm, "endCompletion", this.cm); + }, + active: function () { + return this.cm.state.completionActive == this; + }, + pick: function (data, i) { + var completion = data.list[i], + self = this; + this.cm.operation(function () { + if (completion.hint) completion.hint(self.cm, data, completion);else self.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); + CodeMirror.signal(data, "pick", completion); + self.cm.scrollIntoView(); + }); + if (this.options.closeOnPick) { + this.close(); + } + }, + cursorActivity: function () { + if (this.debounce) { + cancelAnimationFrame(this.debounce); + this.debounce = 0; + } + var identStart = this.startPos; + if (this.data) { + identStart = this.data.from; + } + var pos = this.cm.getCursor(), + line = this.cm.getLine(pos.line); + if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < identStart.ch || this.cm.somethingSelected() || !pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1))) { + this.close(); + } else { + var self = this; + this.debounce = requestAnimationFrame(function () { + self.update(); + }); + if (this.widget) this.widget.disable(); + } + }, + update: function (first) { + if (this.tick == null) return; + var self = this, + myTick = ++this.tick; + fetchHints(this.options.hint, this.cm, this.options, function (data) { + if (self.tick == myTick) self.finishUpdate(data, first); + }); + }, + finishUpdate: function (data, first) { + if (this.data) CodeMirror.signal(this.data, "update"); + var picked = this.widget && this.widget.picked || first && this.options.completeSingle; + if (this.widget) this.widget.close(); + this.data = data; + if (data && data.list.length) { + if (picked && data.list.length == 1) { + this.pick(data, 0); + } else { + this.widget = new Widget(this, data); + CodeMirror.signal(data, "shown"); + } + } + } + }; + function parseOptions(cm, pos, options) { + var editor = cm.options.hintOptions; + var out = {}; + for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; + if (editor) for (var prop in editor) if (editor[prop] !== undefined) out[prop] = editor[prop]; + if (options) for (var prop in options) if (options[prop] !== undefined) out[prop] = options[prop]; + if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos); + return out; + } + function getText(completion) { + if (typeof completion == "string") return completion;else return completion.text; + } + function buildKeyMap(completion, handle) { + var baseMap = { + Up: function () { + handle.moveFocus(-1); + }, + Down: function () { + handle.moveFocus(1); + }, + PageUp: function () { + handle.moveFocus(-handle.menuSize() + 1, true); + }, + PageDown: function () { + handle.moveFocus(handle.menuSize() - 1, true); + }, + Home: function () { + handle.setFocus(0); + }, + End: function () { + handle.setFocus(handle.length - 1); + }, + Enter: handle.pick, + Tab: handle.pick, + Esc: handle.close + }; + var mac = /Mac/.test(navigator.platform); + if (mac) { + baseMap["Ctrl-P"] = function () { + handle.moveFocus(-1); + }; + baseMap["Ctrl-N"] = function () { + handle.moveFocus(1); + }; + } + var custom = completion.options.customKeys; + var ourMap = custom ? {} : baseMap; + function addBinding(key, val) { + var bound; + if (typeof val != "string") bound = function (cm) { + return val(cm, handle); + }; + // This mechanism is deprecated + else if (baseMap.hasOwnProperty(val)) bound = baseMap[val];else bound = val; + ourMap[key] = bound; + } + if (custom) for (var key in custom) if (custom.hasOwnProperty(key)) addBinding(key, custom[key]); + var extra = completion.options.extraKeys; + if (extra) for (var key in extra) if (extra.hasOwnProperty(key)) addBinding(key, extra[key]); + return ourMap; + } + function getHintElement(hintsElement, el) { + while (el && el != hintsElement) { + if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; + el = el.parentNode; + } + } + function Widget(completion, data) { + this.id = "cm-complete-" + Math.floor(Math.random(1e6)); + this.completion = completion; + this.data = data; + this.picked = false; + var widget = this, + cm = completion.cm; + var ownerDocument = cm.getInputField().ownerDocument; + var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; + var hints = this.hints = ownerDocument.createElement("ul"); + hints.setAttribute("role", "listbox"); + hints.setAttribute("aria-expanded", "true"); + hints.id = this.id; + var theme = completion.cm.options.theme; + hints.className = "CodeMirror-hints " + theme; + this.selectedHint = data.selectedHint || 0; + var completions = data.list; + for (var i = 0; i < completions.length; ++i) { + var elt = hints.appendChild(ownerDocument.createElement("li")), + cur = completions[i]; + var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); + if (cur.className != null) className = cur.className + " " + className; + elt.className = className; + if (i == this.selectedHint) elt.setAttribute("aria-selected", "true"); + elt.id = this.id + "-" + i; + elt.setAttribute("role", "option"); + if (cur.render) cur.render(elt, data, cur);else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur))); + elt.hintId = i; + } + var container = completion.options.container || ownerDocument.body; + var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); + var left = pos.left, + top = pos.bottom, + below = true; + var offsetLeft = 0, + offsetTop = 0; + if (container !== ownerDocument.body) { + // We offset the cursor position because left and top are relative to the offsetParent's top left corner. + var isContainerPositioned = ['absolute', 'relative', 'fixed'].indexOf(parentWindow.getComputedStyle(container).position) !== -1; + var offsetParent = isContainerPositioned ? container : container.offsetParent; + var offsetParentPosition = offsetParent.getBoundingClientRect(); + var bodyPosition = ownerDocument.body.getBoundingClientRect(); + offsetLeft = offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft; + offsetTop = offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop; + } + hints.style.left = left - offsetLeft + "px"; + hints.style.top = top - offsetTop + "px"; + + // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor. + var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth); + var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight); + container.appendChild(hints); + cm.getInputField().setAttribute("aria-autocomplete", "list"); + cm.getInputField().setAttribute("aria-owns", this.id); + cm.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint); + var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect(); + var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false; + + // Compute in the timeout to avoid reflow on init + var startScroll; + setTimeout(function () { + startScroll = cm.getScrollInfo(); + }); + var overlapY = box.bottom - winH; + if (overlapY > 0) { + var height = box.bottom - box.top, + curTop = pos.top - (pos.bottom - box.top); + if (curTop - height > 0) { + // Fits above cursor + hints.style.top = (top = pos.top - height - offsetTop) + "px"; + below = false; + } else if (height > winH) { + hints.style.height = winH - 5 + "px"; + hints.style.top = (top = pos.bottom - box.top - offsetTop) + "px"; + var cursor = cm.getCursor(); + if (data.from.ch != cursor.ch) { + pos = cm.cursorCoords(cursor); + hints.style.left = (left = pos.left - offsetLeft) + "px"; + box = hints.getBoundingClientRect(); + } + } + } + var overlapX = box.right - winW; + if (scrolls) overlapX += cm.display.nativeBarWidth; + if (overlapX > 0) { + if (box.right - box.left > winW) { + hints.style.width = winW - 5 + "px"; + overlapX -= box.right - box.left - winW; + } + hints.style.left = (left = pos.left - overlapX - offsetLeft) + "px"; + } + if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling) node.style.paddingRight = cm.display.nativeBarWidth + "px"; + cm.addKeyMap(this.keyMap = buildKeyMap(completion, { + moveFocus: function (n, avoidWrap) { + widget.changeActive(widget.selectedHint + n, avoidWrap); + }, + setFocus: function (n) { + widget.changeActive(n); + }, + menuSize: function () { + return widget.screenAmount(); + }, + length: completions.length, + close: function () { + completion.close(); + }, + pick: function () { + widget.pick(); + }, + data: data + })); + if (completion.options.closeOnUnfocus) { + var closingOnBlur; + cm.on("blur", this.onBlur = function () { + closingOnBlur = setTimeout(function () { + completion.close(); + }, 100); + }); + cm.on("focus", this.onFocus = function () { + clearTimeout(closingOnBlur); + }); + } + cm.on("scroll", this.onScroll = function () { + var curScroll = cm.getScrollInfo(), + editor = cm.getWrapperElement().getBoundingClientRect(); + if (!startScroll) startScroll = cm.getScrollInfo(); + var newTop = top + startScroll.top - curScroll.top; + var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop); + if (!below) point += hints.offsetHeight; + if (point <= editor.top || point >= editor.bottom) return completion.close(); + hints.style.top = newTop + "px"; + hints.style.left = left + startScroll.left - curScroll.left + "px"; + }); + CodeMirror.on(hints, "dblclick", function (e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + widget.pick(); + } + }); + CodeMirror.on(hints, "click", function (e) { + var t = getHintElement(hints, e.target || e.srcElement); + if (t && t.hintId != null) { + widget.changeActive(t.hintId); + if (completion.options.completeOnSingleClick) widget.pick(); + } + }); + CodeMirror.on(hints, "mousedown", function () { + setTimeout(function () { + cm.focus(); + }, 20); + }); + + // The first hint doesn't need to be scrolled to on init + var selectedHintRange = this.getSelectedHintRange(); + if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) { + this.scrollToActive(); + } + CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]); + return true; + } + Widget.prototype = { + close: function () { + if (this.completion.widget != this) return; + this.completion.widget = null; + if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints); + this.completion.cm.removeKeyMap(this.keyMap); + var input = this.completion.cm.getInputField(); + input.removeAttribute("aria-activedescendant"); + input.removeAttribute("aria-owns"); + var cm = this.completion.cm; + if (this.completion.options.closeOnUnfocus) { + cm.off("blur", this.onBlur); + cm.off("focus", this.onFocus); + } + cm.off("scroll", this.onScroll); + }, + disable: function () { + this.completion.cm.removeKeyMap(this.keyMap); + var widget = this; + this.keyMap = { + Enter: function () { + widget.picked = true; + } + }; + this.completion.cm.addKeyMap(this.keyMap); + }, + pick: function () { + this.completion.pick(this.data, this.selectedHint); + }, + changeActive: function (i, avoidWrap) { + if (i >= this.data.list.length) i = avoidWrap ? this.data.list.length - 1 : 0;else if (i < 0) i = avoidWrap ? 0 : this.data.list.length - 1; + if (this.selectedHint == i) return; + var node = this.hints.childNodes[this.selectedHint]; + if (node) { + node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); + node.removeAttribute("aria-selected"); + } + node = this.hints.childNodes[this.selectedHint = i]; + node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; + node.setAttribute("aria-selected", "true"); + this.completion.cm.getInputField().setAttribute("aria-activedescendant", node.id); + this.scrollToActive(); + CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); + }, + scrollToActive: function () { + var selectedHintRange = this.getSelectedHintRange(); + var node1 = this.hints.childNodes[selectedHintRange.from]; + var node2 = this.hints.childNodes[selectedHintRange.to]; + var firstNode = this.hints.firstChild; + if (node1.offsetTop < this.hints.scrollTop) this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop; + }, + screenAmount: function () { + return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; + }, + getSelectedHintRange: function () { + var margin = this.completion.options.scrollMargin || 0; + return { + from: Math.max(0, this.selectedHint - margin), + to: Math.min(this.data.list.length - 1, this.selectedHint + margin) + }; + } + }; + function applicableHelpers(cm, helpers) { + if (!cm.somethingSelected()) return helpers; + var result = []; + for (var i = 0; i < helpers.length; i++) if (helpers[i].supportsSelection) result.push(helpers[i]); + return result; + } + function fetchHints(hint, cm, options, callback) { + if (hint.async) { + hint(cm, callback, options); + } else { + var result = hint(cm, options); + if (result && result.then) result.then(callback);else callback(result); + } + } + function resolveAutoHints(cm, pos) { + var helpers = cm.getHelpers(pos, "hint"), + words; + if (helpers.length) { + var resolved = function (cm, callback, options) { + var app = applicableHelpers(cm, helpers); + function run(i) { + if (i == app.length) return callback(null); + fetchHints(app[i], cm, options, function (result) { + if (result && result.list.length > 0) callback(result);else run(i + 1); + }); + } + run(0); + }; + resolved.async = true; + resolved.supportsSelection = true; + return resolved; + } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { + return function (cm) { + return CodeMirror.hint.fromList(cm, { + words: words + }); + }; + } else if (CodeMirror.hint.anyword) { + return function (cm, options) { + return CodeMirror.hint.anyword(cm, options); + }; + } else { + return function () {}; + } + } + CodeMirror.registerHelper("hint", "auto", { + resolve: resolveAutoHints + }); + CodeMirror.registerHelper("hint", "fromList", function (cm, options) { + var cur = cm.getCursor(), + token = cm.getTokenAt(cur); + var term, + from = CodeMirror.Pos(cur.line, token.start), + to = cur; + if (token.start < cur.ch && /\w/.test(token.string.charAt(cur.ch - token.start - 1))) { + term = token.string.substr(0, cur.ch - token.start); + } else { + term = ""; + from = cur; + } + var found = []; + for (var i = 0; i < options.words.length; i++) { + var word = options.words[i]; + if (word.slice(0, term.length) == term) found.push(word); + } + if (found.length) return { + list: found, + from: from, + to: to + }; + }); + CodeMirror.commands.autocomplete = CodeMirror.showHint; + var defaultOptions = { + hint: CodeMirror.hint.auto, + completeSingle: true, + alignWithWord: true, + closeCharacters: /[\s()\[\]{};:>,]/, + closeOnPick: true, + closeOnUnfocus: true, + updateOnCursorActivity: true, + completeOnSingleClick: true, + container: null, + customKeys: null, + extraKeys: null, + paddingForScrollbar: true, + moveOnOverlap: true + }; + CodeMirror.defineOption("hintOptions", null); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/lint/lint.js": +/*!***********************************************************!*\ + !*** ../../../node_modules/codemirror/addon/lint/lint.js ***! + \***********************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + var GUTTER_ID = "CodeMirror-lint-markers"; + var LINT_LINE_ID = "CodeMirror-lint-line-"; + function showTooltip(cm, e, content) { + var tt = document.createElement("div"); + tt.className = "CodeMirror-lint-tooltip cm-s-" + cm.options.theme; + tt.appendChild(content.cloneNode(true)); + if (cm.state.lint.options.selfContain) cm.getWrapperElement().appendChild(tt);else document.body.appendChild(tt); + function position(e) { + if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); + tt.style.top = Math.max(0, e.clientY - tt.offsetHeight - 5) + "px"; + tt.style.left = e.clientX + 5 + "px"; + } + CodeMirror.on(document, "mousemove", position); + position(e); + if (tt.style.opacity != null) tt.style.opacity = 1; + return tt; + } + function rm(elt) { + if (elt.parentNode) elt.parentNode.removeChild(elt); + } + function hideTooltip(tt) { + if (!tt.parentNode) return; + if (tt.style.opacity == null) rm(tt); + tt.style.opacity = 0; + setTimeout(function () { + rm(tt); + }, 600); + } + function showTooltipFor(cm, e, content, node) { + var tooltip = showTooltip(cm, e, content); + function hide() { + CodeMirror.off(node, "mouseout", hide); + if (tooltip) { + hideTooltip(tooltip); + tooltip = null; + } + } + var poll = setInterval(function () { + if (tooltip) for (var n = node;; n = n.parentNode) { + if (n && n.nodeType == 11) n = n.host; + if (n == document.body) return; + if (!n) { + hide(); + break; + } + } + if (!tooltip) return clearInterval(poll); + }, 400); + CodeMirror.on(node, "mouseout", hide); + } + function LintState(cm, conf, hasGutter) { + this.marked = []; + if (conf instanceof Function) conf = { + getAnnotations: conf + }; + if (!conf || conf === true) conf = {}; + this.options = {}; + this.linterOptions = conf.options || {}; + for (var prop in defaults) this.options[prop] = defaults[prop]; + for (var prop in conf) { + if (defaults.hasOwnProperty(prop)) { + if (conf[prop] != null) this.options[prop] = conf[prop]; + } else if (!conf.options) { + this.linterOptions[prop] = conf[prop]; + } + } + this.timeout = null; + this.hasGutter = hasGutter; + this.onMouseOver = function (e) { + onMouseOver(cm, e); + }; + this.waitingFor = 0; + } + var defaults = { + highlightLines: false, + tooltips: true, + delay: 500, + lintOnChange: true, + getAnnotations: null, + async: false, + selfContain: null, + formatAnnotation: null, + onUpdateLinting: null + }; + function clearMarks(cm) { + var state = cm.state.lint; + if (state.hasGutter) cm.clearGutter(GUTTER_ID); + if (state.options.highlightLines) clearErrorLines(cm); + for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); + state.marked.length = 0; + } + function clearErrorLines(cm) { + cm.eachLine(function (line) { + var has = line.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(line.wrapClass); + if (has) cm.removeLineClass(line, "wrap", has[0]); + }); + } + function makeMarker(cm, labels, severity, multiple, tooltips) { + var marker = document.createElement("div"), + inner = marker; + marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity; + if (multiple) { + inner = marker.appendChild(document.createElement("div")); + inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"; + } + if (tooltips != false) CodeMirror.on(inner, "mouseover", function (e) { + showTooltipFor(cm, e, labels, inner); + }); + return marker; + } + function getMaxSeverity(a, b) { + if (a == "error") return a;else return b; + } + function groupByLine(annotations) { + var lines = []; + for (var i = 0; i < annotations.length; ++i) { + var ann = annotations[i], + line = ann.from.line; + (lines[line] || (lines[line] = [])).push(ann); + } + return lines; + } + function annotationTooltip(ann) { + var severity = ann.severity; + if (!severity) severity = "error"; + var tip = document.createElement("div"); + tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity; + if (typeof ann.messageHTML != 'undefined') { + tip.innerHTML = ann.messageHTML; + } else { + tip.appendChild(document.createTextNode(ann.message)); + } + return tip; + } + function lintAsync(cm, getAnnotations) { + var state = cm.state.lint; + var id = ++state.waitingFor; + function abort() { + id = -1; + cm.off("change", abort); + } + cm.on("change", abort); + getAnnotations(cm.getValue(), function (annotations, arg2) { + cm.off("change", abort); + if (state.waitingFor != id) return; + if (arg2 && annotations instanceof CodeMirror) annotations = arg2; + cm.operation(function () { + updateLinting(cm, annotations); + }); + }, state.linterOptions, cm); + } + function startLinting(cm) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + /* + * Passing rules in `options` property prevents JSHint (and other linters) from complaining + * about unrecognized rules like `onUpdateLinting`, `delay`, `lintOnChange`, etc. + */ + var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); + if (!getAnnotations) return; + if (options.async || getAnnotations.async) { + lintAsync(cm, getAnnotations); + } else { + var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm); + if (!annotations) return; + if (annotations.then) annotations.then(function (issues) { + cm.operation(function () { + updateLinting(cm, issues); + }); + });else cm.operation(function () { + updateLinting(cm, annotations); + }); + } + } + function updateLinting(cm, annotationsNotSorted) { + var state = cm.state.lint; + if (!state) return; + var options = state.options; + clearMarks(cm); + var annotations = groupByLine(annotationsNotSorted); + for (var line = 0; line < annotations.length; ++line) { + var anns = annotations[line]; + if (!anns) continue; + + // filter out duplicate messages + var message = []; + anns = anns.filter(function (item) { + return message.indexOf(item.message) > -1 ? false : message.push(item.message); + }); + var maxSeverity = null; + var tipLabel = state.hasGutter && document.createDocumentFragment(); + for (var i = 0; i < anns.length; ++i) { + var ann = anns[i]; + var severity = ann.severity; + if (!severity) severity = "error"; + maxSeverity = getMaxSeverity(maxSeverity, severity); + if (options.formatAnnotation) ann = options.formatAnnotation(ann); + if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); + if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { + className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity, + __annotation: ann + })); + } + // use original annotations[line] to show multiple messages + if (state.hasGutter) cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1, options.tooltips)); + if (options.highlightLines) cm.addLineClass(line, "wrap", LINT_LINE_ID + maxSeverity); + } + if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); + } + function onChange(cm) { + var state = cm.state.lint; + if (!state) return; + clearTimeout(state.timeout); + state.timeout = setTimeout(function () { + startLinting(cm); + }, state.options.delay); + } + function popupTooltips(cm, annotations, e) { + var target = e.target || e.srcElement; + var tooltip = document.createDocumentFragment(); + for (var i = 0; i < annotations.length; i++) { + var ann = annotations[i]; + tooltip.appendChild(annotationTooltip(ann)); + } + showTooltipFor(cm, e, tooltip, target); + } + function onMouseOver(cm, e) { + var target = e.target || e.srcElement; + if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; + var box = target.getBoundingClientRect(), + x = (box.left + box.right) / 2, + y = (box.top + box.bottom) / 2; + var spans = cm.findMarksAt(cm.coordsChar({ + left: x, + top: y + }, "client")); + var annotations = []; + for (var i = 0; i < spans.length; ++i) { + var ann = spans[i].__annotation; + if (ann) annotations.push(ann); + } + if (annotations.length) popupTooltips(cm, annotations, e); + } + CodeMirror.defineOption("lint", false, function (cm, val, old) { + if (old && old != CodeMirror.Init) { + clearMarks(cm); + if (cm.state.lint.options.lintOnChange !== false) cm.off("change", onChange); + CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); + clearTimeout(cm.state.lint.timeout); + delete cm.state.lint; + } + if (val) { + var gutters = cm.getOption("gutters"), + hasLintGutter = false; + for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; + var state = cm.state.lint = new LintState(cm, val, hasLintGutter); + if (state.options.lintOnChange) cm.on("change", onChange); + if (state.options.tooltips != false && state.options.tooltips != "gutter") CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); + startLinting(cm); + } + }); + CodeMirror.defineExtension("performLint", function () { + startLinting(this); + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/search/jump-to-line.js": +/*!*********************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/search/jump-to-line.js ***! + \*********************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Defines jumpToLine command. Uses dialog.js if present. + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"), __webpack_require__(/*! ../dialog/dialog */ "../../../node_modules/codemirror/addon/dialog/dialog.js"));else {} +})(function (CodeMirror) { + "use strict"; + + // default search panel location + CodeMirror.defineOption("search", { + bottom: false + }); + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, { + value: deflt, + selectValueOnOpen: true, + bottom: cm.options.search.bottom + });else f(prompt(shortText, deflt)); + } + function getJumpDialog(cm) { + return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ''; + } + function interpretLine(cm, string) { + var num = Number(string); + if (/^[-+]/.test(string)) return cm.getCursor().line + num;else return num - 1; + } + CodeMirror.commands.jumpToLine = function (cm) { + var cur = cm.getCursor(); + dialog(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), cur.line + 1 + ":" + cur.ch, function (posStr) { + if (!posStr) return; + var match; + if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), Number(match[2])); + } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { + var line = Math.round(cm.lineCount() * Number(match[1]) / 100); + if (/^[-+]/.test(match[1])) line = cur.line + line + 1; + cm.setCursor(line - 1, cur.ch); + } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { + cm.setCursor(interpretLine(cm, match[1]), cur.ch); + } + }); + }; + CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/search/search.js": +/*!***************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/search/search.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// Define search commands. Depends on dialog.js or another +// implementation of the openDialog method. + +// Replace works a little oddly -- it will do the replace on the next +// Ctrl-G (or whatever is bound to findNext) press. You prevent a +// replace by making sure the match is no longer selected when hitting +// Ctrl-G. + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"), __webpack_require__(/*! ./searchcursor */ "../../../node_modules/codemirror/addon/search/searchcursor.js"), __webpack_require__(/*! ../dialog/dialog */ "../../../node_modules/codemirror/addon/dialog/dialog.js"));else {} +})(function (CodeMirror) { + "use strict"; + + // default search panel location + CodeMirror.defineOption("search", { + bottom: false + }); + function searchOverlay(query, caseInsensitive) { + if (typeof query == "string") query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");else if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); + return { + token: function (stream) { + query.lastIndex = stream.pos; + var match = query.exec(stream.string); + if (match && match.index == stream.pos) { + stream.pos += match[0].length || 1; + return "searching"; + } else if (match) { + stream.pos = match.index; + } else { + stream.skipToEnd(); + } + } + }; + } + function SearchState() { + this.posFrom = this.posTo = this.lastQuery = this.query = null; + this.overlay = null; + } + function getSearchState(cm) { + return cm.state.search || (cm.state.search = new SearchState()); + } + function queryCaseInsensitive(query) { + return typeof query == "string" && query == query.toLowerCase(); + } + function getSearchCursor(cm, query, pos) { + // Heuristic: if the query string is all lowercase, do a case insensitive search. + return cm.getSearchCursor(query, pos, { + caseFold: queryCaseInsensitive(query), + multiline: true + }); + } + function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { + cm.openDialog(text, onEnter, { + value: deflt, + selectValueOnOpen: true, + closeOnEnter: false, + onClose: function () { + clearSearch(cm); + }, + onKeyDown: onKeyDown, + bottom: cm.options.search.bottom + }); + } + function dialog(cm, text, shortText, deflt, f) { + if (cm.openDialog) cm.openDialog(text, f, { + value: deflt, + selectValueOnOpen: true, + bottom: cm.options.search.bottom + });else f(prompt(shortText, deflt)); + } + function confirmDialog(cm, text, shortText, fs) { + if (cm.openConfirm) cm.openConfirm(text, fs);else if (confirm(shortText)) fs[0](); + } + function parseString(string) { + return string.replace(/\\([nrt\\])/g, function (match, ch) { + if (ch == "n") return "\n"; + if (ch == "r") return "\r"; + if (ch == "t") return "\t"; + if (ch == "\\") return "\\"; + return match; + }); + } + function parseQuery(query) { + var isRE = query.match(/^\/(.*)\/([a-z]*)$/); + if (isRE) { + try { + query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); + } catch (e) {} // Not a regular expression after all, do a string search + } else { + query = parseString(query); + } + if (typeof query == "string" ? query == "" : query.test("")) query = /x^/; + return query; + } + function startSearch(cm, state, query) { + state.queryText = query; + state.query = parseQuery(query); + cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); + state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); + cm.addOverlay(state.overlay); + if (cm.showMatchesOnScrollbar) { + if (state.annotate) { + state.annotate.clear(); + state.annotate = null; + } + state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); + } + } + function doSearch(cm, rev, persistent, immediate) { + var state = getSearchState(cm); + if (state.query) return findNext(cm, rev); + var q = cm.getSelection() || state.lastQuery; + if (q instanceof RegExp && q.source == "x^") q = null; + if (persistent && cm.openDialog) { + var hiding = null; + var searchNext = function (query, event) { + CodeMirror.e_stop(event); + if (!query) return; + if (query != state.queryText) { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + } + if (hiding) hiding.style.opacity = 1; + findNext(cm, event.shiftKey, function (_, to) { + var dialog; + if (to.line < 3 && document.querySelector && (dialog = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && dialog.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) (hiding = dialog).style.opacity = .4; + }); + }; + persistentDialog(cm, getQueryDialog(cm), q, searchNext, function (event, query) { + var keyName = CodeMirror.keyName(event); + var extra = cm.getOption('extraKeys'), + cmd = extra && extra[keyName] || CodeMirror.keyMap[cm.getOption("keyMap")][keyName]; + if (cmd == "findNext" || cmd == "findPrev" || cmd == "findPersistentNext" || cmd == "findPersistentPrev") { + CodeMirror.e_stop(event); + startSearch(cm, getSearchState(cm), query); + cm.execCommand(cmd); + } else if (cmd == "find" || cmd == "findPersistent") { + CodeMirror.e_stop(event); + searchNext(query, event); + } + }); + if (immediate && q) { + startSearch(cm, state, q); + findNext(cm, rev); + } + } else { + dialog(cm, getQueryDialog(cm), "Search for:", q, function (query) { + if (query && !state.query) cm.operation(function () { + startSearch(cm, state, query); + state.posFrom = state.posTo = cm.getCursor(); + findNext(cm, rev); + }); + }); + } + } + function findNext(cm, rev, callback) { + cm.operation(function () { + var state = getSearchState(cm); + var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); + if (!cursor.find(rev)) { + cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); + if (!cursor.find(rev)) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({ + from: cursor.from(), + to: cursor.to() + }, 20); + state.posFrom = cursor.from(); + state.posTo = cursor.to(); + if (callback) callback(cursor.from(), cursor.to()); + }); + } + function clearSearch(cm) { + cm.operation(function () { + var state = getSearchState(cm); + state.lastQuery = state.query; + if (!state.query) return; + state.query = state.queryText = null; + cm.removeOverlay(state.overlay); + if (state.annotate) { + state.annotate.clear(); + state.annotate = null; + } + }); + } + function el(tag, attrs) { + var element = tag ? document.createElement(tag) : document.createDocumentFragment(); + for (var key in attrs) { + element[key] = attrs[key]; + } + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + element.appendChild(typeof child == "string" ? document.createTextNode(child) : child); + } + return element; + } + function getQueryDialog(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("Search:")), " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + }), " ", el("span", { + style: "color: #888", + className: "CodeMirror-search-hint" + }, cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplaceQueryDialog(cm) { + return el("", null, " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + }), " ", el("span", { + style: "color: #888", + className: "CodeMirror-search-hint" + }, cm.phrase("(Use /re/ syntax for regexp search)"))); + } + function getReplacementQueryDialog(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("With:")), " ", el("input", { + type: "text", + "style": "width: 10em", + className: "CodeMirror-search-field" + })); + } + function getDoReplaceConfirm(cm) { + return el("", null, el("span", { + className: "CodeMirror-search-label" + }, cm.phrase("Replace?")), " ", el("button", {}, cm.phrase("Yes")), " ", el("button", {}, cm.phrase("No")), " ", el("button", {}, cm.phrase("All")), " ", el("button", {}, cm.phrase("Stop"))); + } + function replaceAll(cm, query, text) { + cm.operation(function () { + for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { + if (typeof query != "string") { + var match = cm.getRange(cursor.from(), cursor.to()).match(query); + cursor.replace(text.replace(/\$(\d)/g, function (_, i) { + return match[i]; + })); + } else cursor.replace(text); + } + }); + } + function replace(cm, all) { + if (cm.getOption("readOnly")) return; + var query = cm.getSelection() || getSearchState(cm).lastQuery; + var dialogText = all ? cm.phrase("Replace all:") : cm.phrase("Replace:"); + var fragment = el("", null, el("span", { + className: "CodeMirror-search-label" + }, dialogText), getReplaceQueryDialog(cm)); + dialog(cm, fragment, dialogText, query, function (query) { + if (!query) return; + query = parseQuery(query); + dialog(cm, getReplacementQueryDialog(cm), cm.phrase("Replace with:"), "", function (text) { + text = parseString(text); + if (all) { + replaceAll(cm, query, text); + } else { + clearSearch(cm); + var cursor = getSearchCursor(cm, query, cm.getCursor("from")); + var advance = function () { + var start = cursor.from(), + match; + if (!(match = cursor.findNext())) { + cursor = getSearchCursor(cm, query); + if (!(match = cursor.findNext()) || start && cursor.from().line == start.line && cursor.from().ch == start.ch) return; + } + cm.setSelection(cursor.from(), cursor.to()); + cm.scrollIntoView({ + from: cursor.from(), + to: cursor.to() + }); + confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase("Replace?"), [function () { + doReplace(match); + }, advance, function () { + replaceAll(cm, query, text); + }]); + }; + var doReplace = function (match) { + cursor.replace(typeof query == "string" ? text : text.replace(/\$(\d)/g, function (_, i) { + return match[i]; + })); + advance(); + }; + advance(); + } + }); + }); + } + CodeMirror.commands.find = function (cm) { + clearSearch(cm); + doSearch(cm); + }; + CodeMirror.commands.findPersistent = function (cm) { + clearSearch(cm); + doSearch(cm, false, true); + }; + CodeMirror.commands.findPersistentNext = function (cm) { + doSearch(cm, false, true, true); + }; + CodeMirror.commands.findPersistentPrev = function (cm) { + doSearch(cm, true, true, true); + }; + CodeMirror.commands.findNext = doSearch; + CodeMirror.commands.findPrev = function (cm) { + doSearch(cm, true); + }; + CodeMirror.commands.clearSearch = clearSearch; + CodeMirror.commands.replace = replace; + CodeMirror.commands.replaceAll = function (cm) { + replace(cm, true); + }; +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/addon/search/searchcursor.js": +/*!*********************************************************************!*\ + !*** ../../../node_modules/codemirror/addon/search/searchcursor.js ***! + \*********************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + var Pos = CodeMirror.Pos; + function regexpFlags(regexp) { + var flags = regexp.flags; + return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + (regexp.global ? "g" : "") + (regexp.multiline ? "m" : ""); + } + function ensureFlags(regexp, flags) { + var current = regexpFlags(regexp), + target = current; + for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) target += flags.charAt(i); + return current == target ? regexp : new RegExp(regexp.source, target); + } + function maybeMultiline(regexp) { + return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source); + } + function searchRegexpForward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g"); + for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { + regexp.lastIndex = ch; + var string = doc.getLine(line), + match = regexp.exec(string); + if (match) return { + from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match + }; + } + } + function searchRegexpForwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start); + regexp = ensureFlags(regexp, "gm"); + var string, + chunk = 1; + for (var line = start.line, last = doc.lastLine(); line <= last;) { + // This grows the search buffer in exponentially-sized chunks + // between matches, so that nearby matches are fast and don't + // require concatenating the whole document (in case we're + // searching for something that has tons of matches), but at the + // same time, the amount of retries is limited. + for (var i = 0; i < chunk; i++) { + if (line > last) break; + var curLine = doc.getLine(line++); + string = string == null ? curLine : string + "\n" + curLine; + } + chunk = chunk * 2; + regexp.lastIndex = start.ch; + var match = regexp.exec(string); + if (match) { + var before = string.slice(0, match.index).split("\n"), + inside = match[0].split("\n"); + var startLine = start.line + before.length - 1, + startCh = before[before.length - 1].length; + return { + from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match + }; + } + } + } + function lastMatchIn(string, regexp, endMargin) { + var match, + from = 0; + while (from <= string.length) { + regexp.lastIndex = from; + var newMatch = regexp.exec(string); + if (!newMatch) break; + var end = newMatch.index + newMatch[0].length; + if (end > string.length - endMargin) break; + if (!match || end > match.index + match[0].length) match = newMatch; + from = newMatch.index + 1; + } + return match; + } + function searchRegexpBackward(doc, regexp, start) { + regexp = ensureFlags(regexp, "g"); + for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { + var string = doc.getLine(line); + var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch); + if (match) return { + from: Pos(line, match.index), + to: Pos(line, match.index + match[0].length), + match: match + }; + } + } + function searchRegexpBackwardMultiline(doc, regexp, start) { + if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start); + regexp = ensureFlags(regexp, "gm"); + var string, + chunkSize = 1, + endMargin = doc.getLine(start.line).length - start.ch; + for (var line = start.line, first = doc.firstLine(); line >= first;) { + for (var i = 0; i < chunkSize && line >= first; i++) { + var curLine = doc.getLine(line--); + string = string == null ? curLine : curLine + "\n" + string; + } + chunkSize *= 2; + var match = lastMatchIn(string, regexp, endMargin); + if (match) { + var before = string.slice(0, match.index).split("\n"), + inside = match[0].split("\n"); + var startLine = line + before.length, + startCh = before[before.length - 1].length; + return { + from: Pos(startLine, startCh), + to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), + match: match + }; + } + } + } + var doFold, noFold; + if (String.prototype.normalize) { + doFold = function (str) { + return str.normalize("NFD").toLowerCase(); + }; + noFold = function (str) { + return str.normalize("NFD"); + }; + } else { + doFold = function (str) { + return str.toLowerCase(); + }; + noFold = function (str) { + return str; + }; + } + + // Maps a position in a case-folded line back to a position in the original line + // (compensating for codepoints increasing in number during folding) + function adjustPos(orig, folded, pos, foldFunc) { + if (orig.length == folded.length) return pos; + for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { + if (min == max) return min; + var mid = min + max >> 1; + var len = foldFunc(orig.slice(0, mid)).length; + if (len == pos) return mid;else if (len > pos) max = mid;else min = mid + 1; + } + } + function searchStringForward(doc, query, start, caseFold) { + // Empty string would match anything and never progress, so we + // define it to match nothing instead. + if (!query.length) return null; + var fold = caseFold ? doFold : noFold; + var lines = fold(query).split(/\r|\n\r?/); + search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { + var orig = doc.getLine(line).slice(ch), + string = fold(orig); + if (lines.length == 1) { + var found = string.indexOf(lines[0]); + if (found == -1) continue search; + var start = adjustPos(orig, string, found, fold) + ch; + return { + from: Pos(line, adjustPos(orig, string, found, fold) + ch), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch) + }; + } else { + var cutFrom = string.length - lines[0].length; + if (string.slice(cutFrom) != lines[0]) continue search; + for (var i = 1; i < lines.length - 1; i++) if (fold(doc.getLine(line + i)) != lines[i]) continue search; + var end = doc.getLine(line + lines.length - 1), + endString = fold(end), + lastLine = lines[lines.length - 1]; + if (endString.slice(0, lastLine.length) != lastLine) continue search; + return { + from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), + to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold)) + }; + } + } + } + function searchStringBackward(doc, query, start, caseFold) { + if (!query.length) return null; + var fold = caseFold ? doFold : noFold; + var lines = fold(query).split(/\r|\n\r?/); + search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { + var orig = doc.getLine(line); + if (ch > -1) orig = orig.slice(0, ch); + var string = fold(orig); + if (lines.length == 1) { + var found = string.lastIndexOf(lines[0]); + if (found == -1) continue search; + return { + from: Pos(line, adjustPos(orig, string, found, fold)), + to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold)) + }; + } else { + var lastLine = lines[lines.length - 1]; + if (string.slice(0, lastLine.length) != lastLine) continue search; + for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) if (fold(doc.getLine(start + i)) != lines[i]) continue search; + var top = doc.getLine(line + 1 - lines.length), + topString = fold(top); + if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search; + return { + from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), + to: Pos(line, adjustPos(orig, string, lastLine.length, fold)) + }; + } + } + } + function SearchCursor(doc, query, pos, options) { + this.atOccurrence = false; + this.afterEmptyMatch = false; + this.doc = doc; + pos = pos ? doc.clipPos(pos) : Pos(0, 0); + this.pos = { + from: pos, + to: pos + }; + var caseFold; + if (typeof options == "object") { + caseFold = options.caseFold; + } else { + // Backwards compat for when caseFold was the 4th argument + caseFold = options; + options = null; + } + if (typeof query == "string") { + if (caseFold == null) caseFold = false; + this.matches = function (reverse, pos) { + return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos, caseFold); + }; + } else { + query = ensureFlags(query, "gm"); + if (!options || options.multiline !== false) this.matches = function (reverse, pos) { + return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos); + };else this.matches = function (reverse, pos) { + return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos); + }; + } + } + SearchCursor.prototype = { + findNext: function () { + return this.find(false); + }, + findPrevious: function () { + return this.find(true); + }, + find: function (reverse) { + var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); + if (this.afterEmptyMatch && this.atOccurrence) { + // do not return the same 0 width match twice + head = Pos(head.line, head.ch); + if (reverse) { + head.ch--; + if (head.ch < 0) { + head.line--; + head.ch = (this.doc.getLine(head.line) || "").length; + } + } else { + head.ch++; + if (head.ch > (this.doc.getLine(head.line) || "").length) { + head.ch = 0; + head.line++; + } + } + if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) { + return this.atOccurrence = false; + } + } + var result = this.matches(reverse, head); + this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0; + if (result) { + this.pos = result; + this.atOccurrence = true; + return this.pos.match || true; + } else { + var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0); + this.pos = { + from: end, + to: end + }; + return this.atOccurrence = false; + } + }, + from: function () { + if (this.atOccurrence) return this.pos.from; + }, + to: function () { + if (this.atOccurrence) return this.pos.to; + }, + replace: function (newText, origin) { + if (!this.atOccurrence) return; + var lines = CodeMirror.splitLines(newText); + this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin); + this.pos.to = Pos(this.pos.from.line + lines.length - 1, lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); + } + }; + CodeMirror.defineExtension("getSearchCursor", function (query, pos, caseFold) { + return new SearchCursor(this.doc, query, pos, caseFold); + }); + CodeMirror.defineDocExtension("getSearchCursor", function (query, pos, caseFold) { + return new SearchCursor(this, query, pos, caseFold); + }); + CodeMirror.defineExtension("selectMatches", function (query, caseFold) { + var ranges = []; + var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); + while (cur.findNext()) { + if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; + ranges.push({ + anchor: cur.from(), + head: cur.to() + }); + } + if (ranges.length) this.setSelections(ranges, 0); + }); +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/keymap/sublime.js": +/*!**********************************************************!*\ + !*** ../../../node_modules/codemirror/keymap/sublime.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// A rough approximation of Sublime Text's keybindings +// Depends on addon/search/searchcursor.js and optionally addon/dialog/dialogs.js + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"), __webpack_require__(/*! ../addon/search/searchcursor */ "../../../node_modules/codemirror/addon/search/searchcursor.js"), __webpack_require__(/*! ../addon/edit/matchbrackets */ "../../../node_modules/codemirror/addon/edit/matchbrackets.js"));else {} +})(function (CodeMirror) { + "use strict"; + + var cmds = CodeMirror.commands; + var Pos = CodeMirror.Pos; + + // This is not exactly Sublime's algorithm. I couldn't make heads or tails of that. + function findPosSubword(doc, start, dir) { + if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1)); + var line = doc.getLine(start.line); + if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0)); + var state = "start", + type, + startPos = start.ch; + for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) { + var next = line.charAt(dir < 0 ? pos - 1 : pos); + var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o"; + if (cat == "w" && next.toUpperCase() == next) cat = "W"; + if (state == "start") { + if (cat != "o") { + state = "in"; + type = cat; + } else startPos = pos + dir; + } else if (state == "in") { + if (type != cat) { + if (type == "w" && cat == "W" && dir < 0) pos--; + if (type == "W" && cat == "w" && dir > 0) { + // From uppercase to lowercase + if (pos == startPos + 1) { + type = "w"; + continue; + } else pos--; + } + break; + } + } + } + return Pos(start.line, pos); + } + function moveSubword(cm, dir) { + cm.extendSelectionsBy(function (range) { + if (cm.display.shift || cm.doc.extend || range.empty()) return findPosSubword(cm.doc, range.head, dir);else return dir < 0 ? range.from() : range.to(); + }); + } + cmds.goSubwordLeft = function (cm) { + moveSubword(cm, -1); + }; + cmds.goSubwordRight = function (cm) { + moveSubword(cm, 1); + }; + cmds.scrollLineUp = function (cm) { + var info = cm.getScrollInfo(); + if (!cm.somethingSelected()) { + var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local"); + if (cm.getCursor().line >= visibleBottomLine) cm.execCommand("goLineUp"); + } + cm.scrollTo(null, info.top - cm.defaultTextHeight()); + }; + cmds.scrollLineDown = function (cm) { + var info = cm.getScrollInfo(); + if (!cm.somethingSelected()) { + var visibleTopLine = cm.lineAtHeight(info.top, "local") + 1; + if (cm.getCursor().line <= visibleTopLine) cm.execCommand("goLineDown"); + } + cm.scrollTo(null, info.top + cm.defaultTextHeight()); + }; + cmds.splitSelectionByLine = function (cm) { + var ranges = cm.listSelections(), + lineRanges = []; + for (var i = 0; i < ranges.length; i++) { + var from = ranges[i].from(), + to = ranges[i].to(); + for (var line = from.line; line <= to.line; ++line) if (!(to.line > from.line && line == to.line && to.ch == 0)) lineRanges.push({ + anchor: line == from.line ? from : Pos(line, 0), + head: line == to.line ? to : Pos(line) + }); + } + cm.setSelections(lineRanges, 0); + }; + cmds.singleSelectionTop = function (cm) { + var range = cm.listSelections()[0]; + cm.setSelection(range.anchor, range.head, { + scroll: false + }); + }; + cmds.selectLine = function (cm) { + var ranges = cm.listSelections(), + extended = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + extended.push({ + anchor: Pos(range.from().line, 0), + head: Pos(range.to().line + 1, 0) + }); + } + cm.setSelections(extended); + }; + function insertLine(cm, above) { + if (cm.isReadOnly()) return CodeMirror.Pass; + cm.operation(function () { + var len = cm.listSelections().length, + newSelection = [], + last = -1; + for (var i = 0; i < len; i++) { + var head = cm.listSelections()[i].head; + if (head.line <= last) continue; + var at = Pos(head.line + (above ? 0 : 1), 0); + cm.replaceRange("\n", at, null, "+insertLine"); + cm.indentLine(at.line, null, true); + newSelection.push({ + head: at, + anchor: at + }); + last = head.line + 1; + } + cm.setSelections(newSelection); + }); + cm.execCommand("indentAuto"); + } + cmds.insertLineAfter = function (cm) { + return insertLine(cm, false); + }; + cmds.insertLineBefore = function (cm) { + return insertLine(cm, true); + }; + function wordAt(cm, pos) { + var start = pos.ch, + end = start, + line = cm.getLine(pos.line); + while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start; + while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end; + return { + from: Pos(pos.line, start), + to: Pos(pos.line, end), + word: line.slice(start, end) + }; + } + cmds.selectNextOccurrence = function (cm) { + var from = cm.getCursor("from"), + to = cm.getCursor("to"); + var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel; + if (CodeMirror.cmpPos(from, to) == 0) { + var word = wordAt(cm, from); + if (!word.word) return; + cm.setSelection(word.from, word.to); + fullWord = true; + } else { + var text = cm.getRange(from, to); + var query = fullWord ? new RegExp("\\b" + text + "\\b") : text; + var cur = cm.getSearchCursor(query, to); + var found = cur.findNext(); + if (!found) { + cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0)); + found = cur.findNext(); + } + if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return; + cm.addSelection(cur.from(), cur.to()); + } + if (fullWord) cm.state.sublimeFindFullWord = cm.doc.sel; + }; + cmds.skipAndSelectNextOccurrence = function (cm) { + var prevAnchor = cm.getCursor("anchor"), + prevHead = cm.getCursor("head"); + cmds.selectNextOccurrence(cm); + if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) { + cm.doc.setSelections(cm.doc.listSelections().filter(function (sel) { + return sel.anchor != prevAnchor || sel.head != prevHead; + })); + } + }; + function addCursorToSelection(cm, dir) { + var ranges = cm.listSelections(), + newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + var newAnchor = cm.findPosV(range.anchor, dir, "line", range.anchor.goalColumn); + var newHead = cm.findPosV(range.head, dir, "line", range.head.goalColumn); + newAnchor.goalColumn = range.anchor.goalColumn != null ? range.anchor.goalColumn : cm.cursorCoords(range.anchor, "div").left; + newHead.goalColumn = range.head.goalColumn != null ? range.head.goalColumn : cm.cursorCoords(range.head, "div").left; + var newRange = { + anchor: newAnchor, + head: newHead + }; + newRanges.push(range); + newRanges.push(newRange); + } + cm.setSelections(newRanges); + } + cmds.addCursorToPrevLine = function (cm) { + addCursorToSelection(cm, -1); + }; + cmds.addCursorToNextLine = function (cm) { + addCursorToSelection(cm, 1); + }; + function isSelectedRange(ranges, from, to) { + for (var i = 0; i < ranges.length; i++) if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 && CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true; + return false; + } + var mirror = "(){}[]"; + function selectBetweenBrackets(cm) { + var ranges = cm.listSelections(), + newRanges = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + pos = range.head, + opening = cm.scanForBracket(pos, -1); + if (!opening) return false; + for (;;) { + var closing = cm.scanForBracket(pos, 1); + if (!closing) return false; + if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) { + var startPos = Pos(opening.pos.line, opening.pos.ch + 1); + if (CodeMirror.cmpPos(startPos, range.from()) == 0 && CodeMirror.cmpPos(closing.pos, range.to()) == 0) { + opening = cm.scanForBracket(opening.pos, -1); + if (!opening) return false; + } else { + newRanges.push({ + anchor: startPos, + head: closing.pos + }); + break; + } + } + pos = Pos(closing.pos.line, closing.pos.ch + 1); + } + } + cm.setSelections(newRanges); + return true; + } + cmds.selectScope = function (cm) { + selectBetweenBrackets(cm) || cm.execCommand("selectAll"); + }; + cmds.selectBetweenBrackets = function (cm) { + if (!selectBetweenBrackets(cm)) return CodeMirror.Pass; + }; + function puncType(type) { + return !type ? null : /\bpunctuation\b/.test(type) ? type : undefined; + } + cmds.goToBracket = function (cm) { + cm.extendSelectionsBy(function (range) { + var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head))); + if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos; + var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1)))); + return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head; + }); + }; + cmds.swapLineUp = function (cm) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + linesToMove = [], + at = cm.firstLine() - 1, + newSels = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + from = range.from().line - 1, + to = range.to().line; + newSels.push({ + anchor: Pos(range.anchor.line - 1, range.anchor.ch), + head: Pos(range.head.line - 1, range.head.ch) + }); + if (range.to().ch == 0 && !range.empty()) --to; + if (from > at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; + at = to; + } + cm.operation(function () { + for (var i = 0; i < linesToMove.length; i += 2) { + var from = linesToMove[i], + to = linesToMove[i + 1]; + var line = cm.getLine(from); + cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine"); + if (to > cm.lastLine()) cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine");else cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine"); + } + cm.setSelections(newSels); + cm.scrollIntoView(); + }); + }; + cmds.swapLineDown = function (cm) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + linesToMove = [], + at = cm.lastLine() + 1; + for (var i = ranges.length - 1; i >= 0; i--) { + var range = ranges[i], + from = range.to().line + 1, + to = range.from().line; + if (range.to().ch == 0 && !range.empty()) from--; + if (from < at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; + at = to; + } + cm.operation(function () { + for (var i = linesToMove.length - 2; i >= 0; i -= 2) { + var from = linesToMove[i], + to = linesToMove[i + 1]; + var line = cm.getLine(from); + if (from == cm.lastLine()) cm.replaceRange("", Pos(from - 1), Pos(from), "+swapLine");else cm.replaceRange("", Pos(from, 0), Pos(from + 1, 0), "+swapLine"); + cm.replaceRange(line + "\n", Pos(to, 0), null, "+swapLine"); + } + cm.scrollIntoView(); + }); + }; + cmds.toggleCommentIndented = function (cm) { + cm.toggleComment({ + indent: true + }); + }; + cmds.joinLines = function (cm) { + var ranges = cm.listSelections(), + joined = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i], + from = range.from(); + var start = from.line, + end = range.to().line; + while (i < ranges.length - 1 && ranges[i + 1].from().line == end) end = ranges[++i].to().line; + joined.push({ + start: start, + end: end, + anchor: !range.empty() && from + }); + } + cm.operation(function () { + var offset = 0, + ranges = []; + for (var i = 0; i < joined.length; i++) { + var obj = joined[i]; + var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), + head; + for (var line = obj.start; line <= obj.end; line++) { + var actual = line - offset; + if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1); + if (actual < cm.lastLine()) { + cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length)); + ++offset; + } + } + ranges.push({ + anchor: anchor || head, + head: head + }); + } + cm.setSelections(ranges, 0); + }); + }; + cmds.duplicateLine = function (cm) { + cm.operation(function () { + var rangeCount = cm.listSelections().length; + for (var i = 0; i < rangeCount; i++) { + var range = cm.listSelections()[i]; + if (range.empty()) cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));else cm.replaceRange(cm.getRange(range.from(), range.to()), range.from()); + } + cm.scrollIntoView(); + }); + }; + function sortLines(cm, caseSensitive, direction) { + if (cm.isReadOnly()) return CodeMirror.Pass; + var ranges = cm.listSelections(), + toSort = [], + selected; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.empty()) continue; + var from = range.from().line, + to = range.to().line; + while (i < ranges.length - 1 && ranges[i + 1].from().line == to) to = ranges[++i].to().line; + if (!ranges[i].to().ch) to--; + toSort.push(from, to); + } + if (toSort.length) selected = true;else toSort.push(cm.firstLine(), cm.lastLine()); + cm.operation(function () { + var ranges = []; + for (var i = 0; i < toSort.length; i += 2) { + var from = toSort[i], + to = toSort[i + 1]; + var start = Pos(from, 0), + end = Pos(to); + var lines = cm.getRange(start, end, false); + if (caseSensitive) lines.sort(function (a, b) { + return a < b ? -direction : a == b ? 0 : direction; + });else lines.sort(function (a, b) { + var au = a.toUpperCase(), + bu = b.toUpperCase(); + if (au != bu) { + a = au; + b = bu; + } + return a < b ? -direction : a == b ? 0 : direction; + }); + cm.replaceRange(lines, start, end); + if (selected) ranges.push({ + anchor: start, + head: Pos(to + 1, 0) + }); + } + if (selected) cm.setSelections(ranges, 0); + }); + } + cmds.sortLines = function (cm) { + sortLines(cm, true, 1); + }; + cmds.reverseSortLines = function (cm) { + sortLines(cm, true, -1); + }; + cmds.sortLinesInsensitive = function (cm) { + sortLines(cm, false, 1); + }; + cmds.reverseSortLinesInsensitive = function (cm) { + sortLines(cm, false, -1); + }; + cmds.nextBookmark = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) while (marks.length) { + var current = marks.shift(); + var found = current.find(); + if (found) { + marks.push(current); + return cm.setSelection(found.from, found.to); + } + } + }; + cmds.prevBookmark = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) while (marks.length) { + marks.unshift(marks.pop()); + var found = marks[marks.length - 1].find(); + if (!found) marks.pop();else return cm.setSelection(found.from, found.to); + } + }; + cmds.toggleBookmark = function (cm) { + var ranges = cm.listSelections(); + var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []); + for (var i = 0; i < ranges.length; i++) { + var from = ranges[i].from(), + to = ranges[i].to(); + var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to); + for (var j = 0; j < found.length; j++) { + if (found[j].sublimeBookmark) { + found[j].clear(); + for (var k = 0; k < marks.length; k++) if (marks[k] == found[j]) marks.splice(k--, 1); + break; + } + } + if (j == found.length) marks.push(cm.markText(from, to, { + sublimeBookmark: true, + clearWhenEmpty: false + })); + } + }; + cmds.clearBookmarks = function (cm) { + var marks = cm.state.sublimeBookmarks; + if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear(); + marks.length = 0; + }; + cmds.selectBookmarks = function (cm) { + var marks = cm.state.sublimeBookmarks, + ranges = []; + if (marks) for (var i = 0; i < marks.length; i++) { + var found = marks[i].find(); + if (!found) marks.splice(i--, 0);else ranges.push({ + anchor: found.from, + head: found.to + }); + } + if (ranges.length) cm.setSelections(ranges, 0); + }; + function modifyWordOrSelection(cm, mod) { + cm.operation(function () { + var ranges = cm.listSelections(), + indices = [], + replacements = []; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (range.empty()) { + indices.push(i); + replacements.push(""); + } else replacements.push(mod(cm.getRange(range.from(), range.to()))); + } + cm.replaceSelections(replacements, "around", "case"); + for (var i = indices.length - 1, at; i >= 0; i--) { + var range = ranges[indices[i]]; + if (at && CodeMirror.cmpPos(range.head, at) > 0) continue; + var word = wordAt(cm, range.head); + at = word.from; + cm.replaceRange(mod(word.word), word.from, word.to); + } + }); + } + cmds.smartBackspace = function (cm) { + if (cm.somethingSelected()) return CodeMirror.Pass; + cm.operation(function () { + var cursors = cm.listSelections(); + var indentUnit = cm.getOption("indentUnit"); + for (var i = cursors.length - 1; i >= 0; i--) { + var cursor = cursors[i].head; + var toStartOfLine = cm.getRange({ + line: cursor.line, + ch: 0 + }, cursor); + var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize")); + + // Delete by one character by default + var deletePos = cm.findPosH(cursor, -1, "char", false); + if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) { + var prevIndent = new Pos(cursor.line, CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit)); + + // Smart delete only if we found a valid prevIndent location + if (prevIndent.ch != cursor.ch) deletePos = prevIndent; + } + cm.replaceRange("", deletePos, cursor, "+delete"); + } + }); + }; + cmds.delLineRight = function (cm) { + cm.operation(function () { + var ranges = cm.listSelections(); + for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete"); + cm.scrollIntoView(); + }); + }; + cmds.upcaseAtCursor = function (cm) { + modifyWordOrSelection(cm, function (str) { + return str.toUpperCase(); + }); + }; + cmds.downcaseAtCursor = function (cm) { + modifyWordOrSelection(cm, function (str) { + return str.toLowerCase(); + }); + }; + cmds.setSublimeMark = function (cm) { + if (cm.state.sublimeMark) cm.state.sublimeMark.clear(); + cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); + }; + cmds.selectToSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) cm.setSelection(cm.getCursor(), found); + }; + cmds.deleteToSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) { + var from = cm.getCursor(), + to = found; + if (CodeMirror.cmpPos(from, to) > 0) { + var tmp = to; + to = from; + from = tmp; + } + cm.state.sublimeKilled = cm.getRange(from, to); + cm.replaceRange("", from, to); + } + }; + cmds.swapWithSublimeMark = function (cm) { + var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); + if (found) { + cm.state.sublimeMark.clear(); + cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); + cm.setCursor(found); + } + }; + cmds.sublimeYank = function (cm) { + if (cm.state.sublimeKilled != null) cm.replaceSelection(cm.state.sublimeKilled, null, "paste"); + }; + cmds.showInCenter = function (cm) { + var pos = cm.cursorCoords(null, "local"); + cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2); + }; + function getTarget(cm) { + var from = cm.getCursor("from"), + to = cm.getCursor("to"); + if (CodeMirror.cmpPos(from, to) == 0) { + var word = wordAt(cm, from); + if (!word.word) return; + from = word.from; + to = word.to; + } + return { + from: from, + to: to, + query: cm.getRange(from, to), + word: word + }; + } + function findAndGoTo(cm, forward) { + var target = getTarget(cm); + if (!target) return; + var query = target.query; + var cur = cm.getSearchCursor(query, forward ? target.to : target.from); + if (forward ? cur.findNext() : cur.findPrevious()) { + cm.setSelection(cur.from(), cur.to()); + } else { + cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0) : cm.clipPos(Pos(cm.lastLine()))); + if (forward ? cur.findNext() : cur.findPrevious()) cm.setSelection(cur.from(), cur.to());else if (target.word) cm.setSelection(target.from, target.to); + } + } + ; + cmds.findUnder = function (cm) { + findAndGoTo(cm, true); + }; + cmds.findUnderPrevious = function (cm) { + findAndGoTo(cm, false); + }; + cmds.findAllUnder = function (cm) { + var target = getTarget(cm); + if (!target) return; + var cur = cm.getSearchCursor(target.query); + var matches = []; + var primaryIndex = -1; + while (cur.findNext()) { + matches.push({ + anchor: cur.from(), + head: cur.to() + }); + if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch) primaryIndex++; + } + cm.setSelections(matches, primaryIndex); + }; + var keyMap = CodeMirror.keyMap; + keyMap.macSublime = { + "Cmd-Left": "goLineStartSmart", + "Shift-Tab": "indentLess", + "Shift-Ctrl-K": "deleteLine", + "Alt-Q": "wrapLines", + "Ctrl-Left": "goSubwordLeft", + "Ctrl-Right": "goSubwordRight", + "Ctrl-Alt-Up": "scrollLineUp", + "Ctrl-Alt-Down": "scrollLineDown", + "Cmd-L": "selectLine", + "Shift-Cmd-L": "splitSelectionByLine", + "Esc": "singleSelectionTop", + "Cmd-Enter": "insertLineAfter", + "Shift-Cmd-Enter": "insertLineBefore", + "Cmd-D": "selectNextOccurrence", + "Shift-Cmd-Space": "selectScope", + "Shift-Cmd-M": "selectBetweenBrackets", + "Cmd-M": "goToBracket", + "Cmd-Ctrl-Up": "swapLineUp", + "Cmd-Ctrl-Down": "swapLineDown", + "Cmd-/": "toggleCommentIndented", + "Cmd-J": "joinLines", + "Shift-Cmd-D": "duplicateLine", + "F5": "sortLines", + "Shift-F5": "reverseSortLines", + "Cmd-F5": "sortLinesInsensitive", + "Shift-Cmd-F5": "reverseSortLinesInsensitive", + "F2": "nextBookmark", + "Shift-F2": "prevBookmark", + "Cmd-F2": "toggleBookmark", + "Shift-Cmd-F2": "clearBookmarks", + "Alt-F2": "selectBookmarks", + "Backspace": "smartBackspace", + "Cmd-K Cmd-D": "skipAndSelectNextOccurrence", + "Cmd-K Cmd-K": "delLineRight", + "Cmd-K Cmd-U": "upcaseAtCursor", + "Cmd-K Cmd-L": "downcaseAtCursor", + "Cmd-K Cmd-Space": "setSublimeMark", + "Cmd-K Cmd-A": "selectToSublimeMark", + "Cmd-K Cmd-W": "deleteToSublimeMark", + "Cmd-K Cmd-X": "swapWithSublimeMark", + "Cmd-K Cmd-Y": "sublimeYank", + "Cmd-K Cmd-C": "showInCenter", + "Cmd-K Cmd-G": "clearBookmarks", + "Cmd-K Cmd-Backspace": "delLineLeft", + "Cmd-K Cmd-1": "foldAll", + "Cmd-K Cmd-0": "unfoldAll", + "Cmd-K Cmd-J": "unfoldAll", + "Ctrl-Shift-Up": "addCursorToPrevLine", + "Ctrl-Shift-Down": "addCursorToNextLine", + "Cmd-F3": "findUnder", + "Shift-Cmd-F3": "findUnderPrevious", + "Alt-F3": "findAllUnder", + "Shift-Cmd-[": "fold", + "Shift-Cmd-]": "unfold", + "Cmd-I": "findIncremental", + "Shift-Cmd-I": "findIncrementalReverse", + "Cmd-H": "replace", + "F3": "findNext", + "Shift-F3": "findPrev", + "fallthrough": "macDefault" + }; + CodeMirror.normalizeKeyMap(keyMap.macSublime); + keyMap.pcSublime = { + "Shift-Tab": "indentLess", + "Shift-Ctrl-K": "deleteLine", + "Alt-Q": "wrapLines", + "Ctrl-T": "transposeChars", + "Alt-Left": "goSubwordLeft", + "Alt-Right": "goSubwordRight", + "Ctrl-Up": "scrollLineUp", + "Ctrl-Down": "scrollLineDown", + "Ctrl-L": "selectLine", + "Shift-Ctrl-L": "splitSelectionByLine", + "Esc": "singleSelectionTop", + "Ctrl-Enter": "insertLineAfter", + "Shift-Ctrl-Enter": "insertLineBefore", + "Ctrl-D": "selectNextOccurrence", + "Shift-Ctrl-Space": "selectScope", + "Shift-Ctrl-M": "selectBetweenBrackets", + "Ctrl-M": "goToBracket", + "Shift-Ctrl-Up": "swapLineUp", + "Shift-Ctrl-Down": "swapLineDown", + "Ctrl-/": "toggleCommentIndented", + "Ctrl-J": "joinLines", + "Shift-Ctrl-D": "duplicateLine", + "F9": "sortLines", + "Shift-F9": "reverseSortLines", + "Ctrl-F9": "sortLinesInsensitive", + "Shift-Ctrl-F9": "reverseSortLinesInsensitive", + "F2": "nextBookmark", + "Shift-F2": "prevBookmark", + "Ctrl-F2": "toggleBookmark", + "Shift-Ctrl-F2": "clearBookmarks", + "Alt-F2": "selectBookmarks", + "Backspace": "smartBackspace", + "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence", + "Ctrl-K Ctrl-K": "delLineRight", + "Ctrl-K Ctrl-U": "upcaseAtCursor", + "Ctrl-K Ctrl-L": "downcaseAtCursor", + "Ctrl-K Ctrl-Space": "setSublimeMark", + "Ctrl-K Ctrl-A": "selectToSublimeMark", + "Ctrl-K Ctrl-W": "deleteToSublimeMark", + "Ctrl-K Ctrl-X": "swapWithSublimeMark", + "Ctrl-K Ctrl-Y": "sublimeYank", + "Ctrl-K Ctrl-C": "showInCenter", + "Ctrl-K Ctrl-G": "clearBookmarks", + "Ctrl-K Ctrl-Backspace": "delLineLeft", + "Ctrl-K Ctrl-1": "foldAll", + "Ctrl-K Ctrl-0": "unfoldAll", + "Ctrl-K Ctrl-J": "unfoldAll", + "Ctrl-Alt-Up": "addCursorToPrevLine", + "Ctrl-Alt-Down": "addCursorToNextLine", + "Ctrl-F3": "findUnder", + "Shift-Ctrl-F3": "findUnderPrevious", + "Alt-F3": "findAllUnder", + "Shift-Ctrl-[": "fold", + "Shift-Ctrl-]": "unfold", + "Ctrl-I": "findIncremental", + "Shift-Ctrl-I": "findIncrementalReverse", + "Ctrl-H": "replace", + "F3": "findNext", + "Shift-F3": "findPrev", + "fallthrough": "pcDefault" + }; + CodeMirror.normalizeKeyMap(keyMap.pcSublime); + var mac = keyMap.default == keyMap.macDefault; + keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime; +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/lib/codemirror.js": +/*!**********************************************************!*\ + !*** ../../../node_modules/codemirror/lib/codemirror.js ***! + \**********************************************************/ +/***/ (function(module) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +// This is CodeMirror (https://codemirror.net), a code editor +// implemented in JavaScript on top of the browser's DOM. +// +// You can find some technical background for some of the code below +// at http://marijnhaverbeke.nl/blog/#cm-internals . + +(function (global, factory) { + true ? module.exports = factory() : 0; +})(void 0, function () { + 'use strict'; + + // Kludges for bugs and behavior differences that can't be feature + // detected are enabled based on userAgent etc sniffing. + var userAgent = navigator.userAgent; + var platform = navigator.platform; + var gecko = /gecko\/\d/i.test(userAgent); + var ie_upto10 = /MSIE \d/.test(userAgent); + var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); + var edge = /Edge\/(\d+)/.exec(userAgent); + var ie = ie_upto10 || ie_11up || edge; + var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); + var webkit = !edge && /WebKit\//.test(userAgent); + var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); + var chrome = !edge && /Chrome\//.test(userAgent); + var presto = /Opera\//.test(userAgent); + var safari = /Apple Computer/.test(navigator.vendor); + var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); + var phantom = /PhantomJS/.test(userAgent); + var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); + var android = /Android/.test(userAgent); + // This is woefully incomplete. Suggestions for alternative methods welcome. + var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); + var mac = ios || /Mac/.test(platform); + var chromeOS = /\bCrOS\b/.test(userAgent); + var windows = /win/i.test(platform); + var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); + if (presto_version) { + presto_version = Number(presto_version[1]); + } + if (presto_version && presto_version >= 15) { + presto = false; + webkit = true; + } + // Some browsers use the wrong event properties to signal cmd/ctrl on OS X + var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); + var captureRightClick = gecko || ie && ie_version >= 9; + function classTest(cls) { + return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); + } + var rmClass = function (node, cls) { + var current = node.className; + var match = classTest(cls).exec(current); + if (match) { + var after = current.slice(match.index + match[0].length); + node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); + } + }; + function removeChildren(e) { + for (var count = e.childNodes.length; count > 0; --count) { + e.removeChild(e.firstChild); + } + return e; + } + function removeChildrenAndAdd(parent, e) { + return removeChildren(parent).appendChild(e); + } + function elt(tag, content, className, style) { + var e = document.createElement(tag); + if (className) { + e.className = className; + } + if (style) { + e.style.cssText = style; + } + if (typeof content == "string") { + e.appendChild(document.createTextNode(content)); + } else if (content) { + for (var i = 0; i < content.length; ++i) { + e.appendChild(content[i]); + } + } + return e; + } + // wrapper for elt, which removes the elt from the accessibility tree + function eltP(tag, content, className, style) { + var e = elt(tag, content, className, style); + e.setAttribute("role", "presentation"); + return e; + } + var range; + if (document.createRange) { + range = function (node, start, end, endNode) { + var r = document.createRange(); + r.setEnd(endNode || node, end); + r.setStart(node, start); + return r; + }; + } else { + range = function (node, start, end) { + var r = document.body.createTextRange(); + try { + r.moveToElementText(node.parentNode); + } catch (e) { + return r; + } + r.collapse(true); + r.moveEnd("character", end); + r.moveStart("character", start); + return r; + }; + } + function contains(parent, child) { + if (child.nodeType == 3) + // Android browser always returns false when child is a textnode + { + child = child.parentNode; + } + if (parent.contains) { + return parent.contains(child); + } + do { + if (child.nodeType == 11) { + child = child.host; + } + if (child == parent) { + return true; + } + } while (child = child.parentNode); + } + function activeElt() { + // IE and Edge may throw an "Unspecified Error" when accessing document.activeElement. + // IE < 10 will throw when accessed while the page is loading or in an iframe. + // IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable. + var activeElement; + try { + activeElement = document.activeElement; + } catch (e) { + activeElement = document.body || null; + } + while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) { + activeElement = activeElement.shadowRoot.activeElement; + } + return activeElement; + } + function addClass(node, cls) { + var current = node.className; + if (!classTest(cls).test(current)) { + node.className += (current ? " " : "") + cls; + } + } + function joinClasses(a, b) { + var as = a.split(" "); + for (var i = 0; i < as.length; i++) { + if (as[i] && !classTest(as[i]).test(b)) { + b += " " + as[i]; + } + } + return b; + } + var selectInput = function (node) { + node.select(); + }; + if (ios) + // Mobile Safari apparently has a bug where select() is broken. + { + selectInput = function (node) { + node.selectionStart = 0; + node.selectionEnd = node.value.length; + }; + } else if (ie) + // Suppress mysterious IE10 errors + { + selectInput = function (node) { + try { + node.select(); + } catch (_e) {} + }; + } + function bind(f) { + var args = Array.prototype.slice.call(arguments, 1); + return function () { + return f.apply(null, args); + }; + } + function copyObj(obj, target, overwrite) { + if (!target) { + target = {}; + } + for (var prop in obj) { + if (obj.hasOwnProperty(prop) && (overwrite !== false || !target.hasOwnProperty(prop))) { + target[prop] = obj[prop]; + } + } + return target; + } + + // Counts the column offset in a string, taking tabs into account. + // Used mostly to find indentation. + function countColumn(string, end, tabSize, startIndex, startValue) { + if (end == null) { + end = string.search(/[^\s\u00a0]/); + if (end == -1) { + end = string.length; + } + } + for (var i = startIndex || 0, n = startValue || 0;;) { + var nextTab = string.indexOf("\t", i); + if (nextTab < 0 || nextTab >= end) { + return n + (end - i); + } + n += nextTab - i; + n += tabSize - n % tabSize; + i = nextTab + 1; + } + } + var Delayed = function () { + this.id = null; + this.f = null; + this.time = 0; + this.handler = bind(this.onTimeout, this); + }; + Delayed.prototype.onTimeout = function (self) { + self.id = 0; + if (self.time <= +new Date()) { + self.f(); + } else { + setTimeout(self.handler, self.time - +new Date()); + } + }; + Delayed.prototype.set = function (ms, f) { + this.f = f; + var time = +new Date() + ms; + if (!this.id || time < this.time) { + clearTimeout(this.id); + this.id = setTimeout(this.handler, ms); + this.time = time; + } + }; + function indexOf(array, elt) { + for (var i = 0; i < array.length; ++i) { + if (array[i] == elt) { + return i; + } + } + return -1; + } + + // Number of pixels added to scroller and sizer to hide scrollbar + var scrollerGap = 50; + + // Returned or thrown by various protocols to signal 'I'm not + // handling this'. + var Pass = { + toString: function () { + return "CodeMirror.Pass"; + } + }; + + // Reused option objects for setSelection & friends + var sel_dontScroll = { + scroll: false + }, + sel_mouse = { + origin: "*mouse" + }, + sel_move = { + origin: "+move" + }; + + // The inverse of countColumn -- find the offset that corresponds to + // a particular column. + function findColumn(string, goal, tabSize) { + for (var pos = 0, col = 0;;) { + var nextTab = string.indexOf("\t", pos); + if (nextTab == -1) { + nextTab = string.length; + } + var skipped = nextTab - pos; + if (nextTab == string.length || col + skipped >= goal) { + return pos + Math.min(skipped, goal - col); + } + col += nextTab - pos; + col += tabSize - col % tabSize; + pos = nextTab + 1; + if (col >= goal) { + return pos; + } + } + } + var spaceStrs = [""]; + function spaceStr(n) { + while (spaceStrs.length <= n) { + spaceStrs.push(lst(spaceStrs) + " "); + } + return spaceStrs[n]; + } + function lst(arr) { + return arr[arr.length - 1]; + } + function map(array, f) { + var out = []; + for (var i = 0; i < array.length; i++) { + out[i] = f(array[i], i); + } + return out; + } + function insertSorted(array, value, score) { + var pos = 0, + priority = score(value); + while (pos < array.length && score(array[pos]) <= priority) { + pos++; + } + array.splice(pos, 0, value); + } + function nothing() {} + function createObj(base, props) { + var inst; + if (Object.create) { + inst = Object.create(base); + } else { + nothing.prototype = base; + inst = new nothing(); + } + if (props) { + copyObj(props, inst); + } + return inst; + } + var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; + function isWordCharBasic(ch) { + return /\w/.test(ch) || ch > "\x80" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); + } + function isWordChar(ch, helper) { + if (!helper) { + return isWordCharBasic(ch); + } + if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { + return true; + } + return helper.test(ch); + } + function isEmpty(obj) { + for (var n in obj) { + if (obj.hasOwnProperty(n) && obj[n]) { + return false; + } + } + return true; + } + + // Extending unicode characters. A series of a non-extending char + + // any number of extending chars is treated as a single unit as far + // as editing and measuring is concerned. This is not fully correct, + // since some scripts/fonts/browsers also treat other configurations + // of code points as a group. + var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; + function isExtendingChar(ch) { + return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); + } + + // Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range. + function skipExtendingChars(str, pos, dir) { + while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { + pos += dir; + } + return pos; + } + + // Returns the value from the range [`from`; `to`] that satisfies + // `pred` and is closest to `from`. Assumes that at least `to` + // satisfies `pred`. Supports `from` being greater than `to`. + function findFirst(pred, from, to) { + // At any point we are certain `to` satisfies `pred`, don't know + // whether `from` does. + var dir = from > to ? -1 : 1; + for (;;) { + if (from == to) { + return from; + } + var midF = (from + to) / 2, + mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); + if (mid == from) { + return pred(mid) ? from : to; + } + if (pred(mid)) { + to = mid; + } else { + from = mid + dir; + } + } + } + + // BIDI HELPERS + + function iterateBidiSections(order, from, to, f) { + if (!order) { + return f(from, to, "ltr", 0); + } + var found = false; + for (var i = 0; i < order.length; ++i) { + var part = order[i]; + if (part.from < to && part.to > from || from == to && part.to == from) { + f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i); + found = true; + } + } + if (!found) { + f(from, to, "ltr"); + } + } + var bidiOther = null; + function getBidiPartAt(order, ch, sticky) { + var found; + bidiOther = null; + for (var i = 0; i < order.length; ++i) { + var cur = order[i]; + if (cur.from < ch && cur.to > ch) { + return i; + } + if (cur.to == ch) { + if (cur.from != cur.to && sticky == "before") { + found = i; + } else { + bidiOther = i; + } + } + if (cur.from == ch) { + if (cur.from != cur.to && sticky != "before") { + found = i; + } else { + bidiOther = i; + } + } + } + return found != null ? found : bidiOther; + } + + // Bidirectional ordering algorithm + // See http://unicode.org/reports/tr9/tr9-13.html for the algorithm + // that this (partially) implements. + + // One-char codes used for character types: + // L (L): Left-to-Right + // R (R): Right-to-Left + // r (AL): Right-to-Left Arabic + // 1 (EN): European Number + // + (ES): European Number Separator + // % (ET): European Number Terminator + // n (AN): Arabic Number + // , (CS): Common Number Separator + // m (NSM): Non-Spacing Mark + // b (BN): Boundary Neutral + // s (B): Paragraph Separator + // t (S): Segment Separator + // w (WS): Whitespace + // N (ON): Other Neutrals + + // Returns null if characters are ordered as they appear + // (left-to-right), or an array of sections ({from, to, level} + // objects) in the order in which they occur visually. + var bidiOrdering = function () { + // Character types for codepoints 0 to 0xff + var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; + // Character types for codepoints 0x600 to 0x6f9 + var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; + function charType(code) { + if (code <= 0xf7) { + return lowTypes.charAt(code); + } else if (0x590 <= code && code <= 0x5f4) { + return "R"; + } else if (0x600 <= code && code <= 0x6f9) { + return arabicTypes.charAt(code - 0x600); + } else if (0x6ee <= code && code <= 0x8ac) { + return "r"; + } else if (0x2000 <= code && code <= 0x200b) { + return "w"; + } else if (code == 0x200c) { + return "b"; + } else { + return "L"; + } + } + var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; + var isNeutral = /[stwN]/, + isStrong = /[LRr]/, + countsAsLeft = /[Lb1n]/, + countsAsNum = /[1n]/; + function BidiSpan(level, from, to) { + this.level = level; + this.from = from; + this.to = to; + } + return function (str, direction) { + var outerType = direction == "ltr" ? "L" : "R"; + if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { + return false; + } + var len = str.length, + types = []; + for (var i = 0; i < len; ++i) { + types.push(charType(str.charCodeAt(i))); + } + + // W1. Examine each non-spacing mark (NSM) in the level run, and + // change the type of the NSM to the type of the previous + // character. If the NSM is at the start of the level run, it will + // get the type of sor. + for (var i$1 = 0, prev = outerType; i$1 < len; ++i$1) { + var type = types[i$1]; + if (type == "m") { + types[i$1] = prev; + } else { + prev = type; + } + } + + // W2. Search backwards from each instance of a European number + // until the first strong type (R, L, AL, or sor) is found. If an + // AL is found, change the type of the European number to Arabic + // number. + // W3. Change all ALs to R. + for (var i$2 = 0, cur = outerType; i$2 < len; ++i$2) { + var type$1 = types[i$2]; + if (type$1 == "1" && cur == "r") { + types[i$2] = "n"; + } else if (isStrong.test(type$1)) { + cur = type$1; + if (type$1 == "r") { + types[i$2] = "R"; + } + } + } + + // W4. A single European separator between two European numbers + // changes to a European number. A single common separator between + // two numbers of the same type changes to that type. + for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { + var type$2 = types[i$3]; + if (type$2 == "+" && prev$1 == "1" && types[i$3 + 1] == "1") { + types[i$3] = "1"; + } else if (type$2 == "," && prev$1 == types[i$3 + 1] && (prev$1 == "1" || prev$1 == "n")) { + types[i$3] = prev$1; + } + prev$1 = type$2; + } + + // W5. A sequence of European terminators adjacent to European + // numbers changes to all European numbers. + // W6. Otherwise, separators and terminators change to Other + // Neutral. + for (var i$4 = 0; i$4 < len; ++i$4) { + var type$3 = types[i$4]; + if (type$3 == ",") { + types[i$4] = "N"; + } else if (type$3 == "%") { + var end = void 0; + for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} + var replace = i$4 && types[i$4 - 1] == "!" || end < len && types[end] == "1" ? "1" : "N"; + for (var j = i$4; j < end; ++j) { + types[j] = replace; + } + i$4 = end - 1; + } + } + + // W7. Search backwards from each instance of a European number + // until the first strong type (R, L, or sor) is found. If an L is + // found, then change the type of the European number to L. + for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { + var type$4 = types[i$5]; + if (cur$1 == "L" && type$4 == "1") { + types[i$5] = "L"; + } else if (isStrong.test(type$4)) { + cur$1 = type$4; + } + } + + // N1. A sequence of neutrals takes the direction of the + // surrounding strong text if the text on both sides has the same + // direction. European and Arabic numbers act as if they were R in + // terms of their influence on neutrals. Start-of-level-run (sor) + // and end-of-level-run (eor) are used at level run boundaries. + // N2. Any remaining neutrals take the embedding direction. + for (var i$6 = 0; i$6 < len; ++i$6) { + if (isNeutral.test(types[i$6])) { + var end$1 = void 0; + for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} + var before = (i$6 ? types[i$6 - 1] : outerType) == "L"; + var after = (end$1 < len ? types[end$1] : outerType) == "L"; + var replace$1 = before == after ? before ? "L" : "R" : outerType; + for (var j$1 = i$6; j$1 < end$1; ++j$1) { + types[j$1] = replace$1; + } + i$6 = end$1 - 1; + } + } + + // Here we depart from the documented algorithm, in order to avoid + // building up an actual levels array. Since there are only three + // levels (0, 1, 2) in an implementation that doesn't take + // explicit embedding into account, we can build up the order on + // the fly, without following the level-based algorithm. + var order = [], + m; + for (var i$7 = 0; i$7 < len;) { + if (countsAsLeft.test(types[i$7])) { + var start = i$7; + for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} + order.push(new BidiSpan(0, start, i$7)); + } else { + var pos = i$7, + at = order.length, + isRTL = direction == "rtl" ? 1 : 0; + for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} + for (var j$2 = pos; j$2 < i$7;) { + if (countsAsNum.test(types[j$2])) { + if (pos < j$2) { + order.splice(at, 0, new BidiSpan(1, pos, j$2)); + at += isRTL; + } + var nstart = j$2; + for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} + order.splice(at, 0, new BidiSpan(2, nstart, j$2)); + at += isRTL; + pos = j$2; + } else { + ++j$2; + } + } + if (pos < i$7) { + order.splice(at, 0, new BidiSpan(1, pos, i$7)); + } + } + } + if (direction == "ltr") { + if (order[0].level == 1 && (m = str.match(/^\s+/))) { + order[0].from = m[0].length; + order.unshift(new BidiSpan(0, 0, m[0].length)); + } + if (lst(order).level == 1 && (m = str.match(/\s+$/))) { + lst(order).to -= m[0].length; + order.push(new BidiSpan(0, len - m[0].length, len)); + } + } + return direction == "rtl" ? order.reverse() : order; + }; + }(); + + // Get the bidi ordering for the given line (and cache it). Returns + // false for lines that are fully left-to-right, and an array of + // BidiSpan objects otherwise. + function getOrder(line, direction) { + var order = line.order; + if (order == null) { + order = line.order = bidiOrdering(line.text, direction); + } + return order; + } + + // EVENT HANDLING + + // Lightweight event framework. on/off also work on DOM nodes, + // registering native DOM handlers. + + var noHandlers = []; + var on = function (emitter, type, f) { + if (emitter.addEventListener) { + emitter.addEventListener(type, f, false); + } else if (emitter.attachEvent) { + emitter.attachEvent("on" + type, f); + } else { + var map = emitter._handlers || (emitter._handlers = {}); + map[type] = (map[type] || noHandlers).concat(f); + } + }; + function getHandlers(emitter, type) { + return emitter._handlers && emitter._handlers[type] || noHandlers; + } + function off(emitter, type, f) { + if (emitter.removeEventListener) { + emitter.removeEventListener(type, f, false); + } else if (emitter.detachEvent) { + emitter.detachEvent("on" + type, f); + } else { + var map = emitter._handlers, + arr = map && map[type]; + if (arr) { + var index = indexOf(arr, f); + if (index > -1) { + map[type] = arr.slice(0, index).concat(arr.slice(index + 1)); + } + } + } + } + function signal(emitter, type /*, values...*/) { + var handlers = getHandlers(emitter, type); + if (!handlers.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2); + for (var i = 0; i < handlers.length; ++i) { + handlers[i].apply(null, args); + } + } + + // The DOM events that CodeMirror handles can be overridden by + // registering a (non-DOM) handler on the editor for the event name, + // and preventDefault-ing the event in that handler. + function signalDOMEvent(cm, e, override) { + if (typeof e == "string") { + e = { + type: e, + preventDefault: function () { + this.defaultPrevented = true; + } + }; + } + signal(cm, override || e.type, cm, e); + return e_defaultPrevented(e) || e.codemirrorIgnore; + } + function signalCursorActivity(cm) { + var arr = cm._handlers && cm._handlers.cursorActivity; + if (!arr) { + return; + } + var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); + for (var i = 0; i < arr.length; ++i) { + if (indexOf(set, arr[i]) == -1) { + set.push(arr[i]); + } + } + } + function hasHandler(emitter, type) { + return getHandlers(emitter, type).length > 0; + } + + // Add on and off methods to a constructor's prototype, to make + // registering events on such objects more convenient. + function eventMixin(ctor) { + ctor.prototype.on = function (type, f) { + on(this, type, f); + }; + ctor.prototype.off = function (type, f) { + off(this, type, f); + }; + } + + // Due to the fact that we still support jurassic IE versions, some + // compatibility wrappers are needed. + + function e_preventDefault(e) { + if (e.preventDefault) { + e.preventDefault(); + } else { + e.returnValue = false; + } + } + function e_stopPropagation(e) { + if (e.stopPropagation) { + e.stopPropagation(); + } else { + e.cancelBubble = true; + } + } + function e_defaultPrevented(e) { + return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; + } + function e_stop(e) { + e_preventDefault(e); + e_stopPropagation(e); + } + function e_target(e) { + return e.target || e.srcElement; + } + function e_button(e) { + var b = e.which; + if (b == null) { + if (e.button & 1) { + b = 1; + } else if (e.button & 2) { + b = 3; + } else if (e.button & 4) { + b = 2; + } + } + if (mac && e.ctrlKey && b == 1) { + b = 3; + } + return b; + } + + // Detect drag-and-drop + var dragAndDrop = function () { + // There is *some* kind of drag-and-drop support in IE6-8, but I + // couldn't get it to work yet. + if (ie && ie_version < 9) { + return false; + } + var div = elt('div'); + return "draggable" in div || "dragDrop" in div; + }(); + var zwspSupported; + function zeroWidthElement(measure) { + if (zwspSupported == null) { + var test = elt("span", "\u200b"); + removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); + if (measure.firstChild.offsetHeight != 0) { + zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); + } + } + var node = zwspSupported ? elt("span", "\u200b") : elt("span", "\u00a0", null, "display: inline-block; width: 1px; margin-right: -1px"); + node.setAttribute("cm-text", ""); + return node; + } + + // Feature-detect IE's crummy client rect reporting for bidi text + var badBidiRects; + function hasBadBidiRects(measure) { + if (badBidiRects != null) { + return badBidiRects; + } + var txt = removeChildrenAndAdd(measure, document.createTextNode("A\u062eA")); + var r0 = range(txt, 0, 1).getBoundingClientRect(); + var r1 = range(txt, 1, 2).getBoundingClientRect(); + removeChildren(measure); + if (!r0 || r0.left == r0.right) { + return false; + } // Safari returns null in some cases (#2780) + return badBidiRects = r1.right - r0.right < 3; + } + + // See if "".split is the broken IE version, if so, provide an + // alternative way to split lines. + var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { + var pos = 0, + result = [], + l = string.length; + while (pos <= l) { + var nl = string.indexOf("\n", pos); + if (nl == -1) { + nl = string.length; + } + var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); + var rt = line.indexOf("\r"); + if (rt != -1) { + result.push(line.slice(0, rt)); + pos += rt + 1; + } else { + result.push(line); + pos = nl + 1; + } + } + return result; + } : function (string) { + return string.split(/\r\n?|\n/); + }; + var hasSelection = window.getSelection ? function (te) { + try { + return te.selectionStart != te.selectionEnd; + } catch (e) { + return false; + } + } : function (te) { + var range; + try { + range = te.ownerDocument.selection.createRange(); + } catch (e) {} + if (!range || range.parentElement() != te) { + return false; + } + return range.compareEndPoints("StartToEnd", range) != 0; + }; + var hasCopyEvent = function () { + var e = elt("div"); + if ("oncopy" in e) { + return true; + } + e.setAttribute("oncopy", "return;"); + return typeof e.oncopy == "function"; + }(); + var badZoomedRects = null; + function hasBadZoomedRects(measure) { + if (badZoomedRects != null) { + return badZoomedRects; + } + var node = removeChildrenAndAdd(measure, elt("span", "x")); + var normal = node.getBoundingClientRect(); + var fromRange = range(node, 0, 1).getBoundingClientRect(); + return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; + } + + // Known modes, by name and by MIME + var modes = {}, + mimeModes = {}; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + function defineMode(name, mode) { + if (arguments.length > 2) { + mode.dependencies = Array.prototype.slice.call(arguments, 2); + } + modes[name] = mode; + } + function defineMIME(mime, spec) { + mimeModes[mime] = spec; + } + + // Given a MIME type, a {name, ...options} config object, or a name + // string, return a mode config object. + function resolveMode(spec) { + if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { + spec = mimeModes[spec]; + } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { + var found = mimeModes[spec.name]; + if (typeof found == "string") { + found = { + name: found + }; + } + spec = createObj(found, spec); + spec.name = found.name; + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { + return resolveMode("application/xml"); + } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { + return resolveMode("application/json"); + } + if (typeof spec == "string") { + return { + name: spec + }; + } else { + return spec || { + name: "null" + }; + } + } + + // Given a mode spec (anything that resolveMode accepts), find and + // initialize an actual mode object. + function getMode(options, spec) { + spec = resolveMode(spec); + var mfactory = modes[spec.name]; + if (!mfactory) { + return getMode(options, "text/plain"); + } + var modeObj = mfactory(options, spec); + if (modeExtensions.hasOwnProperty(spec.name)) { + var exts = modeExtensions[spec.name]; + for (var prop in exts) { + if (!exts.hasOwnProperty(prop)) { + continue; + } + if (modeObj.hasOwnProperty(prop)) { + modeObj["_" + prop] = modeObj[prop]; + } + modeObj[prop] = exts[prop]; + } + } + modeObj.name = spec.name; + if (spec.helperType) { + modeObj.helperType = spec.helperType; + } + if (spec.modeProps) { + for (var prop$1 in spec.modeProps) { + modeObj[prop$1] = spec.modeProps[prop$1]; + } + } + return modeObj; + } + + // This can be used to attach properties to mode objects from + // outside the actual mode definition. + var modeExtensions = {}; + function extendMode(mode, properties) { + var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : modeExtensions[mode] = {}; + copyObj(properties, exts); + } + function copyState(mode, state) { + if (state === true) { + return state; + } + if (mode.copyState) { + return mode.copyState(state); + } + var nstate = {}; + for (var n in state) { + var val = state[n]; + if (val instanceof Array) { + val = val.concat([]); + } + nstate[n] = val; + } + return nstate; + } + + // Given a mode and a state (for that mode), find the inner mode and + // state at the position that the state refers to. + function innerMode(mode, state) { + var info; + while (mode.innerMode) { + info = mode.innerMode(state); + if (!info || info.mode == mode) { + break; + } + state = info.state; + mode = info.mode; + } + return info || { + mode: mode, + state: state + }; + } + function startState(mode, a1, a2) { + return mode.startState ? mode.startState(a1, a2) : true; + } + + // STRING STREAM + + // Fed to the mode parsers, provides helper functions to make + // parsers more succinct. + + var StringStream = function (string, tabSize, lineOracle) { + this.pos = this.start = 0; + this.string = string; + this.tabSize = tabSize || 8; + this.lastColumnPos = this.lastColumnValue = 0; + this.lineStart = 0; + this.lineOracle = lineOracle; + }; + StringStream.prototype.eol = function () { + return this.pos >= this.string.length; + }; + StringStream.prototype.sol = function () { + return this.pos == this.lineStart; + }; + StringStream.prototype.peek = function () { + return this.string.charAt(this.pos) || undefined; + }; + StringStream.prototype.next = function () { + if (this.pos < this.string.length) { + return this.string.charAt(this.pos++); + } + }; + StringStream.prototype.eat = function (match) { + var ch = this.string.charAt(this.pos); + var ok; + if (typeof match == "string") { + ok = ch == match; + } else { + ok = ch && (match.test ? match.test(ch) : match(ch)); + } + if (ok) { + ++this.pos; + return ch; + } + }; + StringStream.prototype.eatWhile = function (match) { + var start = this.pos; + while (this.eat(match)) {} + return this.pos > start; + }; + StringStream.prototype.eatSpace = function () { + var start = this.pos; + while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { + ++this.pos; + } + return this.pos > start; + }; + StringStream.prototype.skipToEnd = function () { + this.pos = this.string.length; + }; + StringStream.prototype.skipTo = function (ch) { + var found = this.string.indexOf(ch, this.pos); + if (found > -1) { + this.pos = found; + return true; + } + }; + StringStream.prototype.backUp = function (n) { + this.pos -= n; + }; + StringStream.prototype.column = function () { + if (this.lastColumnPos < this.start) { + this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); + this.lastColumnPos = this.start; + } + return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.indentation = function () { + return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); + }; + StringStream.prototype.match = function (pattern, consume, caseInsensitive) { + if (typeof pattern == "string") { + var cased = function (str) { + return caseInsensitive ? str.toLowerCase() : str; + }; + var substr = this.string.substr(this.pos, pattern.length); + if (cased(substr) == cased(pattern)) { + if (consume !== false) { + this.pos += pattern.length; + } + return true; + } + } else { + var match = this.string.slice(this.pos).match(pattern); + if (match && match.index > 0) { + return null; + } + if (match && consume !== false) { + this.pos += match[0].length; + } + return match; + } + }; + StringStream.prototype.current = function () { + return this.string.slice(this.start, this.pos); + }; + StringStream.prototype.hideFirstChars = function (n, inner) { + this.lineStart += n; + try { + return inner(); + } finally { + this.lineStart -= n; + } + }; + StringStream.prototype.lookAhead = function (n) { + var oracle = this.lineOracle; + return oracle && oracle.lookAhead(n); + }; + StringStream.prototype.baseToken = function () { + var oracle = this.lineOracle; + return oracle && oracle.baseToken(this.pos); + }; + + // Find the line object corresponding to the given line number. + function getLine(doc, n) { + n -= doc.first; + if (n < 0 || n >= doc.size) { + throw new Error("There is no line " + (n + doc.first) + " in the document."); + } + var chunk = doc; + while (!chunk.lines) { + for (var i = 0;; ++i) { + var child = chunk.children[i], + sz = child.chunkSize(); + if (n < sz) { + chunk = child; + break; + } + n -= sz; + } + } + return chunk.lines[n]; + } + + // Get the part of a document between two positions, as an array of + // strings. + function getBetween(doc, start, end) { + var out = [], + n = start.line; + doc.iter(start.line, end.line + 1, function (line) { + var text = line.text; + if (n == end.line) { + text = text.slice(0, end.ch); + } + if (n == start.line) { + text = text.slice(start.ch); + } + out.push(text); + ++n; + }); + return out; + } + // Get the lines between from and to, as array of strings. + function getLines(doc, from, to) { + var out = []; + doc.iter(from, to, function (line) { + out.push(line.text); + }); // iter aborts when callback returns truthy value + return out; + } + + // Update the height of a line, propagating the height change + // upwards to parent nodes. + function updateLineHeight(line, height) { + var diff = height - line.height; + if (diff) { + for (var n = line; n; n = n.parent) { + n.height += diff; + } + } + } + + // Given a line object, find its line number by walking up through + // its parent links. + function lineNo(line) { + if (line.parent == null) { + return null; + } + var cur = line.parent, + no = indexOf(cur.lines, line); + for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { + for (var i = 0;; ++i) { + if (chunk.children[i] == cur) { + break; + } + no += chunk.children[i].chunkSize(); + } + } + return no + cur.first; + } + + // Find the line at the given vertical position, using the height + // information in the document tree. + function lineAtHeight(chunk, h) { + var n = chunk.first; + outer: do { + for (var i$1 = 0; i$1 < chunk.children.length; ++i$1) { + var child = chunk.children[i$1], + ch = child.height; + if (h < ch) { + chunk = child; + continue outer; + } + h -= ch; + n += child.chunkSize(); + } + return n; + } while (!chunk.lines); + var i = 0; + for (; i < chunk.lines.length; ++i) { + var line = chunk.lines[i], + lh = line.height; + if (h < lh) { + break; + } + h -= lh; + } + return n + i; + } + function isLine(doc, l) { + return l >= doc.first && l < doc.first + doc.size; + } + function lineNumberFor(options, i) { + return String(options.lineNumberFormatter(i + options.firstLineNumber)); + } + + // A Pos instance represents a position within the text. + function Pos(line, ch, sticky) { + if (sticky === void 0) sticky = null; + if (!(this instanceof Pos)) { + return new Pos(line, ch, sticky); + } + this.line = line; + this.ch = ch; + this.sticky = sticky; + } + + // Compare two positions, return 0 if they are the same, a negative + // number when a is less, and a positive number otherwise. + function cmp(a, b) { + return a.line - b.line || a.ch - b.ch; + } + function equalCursorPos(a, b) { + return a.sticky == b.sticky && cmp(a, b) == 0; + } + function copyPos(x) { + return Pos(x.line, x.ch); + } + function maxPos(a, b) { + return cmp(a, b) < 0 ? b : a; + } + function minPos(a, b) { + return cmp(a, b) < 0 ? a : b; + } + + // Most of the external API clips given positions to make sure they + // actually exist within the document. + function clipLine(doc, n) { + return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1)); + } + function clipPos(doc, pos) { + if (pos.line < doc.first) { + return Pos(doc.first, 0); + } + var last = doc.first + doc.size - 1; + if (pos.line > last) { + return Pos(last, getLine(doc, last).text.length); + } + return clipToLen(pos, getLine(doc, pos.line).text.length); + } + function clipToLen(pos, linelen) { + var ch = pos.ch; + if (ch == null || ch > linelen) { + return Pos(pos.line, linelen); + } else if (ch < 0) { + return Pos(pos.line, 0); + } else { + return pos; + } + } + function clipPosArray(doc, array) { + var out = []; + for (var i = 0; i < array.length; i++) { + out[i] = clipPos(doc, array[i]); + } + return out; + } + var SavedContext = function (state, lookAhead) { + this.state = state; + this.lookAhead = lookAhead; + }; + var Context = function (doc, state, line, lookAhead) { + this.state = state; + this.doc = doc; + this.line = line; + this.maxLookAhead = lookAhead || 0; + this.baseTokens = null; + this.baseTokenPos = 1; + }; + Context.prototype.lookAhead = function (n) { + var line = this.doc.getLine(this.line + n); + if (line != null && n > this.maxLookAhead) { + this.maxLookAhead = n; + } + return line; + }; + Context.prototype.baseToken = function (n) { + if (!this.baseTokens) { + return null; + } + while (this.baseTokens[this.baseTokenPos] <= n) { + this.baseTokenPos += 2; + } + var type = this.baseTokens[this.baseTokenPos + 1]; + return { + type: type && type.replace(/( |^)overlay .*/, ""), + size: this.baseTokens[this.baseTokenPos] - n + }; + }; + Context.prototype.nextLine = function () { + this.line++; + if (this.maxLookAhead > 0) { + this.maxLookAhead--; + } + }; + Context.fromSaved = function (doc, saved, line) { + if (saved instanceof SavedContext) { + return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead); + } else { + return new Context(doc, copyState(doc.mode, saved), line); + } + }; + Context.prototype.save = function (copy) { + var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; + return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state; + }; + + // Compute a style array (an array starting with a mode generation + // -- for invalidation -- followed by pairs of end positions and + // style strings), which is used to highlight the tokens on the + // line. + function highlightLine(cm, line, context, forceToEnd) { + // A styles array always starts with a number identifying the + // mode/overlays that it is based on (for easy invalidation). + var st = [cm.state.modeGen], + lineClasses = {}; + // Compute the base array of styles + runMode(cm, line.text, cm.doc.mode, context, function (end, style) { + return st.push(end, style); + }, lineClasses, forceToEnd); + var state = context.state; + + // Run overlays, adjust style array. + var loop = function (o) { + context.baseTokens = st; + var overlay = cm.state.overlays[o], + i = 1, + at = 0; + context.state = true; + runMode(cm, line.text, overlay.mode, context, function (end, style) { + var start = i; + // Ensure there's a token end at the current position, and that i points at it + while (at < end) { + var i_end = st[i]; + if (i_end > end) { + st.splice(i, 1, end, st[i + 1], i_end); + } + i += 2; + at = Math.min(end, i_end); + } + if (!style) { + return; + } + if (overlay.opaque) { + st.splice(start, i - start, end, "overlay " + style); + i = start + 2; + } else { + for (; start < i; start += 2) { + var cur = st[start + 1]; + st[start + 1] = (cur ? cur + " " : "") + "overlay " + style; + } + } + }, lineClasses); + context.state = state; + context.baseTokens = null; + context.baseTokenPos = 1; + }; + for (var o = 0; o < cm.state.overlays.length; ++o) loop(o); + return { + styles: st, + classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null + }; + } + function getLineStyles(cm, line, updateFrontier) { + if (!line.styles || line.styles[0] != cm.state.modeGen) { + var context = getContextBefore(cm, lineNo(line)); + var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); + var result = highlightLine(cm, line, context); + if (resetState) { + context.state = resetState; + } + line.stateAfter = context.save(!resetState); + line.styles = result.styles; + if (result.classes) { + line.styleClasses = result.classes; + } else if (line.styleClasses) { + line.styleClasses = null; + } + if (updateFrontier === cm.doc.highlightFrontier) { + cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); + } + } + return line.styles; + } + function getContextBefore(cm, n, precise) { + var doc = cm.doc, + display = cm.display; + if (!doc.mode.startState) { + return new Context(doc, true, n); + } + var start = findStartLine(cm, n, precise); + var saved = start > doc.first && getLine(doc, start - 1).stateAfter; + var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); + doc.iter(start, n, function (line) { + processLine(cm, line.text, context); + var pos = context.line; + line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; + context.nextLine(); + }); + if (precise) { + doc.modeFrontier = context.line; + } + return context; + } + + // Lightweight form of highlight -- proceed over this line and + // update state, but don't save a style array. Used for lines that + // aren't currently visible. + function processLine(cm, text, context, startAt) { + var mode = cm.doc.mode; + var stream = new StringStream(text, cm.options.tabSize, context); + stream.start = stream.pos = startAt || 0; + if (text == "") { + callBlankLine(mode, context.state); + } + while (!stream.eol()) { + readToken(mode, stream, context.state); + stream.start = stream.pos; + } + } + function callBlankLine(mode, state) { + if (mode.blankLine) { + return mode.blankLine(state); + } + if (!mode.innerMode) { + return; + } + var inner = innerMode(mode, state); + if (inner.mode.blankLine) { + return inner.mode.blankLine(inner.state); + } + } + function readToken(mode, stream, state, inner) { + for (var i = 0; i < 10; i++) { + if (inner) { + inner[0] = innerMode(mode, state).mode; + } + var style = mode.token(stream, state); + if (stream.pos > stream.start) { + return style; + } + } + throw new Error("Mode " + mode.name + " failed to advance stream."); + } + var Token = function (stream, type, state) { + this.start = stream.start; + this.end = stream.pos; + this.string = stream.current(); + this.type = type || null; + this.state = state; + }; + + // Utility for getTokenAt and getLineTokens + function takeToken(cm, pos, precise, asArray) { + var doc = cm.doc, + mode = doc.mode, + style; + pos = clipPos(doc, pos); + var line = getLine(doc, pos.line), + context = getContextBefore(cm, pos.line, precise); + var stream = new StringStream(line.text, cm.options.tabSize, context), + tokens; + if (asArray) { + tokens = []; + } + while ((asArray || stream.pos < pos.ch) && !stream.eol()) { + stream.start = stream.pos; + style = readToken(mode, stream, context.state); + if (asArray) { + tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); + } + } + return asArray ? tokens : new Token(stream, style, context.state); + } + function extractLineClasses(type, output) { + if (type) { + for (;;) { + var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); + if (!lineClass) { + break; + } + type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); + var prop = lineClass[1] ? "bgClass" : "textClass"; + if (output[prop] == null) { + output[prop] = lineClass[2]; + } else if (!new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)").test(output[prop])) { + output[prop] += " " + lineClass[2]; + } + } + } + return type; + } + + // Run the given mode's parser over a line, calling f for each token. + function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { + var flattenSpans = mode.flattenSpans; + if (flattenSpans == null) { + flattenSpans = cm.options.flattenSpans; + } + var curStart = 0, + curStyle = null; + var stream = new StringStream(text, cm.options.tabSize, context), + style; + var inner = cm.options.addModeClass && [null]; + if (text == "") { + extractLineClasses(callBlankLine(mode, context.state), lineClasses); + } + while (!stream.eol()) { + if (stream.pos > cm.options.maxHighlightLength) { + flattenSpans = false; + if (forceToEnd) { + processLine(cm, text, context, stream.pos); + } + stream.pos = text.length; + style = null; + } else { + style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); + } + if (inner) { + var mName = inner[0].name; + if (mName) { + style = "m-" + (style ? mName + " " + style : mName); + } + } + if (!flattenSpans || curStyle != style) { + while (curStart < stream.start) { + curStart = Math.min(stream.start, curStart + 5000); + f(curStart, curStyle); + } + curStyle = style; + } + stream.start = stream.pos; + } + while (curStart < stream.pos) { + // Webkit seems to refuse to render text nodes longer than 57444 + // characters, and returns inaccurate measurements in nodes + // starting around 5000 chars. + var pos = Math.min(stream.pos, curStart + 5000); + f(pos, curStyle); + curStart = pos; + } + } + + // Finds the line to start with when starting a parse. Tries to + // find a line with a stateAfter, so that it can start with a + // valid state. If that fails, it returns the line with the + // smallest indentation, which tends to need the least context to + // parse correctly. + function findStartLine(cm, n, precise) { + var minindent, + minline, + doc = cm.doc; + var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1000 : 100); + for (var search = n; search > lim; --search) { + if (search <= doc.first) { + return doc.first; + } + var line = getLine(doc, search - 1), + after = line.stateAfter; + if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) { + return search; + } + var indented = countColumn(line.text, null, cm.options.tabSize); + if (minline == null || minindent > indented) { + minline = search - 1; + minindent = indented; + } + } + return minline; + } + function retreatFrontier(doc, n) { + doc.modeFrontier = Math.min(doc.modeFrontier, n); + if (doc.highlightFrontier < n - 10) { + return; + } + var start = doc.first; + for (var line = n - 1; line > start; line--) { + var saved = getLine(doc, line).stateAfter; + // change is on 3 + // state on line 1 looked ahead 2 -- so saw 3 + // test 1 + 2 < 3 should cover this + if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { + start = line + 1; + break; + } + } + doc.highlightFrontier = Math.min(doc.highlightFrontier, start); + } + + // Optimize some code when these features are not used. + var sawReadOnlySpans = false, + sawCollapsedSpans = false; + function seeReadOnlySpans() { + sawReadOnlySpans = true; + } + function seeCollapsedSpans() { + sawCollapsedSpans = true; + } + + // TEXTMARKER SPANS + + function MarkedSpan(marker, from, to) { + this.marker = marker; + this.from = from; + this.to = to; + } + + // Search an array of spans for a span matching the given marker. + function getMarkedSpanFor(spans, marker) { + if (spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.marker == marker) { + return span; + } + } + } + } + + // Remove a span from an array, returning undefined if no spans are + // left (we don't store arrays for lines without spans). + function removeMarkedSpan(spans, span) { + var r; + for (var i = 0; i < spans.length; ++i) { + if (spans[i] != span) { + (r || (r = [])).push(spans[i]); + } + } + return r; + } + + // Add a span to a line. + function addMarkedSpan(line, span, op) { + var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = new WeakSet())); + if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { + line.markedSpans.push(span); + } else { + line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; + if (inThisOp) { + inThisOp.add(line.markedSpans); + } + } + span.marker.attachLine(line); + } + + // Used for the algorithm that adjusts markers for a change in the + // document. These functions cut an array of spans at a given + // character position, returning an array of remaining chunks (or + // undefined if nothing remains). + function markedSpansBefore(old, startCh, isInsert) { + var nw; + if (old) { + for (var i = 0; i < old.length; ++i) { + var span = old[i], + marker = span.marker; + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); + if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); + (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); + } + } + } + return nw; + } + function markedSpansAfter(old, endCh, isInsert) { + var nw; + if (old) { + for (var i = 0; i < old.length; ++i) { + var span = old[i], + marker = span.marker; + var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); + if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { + var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); + (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, span.to == null ? null : span.to - endCh)); + } + } + } + return nw; + } + + // Given a change object, compute the new set of marker spans that + // cover the line in which the change took place. Removes spans + // entirely within the change, reconnects spans belonging to the + // same marker that appear on both sides of the change, and cuts off + // spans partially within the change. Returns an array of span + // arrays with one element for each line in (after) the change. + function stretchSpansOverChange(doc, change) { + if (change.full) { + return null; + } + var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; + var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; + if (!oldFirst && !oldLast) { + return null; + } + var startCh = change.from.ch, + endCh = change.to.ch, + isInsert = cmp(change.from, change.to) == 0; + // Get the spans that 'stick out' on both sides + var first = markedSpansBefore(oldFirst, startCh, isInsert); + var last = markedSpansAfter(oldLast, endCh, isInsert); + + // Next, merge those two ends + var sameLine = change.text.length == 1, + offset = lst(change.text).length + (sameLine ? startCh : 0); + if (first) { + // Fix up .to properties of first + for (var i = 0; i < first.length; ++i) { + var span = first[i]; + if (span.to == null) { + var found = getMarkedSpanFor(last, span.marker); + if (!found) { + span.to = startCh; + } else if (sameLine) { + span.to = found.to == null ? null : found.to + offset; + } + } + } + } + if (last) { + // Fix up .from in last (or move them into first in case of sameLine) + for (var i$1 = 0; i$1 < last.length; ++i$1) { + var span$1 = last[i$1]; + if (span$1.to != null) { + span$1.to += offset; + } + if (span$1.from == null) { + var found$1 = getMarkedSpanFor(first, span$1.marker); + if (!found$1) { + span$1.from = offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } else { + span$1.from += offset; + if (sameLine) { + (first || (first = [])).push(span$1); + } + } + } + } + // Make sure we didn't create any zero-length spans + if (first) { + first = clearEmptySpans(first); + } + if (last && last != first) { + last = clearEmptySpans(last); + } + var newMarkers = [first]; + if (!sameLine) { + // Fill gap with whole-line-spans + var gap = change.text.length - 2, + gapMarkers; + if (gap > 0 && first) { + for (var i$2 = 0; i$2 < first.length; ++i$2) { + if (first[i$2].to == null) { + (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$2].marker, null, null)); + } + } + } + for (var i$3 = 0; i$3 < gap; ++i$3) { + newMarkers.push(gapMarkers); + } + newMarkers.push(last); + } + return newMarkers; + } + + // Remove spans that are empty and don't have a clearWhenEmpty + // option of false. + function clearEmptySpans(spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) { + spans.splice(i--, 1); + } + } + if (!spans.length) { + return null; + } + return spans; + } + + // Used to 'clip' out readOnly ranges when making a change. + function removeReadOnlyRanges(doc, from, to) { + var markers = null; + doc.iter(from.line, to.line + 1, function (line) { + if (line.markedSpans) { + for (var i = 0; i < line.markedSpans.length; ++i) { + var mark = line.markedSpans[i].marker; + if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) { + (markers || (markers = [])).push(mark); + } + } + } + }); + if (!markers) { + return null; + } + var parts = [{ + from: from, + to: to + }]; + for (var i = 0; i < markers.length; ++i) { + var mk = markers[i], + m = mk.find(0); + for (var j = 0; j < parts.length; ++j) { + var p = parts[j]; + if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { + continue; + } + var newParts = [j, 1], + dfrom = cmp(p.from, m.from), + dto = cmp(p.to, m.to); + if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) { + newParts.push({ + from: p.from, + to: m.from + }); + } + if (dto > 0 || !mk.inclusiveRight && !dto) { + newParts.push({ + from: m.to, + to: p.to + }); + } + parts.splice.apply(parts, newParts); + j += newParts.length - 3; + } + } + return parts; + } + + // Connect or disconnect spans from a line. + function detachMarkedSpans(line) { + var spans = line.markedSpans; + if (!spans) { + return; + } + for (var i = 0; i < spans.length; ++i) { + spans[i].marker.detachLine(line); + } + line.markedSpans = null; + } + function attachMarkedSpans(line, spans) { + if (!spans) { + return; + } + for (var i = 0; i < spans.length; ++i) { + spans[i].marker.attachLine(line); + } + line.markedSpans = spans; + } + + // Helpers used when computing which overlapping collapsed span + // counts as the larger one. + function extraLeft(marker) { + return marker.inclusiveLeft ? -1 : 0; + } + function extraRight(marker) { + return marker.inclusiveRight ? 1 : 0; + } + + // Returns a number indicating which of two overlapping collapsed + // spans is larger (and thus includes the other). Falls back to + // comparing ids when the spans cover exactly the same range. + function compareCollapsedMarkers(a, b) { + var lenDiff = a.lines.length - b.lines.length; + if (lenDiff != 0) { + return lenDiff; + } + var aPos = a.find(), + bPos = b.find(); + var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); + if (fromCmp) { + return -fromCmp; + } + var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); + if (toCmp) { + return toCmp; + } + return b.id - a.id; + } + + // Find out whether a line ends or starts in a collapsed span. If + // so, return the marker for that span. + function collapsedSpanAtSide(line, start) { + var sps = sawCollapsedSpans && line.markedSpans, + found; + if (sps) { + for (var sp = void 0, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + function collapsedSpanAtStart(line) { + return collapsedSpanAtSide(line, true); + } + function collapsedSpanAtEnd(line) { + return collapsedSpanAtSide(line, false); + } + function collapsedSpanAround(line, ch) { + var sps = sawCollapsedSpans && line.markedSpans, + found; + if (sps) { + for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { + found = sp.marker; + } + } + } + return found; + } + + // Test whether there exists a collapsed span that partially + // overlaps (covers the start or end, but not both) of a new span. + // Such overlap is not allowed. + function conflictingCollapsedRange(doc, lineNo, from, to, marker) { + var line = getLine(doc, lineNo); + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var i = 0; i < sps.length; ++i) { + var sp = sps[i]; + if (!sp.marker.collapsed) { + continue; + } + var found = sp.marker.find(0); + var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); + var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); + if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { + continue; + } + if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) { + return true; + } + } + } + } + + // A visual line is a line as drawn on the screen. Folding, for + // example, can cause multiple logical lines to appear on the same + // visual line. This finds the start of the visual line that the + // given line is part of (usually that is the line itself). + function visualLine(line) { + var merged; + while (merged = collapsedSpanAtStart(line)) { + line = merged.find(-1, true).line; + } + return line; + } + function visualLineEnd(line) { + var merged; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return line; + } + + // Returns an array of logical lines that continue the visual line + // started by the argument, or undefined if there are no such lines. + function visualLineContinued(line) { + var merged, lines; + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + (lines || (lines = [])).push(line); + } + return lines; + } + + // Get the line number of the start of the visual line that the + // given line number is part of. + function visualLineNo(doc, lineN) { + var line = getLine(doc, lineN), + vis = visualLine(line); + if (line == vis) { + return lineN; + } + return lineNo(vis); + } + + // Get the line number of the start of the next visual line after + // the given line. + function visualLineEndNo(doc, lineN) { + if (lineN > doc.lastLine()) { + return lineN; + } + var line = getLine(doc, lineN), + merged; + if (!lineIsHidden(doc, line)) { + return lineN; + } + while (merged = collapsedSpanAtEnd(line)) { + line = merged.find(1, true).line; + } + return lineNo(line) + 1; + } + + // Compute whether a line is hidden. Lines count as hidden when they + // are part of a visual line that starts with another line, or when + // they are entirely covered by collapsed, non-widget span. + function lineIsHidden(doc, line) { + var sps = sawCollapsedSpans && line.markedSpans; + if (sps) { + for (var sp = void 0, i = 0; i < sps.length; ++i) { + sp = sps[i]; + if (!sp.marker.collapsed) { + continue; + } + if (sp.from == null) { + return true; + } + if (sp.marker.widgetNode) { + continue; + } + if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) { + return true; + } + } + } + } + function lineIsHiddenInner(doc, line, span) { + if (span.to == null) { + var end = span.marker.find(1, true); + return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); + } + if (span.marker.inclusiveRight && span.to == line.text.length) { + return true; + } + for (var sp = void 0, i = 0; i < line.markedSpans.length; ++i) { + sp = line.markedSpans[i]; + if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) { + return true; + } + } + } + + // Find the height above the given line. + function heightAtLine(lineObj) { + lineObj = visualLine(lineObj); + var h = 0, + chunk = lineObj.parent; + for (var i = 0; i < chunk.lines.length; ++i) { + var line = chunk.lines[i]; + if (line == lineObj) { + break; + } else { + h += line.height; + } + } + for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { + for (var i$1 = 0; i$1 < p.children.length; ++i$1) { + var cur = p.children[i$1]; + if (cur == chunk) { + break; + } else { + h += cur.height; + } + } + } + return h; + } + + // Compute the character length of a line, taking into account + // collapsed ranges (see markText) that might hide parts, and join + // other lines onto it. + function lineLength(line) { + if (line.height == 0) { + return 0; + } + var len = line.text.length, + merged, + cur = line; + while (merged = collapsedSpanAtStart(cur)) { + var found = merged.find(0, true); + cur = found.from.line; + len += found.from.ch - found.to.ch; + } + cur = line; + while (merged = collapsedSpanAtEnd(cur)) { + var found$1 = merged.find(0, true); + len -= cur.text.length - found$1.from.ch; + cur = found$1.to.line; + len += cur.text.length - found$1.to.ch; + } + return len; + } + + // Find the longest line in the document. + function findMaxLine(cm) { + var d = cm.display, + doc = cm.doc; + d.maxLine = getLine(doc, doc.first); + d.maxLineLength = lineLength(d.maxLine); + d.maxLineChanged = true; + doc.iter(function (line) { + var len = lineLength(line); + if (len > d.maxLineLength) { + d.maxLineLength = len; + d.maxLine = line; + } + }); + } + + // LINE DATA STRUCTURE + + // Line objects. These hold state related to a line, including + // highlighting info (the styles array). + var Line = function (text, markedSpans, estimateHeight) { + this.text = text; + attachMarkedSpans(this, markedSpans); + this.height = estimateHeight ? estimateHeight(this) : 1; + }; + Line.prototype.lineNo = function () { + return lineNo(this); + }; + eventMixin(Line); + + // Change the content (text, markers) of a line. Automatically + // invalidates cached information and tries to re-estimate the + // line's height. + function updateLine(line, text, markedSpans, estimateHeight) { + line.text = text; + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + if (line.order != null) { + line.order = null; + } + detachMarkedSpans(line); + attachMarkedSpans(line, markedSpans); + var estHeight = estimateHeight ? estimateHeight(line) : 1; + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + } + + // Detach a line from the document tree and its markers. + function cleanUpLine(line) { + line.parent = null; + detachMarkedSpans(line); + } + + // Convert a style as returned by a mode (either null, or a string + // containing one or more styles) to a CSS style. This is cached, + // and also looks for line-wide styles. + var styleToClassCache = {}, + styleToClassCacheWithMode = {}; + function interpretTokenStyle(style, options) { + if (!style || /^\s*$/.test(style)) { + return null; + } + var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; + return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); + } + + // Render the DOM representation of the text of a line. Also builds + // up a 'line map', which points at the DOM nodes that represent + // specific stretches of text, and is used by the measuring code. + // The returned object contains the DOM node, this map, and + // information about line-wide styles that were set by the mode. + function buildLineContent(cm, lineView) { + // The padding-right forces the element to have a 'border', which + // is needed on Webkit to be able to get line-level bounding + // rectangles for it (in measureChar). + var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); + var builder = { + pre: eltP("pre", [content], "CodeMirror-line"), + content: content, + col: 0, + pos: 0, + cm: cm, + trailingSpace: false, + splitSpaces: cm.getOption("lineWrapping") + }; + lineView.measure = {}; + + // Iterate over the logical lines that make up this visual line. + for (var i = 0; i <= (lineView.rest ? lineView.rest.length : 0); i++) { + var line = i ? lineView.rest[i - 1] : lineView.line, + order = void 0; + builder.pos = 0; + builder.addToken = buildToken; + // Optionally wire in some hacks into the token-rendering + // algorithm, to deal with browser quirks. + if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) { + builder.addToken = buildTokenBadBidi(builder.addToken, order); + } + builder.map = []; + var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); + insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); + if (line.styleClasses) { + if (line.styleClasses.bgClass) { + builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); + } + if (line.styleClasses.textClass) { + builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); + } + } + + // Ensure at least a single node is present, for measuring. + if (builder.map.length == 0) { + builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); + } + + // Store the map and a cache object for the current logical line + if (i == 0) { + lineView.measure.map = builder.map; + lineView.measure.cache = {}; + } else { + (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); + (lineView.measure.caches || (lineView.measure.caches = [])).push({}); + } + } + + // See issue #2901 + if (webkit) { + var last = builder.content.lastChild; + if (/\bcm-tab\b/.test(last.className) || last.querySelector && last.querySelector(".cm-tab")) { + builder.content.className = "cm-tab-wrap-hack"; + } + } + signal(cm, "renderLine", cm, lineView.line, builder.pre); + if (builder.pre.className) { + builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); + } + return builder; + } + function defaultSpecialCharPlaceholder(ch) { + var token = elt("span", "\u2022", "cm-invalidchar"); + token.title = "\\u" + ch.charCodeAt(0).toString(16); + token.setAttribute("aria-label", token.title); + return token; + } + + // Build up the DOM representation for a single token, and add it to + // the line map. Takes care to render special characters separately. + function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { + if (!text) { + return; + } + var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; + var special = builder.cm.state.specialChars, + mustWrap = false; + var content; + if (!special.test(text)) { + builder.col += text.length; + content = document.createTextNode(displayText); + builder.map.push(builder.pos, builder.pos + text.length, content); + if (ie && ie_version < 9) { + mustWrap = true; + } + builder.pos += text.length; + } else { + content = document.createDocumentFragment(); + var pos = 0; + while (true) { + special.lastIndex = pos; + var m = special.exec(text); + var skipped = m ? m.index - pos : text.length - pos; + if (skipped) { + var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt])); + } else { + content.appendChild(txt); + } + builder.map.push(builder.pos, builder.pos + skipped, txt); + builder.col += skipped; + builder.pos += skipped; + } + if (!m) { + break; + } + pos += skipped + 1; + var txt$1 = void 0; + if (m[0] == "\t") { + var tabSize = builder.cm.options.tabSize, + tabWidth = tabSize - builder.col % tabSize; + txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); + txt$1.setAttribute("role", "presentation"); + txt$1.setAttribute("cm-text", "\t"); + builder.col += tabWidth; + } else if (m[0] == "\r" || m[0] == "\n") { + txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "\u240d" : "\u2424", "cm-invalidchar")); + txt$1.setAttribute("cm-text", m[0]); + builder.col += 1; + } else { + txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); + txt$1.setAttribute("cm-text", m[0]); + if (ie && ie_version < 9) { + content.appendChild(elt("span", [txt$1])); + } else { + content.appendChild(txt$1); + } + builder.col += 1; + } + builder.map.push(builder.pos, builder.pos + 1, txt$1); + builder.pos++; + } + } + builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; + if (style || startStyle || endStyle || mustWrap || css || attributes) { + var fullStyle = style || ""; + if (startStyle) { + fullStyle += startStyle; + } + if (endStyle) { + fullStyle += endStyle; + } + var token = elt("span", [content], fullStyle, css); + if (attributes) { + for (var attr in attributes) { + if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") { + token.setAttribute(attr, attributes[attr]); + } + } + } + return builder.content.appendChild(token); + } + builder.content.appendChild(content); + } + + // Change some spaces to NBSP to prevent the browser from collapsing + // trailing spaces at the end of a line when rendering text (issue #1362). + function splitSpaces(text, trailingBefore) { + if (text.length > 1 && !/ /.test(text)) { + return text; + } + var spaceBefore = trailingBefore, + result = ""; + for (var i = 0; i < text.length; i++) { + var ch = text.charAt(i); + if (ch == " " && spaceBefore && (i == text.length - 1 || text.charCodeAt(i + 1) == 32)) { + ch = "\u00a0"; + } + result += ch; + spaceBefore = ch == " "; + } + return result; + } + + // Work around nonsense dimensions being reported for stretches of + // right-to-left text. + function buildTokenBadBidi(inner, order) { + return function (builder, text, style, startStyle, endStyle, css, attributes) { + style = style ? style + " cm-force-border" : "cm-force-border"; + var start = builder.pos, + end = start + text.length; + for (;;) { + // Find the part that overlaps with the start of this text + var part = void 0; + for (var i = 0; i < order.length; i++) { + part = order[i]; + if (part.to > start && part.from <= start) { + break; + } + } + if (part.to >= end) { + return inner(builder, text, style, startStyle, endStyle, css, attributes); + } + inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); + startStyle = null; + text = text.slice(part.to - start); + start = part.to; + } + }; + } + function buildCollapsedSpan(builder, size, marker, ignoreWidget) { + var widget = !ignoreWidget && marker.widgetNode; + if (widget) { + builder.map.push(builder.pos, builder.pos + size, widget); + } + if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { + if (!widget) { + widget = builder.content.appendChild(document.createElement("span")); + } + widget.setAttribute("cm-marker", marker.id); + } + if (widget) { + builder.cm.display.input.setUneditable(widget); + builder.content.appendChild(widget); + } + builder.pos += size; + builder.trailingSpace = false; + } + + // Outputs a number of spans to make up a line, taking highlighting + // and marked text into account. + function insertLineContent(line, builder, styles) { + var spans = line.markedSpans, + allText = line.text, + at = 0; + if (!spans) { + for (var i$1 = 1; i$1 < styles.length; i$1 += 2) { + builder.addToken(builder, allText.slice(at, at = styles[i$1]), interpretTokenStyle(styles[i$1 + 1], builder.cm.options)); + } + return; + } + var len = allText.length, + pos = 0, + i = 1, + text = "", + style, + css; + var nextChange = 0, + spanStyle, + spanEndStyle, + spanStartStyle, + collapsed, + attributes; + for (;;) { + if (nextChange == pos) { + // Update current marker set + spanStyle = spanEndStyle = spanStartStyle = css = ""; + attributes = null; + collapsed = null; + nextChange = Infinity; + var foundBookmarks = [], + endStyles = void 0; + for (var j = 0; j < spans.length; ++j) { + var sp = spans[j], + m = sp.marker; + if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { + foundBookmarks.push(m); + } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { + if (sp.to != null && sp.to != pos && nextChange > sp.to) { + nextChange = sp.to; + spanEndStyle = ""; + } + if (m.className) { + spanStyle += " " + m.className; + } + if (m.css) { + css = (css ? css + ";" : "") + m.css; + } + if (m.startStyle && sp.from == pos) { + spanStartStyle += " " + m.startStyle; + } + if (m.endStyle && sp.to == nextChange) { + (endStyles || (endStyles = [])).push(m.endStyle, sp.to); + } + // support for the old title property + // https://github.com/codemirror/CodeMirror/pull/5673 + if (m.title) { + (attributes || (attributes = {})).title = m.title; + } + if (m.attributes) { + for (var attr in m.attributes) { + (attributes || (attributes = {}))[attr] = m.attributes[attr]; + } + } + if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) { + collapsed = sp; + } + } else if (sp.from > pos && nextChange > sp.from) { + nextChange = sp.from; + } + } + if (endStyles) { + for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) { + if (endStyles[j$1 + 1] == nextChange) { + spanEndStyle += " " + endStyles[j$1]; + } + } + } + if (!collapsed || collapsed.from == pos) { + for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) { + buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); + } + } + if (collapsed && (collapsed.from || 0) == pos) { + buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, collapsed.marker, collapsed.from == null); + if (collapsed.to == null) { + return; + } + if (collapsed.to == pos) { + collapsed = false; + } + } + } + if (pos >= len) { + break; + } + var upto = Math.min(len, nextChange); + while (true) { + if (text) { + var end = pos + text.length; + if (!collapsed) { + var tokenText = end > upto ? text.slice(0, upto - pos) : text; + builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); + } + if (end >= upto) { + text = text.slice(upto - pos); + pos = upto; + break; + } + pos = end; + spanStartStyle = ""; + } + text = allText.slice(at, at = styles[i++]); + style = interpretTokenStyle(styles[i++], builder.cm.options); + } + } + } + + // These objects are used to represent the visible (currently drawn) + // part of the document. A LineView may correspond to multiple + // logical lines, if those are connected by collapsed ranges. + function LineView(doc, line, lineN) { + // The starting line + this.line = line; + // Continuing lines, if any + this.rest = visualLineContinued(line); + // Number of logical lines in this visual line + this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; + this.node = this.text = null; + this.hidden = lineIsHidden(doc, line); + } + + // Create a range of LineView objects for the given lines. + function buildViewArray(cm, from, to) { + var array = [], + nextPos; + for (var pos = from; pos < to; pos = nextPos) { + var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); + nextPos = pos + view.size; + array.push(view); + } + return array; + } + var operationGroup = null; + function pushOperation(op) { + if (operationGroup) { + operationGroup.ops.push(op); + } else { + op.ownsGroup = operationGroup = { + ops: [op], + delayedCallbacks: [] + }; + } + } + function fireCallbacksForOps(group) { + // Calls delayed callbacks and cursorActivity handlers until no + // new ones appear + var callbacks = group.delayedCallbacks, + i = 0; + do { + for (; i < callbacks.length; i++) { + callbacks[i].call(null); + } + for (var j = 0; j < group.ops.length; j++) { + var op = group.ops[j]; + if (op.cursorActivityHandlers) { + while (op.cursorActivityCalled < op.cursorActivityHandlers.length) { + op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); + } + } + } + } while (i < callbacks.length); + } + function finishOperation(op, endCb) { + var group = op.ownsGroup; + if (!group) { + return; + } + try { + fireCallbacksForOps(group); + } finally { + operationGroup = null; + endCb(group); + } + } + var orphanDelayedCallbacks = null; + + // Often, we want to signal events at a point where we are in the + // middle of some work, but don't want the handler to start calling + // other methods on the editor, which might be in an inconsistent + // state or simply not expect any other events to happen. + // signalLater looks whether there are any handlers, and schedules + // them to be executed when the last operation ends, or, if no + // operation is active, when a timeout fires. + function signalLater(emitter, type /*, values...*/) { + var arr = getHandlers(emitter, type); + if (!arr.length) { + return; + } + var args = Array.prototype.slice.call(arguments, 2), + list; + if (operationGroup) { + list = operationGroup.delayedCallbacks; + } else if (orphanDelayedCallbacks) { + list = orphanDelayedCallbacks; + } else { + list = orphanDelayedCallbacks = []; + setTimeout(fireOrphanDelayed, 0); + } + var loop = function (i) { + list.push(function () { + return arr[i].apply(null, args); + }); + }; + for (var i = 0; i < arr.length; ++i) loop(i); + } + function fireOrphanDelayed() { + var delayed = orphanDelayedCallbacks; + orphanDelayedCallbacks = null; + for (var i = 0; i < delayed.length; ++i) { + delayed[i](); + } + } + + // When an aspect of a line changes, a string is added to + // lineView.changes. This updates the relevant part of the line's + // DOM structure. + function updateLineForChanges(cm, lineView, lineN, dims) { + for (var j = 0; j < lineView.changes.length; j++) { + var type = lineView.changes[j]; + if (type == "text") { + updateLineText(cm, lineView); + } else if (type == "gutter") { + updateLineGutter(cm, lineView, lineN, dims); + } else if (type == "class") { + updateLineClasses(cm, lineView); + } else if (type == "widget") { + updateLineWidgets(cm, lineView, dims); + } + } + lineView.changes = null; + } + + // Lines with gutter elements, widgets or a background class need to + // be wrapped, and have the extra elements added to the wrapper div + function ensureLineWrapped(lineView) { + if (lineView.node == lineView.text) { + lineView.node = elt("div", null, null, "position: relative"); + if (lineView.text.parentNode) { + lineView.text.parentNode.replaceChild(lineView.node, lineView.text); + } + lineView.node.appendChild(lineView.text); + if (ie && ie_version < 8) { + lineView.node.style.zIndex = 2; + } + } + return lineView.node; + } + function updateLineBackground(cm, lineView) { + var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; + if (cls) { + cls += " CodeMirror-linebackground"; + } + if (lineView.background) { + if (cls) { + lineView.background.className = cls; + } else { + lineView.background.parentNode.removeChild(lineView.background); + lineView.background = null; + } + } else if (cls) { + var wrap = ensureLineWrapped(lineView); + lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); + cm.display.input.setUneditable(lineView.background); + } + } + + // Wrapper around buildLineContent which will reuse the structure + // in display.externalMeasured when possible. + function getLineContent(cm, lineView) { + var ext = cm.display.externalMeasured; + if (ext && ext.line == lineView.line) { + cm.display.externalMeasured = null; + lineView.measure = ext.measure; + return ext.built; + } + return buildLineContent(cm, lineView); + } + + // Redraw the line's text. Interacts with the background and text + // classes because the mode may output tokens that influence these + // classes. + function updateLineText(cm, lineView) { + var cls = lineView.text.className; + var built = getLineContent(cm, lineView); + if (lineView.text == lineView.node) { + lineView.node = built.pre; + } + lineView.text.parentNode.replaceChild(built.pre, lineView.text); + lineView.text = built.pre; + if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { + lineView.bgClass = built.bgClass; + lineView.textClass = built.textClass; + updateLineClasses(cm, lineView); + } else if (cls) { + lineView.text.className = cls; + } + } + function updateLineClasses(cm, lineView) { + updateLineBackground(cm, lineView); + if (lineView.line.wrapClass) { + ensureLineWrapped(lineView).className = lineView.line.wrapClass; + } else if (lineView.node != lineView.text) { + lineView.node.className = ""; + } + var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; + lineView.text.className = textClass || ""; + } + function updateLineGutter(cm, lineView, lineN, dims) { + if (lineView.gutter) { + lineView.node.removeChild(lineView.gutter); + lineView.gutter = null; + } + if (lineView.gutterBackground) { + lineView.node.removeChild(lineView.gutterBackground); + lineView.gutterBackground = null; + } + if (lineView.line.gutterClass) { + var wrap = ensureLineWrapped(lineView); + lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px"); + cm.display.input.setUneditable(lineView.gutterBackground); + wrap.insertBefore(lineView.gutterBackground, lineView.text); + } + var markers = lineView.line.gutterMarkers; + if (cm.options.lineNumbers || markers) { + var wrap$1 = ensureLineWrapped(lineView); + var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"); + gutterWrap.setAttribute("aria-hidden", "true"); + cm.display.input.setUneditable(gutterWrap); + wrap$1.insertBefore(gutterWrap, lineView.text); + if (lineView.line.gutterClass) { + gutterWrap.className += " " + lineView.line.gutterClass; + } + if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) { + lineView.lineNumber = gutterWrap.appendChild(elt("div", lineNumberFor(cm.options, lineN), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px")); + } + if (markers) { + for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { + var id = cm.display.gutterSpecs[k].className, + found = markers.hasOwnProperty(id) && markers[id]; + if (found) { + gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); + } + } + } + } + } + function updateLineWidgets(cm, lineView, dims) { + if (lineView.alignable) { + lineView.alignable = null; + } + var isWidget = classTest("CodeMirror-linewidget"); + for (var node = lineView.node.firstChild, next = void 0; node; node = next) { + next = node.nextSibling; + if (isWidget.test(node.className)) { + lineView.node.removeChild(node); + } + } + insertLineWidgets(cm, lineView, dims); + } + + // Build a line's DOM representation from scratch + function buildLineElement(cm, lineView, lineN, dims) { + var built = getLineContent(cm, lineView); + lineView.text = lineView.node = built.pre; + if (built.bgClass) { + lineView.bgClass = built.bgClass; + } + if (built.textClass) { + lineView.textClass = built.textClass; + } + updateLineClasses(cm, lineView); + updateLineGutter(cm, lineView, lineN, dims); + insertLineWidgets(cm, lineView, dims); + return lineView.node; + } + + // A lineView may contain multiple logical lines (when merged by + // collapsed spans). The widgets for all of them need to be drawn. + function insertLineWidgets(cm, lineView, dims) { + insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) { + insertLineWidgetsFor(cm, lineView.rest[i], lineView, dims, false); + } + } + } + function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { + if (!line.widgets) { + return; + } + var wrap = ensureLineWrapped(lineView); + for (var i = 0, ws = line.widgets; i < ws.length; ++i) { + var widget = ws[i], + node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); + if (!widget.handleMouseEvents) { + node.setAttribute("cm-ignore-events", "true"); + } + positionLineWidget(widget, node, lineView, dims); + cm.display.input.setUneditable(node); + if (allowAbove && widget.above) { + wrap.insertBefore(node, lineView.gutter || lineView.text); + } else { + wrap.appendChild(node); + } + signalLater(widget, "redraw"); + } + } + function positionLineWidget(widget, node, lineView, dims) { + if (widget.noHScroll) { + (lineView.alignable || (lineView.alignable = [])).push(node); + var width = dims.wrapperWidth; + node.style.left = dims.fixedPos + "px"; + if (!widget.coverGutter) { + width -= dims.gutterTotalWidth; + node.style.paddingLeft = dims.gutterTotalWidth + "px"; + } + node.style.width = width + "px"; + } + if (widget.coverGutter) { + node.style.zIndex = 5; + node.style.position = "relative"; + if (!widget.noHScroll) { + node.style.marginLeft = -dims.gutterTotalWidth + "px"; + } + } + } + function widgetHeight(widget) { + if (widget.height != null) { + return widget.height; + } + var cm = widget.doc.cm; + if (!cm) { + return 0; + } + if (!contains(document.body, widget.node)) { + var parentStyle = "position: relative;"; + if (widget.coverGutter) { + parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; + } + if (widget.noHScroll) { + parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; + } + removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); + } + return widget.height = widget.node.parentNode.offsetHeight; + } + + // Return true when the given mouse event happened in a widget + function eventInWidget(display, e) { + for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { + if (!n || n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) { + return true; + } + } + } + + // POSITION MEASUREMENT + + function paddingTop(display) { + return display.lineSpace.offsetTop; + } + function paddingVert(display) { + return display.mover.offsetHeight - display.lineSpace.offsetHeight; + } + function paddingH(display) { + if (display.cachedPaddingH) { + return display.cachedPaddingH; + } + var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); + var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; + var data = { + left: parseInt(style.paddingLeft), + right: parseInt(style.paddingRight) + }; + if (!isNaN(data.left) && !isNaN(data.right)) { + display.cachedPaddingH = data; + } + return data; + } + function scrollGap(cm) { + return scrollerGap - cm.display.nativeBarWidth; + } + function displayWidth(cm) { + return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; + } + function displayHeight(cm) { + return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; + } + + // Ensure the lineView.wrapping.heights array is populated. This is + // an array of bottom offsets for the lines that make up a drawn + // line. When lineWrapping is on, there might be more than one + // height. + function ensureLineHeights(cm, lineView, rect) { + var wrapping = cm.options.lineWrapping; + var curWidth = wrapping && displayWidth(cm); + if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { + var heights = lineView.measure.heights = []; + if (wrapping) { + lineView.measure.width = curWidth; + var rects = lineView.text.firstChild.getClientRects(); + for (var i = 0; i < rects.length - 1; i++) { + var cur = rects[i], + next = rects[i + 1]; + if (Math.abs(cur.bottom - next.bottom) > 2) { + heights.push((cur.bottom + next.top) / 2 - rect.top); + } + } + } + heights.push(rect.bottom - rect.top); + } + } + + // Find a line map (mapping character offsets to text nodes) and a + // measurement cache for the given line number. (A line view might + // contain multiple lines when collapsed ranges are present.) + function mapFromLineView(lineView, line, lineN) { + if (lineView.line == line) { + return { + map: lineView.measure.map, + cache: lineView.measure.cache + }; + } + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) { + if (lineView.rest[i] == line) { + return { + map: lineView.measure.maps[i], + cache: lineView.measure.caches[i] + }; + } + } + for (var i$1 = 0; i$1 < lineView.rest.length; i$1++) { + if (lineNo(lineView.rest[i$1]) > lineN) { + return { + map: lineView.measure.maps[i$1], + cache: lineView.measure.caches[i$1], + before: true + }; + } + } + } + } + + // Render a line into the hidden node display.externalMeasured. Used + // when measurement is needed for a line that's not in the viewport. + function updateExternalMeasurement(cm, line) { + line = visualLine(line); + var lineN = lineNo(line); + var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); + view.lineN = lineN; + var built = view.built = buildLineContent(cm, view); + view.text = built.pre; + removeChildrenAndAdd(cm.display.lineMeasure, built.pre); + return view; + } + + // Get a {top, bottom, left, right} box (in line-local coordinates) + // for a given character. + function measureChar(cm, line, ch, bias) { + return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); + } + + // Find a line view that corresponds to the given line number. + function findViewForLine(cm, lineN) { + if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) { + return cm.display.view[findViewIndex(cm, lineN)]; + } + var ext = cm.display.externalMeasured; + if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) { + return ext; + } + } + + // Measurement can be split in two steps, the set-up work that + // applies to the whole line, and the measurement of the actual + // character. Functions like coordsChar, that need to do a lot of + // measurements in a row, can thus ensure that the set-up work is + // only done once. + function prepareMeasureForLine(cm, line) { + var lineN = lineNo(line); + var view = findViewForLine(cm, lineN); + if (view && !view.text) { + view = null; + } else if (view && view.changes) { + updateLineForChanges(cm, view, lineN, getDimensions(cm)); + cm.curOp.forceUpdate = true; + } + if (!view) { + view = updateExternalMeasurement(cm, line); + } + var info = mapFromLineView(view, line, lineN); + return { + line: line, + view: view, + rect: null, + map: info.map, + cache: info.cache, + before: info.before, + hasHeights: false + }; + } + + // Given a prepared measurement object, measures the position of an + // actual character (or fetches it from the cache). + function measureCharPrepared(cm, prepared, ch, bias, varHeight) { + if (prepared.before) { + ch = -1; + } + var key = ch + (bias || ""), + found; + if (prepared.cache.hasOwnProperty(key)) { + found = prepared.cache[key]; + } else { + if (!prepared.rect) { + prepared.rect = prepared.view.text.getBoundingClientRect(); + } + if (!prepared.hasHeights) { + ensureLineHeights(cm, prepared.view, prepared.rect); + prepared.hasHeights = true; + } + found = measureCharInner(cm, prepared, ch, bias); + if (!found.bogus) { + prepared.cache[key] = found; + } + } + return { + left: found.left, + right: found.right, + top: varHeight ? found.rtop : found.top, + bottom: varHeight ? found.rbottom : found.bottom + }; + } + var nullRect = { + left: 0, + right: 0, + top: 0, + bottom: 0 + }; + function nodeAndOffsetInLineMap(map, ch, bias) { + var node, start, end, collapse, mStart, mEnd; + // First, search the line map for the text node corresponding to, + // or closest to, the target character. + for (var i = 0; i < map.length; i += 3) { + mStart = map[i]; + mEnd = map[i + 1]; + if (ch < mStart) { + start = 0; + end = 1; + collapse = "left"; + } else if (ch < mEnd) { + start = ch - mStart; + end = start + 1; + } else if (i == map.length - 3 || ch == mEnd && map[i + 3] > ch) { + end = mEnd - mStart; + start = end - 1; + if (ch >= mEnd) { + collapse = "right"; + } + } + if (start != null) { + node = map[i + 2]; + if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) { + collapse = bias; + } + if (bias == "left" && start == 0) { + while (i && map[i - 2] == map[i - 3] && map[i - 1].insertLeft) { + node = map[(i -= 3) + 2]; + collapse = "left"; + } + } + if (bias == "right" && start == mEnd - mStart) { + while (i < map.length - 3 && map[i + 3] == map[i + 4] && !map[i + 5].insertLeft) { + node = map[(i += 3) + 2]; + collapse = "right"; + } + } + break; + } + } + return { + node: node, + start: start, + end: end, + collapse: collapse, + coverStart: mStart, + coverEnd: mEnd + }; + } + function getUsefulRect(rects, bias) { + var rect = nullRect; + if (bias == "left") { + for (var i = 0; i < rects.length; i++) { + if ((rect = rects[i]).left != rect.right) { + break; + } + } + } else { + for (var i$1 = rects.length - 1; i$1 >= 0; i$1--) { + if ((rect = rects[i$1]).left != rect.right) { + break; + } + } + } + return rect; + } + function measureCharInner(cm, prepared, ch, bias) { + var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); + var node = place.node, + start = place.start, + end = place.end, + collapse = place.collapse; + var rect; + if (node.nodeType == 3) { + // If it is a text node, use a range to retrieve the coordinates. + for (var i$1 = 0; i$1 < 4; i$1++) { + // Retry a maximum of 4 times when nonsense rectangles are returned + while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { + --start; + } + while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { + ++end; + } + if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { + rect = node.parentNode.getBoundingClientRect(); + } else { + rect = getUsefulRect(range(node, start, end).getClientRects(), bias); + } + if (rect.left || rect.right || start == 0) { + break; + } + end = start; + start = start - 1; + collapse = "right"; + } + if (ie && ie_version < 11) { + rect = maybeUpdateRectForZooming(cm.display.measure, rect); + } + } else { + // If it is a widget, simply get the box for the whole widget. + if (start > 0) { + collapse = bias = "right"; + } + var rects; + if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) { + rect = rects[bias == "right" ? rects.length - 1 : 0]; + } else { + rect = node.getBoundingClientRect(); + } + } + if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { + var rSpan = node.parentNode.getClientRects()[0]; + if (rSpan) { + rect = { + left: rSpan.left, + right: rSpan.left + charWidth(cm.display), + top: rSpan.top, + bottom: rSpan.bottom + }; + } else { + rect = nullRect; + } + } + var rtop = rect.top - prepared.rect.top, + rbot = rect.bottom - prepared.rect.top; + var mid = (rtop + rbot) / 2; + var heights = prepared.view.measure.heights; + var i = 0; + for (; i < heights.length - 1; i++) { + if (mid < heights[i]) { + break; + } + } + var top = i ? heights[i - 1] : 0, + bot = heights[i]; + var result = { + left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, + right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, + top: top, + bottom: bot + }; + if (!rect.left && !rect.right) { + result.bogus = true; + } + if (!cm.options.singleCursorHeightPerLine) { + result.rtop = rtop; + result.rbottom = rbot; + } + return result; + } + + // Work around problem with bounding client rects on ranges being + // returned incorrectly when zoomed on IE10 and below. + function maybeUpdateRectForZooming(measure, rect) { + if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) { + return rect; + } + var scaleX = screen.logicalXDPI / screen.deviceXDPI; + var scaleY = screen.logicalYDPI / screen.deviceYDPI; + return { + left: rect.left * scaleX, + right: rect.right * scaleX, + top: rect.top * scaleY, + bottom: rect.bottom * scaleY + }; + } + function clearLineMeasurementCacheFor(lineView) { + if (lineView.measure) { + lineView.measure.cache = {}; + lineView.measure.heights = null; + if (lineView.rest) { + for (var i = 0; i < lineView.rest.length; i++) { + lineView.measure.caches[i] = {}; + } + } + } + } + function clearLineMeasurementCache(cm) { + cm.display.externalMeasure = null; + removeChildren(cm.display.lineMeasure); + for (var i = 0; i < cm.display.view.length; i++) { + clearLineMeasurementCacheFor(cm.display.view[i]); + } + } + function clearCaches(cm) { + clearLineMeasurementCache(cm); + cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; + if (!cm.options.lineWrapping) { + cm.display.maxLineChanged = true; + } + cm.display.lineNumChars = null; + } + function pageScrollX() { + // Work around https://bugs.chromium.org/p/chromium/issues/detail?id=489206 + // which causes page_Offset and bounding client rects to use + // different reference viewports and invalidate our calculations. + if (chrome && android) { + return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)); + } + return window.pageXOffset || (document.documentElement || document.body).scrollLeft; + } + function pageScrollY() { + if (chrome && android) { + return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)); + } + return window.pageYOffset || (document.documentElement || document.body).scrollTop; + } + function widgetTopHeight(lineObj) { + var ref = visualLine(lineObj); + var widgets = ref.widgets; + var height = 0; + if (widgets) { + for (var i = 0; i < widgets.length; ++i) { + if (widgets[i].above) { + height += widgetHeight(widgets[i]); + } + } + } + return height; + } + + // Converts a {top, bottom, left, right} box from line-local + // coordinates into another coordinate system. Context may be one of + // "line", "div" (display.lineDiv), "local"./null (editor), "window", + // or "page". + function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { + if (!includeWidgets) { + var height = widgetTopHeight(lineObj); + rect.top += height; + rect.bottom += height; + } + if (context == "line") { + return rect; + } + if (!context) { + context = "local"; + } + var yOff = heightAtLine(lineObj); + if (context == "local") { + yOff += paddingTop(cm.display); + } else { + yOff -= cm.display.viewOffset; + } + if (context == "page" || context == "window") { + var lOff = cm.display.lineSpace.getBoundingClientRect(); + yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); + var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); + rect.left += xOff; + rect.right += xOff; + } + rect.top += yOff; + rect.bottom += yOff; + return rect; + } + + // Coverts a box from "div" coords to another coordinate system. + // Context may be "window", "page", "div", or "local"./null. + function fromCoordSystem(cm, coords, context) { + if (context == "div") { + return coords; + } + var left = coords.left, + top = coords.top; + // First move into "page" coordinate system + if (context == "page") { + left -= pageScrollX(); + top -= pageScrollY(); + } else if (context == "local" || !context) { + var localBox = cm.display.sizer.getBoundingClientRect(); + left += localBox.left; + top += localBox.top; + } + var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); + return { + left: left - lineSpaceBox.left, + top: top - lineSpaceBox.top + }; + } + function charCoords(cm, pos, context, lineObj, bias) { + if (!lineObj) { + lineObj = getLine(cm.doc, pos.line); + } + return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); + } + + // Returns a box for a given cursor position, which may have an + // 'other' property containing the position of the secondary cursor + // on a bidi boundary. + // A cursor Pos(line, char, "before") is on the same visual line as `char - 1` + // and after `char - 1` in writing order of `char - 1` + // A cursor Pos(line, char, "after") is on the same visual line as `char` + // and before `char` in writing order of `char` + // Examples (upper-case letters are RTL, lower-case are LTR): + // Pos(0, 1, ...) + // before after + // ab a|b a|b + // aB a|B aB| + // Ab |Ab A|b + // AB B|A B|A + // Every position after the last character on a line is considered to stick + // to the last character on the line. + function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { + lineObj = lineObj || getLine(cm.doc, pos.line); + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + function get(ch, right) { + var m = measureCharPrepared(cm, preparedMeasure, ch, right ? "right" : "left", varHeight); + if (right) { + m.left = m.right; + } else { + m.right = m.left; + } + return intoCoordSystem(cm, lineObj, m, context); + } + var order = getOrder(lineObj, cm.doc.direction), + ch = pos.ch, + sticky = pos.sticky; + if (ch >= lineObj.text.length) { + ch = lineObj.text.length; + sticky = "before"; + } else if (ch <= 0) { + ch = 0; + sticky = "after"; + } + if (!order) { + return get(sticky == "before" ? ch - 1 : ch, sticky == "before"); + } + function getBidi(ch, partPos, invert) { + var part = order[partPos], + right = part.level == 1; + return get(invert ? ch - 1 : ch, right != invert); + } + var partPos = getBidiPartAt(order, ch, sticky); + var other = bidiOther; + var val = getBidi(ch, partPos, sticky == "before"); + if (other != null) { + val.other = getBidi(ch, other, sticky != "before"); + } + return val; + } + + // Used to cheaply estimate the coordinates for a position. Used for + // intermediate scroll updates. + function estimateCoords(cm, pos) { + var left = 0; + pos = clipPos(cm.doc, pos); + if (!cm.options.lineWrapping) { + left = charWidth(cm.display) * pos.ch; + } + var lineObj = getLine(cm.doc, pos.line); + var top = heightAtLine(lineObj) + paddingTop(cm.display); + return { + left: left, + right: left, + top: top, + bottom: top + lineObj.height + }; + } + + // Positions returned by coordsChar contain some extra information. + // xRel is the relative x position of the input coordinates compared + // to the found position (so xRel > 0 means the coordinates are to + // the right of the character position, for example). When outside + // is true, that means the coordinates lie outside the line's + // vertical range. + function PosWithInfo(line, ch, sticky, outside, xRel) { + var pos = Pos(line, ch, sticky); + pos.xRel = xRel; + if (outside) { + pos.outside = outside; + } + return pos; + } + + // Compute the character position closest to the given coordinates. + // Input must be lineSpace-local ("div" coordinate system). + function coordsChar(cm, x, y) { + var doc = cm.doc; + y += cm.display.viewOffset; + if (y < 0) { + return PosWithInfo(doc.first, 0, null, -1, -1); + } + var lineN = lineAtHeight(doc, y), + last = doc.first + doc.size - 1; + if (lineN > last) { + return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1); + } + if (x < 0) { + x = 0; + } + var lineObj = getLine(doc, lineN); + for (;;) { + var found = coordsCharInner(cm, lineObj, lineN, x, y); + var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); + if (!collapsed) { + return found; + } + var rangeEnd = collapsed.find(1); + if (rangeEnd.line == lineN) { + return rangeEnd; + } + lineObj = getLine(doc, lineN = rangeEnd.line); + } + } + function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { + y -= widgetTopHeight(lineObj); + var end = lineObj.text.length; + var begin = findFirst(function (ch) { + return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; + }, end, 0); + end = findFirst(function (ch) { + return measureCharPrepared(cm, preparedMeasure, ch).top > y; + }, begin, end); + return { + begin: begin, + end: end + }; + } + function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { + if (!preparedMeasure) { + preparedMeasure = prepareMeasureForLine(cm, lineObj); + } + var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; + return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop); + } + + // Returns true if the given side of a box is after the given + // coordinates, in top-to-bottom, left-to-right order. + function boxIsAfter(box, x, y, left) { + return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x; + } + function coordsCharInner(cm, lineObj, lineNo, x, y) { + // Move y into line-local coordinate space + y -= heightAtLine(lineObj); + var preparedMeasure = prepareMeasureForLine(cm, lineObj); + // When directly calling `measureCharPrepared`, we have to adjust + // for the widgets at this line. + var widgetHeight = widgetTopHeight(lineObj); + var begin = 0, + end = lineObj.text.length, + ltr = true; + var order = getOrder(lineObj, cm.doc.direction); + // If the line isn't plain left-to-right text, first figure out + // which bidi section the coordinates fall into. + if (order) { + var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)(cm, lineObj, lineNo, preparedMeasure, order, x, y); + ltr = part.level != 1; + // The awkward -1 offsets are needed because findFirst (called + // on these below) will treat its first bound as inclusive, + // second as exclusive, but we want to actually address the + // characters in the part's range + begin = ltr ? part.from : part.to - 1; + end = ltr ? part.to : part.from - 1; + } + + // A binary search to find the first character whose bounding box + // starts after the coordinates. If we run across any whose box wrap + // the coordinates, store that. + var chAround = null, + boxAround = null; + var ch = findFirst(function (ch) { + var box = measureCharPrepared(cm, preparedMeasure, ch); + box.top += widgetHeight; + box.bottom += widgetHeight; + if (!boxIsAfter(box, x, y, false)) { + return false; + } + if (box.top <= y && box.left <= x) { + chAround = ch; + boxAround = box; + } + return true; + }, begin, end); + var baseX, + sticky, + outside = false; + // If a box around the coordinates was found, use that + if (boxAround) { + // Distinguish coordinates nearer to the left or right side of the box + var atLeft = x - boxAround.left < boxAround.right - x, + atStart = atLeft == ltr; + ch = chAround + (atStart ? 0 : 1); + sticky = atStart ? "after" : "before"; + baseX = atLeft ? boxAround.left : boxAround.right; + } else { + // (Adjust for extended bound, if necessary.) + if (!ltr && (ch == end || ch == begin)) { + ch++; + } + // To determine which side to associate with, get the box to the + // left of the character and compare it's vertical position to the + // coordinates + sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight <= y == ltr ? "after" : "before"; + // Now get accurate coordinates for this place, in order to get a + // base X position + var coords = cursorCoords(cm, Pos(lineNo, ch, sticky), "line", lineObj, preparedMeasure); + baseX = coords.left; + outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; + } + ch = skipExtendingChars(lineObj.text, ch, 1); + return PosWithInfo(lineNo, ch, sticky, outside, x - baseX); + } + function coordsBidiPart(cm, lineObj, lineNo, preparedMeasure, order, x, y) { + // Bidi parts are sorted left-to-right, and in a non-line-wrapping + // situation, we can take this ordering to correspond to the visual + // ordering. This finds the first part whose end is after the given + // coordinates. + var index = findFirst(function (i) { + var part = order[i], + ltr = part.level != 1; + return boxIsAfter(cursorCoords(cm, Pos(lineNo, ltr ? part.to : part.from, ltr ? "before" : "after"), "line", lineObj, preparedMeasure), x, y, true); + }, 0, order.length - 1); + var part = order[index]; + // If this isn't the first part, the part's start is also after + // the coordinates, and the coordinates aren't on the same line as + // that start, move one part back. + if (index > 0) { + var ltr = part.level != 1; + var start = cursorCoords(cm, Pos(lineNo, ltr ? part.from : part.to, ltr ? "after" : "before"), "line", lineObj, preparedMeasure); + if (boxIsAfter(start, x, y, true) && start.top > y) { + part = order[index - 1]; + } + } + return part; + } + function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { + // In a wrapped line, rtl text on wrapping boundaries can do things + // that don't correspond to the ordering in our `order` array at + // all, so a binary search doesn't work, and we want to return a + // part that only spans one line so that the binary search in + // coordsCharInner is safe. As such, we first find the extent of the + // wrapped line, and then do a flat search in which we discard any + // spans that aren't on the line. + var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); + var begin = ref.begin; + var end = ref.end; + if (/\s/.test(lineObj.text.charAt(end - 1))) { + end--; + } + var part = null, + closestDist = null; + for (var i = 0; i < order.length; i++) { + var p = order[i]; + if (p.from >= end || p.to <= begin) { + continue; + } + var ltr = p.level != 1; + var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; + // Weigh against spans ending before this, so that they are only + // picked if nothing ends after + var dist = endX < x ? x - endX + 1e9 : endX - x; + if (!part || closestDist > dist) { + part = p; + closestDist = dist; + } + } + if (!part) { + part = order[order.length - 1]; + } + // Clip the part to the wrapped line. + if (part.from < begin) { + part = { + from: begin, + to: part.to, + level: part.level + }; + } + if (part.to > end) { + part = { + from: part.from, + to: end, + level: part.level + }; + } + return part; + } + var measureText; + // Compute the default text height. + function textHeight(display) { + if (display.cachedTextHeight != null) { + return display.cachedTextHeight; + } + if (measureText == null) { + measureText = elt("pre", null, "CodeMirror-line-like"); + // Measure a bunch of lines, for browsers that compute + // fractional heights. + for (var i = 0; i < 49; ++i) { + measureText.appendChild(document.createTextNode("x")); + measureText.appendChild(elt("br")); + } + measureText.appendChild(document.createTextNode("x")); + } + removeChildrenAndAdd(display.measure, measureText); + var height = measureText.offsetHeight / 50; + if (height > 3) { + display.cachedTextHeight = height; + } + removeChildren(display.measure); + return height || 1; + } + + // Compute the default character width. + function charWidth(display) { + if (display.cachedCharWidth != null) { + return display.cachedCharWidth; + } + var anchor = elt("span", "xxxxxxxxxx"); + var pre = elt("pre", [anchor], "CodeMirror-line-like"); + removeChildrenAndAdd(display.measure, pre); + var rect = anchor.getBoundingClientRect(), + width = (rect.right - rect.left) / 10; + if (width > 2) { + display.cachedCharWidth = width; + } + return width || 10; + } + + // Do a bulk-read of the DOM positions and sizes needed to draw the + // view, so that we don't interleave reading and writing to the DOM. + function getDimensions(cm) { + var d = cm.display, + left = {}, + width = {}; + var gutterLeft = d.gutters.clientLeft; + for (var n = d.gutters.firstChild, i = 0; n; n = n.nextSibling, ++i) { + var id = cm.display.gutterSpecs[i].className; + left[id] = n.offsetLeft + n.clientLeft + gutterLeft; + width[id] = n.clientWidth; + } + return { + fixedPos: compensateForHScroll(d), + gutterTotalWidth: d.gutters.offsetWidth, + gutterLeft: left, + gutterWidth: width, + wrapperWidth: d.wrapper.clientWidth + }; + } + + // Computes display.scroller.scrollLeft + display.gutters.offsetWidth, + // but using getBoundingClientRect to get a sub-pixel-accurate + // result. + function compensateForHScroll(display) { + return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; + } + + // Returns a function that estimates the height of a line, to use as + // first approximation until the line becomes visible (and is thus + // properly measurable). + function estimateHeight(cm) { + var th = textHeight(cm.display), + wrapping = cm.options.lineWrapping; + var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); + return function (line) { + if (lineIsHidden(cm.doc, line)) { + return 0; + } + var widgetsHeight = 0; + if (line.widgets) { + for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].height) { + widgetsHeight += line.widgets[i].height; + } + } + } + if (wrapping) { + return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; + } else { + return widgetsHeight + th; + } + }; + } + function estimateLineHeights(cm) { + var doc = cm.doc, + est = estimateHeight(cm); + doc.iter(function (line) { + var estHeight = est(line); + if (estHeight != line.height) { + updateLineHeight(line, estHeight); + } + }); + } + + // Given a mouse event, find the corresponding position. If liberal + // is false, it checks whether a gutter or scrollbar was clicked, + // and returns null if it was. forRect is used by rectangular + // selections, and tries to estimate a character position even for + // coordinates beyond the right of the text. + function posFromMouse(cm, e, liberal, forRect) { + var display = cm.display; + if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { + return null; + } + var x, + y, + space = display.lineSpace.getBoundingClientRect(); + // Fails unpredictably on IE[67] when mouse is dragged around quickly. + try { + x = e.clientX - space.left; + y = e.clientY - space.top; + } catch (e$1) { + return null; + } + var coords = coordsChar(cm, x, y), + line; + if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { + var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; + coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); + } + return coords; + } + + // Find the view element corresponding to a given line. Return null + // when the line isn't visible. + function findViewIndex(cm, n) { + if (n >= cm.display.viewTo) { + return null; + } + n -= cm.display.viewFrom; + if (n < 0) { + return null; + } + var view = cm.display.view; + for (var i = 0; i < view.length; i++) { + n -= view[i].size; + if (n < 0) { + return i; + } + } + } + + // Updates the display.view data structure for a given change to the + // document. From and to are in pre-change coordinates. Lendiff is + // the amount of lines added or subtracted by the change. This is + // used for changes that span multiple lines, or change the way + // lines are divided into visual lines. regLineChange (below) + // registers single-line changes. + function regChange(cm, from, to, lendiff) { + if (from == null) { + from = cm.doc.first; + } + if (to == null) { + to = cm.doc.first + cm.doc.size; + } + if (!lendiff) { + lendiff = 0; + } + var display = cm.display; + if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) { + display.updateLineNumbers = from; + } + cm.curOp.viewChanged = true; + if (from >= display.viewTo) { + // Change after + if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) { + resetView(cm); + } + } else if (to <= display.viewFrom) { + // Change before + if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { + resetView(cm); + } else { + display.viewFrom += lendiff; + display.viewTo += lendiff; + } + } else if (from <= display.viewFrom && to >= display.viewTo) { + // Full overlap + resetView(cm); + } else if (from <= display.viewFrom) { + // Top overlap + var cut = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cut) { + display.view = display.view.slice(cut.index); + display.viewFrom = cut.lineN; + display.viewTo += lendiff; + } else { + resetView(cm); + } + } else if (to >= display.viewTo) { + // Bottom overlap + var cut$1 = viewCuttingPoint(cm, from, from, -1); + if (cut$1) { + display.view = display.view.slice(0, cut$1.index); + display.viewTo = cut$1.lineN; + } else { + resetView(cm); + } + } else { + // Gap in the middle + var cutTop = viewCuttingPoint(cm, from, from, -1); + var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); + if (cutTop && cutBot) { + display.view = display.view.slice(0, cutTop.index).concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)).concat(display.view.slice(cutBot.index)); + display.viewTo += lendiff; + } else { + resetView(cm); + } + } + var ext = display.externalMeasured; + if (ext) { + if (to < ext.lineN) { + ext.lineN += lendiff; + } else if (from < ext.lineN + ext.size) { + display.externalMeasured = null; + } + } + } + + // Register a change to a single line. Type must be one of "text", + // "gutter", "class", "widget" + function regLineChange(cm, line, type) { + cm.curOp.viewChanged = true; + var display = cm.display, + ext = cm.display.externalMeasured; + if (ext && line >= ext.lineN && line < ext.lineN + ext.size) { + display.externalMeasured = null; + } + if (line < display.viewFrom || line >= display.viewTo) { + return; + } + var lineView = display.view[findViewIndex(cm, line)]; + if (lineView.node == null) { + return; + } + var arr = lineView.changes || (lineView.changes = []); + if (indexOf(arr, type) == -1) { + arr.push(type); + } + } + + // Clear the view. + function resetView(cm) { + cm.display.viewFrom = cm.display.viewTo = cm.doc.first; + cm.display.view = []; + cm.display.viewOffset = 0; + } + function viewCuttingPoint(cm, oldN, newN, dir) { + var index = findViewIndex(cm, oldN), + diff, + view = cm.display.view; + if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) { + return { + index: index, + lineN: newN + }; + } + var n = cm.display.viewFrom; + for (var i = 0; i < index; i++) { + n += view[i].size; + } + if (n != oldN) { + if (dir > 0) { + if (index == view.length - 1) { + return null; + } + diff = n + view[index].size - oldN; + index++; + } else { + diff = n - oldN; + } + oldN += diff; + newN += diff; + } + while (visualLineNo(cm.doc, newN) != newN) { + if (index == (dir < 0 ? 0 : view.length - 1)) { + return null; + } + newN += dir * view[index - (dir < 0 ? 1 : 0)].size; + index += dir; + } + return { + index: index, + lineN: newN + }; + } + + // Force the view to cover a given range, adding empty view element + // or clipping off existing ones as needed. + function adjustView(cm, from, to) { + var display = cm.display, + view = display.view; + if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { + display.view = buildViewArray(cm, from, to); + display.viewFrom = from; + } else { + if (display.viewFrom > from) { + display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); + } else if (display.viewFrom < from) { + display.view = display.view.slice(findViewIndex(cm, from)); + } + display.viewFrom = from; + if (display.viewTo < to) { + display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); + } else if (display.viewTo > to) { + display.view = display.view.slice(0, findViewIndex(cm, to)); + } + } + display.viewTo = to; + } + + // Count the number of lines in the view whose DOM representation is + // out of date (or nonexistent). + function countDirtyView(cm) { + var view = cm.display.view, + dirty = 0; + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (!lineView.hidden && (!lineView.node || lineView.changes)) { + ++dirty; + } + } + return dirty; + } + function updateSelection(cm) { + cm.display.input.showSelection(cm.display.input.prepareSelection()); + } + function prepareSelection(cm, primary) { + if (primary === void 0) primary = true; + var doc = cm.doc, + result = {}; + var curFragment = result.cursors = document.createDocumentFragment(); + var selFragment = result.selection = document.createDocumentFragment(); + var customCursor = cm.options.$customCursor; + if (customCursor) { + primary = true; + } + for (var i = 0; i < doc.sel.ranges.length; i++) { + if (!primary && i == doc.sel.primIndex) { + continue; + } + var range = doc.sel.ranges[i]; + if (range.from().line >= cm.display.viewTo || range.to().line < cm.display.viewFrom) { + continue; + } + var collapsed = range.empty(); + if (customCursor) { + var head = customCursor(cm, range); + if (head) { + drawSelectionCursor(cm, head, curFragment); + } + } else if (collapsed || cm.options.showCursorWhenSelecting) { + drawSelectionCursor(cm, range.head, curFragment); + } + if (!collapsed) { + drawSelectionRange(cm, range, selFragment); + } + } + return result; + } + + // Draws a cursor for the given range + function drawSelectionCursor(cm, head, output) { + var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); + var cursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor")); + cursor.style.left = pos.left + "px"; + cursor.style.top = pos.top + "px"; + cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; + if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { + var charPos = charCoords(cm, head, "div", null, null); + var width = charPos.right - charPos.left; + cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; + } + if (pos.other) { + // Secondary cursor, shown when on a 'jump' in bi-directional text + var otherCursor = output.appendChild(elt("div", "\u00a0", "CodeMirror-cursor CodeMirror-secondarycursor")); + otherCursor.style.display = ""; + otherCursor.style.left = pos.other.left + "px"; + otherCursor.style.top = pos.other.top + "px"; + otherCursor.style.height = (pos.other.bottom - pos.other.top) * .85 + "px"; + } + } + function cmpCoords(a, b) { + return a.top - b.top || a.left - b.left; + } + + // Draws the given range as a highlighted selection + function drawSelectionRange(cm, range, output) { + var display = cm.display, + doc = cm.doc; + var fragment = document.createDocumentFragment(); + var padding = paddingH(cm.display), + leftSide = padding.left; + var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; + var docLTR = doc.direction == "ltr"; + function add(left, top, width, bottom) { + if (top < 0) { + top = 0; + } + top = Math.round(top); + bottom = Math.round(bottom); + fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px")); + } + function drawForLine(line, fromArg, toArg) { + var lineObj = getLine(doc, line); + var lineLen = lineObj.text.length; + var start, end; + function coords(ch, bias) { + return charCoords(cm, Pos(line, ch), "div", lineObj, bias); + } + function wrapX(pos, dir, side) { + var extent = wrappedLineExtentChar(cm, lineObj, null, pos); + var prop = dir == "ltr" == (side == "after") ? "left" : "right"; + var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); + return coords(ch, prop)[prop]; + } + var order = getOrder(lineObj, doc.direction); + iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i) { + var ltr = dir == "ltr"; + var fromPos = coords(from, ltr ? "left" : "right"); + var toPos = coords(to - 1, ltr ? "right" : "left"); + var openStart = fromArg == null && from == 0, + openEnd = toArg == null && to == lineLen; + var first = i == 0, + last = !order || i == order.length - 1; + if (toPos.top - fromPos.top <= 3) { + // Single line + var openLeft = (docLTR ? openStart : openEnd) && first; + var openRight = (docLTR ? openEnd : openStart) && last; + var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; + var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; + add(left, fromPos.top, right - left, fromPos.bottom); + } else { + // Multiple lines + var topLeft, topRight, botLeft, botRight; + if (ltr) { + topLeft = docLTR && openStart && first ? leftSide : fromPos.left; + topRight = docLTR ? rightSide : wrapX(from, dir, "before"); + botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); + botRight = docLTR && openEnd && last ? rightSide : toPos.right; + } else { + topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); + topRight = !docLTR && openStart && first ? rightSide : fromPos.right; + botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; + botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); + } + add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); + if (fromPos.bottom < toPos.top) { + add(leftSide, fromPos.bottom, null, toPos.top); + } + add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); + } + if (!start || cmpCoords(fromPos, start) < 0) { + start = fromPos; + } + if (cmpCoords(toPos, start) < 0) { + start = toPos; + } + if (!end || cmpCoords(fromPos, end) < 0) { + end = fromPos; + } + if (cmpCoords(toPos, end) < 0) { + end = toPos; + } + }); + return { + start: start, + end: end + }; + } + var sFrom = range.from(), + sTo = range.to(); + if (sFrom.line == sTo.line) { + drawForLine(sFrom.line, sFrom.ch, sTo.ch); + } else { + var fromLine = getLine(doc, sFrom.line), + toLine = getLine(doc, sTo.line); + var singleVLine = visualLine(fromLine) == visualLine(toLine); + var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; + var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; + if (singleVLine) { + if (leftEnd.top < rightStart.top - 2) { + add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); + add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); + } else { + add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); + } + } + if (leftEnd.bottom < rightStart.top) { + add(leftSide, leftEnd.bottom, null, rightStart.top); + } + } + output.appendChild(fragment); + } + + // Cursor-blinking + function restartBlink(cm) { + if (!cm.state.focused) { + return; + } + var display = cm.display; + clearInterval(display.blinker); + var on = true; + display.cursorDiv.style.visibility = ""; + if (cm.options.cursorBlinkRate > 0) { + display.blinker = setInterval(function () { + if (!cm.hasFocus()) { + onBlur(cm); + } + display.cursorDiv.style.visibility = (on = !on) ? "" : "hidden"; + }, cm.options.cursorBlinkRate); + } else if (cm.options.cursorBlinkRate < 0) { + display.cursorDiv.style.visibility = "hidden"; + } + } + function ensureFocus(cm) { + if (!cm.hasFocus()) { + cm.display.input.focus(); + if (!cm.state.focused) { + onFocus(cm); + } + } + } + function delayBlurEvent(cm) { + cm.state.delayingBlurEvent = true; + setTimeout(function () { + if (cm.state.delayingBlurEvent) { + cm.state.delayingBlurEvent = false; + if (cm.state.focused) { + onBlur(cm); + } + } + }, 100); + } + function onFocus(cm, e) { + if (cm.state.delayingBlurEvent && !cm.state.draggingText) { + cm.state.delayingBlurEvent = false; + } + if (cm.options.readOnly == "nocursor") { + return; + } + if (!cm.state.focused) { + signal(cm, "focus", cm, e); + cm.state.focused = true; + addClass(cm.display.wrapper, "CodeMirror-focused"); + // This test prevents this from firing when a context + // menu is closed (since the input reset would kill the + // select-all detection hack) + if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { + cm.display.input.reset(); + if (webkit) { + setTimeout(function () { + return cm.display.input.reset(true); + }, 20); + } // Issue #1730 + } + cm.display.input.receivedFocus(); + } + restartBlink(cm); + } + function onBlur(cm, e) { + if (cm.state.delayingBlurEvent) { + return; + } + if (cm.state.focused) { + signal(cm, "blur", cm, e); + cm.state.focused = false; + rmClass(cm.display.wrapper, "CodeMirror-focused"); + } + clearInterval(cm.display.blinker); + setTimeout(function () { + if (!cm.state.focused) { + cm.display.shift = false; + } + }, 150); + } + + // Read the actual heights of the rendered lines, and update their + // stored heights to match. + function updateHeightsInViewport(cm) { + var display = cm.display; + var prevBottom = display.lineDiv.offsetTop; + var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); + var oldHeight = display.lineDiv.getBoundingClientRect().top; + var mustScroll = 0; + for (var i = 0; i < display.view.length; i++) { + var cur = display.view[i], + wrapping = cm.options.lineWrapping; + var height = void 0, + width = 0; + if (cur.hidden) { + continue; + } + oldHeight += cur.line.height; + if (ie && ie_version < 8) { + var bot = cur.node.offsetTop + cur.node.offsetHeight; + height = bot - prevBottom; + prevBottom = bot; + } else { + var box = cur.node.getBoundingClientRect(); + height = box.bottom - box.top; + // Check that lines don't extend past the right of the current + // editor width + if (!wrapping && cur.text.firstChild) { + width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; + } + } + var diff = cur.line.height - height; + if (diff > .005 || diff < -.005) { + if (oldHeight < viewTop) { + mustScroll -= diff; + } + updateLineHeight(cur.line, height); + updateWidgetHeight(cur.line); + if (cur.rest) { + for (var j = 0; j < cur.rest.length; j++) { + updateWidgetHeight(cur.rest[j]); + } + } + } + if (width > cm.display.sizerWidth) { + var chWidth = Math.ceil(width / charWidth(cm.display)); + if (chWidth > cm.display.maxLineLength) { + cm.display.maxLineLength = chWidth; + cm.display.maxLine = cur.line; + cm.display.maxLineChanged = true; + } + } + } + if (Math.abs(mustScroll) > 2) { + display.scroller.scrollTop += mustScroll; + } + } + + // Read and store the height of line widgets associated with the + // given line. + function updateWidgetHeight(line) { + if (line.widgets) { + for (var i = 0; i < line.widgets.length; ++i) { + var w = line.widgets[i], + parent = w.node.parentNode; + if (parent) { + w.height = parent.offsetHeight; + } + } + } + } + + // Compute the lines that are visible in a given viewport (defaults + // the the current scroll position). viewport may contain top, + // height, and ensure (see op.scrollToPos) properties. + function visibleLines(display, doc, viewport) { + var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; + top = Math.floor(top - paddingTop(display)); + var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; + var from = lineAtHeight(doc, top), + to = lineAtHeight(doc, bottom); + // Ensure is a {from: {line, ch}, to: {line, ch}} object, and + // forces those lines into the viewport (if possible). + if (viewport && viewport.ensure) { + var ensureFrom = viewport.ensure.from.line, + ensureTo = viewport.ensure.to.line; + if (ensureFrom < from) { + from = ensureFrom; + to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); + } else if (Math.min(ensureTo, doc.lastLine()) >= to) { + from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); + to = ensureTo; + } + } + return { + from: from, + to: Math.max(to, from + 1) + }; + } + + // SCROLLING THINGS INTO VIEW + + // If an editor sits on the top or bottom of the window, partially + // scrolled out of view, this ensures that the cursor is visible. + function maybeScrollWindow(cm, rect) { + if (signalDOMEvent(cm, "scrollCursorIntoView")) { + return; + } + var display = cm.display, + box = display.sizer.getBoundingClientRect(), + doScroll = null; + if (rect.top + box.top < 0) { + doScroll = true; + } else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { + doScroll = false; + } + if (doScroll != null && !phantom) { + var scrollNode = elt("div", "\u200b", null, "position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + rect.left + "px; width: " + Math.max(2, rect.right - rect.left) + "px;"); + cm.display.lineSpace.appendChild(scrollNode); + scrollNode.scrollIntoView(doScroll); + cm.display.lineSpace.removeChild(scrollNode); + } + } + + // Scroll a given position into view (immediately), verifying that + // it actually became visible (as line heights are accurately + // measured, the position of something may 'drift' during drawing). + function scrollPosIntoView(cm, pos, end, margin) { + if (margin == null) { + margin = 0; + } + var rect; + if (!cm.options.lineWrapping && pos == end) { + // Set pos and end to the cursor positions around the character pos sticks to + // If pos.sticky == "before", that is around pos.ch - 1, otherwise around pos.ch + // If pos == Pos(_, 0, "before"), pos and end are unchanged + end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; + pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; + } + for (var limit = 0; limit < 5; limit++) { + var changed = false; + var coords = cursorCoords(cm, pos); + var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); + rect = { + left: Math.min(coords.left, endCoords.left), + top: Math.min(coords.top, endCoords.top) - margin, + right: Math.max(coords.left, endCoords.left), + bottom: Math.max(coords.bottom, endCoords.bottom) + margin + }; + var scrollPos = calculateScrollPos(cm, rect); + var startTop = cm.doc.scrollTop, + startLeft = cm.doc.scrollLeft; + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + if (Math.abs(cm.doc.scrollTop - startTop) > 1) { + changed = true; + } + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { + changed = true; + } + } + if (!changed) { + break; + } + } + return rect; + } + + // Scroll a given set of coordinates into view (immediately). + function scrollIntoView(cm, rect) { + var scrollPos = calculateScrollPos(cm, rect); + if (scrollPos.scrollTop != null) { + updateScrollTop(cm, scrollPos.scrollTop); + } + if (scrollPos.scrollLeft != null) { + setScrollLeft(cm, scrollPos.scrollLeft); + } + } + + // Calculate a new scroll position needed to scroll the given + // rectangle into view. Returns an object with scrollTop and + // scrollLeft properties. When these are undefined, the + // vertical/horizontal position does not need to be adjusted. + function calculateScrollPos(cm, rect) { + var display = cm.display, + snapMargin = textHeight(cm.display); + if (rect.top < 0) { + rect.top = 0; + } + var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; + var screen = displayHeight(cm), + result = {}; + if (rect.bottom - rect.top > screen) { + rect.bottom = rect.top + screen; + } + var docBottom = cm.doc.height + paddingVert(display); + var atTop = rect.top < snapMargin, + atBottom = rect.bottom > docBottom - snapMargin; + if (rect.top < screentop) { + result.scrollTop = atTop ? 0 : rect.top; + } else if (rect.bottom > screentop + screen) { + var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen); + if (newTop != screentop) { + result.scrollTop = newTop; + } + } + var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; + var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; + var screenw = displayWidth(cm) - display.gutters.offsetWidth; + var tooWide = rect.right - rect.left > screenw; + if (tooWide) { + rect.right = rect.left + screenw; + } + if (rect.left < 10) { + result.scrollLeft = 0; + } else if (rect.left < screenleft) { + result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); + } else if (rect.right > screenw + screenleft - 3) { + result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; + } + return result; + } + + // Store a relative adjustment to the scroll position in the current + // operation (to be applied when the operation finishes). + function addToScrollTop(cm, top) { + if (top == null) { + return; + } + resolveScrollToPos(cm); + cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; + } + + // Make sure that at the end of the operation the current cursor is + // shown. + function ensureCursorVisible(cm) { + resolveScrollToPos(cm); + var cur = cm.getCursor(); + cm.curOp.scrollToPos = { + from: cur, + to: cur, + margin: cm.options.cursorScrollMargin + }; + } + function scrollToCoords(cm, x, y) { + if (x != null || y != null) { + resolveScrollToPos(cm); + } + if (x != null) { + cm.curOp.scrollLeft = x; + } + if (y != null) { + cm.curOp.scrollTop = y; + } + } + function scrollToRange(cm, range) { + resolveScrollToPos(cm); + cm.curOp.scrollToPos = range; + } + + // When an operation has its scrollToPos property set, and another + // scroll action is applied before the end of the operation, this + // 'simulates' scrolling that position into view in a cheap way, so + // that the effect of intermediate scroll commands is not ignored. + function resolveScrollToPos(cm) { + var range = cm.curOp.scrollToPos; + if (range) { + cm.curOp.scrollToPos = null; + var from = estimateCoords(cm, range.from), + to = estimateCoords(cm, range.to); + scrollToCoordsRange(cm, from, to, range.margin); + } + } + function scrollToCoordsRange(cm, from, to, margin) { + var sPos = calculateScrollPos(cm, { + left: Math.min(from.left, to.left), + top: Math.min(from.top, to.top) - margin, + right: Math.max(from.right, to.right), + bottom: Math.max(from.bottom, to.bottom) + margin + }); + scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); + } + + // Sync the scrollable area and scrollbars, ensure the viewport + // covers the visible area. + function updateScrollTop(cm, val) { + if (Math.abs(cm.doc.scrollTop - val) < 2) { + return; + } + if (!gecko) { + updateDisplaySimple(cm, { + top: val + }); + } + setScrollTop(cm, val, true); + if (gecko) { + updateDisplaySimple(cm); + } + startWorker(cm, 100); + } + function setScrollTop(cm, val, forceScroll) { + val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); + if (cm.display.scroller.scrollTop == val && !forceScroll) { + return; + } + cm.doc.scrollTop = val; + cm.display.scrollbars.setScrollTop(val); + if (cm.display.scroller.scrollTop != val) { + cm.display.scroller.scrollTop = val; + } + } + + // Sync scroller and scrollbar, ensure the gutter elements are + // aligned. + function setScrollLeft(cm, val, isScroller, forceScroll) { + val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); + if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { + return; + } + cm.doc.scrollLeft = val; + alignHorizontally(cm); + if (cm.display.scroller.scrollLeft != val) { + cm.display.scroller.scrollLeft = val; + } + cm.display.scrollbars.setScrollLeft(val); + } + + // SCROLLBARS + + // Prepare DOM reads needed to update the scrollbars. Done in one + // shot to minimize update/measure roundtrips. + function measureForScrollbars(cm) { + var d = cm.display, + gutterW = d.gutters.offsetWidth; + var docH = Math.round(cm.doc.height + paddingVert(cm.display)); + return { + clientHeight: d.scroller.clientHeight, + viewHeight: d.wrapper.clientHeight, + scrollWidth: d.scroller.scrollWidth, + clientWidth: d.scroller.clientWidth, + viewWidth: d.wrapper.clientWidth, + barLeft: cm.options.fixedGutter ? gutterW : 0, + docHeight: docH, + scrollHeight: docH + scrollGap(cm) + d.barHeight, + nativeBarWidth: d.nativeBarWidth, + gutterWidth: gutterW + }; + } + var NativeScrollbars = function (place, scroll, cm) { + this.cm = cm; + var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); + var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); + vert.tabIndex = horiz.tabIndex = -1; + place(vert); + place(horiz); + on(vert, "scroll", function () { + if (vert.clientHeight) { + scroll(vert.scrollTop, "vertical"); + } + }); + on(horiz, "scroll", function () { + if (horiz.clientWidth) { + scroll(horiz.scrollLeft, "horizontal"); + } + }); + this.checkedZeroWidth = false; + // Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8). + if (ie && ie_version < 8) { + this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; + } + }; + NativeScrollbars.prototype.update = function (measure) { + var needsH = measure.scrollWidth > measure.clientWidth + 1; + var needsV = measure.scrollHeight > measure.clientHeight + 1; + var sWidth = measure.nativeBarWidth; + if (needsV) { + this.vert.style.display = "block"; + this.vert.style.bottom = needsH ? sWidth + "px" : "0"; + var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); + // A bug in IE8 can cause this value to be negative, so guard it. + this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; + } else { + this.vert.scrollTop = 0; + this.vert.style.display = ""; + this.vert.firstChild.style.height = "0"; + } + if (needsH) { + this.horiz.style.display = "block"; + this.horiz.style.right = needsV ? sWidth + "px" : "0"; + this.horiz.style.left = measure.barLeft + "px"; + var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); + this.horiz.firstChild.style.width = Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; + } else { + this.horiz.style.display = ""; + this.horiz.firstChild.style.width = "0"; + } + if (!this.checkedZeroWidth && measure.clientHeight > 0) { + if (sWidth == 0) { + this.zeroWidthHack(); + } + this.checkedZeroWidth = true; + } + return { + right: needsV ? sWidth : 0, + bottom: needsH ? sWidth : 0 + }; + }; + NativeScrollbars.prototype.setScrollLeft = function (pos) { + if (this.horiz.scrollLeft != pos) { + this.horiz.scrollLeft = pos; + } + if (this.disableHoriz) { + this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); + } + }; + NativeScrollbars.prototype.setScrollTop = function (pos) { + if (this.vert.scrollTop != pos) { + this.vert.scrollTop = pos; + } + if (this.disableVert) { + this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); + } + }; + NativeScrollbars.prototype.zeroWidthHack = function () { + var w = mac && !mac_geMountainLion ? "12px" : "18px"; + this.horiz.style.height = this.vert.style.width = w; + this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; + this.disableHoriz = new Delayed(); + this.disableVert = new Delayed(); + }; + NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { + bar.style.pointerEvents = "auto"; + function maybeDisable() { + // To find out whether the scrollbar is still visible, we + // check whether the element under the pixel in the bottom + // right corner of the scrollbar box is the scrollbar box + // itself (when the bar is still visible) or its filler child + // (when the bar is hidden). If it is still visible, we keep + // it enabled, if it's hidden, we disable pointer events. + var box = bar.getBoundingClientRect(); + var elt = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); + if (elt != bar) { + bar.style.pointerEvents = "none"; + } else { + delay.set(1000, maybeDisable); + } + } + delay.set(1000, maybeDisable); + }; + NativeScrollbars.prototype.clear = function () { + var parent = this.horiz.parentNode; + parent.removeChild(this.horiz); + parent.removeChild(this.vert); + }; + var NullScrollbars = function () {}; + NullScrollbars.prototype.update = function () { + return { + bottom: 0, + right: 0 + }; + }; + NullScrollbars.prototype.setScrollLeft = function () {}; + NullScrollbars.prototype.setScrollTop = function () {}; + NullScrollbars.prototype.clear = function () {}; + function updateScrollbars(cm, measure) { + if (!measure) { + measure = measureForScrollbars(cm); + } + var startWidth = cm.display.barWidth, + startHeight = cm.display.barHeight; + updateScrollbarsInner(cm, measure); + for (var i = 0; i < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i++) { + if (startWidth != cm.display.barWidth && cm.options.lineWrapping) { + updateHeightsInViewport(cm); + } + updateScrollbarsInner(cm, measureForScrollbars(cm)); + startWidth = cm.display.barWidth; + startHeight = cm.display.barHeight; + } + } + + // Re-synchronize the fake scrollbars with the actual size of the + // content. + function updateScrollbarsInner(cm, measure) { + var d = cm.display; + var sizes = d.scrollbars.update(measure); + d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; + d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; + d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; + if (sizes.right && sizes.bottom) { + d.scrollbarFiller.style.display = "block"; + d.scrollbarFiller.style.height = sizes.bottom + "px"; + d.scrollbarFiller.style.width = sizes.right + "px"; + } else { + d.scrollbarFiller.style.display = ""; + } + if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { + d.gutterFiller.style.display = "block"; + d.gutterFiller.style.height = sizes.bottom + "px"; + d.gutterFiller.style.width = measure.gutterWidth + "px"; + } else { + d.gutterFiller.style.display = ""; + } + } + var scrollbarModel = { + "native": NativeScrollbars, + "null": NullScrollbars + }; + function initScrollbars(cm) { + if (cm.display.scrollbars) { + cm.display.scrollbars.clear(); + if (cm.display.scrollbars.addClass) { + rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { + cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); + // Prevent clicks in the scrollbars from killing focus + on(node, "mousedown", function () { + if (cm.state.focused) { + setTimeout(function () { + return cm.display.input.focus(); + }, 0); + } + }); + node.setAttribute("cm-not-content", "true"); + }, function (pos, axis) { + if (axis == "horizontal") { + setScrollLeft(cm, pos); + } else { + updateScrollTop(cm, pos); + } + }, cm); + if (cm.display.scrollbars.addClass) { + addClass(cm.display.wrapper, cm.display.scrollbars.addClass); + } + } + + // Operations are used to wrap a series of changes to the editor + // state in such a way that each change won't have to update the + // cursor and display (which would be awkward, slow, and + // error-prone). Instead, display updates are batched and then all + // combined and executed at once. + + var nextOpId = 0; + // Start a new operation. + function startOperation(cm) { + cm.curOp = { + cm: cm, + viewChanged: false, + // Flag that indicates that lines might need to be redrawn + startHeight: cm.doc.height, + // Used to detect need to update scrollbar + forceUpdate: false, + // Used to force a redraw + updateInput: 0, + // Whether to reset the input textarea + typing: false, + // Whether this reset should be careful to leave existing text (for compositing) + changeObjs: null, + // Accumulated changes, for firing change events + cursorActivityHandlers: null, + // Set of handlers to fire cursorActivity on + cursorActivityCalled: 0, + // Tracks which cursorActivity handlers have been called already + selectionChanged: false, + // Whether the selection needs to be redrawn + updateMaxLine: false, + // Set when the widest line needs to be determined anew + scrollLeft: null, + scrollTop: null, + // Intermediate scroll position, not pushed to DOM yet + scrollToPos: null, + // Used to scroll to a specific position + focus: false, + id: ++nextOpId, + // Unique ID + markArrays: null // Used by addMarkedSpan + }; + pushOperation(cm.curOp); + } + + // Finish an operation, updating the display and signalling delayed events + function endOperation(cm) { + var op = cm.curOp; + if (op) { + finishOperation(op, function (group) { + for (var i = 0; i < group.ops.length; i++) { + group.ops[i].cm.curOp = null; + } + endOperations(group); + }); + } + } + + // The DOM updates done when an operation finishes are batched so + // that the minimum number of relayouts are required. + function endOperations(group) { + var ops = group.ops; + for (var i = 0; i < ops.length; i++) + // Read DOM + { + endOperation_R1(ops[i]); + } + for (var i$1 = 0; i$1 < ops.length; i$1++) + // Write DOM (maybe) + { + endOperation_W1(ops[i$1]); + } + for (var i$2 = 0; i$2 < ops.length; i$2++) + // Read DOM + { + endOperation_R2(ops[i$2]); + } + for (var i$3 = 0; i$3 < ops.length; i$3++) + // Write DOM (maybe) + { + endOperation_W2(ops[i$3]); + } + for (var i$4 = 0; i$4 < ops.length; i$4++) + // Read DOM + { + endOperation_finish(ops[i$4]); + } + } + function endOperation_R1(op) { + var cm = op.cm, + display = cm.display; + maybeClipScrollbars(cm); + if (op.updateMaxLine) { + findMaxLine(cm); + } + op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; + op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && { + top: op.scrollTop, + ensure: op.scrollToPos + }, op.forceUpdate); + } + function endOperation_W1(op) { + op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); + } + function endOperation_R2(op) { + var cm = op.cm, + display = cm.display; + if (op.updatedDisplay) { + updateHeightsInViewport(cm); + } + op.barMeasure = measureForScrollbars(cm); + + // If the max line changed since it was last measured, measure it, + // and ensure the document's width matches it. + // updateDisplay_W2 will use these properties to do the actual resizing + if (display.maxLineChanged && !cm.options.lineWrapping) { + op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; + cm.display.sizerWidth = op.adjustWidthTo; + op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); + op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); + } + if (op.updatedDisplay || op.selectionChanged) { + op.preparedSelection = display.input.prepareSelection(); + } + } + function endOperation_W2(op) { + var cm = op.cm; + if (op.adjustWidthTo != null) { + cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; + if (op.maxScrollLeft < cm.doc.scrollLeft) { + setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); + } + cm.display.maxLineChanged = false; + } + var takeFocus = op.focus && op.focus == activeElt(); + if (op.preparedSelection) { + cm.display.input.showSelection(op.preparedSelection, takeFocus); + } + if (op.updatedDisplay || op.startHeight != cm.doc.height) { + updateScrollbars(cm, op.barMeasure); + } + if (op.updatedDisplay) { + setDocumentHeight(cm, op.barMeasure); + } + if (op.selectionChanged) { + restartBlink(cm); + } + if (cm.state.focused && op.updateInput) { + cm.display.input.reset(op.typing); + } + if (takeFocus) { + ensureFocus(op.cm); + } + } + function endOperation_finish(op) { + var cm = op.cm, + display = cm.display, + doc = cm.doc; + if (op.updatedDisplay) { + postUpdateDisplay(cm, op.update); + } + + // Abort mouse wheel delta measurement, when scrolling explicitly + if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) { + display.wheelStartX = display.wheelStartY = null; + } + + // Propagate the scroll position to the actual DOM scroller + if (op.scrollTop != null) { + setScrollTop(cm, op.scrollTop, op.forceScroll); + } + if (op.scrollLeft != null) { + setScrollLeft(cm, op.scrollLeft, true, true); + } + // If we need to scroll a specific position into view, do so. + if (op.scrollToPos) { + var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); + maybeScrollWindow(cm, rect); + } + + // Fire events for markers that are hidden/unidden by editing or + // undoing + var hidden = op.maybeHiddenMarkers, + unhidden = op.maybeUnhiddenMarkers; + if (hidden) { + for (var i = 0; i < hidden.length; ++i) { + if (!hidden[i].lines.length) { + signal(hidden[i], "hide"); + } + } + } + if (unhidden) { + for (var i$1 = 0; i$1 < unhidden.length; ++i$1) { + if (unhidden[i$1].lines.length) { + signal(unhidden[i$1], "unhide"); + } + } + } + if (display.wrapper.offsetHeight) { + doc.scrollTop = cm.display.scroller.scrollTop; + } + + // Fire change events, and delayed event handlers + if (op.changeObjs) { + signal(cm, "changes", cm, op.changeObjs); + } + if (op.update) { + op.update.finish(); + } + } + + // Run the given function in an operation + function runInOp(cm, f) { + if (cm.curOp) { + return f(); + } + startOperation(cm); + try { + return f(); + } finally { + endOperation(cm); + } + } + // Wraps a function in an operation. Returns the wrapped function. + function operation(cm, f) { + return function () { + if (cm.curOp) { + return f.apply(cm, arguments); + } + startOperation(cm); + try { + return f.apply(cm, arguments); + } finally { + endOperation(cm); + } + }; + } + // Used to add methods to editor and doc instances, wrapping them in + // operations. + function methodOp(f) { + return function () { + if (this.curOp) { + return f.apply(this, arguments); + } + startOperation(this); + try { + return f.apply(this, arguments); + } finally { + endOperation(this); + } + }; + } + function docMethodOp(f) { + return function () { + var cm = this.cm; + if (!cm || cm.curOp) { + return f.apply(this, arguments); + } + startOperation(cm); + try { + return f.apply(this, arguments); + } finally { + endOperation(cm); + } + }; + } + + // HIGHLIGHT WORKER + + function startWorker(cm, time) { + if (cm.doc.highlightFrontier < cm.display.viewTo) { + cm.state.highlight.set(time, bind(highlightWorker, cm)); + } + } + function highlightWorker(cm) { + var doc = cm.doc; + if (doc.highlightFrontier >= cm.display.viewTo) { + return; + } + var end = +new Date() + cm.options.workTime; + var context = getContextBefore(cm, doc.highlightFrontier); + var changedLines = []; + doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { + if (context.line >= cm.display.viewFrom) { + // Visible + var oldStyles = line.styles; + var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; + var highlighted = highlightLine(cm, line, context, true); + if (resetState) { + context.state = resetState; + } + line.styles = highlighted.styles; + var oldCls = line.styleClasses, + newCls = highlighted.classes; + if (newCls) { + line.styleClasses = newCls; + } else if (oldCls) { + line.styleClasses = null; + } + var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); + for (var i = 0; !ischange && i < oldStyles.length; ++i) { + ischange = oldStyles[i] != line.styles[i]; + } + if (ischange) { + changedLines.push(context.line); + } + line.stateAfter = context.save(); + context.nextLine(); + } else { + if (line.text.length <= cm.options.maxHighlightLength) { + processLine(cm, line.text, context); + } + line.stateAfter = context.line % 5 == 0 ? context.save() : null; + context.nextLine(); + } + if (+new Date() > end) { + startWorker(cm, cm.options.workDelay); + return true; + } + }); + doc.highlightFrontier = context.line; + doc.modeFrontier = Math.max(doc.modeFrontier, context.line); + if (changedLines.length) { + runInOp(cm, function () { + for (var i = 0; i < changedLines.length; i++) { + regLineChange(cm, changedLines[i], "text"); + } + }); + } + } + + // DISPLAY DRAWING + + var DisplayUpdate = function (cm, viewport, force) { + var display = cm.display; + this.viewport = viewport; + // Store some values that we'll need later (but don't want to force a relayout for) + this.visible = visibleLines(display, cm.doc, viewport); + this.editorIsHidden = !display.wrapper.offsetWidth; + this.wrapperHeight = display.wrapper.clientHeight; + this.wrapperWidth = display.wrapper.clientWidth; + this.oldDisplayWidth = displayWidth(cm); + this.force = force; + this.dims = getDimensions(cm); + this.events = []; + }; + DisplayUpdate.prototype.signal = function (emitter, type) { + if (hasHandler(emitter, type)) { + this.events.push(arguments); + } + }; + DisplayUpdate.prototype.finish = function () { + for (var i = 0; i < this.events.length; i++) { + signal.apply(null, this.events[i]); + } + }; + function maybeClipScrollbars(cm) { + var display = cm.display; + if (!display.scrollbarsClipped && display.scroller.offsetWidth) { + display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; + display.heightForcer.style.height = scrollGap(cm) + "px"; + display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; + display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; + display.scrollbarsClipped = true; + } + } + function selectionSnapshot(cm) { + if (cm.hasFocus()) { + return null; + } + var active = activeElt(); + if (!active || !contains(cm.display.lineDiv, active)) { + return null; + } + var result = { + activeElt: active + }; + if (window.getSelection) { + var sel = window.getSelection(); + if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { + result.anchorNode = sel.anchorNode; + result.anchorOffset = sel.anchorOffset; + result.focusNode = sel.focusNode; + result.focusOffset = sel.focusOffset; + } + } + return result; + } + function restoreSelection(snapshot) { + if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { + return; + } + snapshot.activeElt.focus(); + if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { + var sel = window.getSelection(), + range = document.createRange(); + range.setEnd(snapshot.anchorNode, snapshot.anchorOffset); + range.collapse(false); + sel.removeAllRanges(); + sel.addRange(range); + sel.extend(snapshot.focusNode, snapshot.focusOffset); + } + } + + // Does the actual updating of the line display. Bails out + // (returning false) when there is nothing to be done and forced is + // false. + function updateDisplayIfNeeded(cm, update) { + var display = cm.display, + doc = cm.doc; + if (update.editorIsHidden) { + resetView(cm); + return false; + } + + // Bail out if the visible area is already rendered and nothing changed. + if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) { + return false; + } + if (maybeUpdateLineNumberWidth(cm)) { + resetView(cm); + update.dims = getDimensions(cm); + } + + // Compute a suitable new viewport (from & to) + var end = doc.first + doc.size; + var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); + var to = Math.min(end, update.visible.to + cm.options.viewportMargin); + if (display.viewFrom < from && from - display.viewFrom < 20) { + from = Math.max(doc.first, display.viewFrom); + } + if (display.viewTo > to && display.viewTo - to < 20) { + to = Math.min(end, display.viewTo); + } + if (sawCollapsedSpans) { + from = visualLineNo(cm.doc, from); + to = visualLineEndNo(cm.doc, to); + } + var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; + adjustView(cm, from, to); + display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); + // Position the mover div to align with the current scroll position + cm.display.mover.style.top = display.viewOffset + "px"; + var toUpdate = countDirtyView(cm); + if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) { + return false; + } + + // For big changes, we hide the enclosing element during the + // update, since that speeds up the operations on most browsers. + var selSnapshot = selectionSnapshot(cm); + if (toUpdate > 4) { + display.lineDiv.style.display = "none"; + } + patchDisplay(cm, display.updateLineNumbers, update.dims); + if (toUpdate > 4) { + display.lineDiv.style.display = ""; + } + display.renderedView = display.view; + // There might have been a widget with a focused element that got + // hidden or updated, if so re-focus it. + restoreSelection(selSnapshot); + + // Prevent selection and cursors from interfering with the scroll + // width and height. + removeChildren(display.cursorDiv); + removeChildren(display.selectionDiv); + display.gutters.style.height = display.sizer.style.minHeight = 0; + if (different) { + display.lastWrapHeight = update.wrapperHeight; + display.lastWrapWidth = update.wrapperWidth; + startWorker(cm, 400); + } + display.updateLineNumbers = null; + return true; + } + function postUpdateDisplay(cm, update) { + var viewport = update.viewport; + for (var first = true;; first = false) { + if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { + // Clip forced viewport to actual scrollable area. + if (viewport && viewport.top != null) { + viewport = { + top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top) + }; + } + // Updated line heights might result in the drawn area not + // actually covering the viewport. Keep looping until it does. + update.visible = visibleLines(cm.display, cm.doc, viewport); + if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) { + break; + } + } else if (first) { + update.visible = visibleLines(cm.display, cm.doc, viewport); + } + if (!updateDisplayIfNeeded(cm, update)) { + break; + } + updateHeightsInViewport(cm); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.force = false; + } + update.signal(cm, "update", cm); + if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { + update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); + cm.display.reportedViewFrom = cm.display.viewFrom; + cm.display.reportedViewTo = cm.display.viewTo; + } + } + function updateDisplaySimple(cm, viewport) { + var update = new DisplayUpdate(cm, viewport); + if (updateDisplayIfNeeded(cm, update)) { + updateHeightsInViewport(cm); + postUpdateDisplay(cm, update); + var barMeasure = measureForScrollbars(cm); + updateSelection(cm); + updateScrollbars(cm, barMeasure); + setDocumentHeight(cm, barMeasure); + update.finish(); + } + } + + // Sync the actual display DOM structure with display.view, removing + // nodes for lines that are no longer in view, and creating the ones + // that are not there yet, and updating the ones that are out of + // date. + function patchDisplay(cm, updateNumbersFrom, dims) { + var display = cm.display, + lineNumbers = cm.options.lineNumbers; + var container = display.lineDiv, + cur = container.firstChild; + function rm(node) { + var next = node.nextSibling; + // Works around a throw-scroll bug in OS X Webkit + if (webkit && mac && cm.display.currentWheelTarget == node) { + node.style.display = "none"; + } else { + node.parentNode.removeChild(node); + } + return next; + } + var view = display.view, + lineN = display.viewFrom; + // Loop over the elements in the view, syncing cur (the DOM nodes + // in display.lineDiv) with the view as we go. + for (var i = 0; i < view.length; i++) { + var lineView = view[i]; + if (lineView.hidden) ;else if (!lineView.node || lineView.node.parentNode != container) { + // Not drawn yet + var node = buildLineElement(cm, lineView, lineN, dims); + container.insertBefore(node, cur); + } else { + // Already drawn + while (cur != lineView.node) { + cur = rm(cur); + } + var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; + if (lineView.changes) { + if (indexOf(lineView.changes, "gutter") > -1) { + updateNumber = false; + } + updateLineForChanges(cm, lineView, lineN, dims); + } + if (updateNumber) { + removeChildren(lineView.lineNumber); + lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); + } + cur = lineView.node.nextSibling; + } + lineN += lineView.size; + } + while (cur) { + cur = rm(cur); + } + } + function updateGutterSpace(display) { + var width = display.gutters.offsetWidth; + display.sizer.style.marginLeft = width + "px"; + // Send an event to consumers responding to changes in gutter width. + signalLater(display, "gutterChanged", display); + } + function setDocumentHeight(cm, measure) { + cm.display.sizer.style.minHeight = measure.docHeight + "px"; + cm.display.heightForcer.style.top = measure.docHeight + "px"; + cm.display.gutters.style.height = measure.docHeight + cm.display.barHeight + scrollGap(cm) + "px"; + } + + // Re-align line numbers and gutter marks to compensate for + // horizontal scrolling. + function alignHorizontally(cm) { + var display = cm.display, + view = display.view; + if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { + return; + } + var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; + var gutterW = display.gutters.offsetWidth, + left = comp + "px"; + for (var i = 0; i < view.length; i++) { + if (!view[i].hidden) { + if (cm.options.fixedGutter) { + if (view[i].gutter) { + view[i].gutter.style.left = left; + } + if (view[i].gutterBackground) { + view[i].gutterBackground.style.left = left; + } + } + var align = view[i].alignable; + if (align) { + for (var j = 0; j < align.length; j++) { + align[j].style.left = left; + } + } + } + } + if (cm.options.fixedGutter) { + display.gutters.style.left = comp + gutterW + "px"; + } + } + + // Used to ensure that the line number gutter is still the right + // size for the current document size. Returns true when an update + // is needed. + function maybeUpdateLineNumberWidth(cm) { + if (!cm.options.lineNumbers) { + return false; + } + var doc = cm.doc, + last = lineNumberFor(cm.options, doc.first + doc.size - 1), + display = cm.display; + if (last.length != display.lineNumChars) { + var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); + var innerW = test.firstChild.offsetWidth, + padding = test.offsetWidth - innerW; + display.lineGutter.style.width = ""; + display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; + display.lineNumWidth = display.lineNumInnerWidth + padding; + display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; + display.lineGutter.style.width = display.lineNumWidth + "px"; + updateGutterSpace(cm.display); + return true; + } + return false; + } + function getGutters(gutters, lineNumbers) { + var result = [], + sawLineNumbers = false; + for (var i = 0; i < gutters.length; i++) { + var name = gutters[i], + style = null; + if (typeof name != "string") { + style = name.style; + name = name.className; + } + if (name == "CodeMirror-linenumbers") { + if (!lineNumbers) { + continue; + } else { + sawLineNumbers = true; + } + } + result.push({ + className: name, + style: style + }); + } + if (lineNumbers && !sawLineNumbers) { + result.push({ + className: "CodeMirror-linenumbers", + style: null + }); + } + return result; + } + + // Rebuild the gutter elements, ensure the margin to the left of the + // code matches their width. + function renderGutters(display) { + var gutters = display.gutters, + specs = display.gutterSpecs; + removeChildren(gutters); + display.lineGutter = null; + for (var i = 0; i < specs.length; ++i) { + var ref = specs[i]; + var className = ref.className; + var style = ref.style; + var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); + if (style) { + gElt.style.cssText = style; + } + if (className == "CodeMirror-linenumbers") { + display.lineGutter = gElt; + gElt.style.width = (display.lineNumWidth || 1) + "px"; + } + } + gutters.style.display = specs.length ? "" : "none"; + updateGutterSpace(display); + } + function updateGutters(cm) { + renderGutters(cm.display); + regChange(cm); + alignHorizontally(cm); + } + + // The display handles the DOM integration, both for input reading + // and content drawing. It holds references to DOM nodes and + // display-related state. + + function Display(place, doc, input, options) { + var d = this; + this.input = input; + + // Covers bottom-right square when both scrollbars are present. + d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); + d.scrollbarFiller.setAttribute("cm-not-content", "true"); + // Covers bottom of gutter when coverGutterNextToScrollbar is on + // and h scrollbar is present. + d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); + d.gutterFiller.setAttribute("cm-not-content", "true"); + // Will contain the actual code, positioned to cover the viewport. + d.lineDiv = eltP("div", null, "CodeMirror-code"); + // Elements are added to these to represent selection and cursors. + d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); + d.cursorDiv = elt("div", null, "CodeMirror-cursors"); + // A visibility: hidden element used to find the size of things. + d.measure = elt("div", null, "CodeMirror-measure"); + // When lines outside of the viewport are measured, they are drawn in this. + d.lineMeasure = elt("div", null, "CodeMirror-measure"); + // Wraps everything that needs to exist inside the vertically-padded coordinate system + d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], null, "position: relative; outline: none"); + var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); + // Moved around its parent to cover visible view. + d.mover = elt("div", [lines], null, "position: relative"); + // Set to the height of the document, allowing scrolling. + d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); + d.sizerWidth = null; + // Behavior of elts with overflow: auto and padding is + // inconsistent across browsers. This is used to ensure the + // scrollable area is big enough. + d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); + // Will contain the gutters, if any. + d.gutters = elt("div", null, "CodeMirror-gutters"); + d.lineGutter = null; + // Actual scrollable element. + d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); + d.scroller.setAttribute("tabIndex", "-1"); + // The element in which the editor lives. + d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); + + // This attribute is respected by automatic translation systems such as Google Translate, + // and may also be respected by tools used by human translators. + d.wrapper.setAttribute('translate', 'no'); + + // Work around IE7 z-index bug (not perfect, hence IE7 not really being supported) + if (ie && ie_version < 8) { + d.gutters.style.zIndex = -1; + d.scroller.style.paddingRight = 0; + } + if (!webkit && !(gecko && mobile)) { + d.scroller.draggable = true; + } + if (place) { + if (place.appendChild) { + place.appendChild(d.wrapper); + } else { + place(d.wrapper); + } + } + + // Current rendered range (may be bigger than the view window). + d.viewFrom = d.viewTo = doc.first; + d.reportedViewFrom = d.reportedViewTo = doc.first; + // Information about the rendered lines. + d.view = []; + d.renderedView = null; + // Holds info about a single rendered line when it was rendered + // for measurement, while not in view. + d.externalMeasured = null; + // Empty space (in pixels) above the view + d.viewOffset = 0; + d.lastWrapHeight = d.lastWrapWidth = 0; + d.updateLineNumbers = null; + d.nativeBarWidth = d.barHeight = d.barWidth = 0; + d.scrollbarsClipped = false; + + // Used to only resize the line number gutter when necessary (when + // the amount of lines crosses a boundary that makes its width change) + d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; + // Set to true when a non-horizontal-scrolling line widget is + // added. As an optimization, line widget aligning is skipped when + // this is false. + d.alignWidgets = false; + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + + // Tracks the maximum line length so that the horizontal scrollbar + // can be kept static when scrolling. + d.maxLine = null; + d.maxLineLength = 0; + d.maxLineChanged = false; + + // Used for measuring wheel scrolling granularity + d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; + + // True when shift is held down. + d.shift = false; + + // Used to track whether anything happened since the context menu + // was opened. + d.selForContextMenu = null; + d.activeTouch = null; + d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); + renderGutters(d); + input.init(d); + } + + // Since the delta values reported on mouse wheel events are + // unstandardized between browsers and even browser versions, and + // generally horribly unpredictable, this code starts by measuring + // the scroll effect that the first few mouse wheel events have, + // and, from that, detects the way it can convert deltas to pixel + // offsets afterwards. + // + // The reason we want to know the amount a wheel event will scroll + // is that it gives us a chance to update the display before the + // actual scrolling happens, reducing flickering. + + var wheelSamples = 0, + wheelPixelsPerUnit = null; + // Fill in a browser-detected starting value on browsers where we + // know one. These don't have to be accurate -- the result of them + // being wrong would just be a slight flicker on the first wheel + // scroll (if it is large enough). + if (ie) { + wheelPixelsPerUnit = -.53; + } else if (gecko) { + wheelPixelsPerUnit = 15; + } else if (chrome) { + wheelPixelsPerUnit = -.7; + } else if (safari) { + wheelPixelsPerUnit = -1 / 3; + } + function wheelEventDelta(e) { + var dx = e.wheelDeltaX, + dy = e.wheelDeltaY; + if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { + dx = e.detail; + } + if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { + dy = e.detail; + } else if (dy == null) { + dy = e.wheelDelta; + } + return { + x: dx, + y: dy + }; + } + function wheelEventPixels(e) { + var delta = wheelEventDelta(e); + delta.x *= wheelPixelsPerUnit; + delta.y *= wheelPixelsPerUnit; + return delta; + } + function onScrollWheel(cm, e) { + var delta = wheelEventDelta(e), + dx = delta.x, + dy = delta.y; + var pixelsPerUnit = wheelPixelsPerUnit; + if (e.deltaMode === 0) { + dx = e.deltaX; + dy = e.deltaY; + pixelsPerUnit = 1; + } + var display = cm.display, + scroll = display.scroller; + // Quit if there's nothing to scroll here + var canScrollX = scroll.scrollWidth > scroll.clientWidth; + var canScrollY = scroll.scrollHeight > scroll.clientHeight; + if (!(dx && canScrollX || dy && canScrollY)) { + return; + } + + // Webkit browsers on OS X abort momentum scrolls when the target + // of the scroll event is removed from the scrollable element. + // This hack (see related code in patchDisplay) makes sure the + // element is kept around. + if (dy && mac && webkit) { + outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { + for (var i = 0; i < view.length; i++) { + if (view[i].node == cur) { + cm.display.currentWheelTarget = cur; + break outer; + } + } + } + } + + // On some browsers, horizontal scrolling will cause redraws to + // happen before the gutter has been realigned, causing it to + // wriggle around in a most unseemly way. When we have an + // estimated pixels/delta value, we just handle horizontal + // scrolling entirely here. It'll be slightly off from native, but + // better than glitching out. + if (dx && !gecko && !presto && pixelsPerUnit != null) { + if (dy && canScrollY) { + updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); + } + setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); + // Only prevent default scrolling if vertical scrolling is + // actually possible. Otherwise, it causes vertical scroll + // jitter on OSX trackpads when deltaX is small and deltaY + // is large (issue #3579) + if (!dy || dy && canScrollY) { + e_preventDefault(e); + } + display.wheelStartX = null; // Abort measurement, if in progress + return; + } + + // 'Project' the visible viewport to cover the area that is being + // scrolled into view (if we know enough to estimate it). + if (dy && pixelsPerUnit != null) { + var pixels = dy * pixelsPerUnit; + var top = cm.doc.scrollTop, + bot = top + display.wrapper.clientHeight; + if (pixels < 0) { + top = Math.max(0, top + pixels - 50); + } else { + bot = Math.min(cm.doc.height, bot + pixels + 50); + } + updateDisplaySimple(cm, { + top: top, + bottom: bot + }); + } + if (wheelSamples < 20 && e.deltaMode !== 0) { + if (display.wheelStartX == null) { + display.wheelStartX = scroll.scrollLeft; + display.wheelStartY = scroll.scrollTop; + display.wheelDX = dx; + display.wheelDY = dy; + setTimeout(function () { + if (display.wheelStartX == null) { + return; + } + var movedX = scroll.scrollLeft - display.wheelStartX; + var movedY = scroll.scrollTop - display.wheelStartY; + var sample = movedY && display.wheelDY && movedY / display.wheelDY || movedX && display.wheelDX && movedX / display.wheelDX; + display.wheelStartX = display.wheelStartY = null; + if (!sample) { + return; + } + wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); + ++wheelSamples; + }, 200); + } else { + display.wheelDX += dx; + display.wheelDY += dy; + } + } + } + + // Selection objects are immutable. A new one is created every time + // the selection changes. A selection is one or more non-overlapping + // (and non-touching) ranges, sorted, and an integer that indicates + // which one is the primary selection (the one that's scrolled into + // view, that getCursor returns, etc). + var Selection = function (ranges, primIndex) { + this.ranges = ranges; + this.primIndex = primIndex; + }; + Selection.prototype.primary = function () { + return this.ranges[this.primIndex]; + }; + Selection.prototype.equals = function (other) { + if (other == this) { + return true; + } + if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { + return false; + } + for (var i = 0; i < this.ranges.length; i++) { + var here = this.ranges[i], + there = other.ranges[i]; + if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { + return false; + } + } + return true; + }; + Selection.prototype.deepCopy = function () { + var out = []; + for (var i = 0; i < this.ranges.length; i++) { + out[i] = new Range(copyPos(this.ranges[i].anchor), copyPos(this.ranges[i].head)); + } + return new Selection(out, this.primIndex); + }; + Selection.prototype.somethingSelected = function () { + for (var i = 0; i < this.ranges.length; i++) { + if (!this.ranges[i].empty()) { + return true; + } + } + return false; + }; + Selection.prototype.contains = function (pos, end) { + if (!end) { + end = pos; + } + for (var i = 0; i < this.ranges.length; i++) { + var range = this.ranges[i]; + if (cmp(end, range.from()) >= 0 && cmp(pos, range.to()) <= 0) { + return i; + } + } + return -1; + }; + var Range = function (anchor, head) { + this.anchor = anchor; + this.head = head; + }; + Range.prototype.from = function () { + return minPos(this.anchor, this.head); + }; + Range.prototype.to = function () { + return maxPos(this.anchor, this.head); + }; + Range.prototype.empty = function () { + return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; + }; + + // Take an unsorted, potentially overlapping set of ranges, and + // build a selection out of it. 'Consumes' ranges array (modifying + // it). + function normalizeSelection(cm, ranges, primIndex) { + var mayTouch = cm && cm.options.selectionsMayTouch; + var prim = ranges[primIndex]; + ranges.sort(function (a, b) { + return cmp(a.from(), b.from()); + }); + primIndex = indexOf(ranges, prim); + for (var i = 1; i < ranges.length; i++) { + var cur = ranges[i], + prev = ranges[i - 1]; + var diff = cmp(prev.to(), cur.from()); + if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { + var from = minPos(prev.from(), cur.from()), + to = maxPos(prev.to(), cur.to()); + var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; + if (i <= primIndex) { + --primIndex; + } + ranges.splice(--i, 2, new Range(inv ? to : from, inv ? from : to)); + } + } + return new Selection(ranges, primIndex); + } + function simpleSelection(anchor, head) { + return new Selection([new Range(anchor, head || anchor)], 0); + } + + // Compute the position of the end of a change (its 'to' property + // refers to the pre-change end). + function changeEnd(change) { + if (!change.text) { + return change.to; + } + return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); + } + + // Adjust a position to refer to the post-change position of the + // same text, or the end of the change if the change covers it. + function adjustForChange(pos, change) { + if (cmp(pos, change.from) < 0) { + return pos; + } + if (cmp(pos, change.to) <= 0) { + return changeEnd(change); + } + var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, + ch = pos.ch; + if (pos.line == change.to.line) { + ch += changeEnd(change).ch - change.to.ch; + } + return Pos(line, ch); + } + function computeSelAfterChange(doc, change) { + var out = []; + for (var i = 0; i < doc.sel.ranges.length; i++) { + var range = doc.sel.ranges[i]; + out.push(new Range(adjustForChange(range.anchor, change), adjustForChange(range.head, change))); + } + return normalizeSelection(doc.cm, out, doc.sel.primIndex); + } + function offsetPos(pos, old, nw) { + if (pos.line == old.line) { + return Pos(nw.line, pos.ch - old.ch + nw.ch); + } else { + return Pos(nw.line + (pos.line - old.line), pos.ch); + } + } + + // Used by replaceSelections to allow moving the selection to the + // start or around the replaced test. Hint may be "start" or "around". + function computeReplacedSel(doc, changes, hint) { + var out = []; + var oldPrev = Pos(doc.first, 0), + newPrev = oldPrev; + for (var i = 0; i < changes.length; i++) { + var change = changes[i]; + var from = offsetPos(change.from, oldPrev, newPrev); + var to = offsetPos(changeEnd(change), oldPrev, newPrev); + oldPrev = change.to; + newPrev = to; + if (hint == "around") { + var range = doc.sel.ranges[i], + inv = cmp(range.head, range.anchor) < 0; + out[i] = new Range(inv ? to : from, inv ? from : to); + } else { + out[i] = new Range(from, from); + } + } + return new Selection(out, doc.sel.primIndex); + } + + // Used to get the editor into a consistent state again when options change. + + function loadMode(cm) { + cm.doc.mode = getMode(cm.options, cm.doc.modeOption); + resetModeState(cm); + } + function resetModeState(cm) { + cm.doc.iter(function (line) { + if (line.stateAfter) { + line.stateAfter = null; + } + if (line.styles) { + line.styles = null; + } + }); + cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; + startWorker(cm, 100); + cm.state.modeGen++; + if (cm.curOp) { + regChange(cm); + } + } + + // DOCUMENT DATA STRUCTURE + + // By default, updates that start and end at the beginning of a line + // are treated specially, in order to make the association of line + // widgets and marker elements with the text behave more intuitive. + function isWholeLineUpdate(doc, change) { + return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore); + } + + // Perform a change on the document data structure. + function updateDoc(doc, change, markedSpans, estimateHeight) { + function spansFor(n) { + return markedSpans ? markedSpans[n] : null; + } + function update(line, text, spans) { + updateLine(line, text, spans, estimateHeight); + signalLater(line, "change", line, change); + } + function linesFor(start, end) { + var result = []; + for (var i = start; i < end; ++i) { + result.push(new Line(text[i], spansFor(i), estimateHeight)); + } + return result; + } + var from = change.from, + to = change.to, + text = change.text; + var firstLine = getLine(doc, from.line), + lastLine = getLine(doc, to.line); + var lastText = lst(text), + lastSpans = spansFor(text.length - 1), + nlines = to.line - from.line; + + // Adjust the line structure + if (change.full) { + doc.insert(0, linesFor(0, text.length)); + doc.remove(text.length, doc.size - text.length); + } else if (isWholeLineUpdate(doc, change)) { + // This is a whole-line replace. Treated specially to make + // sure line objects move the way they are supposed to. + var added = linesFor(0, text.length - 1); + update(lastLine, lastLine.text, lastSpans); + if (nlines) { + doc.remove(from.line, nlines); + } + if (added.length) { + doc.insert(from.line, added); + } + } else if (firstLine == lastLine) { + if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); + } else { + var added$1 = linesFor(1, text.length - 1); + added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight)); + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + doc.insert(from.line + 1, added$1); + } + } else if (text.length == 1) { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); + doc.remove(from.line + 1, nlines); + } else { + update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); + update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); + var added$2 = linesFor(1, text.length - 1); + if (nlines > 1) { + doc.remove(from.line + 1, nlines - 1); + } + doc.insert(from.line + 1, added$2); + } + signalLater(doc, "change", doc, change); + } + + // Call f for all linked documents. + function linkedDocs(doc, f, sharedHistOnly) { + function propagate(doc, skip, sharedHist) { + if (doc.linked) { + for (var i = 0; i < doc.linked.length; ++i) { + var rel = doc.linked[i]; + if (rel.doc == skip) { + continue; + } + var shared = sharedHist && rel.sharedHist; + if (sharedHistOnly && !shared) { + continue; + } + f(rel.doc, shared); + propagate(rel.doc, doc, shared); + } + } + } + propagate(doc, null, true); + } + + // Attach a document to an editor. + function attachDoc(cm, doc) { + if (doc.cm) { + throw new Error("This document is already in use."); + } + cm.doc = doc; + doc.cm = cm; + estimateLineHeights(cm); + loadMode(cm); + setDirectionClass(cm); + cm.options.direction = doc.direction; + if (!cm.options.lineWrapping) { + findMaxLine(cm); + } + cm.options.mode = doc.modeOption; + regChange(cm); + } + function setDirectionClass(cm) { + (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); + } + function directionChanged(cm) { + runInOp(cm, function () { + setDirectionClass(cm); + regChange(cm); + }); + } + function History(prev) { + // Arrays of change events and selections. Doing something adds an + // event to done and clears undo. Undoing moves events from done + // to undone, redoing moves them in the other direction. + this.done = []; + this.undone = []; + this.undoDepth = prev ? prev.undoDepth : Infinity; + // Used to track when changes can be merged into a single undo + // event + this.lastModTime = this.lastSelTime = 0; + this.lastOp = this.lastSelOp = null; + this.lastOrigin = this.lastSelOrigin = null; + // Used by the isClean() method + this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; + } + + // Create a history change event from an updateDoc-style change + // object. + function historyChangeFromChange(doc, change) { + var histChange = { + from: copyPos(change.from), + to: changeEnd(change), + text: getBetween(doc, change.from, change.to) + }; + attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + linkedDocs(doc, function (doc) { + return attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); + }, true); + return histChange; + } + + // Pop all selection events off the end of a history array. Stop at + // a change event. + function clearSelectionEvents(array) { + while (array.length) { + var last = lst(array); + if (last.ranges) { + array.pop(); + } else { + break; + } + } + } + + // Find the top change event in the history. Pop off selection + // events that are in the way. + function lastChangeEvent(hist, force) { + if (force) { + clearSelectionEvents(hist.done); + return lst(hist.done); + } else if (hist.done.length && !lst(hist.done).ranges) { + return lst(hist.done); + } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { + hist.done.pop(); + return lst(hist.done); + } + } + + // Register a change in the history. Merges changes that are within + // a single operation, or are close together with an origin that + // allows merging (starting with "+") into a single event. + function addChangeToHistory(doc, change, selAfter, opId) { + var hist = doc.history; + hist.undone.length = 0; + var time = +new Date(), + cur; + var last; + if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && (change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { + // Merge this change into the last event + last = lst(cur.changes); + if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { + // Optimized case for simple insertion -- don't want to add + // new changesets for every character typed + last.to = changeEnd(change); + } else { + // Add new sub-event + cur.changes.push(historyChangeFromChange(doc, change)); + } + } else { + // Can not be merged, start a new event. + var before = lst(hist.done); + if (!before || !before.ranges) { + pushSelectionToHistory(doc.sel, hist.done); + } + cur = { + changes: [historyChangeFromChange(doc, change)], + generation: hist.generation + }; + hist.done.push(cur); + while (hist.done.length > hist.undoDepth) { + hist.done.shift(); + if (!hist.done[0].ranges) { + hist.done.shift(); + } + } + } + hist.done.push(selAfter); + hist.generation = ++hist.maxGeneration; + hist.lastModTime = hist.lastSelTime = time; + hist.lastOp = hist.lastSelOp = opId; + hist.lastOrigin = hist.lastSelOrigin = change.origin; + if (!last) { + signal(doc, "historyAdded"); + } + } + function selectionEventCanBeMerged(doc, origin, prev, sel) { + var ch = origin.charAt(0); + return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && new Date() - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500); + } + + // Called whenever the selection changes, sets the new selection as + // the pending selection in the history, and pushes the old pending + // selection into the 'done' array when it was significantly + // different (in number of selected ranges, emptiness, or time). + function addSelectionToHistory(doc, sel, opId, options) { + var hist = doc.history, + origin = options && options.origin; + + // A new event is started when the previous origin does not match + // the current, or the origins don't allow matching. Origins + // starting with * are always merged, those starting with + are + // merged when similar and close together in time. + if (opId == hist.lastSelOp || origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))) { + hist.done[hist.done.length - 1] = sel; + } else { + pushSelectionToHistory(sel, hist.done); + } + hist.lastSelTime = +new Date(); + hist.lastSelOrigin = origin; + hist.lastSelOp = opId; + if (options && options.clearRedo !== false) { + clearSelectionEvents(hist.undone); + } + } + function pushSelectionToHistory(sel, dest) { + var top = lst(dest); + if (!(top && top.ranges && top.equals(sel))) { + dest.push(sel); + } + } + + // Used to store marked span information in the history. + function attachLocalSpans(doc, change, from, to) { + var existing = change["spans_" + doc.id], + n = 0; + doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { + if (line.markedSpans) { + (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; + } + ++n; + }); + } + + // When un/re-doing restores text containing marked spans, those + // that have been explicitly cleared should not be restored. + function removeClearedSpans(spans) { + if (!spans) { + return null; + } + var out; + for (var i = 0; i < spans.length; ++i) { + if (spans[i].marker.explicitlyCleared) { + if (!out) { + out = spans.slice(0, i); + } + } else if (out) { + out.push(spans[i]); + } + } + return !out ? spans : out.length ? out : null; + } + + // Retrieve and filter the old marked spans stored in a change event. + function getOldSpans(doc, change) { + var found = change["spans_" + doc.id]; + if (!found) { + return null; + } + var nw = []; + for (var i = 0; i < change.text.length; ++i) { + nw.push(removeClearedSpans(found[i])); + } + return nw; + } + + // Used for un/re-doing changes from the history. Combines the + // result of computing the existing spans with the set of spans that + // existed in the history (so that deleting around a span and then + // undoing brings back the span). + function mergeOldSpans(doc, change) { + var old = getOldSpans(doc, change); + var stretched = stretchSpansOverChange(doc, change); + if (!old) { + return stretched; + } + if (!stretched) { + return old; + } + for (var i = 0; i < old.length; ++i) { + var oldCur = old[i], + stretchCur = stretched[i]; + if (oldCur && stretchCur) { + spans: for (var j = 0; j < stretchCur.length; ++j) { + var span = stretchCur[j]; + for (var k = 0; k < oldCur.length; ++k) { + if (oldCur[k].marker == span.marker) { + continue spans; + } + } + oldCur.push(span); + } + } else if (stretchCur) { + old[i] = stretchCur; + } + } + return old; + } + + // Used both to provide a JSON-safe object in .getHistory, and, when + // detaching a document, to split the history in two + function copyHistoryArray(events, newGroup, instantiateSel) { + var copy = []; + for (var i = 0; i < events.length; ++i) { + var event = events[i]; + if (event.ranges) { + copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); + continue; + } + var changes = event.changes, + newChanges = []; + copy.push({ + changes: newChanges + }); + for (var j = 0; j < changes.length; ++j) { + var change = changes[j], + m = void 0; + newChanges.push({ + from: change.from, + to: change.to, + text: change.text + }); + if (newGroup) { + for (var prop in change) { + if (m = prop.match(/^spans_(\d+)$/)) { + if (indexOf(newGroup, Number(m[1])) > -1) { + lst(newChanges)[prop] = change[prop]; + delete change[prop]; + } + } + } + } + } + } + return copy; + } + + // The 'scroll' parameter given to many of these indicated whether + // the new cursor position should be scrolled into view after + // modifying the selection. + + // If shift is held or the extend flag is set, extends a range to + // include a given position (and optionally a second position). + // Otherwise, simply returns the range between the given positions. + // Used for cursor motion and such. + function extendRange(range, head, other, extend) { + if (extend) { + var anchor = range.anchor; + if (other) { + var posBefore = cmp(head, anchor) < 0; + if (posBefore != cmp(other, anchor) < 0) { + anchor = head; + head = other; + } else if (posBefore != cmp(head, other) < 0) { + head = other; + } + } + return new Range(anchor, head); + } else { + return new Range(other || head, head); + } + } + + // Extend the primary selection range, discard the rest. + function extendSelection(doc, head, other, options, extend) { + if (extend == null) { + extend = doc.cm && (doc.cm.display.shift || doc.extend); + } + setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); + } + + // Extend all selections (pos is an array of selections with length + // equal the number of selections) + function extendSelections(doc, heads, options) { + var out = []; + var extend = doc.cm && (doc.cm.display.shift || doc.extend); + for (var i = 0; i < doc.sel.ranges.length; i++) { + out[i] = extendRange(doc.sel.ranges[i], heads[i], null, extend); + } + var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); + setSelection(doc, newSel, options); + } + + // Updates a single range in the selection. + function replaceOneSelection(doc, i, range, options) { + var ranges = doc.sel.ranges.slice(0); + ranges[i] = range; + setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); + } + + // Reset the selection to a single range. + function setSimpleSelection(doc, anchor, head, options) { + setSelection(doc, simpleSelection(anchor, head), options); + } + + // Give beforeSelectionChange handlers a change to influence a + // selection update. + function filterSelectionChange(doc, sel, options) { + var obj = { + ranges: sel.ranges, + update: function (ranges) { + this.ranges = []; + for (var i = 0; i < ranges.length; i++) { + this.ranges[i] = new Range(clipPos(doc, ranges[i].anchor), clipPos(doc, ranges[i].head)); + } + }, + origin: options && options.origin + }; + signal(doc, "beforeSelectionChange", doc, obj); + if (doc.cm) { + signal(doc.cm, "beforeSelectionChange", doc.cm, obj); + } + if (obj.ranges != sel.ranges) { + return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1); + } else { + return sel; + } + } + function setSelectionReplaceHistory(doc, sel, options) { + var done = doc.history.done, + last = lst(done); + if (last && last.ranges) { + done[done.length - 1] = sel; + setSelectionNoUndo(doc, sel, options); + } else { + setSelection(doc, sel, options); + } + } + + // Set a new selection. + function setSelection(doc, sel, options) { + setSelectionNoUndo(doc, sel, options); + addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); + } + function setSelectionNoUndo(doc, sel, options) { + if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { + sel = filterSelectionChange(doc, sel, options); + } + var bias = options && options.bias || (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); + setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); + if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") { + ensureCursorVisible(doc.cm); + } + } + function setSelectionInner(doc, sel) { + if (sel.equals(doc.sel)) { + return; + } + doc.sel = sel; + if (doc.cm) { + doc.cm.curOp.updateInput = 1; + doc.cm.curOp.selectionChanged = true; + signalCursorActivity(doc.cm); + } + signalLater(doc, "cursorActivity", doc); + } + + // Verify that the selection does not partially select any atomic + // marked ranges. + function reCheckSelection(doc) { + setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); + } + + // Return a selection that does not partially select any atomic + // ranges. + function skipAtomicInSelection(doc, sel, bias, mayClear) { + var out; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i]; + var newAnchor = skipAtomic(doc, range.anchor, old && old.anchor, bias, mayClear); + var newHead = skipAtomic(doc, range.head, old && old.head, bias, mayClear); + if (out || newAnchor != range.anchor || newHead != range.head) { + if (!out) { + out = sel.ranges.slice(0, i); + } + out[i] = new Range(newAnchor, newHead); + } + } + return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel; + } + function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { + var line = getLine(doc, pos.line); + if (line.markedSpans) { + for (var i = 0; i < line.markedSpans.length; ++i) { + var sp = line.markedSpans[i], + m = sp.marker; + + // Determine if we should prevent the cursor being placed to the left/right of an atomic marker + // Historically this was determined using the inclusiveLeft/Right option, but the new way to control it + // is with selectLeft/Right + var preventCursorLeft = "selectLeft" in m ? !m.selectLeft : m.inclusiveLeft; + var preventCursorRight = "selectRight" in m ? !m.selectRight : m.inclusiveRight; + if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { + if (mayClear) { + signal(m, "beforeCursorEnter"); + if (m.explicitlyCleared) { + if (!line.markedSpans) { + break; + } else { + --i; + continue; + } + } + } + if (!m.atomic) { + continue; + } + if (oldPos) { + var near = m.find(dir < 0 ? 1 : -1), + diff = void 0; + if (dir < 0 ? preventCursorRight : preventCursorLeft) { + near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); + } + if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) { + return skipAtomicInner(doc, near, pos, dir, mayClear); + } + } + var far = m.find(dir < 0 ? -1 : 1); + if (dir < 0 ? preventCursorLeft : preventCursorRight) { + far = movePos(doc, far, dir, far.line == pos.line ? line : null); + } + return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null; + } + } + } + return pos; + } + + // Ensure a given position is not inside an atomic range. + function skipAtomic(doc, pos, oldPos, bias, mayClear) { + var dir = bias || 1; + var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, dir, true) || skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true); + if (!found) { + doc.cantEdit = true; + return Pos(doc.first, 0); + } + return found; + } + function movePos(doc, pos, dir, line) { + if (dir < 0 && pos.ch == 0) { + if (pos.line > doc.first) { + return clipPos(doc, Pos(pos.line - 1)); + } else { + return null; + } + } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { + if (pos.line < doc.first + doc.size - 1) { + return Pos(pos.line + 1, 0); + } else { + return null; + } + } else { + return new Pos(pos.line, pos.ch + dir); + } + } + function selectAll(cm) { + cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); + } + + // UPDATING + + // Allow "beforeChange" event handlers to influence a change + function filterChange(doc, change, update) { + var obj = { + canceled: false, + from: change.from, + to: change.to, + text: change.text, + origin: change.origin, + cancel: function () { + return obj.canceled = true; + } + }; + if (update) { + obj.update = function (from, to, text, origin) { + if (from) { + obj.from = clipPos(doc, from); + } + if (to) { + obj.to = clipPos(doc, to); + } + if (text) { + obj.text = text; + } + if (origin !== undefined) { + obj.origin = origin; + } + }; + } + signal(doc, "beforeChange", doc, obj); + if (doc.cm) { + signal(doc.cm, "beforeChange", doc.cm, obj); + } + if (obj.canceled) { + if (doc.cm) { + doc.cm.curOp.updateInput = 2; + } + return null; + } + return { + from: obj.from, + to: obj.to, + text: obj.text, + origin: obj.origin + }; + } + + // Apply a change to a document, and add it to the document's + // history, and propagating it to all linked documents. + function makeChange(doc, change, ignoreReadOnly) { + if (doc.cm) { + if (!doc.cm.curOp) { + return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly); + } + if (doc.cm.state.suppressEdits) { + return; + } + } + if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { + change = filterChange(doc, change, true); + if (!change) { + return; + } + } + + // Possibly split or suppress the update based on the presence + // of read-only spans in its range. + var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); + if (split) { + for (var i = split.length - 1; i >= 0; --i) { + makeChangeInner(doc, { + from: split[i].from, + to: split[i].to, + text: i ? [""] : change.text, + origin: change.origin + }); + } + } else { + makeChangeInner(doc, change); + } + } + function makeChangeInner(doc, change) { + if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { + return; + } + var selAfter = computeSelAfterChange(doc, change); + addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); + makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); + var rebased = []; + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, stretchSpansOverChange(doc, change)); + }); + } + + // Revert a change stored in a document's history. + function makeChangeFromHistory(doc, type, allowSelectionOnly) { + var suppress = doc.cm && doc.cm.state.suppressEdits; + if (suppress && !allowSelectionOnly) { + return; + } + var hist = doc.history, + event, + selAfter = doc.sel; + var source = type == "undo" ? hist.done : hist.undone, + dest = type == "undo" ? hist.undone : hist.done; + + // Verify that there is a useable event (so that ctrl-z won't + // needlessly clear selection events) + var i = 0; + for (; i < source.length; i++) { + event = source[i]; + if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) { + break; + } + } + if (i == source.length) { + return; + } + hist.lastOrigin = hist.lastSelOrigin = null; + for (;;) { + event = source.pop(); + if (event.ranges) { + pushSelectionToHistory(event, dest); + if (allowSelectionOnly && !event.equals(doc.sel)) { + setSelection(doc, event, { + clearRedo: false + }); + return; + } + selAfter = event; + } else if (suppress) { + source.push(event); + return; + } else { + break; + } + } + + // Build up a reverse change object to add to the opposite history + // stack (redo when undoing, and vice versa). + var antiChanges = []; + pushSelectionToHistory(selAfter, dest); + dest.push({ + changes: antiChanges, + generation: hist.generation + }); + hist.generation = event.generation || ++hist.maxGeneration; + var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); + var loop = function (i) { + var change = event.changes[i]; + change.origin = type; + if (filter && !filterChange(doc, change, false)) { + source.length = 0; + return {}; + } + antiChanges.push(historyChangeFromChange(doc, change)); + var after = i ? computeSelAfterChange(doc, change) : lst(source); + makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); + if (!i && doc.cm) { + doc.cm.scrollIntoView({ + from: change.from, + to: changeEnd(change) + }); + } + var rebased = []; + + // Propagate to the linked documents + linkedDocs(doc, function (doc, sharedHist) { + if (!sharedHist && indexOf(rebased, doc.history) == -1) { + rebaseHist(doc.history, change); + rebased.push(doc.history); + } + makeChangeSingleDoc(doc, change, null, mergeOldSpans(doc, change)); + }); + }; + for (var i$1 = event.changes.length - 1; i$1 >= 0; --i$1) { + var returned = loop(i$1); + if (returned) return returned.v; + } + } + + // Sub-views need their line numbers shifted when text is added + // above or below them in the parent document. + function shiftDoc(doc, distance) { + if (distance == 0) { + return; + } + doc.first += distance; + doc.sel = new Selection(map(doc.sel.ranges, function (range) { + return new Range(Pos(range.anchor.line + distance, range.anchor.ch), Pos(range.head.line + distance, range.head.ch)); + }), doc.sel.primIndex); + if (doc.cm) { + regChange(doc.cm, doc.first, doc.first - distance, distance); + for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) { + regLineChange(doc.cm, l, "gutter"); + } + } + } + + // More lower-level change function, handling only a single document + // (not linked ones). + function makeChangeSingleDoc(doc, change, selAfter, spans) { + if (doc.cm && !doc.cm.curOp) { + return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); + } + if (change.to.line < doc.first) { + shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); + return; + } + if (change.from.line > doc.lastLine()) { + return; + } + + // Clip the change to the size of this doc + if (change.from.line < doc.first) { + var shift = change.text.length - 1 - (doc.first - change.from.line); + shiftDoc(doc, shift); + change = { + from: Pos(doc.first, 0), + to: Pos(change.to.line + shift, change.to.ch), + text: [lst(change.text)], + origin: change.origin + }; + } + var last = doc.lastLine(); + if (change.to.line > last) { + change = { + from: change.from, + to: Pos(last, getLine(doc, last).text.length), + text: [change.text[0]], + origin: change.origin + }; + } + change.removed = getBetween(doc, change.from, change.to); + if (!selAfter) { + selAfter = computeSelAfterChange(doc, change); + } + if (doc.cm) { + makeChangeSingleDocInEditor(doc.cm, change, spans); + } else { + updateDoc(doc, change, spans); + } + setSelectionNoUndo(doc, selAfter, sel_dontScroll); + if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) { + doc.cantEdit = false; + } + } + + // Handle the interaction of a change to a document with the editor + // that this document is part of. + function makeChangeSingleDocInEditor(cm, change, spans) { + var doc = cm.doc, + display = cm.display, + from = change.from, + to = change.to; + var recomputeMaxLength = false, + checkWidthStart = from.line; + if (!cm.options.lineWrapping) { + checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); + doc.iter(checkWidthStart, to.line + 1, function (line) { + if (line == display.maxLine) { + recomputeMaxLength = true; + return true; + } + }); + } + if (doc.sel.contains(change.from, change.to) > -1) { + signalCursorActivity(cm); + } + updateDoc(doc, change, spans, estimateHeight(cm)); + if (!cm.options.lineWrapping) { + doc.iter(checkWidthStart, from.line + change.text.length, function (line) { + var len = lineLength(line); + if (len > display.maxLineLength) { + display.maxLine = line; + display.maxLineLength = len; + display.maxLineChanged = true; + recomputeMaxLength = false; + } + }); + if (recomputeMaxLength) { + cm.curOp.updateMaxLine = true; + } + } + retreatFrontier(doc, from.line); + startWorker(cm, 400); + var lendiff = change.text.length - (to.line - from.line) - 1; + // Remember that these lines changed, for updating the display + if (change.full) { + regChange(cm); + } else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) { + regLineChange(cm, from.line, "text"); + } else { + regChange(cm, from.line, to.line + 1, lendiff); + } + var changesHandler = hasHandler(cm, "changes"), + changeHandler = hasHandler(cm, "change"); + if (changeHandler || changesHandler) { + var obj = { + from: from, + to: to, + text: change.text, + removed: change.removed, + origin: change.origin + }; + if (changeHandler) { + signalLater(cm, "change", cm, obj); + } + if (changesHandler) { + (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); + } + } + cm.display.selForContextMenu = null; + } + function replaceRange(doc, code, from, to, origin) { + var assign; + if (!to) { + to = from; + } + if (cmp(to, from) < 0) { + assign = [to, from], from = assign[0], to = assign[1]; + } + if (typeof code == "string") { + code = doc.splitLines(code); + } + makeChange(doc, { + from: from, + to: to, + text: code, + origin: origin + }); + } + + // Rebasing/resetting history to deal with externally-sourced changes + + function rebaseHistSelSingle(pos, from, to, diff) { + if (to < pos.line) { + pos.line += diff; + } else if (from < pos.line) { + pos.line = from; + pos.ch = 0; + } + } + + // Tries to rebase an array of history events given a change in the + // document. If the change touches the same lines as the event, the + // event, and everything 'behind' it, is discarded. If the change is + // before the event, the event's positions are updated. Uses a + // copy-on-write scheme for the positions, to avoid having to + // reallocate them all on every rebase, but also avoid problems with + // shared position objects being unsafely updated. + function rebaseHistArray(array, from, to, diff) { + for (var i = 0; i < array.length; ++i) { + var sub = array[i], + ok = true; + if (sub.ranges) { + if (!sub.copied) { + sub = array[i] = sub.deepCopy(); + sub.copied = true; + } + for (var j = 0; j < sub.ranges.length; j++) { + rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); + rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); + } + continue; + } + for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { + var cur = sub.changes[j$1]; + if (to < cur.from.line) { + cur.from = Pos(cur.from.line + diff, cur.from.ch); + cur.to = Pos(cur.to.line + diff, cur.to.ch); + } else if (from <= cur.to.line) { + ok = false; + break; + } + } + if (!ok) { + array.splice(0, i + 1); + i = 0; + } + } + } + function rebaseHist(hist, change) { + var from = change.from.line, + to = change.to.line, + diff = change.text.length - (to - from) - 1; + rebaseHistArray(hist.done, from, to, diff); + rebaseHistArray(hist.undone, from, to, diff); + } + + // Utility for applying a change to a line by handle or number, + // returning the number and optionally registering the line as + // changed. + function changeLine(doc, handle, changeType, op) { + var no = handle, + line = handle; + if (typeof handle == "number") { + line = getLine(doc, clipLine(doc, handle)); + } else { + no = lineNo(handle); + } + if (no == null) { + return null; + } + if (op(line, no) && doc.cm) { + regLineChange(doc.cm, no, changeType); + } + return line; + } + + // The document is represented as a BTree consisting of leaves, with + // chunk of lines in them, and branches, with up to ten leaves or + // other branch nodes below them. The top node is always a branch + // node, and is the document object itself (meaning it has + // additional methods and properties). + // + // All nodes have parent links. The tree is used both to go from + // line numbers to line objects, and to go from objects to numbers. + // It also indexes by height, and is used to convert between height + // and line object, and to find the total height of the document. + // + // See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html + + function LeafChunk(lines) { + this.lines = lines; + this.parent = null; + var height = 0; + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + height += lines[i].height; + } + this.height = height; + } + LeafChunk.prototype = { + chunkSize: function () { + return this.lines.length; + }, + // Remove the n lines at offset 'at'. + removeInner: function (at, n) { + for (var i = at, e = at + n; i < e; ++i) { + var line = this.lines[i]; + this.height -= line.height; + cleanUpLine(line); + signalLater(line, "delete"); + } + this.lines.splice(at, n); + }, + // Helper used to collapse a small branch into a single leaf. + collapse: function (lines) { + lines.push.apply(lines, this.lines); + }, + // Insert the given array of lines at offset 'at', count them as + // having the given height. + insertInner: function (at, lines, height) { + this.height += height; + this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); + for (var i = 0; i < lines.length; ++i) { + lines[i].parent = this; + } + }, + // Used to iterate over a part of the tree. + iterN: function (at, n, op) { + for (var e = at + n; at < e; ++at) { + if (op(this.lines[at])) { + return true; + } + } + } + }; + function BranchChunk(children) { + this.children = children; + var size = 0, + height = 0; + for (var i = 0; i < children.length; ++i) { + var ch = children[i]; + size += ch.chunkSize(); + height += ch.height; + ch.parent = this; + } + this.size = size; + this.height = height; + this.parent = null; + } + BranchChunk.prototype = { + chunkSize: function () { + return this.size; + }, + removeInner: function (at, n) { + this.size -= n; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], + sz = child.chunkSize(); + if (at < sz) { + var rm = Math.min(n, sz - at), + oldHeight = child.height; + child.removeInner(at, rm); + this.height -= oldHeight - child.height; + if (sz == rm) { + this.children.splice(i--, 1); + child.parent = null; + } + if ((n -= rm) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + // If the result is smaller than 25 lines, ensure that it is a + // single leaf node. + if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { + var lines = []; + this.collapse(lines); + this.children = [new LeafChunk(lines)]; + this.children[0].parent = this; + } + }, + collapse: function (lines) { + for (var i = 0; i < this.children.length; ++i) { + this.children[i].collapse(lines); + } + }, + insertInner: function (at, lines, height) { + this.size += lines.length; + this.height += height; + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], + sz = child.chunkSize(); + if (at <= sz) { + child.insertInner(at, lines, height); + if (child.lines && child.lines.length > 50) { + // To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced. + // Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest. + var remaining = child.lines.length % 25 + 25; + for (var pos = remaining; pos < child.lines.length;) { + var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); + child.height -= leaf.height; + this.children.splice(++i, 0, leaf); + leaf.parent = this; + } + child.lines = child.lines.slice(0, remaining); + this.maybeSpill(); + } + break; + } + at -= sz; + } + }, + // When a node has grown, check whether it should be split. + maybeSpill: function () { + if (this.children.length <= 10) { + return; + } + var me = this; + do { + var spilled = me.children.splice(me.children.length - 5, 5); + var sibling = new BranchChunk(spilled); + if (!me.parent) { + // Become the parent node + var copy = new BranchChunk(me.children); + copy.parent = me; + me.children = [copy, sibling]; + me = copy; + } else { + me.size -= sibling.size; + me.height -= sibling.height; + var myIndex = indexOf(me.parent.children, me); + me.parent.children.splice(myIndex + 1, 0, sibling); + } + sibling.parent = me.parent; + } while (me.children.length > 10); + me.parent.maybeSpill(); + }, + iterN: function (at, n, op) { + for (var i = 0; i < this.children.length; ++i) { + var child = this.children[i], + sz = child.chunkSize(); + if (at < sz) { + var used = Math.min(n, sz - at); + if (child.iterN(at, used, op)) { + return true; + } + if ((n -= used) == 0) { + break; + } + at = 0; + } else { + at -= sz; + } + } + } + }; + + // Line widgets are block elements displayed above or below a line. + + var LineWidget = function (doc, node, options) { + if (options) { + for (var opt in options) { + if (options.hasOwnProperty(opt)) { + this[opt] = options[opt]; + } + } + } + this.doc = doc; + this.node = node; + }; + LineWidget.prototype.clear = function () { + var cm = this.doc.cm, + ws = this.line.widgets, + line = this.line, + no = lineNo(line); + if (no == null || !ws) { + return; + } + for (var i = 0; i < ws.length; ++i) { + if (ws[i] == this) { + ws.splice(i--, 1); + } + } + if (!ws.length) { + line.widgets = null; + } + var height = widgetHeight(this); + updateLineHeight(line, Math.max(0, line.height - height)); + if (cm) { + runInOp(cm, function () { + adjustScrollWhenAboveVisible(cm, line, -height); + regLineChange(cm, no, "widget"); + }); + signalLater(cm, "lineWidgetCleared", cm, this, no); + } + }; + LineWidget.prototype.changed = function () { + var this$1 = this; + var oldH = this.height, + cm = this.doc.cm, + line = this.line; + this.height = null; + var diff = widgetHeight(this) - oldH; + if (!diff) { + return; + } + if (!lineIsHidden(this.doc, line)) { + updateLineHeight(line, line.height + diff); + } + if (cm) { + runInOp(cm, function () { + cm.curOp.forceUpdate = true; + adjustScrollWhenAboveVisible(cm, line, diff); + signalLater(cm, "lineWidgetChanged", cm, this$1, lineNo(line)); + }); + } + }; + eventMixin(LineWidget); + function adjustScrollWhenAboveVisible(cm, line, diff) { + if (heightAtLine(line) < (cm.curOp && cm.curOp.scrollTop || cm.doc.scrollTop)) { + addToScrollTop(cm, diff); + } + } + function addLineWidget(doc, handle, node, options) { + var widget = new LineWidget(doc, node, options); + var cm = doc.cm; + if (cm && widget.noHScroll) { + cm.display.alignWidgets = true; + } + changeLine(doc, handle, "widget", function (line) { + var widgets = line.widgets || (line.widgets = []); + if (widget.insertAt == null) { + widgets.push(widget); + } else { + widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); + } + widget.line = line; + if (cm && !lineIsHidden(doc, line)) { + var aboveVisible = heightAtLine(line) < doc.scrollTop; + updateLineHeight(line, line.height + widgetHeight(widget)); + if (aboveVisible) { + addToScrollTop(cm, widget.height); + } + cm.curOp.forceUpdate = true; + } + return true; + }); + if (cm) { + signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); + } + return widget; + } + + // TEXTMARKERS + + // Created with markText and setBookmark methods. A TextMarker is a + // handle that can be used to clear or find a marked position in the + // document. Line objects hold arrays (markedSpans) containing + // {from, to, marker} object pointing to such marker objects, and + // indicating that such a marker is present on that line. Multiple + // lines may point to the same marker when it spans across lines. + // The spans will have null for their from/to properties when the + // marker continues beyond the start/end of the line. Markers have + // links back to the lines they currently touch. + + // Collapsed markers have unique ids, in order to be able to order + // them, which is needed for uniquely determining an outer marker + // when they overlap (they may nest, but not partially overlap). + var nextMarkerId = 0; + var TextMarker = function (doc, type) { + this.lines = []; + this.type = type; + this.doc = doc; + this.id = ++nextMarkerId; + }; + + // Clear the marker. + TextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { + return; + } + var cm = this.doc.cm, + withOp = cm && !cm.curOp; + if (withOp) { + startOperation(cm); + } + if (hasHandler(this, "clear")) { + var found = this.find(); + if (found) { + signalLater(this, "clear", found.from, found.to); + } + } + var min = null, + max = null; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (cm && !this.collapsed) { + regLineChange(cm, lineNo(line), "text"); + } else if (cm) { + if (span.to != null) { + max = lineNo(line); + } + if (span.from != null) { + min = lineNo(line); + } + } + line.markedSpans = removeMarkedSpan(line.markedSpans, span); + if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) { + updateLineHeight(line, textHeight(cm.display)); + } + } + if (cm && this.collapsed && !cm.options.lineWrapping) { + for (var i$1 = 0; i$1 < this.lines.length; ++i$1) { + var visual = visualLine(this.lines[i$1]), + len = lineLength(visual); + if (len > cm.display.maxLineLength) { + cm.display.maxLine = visual; + cm.display.maxLineLength = len; + cm.display.maxLineChanged = true; + } + } + } + if (min != null && cm && this.collapsed) { + regChange(cm, min, max + 1); + } + this.lines.length = 0; + this.explicitlyCleared = true; + if (this.atomic && this.doc.cantEdit) { + this.doc.cantEdit = false; + if (cm) { + reCheckSelection(cm.doc); + } + } + if (cm) { + signalLater(cm, "markerCleared", cm, this, min, max); + } + if (withOp) { + endOperation(cm); + } + if (this.parent) { + this.parent.clear(); + } + }; + + // Find the position of the marker in the document. Returns a {from, + // to} object by default. Side can be passed to get a specific side + // -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the + // Pos objects returned contain a line object, rather than a line + // number (used to prevent looking up the same line twice). + TextMarker.prototype.find = function (side, lineObj) { + if (side == null && this.type == "bookmark") { + side = 1; + } + var from, to; + for (var i = 0; i < this.lines.length; ++i) { + var line = this.lines[i]; + var span = getMarkedSpanFor(line.markedSpans, this); + if (span.from != null) { + from = Pos(lineObj ? line : lineNo(line), span.from); + if (side == -1) { + return from; + } + } + if (span.to != null) { + to = Pos(lineObj ? line : lineNo(line), span.to); + if (side == 1) { + return to; + } + } + } + return from && { + from: from, + to: to + }; + }; + + // Signals that the marker's widget changed, and surrounding layout + // should be recomputed. + TextMarker.prototype.changed = function () { + var this$1 = this; + var pos = this.find(-1, true), + widget = this, + cm = this.doc.cm; + if (!pos || !cm) { + return; + } + runInOp(cm, function () { + var line = pos.line, + lineN = lineNo(pos.line); + var view = findViewForLine(cm, lineN); + if (view) { + clearLineMeasurementCacheFor(view); + cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; + } + cm.curOp.updateMaxLine = true; + if (!lineIsHidden(widget.doc, line) && widget.height != null) { + var oldHeight = widget.height; + widget.height = null; + var dHeight = widgetHeight(widget) - oldHeight; + if (dHeight) { + updateLineHeight(line, line.height + dHeight); + } + } + signalLater(cm, "markerChanged", cm, this$1); + }); + }; + TextMarker.prototype.attachLine = function (line) { + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) { + (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); + } + } + this.lines.push(line); + }; + TextMarker.prototype.detachLine = function (line) { + this.lines.splice(indexOf(this.lines, line), 1); + if (!this.lines.length && this.doc.cm) { + var op = this.doc.cm.curOp; + (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); + } + }; + eventMixin(TextMarker); + + // Create a marker, wire it up to the right lines, and + function markText(doc, from, to, options, type) { + // Shared markers (across linked documents) are handled separately + // (markTextShared will call out to this again, once per + // document). + if (options && options.shared) { + return markTextShared(doc, from, to, options, type); + } + // Ensure we are in an operation. + if (doc.cm && !doc.cm.curOp) { + return operation(doc.cm, markText)(doc, from, to, options, type); + } + var marker = new TextMarker(doc, type), + diff = cmp(from, to); + if (options) { + copyObj(options, marker, false); + } + // Don't connect empty markers unless clearWhenEmpty is false + if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) { + return marker; + } + if (marker.replacedWith) { + // Showing up as a widget implies collapsed (widget replaces text) + marker.collapsed = true; + marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); + if (!options.handleMouseEvents) { + marker.widgetNode.setAttribute("cm-ignore-events", "true"); + } + if (options.insertLeft) { + marker.widgetNode.insertLeft = true; + } + } + if (marker.collapsed) { + if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) { + throw new Error("Inserting collapsed marker partially overlapping an existing one"); + } + seeCollapsedSpans(); + } + if (marker.addToHistory) { + addChangeToHistory(doc, { + from: from, + to: to, + origin: "markText" + }, doc.sel, NaN); + } + var curLine = from.line, + cm = doc.cm, + updateMaxLine; + doc.iter(curLine, to.line + 1, function (line) { + if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) { + updateMaxLine = true; + } + if (marker.collapsed && curLine != from.line) { + updateLineHeight(line, 0); + } + addMarkedSpan(line, new MarkedSpan(marker, curLine == from.line ? from.ch : null, curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); + ++curLine; + }); + // lineIsHidden depends on the presence of the spans, so needs a second pass + if (marker.collapsed) { + doc.iter(from.line, to.line + 1, function (line) { + if (lineIsHidden(doc, line)) { + updateLineHeight(line, 0); + } + }); + } + if (marker.clearOnEnter) { + on(marker, "beforeCursorEnter", function () { + return marker.clear(); + }); + } + if (marker.readOnly) { + seeReadOnlySpans(); + if (doc.history.done.length || doc.history.undone.length) { + doc.clearHistory(); + } + } + if (marker.collapsed) { + marker.id = ++nextMarkerId; + marker.atomic = true; + } + if (cm) { + // Sync editor state + if (updateMaxLine) { + cm.curOp.updateMaxLine = true; + } + if (marker.collapsed) { + regChange(cm, from.line, to.line + 1); + } else if (marker.className || marker.startStyle || marker.endStyle || marker.css || marker.attributes || marker.title) { + for (var i = from.line; i <= to.line; i++) { + regLineChange(cm, i, "text"); + } + } + if (marker.atomic) { + reCheckSelection(cm.doc); + } + signalLater(cm, "markerAdded", cm, marker); + } + return marker; + } + + // SHARED TEXTMARKERS + + // A shared marker spans multiple linked documents. It is + // implemented as a meta-marker-object controlling multiple normal + // markers. + var SharedTextMarker = function (markers, primary) { + this.markers = markers; + this.primary = primary; + for (var i = 0; i < markers.length; ++i) { + markers[i].parent = this; + } + }; + SharedTextMarker.prototype.clear = function () { + if (this.explicitlyCleared) { + return; + } + this.explicitlyCleared = true; + for (var i = 0; i < this.markers.length; ++i) { + this.markers[i].clear(); + } + signalLater(this, "clear"); + }; + SharedTextMarker.prototype.find = function (side, lineObj) { + return this.primary.find(side, lineObj); + }; + eventMixin(SharedTextMarker); + function markTextShared(doc, from, to, options, type) { + options = copyObj(options); + options.shared = false; + var markers = [markText(doc, from, to, options, type)], + primary = markers[0]; + var widget = options.widgetNode; + linkedDocs(doc, function (doc) { + if (widget) { + options.widgetNode = widget.cloneNode(true); + } + markers.push(markText(doc, clipPos(doc, from), clipPos(doc, to), options, type)); + for (var i = 0; i < doc.linked.length; ++i) { + if (doc.linked[i].isParent) { + return; + } + } + primary = lst(markers); + }); + return new SharedTextMarker(markers, primary); + } + function findSharedMarkers(doc) { + return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { + return m.parent; + }); + } + function copySharedMarkers(doc, markers) { + for (var i = 0; i < markers.length; i++) { + var marker = markers[i], + pos = marker.find(); + var mFrom = doc.clipPos(pos.from), + mTo = doc.clipPos(pos.to); + if (cmp(mFrom, mTo)) { + var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); + marker.markers.push(subMark); + subMark.parent = marker; + } + } + } + function detachSharedMarkers(markers) { + var loop = function (i) { + var marker = markers[i], + linked = [marker.primary.doc]; + linkedDocs(marker.primary.doc, function (d) { + return linked.push(d); + }); + for (var j = 0; j < marker.markers.length; j++) { + var subMarker = marker.markers[j]; + if (indexOf(linked, subMarker.doc) == -1) { + subMarker.parent = null; + marker.markers.splice(j--, 1); + } + } + }; + for (var i = 0; i < markers.length; i++) loop(i); + } + var nextDocId = 0; + var Doc = function (text, mode, firstLine, lineSep, direction) { + if (!(this instanceof Doc)) { + return new Doc(text, mode, firstLine, lineSep, direction); + } + if (firstLine == null) { + firstLine = 0; + } + BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); + this.first = firstLine; + this.scrollTop = this.scrollLeft = 0; + this.cantEdit = false; + this.cleanGeneration = 1; + this.modeFrontier = this.highlightFrontier = firstLine; + var start = Pos(firstLine, 0); + this.sel = simpleSelection(start); + this.history = new History(null); + this.id = ++nextDocId; + this.modeOption = mode; + this.lineSep = lineSep; + this.direction = direction == "rtl" ? "rtl" : "ltr"; + this.extend = false; + if (typeof text == "string") { + text = this.splitLines(text); + } + updateDoc(this, { + from: start, + to: start, + text: text + }); + setSelection(this, simpleSelection(start), sel_dontScroll); + }; + Doc.prototype = createObj(BranchChunk.prototype, { + constructor: Doc, + // Iterate over the document. Supports two forms -- with only one + // argument, it calls that for each line in the document. With + // three, it iterates over the range given by the first two (with + // the second being non-inclusive). + iter: function (from, to, op) { + if (op) { + this.iterN(from - this.first, to - from, op); + } else { + this.iterN(this.first, this.first + this.size, from); + } + }, + // Non-public interface for adding and removing lines. + insert: function (at, lines) { + var height = 0; + for (var i = 0; i < lines.length; ++i) { + height += lines[i].height; + } + this.insertInner(at - this.first, lines, height); + }, + remove: function (at, n) { + this.removeInner(at - this.first, n); + }, + // From here, the methods are part of the public interface. Most + // are also available from CodeMirror (editor) instances. + + getValue: function (lineSep) { + var lines = getLines(this, this.first, this.first + this.size); + if (lineSep === false) { + return lines; + } + return lines.join(lineSep || this.lineSeparator()); + }, + setValue: docMethodOp(function (code) { + var top = Pos(this.first, 0), + last = this.first + this.size - 1; + makeChange(this, { + from: top, + to: Pos(last, getLine(this, last).text.length), + text: this.splitLines(code), + origin: "setValue", + full: true + }, true); + if (this.cm) { + scrollToCoords(this.cm, 0, 0); + } + setSelection(this, simpleSelection(top), sel_dontScroll); + }), + replaceRange: function (code, from, to, origin) { + from = clipPos(this, from); + to = to ? clipPos(this, to) : from; + replaceRange(this, code, from, to, origin); + }, + getRange: function (from, to, lineSep) { + var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); + if (lineSep === false) { + return lines; + } + if (lineSep === '') { + return lines.join(''); + } + return lines.join(lineSep || this.lineSeparator()); + }, + getLine: function (line) { + var l = this.getLineHandle(line); + return l && l.text; + }, + getLineHandle: function (line) { + if (isLine(this, line)) { + return getLine(this, line); + } + }, + getLineNumber: function (line) { + return lineNo(line); + }, + getLineHandleVisualStart: function (line) { + if (typeof line == "number") { + line = getLine(this, line); + } + return visualLine(line); + }, + lineCount: function () { + return this.size; + }, + firstLine: function () { + return this.first; + }, + lastLine: function () { + return this.first + this.size - 1; + }, + clipPos: function (pos) { + return clipPos(this, pos); + }, + getCursor: function (start) { + var range = this.sel.primary(), + pos; + if (start == null || start == "head") { + pos = range.head; + } else if (start == "anchor") { + pos = range.anchor; + } else if (start == "end" || start == "to" || start === false) { + pos = range.to(); + } else { + pos = range.from(); + } + return pos; + }, + listSelections: function () { + return this.sel.ranges; + }, + somethingSelected: function () { + return this.sel.somethingSelected(); + }, + setCursor: docMethodOp(function (line, ch, options) { + setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); + }), + setSelection: docMethodOp(function (anchor, head, options) { + setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); + }), + extendSelection: docMethodOp(function (head, other, options) { + extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); + }), + extendSelections: docMethodOp(function (heads, options) { + extendSelections(this, clipPosArray(this, heads), options); + }), + extendSelectionsBy: docMethodOp(function (f, options) { + var heads = map(this.sel.ranges, f); + extendSelections(this, clipPosArray(this, heads), options); + }), + setSelections: docMethodOp(function (ranges, primary, options) { + if (!ranges.length) { + return; + } + var out = []; + for (var i = 0; i < ranges.length; i++) { + out[i] = new Range(clipPos(this, ranges[i].anchor), clipPos(this, ranges[i].head || ranges[i].anchor)); + } + if (primary == null) { + primary = Math.min(ranges.length - 1, this.sel.primIndex); + } + setSelection(this, normalizeSelection(this.cm, out, primary), options); + }), + addSelection: docMethodOp(function (anchor, head, options) { + var ranges = this.sel.ranges.slice(0); + ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); + setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); + }), + getSelection: function (lineSep) { + var ranges = this.sel.ranges, + lines; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + lines = lines ? lines.concat(sel) : sel; + } + if (lineSep === false) { + return lines; + } else { + return lines.join(lineSep || this.lineSeparator()); + } + }, + getSelections: function (lineSep) { + var parts = [], + ranges = this.sel.ranges; + for (var i = 0; i < ranges.length; i++) { + var sel = getBetween(this, ranges[i].from(), ranges[i].to()); + if (lineSep !== false) { + sel = sel.join(lineSep || this.lineSeparator()); + } + parts[i] = sel; + } + return parts; + }, + replaceSelection: function (code, collapse, origin) { + var dup = []; + for (var i = 0; i < this.sel.ranges.length; i++) { + dup[i] = code; + } + this.replaceSelections(dup, collapse, origin || "+input"); + }, + replaceSelections: docMethodOp(function (code, collapse, origin) { + var changes = [], + sel = this.sel; + for (var i = 0; i < sel.ranges.length; i++) { + var range = sel.ranges[i]; + changes[i] = { + from: range.from(), + to: range.to(), + text: this.splitLines(code[i]), + origin: origin + }; + } + var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); + for (var i$1 = changes.length - 1; i$1 >= 0; i$1--) { + makeChange(this, changes[i$1]); + } + if (newSel) { + setSelectionReplaceHistory(this, newSel); + } else if (this.cm) { + ensureCursorVisible(this.cm); + } + }), + undo: docMethodOp(function () { + makeChangeFromHistory(this, "undo"); + }), + redo: docMethodOp(function () { + makeChangeFromHistory(this, "redo"); + }), + undoSelection: docMethodOp(function () { + makeChangeFromHistory(this, "undo", true); + }), + redoSelection: docMethodOp(function () { + makeChangeFromHistory(this, "redo", true); + }), + setExtending: function (val) { + this.extend = val; + }, + getExtending: function () { + return this.extend; + }, + historySize: function () { + var hist = this.history, + done = 0, + undone = 0; + for (var i = 0; i < hist.done.length; i++) { + if (!hist.done[i].ranges) { + ++done; + } + } + for (var i$1 = 0; i$1 < hist.undone.length; i$1++) { + if (!hist.undone[i$1].ranges) { + ++undone; + } + } + return { + undo: done, + redo: undone + }; + }, + clearHistory: function () { + var this$1 = this; + this.history = new History(this.history); + linkedDocs(this, function (doc) { + return doc.history = this$1.history; + }, true); + }, + markClean: function () { + this.cleanGeneration = this.changeGeneration(true); + }, + changeGeneration: function (forceSplit) { + if (forceSplit) { + this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; + } + return this.history.generation; + }, + isClean: function (gen) { + return this.history.generation == (gen || this.cleanGeneration); + }, + getHistory: function () { + return { + done: copyHistoryArray(this.history.done), + undone: copyHistoryArray(this.history.undone) + }; + }, + setHistory: function (histData) { + var hist = this.history = new History(this.history); + hist.done = copyHistoryArray(histData.done.slice(0), null, true); + hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); + }, + setGutterMarker: docMethodOp(function (line, gutterID, value) { + return changeLine(this, line, "gutter", function (line) { + var markers = line.gutterMarkers || (line.gutterMarkers = {}); + markers[gutterID] = value; + if (!value && isEmpty(markers)) { + line.gutterMarkers = null; + } + return true; + }); + }), + clearGutter: docMethodOp(function (gutterID) { + var this$1 = this; + this.iter(function (line) { + if (line.gutterMarkers && line.gutterMarkers[gutterID]) { + changeLine(this$1, line, "gutter", function () { + line.gutterMarkers[gutterID] = null; + if (isEmpty(line.gutterMarkers)) { + line.gutterMarkers = null; + } + return true; + }); + } + }); + }), + lineInfo: function (line) { + var n; + if (typeof line == "number") { + if (!isLine(this, line)) { + return null; + } + n = line; + line = getLine(this, line); + if (!line) { + return null; + } + } else { + n = lineNo(line); + if (n == null) { + return null; + } + } + return { + line: n, + handle: line, + text: line.text, + gutterMarkers: line.gutterMarkers, + textClass: line.textClass, + bgClass: line.bgClass, + wrapClass: line.wrapClass, + widgets: line.widgets + }; + }, + addLineClass: docMethodOp(function (handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + if (!line[prop]) { + line[prop] = cls; + } else if (classTest(cls).test(line[prop])) { + return false; + } else { + line[prop] += " " + cls; + } + return true; + }); + }), + removeLineClass: docMethodOp(function (handle, where, cls) { + return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { + var prop = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; + var cur = line[prop]; + if (!cur) { + return false; + } else if (cls == null) { + line[prop] = null; + } else { + var found = cur.match(classTest(cls)); + if (!found) { + return false; + } + var end = found.index + found[0].length; + line[prop] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; + } + return true; + }); + }), + addLineWidget: docMethodOp(function (handle, node, options) { + return addLineWidget(this, handle, node, options); + }), + removeLineWidget: function (widget) { + widget.clear(); + }, + markText: function (from, to, options) { + return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range"); + }, + setBookmark: function (pos, options) { + var realOpts = { + replacedWith: options && (options.nodeType == null ? options.widget : options), + insertLeft: options && options.insertLeft, + clearWhenEmpty: false, + shared: options && options.shared, + handleMouseEvents: options && options.handleMouseEvents + }; + pos = clipPos(this, pos); + return markText(this, pos, pos, realOpts, "bookmark"); + }, + findMarksAt: function (pos) { + pos = clipPos(this, pos); + var markers = [], + spans = getLine(this, pos.line).markedSpans; + if (spans) { + for (var i = 0; i < spans.length; ++i) { + var span = spans[i]; + if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) { + markers.push(span.marker.parent || span.marker); + } + } + } + return markers; + }, + findMarks: function (from, to, filter) { + from = clipPos(this, from); + to = clipPos(this, to); + var found = [], + lineNo = from.line; + this.iter(from.line, to.line + 1, function (line) { + var spans = line.markedSpans; + if (spans) { + for (var i = 0; i < spans.length; i++) { + var span = spans[i]; + if (!(span.to != null && lineNo == from.line && from.ch >= span.to || span.from == null && lineNo != from.line || span.from != null && lineNo == to.line && span.from >= to.ch) && (!filter || filter(span.marker))) { + found.push(span.marker.parent || span.marker); + } + } + } + ++lineNo; + }); + return found; + }, + getAllMarks: function () { + var markers = []; + this.iter(function (line) { + var sps = line.markedSpans; + if (sps) { + for (var i = 0; i < sps.length; ++i) { + if (sps[i].from != null) { + markers.push(sps[i].marker); + } + } + } + }); + return markers; + }, + posFromIndex: function (off) { + var ch, + lineNo = this.first, + sepSize = this.lineSeparator().length; + this.iter(function (line) { + var sz = line.text.length + sepSize; + if (sz > off) { + ch = off; + return true; + } + off -= sz; + ++lineNo; + }); + return clipPos(this, Pos(lineNo, ch)); + }, + indexFromPos: function (coords) { + coords = clipPos(this, coords); + var index = coords.ch; + if (coords.line < this.first || coords.ch < 0) { + return 0; + } + var sepSize = this.lineSeparator().length; + this.iter(this.first, coords.line, function (line) { + // iter aborts when callback returns a truthy value + index += line.text.length + sepSize; + }); + return index; + }, + copy: function (copyHistory) { + var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep, this.direction); + doc.scrollTop = this.scrollTop; + doc.scrollLeft = this.scrollLeft; + doc.sel = this.sel; + doc.extend = false; + if (copyHistory) { + doc.history.undoDepth = this.history.undoDepth; + doc.setHistory(this.getHistory()); + } + return doc; + }, + linkedDoc: function (options) { + if (!options) { + options = {}; + } + var from = this.first, + to = this.first + this.size; + if (options.from != null && options.from > from) { + from = options.from; + } + if (options.to != null && options.to < to) { + to = options.to; + } + var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); + if (options.sharedHist) { + copy.history = this.history; + } + (this.linked || (this.linked = [])).push({ + doc: copy, + sharedHist: options.sharedHist + }); + copy.linked = [{ + doc: this, + isParent: true, + sharedHist: options.sharedHist + }]; + copySharedMarkers(copy, findSharedMarkers(this)); + return copy; + }, + unlinkDoc: function (other) { + if (other instanceof CodeMirror) { + other = other.doc; + } + if (this.linked) { + for (var i = 0; i < this.linked.length; ++i) { + var link = this.linked[i]; + if (link.doc != other) { + continue; + } + this.linked.splice(i, 1); + other.unlinkDoc(this); + detachSharedMarkers(findSharedMarkers(this)); + break; + } + } + // If the histories were shared, split them again + if (other.history == this.history) { + var splitIds = [other.id]; + linkedDocs(other, function (doc) { + return splitIds.push(doc.id); + }, true); + other.history = new History(null); + other.history.done = copyHistoryArray(this.history.done, splitIds); + other.history.undone = copyHistoryArray(this.history.undone, splitIds); + } + }, + iterLinkedDocs: function (f) { + linkedDocs(this, f); + }, + getMode: function () { + return this.mode; + }, + getEditor: function () { + return this.cm; + }, + splitLines: function (str) { + if (this.lineSep) { + return str.split(this.lineSep); + } + return splitLinesAuto(str); + }, + lineSeparator: function () { + return this.lineSep || "\n"; + }, + setDirection: docMethodOp(function (dir) { + if (dir != "rtl") { + dir = "ltr"; + } + if (dir == this.direction) { + return; + } + this.direction = dir; + this.iter(function (line) { + return line.order = null; + }); + if (this.cm) { + directionChanged(this.cm); + } + }) + }); + + // Public alias. + Doc.prototype.eachLine = Doc.prototype.iter; + + // Kludge to work around strange IE behavior where it'll sometimes + // re-fire a series of drag-related events right after the drop (#1551) + var lastDrop = 0; + function onDrop(e) { + var cm = this; + clearDragCursor(cm); + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + if (ie) { + lastDrop = +new Date(); + } + var pos = posFromMouse(cm, e, true), + files = e.dataTransfer.files; + if (!pos || cm.isReadOnly()) { + return; + } + // Might be a file drop, in which case we simply extract the text + // and insert it. + if (files && files.length && window.FileReader && window.File) { + var n = files.length, + text = Array(n), + read = 0; + var markAsReadAndPasteIfAllFilesAreRead = function () { + if (++read == n) { + operation(cm, function () { + pos = clipPos(cm.doc, pos); + var change = { + from: pos, + to: pos, + text: cm.doc.splitLines(text.filter(function (t) { + return t != null; + }).join(cm.doc.lineSeparator())), + origin: "paste" + }; + makeChange(cm.doc, change); + setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); + })(); + } + }; + var readTextFromFile = function (file, i) { + if (cm.options.allowDropFileTypes && indexOf(cm.options.allowDropFileTypes, file.type) == -1) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + var reader = new FileReader(); + reader.onerror = function () { + return markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.onload = function () { + var content = reader.result; + if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { + markAsReadAndPasteIfAllFilesAreRead(); + return; + } + text[i] = content; + markAsReadAndPasteIfAllFilesAreRead(); + }; + reader.readAsText(file); + }; + for (var i = 0; i < files.length; i++) { + readTextFromFile(files[i], i); + } + } else { + // Normal drop + // Don't do a replace if the drop happened inside of the selected text. + if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { + cm.state.draggingText(e); + // Ensure the editor is re-focused + setTimeout(function () { + return cm.display.input.focus(); + }, 20); + return; + } + try { + var text$1 = e.dataTransfer.getData("Text"); + if (text$1) { + var selected; + if (cm.state.draggingText && !cm.state.draggingText.copy) { + selected = cm.listSelections(); + } + setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); + if (selected) { + for (var i$1 = 0; i$1 < selected.length; ++i$1) { + replaceRange(cm.doc, "", selected[i$1].anchor, selected[i$1].head, "drag"); + } + } + cm.replaceSelection(text$1, "around", "paste"); + cm.display.input.focus(); + } + } catch (e$1) {} + } + } + function onDragStart(cm, e) { + if (ie && (!cm.state.draggingText || +new Date() - lastDrop < 100)) { + e_stop(e); + return; + } + if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e.dataTransfer.setData("Text", cm.getSelection()); + e.dataTransfer.effectAllowed = "copyMove"; + + // Use dummy image instead of default browsers image. + // Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there. + if (e.dataTransfer.setDragImage && !safari) { + var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); + img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; + if (presto) { + img.width = img.height = 1; + cm.display.wrapper.appendChild(img); + // Force a relayout, or Opera won't use our image for some obscure reason + img._top = img.offsetTop; + } + e.dataTransfer.setDragImage(img, 0, 0); + if (presto) { + img.parentNode.removeChild(img); + } + } + } + function onDragOver(cm, e) { + var pos = posFromMouse(cm, e); + if (!pos) { + return; + } + var frag = document.createDocumentFragment(); + drawSelectionCursor(cm, pos, frag); + if (!cm.display.dragCursor) { + cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); + cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); + } + removeChildrenAndAdd(cm.display.dragCursor, frag); + } + function clearDragCursor(cm) { + if (cm.display.dragCursor) { + cm.display.lineSpace.removeChild(cm.display.dragCursor); + cm.display.dragCursor = null; + } + } + + // These must be handled carefully, because naively registering a + // handler for each editor will cause the editors to never be + // garbage collected. + + function forEachCodeMirror(f) { + if (!document.getElementsByClassName) { + return; + } + var byClass = document.getElementsByClassName("CodeMirror"), + editors = []; + for (var i = 0; i < byClass.length; i++) { + var cm = byClass[i].CodeMirror; + if (cm) { + editors.push(cm); + } + } + if (editors.length) { + editors[0].operation(function () { + for (var i = 0; i < editors.length; i++) { + f(editors[i]); + } + }); + } + } + var globalsRegistered = false; + function ensureGlobalHandlers() { + if (globalsRegistered) { + return; + } + registerGlobalHandlers(); + globalsRegistered = true; + } + function registerGlobalHandlers() { + // When the window resizes, we need to refresh active editors. + var resizeTimer; + on(window, "resize", function () { + if (resizeTimer == null) { + resizeTimer = setTimeout(function () { + resizeTimer = null; + forEachCodeMirror(onResize); + }, 100); + } + }); + // When the window loses focus, we want to show the editor as blurred + on(window, "blur", function () { + return forEachCodeMirror(onBlur); + }); + } + // Called when the window resizes + function onResize(cm) { + var d = cm.display; + // Might be a text scaling operation, clear size caches. + d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; + d.scrollbarsClipped = false; + cm.setSize(); + } + var keyNames = { + 3: "Pause", + 8: "Backspace", + 9: "Tab", + 13: "Enter", + 16: "Shift", + 17: "Ctrl", + 18: "Alt", + 19: "Pause", + 20: "CapsLock", + 27: "Esc", + 32: "Space", + 33: "PageUp", + 34: "PageDown", + 35: "End", + 36: "Home", + 37: "Left", + 38: "Up", + 39: "Right", + 40: "Down", + 44: "PrintScrn", + 45: "Insert", + 46: "Delete", + 59: ";", + 61: "=", + 91: "Mod", + 92: "Mod", + 93: "Mod", + 106: "*", + 107: "=", + 109: "-", + 110: ".", + 111: "/", + 145: "ScrollLock", + 173: "-", + 186: ";", + 187: "=", + 188: ",", + 189: "-", + 190: ".", + 191: "/", + 192: "`", + 219: "[", + 220: "\\", + 221: "]", + 222: "'", + 224: "Mod", + 63232: "Up", + 63233: "Down", + 63234: "Left", + 63235: "Right", + 63272: "Delete", + 63273: "Home", + 63275: "End", + 63276: "PageUp", + 63277: "PageDown", + 63302: "Insert" + }; + + // Number keys + for (var i = 0; i < 10; i++) { + keyNames[i + 48] = keyNames[i + 96] = String(i); + } + // Alphabetic keys + for (var i$1 = 65; i$1 <= 90; i$1++) { + keyNames[i$1] = String.fromCharCode(i$1); + } + // Function keys + for (var i$2 = 1; i$2 <= 12; i$2++) { + keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; + } + var keyMap = {}; + keyMap.basic = { + "Left": "goCharLeft", + "Right": "goCharRight", + "Up": "goLineUp", + "Down": "goLineDown", + "End": "goLineEnd", + "Home": "goLineStartSmart", + "PageUp": "goPageUp", + "PageDown": "goPageDown", + "Delete": "delCharAfter", + "Backspace": "delCharBefore", + "Shift-Backspace": "delCharBefore", + "Tab": "defaultTab", + "Shift-Tab": "indentAuto", + "Enter": "newlineAndIndent", + "Insert": "toggleOverwrite", + "Esc": "singleSelection" + }; + // Note that the save and find-related commands aren't defined by + // default. User code or addons can define them. Unknown commands + // are simply ignored. + keyMap.pcDefault = { + "Ctrl-A": "selectAll", + "Ctrl-D": "deleteLine", + "Ctrl-Z": "undo", + "Shift-Ctrl-Z": "redo", + "Ctrl-Y": "redo", + "Ctrl-Home": "goDocStart", + "Ctrl-End": "goDocEnd", + "Ctrl-Up": "goLineUp", + "Ctrl-Down": "goLineDown", + "Ctrl-Left": "goGroupLeft", + "Ctrl-Right": "goGroupRight", + "Alt-Left": "goLineStart", + "Alt-Right": "goLineEnd", + "Ctrl-Backspace": "delGroupBefore", + "Ctrl-Delete": "delGroupAfter", + "Ctrl-S": "save", + "Ctrl-F": "find", + "Ctrl-G": "findNext", + "Shift-Ctrl-G": "findPrev", + "Shift-Ctrl-F": "replace", + "Shift-Ctrl-R": "replaceAll", + "Ctrl-[": "indentLess", + "Ctrl-]": "indentMore", + "Ctrl-U": "undoSelection", + "Shift-Ctrl-U": "redoSelection", + "Alt-U": "redoSelection", + "fallthrough": "basic" + }; + // Very basic readline/emacs-style bindings, which are standard on Mac. + keyMap.emacsy = { + "Ctrl-F": "goCharRight", + "Ctrl-B": "goCharLeft", + "Ctrl-P": "goLineUp", + "Ctrl-N": "goLineDown", + "Ctrl-A": "goLineStart", + "Ctrl-E": "goLineEnd", + "Ctrl-V": "goPageDown", + "Shift-Ctrl-V": "goPageUp", + "Ctrl-D": "delCharAfter", + "Ctrl-H": "delCharBefore", + "Alt-Backspace": "delWordBefore", + "Ctrl-K": "killLine", + "Ctrl-T": "transposeChars", + "Ctrl-O": "openLine" + }; + keyMap.macDefault = { + "Cmd-A": "selectAll", + "Cmd-D": "deleteLine", + "Cmd-Z": "undo", + "Shift-Cmd-Z": "redo", + "Cmd-Y": "redo", + "Cmd-Home": "goDocStart", + "Cmd-Up": "goDocStart", + "Cmd-End": "goDocEnd", + "Cmd-Down": "goDocEnd", + "Alt-Left": "goGroupLeft", + "Alt-Right": "goGroupRight", + "Cmd-Left": "goLineLeft", + "Cmd-Right": "goLineRight", + "Alt-Backspace": "delGroupBefore", + "Ctrl-Alt-Backspace": "delGroupAfter", + "Alt-Delete": "delGroupAfter", + "Cmd-S": "save", + "Cmd-F": "find", + "Cmd-G": "findNext", + "Shift-Cmd-G": "findPrev", + "Cmd-Alt-F": "replace", + "Shift-Cmd-Alt-F": "replaceAll", + "Cmd-[": "indentLess", + "Cmd-]": "indentMore", + "Cmd-Backspace": "delWrappedLineLeft", + "Cmd-Delete": "delWrappedLineRight", + "Cmd-U": "undoSelection", + "Shift-Cmd-U": "redoSelection", + "Ctrl-Up": "goDocStart", + "Ctrl-Down": "goDocEnd", + "fallthrough": ["basic", "emacsy"] + }; + keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; + + // KEYMAP DISPATCH + + function normalizeKeyName(name) { + var parts = name.split(/-(?!$)/); + name = parts[parts.length - 1]; + var alt, ctrl, shift, cmd; + for (var i = 0; i < parts.length - 1; i++) { + var mod = parts[i]; + if (/^(cmd|meta|m)$/i.test(mod)) { + cmd = true; + } else if (/^a(lt)?$/i.test(mod)) { + alt = true; + } else if (/^(c|ctrl|control)$/i.test(mod)) { + ctrl = true; + } else if (/^s(hift)?$/i.test(mod)) { + shift = true; + } else { + throw new Error("Unrecognized modifier name: " + mod); + } + } + if (alt) { + name = "Alt-" + name; + } + if (ctrl) { + name = "Ctrl-" + name; + } + if (cmd) { + name = "Cmd-" + name; + } + if (shift) { + name = "Shift-" + name; + } + return name; + } + + // This is a kludge to keep keymaps mostly working as raw objects + // (backwards compatibility) while at the same time support features + // like normalization and multi-stroke key bindings. It compiles a + // new normalized keymap, and then updates the old object to reflect + // this. + function normalizeKeyMap(keymap) { + var copy = {}; + for (var keyname in keymap) { + if (keymap.hasOwnProperty(keyname)) { + var value = keymap[keyname]; + if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { + continue; + } + if (value == "...") { + delete keymap[keyname]; + continue; + } + var keys = map(keyname.split(" "), normalizeKeyName); + for (var i = 0; i < keys.length; i++) { + var val = void 0, + name = void 0; + if (i == keys.length - 1) { + name = keys.join(" "); + val = value; + } else { + name = keys.slice(0, i + 1).join(" "); + val = "..."; + } + var prev = copy[name]; + if (!prev) { + copy[name] = val; + } else if (prev != val) { + throw new Error("Inconsistent bindings for " + name); + } + } + delete keymap[keyname]; + } + } + for (var prop in copy) { + keymap[prop] = copy[prop]; + } + return keymap; + } + function lookupKey(key, map, handle, context) { + map = getKeyMap(map); + var found = map.call ? map.call(key, context) : map[key]; + if (found === false) { + return "nothing"; + } + if (found === "...") { + return "multi"; + } + if (found != null && handle(found)) { + return "handled"; + } + if (map.fallthrough) { + if (Object.prototype.toString.call(map.fallthrough) != "[object Array]") { + return lookupKey(key, map.fallthrough, handle, context); + } + for (var i = 0; i < map.fallthrough.length; i++) { + var result = lookupKey(key, map.fallthrough[i], handle, context); + if (result) { + return result; + } + } + } + } + + // Modifier key presses don't count as 'real' key presses for the + // purpose of keymap fallthrough. + function isModifierKey(value) { + var name = typeof value == "string" ? value : keyNames[value.keyCode]; + return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; + } + function addModifierNames(name, event, noShift) { + var base = name; + if (event.altKey && base != "Alt") { + name = "Alt-" + name; + } + if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { + name = "Ctrl-" + name; + } + if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { + name = "Cmd-" + name; + } + if (!noShift && event.shiftKey && base != "Shift") { + name = "Shift-" + name; + } + return name; + } + + // Look up the name of a key as indicated by an event object. + function keyName(event, noShift) { + if (presto && event.keyCode == 34 && event["char"]) { + return false; + } + var name = keyNames[event.keyCode]; + if (name == null || event.altGraphKey) { + return false; + } + // Ctrl-ScrollLock has keyCode 3, same as Ctrl-Pause, + // so we'll use event.code when available (Chrome 48+, FF 38+, Safari 10.1+) + if (event.keyCode == 3 && event.code) { + name = event.code; + } + return addModifierNames(name, event, noShift); + } + function getKeyMap(val) { + return typeof val == "string" ? keyMap[val] : val; + } + + // Helper for deleting text near the selection(s), used to implement + // backspace, delete, and similar functionality. + function deleteNearSelection(cm, compute) { + var ranges = cm.doc.sel.ranges, + kill = []; + // Build up a set of ranges to kill first, merging overlapping + // ranges. + for (var i = 0; i < ranges.length; i++) { + var toKill = compute(ranges[i]); + while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { + var replaced = kill.pop(); + if (cmp(replaced.from, toKill.from) < 0) { + toKill.from = replaced.from; + break; + } + } + kill.push(toKill); + } + // Next, remove those actual ranges. + runInOp(cm, function () { + for (var i = kill.length - 1; i >= 0; i--) { + replaceRange(cm.doc, "", kill[i].from, kill[i].to, "+delete"); + } + ensureCursorVisible(cm); + }); + } + function moveCharLogically(line, ch, dir) { + var target = skipExtendingChars(line.text, ch + dir, dir); + return target < 0 || target > line.text.length ? null : target; + } + function moveLogically(line, start, dir) { + var ch = moveCharLogically(line, start.ch, dir); + return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before"); + } + function endOfLine(visually, cm, lineObj, lineNo, dir) { + if (visually) { + if (cm.doc.direction == "rtl") { + dir = -dir; + } + var order = getOrder(lineObj, cm.doc.direction); + if (order) { + var part = dir < 0 ? lst(order) : order[0]; + var moveInStorageOrder = dir < 0 == (part.level == 1); + var sticky = moveInStorageOrder ? "after" : "before"; + var ch; + // With a wrapped rtl chunk (possibly spanning multiple bidi parts), + // it could be that the last bidi part is not on the last visual line, + // since visual lines contain content order-consecutive chunks. + // Thus, in rtl, we are looking for the first (content-order) character + // in the rtl chunk that is on the last line (that is, the same line + // as the last (content-order) character). + if (part.level > 0 || cm.doc.direction == "rtl") { + var prep = prepareMeasureForLine(cm, lineObj); + ch = dir < 0 ? lineObj.text.length - 1 : 0; + var targetTop = measureCharPrepared(cm, prep, ch).top; + ch = findFirst(function (ch) { + return measureCharPrepared(cm, prep, ch).top == targetTop; + }, dir < 0 == (part.level == 1) ? part.from : part.to - 1, ch); + if (sticky == "before") { + ch = moveCharLogically(lineObj, ch, 1); + } + } else { + ch = dir < 0 ? part.to : part.from; + } + return new Pos(lineNo, ch, sticky); + } + } + return new Pos(lineNo, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after"); + } + function moveVisually(cm, line, start, dir) { + var bidi = getOrder(line, cm.doc.direction); + if (!bidi) { + return moveLogically(line, start, dir); + } + if (start.ch >= line.text.length) { + start.ch = line.text.length; + start.sticky = "before"; + } else if (start.ch <= 0) { + start.ch = 0; + start.sticky = "after"; + } + var partPos = getBidiPartAt(bidi, start.ch, start.sticky), + part = bidi[partPos]; + if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { + // Case 1: We move within an ltr part in an ltr editor. Even with wrapped lines, + // nothing interesting happens. + return moveLogically(line, start, dir); + } + var mv = function (pos, dir) { + return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir); + }; + var prep; + var getWrappedLineExtent = function (ch) { + if (!cm.options.lineWrapping) { + return { + begin: 0, + end: line.text.length + }; + } + prep = prep || prepareMeasureForLine(cm, line); + return wrappedLineExtentChar(cm, line, prep, ch); + }; + var wrappedLineExtent = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); + if (cm.doc.direction == "rtl" || part.level == 1) { + var moveInStorageOrder = part.level == 1 == dir < 0; + var ch = mv(start, moveInStorageOrder ? 1 : -1); + if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent.begin : ch <= part.to && ch <= wrappedLineExtent.end)) { + // Case 2: We move within an rtl part or in an rtl editor on the same visual line + var sticky = moveInStorageOrder ? "before" : "after"; + return new Pos(start.line, ch, sticky); + } + } + + // Case 3: Could not move within this bidi part in this visual line, so leave + // the current bidi part + + var searchInVisualLine = function (partPos, dir, wrappedLineExtent) { + var getRes = function (ch, moveInStorageOrder) { + return moveInStorageOrder ? new Pos(start.line, mv(ch, 1), "before") : new Pos(start.line, ch, "after"); + }; + for (; partPos >= 0 && partPos < bidi.length; partPos += dir) { + var part = bidi[partPos]; + var moveInStorageOrder = dir > 0 == (part.level != 1); + var ch = moveInStorageOrder ? wrappedLineExtent.begin : mv(wrappedLineExtent.end, -1); + if (part.from <= ch && ch < part.to) { + return getRes(ch, moveInStorageOrder); + } + ch = moveInStorageOrder ? part.from : mv(part.to, -1); + if (wrappedLineExtent.begin <= ch && ch < wrappedLineExtent.end) { + return getRes(ch, moveInStorageOrder); + } + } + }; + + // Case 3a: Look for other bidi parts on the same visual line + var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent); + if (res) { + return res; + } + + // Case 3b: Look for other bidi parts on the next visual line + var nextCh = dir > 0 ? wrappedLineExtent.end : mv(wrappedLineExtent.begin, -1); + if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { + res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); + if (res) { + return res; + } + } + + // Case 4: Nowhere to move + return null; + } + + // Commands are parameter-less actions that can be performed on an + // editor, mostly used for keybindings. + var commands = { + selectAll: selectAll, + singleSelection: function (cm) { + return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); + }, + killLine: function (cm) { + return deleteNearSelection(cm, function (range) { + if (range.empty()) { + var len = getLine(cm.doc, range.head.line).text.length; + if (range.head.ch == len && range.head.line < cm.lastLine()) { + return { + from: range.head, + to: Pos(range.head.line + 1, 0) + }; + } else { + return { + from: range.head, + to: Pos(range.head.line, len) + }; + } + } else { + return { + from: range.from(), + to: range.to() + }; + } + }); + }, + deleteLine: function (cm) { + return deleteNearSelection(cm, function (range) { + return { + from: Pos(range.from().line, 0), + to: clipPos(cm.doc, Pos(range.to().line + 1, 0)) + }; + }); + }, + delLineLeft: function (cm) { + return deleteNearSelection(cm, function (range) { + return { + from: Pos(range.from().line, 0), + to: range.from() + }; + }); + }, + delWrappedLineLeft: function (cm) { + return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var leftPos = cm.coordsChar({ + left: 0, + top: top + }, "div"); + return { + from: leftPos, + to: range.from() + }; + }); + }, + delWrappedLineRight: function (cm) { + return deleteNearSelection(cm, function (range) { + var top = cm.charCoords(range.head, "div").top + 5; + var rightPos = cm.coordsChar({ + left: cm.display.lineDiv.offsetWidth + 100, + top: top + }, "div"); + return { + from: range.from(), + to: rightPos + }; + }); + }, + undo: function (cm) { + return cm.undo(); + }, + redo: function (cm) { + return cm.redo(); + }, + undoSelection: function (cm) { + return cm.undoSelection(); + }, + redoSelection: function (cm) { + return cm.redoSelection(); + }, + goDocStart: function (cm) { + return cm.extendSelection(Pos(cm.firstLine(), 0)); + }, + goDocEnd: function (cm) { + return cm.extendSelection(Pos(cm.lastLine())); + }, + goLineStart: function (cm) { + return cm.extendSelectionsBy(function (range) { + return lineStart(cm, range.head.line); + }, { + origin: "+move", + bias: 1 + }); + }, + goLineStartSmart: function (cm) { + return cm.extendSelectionsBy(function (range) { + return lineStartSmart(cm, range.head); + }, { + origin: "+move", + bias: 1 + }); + }, + goLineEnd: function (cm) { + return cm.extendSelectionsBy(function (range) { + return lineEnd(cm, range.head.line); + }, { + origin: "+move", + bias: -1 + }); + }, + goLineRight: function (cm) { + return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({ + left: cm.display.lineDiv.offsetWidth + 100, + top: top + }, "div"); + }, sel_move); + }, + goLineLeft: function (cm) { + return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + return cm.coordsChar({ + left: 0, + top: top + }, "div"); + }, sel_move); + }, + goLineLeftSmart: function (cm) { + return cm.extendSelectionsBy(function (range) { + var top = cm.cursorCoords(range.head, "div").top + 5; + var pos = cm.coordsChar({ + left: 0, + top: top + }, "div"); + if (pos.ch < cm.getLine(pos.line).search(/\S/)) { + return lineStartSmart(cm, range.head); + } + return pos; + }, sel_move); + }, + goLineUp: function (cm) { + return cm.moveV(-1, "line"); + }, + goLineDown: function (cm) { + return cm.moveV(1, "line"); + }, + goPageUp: function (cm) { + return cm.moveV(-1, "page"); + }, + goPageDown: function (cm) { + return cm.moveV(1, "page"); + }, + goCharLeft: function (cm) { + return cm.moveH(-1, "char"); + }, + goCharRight: function (cm) { + return cm.moveH(1, "char"); + }, + goColumnLeft: function (cm) { + return cm.moveH(-1, "column"); + }, + goColumnRight: function (cm) { + return cm.moveH(1, "column"); + }, + goWordLeft: function (cm) { + return cm.moveH(-1, "word"); + }, + goGroupRight: function (cm) { + return cm.moveH(1, "group"); + }, + goGroupLeft: function (cm) { + return cm.moveH(-1, "group"); + }, + goWordRight: function (cm) { + return cm.moveH(1, "word"); + }, + delCharBefore: function (cm) { + return cm.deleteH(-1, "codepoint"); + }, + delCharAfter: function (cm) { + return cm.deleteH(1, "char"); + }, + delWordBefore: function (cm) { + return cm.deleteH(-1, "word"); + }, + delWordAfter: function (cm) { + return cm.deleteH(1, "word"); + }, + delGroupBefore: function (cm) { + return cm.deleteH(-1, "group"); + }, + delGroupAfter: function (cm) { + return cm.deleteH(1, "group"); + }, + indentAuto: function (cm) { + return cm.indentSelection("smart"); + }, + indentMore: function (cm) { + return cm.indentSelection("add"); + }, + indentLess: function (cm) { + return cm.indentSelection("subtract"); + }, + insertTab: function (cm) { + return cm.replaceSelection("\t"); + }, + insertSoftTab: function (cm) { + var spaces = [], + ranges = cm.listSelections(), + tabSize = cm.options.tabSize; + for (var i = 0; i < ranges.length; i++) { + var pos = ranges[i].from(); + var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); + spaces.push(spaceStr(tabSize - col % tabSize)); + } + cm.replaceSelections(spaces); + }, + defaultTab: function (cm) { + if (cm.somethingSelected()) { + cm.indentSelection("add"); + } else { + cm.execCommand("insertTab"); + } + }, + // Swap the two chars left and right of each selection's head. + // Move cursor behind the two swapped characters afterwards. + // + // Doesn't consider line feeds a character. + // Doesn't scan more than one line above to find a character. + // Doesn't do anything on an empty line. + // Doesn't do anything with non-empty selections. + transposeChars: function (cm) { + return runInOp(cm, function () { + var ranges = cm.listSelections(), + newSel = []; + for (var i = 0; i < ranges.length; i++) { + if (!ranges[i].empty()) { + continue; + } + var cur = ranges[i].head, + line = getLine(cm.doc, cur.line).text; + if (line) { + if (cur.ch == line.length) { + cur = new Pos(cur.line, cur.ch - 1); + } + if (cur.ch > 0) { + cur = new Pos(cur.line, cur.ch + 1); + cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), Pos(cur.line, cur.ch - 2), cur, "+transpose"); + } else if (cur.line > cm.doc.first) { + var prev = getLine(cm.doc, cur.line - 1).text; + if (prev) { + cur = new Pos(cur.line, 1); + cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + prev.charAt(prev.length - 1), Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); + } + } + } + newSel.push(new Range(cur, cur)); + } + cm.setSelections(newSel); + }); + }, + newlineAndIndent: function (cm) { + return runInOp(cm, function () { + var sels = cm.listSelections(); + for (var i = sels.length - 1; i >= 0; i--) { + cm.replaceRange(cm.doc.lineSeparator(), sels[i].anchor, sels[i].head, "+input"); + } + sels = cm.listSelections(); + for (var i$1 = 0; i$1 < sels.length; i$1++) { + cm.indentLine(sels[i$1].from().line, null, true); + } + ensureCursorVisible(cm); + }); + }, + openLine: function (cm) { + return cm.replaceSelection("\n", "start"); + }, + toggleOverwrite: function (cm) { + return cm.toggleOverwrite(); + } + }; + function lineStart(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLine(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, visual, lineN, 1); + } + function lineEnd(cm, lineN) { + var line = getLine(cm.doc, lineN); + var visual = visualLineEnd(line); + if (visual != line) { + lineN = lineNo(visual); + } + return endOfLine(true, cm, line, lineN, -1); + } + function lineStartSmart(cm, pos) { + var start = lineStart(cm, pos.line); + var line = getLine(cm.doc, start.line); + var order = getOrder(line, cm.doc.direction); + if (!order || order[0].level == 0) { + var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); + var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; + return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky); + } + return start; + } + + // Run a handler that was bound to a key. + function doHandleBinding(cm, bound, dropShift) { + if (typeof bound == "string") { + bound = commands[bound]; + if (!bound) { + return false; + } + } + // Ensure previous input has been read, so that the handler sees a + // consistent view of the document + cm.display.input.ensurePolled(); + var prevShift = cm.display.shift, + done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + if (dropShift) { + cm.display.shift = false; + } + done = bound(cm) != Pass; + } finally { + cm.display.shift = prevShift; + cm.state.suppressEdits = false; + } + return done; + } + function lookupKeyForEditor(cm, name, handle) { + for (var i = 0; i < cm.state.keyMaps.length; i++) { + var result = lookupKey(name, cm.state.keyMaps[i], handle, cm); + if (result) { + return result; + } + } + return cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm) || lookupKey(name, cm.options.keyMap, handle, cm); + } + + // Note that, despite the name, this function is also used to check + // for bound mouse clicks. + + var stopSeq = new Delayed(); + function dispatchKey(cm, name, e, handle) { + var seq = cm.state.keySeq; + if (seq) { + if (isModifierKey(name)) { + return "handled"; + } + if (/\'$/.test(name)) { + cm.state.keySeq = null; + } else { + stopSeq.set(50, function () { + if (cm.state.keySeq == seq) { + cm.state.keySeq = null; + cm.display.input.reset(); + } + }); + } + if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { + return true; + } + } + return dispatchKeyInner(cm, name, e, handle); + } + function dispatchKeyInner(cm, name, e, handle) { + var result = lookupKeyForEditor(cm, name, handle); + if (result == "multi") { + cm.state.keySeq = name; + } + if (result == "handled") { + signalLater(cm, "keyHandled", cm, name, e); + } + if (result == "handled" || result == "multi") { + e_preventDefault(e); + restartBlink(cm); + } + return !!result; + } + + // Handle a key from the keydown event. + function handleKeyBinding(cm, e) { + var name = keyName(e, true); + if (!name) { + return false; + } + if (e.shiftKey && !cm.state.keySeq) { + // First try to resolve full name (including 'Shift-'). Failing + // that, see if there is a cursor-motion command (starting with + // 'go') bound to the keyname without 'Shift-'. + return dispatchKey(cm, "Shift-" + name, e, function (b) { + return doHandleBinding(cm, b, true); + }) || dispatchKey(cm, name, e, function (b) { + if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) { + return doHandleBinding(cm, b); + } + }); + } else { + return dispatchKey(cm, name, e, function (b) { + return doHandleBinding(cm, b); + }); + } + } + + // Handle a key from the keypress event + function handleCharBinding(cm, e, ch) { + return dispatchKey(cm, "'" + ch + "'", e, function (b) { + return doHandleBinding(cm, b, true); + }); + } + var lastStoppedKey = null; + function onKeyDown(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + cm.curOp.focus = activeElt(); + if (signalDOMEvent(cm, e)) { + return; + } + // IE does strange things with escape. + if (ie && ie_version < 11 && e.keyCode == 27) { + e.returnValue = false; + } + var code = e.keyCode; + cm.display.shift = code == 16 || e.shiftKey; + var handled = handleKeyBinding(cm, e); + if (presto) { + lastStoppedKey = handled ? code : null; + // Opera has no cut event... we try to at least catch the key combo + if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) { + cm.replaceSelection("", null, "cut"); + } + } + if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) { + document.execCommand("cut"); + } + + // Turn mouse into crosshair when Alt is held on Mac. + if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) { + showCrossHair(cm); + } + } + function showCrossHair(cm) { + var lineDiv = cm.display.lineDiv; + addClass(lineDiv, "CodeMirror-crosshair"); + function up(e) { + if (e.keyCode == 18 || !e.altKey) { + rmClass(lineDiv, "CodeMirror-crosshair"); + off(document, "keyup", up); + off(document, "mouseover", up); + } + } + on(document, "keyup", up); + on(document, "mouseover", up); + } + function onKeyUp(e) { + if (e.keyCode == 16) { + this.doc.sel.shift = false; + } + signalDOMEvent(this, e); + } + function onKeyPress(e) { + var cm = this; + if (e.target && e.target != cm.display.input.getField()) { + return; + } + if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { + return; + } + var keyCode = e.keyCode, + charCode = e.charCode; + if (presto && keyCode == lastStoppedKey) { + lastStoppedKey = null; + e_preventDefault(e); + return; + } + if (presto && (!e.which || e.which < 10) && handleKeyBinding(cm, e)) { + return; + } + var ch = String.fromCharCode(charCode == null ? keyCode : charCode); + // Some browsers fire keypress events for backspace + if (ch == "\x08") { + return; + } + if (handleCharBinding(cm, e, ch)) { + return; + } + cm.display.input.onKeyPress(e); + } + var DOUBLECLICK_DELAY = 400; + var PastClick = function (time, pos, button) { + this.time = time; + this.pos = pos; + this.button = button; + }; + PastClick.prototype.compare = function (time, pos, button) { + return this.time + DOUBLECLICK_DELAY > time && cmp(pos, this.pos) == 0 && button == this.button; + }; + var lastClick, lastDoubleClick; + function clickRepeat(pos, button) { + var now = +new Date(); + if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { + lastClick = lastDoubleClick = null; + return "triple"; + } else if (lastClick && lastClick.compare(now, pos, button)) { + lastDoubleClick = new PastClick(now, pos, button); + lastClick = null; + return "double"; + } else { + lastClick = new PastClick(now, pos, button); + lastDoubleClick = null; + return "single"; + } + } + + // A mouse down can be a single click, double click, triple click, + // start of selection drag, start of text drag, new cursor + // (ctrl-click), rectangle drag (alt-drag), or xwin + // middle-click-paste. Or it might be a click on something we should + // not interfere with, such as a scrollbar or widget. + function onMouseDown(e) { + var cm = this, + display = cm.display; + if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { + return; + } + display.input.ensurePolled(); + display.shift = e.shiftKey; + if (eventInWidget(display, e)) { + if (!webkit) { + // Briefly turn off draggability, to allow widgets to do + // normal dragging things. + display.scroller.draggable = false; + setTimeout(function () { + return display.scroller.draggable = true; + }, 100); + } + return; + } + if (clickInGutter(cm, e)) { + return; + } + var pos = posFromMouse(cm, e), + button = e_button(e), + repeat = pos ? clickRepeat(pos, button) : "single"; + window.focus(); + + // #3261: make sure, that we're not starting a second selection + if (button == 1 && cm.state.selectingText) { + cm.state.selectingText(e); + } + if (pos && handleMappedButton(cm, button, pos, repeat, e)) { + return; + } + if (button == 1) { + if (pos) { + leftButtonDown(cm, pos, repeat, e); + } else if (e_target(e) == display.scroller) { + e_preventDefault(e); + } + } else if (button == 2) { + if (pos) { + extendSelection(cm.doc, pos); + } + setTimeout(function () { + return display.input.focus(); + }, 20); + } else if (button == 3) { + if (captureRightClick) { + cm.display.input.onContextMenu(e); + } else { + delayBlurEvent(cm); + } + } + } + function handleMappedButton(cm, button, pos, repeat, event) { + var name = "Click"; + if (repeat == "double") { + name = "Double" + name; + } else if (repeat == "triple") { + name = "Triple" + name; + } + name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; + return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { + if (typeof bound == "string") { + bound = commands[bound]; + } + if (!bound) { + return false; + } + var done = false; + try { + if (cm.isReadOnly()) { + cm.state.suppressEdits = true; + } + done = bound(cm, pos) != Pass; + } finally { + cm.state.suppressEdits = false; + } + return done; + }); + } + function configureMouse(cm, repeat, event) { + var option = cm.getOption("configureMouse"); + var value = option ? option(cm, repeat, event) : {}; + if (value.unit == null) { + var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; + value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; + } + if (value.extend == null || cm.doc.extend) { + value.extend = cm.doc.extend || event.shiftKey; + } + if (value.addNew == null) { + value.addNew = mac ? event.metaKey : event.ctrlKey; + } + if (value.moveOnDrag == null) { + value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); + } + return value; + } + function leftButtonDown(cm, pos, repeat, event) { + if (ie) { + setTimeout(bind(ensureFocus, cm), 0); + } else { + cm.curOp.focus = activeElt(); + } + var behavior = configureMouse(cm, repeat, event); + var sel = cm.doc.sel, + contained; + if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && repeat == "single" && (contained = sel.contains(pos)) > -1 && (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) { + leftButtonStartDrag(cm, event, pos, behavior); + } else { + leftButtonSelect(cm, event, pos, behavior); + } + } + + // Start a text drag. When it ends, see if any dragging actually + // happen, and treat as a click if it didn't. + function leftButtonStartDrag(cm, event, pos, behavior) { + var display = cm.display, + moved = false; + var dragEnd = operation(cm, function (e) { + if (webkit) { + display.scroller.draggable = false; + } + cm.state.draggingText = false; + if (cm.state.delayingBlurEvent) { + if (cm.hasFocus()) { + cm.state.delayingBlurEvent = false; + } else { + delayBlurEvent(cm); + } + } + off(display.wrapper.ownerDocument, "mouseup", dragEnd); + off(display.wrapper.ownerDocument, "mousemove", mouseMove); + off(display.scroller, "dragstart", dragStart); + off(display.scroller, "drop", dragEnd); + if (!moved) { + e_preventDefault(e); + if (!behavior.addNew) { + extendSelection(cm.doc, pos, null, null, behavior.extend); + } + // Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081) + if (webkit && !safari || ie && ie_version == 9) { + setTimeout(function () { + display.wrapper.ownerDocument.body.focus({ + preventScroll: true + }); + display.input.focus(); + }, 20); + } else { + display.input.focus(); + } + } + }); + var mouseMove = function (e2) { + moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; + }; + var dragStart = function () { + return moved = true; + }; + // Let the drag handler handle this. + if (webkit) { + display.scroller.draggable = true; + } + cm.state.draggingText = dragEnd; + dragEnd.copy = !behavior.moveOnDrag; + on(display.wrapper.ownerDocument, "mouseup", dragEnd); + on(display.wrapper.ownerDocument, "mousemove", mouseMove); + on(display.scroller, "dragstart", dragStart); + on(display.scroller, "drop", dragEnd); + cm.state.delayingBlurEvent = true; + setTimeout(function () { + return display.input.focus(); + }, 20); + // IE's approach to draggable + if (display.scroller.dragDrop) { + display.scroller.dragDrop(); + } + } + function rangeForUnit(cm, pos, unit) { + if (unit == "char") { + return new Range(pos, pos); + } + if (unit == "word") { + return cm.findWordAt(pos); + } + if (unit == "line") { + return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + var result = unit(cm, pos); + return new Range(result.from, result.to); + } + + // Normal selection, as opposed to text dragging. + function leftButtonSelect(cm, event, start, behavior) { + if (ie) { + delayBlurEvent(cm); + } + var display = cm.display, + doc = cm.doc; + e_preventDefault(event); + var ourRange, + ourIndex, + startSel = doc.sel, + ranges = startSel.ranges; + if (behavior.addNew && !behavior.extend) { + ourIndex = doc.sel.contains(start); + if (ourIndex > -1) { + ourRange = ranges[ourIndex]; + } else { + ourRange = new Range(start, start); + } + } else { + ourRange = doc.sel.primary(); + ourIndex = doc.sel.primIndex; + } + if (behavior.unit == "rectangle") { + if (!behavior.addNew) { + ourRange = new Range(start, start); + } + start = posFromMouse(cm, event, true, true); + ourIndex = -1; + } else { + var range = rangeForUnit(cm, start, behavior.unit); + if (behavior.extend) { + ourRange = extendRange(ourRange, range.anchor, range.head, behavior.extend); + } else { + ourRange = range; + } + } + if (!behavior.addNew) { + ourIndex = 0; + setSelection(doc, new Selection([ourRange], 0), sel_mouse); + startSel = doc.sel; + } else if (ourIndex == -1) { + ourIndex = ranges.length; + setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), { + scroll: false, + origin: "*mouse" + }); + } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { + setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), { + scroll: false, + origin: "*mouse" + }); + startSel = doc.sel; + } else { + replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); + } + var lastPos = start; + function extendTo(pos) { + if (cmp(lastPos, pos) == 0) { + return; + } + lastPos = pos; + if (behavior.unit == "rectangle") { + var ranges = [], + tabSize = cm.options.tabSize; + var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); + var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); + var left = Math.min(startCol, posCol), + right = Math.max(startCol, posCol); + for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { + var text = getLine(doc, line).text, + leftPos = findColumn(text, left, tabSize); + if (left == right) { + ranges.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); + } else if (text.length > leftPos) { + ranges.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); + } + } + if (!ranges.length) { + ranges.push(new Range(start, start)); + } + setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges), ourIndex), { + origin: "*mouse", + scroll: false + }); + cm.scrollIntoView(pos); + } else { + var oldRange = ourRange; + var range = rangeForUnit(cm, pos, behavior.unit); + var anchor = oldRange.anchor, + head; + if (cmp(range.anchor, anchor) > 0) { + head = range.head; + anchor = minPos(oldRange.from(), range.anchor); + } else { + head = range.anchor; + anchor = maxPos(oldRange.to(), range.head); + } + var ranges$1 = startSel.ranges.slice(0); + ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); + setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); + } + } + var editorSize = display.wrapper.getBoundingClientRect(); + // Used to ensure timeout re-tries don't fire when another extend + // happened in the meantime (clearTimeout isn't reliable -- at + // least on Chrome, the timeouts still happen even when cleared, + // if the clear happens after their scheduled firing time). + var counter = 0; + function extend(e) { + var curCount = ++counter; + var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); + if (!cur) { + return; + } + if (cmp(cur, lastPos) != 0) { + cm.curOp.focus = activeElt(); + extendTo(cur); + var visible = visibleLines(display, doc); + if (cur.line >= visible.to || cur.line < visible.from) { + setTimeout(operation(cm, function () { + if (counter == curCount) { + extend(e); + } + }), 150); + } + } else { + var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; + if (outside) { + setTimeout(operation(cm, function () { + if (counter != curCount) { + return; + } + display.scroller.scrollTop += outside; + extend(e); + }), 50); + } + } + } + function done(e) { + cm.state.selectingText = false; + counter = Infinity; + // If e is null or undefined we interpret this as someone trying + // to explicitly cancel the selection rather than the user + // letting go of the mouse button. + if (e) { + e_preventDefault(e); + display.input.focus(); + } + off(display.wrapper.ownerDocument, "mousemove", move); + off(display.wrapper.ownerDocument, "mouseup", up); + doc.history.lastSelOrigin = null; + } + var move = operation(cm, function (e) { + if (e.buttons === 0 || !e_button(e)) { + done(e); + } else { + extend(e); + } + }); + var up = operation(cm, done); + cm.state.selectingText = up; + on(display.wrapper.ownerDocument, "mousemove", move); + on(display.wrapper.ownerDocument, "mouseup", up); + } + + // Used when mouse-selecting to adjust the anchor to the proper side + // of a bidi jump depending on the visual position of the head. + function bidiSimplify(cm, range) { + var anchor = range.anchor; + var head = range.head; + var anchorLine = getLine(cm.doc, anchor.line); + if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { + return range; + } + var order = getOrder(anchorLine); + if (!order) { + return range; + } + var index = getBidiPartAt(order, anchor.ch, anchor.sticky), + part = order[index]; + if (part.from != anchor.ch && part.to != anchor.ch) { + return range; + } + var boundary = index + (part.from == anchor.ch == (part.level != 1) ? 0 : 1); + if (boundary == 0 || boundary == order.length) { + return range; + } + + // Compute the relative visual position of the head compared to the + // anchor (<0 is to the left, >0 to the right) + var leftSide; + if (head.line != anchor.line) { + leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; + } else { + var headIndex = getBidiPartAt(order, head.ch, head.sticky); + var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); + if (headIndex == boundary - 1 || headIndex == boundary) { + leftSide = dir < 0; + } else { + leftSide = dir > 0; + } + } + var usePart = order[boundary + (leftSide ? -1 : 0)]; + var from = leftSide == (usePart.level == 1); + var ch = from ? usePart.from : usePart.to, + sticky = from ? "after" : "before"; + return anchor.ch == ch && anchor.sticky == sticky ? range : new Range(new Pos(anchor.line, ch, sticky), head); + } + + // Determines whether an event happened in the gutter, and fires the + // handlers for the corresponding event. + function gutterEvent(cm, e, type, prevent) { + var mX, mY; + if (e.touches) { + mX = e.touches[0].clientX; + mY = e.touches[0].clientY; + } else { + try { + mX = e.clientX; + mY = e.clientY; + } catch (e$1) { + return false; + } + } + if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { + return false; + } + if (prevent) { + e_preventDefault(e); + } + var display = cm.display; + var lineBox = display.lineDiv.getBoundingClientRect(); + if (mY > lineBox.bottom || !hasHandler(cm, type)) { + return e_defaultPrevented(e); + } + mY -= lineBox.top - display.viewOffset; + for (var i = 0; i < cm.display.gutterSpecs.length; ++i) { + var g = display.gutters.childNodes[i]; + if (g && g.getBoundingClientRect().right >= mX) { + var line = lineAtHeight(cm.doc, mY); + var gutter = cm.display.gutterSpecs[i]; + signal(cm, type, cm, line, gutter.className, e); + return e_defaultPrevented(e); + } + } + } + function clickInGutter(cm, e) { + return gutterEvent(cm, e, "gutterClick", true); + } + + // CONTEXT MENU HANDLING + + // To make the context menu work, we need to briefly unhide the + // textarea (making it as unobtrusive as possible) to let the + // right-click take effect on it. + function onContextMenu(cm, e) { + if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { + return; + } + if (signalDOMEvent(cm, e, "contextmenu")) { + return; + } + if (!captureRightClick) { + cm.display.input.onContextMenu(e); + } + } + function contextMenuInGutter(cm, e) { + if (!hasHandler(cm, "gutterContextMenu")) { + return false; + } + return gutterEvent(cm, e, "gutterContextMenu", false); + } + function themeChanged(cm) { + cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); + clearCaches(cm); + } + var Init = { + toString: function () { + return "CodeMirror.Init"; + } + }; + var defaults = {}; + var optionHandlers = {}; + function defineOptions(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + function option(name, deflt, handle, notOnInit) { + CodeMirror.defaults[name] = deflt; + if (handle) { + optionHandlers[name] = notOnInit ? function (cm, val, old) { + if (old != Init) { + handle(cm, val, old); + } + } : handle; + } + } + CodeMirror.defineOption = option; + + // Passed to option handlers when there is no old value. + CodeMirror.Init = Init; + + // These two are, on init, called from the constructor because they + // have to be initialized before the editor can start at all. + option("value", "", function (cm, val) { + return cm.setValue(val); + }, true); + option("mode", null, function (cm, val) { + cm.doc.modeOption = val; + loadMode(cm); + }, true); + option("indentUnit", 2, loadMode, true); + option("indentWithTabs", false); + option("smartIndent", true); + option("tabSize", 4, function (cm) { + resetModeState(cm); + clearCaches(cm); + regChange(cm); + }, true); + option("lineSeparator", null, function (cm, val) { + cm.doc.lineSep = val; + if (!val) { + return; + } + var newBreaks = [], + lineNo = cm.doc.first; + cm.doc.iter(function (line) { + for (var pos = 0;;) { + var found = line.text.indexOf(val, pos); + if (found == -1) { + break; + } + pos = found + val.length; + newBreaks.push(Pos(lineNo, found)); + } + lineNo++; + }); + for (var i = newBreaks.length - 1; i >= 0; i--) { + replaceRange(cm.doc, val, newBreaks[i], Pos(newBreaks[i].line, newBreaks[i].ch + val.length)); + } + }); + option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { + cm.state.specialChars = new RegExp(val.source + (val.test("\t") ? "" : "|\t"), "g"); + if (old != Init) { + cm.refresh(); + } + }); + option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { + return cm.refresh(); + }, true); + option("electricChars", true); + option("inputStyle", mobile ? "contenteditable" : "textarea", function () { + throw new Error("inputStyle can not (yet) be changed in a running editor"); // FIXME + }, true); + option("spellcheck", false, function (cm, val) { + return cm.getInputField().spellcheck = val; + }, true); + option("autocorrect", false, function (cm, val) { + return cm.getInputField().autocorrect = val; + }, true); + option("autocapitalize", false, function (cm, val) { + return cm.getInputField().autocapitalize = val; + }, true); + option("rtlMoveVisually", !windows); + option("wholeLineUpdateBefore", true); + option("theme", "default", function (cm) { + themeChanged(cm); + updateGutters(cm); + }, true); + option("keyMap", "default", function (cm, val, old) { + var next = getKeyMap(val); + var prev = old != Init && getKeyMap(old); + if (prev && prev.detach) { + prev.detach(cm, next); + } + if (next.attach) { + next.attach(cm, prev || null); + } + }); + option("extraKeys", null); + option("configureMouse", null); + option("lineWrapping", false, wrappingChanged, true); + option("gutters", [], function (cm, val) { + cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); + updateGutters(cm); + }, true); + option("fixedGutter", true, function (cm, val) { + cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; + cm.refresh(); + }, true); + option("coverGutterNextToScrollbar", false, function (cm) { + return updateScrollbars(cm); + }, true); + option("scrollbarStyle", "native", function (cm) { + initScrollbars(cm); + updateScrollbars(cm); + cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); + cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); + }, true); + option("lineNumbers", false, function (cm, val) { + cm.display.gutterSpecs = getGutters(cm.options.gutters, val); + updateGutters(cm); + }, true); + option("firstLineNumber", 1, updateGutters, true); + option("lineNumberFormatter", function (integer) { + return integer; + }, updateGutters, true); + option("showCursorWhenSelecting", false, updateSelection, true); + option("resetSelectionOnContextMenu", true); + option("lineWiseCopyCut", true); + option("pasteLinesPerSelection", true); + option("selectionsMayTouch", false); + option("readOnly", false, function (cm, val) { + if (val == "nocursor") { + onBlur(cm); + cm.display.input.blur(); + } + cm.display.input.readOnlyChanged(val); + }); + option("screenReaderLabel", null, function (cm, val) { + val = val === '' ? null : val; + cm.display.input.screenReaderLabelChanged(val); + }); + option("disableInput", false, function (cm, val) { + if (!val) { + cm.display.input.reset(); + } + }, true); + option("dragDrop", true, dragDropChanged); + option("allowDropFileTypes", null); + option("cursorBlinkRate", 530); + option("cursorScrollMargin", 0); + option("cursorHeight", 1, updateSelection, true); + option("singleCursorHeightPerLine", true, updateSelection, true); + option("workTime", 100); + option("workDelay", 100); + option("flattenSpans", true, resetModeState, true); + option("addModeClass", false, resetModeState, true); + option("pollInterval", 100); + option("undoDepth", 200, function (cm, val) { + return cm.doc.history.undoDepth = val; + }); + option("historyEventDelay", 1250); + option("viewportMargin", 10, function (cm) { + return cm.refresh(); + }, true); + option("maxHighlightLength", 10000, resetModeState, true); + option("moveInputWithCursor", true, function (cm, val) { + if (!val) { + cm.display.input.resetPosition(); + } + }); + option("tabindex", null, function (cm, val) { + return cm.display.input.getField().tabIndex = val || ""; + }); + option("autofocus", null); + option("direction", "ltr", function (cm, val) { + return cm.doc.setDirection(val); + }, true); + option("phrases", null); + } + function dragDropChanged(cm, value, old) { + var wasOn = old && old != Init; + if (!value != !wasOn) { + var funcs = cm.display.dragFunctions; + var toggle = value ? on : off; + toggle(cm.display.scroller, "dragstart", funcs.start); + toggle(cm.display.scroller, "dragenter", funcs.enter); + toggle(cm.display.scroller, "dragover", funcs.over); + toggle(cm.display.scroller, "dragleave", funcs.leave); + toggle(cm.display.scroller, "drop", funcs.drop); + } + } + function wrappingChanged(cm) { + if (cm.options.lineWrapping) { + addClass(cm.display.wrapper, "CodeMirror-wrap"); + cm.display.sizer.style.minWidth = ""; + cm.display.sizerWidth = null; + } else { + rmClass(cm.display.wrapper, "CodeMirror-wrap"); + findMaxLine(cm); + } + estimateLineHeights(cm); + regChange(cm); + clearCaches(cm); + setTimeout(function () { + return updateScrollbars(cm); + }, 100); + } + + // A CodeMirror instance represents an editor. This is the object + // that user code is usually dealing with. + + function CodeMirror(place, options) { + var this$1 = this; + if (!(this instanceof CodeMirror)) { + return new CodeMirror(place, options); + } + this.options = options = options ? copyObj(options) : {}; + // Determine effective options based on given values and defaults. + copyObj(defaults, options, false); + var doc = options.value; + if (typeof doc == "string") { + doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); + } else if (options.mode) { + doc.modeOption = options.mode; + } + this.doc = doc; + var input = new CodeMirror.inputStyles[options.inputStyle](this); + var display = this.display = new Display(place, doc, input, options); + display.wrapper.CodeMirror = this; + themeChanged(this); + if (options.lineWrapping) { + this.display.wrapper.className += " CodeMirror-wrap"; + } + initScrollbars(this); + this.state = { + keyMaps: [], + // stores maps added by addKeyMap + overlays: [], + // highlighting overlays, as added by addOverlay + modeGen: 0, + // bumped when mode/overlay changes, used to invalidate highlighting info + overwrite: false, + delayingBlurEvent: false, + focused: false, + suppressEdits: false, + // used to disable editing during key handlers when in readOnly mode + pasteIncoming: -1, + cutIncoming: -1, + // help recognize paste/cut edits in input.poll + selectingText: false, + draggingText: false, + highlight: new Delayed(), + // stores highlight worker timeout + keySeq: null, + // Unfinished key sequence + specialChars: null + }; + if (options.autofocus && !mobile) { + display.input.focus(); + } + + // Override magic textarea content restore that IE sometimes does + // on our hidden textarea on reload + if (ie && ie_version < 11) { + setTimeout(function () { + return this$1.display.input.reset(true); + }, 20); + } + registerEventHandlers(this); + ensureGlobalHandlers(); + startOperation(this); + this.curOp.forceUpdate = true; + attachDoc(this, doc); + if (options.autofocus && !mobile || this.hasFocus()) { + setTimeout(function () { + if (this$1.hasFocus() && !this$1.state.focused) { + onFocus(this$1); + } + }, 20); + } else { + onBlur(this); + } + for (var opt in optionHandlers) { + if (optionHandlers.hasOwnProperty(opt)) { + optionHandlers[opt](this, options[opt], Init); + } + } + maybeUpdateLineNumberWidth(this); + if (options.finishInit) { + options.finishInit(this); + } + for (var i = 0; i < initHooks.length; ++i) { + initHooks[i](this); + } + endOperation(this); + // Suppress optimizelegibility in Webkit, since it breaks text + // measuring on line wrapping boundaries. + if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") { + display.lineDiv.style.textRendering = "auto"; + } + } + + // The default configuration options. + CodeMirror.defaults = defaults; + // Functions to run when options are changed. + CodeMirror.optionHandlers = optionHandlers; + + // Attach the necessary event handlers when initializing the editor + function registerEventHandlers(cm) { + var d = cm.display; + on(d.scroller, "mousedown", operation(cm, onMouseDown)); + // Older IE's will not fire a second mousedown for a double click + if (ie && ie_version < 11) { + on(d.scroller, "dblclick", operation(cm, function (e) { + if (signalDOMEvent(cm, e)) { + return; + } + var pos = posFromMouse(cm, e); + if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { + return; + } + e_preventDefault(e); + var word = cm.findWordAt(pos); + extendSelection(cm.doc, word.anchor, word.head); + })); + } else { + on(d.scroller, "dblclick", function (e) { + return signalDOMEvent(cm, e) || e_preventDefault(e); + }); + } + // Some browsers fire contextmenu *after* opening the menu, at + // which point we can't mess with it anymore. Context menu is + // handled in onMouseDown for these browsers. + on(d.scroller, "contextmenu", function (e) { + return onContextMenu(cm, e); + }); + on(d.input.getField(), "contextmenu", function (e) { + if (!d.scroller.contains(e.target)) { + onContextMenu(cm, e); + } + }); + + // Used to suppress mouse event handling when a touch happens + var touchFinished, + prevTouch = { + end: 0 + }; + function finishTouch() { + if (d.activeTouch) { + touchFinished = setTimeout(function () { + return d.activeTouch = null; + }, 1000); + prevTouch = d.activeTouch; + prevTouch.end = +new Date(); + } + } + function isMouseLikeTouchEvent(e) { + if (e.touches.length != 1) { + return false; + } + var touch = e.touches[0]; + return touch.radiusX <= 1 && touch.radiusY <= 1; + } + function farAway(touch, other) { + if (other.left == null) { + return true; + } + var dx = other.left - touch.left, + dy = other.top - touch.top; + return dx * dx + dy * dy > 20 * 20; + } + on(d.scroller, "touchstart", function (e) { + if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { + d.input.ensurePolled(); + clearTimeout(touchFinished); + var now = +new Date(); + d.activeTouch = { + start: now, + moved: false, + prev: now - prevTouch.end <= 300 ? prevTouch : null + }; + if (e.touches.length == 1) { + d.activeTouch.left = e.touches[0].pageX; + d.activeTouch.top = e.touches[0].pageY; + } + } + }); + on(d.scroller, "touchmove", function () { + if (d.activeTouch) { + d.activeTouch.moved = true; + } + }); + on(d.scroller, "touchend", function (e) { + var touch = d.activeTouch; + if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && new Date() - touch.start < 300) { + var pos = cm.coordsChar(d.activeTouch, "page"), + range; + if (!touch.prev || farAway(touch, touch.prev)) + // Single tap + { + range = new Range(pos, pos); + } else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) + // Double tap + { + range = cm.findWordAt(pos); + } else + // Triple tap + { + range = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); + } + cm.setSelection(range.anchor, range.head); + cm.focus(); + e_preventDefault(e); + } + finishTouch(); + }); + on(d.scroller, "touchcancel", finishTouch); + + // Sync scrolling between fake scrollbars and real scrollable + // area, ensure viewport is updated when scrolling. + on(d.scroller, "scroll", function () { + if (d.scroller.clientHeight) { + updateScrollTop(cm, d.scroller.scrollTop); + setScrollLeft(cm, d.scroller.scrollLeft, true); + signal(cm, "scroll", cm); + } + }); + + // Listen to wheel events in order to try and update the viewport on time. + on(d.scroller, "mousewheel", function (e) { + return onScrollWheel(cm, e); + }); + on(d.scroller, "DOMMouseScroll", function (e) { + return onScrollWheel(cm, e); + }); + + // Prevent wrapper from ever scrolling + on(d.wrapper, "scroll", function () { + return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; + }); + d.dragFunctions = { + enter: function (e) { + if (!signalDOMEvent(cm, e)) { + e_stop(e); + } + }, + over: function (e) { + if (!signalDOMEvent(cm, e)) { + onDragOver(cm, e); + e_stop(e); + } + }, + start: function (e) { + return onDragStart(cm, e); + }, + drop: operation(cm, onDrop), + leave: function (e) { + if (!signalDOMEvent(cm, e)) { + clearDragCursor(cm); + } + } + }; + var inp = d.input.getField(); + on(inp, "keyup", function (e) { + return onKeyUp.call(cm, e); + }); + on(inp, "keydown", operation(cm, onKeyDown)); + on(inp, "keypress", operation(cm, onKeyPress)); + on(inp, "focus", function (e) { + return onFocus(cm, e); + }); + on(inp, "blur", function (e) { + return onBlur(cm, e); + }); + } + var initHooks = []; + CodeMirror.defineInitHook = function (f) { + return initHooks.push(f); + }; + + // Indent the given line. The how parameter can be "smart", + // "add"/null, "subtract", or "prev". When aggressive is false + // (typically set to true for forced single-line indents), empty + // lines are not indented, and places where the mode returns Pass + // are left alone. + function indentLine(cm, n, how, aggressive) { + var doc = cm.doc, + state; + if (how == null) { + how = "add"; + } + if (how == "smart") { + // Fall back to "prev" when the mode doesn't have an indentation + // method. + if (!doc.mode.indent) { + how = "prev"; + } else { + state = getContextBefore(cm, n).state; + } + } + var tabSize = cm.options.tabSize; + var line = getLine(doc, n), + curSpace = countColumn(line.text, null, tabSize); + if (line.stateAfter) { + line.stateAfter = null; + } + var curSpaceString = line.text.match(/^\s*/)[0], + indentation; + if (!aggressive && !/\S/.test(line.text)) { + indentation = 0; + how = "not"; + } else if (how == "smart") { + indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); + if (indentation == Pass || indentation > 150) { + if (!aggressive) { + return; + } + how = "prev"; + } + } + if (how == "prev") { + if (n > doc.first) { + indentation = countColumn(getLine(doc, n - 1).text, null, tabSize); + } else { + indentation = 0; + } + } else if (how == "add") { + indentation = curSpace + cm.options.indentUnit; + } else if (how == "subtract") { + indentation = curSpace - cm.options.indentUnit; + } else if (typeof how == "number") { + indentation = curSpace + how; + } + indentation = Math.max(0, indentation); + var indentString = "", + pos = 0; + if (cm.options.indentWithTabs) { + for (var i = Math.floor(indentation / tabSize); i; --i) { + pos += tabSize; + indentString += "\t"; + } + } + if (pos < indentation) { + indentString += spaceStr(indentation - pos); + } + if (indentString != curSpaceString) { + replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); + line.stateAfter = null; + return true; + } else { + // Ensure that, if the cursor was in the whitespace at the start + // of the line, it is moved to the end of that space. + for (var i$1 = 0; i$1 < doc.sel.ranges.length; i$1++) { + var range = doc.sel.ranges[i$1]; + if (range.head.line == n && range.head.ch < curSpaceString.length) { + var pos$1 = Pos(n, curSpaceString.length); + replaceOneSelection(doc, i$1, new Range(pos$1, pos$1)); + break; + } + } + } + } + + // This will be set to a {lineWise: bool, text: [string]} object, so + // that, when pasting, we know what kind of selections the copied + // text was made out of. + var lastCopied = null; + function setLastCopied(newLastCopied) { + lastCopied = newLastCopied; + } + function applyTextInput(cm, inserted, deleted, sel, origin) { + var doc = cm.doc; + cm.display.shift = false; + if (!sel) { + sel = doc.sel; + } + var recent = +new Date() - 200; + var paste = origin == "paste" || cm.state.pasteIncoming > recent; + var textLines = splitLinesAuto(inserted), + multiPaste = null; + // When pasting N lines into N selections, insert one line per selection + if (paste && sel.ranges.length > 1) { + if (lastCopied && lastCopied.text.join("\n") == inserted) { + if (sel.ranges.length % lastCopied.text.length == 0) { + multiPaste = []; + for (var i = 0; i < lastCopied.text.length; i++) { + multiPaste.push(doc.splitLines(lastCopied.text[i])); + } + } + } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { + multiPaste = map(textLines, function (l) { + return [l]; + }); + } + } + var updateInput = cm.curOp.updateInput; + // Normal behavior is to insert the new text into every selection + for (var i$1 = sel.ranges.length - 1; i$1 >= 0; i$1--) { + var range = sel.ranges[i$1]; + var from = range.from(), + to = range.to(); + if (range.empty()) { + if (deleted && deleted > 0) + // Handle deletion + { + from = Pos(from.line, from.ch - deleted); + } else if (cm.state.overwrite && !paste) + // Handle overwrite + { + to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); + } else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) { + from = to = Pos(from.line, 0); + } + } + var changeEvent = { + from: from, + to: to, + text: multiPaste ? multiPaste[i$1 % multiPaste.length] : textLines, + origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input") + }; + makeChange(cm.doc, changeEvent); + signalLater(cm, "inputRead", cm, changeEvent); + } + if (inserted && !paste) { + triggerElectric(cm, inserted); + } + ensureCursorVisible(cm); + if (cm.curOp.updateInput < 2) { + cm.curOp.updateInput = updateInput; + } + cm.curOp.typing = true; + cm.state.pasteIncoming = cm.state.cutIncoming = -1; + } + function handlePaste(e, cm) { + var pasted = e.clipboardData && e.clipboardData.getData("Text"); + if (pasted) { + e.preventDefault(); + if (!cm.isReadOnly() && !cm.options.disableInput) { + runInOp(cm, function () { + return applyTextInput(cm, pasted, 0, null, "paste"); + }); + } + return true; + } + } + function triggerElectric(cm, inserted) { + // When an 'electric' character is inserted, immediately trigger a reindent + if (!cm.options.electricChars || !cm.options.smartIndent) { + return; + } + var sel = cm.doc.sel; + for (var i = sel.ranges.length - 1; i >= 0; i--) { + var range = sel.ranges[i]; + if (range.head.ch > 100 || i && sel.ranges[i - 1].head.line == range.head.line) { + continue; + } + var mode = cm.getModeAt(range.head); + var indented = false; + if (mode.electricChars) { + for (var j = 0; j < mode.electricChars.length; j++) { + if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { + indented = indentLine(cm, range.head.line, "smart"); + break; + } + } + } else if (mode.electricInput) { + if (mode.electricInput.test(getLine(cm.doc, range.head.line).text.slice(0, range.head.ch))) { + indented = indentLine(cm, range.head.line, "smart"); + } + } + if (indented) { + signalLater(cm, "electricInput", cm, range.head.line); + } + } + } + function copyableRanges(cm) { + var text = [], + ranges = []; + for (var i = 0; i < cm.doc.sel.ranges.length; i++) { + var line = cm.doc.sel.ranges[i].head.line; + var lineRange = { + anchor: Pos(line, 0), + head: Pos(line + 1, 0) + }; + ranges.push(lineRange); + text.push(cm.getRange(lineRange.anchor, lineRange.head)); + } + return { + text: text, + ranges: ranges + }; + } + function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { + field.setAttribute("autocorrect", autocorrect ? "" : "off"); + field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); + field.setAttribute("spellcheck", !!spellcheck); + } + function hiddenTextarea() { + var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); + var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); + // The textarea is kept positioned near the cursor to prevent the + // fact that it'll be scrolled into view on input from scrolling + // our fake cursor out of view. On webkit, when wrap=off, paste is + // very slow. So make the area wide instead. + if (webkit) { + te.style.width = "1000px"; + } else { + te.setAttribute("wrap", "off"); + } + // If border: 0; -- iOS fails to open keyboard (issue #1287) + if (ios) { + te.style.border = "1px solid black"; + } + disableBrowserMagic(te); + return div; + } + + // The publicly visible API. Note that methodOp(f) means + // 'wrap f in an operation, performed on its `this` parameter'. + + // This is not the complete set of editor methods. Most of the + // methods defined on the Doc type are also injected into + // CodeMirror.prototype, for backwards compatibility and + // convenience. + + function addEditorMethods(CodeMirror) { + var optionHandlers = CodeMirror.optionHandlers; + var helpers = CodeMirror.helpers = {}; + CodeMirror.prototype = { + constructor: CodeMirror, + focus: function () { + window.focus(); + this.display.input.focus(); + }, + setOption: function (option, value) { + var options = this.options, + old = options[option]; + if (options[option] == value && option != "mode") { + return; + } + options[option] = value; + if (optionHandlers.hasOwnProperty(option)) { + operation(this, optionHandlers[option])(this, value, old); + } + signal(this, "optionChange", this, option); + }, + getOption: function (option) { + return this.options[option]; + }, + getDoc: function () { + return this.doc; + }, + addKeyMap: function (map, bottom) { + this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map)); + }, + removeKeyMap: function (map) { + var maps = this.state.keyMaps; + for (var i = 0; i < maps.length; ++i) { + if (maps[i] == map || maps[i].name == map) { + maps.splice(i, 1); + return true; + } + } + }, + addOverlay: methodOp(function (spec, options) { + var mode = spec.token ? spec : CodeMirror.getMode(this.options, spec); + if (mode.startState) { + throw new Error("Overlays may not be stateful."); + } + insertSorted(this.state.overlays, { + mode: mode, + modeSpec: spec, + opaque: options && options.opaque, + priority: options && options.priority || 0 + }, function (overlay) { + return overlay.priority; + }); + this.state.modeGen++; + regChange(this); + }), + removeOverlay: methodOp(function (spec) { + var overlays = this.state.overlays; + for (var i = 0; i < overlays.length; ++i) { + var cur = overlays[i].modeSpec; + if (cur == spec || typeof spec == "string" && cur.name == spec) { + overlays.splice(i, 1); + this.state.modeGen++; + regChange(this); + return; + } + } + }), + indentLine: methodOp(function (n, dir, aggressive) { + if (typeof dir != "string" && typeof dir != "number") { + if (dir == null) { + dir = this.options.smartIndent ? "smart" : "prev"; + } else { + dir = dir ? "add" : "subtract"; + } + } + if (isLine(this.doc, n)) { + indentLine(this, n, dir, aggressive); + } + }), + indentSelection: methodOp(function (how) { + var ranges = this.doc.sel.ranges, + end = -1; + for (var i = 0; i < ranges.length; i++) { + var range = ranges[i]; + if (!range.empty()) { + var from = range.from(), + to = range.to(); + var start = Math.max(end, from.line); + end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; + for (var j = start; j < end; ++j) { + indentLine(this, j, how); + } + var newRanges = this.doc.sel.ranges; + if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i].from().ch > 0) { + replaceOneSelection(this.doc, i, new Range(from, newRanges[i].to()), sel_dontScroll); + } + } else if (range.head.line > end) { + indentLine(this, range.head.line, how, true); + end = range.head.line; + if (i == this.doc.sel.primIndex) { + ensureCursorVisible(this); + } + } + } + }), + // Fetch the parser token for a given character. Useful for hacks + // that want to inspect the mode state (say, for completion). + getTokenAt: function (pos, precise) { + return takeToken(this, pos, precise); + }, + getLineTokens: function (line, precise) { + return takeToken(this, Pos(line), precise, true); + }, + getTokenTypeAt: function (pos) { + pos = clipPos(this.doc, pos); + var styles = getLineStyles(this, getLine(this.doc, pos.line)); + var before = 0, + after = (styles.length - 1) / 2, + ch = pos.ch; + var type; + if (ch == 0) { + type = styles[2]; + } else { + for (;;) { + var mid = before + after >> 1; + if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { + after = mid; + } else if (styles[mid * 2 + 1] < ch) { + before = mid + 1; + } else { + type = styles[mid * 2 + 2]; + break; + } + } + } + var cut = type ? type.indexOf("overlay ") : -1; + return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); + }, + getModeAt: function (pos) { + var mode = this.doc.mode; + if (!mode.innerMode) { + return mode; + } + return CodeMirror.innerMode(mode, this.getTokenAt(pos).state).mode; + }, + getHelper: function (pos, type) { + return this.getHelpers(pos, type)[0]; + }, + getHelpers: function (pos, type) { + var found = []; + if (!helpers.hasOwnProperty(type)) { + return found; + } + var help = helpers[type], + mode = this.getModeAt(pos); + if (typeof mode[type] == "string") { + if (help[mode[type]]) { + found.push(help[mode[type]]); + } + } else if (mode[type]) { + for (var i = 0; i < mode[type].length; i++) { + var val = help[mode[type][i]]; + if (val) { + found.push(val); + } + } + } else if (mode.helperType && help[mode.helperType]) { + found.push(help[mode.helperType]); + } else if (help[mode.name]) { + found.push(help[mode.name]); + } + for (var i$1 = 0; i$1 < help._global.length; i$1++) { + var cur = help._global[i$1]; + if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) { + found.push(cur.val); + } + } + return found; + }, + getStateAfter: function (line, precise) { + var doc = this.doc; + line = clipLine(doc, line == null ? doc.first + doc.size - 1 : line); + return getContextBefore(this, line + 1, precise).state; + }, + cursorCoords: function (start, mode) { + var pos, + range = this.doc.sel.primary(); + if (start == null) { + pos = range.head; + } else if (typeof start == "object") { + pos = clipPos(this.doc, start); + } else { + pos = start ? range.from() : range.to(); + } + return cursorCoords(this, pos, mode || "page"); + }, + charCoords: function (pos, mode) { + return charCoords(this, clipPos(this.doc, pos), mode || "page"); + }, + coordsChar: function (coords, mode) { + coords = fromCoordSystem(this, coords, mode || "page"); + return coordsChar(this, coords.left, coords.top); + }, + lineAtHeight: function (height, mode) { + height = fromCoordSystem(this, { + top: height, + left: 0 + }, mode || "page").top; + return lineAtHeight(this.doc, height + this.display.viewOffset); + }, + heightAtLine: function (line, mode, includeWidgets) { + var end = false, + lineObj; + if (typeof line == "number") { + var last = this.doc.first + this.doc.size - 1; + if (line < this.doc.first) { + line = this.doc.first; + } else if (line > last) { + line = last; + end = true; + } + lineObj = getLine(this.doc, line); + } else { + lineObj = line; + } + return intoCoordSystem(this, lineObj, { + top: 0, + left: 0 + }, mode || "page", includeWidgets || end).top + (end ? this.doc.height - heightAtLine(lineObj) : 0); + }, + defaultTextHeight: function () { + return textHeight(this.display); + }, + defaultCharWidth: function () { + return charWidth(this.display); + }, + getViewport: function () { + return { + from: this.display.viewFrom, + to: this.display.viewTo + }; + }, + addWidget: function (pos, node, scroll, vert, horiz) { + var display = this.display; + pos = cursorCoords(this, clipPos(this.doc, pos)); + var top = pos.bottom, + left = pos.left; + node.style.position = "absolute"; + node.setAttribute("cm-ignore-events", "true"); + this.display.input.setUneditable(node); + display.sizer.appendChild(node); + if (vert == "over") { + top = pos.top; + } else if (vert == "above" || vert == "near") { + var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), + hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); + // Default to positioning above (if specified and possible); otherwise default to positioning below + if ((vert == 'above' || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) { + top = pos.top - node.offsetHeight; + } else if (pos.bottom + node.offsetHeight <= vspace) { + top = pos.bottom; + } + if (left + node.offsetWidth > hspace) { + left = hspace - node.offsetWidth; + } + } + node.style.top = top + "px"; + node.style.left = node.style.right = ""; + if (horiz == "right") { + left = display.sizer.clientWidth - node.offsetWidth; + node.style.right = "0px"; + } else { + if (horiz == "left") { + left = 0; + } else if (horiz == "middle") { + left = (display.sizer.clientWidth - node.offsetWidth) / 2; + } + node.style.left = left + "px"; + } + if (scroll) { + scrollIntoView(this, { + left: left, + top: top, + right: left + node.offsetWidth, + bottom: top + node.offsetHeight + }); + } + }, + triggerOnKeyDown: methodOp(onKeyDown), + triggerOnKeyPress: methodOp(onKeyPress), + triggerOnKeyUp: onKeyUp, + triggerOnMouseDown: methodOp(onMouseDown), + execCommand: function (cmd) { + if (commands.hasOwnProperty(cmd)) { + return commands[cmd].call(null, this); + } + }, + triggerElectric: methodOp(function (text) { + triggerElectric(this, text); + }), + findPosH: function (from, amount, unit, visually) { + var dir = 1; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + cur = findPosH(this.doc, cur, dir, unit, visually); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveH: methodOp(function (dir, unit) { + var this$1 = this; + this.extendSelectionsBy(function (range) { + if (this$1.display.shift || this$1.doc.extend || range.empty()) { + return findPosH(this$1.doc, range.head, dir, unit, this$1.options.rtlMoveVisually); + } else { + return dir < 0 ? range.from() : range.to(); + } + }, sel_move); + }), + deleteH: methodOp(function (dir, unit) { + var sel = this.doc.sel, + doc = this.doc; + if (sel.somethingSelected()) { + doc.replaceSelection("", null, "+delete"); + } else { + deleteNearSelection(this, function (range) { + var other = findPosH(doc, range.head, dir, unit, false); + return dir < 0 ? { + from: other, + to: range.head + } : { + from: range.head, + to: other + }; + }); + } + }), + findPosV: function (from, amount, unit, goalColumn) { + var dir = 1, + x = goalColumn; + if (amount < 0) { + dir = -1; + amount = -amount; + } + var cur = clipPos(this.doc, from); + for (var i = 0; i < amount; ++i) { + var coords = cursorCoords(this, cur, "div"); + if (x == null) { + x = coords.left; + } else { + coords.left = x; + } + cur = findPosV(this, coords, dir, unit); + if (cur.hitSide) { + break; + } + } + return cur; + }, + moveV: methodOp(function (dir, unit) { + var this$1 = this; + var doc = this.doc, + goals = []; + var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); + doc.extendSelectionsBy(function (range) { + if (collapse) { + return dir < 0 ? range.from() : range.to(); + } + var headPos = cursorCoords(this$1, range.head, "div"); + if (range.goalColumn != null) { + headPos.left = range.goalColumn; + } + goals.push(headPos.left); + var pos = findPosV(this$1, headPos, dir, unit); + if (unit == "page" && range == doc.sel.primary()) { + addToScrollTop(this$1, charCoords(this$1, pos, "div").top - headPos.top); + } + return pos; + }, sel_move); + if (goals.length) { + for (var i = 0; i < doc.sel.ranges.length; i++) { + doc.sel.ranges[i].goalColumn = goals[i]; + } + } + }), + // Find the word at the given position (as returned by coordsChar). + findWordAt: function (pos) { + var doc = this.doc, + line = getLine(doc, pos.line).text; + var start = pos.ch, + end = pos.ch; + if (line) { + var helper = this.getHelper(pos, "wordChars"); + if ((pos.sticky == "before" || end == line.length) && start) { + --start; + } else { + ++end; + } + var startChar = line.charAt(start); + var check = isWordChar(startChar, helper) ? function (ch) { + return isWordChar(ch, helper); + } : /\s/.test(startChar) ? function (ch) { + return /\s/.test(ch); + } : function (ch) { + return !/\s/.test(ch) && !isWordChar(ch); + }; + while (start > 0 && check(line.charAt(start - 1))) { + --start; + } + while (end < line.length && check(line.charAt(end))) { + ++end; + } + } + return new Range(Pos(pos.line, start), Pos(pos.line, end)); + }, + toggleOverwrite: function (value) { + if (value != null && value == this.state.overwrite) { + return; + } + if (this.state.overwrite = !this.state.overwrite) { + addClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } else { + rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); + } + signal(this, "overwriteToggle", this, this.state.overwrite); + }, + hasFocus: function () { + return this.display.input.getField() == activeElt(); + }, + isReadOnly: function () { + return !!(this.options.readOnly || this.doc.cantEdit); + }, + scrollTo: methodOp(function (x, y) { + scrollToCoords(this, x, y); + }), + getScrollInfo: function () { + var scroller = this.display.scroller; + return { + left: scroller.scrollLeft, + top: scroller.scrollTop, + height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, + width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, + clientHeight: displayHeight(this), + clientWidth: displayWidth(this) + }; + }, + scrollIntoView: methodOp(function (range, margin) { + if (range == null) { + range = { + from: this.doc.sel.primary().head, + to: null + }; + if (margin == null) { + margin = this.options.cursorScrollMargin; + } + } else if (typeof range == "number") { + range = { + from: Pos(range, 0), + to: null + }; + } else if (range.from == null) { + range = { + from: range, + to: null + }; + } + if (!range.to) { + range.to = range.from; + } + range.margin = margin || 0; + if (range.from.line != null) { + scrollToRange(this, range); + } else { + scrollToCoordsRange(this, range.from, range.to, range.margin); + } + }), + setSize: methodOp(function (width, height) { + var this$1 = this; + var interpret = function (val) { + return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; + }; + if (width != null) { + this.display.wrapper.style.width = interpret(width); + } + if (height != null) { + this.display.wrapper.style.height = interpret(height); + } + if (this.options.lineWrapping) { + clearLineMeasurementCache(this); + } + var lineNo = this.display.viewFrom; + this.doc.iter(lineNo, this.display.viewTo, function (line) { + if (line.widgets) { + for (var i = 0; i < line.widgets.length; i++) { + if (line.widgets[i].noHScroll) { + regLineChange(this$1, lineNo, "widget"); + break; + } + } + } + ++lineNo; + }); + this.curOp.forceUpdate = true; + signal(this, "refresh", this); + }), + operation: function (f) { + return runInOp(this, f); + }, + startOperation: function () { + return startOperation(this); + }, + endOperation: function () { + return endOperation(this); + }, + refresh: methodOp(function () { + var oldHeight = this.display.cachedTextHeight; + regChange(this); + this.curOp.forceUpdate = true; + clearCaches(this); + scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); + updateGutterSpace(this.display); + if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > .5 || this.options.lineWrapping) { + estimateLineHeights(this); + } + signal(this, "refresh", this); + }), + swapDoc: methodOp(function (doc) { + var old = this.doc; + old.cm = null; + // Cancel the current text selection if any (#5821) + if (this.state.selectingText) { + this.state.selectingText(); + } + attachDoc(this, doc); + clearCaches(this); + this.display.input.reset(); + scrollToCoords(this, doc.scrollLeft, doc.scrollTop); + this.curOp.forceScroll = true; + signalLater(this, "swapDoc", this, old); + return old; + }), + phrase: function (phraseText) { + var phrases = this.options.phrases; + return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText; + }, + getInputField: function () { + return this.display.input.getField(); + }, + getWrapperElement: function () { + return this.display.wrapper; + }, + getScrollerElement: function () { + return this.display.scroller; + }, + getGutterElement: function () { + return this.display.gutters; + } + }; + eventMixin(CodeMirror); + CodeMirror.registerHelper = function (type, name, value) { + if (!helpers.hasOwnProperty(type)) { + helpers[type] = CodeMirror[type] = { + _global: [] + }; + } + helpers[type][name] = value; + }; + CodeMirror.registerGlobalHelper = function (type, name, predicate, value) { + CodeMirror.registerHelper(type, name, value); + helpers[type]._global.push({ + pred: predicate, + val: value + }); + }; + } + + // Used for horizontal relative motion. Dir is -1 or 1 (left or + // right), unit can be "codepoint", "char", "column" (like char, but + // doesn't cross line boundaries), "word" (across next word), or + // "group" (to the start of next group of word or + // non-word-non-whitespace chars). The visually param controls + // whether, in right-to-left text, direction 1 means to move towards + // the next index in the string, or towards the character to the right + // of the current position. The resulting position will have a + // hitSide=true property if it reached the end of the document. + function findPosH(doc, pos, dir, unit, visually) { + var oldPos = pos; + var origDir = dir; + var lineObj = getLine(doc, pos.line); + var lineDir = visually && doc.direction == "rtl" ? -dir : dir; + function findNextLine() { + var l = pos.line + lineDir; + if (l < doc.first || l >= doc.first + doc.size) { + return false; + } + pos = new Pos(l, pos.ch, pos.sticky); + return lineObj = getLine(doc, l); + } + function moveOnce(boundToLine) { + var next; + if (unit == "codepoint") { + var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); + if (isNaN(ch)) { + next = null; + } else { + var astral = dir > 0 ? ch >= 0xD800 && ch < 0xDC00 : ch >= 0xDC00 && ch < 0xDFFF; + next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); + } + } else if (visually) { + next = moveVisually(doc.cm, lineObj, pos, dir); + } else { + next = moveLogically(lineObj, pos, dir); + } + if (next == null) { + if (!boundToLine && findNextLine()) { + pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); + } else { + return false; + } + } else { + pos = next; + } + return true; + } + if (unit == "char" || unit == "codepoint") { + moveOnce(); + } else if (unit == "column") { + moveOnce(true); + } else if (unit == "word" || unit == "group") { + var sawType = null, + group = unit == "group"; + var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); + for (var first = true;; first = false) { + if (dir < 0 && !moveOnce(!first)) { + break; + } + var cur = lineObj.text.charAt(pos.ch) || "\n"; + var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; + if (group && !first && !type) { + type = "s"; + } + if (sawType && sawType != type) { + if (dir < 0) { + dir = 1; + moveOnce(); + pos.sticky = "after"; + } + break; + } + if (type) { + sawType = type; + } + if (dir > 0 && !moveOnce(!first)) { + break; + } + } + } + var result = skipAtomic(doc, pos, oldPos, origDir, true); + if (equalCursorPos(oldPos, result)) { + result.hitSide = true; + } + return result; + } + + // For relative vertical movement. Dir may be -1 or 1. Unit can be + // "page" or "line". The resulting position will have a hitSide=true + // property if it reached the end of the document. + function findPosV(cm, pos, dir, unit) { + var doc = cm.doc, + x = pos.left, + y; + if (unit == "page") { + var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); + var moveAmount = Math.max(pageSize - .5 * textHeight(cm.display), 3); + y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; + } else if (unit == "line") { + y = dir > 0 ? pos.bottom + 3 : pos.top - 3; + } + var target; + for (;;) { + target = coordsChar(cm, x, y); + if (!target.outside) { + break; + } + if (dir < 0 ? y <= 0 : y >= doc.height) { + target.hitSide = true; + break; + } + y += dir * 5; + } + return target; + } + + // CONTENTEDITABLE INPUT STYLE + + var ContentEditableInput = function (cm) { + this.cm = cm; + this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; + this.polling = new Delayed(); + this.composing = null; + this.gracePeriod = false; + this.readDOMTimeout = null; + }; + ContentEditableInput.prototype.init = function (display) { + var this$1 = this; + var input = this, + cm = input.cm; + var div = input.div = display.lineDiv; + div.contentEditable = true; + disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); + function belongsToInput(e) { + for (var t = e.target; t; t = t.parentNode) { + if (t == div) { + return true; + } + if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { + break; + } + } + return false; + } + on(div, "paste", function (e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; + } + // IE doesn't fire input events, so we schedule a read for the pasted content in this way + if (ie_version <= 11) { + setTimeout(operation(cm, function () { + return this$1.updateFromDOM(); + }), 20); + } + }); + on(div, "compositionstart", function (e) { + this$1.composing = { + data: e.data, + done: false + }; + }); + on(div, "compositionupdate", function (e) { + if (!this$1.composing) { + this$1.composing = { + data: e.data, + done: false + }; + } + }); + on(div, "compositionend", function (e) { + if (this$1.composing) { + if (e.data != this$1.composing.data) { + this$1.readFromDOMSoon(); + } + this$1.composing.done = true; + } + }); + on(div, "touchstart", function () { + return input.forceCompositionEnd(); + }); + on(div, "input", function () { + if (!this$1.composing) { + this$1.readFromDOMSoon(); + } + }); + function onCopyCut(e) { + if (!belongsToInput(e) || signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ + lineWise: false, + text: cm.getSelections() + }); + if (e.type == "cut") { + cm.replaceSelection("", null, "cut"); + } + } else if (!cm.options.lineWiseCopyCut) { + return; + } else { + var ranges = copyableRanges(cm); + setLastCopied({ + lineWise: true, + text: ranges.text + }); + if (e.type == "cut") { + cm.operation(function () { + cm.setSelections(ranges.ranges, 0, sel_dontScroll); + cm.replaceSelection("", null, "cut"); + }); + } + } + if (e.clipboardData) { + e.clipboardData.clearData(); + var content = lastCopied.text.join("\n"); + // iOS exposes the clipboard API, but seems to discard content inserted into it + e.clipboardData.setData("Text", content); + if (e.clipboardData.getData("Text") == content) { + e.preventDefault(); + return; + } + } + // Old-fashioned briefly-focus-a-textarea hack + var kludge = hiddenTextarea(), + te = kludge.firstChild; + cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); + te.value = lastCopied.text.join("\n"); + var hadFocus = activeElt(); + selectInput(te); + setTimeout(function () { + cm.display.lineSpace.removeChild(kludge); + hadFocus.focus(); + if (hadFocus == div) { + input.showPrimarySelection(); + } + }, 50); + } + on(div, "copy", onCopyCut); + on(div, "cut", onCopyCut); + }; + ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if (label) { + this.div.setAttribute('aria-label', label); + } else { + this.div.removeAttribute('aria-label'); + } + }; + ContentEditableInput.prototype.prepareSelection = function () { + var result = prepareSelection(this.cm, false); + result.focus = activeElt() == this.div; + return result; + }; + ContentEditableInput.prototype.showSelection = function (info, takeFocus) { + if (!info || !this.cm.display.view.length) { + return; + } + if (info.focus || takeFocus) { + this.showPrimarySelection(); + } + this.showMultipleSelections(info); + }; + ContentEditableInput.prototype.getSelection = function () { + return this.cm.display.wrapper.ownerDocument.getSelection(); + }; + ContentEditableInput.prototype.showPrimarySelection = function () { + var sel = this.getSelection(), + cm = this.cm, + prim = cm.doc.sel.primary(); + var from = prim.from(), + to = prim.to(); + if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { + sel.removeAllRanges(); + return; + } + var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); + if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), from) == 0 && cmp(maxPos(curAnchor, curFocus), to) == 0) { + return; + } + var view = cm.display.view; + var start = from.line >= cm.display.viewFrom && posToDOM(cm, from) || { + node: view[0].measure.map[2], + offset: 0 + }; + var end = to.line < cm.display.viewTo && posToDOM(cm, to); + if (!end) { + var measure = view[view.length - 1].measure; + var map = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; + end = { + node: map[map.length - 1], + offset: map[map.length - 2] - map[map.length - 3] + }; + } + if (!start || !end) { + sel.removeAllRanges(); + return; + } + var old = sel.rangeCount && sel.getRangeAt(0), + rng; + try { + rng = range(start.node, start.offset, end.offset, end.node); + } catch (e) {} // Our model of the DOM might be outdated, in which case the range we try to set can be impossible + if (rng) { + if (!gecko && cm.state.focused) { + sel.collapse(start.node, start.offset); + if (!rng.collapsed) { + sel.removeAllRanges(); + sel.addRange(rng); + } + } else { + sel.removeAllRanges(); + sel.addRange(rng); + } + if (old && sel.anchorNode == null) { + sel.addRange(old); + } else if (gecko) { + this.startGracePeriod(); + } + } + this.rememberSelection(); + }; + ContentEditableInput.prototype.startGracePeriod = function () { + var this$1 = this; + clearTimeout(this.gracePeriod); + this.gracePeriod = setTimeout(function () { + this$1.gracePeriod = false; + if (this$1.selectionChanged()) { + this$1.cm.operation(function () { + return this$1.cm.curOp.selectionChanged = true; + }); + } + }, 20); + }; + ContentEditableInput.prototype.showMultipleSelections = function (info) { + removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); + removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); + }; + ContentEditableInput.prototype.rememberSelection = function () { + var sel = this.getSelection(); + this.lastAnchorNode = sel.anchorNode; + this.lastAnchorOffset = sel.anchorOffset; + this.lastFocusNode = sel.focusNode; + this.lastFocusOffset = sel.focusOffset; + }; + ContentEditableInput.prototype.selectionInEditor = function () { + var sel = this.getSelection(); + if (!sel.rangeCount) { + return false; + } + var node = sel.getRangeAt(0).commonAncestorContainer; + return contains(this.div, node); + }; + ContentEditableInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor") { + if (!this.selectionInEditor() || activeElt() != this.div) { + this.showSelection(this.prepareSelection(), true); + } + this.div.focus(); + } + }; + ContentEditableInput.prototype.blur = function () { + this.div.blur(); + }; + ContentEditableInput.prototype.getField = function () { + return this.div; + }; + ContentEditableInput.prototype.supportsTouch = function () { + return true; + }; + ContentEditableInput.prototype.receivedFocus = function () { + var this$1 = this; + var input = this; + if (this.selectionInEditor()) { + setTimeout(function () { + return this$1.pollSelection(); + }, 20); + } else { + runInOp(this.cm, function () { + return input.cm.curOp.selectionChanged = true; + }); + } + function poll() { + if (input.cm.state.focused) { + input.pollSelection(); + input.polling.set(input.cm.options.pollInterval, poll); + } + } + this.polling.set(this.cm.options.pollInterval, poll); + }; + ContentEditableInput.prototype.selectionChanged = function () { + var sel = this.getSelection(); + return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; + }; + ContentEditableInput.prototype.pollSelection = function () { + if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { + return; + } + var sel = this.getSelection(), + cm = this.cm; + // On Android Chrome (version 56, at least), backspacing into an + // uneditable block element will put the cursor in that element, + // and then, because it's not editable, hide the virtual keyboard. + // Because Android doesn't allow us to actually detect backspace + // presses in a sane way, this code checks for when that happens + // and simulates a backspace press in this case. + if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { + this.cm.triggerOnKeyDown({ + type: "keydown", + keyCode: 8, + preventDefault: Math.abs + }); + this.blur(); + this.focus(); + return; + } + if (this.composing) { + return; + } + this.rememberSelection(); + var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); + var head = domToPos(cm, sel.focusNode, sel.focusOffset); + if (anchor && head) { + runInOp(cm, function () { + setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); + if (anchor.bad || head.bad) { + cm.curOp.selectionChanged = true; + } + }); + } + }; + ContentEditableInput.prototype.pollContent = function () { + if (this.readDOMTimeout != null) { + clearTimeout(this.readDOMTimeout); + this.readDOMTimeout = null; + } + var cm = this.cm, + display = cm.display, + sel = cm.doc.sel.primary(); + var from = sel.from(), + to = sel.to(); + if (from.ch == 0 && from.line > cm.firstLine()) { + from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); + } + if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) { + to = Pos(to.line + 1, 0); + } + if (from.line < display.viewFrom || to.line > display.viewTo - 1) { + return false; + } + var fromIndex, fromLine, fromNode; + if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { + fromLine = lineNo(display.view[0].line); + fromNode = display.view[0].node; + } else { + fromLine = lineNo(display.view[fromIndex].line); + fromNode = display.view[fromIndex - 1].node.nextSibling; + } + var toIndex = findViewIndex(cm, to.line); + var toLine, toNode; + if (toIndex == display.view.length - 1) { + toLine = display.viewTo - 1; + toNode = display.lineDiv.lastChild; + } else { + toLine = lineNo(display.view[toIndex + 1].line) - 1; + toNode = display.view[toIndex + 1].node.previousSibling; + } + if (!fromNode) { + return false; + } + var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); + var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); + while (newText.length > 1 && oldText.length > 1) { + if (lst(newText) == lst(oldText)) { + newText.pop(); + oldText.pop(); + toLine--; + } else if (newText[0] == oldText[0]) { + newText.shift(); + oldText.shift(); + fromLine++; + } else { + break; + } + } + var cutFront = 0, + cutEnd = 0; + var newTop = newText[0], + oldTop = oldText[0], + maxCutFront = Math.min(newTop.length, oldTop.length); + while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) { + ++cutFront; + } + var newBot = lst(newText), + oldBot = lst(oldText); + var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), oldBot.length - (oldText.length == 1 ? cutFront : 0)); + while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + ++cutEnd; + } + // Try to move start of change to start of selection if ambiguous + if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { + while (cutFront && cutFront > from.ch && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { + cutFront--; + cutEnd++; + } + } + newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); + newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); + var chFrom = Pos(fromLine, cutFront); + var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); + if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { + replaceRange(cm.doc, newText, chFrom, chTo, "+input"); + return true; + } + }; + ContentEditableInput.prototype.ensurePolled = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.reset = function () { + this.forceCompositionEnd(); + }; + ContentEditableInput.prototype.forceCompositionEnd = function () { + if (!this.composing) { + return; + } + clearTimeout(this.readDOMTimeout); + this.composing = null; + this.updateFromDOM(); + this.div.blur(); + this.div.focus(); + }; + ContentEditableInput.prototype.readFromDOMSoon = function () { + var this$1 = this; + if (this.readDOMTimeout != null) { + return; + } + this.readDOMTimeout = setTimeout(function () { + this$1.readDOMTimeout = null; + if (this$1.composing) { + if (this$1.composing.done) { + this$1.composing = null; + } else { + return; + } + } + this$1.updateFromDOM(); + }, 80); + }; + ContentEditableInput.prototype.updateFromDOM = function () { + var this$1 = this; + if (this.cm.isReadOnly() || !this.pollContent()) { + runInOp(this.cm, function () { + return regChange(this$1.cm); + }); + } + }; + ContentEditableInput.prototype.setUneditable = function (node) { + node.contentEditable = "false"; + }; + ContentEditableInput.prototype.onKeyPress = function (e) { + if (e.charCode == 0 || this.composing) { + return; + } + e.preventDefault(); + if (!this.cm.isReadOnly()) { + operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); + } + }; + ContentEditableInput.prototype.readOnlyChanged = function (val) { + this.div.contentEditable = String(val != "nocursor"); + }; + ContentEditableInput.prototype.onContextMenu = function () {}; + ContentEditableInput.prototype.resetPosition = function () {}; + ContentEditableInput.prototype.needsContentAttribute = true; + function posToDOM(cm, pos) { + var view = findViewForLine(cm, pos.line); + if (!view || view.hidden) { + return null; + } + var line = getLine(cm.doc, pos.line); + var info = mapFromLineView(view, line, pos.line); + var order = getOrder(line, cm.doc.direction), + side = "left"; + if (order) { + var partPos = getBidiPartAt(order, pos.ch); + side = partPos % 2 ? "right" : "left"; + } + var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); + result.offset = result.collapse == "right" ? result.end : result.start; + return result; + } + function isInGutter(node) { + for (var scan = node; scan; scan = scan.parentNode) { + if (/CodeMirror-gutter-wrapper/.test(scan.className)) { + return true; + } + } + return false; + } + function badPos(pos, bad) { + if (bad) { + pos.bad = true; + } + return pos; + } + function domTextBetween(cm, from, to, fromLine, toLine) { + var text = "", + closing = false, + lineSep = cm.doc.lineSeparator(), + extraLinebreak = false; + function recognizeMarker(id) { + return function (marker) { + return marker.id == id; + }; + } + function close() { + if (closing) { + text += lineSep; + if (extraLinebreak) { + text += lineSep; + } + closing = extraLinebreak = false; + } + } + function addText(str) { + if (str) { + close(); + text += str; + } + } + function walk(node) { + if (node.nodeType == 1) { + var cmText = node.getAttribute("cm-text"); + if (cmText) { + addText(cmText); + return; + } + var markerID = node.getAttribute("cm-marker"), + range; + if (markerID) { + var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); + if (found.length && (range = found[0].find(0))) { + addText(getBetween(cm.doc, range.from, range.to).join(lineSep)); + } + return; + } + if (node.getAttribute("contenteditable") == "false") { + return; + } + var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); + if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { + return; + } + if (isBlock) { + close(); + } + for (var i = 0; i < node.childNodes.length; i++) { + walk(node.childNodes[i]); + } + if (/^(pre|p)$/i.test(node.nodeName)) { + extraLinebreak = true; + } + if (isBlock) { + closing = true; + } + } else if (node.nodeType == 3) { + addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); + } + } + for (;;) { + walk(from); + if (from == to) { + break; + } + from = from.nextSibling; + extraLinebreak = false; + } + return text; + } + function domToPos(cm, node, offset) { + var lineNode; + if (node == cm.display.lineDiv) { + lineNode = cm.display.lineDiv.childNodes[offset]; + if (!lineNode) { + return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); + } + node = null; + offset = 0; + } else { + for (lineNode = node;; lineNode = lineNode.parentNode) { + if (!lineNode || lineNode == cm.display.lineDiv) { + return null; + } + if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { + break; + } + } + } + for (var i = 0; i < cm.display.view.length; i++) { + var lineView = cm.display.view[i]; + if (lineView.node == lineNode) { + return locateNodeInLineView(lineView, node, offset); + } + } + } + function locateNodeInLineView(lineView, node, offset) { + var wrapper = lineView.text.firstChild, + bad = false; + if (!node || !contains(wrapper, node)) { + return badPos(Pos(lineNo(lineView.line), 0), true); + } + if (node == wrapper) { + bad = true; + node = wrapper.childNodes[offset]; + offset = 0; + if (!node) { + var line = lineView.rest ? lst(lineView.rest) : lineView.line; + return badPos(Pos(lineNo(line), line.text.length), bad); + } + } + var textNode = node.nodeType == 3 ? node : null, + topNode = node; + if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { + textNode = node.firstChild; + if (offset) { + offset = textNode.nodeValue.length; + } + } + while (topNode.parentNode != wrapper) { + topNode = topNode.parentNode; + } + var measure = lineView.measure, + maps = measure.maps; + function find(textNode, topNode, offset) { + for (var i = -1; i < (maps ? maps.length : 0); i++) { + var map = i < 0 ? measure.map : maps[i]; + for (var j = 0; j < map.length; j += 3) { + var curNode = map[j + 2]; + if (curNode == textNode || curNode == topNode) { + var line = lineNo(i < 0 ? lineView.line : lineView.rest[i]); + var ch = map[j] + offset; + if (offset < 0 || curNode != textNode) { + ch = map[j + (offset ? 1 : 0)]; + } + return Pos(line, ch); + } + } + } + } + var found = find(textNode, topNode, offset); + if (found) { + return badPos(found, bad); + } + + // FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems + for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { + found = find(after, after.firstChild, 0); + if (found) { + return badPos(Pos(found.line, found.ch - dist), bad); + } else { + dist += after.textContent.length; + } + } + for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { + found = find(before, before.firstChild, -1); + if (found) { + return badPos(Pos(found.line, found.ch + dist$1), bad); + } else { + dist$1 += before.textContent.length; + } + } + } + + // TEXTAREA INPUT STYLE + + var TextareaInput = function (cm) { + this.cm = cm; + // See input.poll and input.reset + this.prevInput = ""; + + // Flag that indicates whether we expect input to appear real soon + // now (after some event like 'keypress' or 'input') and are + // polling intensively. + this.pollingFast = false; + // Self-resetting timeout for the poller + this.polling = new Delayed(); + // Used to work around IE issue with selection being forgotten when focus moves away from textarea + this.hasSelection = false; + this.composing = null; + }; + TextareaInput.prototype.init = function (display) { + var this$1 = this; + var input = this, + cm = this.cm; + this.createField(display); + var te = this.textarea; + display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); + + // Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore) + if (ios) { + te.style.width = "0px"; + } + on(te, "input", function () { + if (ie && ie_version >= 9 && this$1.hasSelection) { + this$1.hasSelection = null; + } + input.poll(); + }); + on(te, "paste", function (e) { + if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { + return; + } + cm.state.pasteIncoming = +new Date(); + input.fastPoll(); + }); + function prepareCopyCut(e) { + if (signalDOMEvent(cm, e)) { + return; + } + if (cm.somethingSelected()) { + setLastCopied({ + lineWise: false, + text: cm.getSelections() + }); + } else if (!cm.options.lineWiseCopyCut) { + return; + } else { + var ranges = copyableRanges(cm); + setLastCopied({ + lineWise: true, + text: ranges.text + }); + if (e.type == "cut") { + cm.setSelections(ranges.ranges, null, sel_dontScroll); + } else { + input.prevInput = ""; + te.value = ranges.text.join("\n"); + selectInput(te); + } + } + if (e.type == "cut") { + cm.state.cutIncoming = +new Date(); + } + } + on(te, "cut", prepareCopyCut); + on(te, "copy", prepareCopyCut); + on(display.scroller, "paste", function (e) { + if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { + return; + } + if (!te.dispatchEvent) { + cm.state.pasteIncoming = +new Date(); + input.focus(); + return; + } + + // Pass the `paste` event to the textarea so it's handled by its event listener. + var event = new Event("paste"); + event.clipboardData = e.clipboardData; + te.dispatchEvent(event); + }); + + // Prevent normal selection in the editor (we handle our own) + on(display.lineSpace, "selectstart", function (e) { + if (!eventInWidget(display, e)) { + e_preventDefault(e); + } + }); + on(te, "compositionstart", function () { + var start = cm.getCursor("from"); + if (input.composing) { + input.composing.range.clear(); + } + input.composing = { + start: start, + range: cm.markText(start, cm.getCursor("to"), { + className: "CodeMirror-composing" + }) + }; + }); + on(te, "compositionend", function () { + if (input.composing) { + input.poll(); + input.composing.range.clear(); + input.composing = null; + } + }); + }; + TextareaInput.prototype.createField = function (_display) { + // Wraps and hides input textarea + this.wrapper = hiddenTextarea(); + // The semihidden textarea that is focused when the editor is + // focused, and receives input. + this.textarea = this.wrapper.firstChild; + }; + TextareaInput.prototype.screenReaderLabelChanged = function (label) { + // Label for screenreaders, accessibility + if (label) { + this.textarea.setAttribute('aria-label', label); + } else { + this.textarea.removeAttribute('aria-label'); + } + }; + TextareaInput.prototype.prepareSelection = function () { + // Redraw the selection and/or cursor + var cm = this.cm, + display = cm.display, + doc = cm.doc; + var result = prepareSelection(cm); + + // Move the hidden textarea near the cursor to prevent scrolling artifacts + if (cm.options.moveInputWithCursor) { + var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); + var wrapOff = display.wrapper.getBoundingClientRect(), + lineOff = display.lineDiv.getBoundingClientRect(); + result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)); + result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)); + } + return result; + }; + TextareaInput.prototype.showSelection = function (drawn) { + var cm = this.cm, + display = cm.display; + removeChildrenAndAdd(display.cursorDiv, drawn.cursors); + removeChildrenAndAdd(display.selectionDiv, drawn.selection); + if (drawn.teTop != null) { + this.wrapper.style.top = drawn.teTop + "px"; + this.wrapper.style.left = drawn.teLeft + "px"; + } + }; + + // Reset the input to correspond to the selection (or to be empty, + // when not typing and nothing is selected) + TextareaInput.prototype.reset = function (typing) { + if (this.contextMenuPending || this.composing) { + return; + } + var cm = this.cm; + if (cm.somethingSelected()) { + this.prevInput = ""; + var content = cm.getSelection(); + this.textarea.value = content; + if (cm.state.focused) { + selectInput(this.textarea); + } + if (ie && ie_version >= 9) { + this.hasSelection = content; + } + } else if (!typing) { + this.prevInput = this.textarea.value = ""; + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + } + }; + TextareaInput.prototype.getField = function () { + return this.textarea; + }; + TextareaInput.prototype.supportsTouch = function () { + return false; + }; + TextareaInput.prototype.focus = function () { + if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { + try { + this.textarea.focus(); + } catch (e) {} // IE8 will throw if the textarea is display: none or not in DOM + } + }; + TextareaInput.prototype.blur = function () { + this.textarea.blur(); + }; + TextareaInput.prototype.resetPosition = function () { + this.wrapper.style.top = this.wrapper.style.left = 0; + }; + TextareaInput.prototype.receivedFocus = function () { + this.slowPoll(); + }; + + // Poll for input changes, using the normal rate of polling. This + // runs as long as the editor is focused. + TextareaInput.prototype.slowPoll = function () { + var this$1 = this; + if (this.pollingFast) { + return; + } + this.polling.set(this.cm.options.pollInterval, function () { + this$1.poll(); + if (this$1.cm.state.focused) { + this$1.slowPoll(); + } + }); + }; + + // When an event has just come in that is likely to add or change + // something in the input textarea, we poll faster, to ensure that + // the change appears on the screen quickly. + TextareaInput.prototype.fastPoll = function () { + var missed = false, + input = this; + input.pollingFast = true; + function p() { + var changed = input.poll(); + if (!changed && !missed) { + missed = true; + input.polling.set(60, p); + } else { + input.pollingFast = false; + input.slowPoll(); + } + } + input.polling.set(20, p); + }; + + // Read input from the textarea, and update the document to match. + // When something is selected, it is present in the textarea, and + // selected (unless it is huge, in which case a placeholder is + // used). When nothing is selected, the cursor sits after previously + // seen text (can be empty), which is stored in prevInput (we must + // not reset the textarea when typing, because that breaks IME). + TextareaInput.prototype.poll = function () { + var this$1 = this; + var cm = this.cm, + input = this.textarea, + prevInput = this.prevInput; + // Since this is called a *lot*, try to bail out as cheaply as + // possible when it is clear that nothing happened. hasSelection + // will be the case when there is a lot of text in the textarea, + // in which case reading its value would be expensive. + if (this.contextMenuPending || !cm.state.focused || hasSelection(input) && !prevInput && !this.composing || cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) { + return false; + } + var text = input.value; + // If nothing changed, bail. + if (text == prevInput && !cm.somethingSelected()) { + return false; + } + // Work around nonsensical selection resetting in IE9/10, and + // inexplicable appearance of private area unicode characters on + // some key combos in Mac (#2689). + if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { + cm.display.input.reset(); + return false; + } + if (cm.doc.sel == cm.display.selForContextMenu) { + var first = text.charCodeAt(0); + if (first == 0x200b && !prevInput) { + prevInput = "\u200b"; + } + if (first == 0x21da) { + this.reset(); + return this.cm.execCommand("undo"); + } + } + // Find the part of the input that is actually new + var same = 0, + l = Math.min(prevInput.length, text.length); + while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { + ++same; + } + runInOp(cm, function () { + applyTextInput(cm, text.slice(same), prevInput.length - same, null, this$1.composing ? "*compose" : null); + + // Don't leave long text in the textarea, since it makes further polling slow + if (text.length > 1000 || text.indexOf("\n") > -1) { + input.value = this$1.prevInput = ""; + } else { + this$1.prevInput = text; + } + if (this$1.composing) { + this$1.composing.range.clear(); + this$1.composing.range = cm.markText(this$1.composing.start, cm.getCursor("to"), { + className: "CodeMirror-composing" + }); + } + }); + return true; + }; + TextareaInput.prototype.ensurePolled = function () { + if (this.pollingFast && this.poll()) { + this.pollingFast = false; + } + }; + TextareaInput.prototype.onKeyPress = function () { + if (ie && ie_version >= 9) { + this.hasSelection = null; + } + this.fastPoll(); + }; + TextareaInput.prototype.onContextMenu = function (e) { + var input = this, + cm = input.cm, + display = cm.display, + te = input.textarea; + if (input.contextMenuPending) { + input.contextMenuPending(); + } + var pos = posFromMouse(cm, e), + scrollPos = display.scroller.scrollTop; + if (!pos || presto) { + return; + } // Opera is difficult. + + // Reset the current text selection only if the click is done outside of the selection + // and 'resetSelectionOnContextMenu' option is true. + var reset = cm.options.resetSelectionOnContextMenu; + if (reset && cm.doc.sel.contains(pos) == -1) { + operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); + } + var oldCSS = te.style.cssText, + oldWrapperCSS = input.wrapper.style.cssText; + var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); + input.wrapper.style.cssText = "position: static"; + te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; + var oldScrollY; + if (webkit) { + oldScrollY = window.scrollY; + } // Work around Chrome issue (#2712) + display.input.focus(); + if (webkit) { + window.scrollTo(null, oldScrollY); + } + display.input.reset(); + // Adds "Select all" to context menu in FF + if (!cm.somethingSelected()) { + te.value = input.prevInput = " "; + } + input.contextMenuPending = rehide; + display.selForContextMenu = cm.doc.sel; + clearTimeout(display.detectingSelectAll); + + // Select-all will be greyed out if there's nothing to select, so + // this adds a zero-width space so that we can later check whether + // it got selected. + function prepareSelectAllHack() { + if (te.selectionStart != null) { + var selected = cm.somethingSelected(); + var extval = "\u200b" + (selected ? te.value : ""); + te.value = "\u21da"; // Used to catch context-menu undo + te.value = extval; + input.prevInput = selected ? "" : "\u200b"; + te.selectionStart = 1; + te.selectionEnd = extval.length; + // Re-set this, in case some other handler touched the + // selection in the meantime. + display.selForContextMenu = cm.doc.sel; + } + } + function rehide() { + if (input.contextMenuPending != rehide) { + return; + } + input.contextMenuPending = false; + input.wrapper.style.cssText = oldWrapperCSS; + te.style.cssText = oldCSS; + if (ie && ie_version < 9) { + display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); + } + + // Try to detect the user choosing select-all + if (te.selectionStart != null) { + if (!ie || ie && ie_version < 9) { + prepareSelectAllHack(); + } + var i = 0, + poll = function () { + if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "\u200b") { + operation(cm, selectAll)(cm); + } else if (i++ < 10) { + display.detectingSelectAll = setTimeout(poll, 500); + } else { + display.selForContextMenu = null; + display.input.reset(); + } + }; + display.detectingSelectAll = setTimeout(poll, 200); + } + } + if (ie && ie_version >= 9) { + prepareSelectAllHack(); + } + if (captureRightClick) { + e_stop(e); + var mouseup = function () { + off(window, "mouseup", mouseup); + setTimeout(rehide, 20); + }; + on(window, "mouseup", mouseup); + } else { + setTimeout(rehide, 50); + } + }; + TextareaInput.prototype.readOnlyChanged = function (val) { + if (!val) { + this.reset(); + } + this.textarea.disabled = val == "nocursor"; + this.textarea.readOnly = !!val; + }; + TextareaInput.prototype.setUneditable = function () {}; + TextareaInput.prototype.needsContentAttribute = false; + function fromTextArea(textarea, options) { + options = options ? copyObj(options) : {}; + options.value = textarea.value; + if (!options.tabindex && textarea.tabIndex) { + options.tabindex = textarea.tabIndex; + } + if (!options.placeholder && textarea.placeholder) { + options.placeholder = textarea.placeholder; + } + // Set autofocus to true if this textarea is focused, or if it has + // autofocus and no other element is focused. + if (options.autofocus == null) { + var hasFocus = activeElt(); + options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; + } + function save() { + textarea.value = cm.getValue(); + } + var realSubmit; + if (textarea.form) { + on(textarea.form, "submit", save); + // Deplorable hack to make the submit method do the right thing. + if (!options.leaveSubmitMethodAlone) { + var form = textarea.form; + realSubmit = form.submit; + try { + var wrappedSubmit = form.submit = function () { + save(); + form.submit = realSubmit; + form.submit(); + form.submit = wrappedSubmit; + }; + } catch (e) {} + } + } + options.finishInit = function (cm) { + cm.save = save; + cm.getTextArea = function () { + return textarea; + }; + cm.toTextArea = function () { + cm.toTextArea = isNaN; // Prevent this from being ran twice + save(); + textarea.parentNode.removeChild(cm.getWrapperElement()); + textarea.style.display = ""; + if (textarea.form) { + off(textarea.form, "submit", save); + if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") { + textarea.form.submit = realSubmit; + } + } + }; + }; + textarea.style.display = "none"; + var cm = CodeMirror(function (node) { + return textarea.parentNode.insertBefore(node, textarea.nextSibling); + }, options); + return cm; + } + function addLegacyProps(CodeMirror) { + CodeMirror.off = off; + CodeMirror.on = on; + CodeMirror.wheelEventPixels = wheelEventPixels; + CodeMirror.Doc = Doc; + CodeMirror.splitLines = splitLinesAuto; + CodeMirror.countColumn = countColumn; + CodeMirror.findColumn = findColumn; + CodeMirror.isWordChar = isWordCharBasic; + CodeMirror.Pass = Pass; + CodeMirror.signal = signal; + CodeMirror.Line = Line; + CodeMirror.changeEnd = changeEnd; + CodeMirror.scrollbarModel = scrollbarModel; + CodeMirror.Pos = Pos; + CodeMirror.cmpPos = cmp; + CodeMirror.modes = modes; + CodeMirror.mimeModes = mimeModes; + CodeMirror.resolveMode = resolveMode; + CodeMirror.getMode = getMode; + CodeMirror.modeExtensions = modeExtensions; + CodeMirror.extendMode = extendMode; + CodeMirror.copyState = copyState; + CodeMirror.startState = startState; + CodeMirror.innerMode = innerMode; + CodeMirror.commands = commands; + CodeMirror.keyMap = keyMap; + CodeMirror.keyName = keyName; + CodeMirror.isModifierKey = isModifierKey; + CodeMirror.lookupKey = lookupKey; + CodeMirror.normalizeKeyMap = normalizeKeyMap; + CodeMirror.StringStream = StringStream; + CodeMirror.SharedTextMarker = SharedTextMarker; + CodeMirror.TextMarker = TextMarker; + CodeMirror.LineWidget = LineWidget; + CodeMirror.e_preventDefault = e_preventDefault; + CodeMirror.e_stopPropagation = e_stopPropagation; + CodeMirror.e_stop = e_stop; + CodeMirror.addClass = addClass; + CodeMirror.contains = contains; + CodeMirror.rmClass = rmClass; + CodeMirror.keyNames = keyNames; + } + + // EDITOR CONSTRUCTOR + + defineOptions(CodeMirror); + addEditorMethods(CodeMirror); + + // Set up methods on CodeMirror's prototype to redirect to the editor's document. + var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); + for (var prop in Doc.prototype) { + if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) { + CodeMirror.prototype[prop] = function (method) { + return function () { + return method.apply(this.doc, arguments); + }; + }(Doc.prototype[prop]); + } + } + eventMixin(Doc); + CodeMirror.inputStyles = { + "textarea": TextareaInput, + "contenteditable": ContentEditableInput + }; + + // Extra arguments are stored as the mode's dependencies, which is + // used by (legacy) mechanisms like loadmode.js to automatically + // load a mode. (Preferred mechanism is the require/define calls.) + CodeMirror.defineMode = function (name /*, mode, …*/) { + if (!CodeMirror.defaults.mode && name != "null") { + CodeMirror.defaults.mode = name; + } + defineMode.apply(this, arguments); + }; + CodeMirror.defineMIME = defineMIME; + + // Minimal default mode. + CodeMirror.defineMode("null", function () { + return { + token: function (stream) { + return stream.skipToEnd(); + } + }; + }); + CodeMirror.defineMIME("text/plain", "null"); + + // EXTENSIONS + + CodeMirror.defineExtension = function (name, func) { + CodeMirror.prototype[name] = func; + }; + CodeMirror.defineDocExtension = function (name, func) { + Doc.prototype[name] = func; + }; + CodeMirror.fromTextArea = fromTextArea; + addLegacyProps(CodeMirror); + CodeMirror.version = "5.65.3"; + return CodeMirror; +}); + +/***/ }), + +/***/ "../../../node_modules/codemirror/mode/javascript/javascript.js": +/*!**********************************************************************!*\ + !*** ../../../node_modules/codemirror/mode/javascript/javascript.js ***! + \**********************************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +// CodeMirror, copyright (c) by Marijn Haverbeke and others +// Distributed under an MIT license: https://codemirror.net/LICENSE + +(function (mod) { + if (true) + // CommonJS + mod(__webpack_require__(/*! ../../lib/codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"));else {} +})(function (CodeMirror) { + "use strict"; + + CodeMirror.defineMode("javascript", function (config, parserConfig) { + var indentUnit = config.indentUnit; + var statementIndent = parserConfig.statementIndent; + var jsonldMode = parserConfig.jsonld; + var jsonMode = parserConfig.json || jsonldMode; + var trackScope = parserConfig.trackScope !== false; + var isTS = parserConfig.typescript; + var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; + + // Tokenizer + + var keywords = function () { + function kw(type) { + return { + type: type, + style: "keyword" + }; + } + var A = kw("keyword a"), + B = kw("keyword b"), + C = kw("keyword c"), + D = kw("keyword d"); + var operator = kw("operator"), + atom = { + type: "atom", + style: "atom" + }; + return { + "if": kw("if"), + "while": A, + "with": A, + "else": B, + "do": B, + "try": B, + "finally": B, + "return": D, + "break": D, + "continue": D, + "new": kw("new"), + "delete": C, + "void": C, + "throw": C, + "debugger": kw("debugger"), + "var": kw("var"), + "const": kw("var"), + "let": kw("var"), + "function": kw("function"), + "catch": kw("catch"), + "for": kw("for"), + "switch": kw("switch"), + "case": kw("case"), + "default": kw("default"), + "in": operator, + "typeof": operator, + "instanceof": operator, + "true": atom, + "false": atom, + "null": atom, + "undefined": atom, + "NaN": atom, + "Infinity": atom, + "this": kw("this"), + "class": kw("class"), + "super": kw("atom"), + "yield": C, + "export": kw("export"), + "import": kw("import"), + "extends": C, + "await": C + }; + }(); + var isOperatorChar = /[+\-*&%=<>!?|~^@]/; + var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; + function readRegexp(stream) { + var escaped = false, + next, + inSet = false; + while ((next = stream.next()) != null) { + if (!escaped) { + if (next == "/" && !inSet) return; + if (next == "[") inSet = true;else if (inSet && next == "]") inSet = false; + } + escaped = !escaped && next == "\\"; + } + } + + // Used as scratch variables to communicate multiple values without + // consing up tons of objects. + var type, content; + function ret(tp, style, cont) { + type = tp; + content = cont; + return style; + } + function tokenBase(stream, state) { + var ch = stream.next(); + if (ch == '"' || ch == "'") { + state.tokenize = tokenString(ch); + return state.tokenize(stream, state); + } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { + return ret("number", "number"); + } else if (ch == "." && stream.match("..")) { + return ret("spread", "meta"); + } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { + return ret(ch); + } else if (ch == "=" && stream.eat(">")) { + return ret("=>", "operator"); + } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { + return ret("number", "number"); + } else if (/\d/.test(ch)) { + stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); + return ret("number", "number"); + } else if (ch == "/") { + if (stream.eat("*")) { + state.tokenize = tokenComment; + return tokenComment(stream, state); + } else if (stream.eat("/")) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (expressionAllowed(stream, state, 1)) { + readRegexp(stream); + stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); + return ret("regexp", "string-2"); + } else { + stream.eat("="); + return ret("operator", "operator", stream.current()); + } + } else if (ch == "`") { + state.tokenize = tokenQuasi; + return tokenQuasi(stream, state); + } else if (ch == "#" && stream.peek() == "!") { + stream.skipToEnd(); + return ret("meta", "meta"); + } else if (ch == "#" && stream.eatWhile(wordRE)) { + return ret("variable", "property"); + } else if (ch == "<" && stream.match("!--") || ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start))) { + stream.skipToEnd(); + return ret("comment", "comment"); + } else if (isOperatorChar.test(ch)) { + if (ch != ">" || !state.lexical || state.lexical.type != ">") { + if (stream.eat("=")) { + if (ch == "!" || ch == "=") stream.eat("="); + } else if (/[<>*+\-|&?]/.test(ch)) { + stream.eat(ch); + if (ch == ">") stream.eat(ch); + } + } + if (ch == "?" && stream.eat(".")) return ret("."); + return ret("operator", "operator", stream.current()); + } else if (wordRE.test(ch)) { + stream.eatWhile(wordRE); + var word = stream.current(); + if (state.lastType != ".") { + if (keywords.propertyIsEnumerable(word)) { + var kw = keywords[word]; + return ret(kw.type, kw.style, word); + } + if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) return ret("async", "keyword", word); + } + return ret("variable", "variable", word); + } + } + function tokenString(quote) { + return function (stream, state) { + var escaped = false, + next; + if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)) { + state.tokenize = tokenBase; + return ret("jsonld-keyword", "meta"); + } + while ((next = stream.next()) != null) { + if (next == quote && !escaped) break; + escaped = !escaped && next == "\\"; + } + if (!escaped) state.tokenize = tokenBase; + return ret("string", "string"); + }; + } + function tokenComment(stream, state) { + var maybeEnd = false, + ch; + while (ch = stream.next()) { + if (ch == "/" && maybeEnd) { + state.tokenize = tokenBase; + break; + } + maybeEnd = ch == "*"; + } + return ret("comment", "comment"); + } + function tokenQuasi(stream, state) { + var escaped = false, + next; + while ((next = stream.next()) != null) { + if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { + state.tokenize = tokenBase; + break; + } + escaped = !escaped && next == "\\"; + } + return ret("quasi", "string-2", stream.current()); + } + var brackets = "([{}])"; + // This is a crude lookahead trick to try and notice that we're + // parsing the argument patterns for a fat-arrow function before we + // actually hit the arrow token. It only works if the arrow is on + // the same line as the arguments and there's no strange noise + // (comments) in between. Fallback is to only notice when we hit the + // arrow, and not declare the arguments as locals for the arrow + // body. + function findFatArrow(stream, state) { + if (state.fatArrowAt) state.fatArrowAt = null; + var arrow = stream.string.indexOf("=>", stream.start); + if (arrow < 0) return; + if (isTS) { + // Try to skip TypeScript return type declarations after the arguments + var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)); + if (m) arrow = m.index; + } + var depth = 0, + sawSomething = false; + for (var pos = arrow - 1; pos >= 0; --pos) { + var ch = stream.string.charAt(pos); + var bracket = brackets.indexOf(ch); + if (bracket >= 0 && bracket < 3) { + if (!depth) { + ++pos; + break; + } + if (--depth == 0) { + if (ch == "(") sawSomething = true; + break; + } + } else if (bracket >= 3 && bracket < 6) { + ++depth; + } else if (wordRE.test(ch)) { + sawSomething = true; + } else if (/["'\/`]/.test(ch)) { + for (;; --pos) { + if (pos == 0) return; + var next = stream.string.charAt(pos - 1); + if (next == ch && stream.string.charAt(pos - 2) != "\\") { + pos--; + break; + } + } + } else if (sawSomething && !depth) { + ++pos; + break; + } + } + if (sawSomething && !depth) state.fatArrowAt = pos; + } + + // Parser + + var atomicTypes = { + "atom": true, + "number": true, + "variable": true, + "string": true, + "regexp": true, + "this": true, + "import": true, + "jsonld-keyword": true + }; + function JSLexical(indented, column, type, align, prev, info) { + this.indented = indented; + this.column = column; + this.type = type; + this.prev = prev; + this.info = info; + if (align != null) this.align = align; + } + function inScope(state, varname) { + if (!trackScope) return false; + for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; + for (var cx = state.context; cx; cx = cx.prev) { + for (var v = cx.vars; v; v = v.next) if (v.name == varname) return true; + } + } + function parseJS(state, style, type, content, stream) { + var cc = state.cc; + // Communicate our context to the combinators. + // (Less wasteful than consing up a hundred closures on every call.) + cx.state = state; + cx.stream = stream; + cx.marked = null, cx.cc = cc; + cx.style = style; + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; + while (true) { + var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; + if (combinator(type, content)) { + while (cc.length && cc[cc.length - 1].lex) cc.pop()(); + if (cx.marked) return cx.marked; + if (type == "variable" && inScope(state, content)) return "variable-2"; + return style; + } + } + } + + // Combinator utils + + var cx = { + state: null, + column: null, + marked: null, + cc: null + }; + function pass() { + for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); + } + function cont() { + pass.apply(null, arguments); + return true; + } + function inList(name, list) { + for (var v = list; v; v = v.next) if (v.name == name) return true; + return false; + } + function register(varname) { + var state = cx.state; + cx.marked = "def"; + if (!trackScope) return; + if (state.context) { + if (state.lexical.info == "var" && state.context && state.context.block) { + // FIXME function decls are also not block scoped + var newContext = registerVarScoped(varname, state.context); + if (newContext != null) { + state.context = newContext; + return; + } + } else if (!inList(varname, state.localVars)) { + state.localVars = new Var(varname, state.localVars); + return; + } + } + // Fall through means this is global + if (parserConfig.globalVars && !inList(varname, state.globalVars)) state.globalVars = new Var(varname, state.globalVars); + } + function registerVarScoped(varname, context) { + if (!context) { + return null; + } else if (context.block) { + var inner = registerVarScoped(varname, context.prev); + if (!inner) return null; + if (inner == context.prev) return context; + return new Context(inner, context.vars, true); + } else if (inList(varname, context.vars)) { + return context; + } else { + return new Context(context.prev, new Var(varname, context.vars), false); + } + } + function isModifier(name) { + return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly"; + } + + // Combinators + + function Context(prev, vars, block) { + this.prev = prev; + this.vars = vars; + this.block = block; + } + function Var(name, next) { + this.name = name; + this.next = next; + } + var defaultVars = new Var("this", new Var("arguments", null)); + function pushcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, false); + cx.state.localVars = defaultVars; + } + function pushblockcontext() { + cx.state.context = new Context(cx.state.context, cx.state.localVars, true); + cx.state.localVars = null; + } + pushcontext.lex = pushblockcontext.lex = true; + function popcontext() { + cx.state.localVars = cx.state.context.vars; + cx.state.context = cx.state.context.prev; + } + popcontext.lex = true; + function pushlex(type, info) { + var result = function () { + var state = cx.state, + indent = state.indented; + if (state.lexical.type == "stat") indent = state.lexical.indented;else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) indent = outer.indented; + state.lexical = new JSLexical(indent, cx.stream.column(), type, null, state.lexical, info); + }; + result.lex = true; + return result; + } + function poplex() { + var state = cx.state; + if (state.lexical.prev) { + if (state.lexical.type == ")") state.indented = state.lexical.indented; + state.lexical = state.lexical.prev; + } + } + poplex.lex = true; + function expect(wanted) { + function exp(type) { + if (type == wanted) return cont();else if (wanted == ";" || type == "}" || type == ")" || type == "]") return pass();else return cont(exp); + } + ; + return exp; + } + function statement(type, value) { + if (type == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); + if (type == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); + if (type == "keyword b") return cont(pushlex("form"), statement, poplex); + if (type == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); + if (type == "debugger") return cont(expect(";")); + if (type == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); + if (type == ";") return cont(); + if (type == "if") { + if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) cx.state.cc.pop()(); + return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); + } + if (type == "function") return cont(functiondef); + if (type == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); + if (type == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form", type == "class" ? type : value), className, poplex); + } + if (type == "variable") { + if (isTS && value == "declare") { + cx.marked = "keyword"; + return cont(statement); + } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { + cx.marked = "keyword"; + if (value == "enum") return cont(enumdef);else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";"));else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex); + } else if (isTS && value == "namespace") { + cx.marked = "keyword"; + return cont(pushlex("form"), expression, statement, poplex); + } else if (isTS && value == "abstract") { + cx.marked = "keyword"; + return cont(statement); + } else { + return cont(pushlex("stat"), maybelabel); + } + } + if (type == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, block, poplex, poplex, popcontext); + if (type == "case") return cont(expression, expect(":")); + if (type == "default") return cont(expect(":")); + if (type == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); + if (type == "export") return cont(pushlex("stat"), afterExport, poplex); + if (type == "import") return cont(pushlex("stat"), afterImport, poplex); + if (type == "async") return cont(statement); + if (value == "@") return cont(expression, statement); + return pass(pushlex("stat"), expression, expect(";"), poplex); + } + function maybeCatchBinding(type) { + if (type == "(") return cont(funarg, expect(")")); + } + function expression(type, value) { + return expressionInner(type, value, false); + } + function expressionNoComma(type, value) { + return expressionInner(type, value, true); + } + function parenExpr(type) { + if (type != "(") return pass(); + return cont(pushlex(")"), maybeexpression, expect(")"), poplex); + } + function expressionInner(type, value, noComma) { + if (cx.state.fatArrowAt == cx.stream.start) { + var body = noComma ? arrowBodyNoComma : arrowBody; + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext);else if (type == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); + } + var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; + if (atomicTypes.hasOwnProperty(type)) return cont(maybeop); + if (type == "function") return cont(functiondef, maybeop); + if (type == "class" || isTS && value == "interface") { + cx.marked = "keyword"; + return cont(pushlex("form"), classExpression, poplex); + } + if (type == "keyword c" || type == "async") return cont(noComma ? expressionNoComma : expression); + if (type == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); + if (type == "operator" || type == "spread") return cont(noComma ? expressionNoComma : expression); + if (type == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); + if (type == "{") return contCommasep(objprop, "}", null, maybeop); + if (type == "quasi") return pass(quasi, maybeop); + if (type == "new") return cont(maybeTarget(noComma)); + return cont(); + } + function maybeexpression(type) { + if (type.match(/[;\}\)\],]/)) return pass(); + return pass(expression); + } + function maybeoperatorComma(type, value) { + if (type == ",") return cont(maybeexpression); + return maybeoperatorNoComma(type, value, false); + } + function maybeoperatorNoComma(type, value, noComma) { + var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; + var expr = noComma == false ? expression : expressionNoComma; + if (type == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); + if (type == "operator") { + if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); + if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); + if (value == "?") return cont(expression, expect(":"), expr); + return cont(expr); + } + if (type == "quasi") { + return pass(quasi, me); + } + if (type == ";") return; + if (type == "(") return contCommasep(expressionNoComma, ")", "call", me); + if (type == ".") return cont(property, me); + if (type == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); + if (isTS && value == "as") { + cx.marked = "keyword"; + return cont(typeexpr, me); + } + if (type == "regexp") { + cx.state.lastType = cx.marked = "operator"; + cx.stream.backUp(cx.stream.pos - cx.stream.start - 1); + return cont(expr); + } + } + function quasi(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasi); + return cont(maybeexpression, continueQuasi); + } + function continueQuasi(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasi); + } + } + function arrowBody(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expression); + } + function arrowBodyNoComma(type) { + findFatArrow(cx.stream, cx.state); + return pass(type == "{" ? statement : expressionNoComma); + } + function maybeTarget(noComma) { + return function (type) { + if (type == ".") return cont(noComma ? targetNoComma : target);else if (type == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma);else return pass(noComma ? expressionNoComma : expression); + }; + } + function target(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorComma); + } + } + function targetNoComma(_, value) { + if (value == "target") { + cx.marked = "keyword"; + return cont(maybeoperatorNoComma); + } + } + function maybelabel(type) { + if (type == ":") return cont(poplex, statement); + return pass(maybeoperatorComma, expect(";"), poplex); + } + function property(type) { + if (type == "variable") { + cx.marked = "property"; + return cont(); + } + } + function objprop(type, value) { + if (type == "async") { + cx.marked = "property"; + return cont(objprop); + } else if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + if (value == "get" || value == "set") return cont(getterSetter); + var m; // Work around fat-arrow-detection complication for detecting typescript typed arrow params + if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) cx.state.fatArrowAt = cx.stream.pos + m[0].length; + return cont(afterprop); + } else if (type == "number" || type == "string") { + cx.marked = jsonldMode ? "property" : cx.style + " property"; + return cont(afterprop); + } else if (type == "jsonld-keyword") { + return cont(afterprop); + } else if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(objprop); + } else if (type == "[") { + return cont(expression, maybetype, expect("]"), afterprop); + } else if (type == "spread") { + return cont(expressionNoComma, afterprop); + } else if (value == "*") { + cx.marked = "keyword"; + return cont(objprop); + } else if (type == ":") { + return pass(afterprop); + } + } + function getterSetter(type) { + if (type != "variable") return pass(afterprop); + cx.marked = "property"; + return cont(functiondef); + } + function afterprop(type) { + if (type == ":") return cont(expressionNoComma); + if (type == "(") return pass(functiondef); + } + function commasep(what, end, sep) { + function proceed(type, value) { + if (sep ? sep.indexOf(type) > -1 : type == ",") { + var lex = cx.state.lexical; + if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; + return cont(function (type, value) { + if (type == end || value == end) return pass(); + return pass(what); + }, proceed); + } + if (type == end || value == end) return cont(); + if (sep && sep.indexOf(";") > -1) return pass(what); + return cont(expect(end)); + } + return function (type, value) { + if (type == end || value == end) return cont(); + return pass(what, proceed); + }; + } + function contCommasep(what, end, info) { + for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); + return cont(pushlex(end, info), commasep(what, end), poplex); + } + function block(type) { + if (type == "}") return cont(); + return pass(statement, block); + } + function maybetype(type, value) { + if (isTS) { + if (type == ":") return cont(typeexpr); + if (value == "?") return cont(maybetype); + } + } + function maybetypeOrIn(type, value) { + if (isTS && (type == ":" || value == "in")) return cont(typeexpr); + } + function mayberettype(type) { + if (isTS && type == ":") { + if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr);else return cont(typeexpr); + } + } + function isKW(_, value) { + if (value == "is") { + cx.marked = "keyword"; + return cont(); + } + } + function typeexpr(type, value) { + if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { + cx.marked = "keyword"; + return cont(value == "typeof" ? expressionNoComma : typeexpr); + } + if (type == "variable" || value == "void") { + cx.marked = "type"; + return cont(afterType); + } + if (value == "|" || value == "&") return cont(typeexpr); + if (type == "string" || type == "number" || type == "atom") return cont(afterType); + if (type == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType); + if (type == "{") return cont(pushlex("}"), typeprops, poplex, afterType); + if (type == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType); + if (type == "<") return cont(commasep(typeexpr, ">"), typeexpr); + if (type == "quasi") { + return pass(quasiType, afterType); + } + } + function maybeReturnType(type) { + if (type == "=>") return cont(typeexpr); + } + function typeprops(type) { + if (type.match(/[\}\)\]]/)) return cont(); + if (type == "," || type == ";") return cont(typeprops); + return pass(typeprop, typeprops); + } + function typeprop(type, value) { + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(typeprop); + } else if (value == "?" || type == "number" || type == "string") { + return cont(typeprop); + } else if (type == ":") { + return cont(typeexpr); + } else if (type == "[") { + return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop); + } else if (type == "(") { + return pass(functiondecl, typeprop); + } else if (!type.match(/[;\}\)\],]/)) { + return cont(); + } + } + function quasiType(type, value) { + if (type != "quasi") return pass(); + if (value.slice(value.length - 2) != "${") return cont(quasiType); + return cont(typeexpr, continueQuasiType); + } + function continueQuasiType(type) { + if (type == "}") { + cx.marked = "string-2"; + cx.state.tokenize = tokenQuasi; + return cont(quasiType); + } + } + function typearg(type, value) { + if (type == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg); + if (type == ":") return cont(typeexpr); + if (type == "spread") return cont(typearg); + return pass(typeexpr); + } + function afterType(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + if (value == "|" || type == "." || value == "&") return cont(typeexpr); + if (type == "[") return cont(typeexpr, expect("]"), afterType); + if (value == "extends" || value == "implements") { + cx.marked = "keyword"; + return cont(typeexpr); + } + if (value == "?") return cont(typeexpr, expect(":"), typeexpr); + } + function maybeTypeArgs(_, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); + } + function typeparam() { + return pass(typeexpr, maybeTypeDefault); + } + function maybeTypeDefault(_, value) { + if (value == "=") return cont(typeexpr); + } + function vardef(_, value) { + if (value == "enum") { + cx.marked = "keyword"; + return cont(enumdef); + } + return pass(pattern, maybetype, maybeAssign, vardefCont); + } + function pattern(type, value) { + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(pattern); + } + if (type == "variable") { + register(value); + return cont(); + } + if (type == "spread") return cont(pattern); + if (type == "[") return contCommasep(eltpattern, "]"); + if (type == "{") return contCommasep(proppattern, "}"); + } + function proppattern(type, value) { + if (type == "variable" && !cx.stream.match(/^\s*:/, false)) { + register(value); + return cont(maybeAssign); + } + if (type == "variable") cx.marked = "property"; + if (type == "spread") return cont(pattern); + if (type == "}") return pass(); + if (type == "[") return cont(expression, expect(']'), expect(':'), proppattern); + return cont(expect(":"), pattern, maybeAssign); + } + function eltpattern() { + return pass(pattern, maybeAssign); + } + function maybeAssign(_type, value) { + if (value == "=") return cont(expressionNoComma); + } + function vardefCont(type) { + if (type == ",") return cont(vardef); + } + function maybeelse(type, value) { + if (type == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); + } + function forspec(type, value) { + if (value == "await") return cont(forspec); + if (type == "(") return cont(pushlex(")"), forspec1, poplex); + } + function forspec1(type) { + if (type == "var") return cont(vardef, forspec2); + if (type == "variable") return cont(forspec2); + return pass(forspec2); + } + function forspec2(type, value) { + if (type == ")") return cont(); + if (type == ";") return cont(forspec2); + if (value == "in" || value == "of") { + cx.marked = "keyword"; + return cont(expression, forspec2); + } + return pass(expression, forspec2); + } + function functiondef(type, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondef); + } + if (type == "variable") { + register(value); + return cont(functiondef); + } + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef); + } + function functiondecl(type, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(functiondecl); + } + if (type == "variable") { + register(value); + return cont(functiondecl); + } + if (type == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); + if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl); + } + function typename(type, value) { + if (type == "keyword" || type == "variable") { + cx.marked = "type"; + return cont(typename); + } else if (value == "<") { + return cont(pushlex(">"), commasep(typeparam, ">"), poplex); + } + } + function funarg(type, value) { + if (value == "@") cont(expression, funarg); + if (type == "spread") return cont(funarg); + if (isTS && isModifier(value)) { + cx.marked = "keyword"; + return cont(funarg); + } + if (isTS && type == "this") return cont(maybetype, maybeAssign); + return pass(pattern, maybetype, maybeAssign); + } + function classExpression(type, value) { + // Class expressions may have an optional name. + if (type == "variable") return className(type, value); + return classNameAfter(type, value); + } + function className(type, value) { + if (type == "variable") { + register(value); + return cont(classNameAfter); + } + } + function classNameAfter(type, value) { + if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter); + if (value == "extends" || value == "implements" || isTS && type == ",") { + if (value == "implements") cx.marked = "keyword"; + return cont(isTS ? typeexpr : expression, classNameAfter); + } + if (type == "{") return cont(pushlex("}"), classBody, poplex); + } + function classBody(type, value) { + if (type == "async" || type == "variable" && (value == "static" || value == "get" || value == "set" || isTS && isModifier(value)) && cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { + cx.marked = "keyword"; + return cont(classBody); + } + if (type == "variable" || cx.style == "keyword") { + cx.marked = "property"; + return cont(classfield, classBody); + } + if (type == "number" || type == "string") return cont(classfield, classBody); + if (type == "[") return cont(expression, maybetype, expect("]"), classfield, classBody); + if (value == "*") { + cx.marked = "keyword"; + return cont(classBody); + } + if (isTS && type == "(") return pass(functiondecl, classBody); + if (type == ";" || type == ",") return cont(classBody); + if (type == "}") return cont(); + if (value == "@") return cont(expression, classBody); + } + function classfield(type, value) { + if (value == "!") return cont(classfield); + if (value == "?") return cont(classfield); + if (type == ":") return cont(typeexpr, maybeAssign); + if (value == "=") return cont(expressionNoComma); + var context = cx.state.lexical.prev, + isInterface = context && context.info == "interface"; + return pass(isInterface ? functiondecl : functiondef); + } + function afterExport(type, value) { + if (value == "*") { + cx.marked = "keyword"; + return cont(maybeFrom, expect(";")); + } + if (value == "default") { + cx.marked = "keyword"; + return cont(expression, expect(";")); + } + if (type == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); + return pass(statement); + } + function exportField(type, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(expect("variable")); + } + if (type == "variable") return pass(expressionNoComma, exportField); + } + function afterImport(type) { + if (type == "string") return cont(); + if (type == "(") return pass(expression); + if (type == ".") return pass(maybeoperatorComma); + return pass(importSpec, maybeMoreImports, maybeFrom); + } + function importSpec(type, value) { + if (type == "{") return contCommasep(importSpec, "}"); + if (type == "variable") register(value); + if (value == "*") cx.marked = "keyword"; + return cont(maybeAs); + } + function maybeMoreImports(type) { + if (type == ",") return cont(importSpec, maybeMoreImports); + } + function maybeAs(_type, value) { + if (value == "as") { + cx.marked = "keyword"; + return cont(importSpec); + } + } + function maybeFrom(_type, value) { + if (value == "from") { + cx.marked = "keyword"; + return cont(expression); + } + } + function arrayLiteral(type) { + if (type == "]") return cont(); + return pass(commasep(expressionNoComma, "]")); + } + function enumdef() { + return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex); + } + function enummember() { + return pass(pattern, maybeAssign); + } + function isContinuedStatement(state, textAfter) { + return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); + } + function expressionAllowed(stream, state, backUp) { + return state.tokenize == tokenBase && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))); + } + + // Interface + + return { + startState: function (basecolumn) { + var state = { + tokenize: tokenBase, + lastType: "sof", + cc: [], + lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), + localVars: parserConfig.localVars, + context: parserConfig.localVars && new Context(null, null, false), + indented: basecolumn || 0 + }; + if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; + return state; + }, + token: function (stream, state) { + if (stream.sol()) { + if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; + state.indented = stream.indentation(); + findFatArrow(stream, state); + } + if (state.tokenize != tokenComment && stream.eatSpace()) return null; + var style = state.tokenize(stream, state); + if (type == "comment") return style; + state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; + return parseJS(state, style, type, content, stream); + }, + indent: function (state, textAfter) { + if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; + if (state.tokenize != tokenBase) return 0; + var firstChar = textAfter && textAfter.charAt(0), + lexical = state.lexical, + top; + // Kludge to prevent 'maybelse' from blocking lexical scope pops + if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { + var c = state.cc[i]; + if (c == poplex) lexical = lexical.prev;else if (c != maybeelse && c != popcontext) break; + } + while ((lexical.type == "stat" || lexical.type == "form") && (firstChar == "}" || (top = state.cc[state.cc.length - 1]) && (top == maybeoperatorComma || top == maybeoperatorNoComma) && !/^[,\.=+\-*:?[\(]/.test(textAfter))) lexical = lexical.prev; + if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; + var type = lexical.type, + closing = firstChar == type; + if (type == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0);else if (type == "form" && firstChar == "{") return lexical.indented;else if (type == "form") return lexical.indented + indentUnit;else if (type == "stat") return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);else if (lexical.align) return lexical.column + (closing ? 0 : 1);else return lexical.indented + (closing ? 0 : indentUnit); + }, + electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, + blockCommentStart: jsonMode ? null : "/*", + blockCommentEnd: jsonMode ? null : "*/", + blockCommentContinue: jsonMode ? null : " * ", + lineComment: jsonMode ? null : "//", + fold: "brace", + closeBrackets: "()[]{}''\"\"``", + helperType: jsonMode ? "json" : "javascript", + jsonldMode: jsonldMode, + jsonMode: jsonMode, + expressionAllowed: expressionAllowed, + skipExpression: function (state) { + parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)); + } + }; + }); + CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); + CodeMirror.defineMIME("text/javascript", "javascript"); + CodeMirror.defineMIME("text/ecmascript", "javascript"); + CodeMirror.defineMIME("application/javascript", "javascript"); + CodeMirror.defineMIME("application/x-javascript", "javascript"); + CodeMirror.defineMIME("application/ecmascript", "javascript"); + CodeMirror.defineMIME("application/json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/x-json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/manifest+json", { + name: "javascript", + json: true + }); + CodeMirror.defineMIME("application/ld+json", { + name: "javascript", + jsonld: true + }); + CodeMirror.defineMIME("text/typescript", { + name: "javascript", + typescript: true + }); + CodeMirror.defineMIME("application/typescript", { + name: "javascript", + typescript: true + }); +}); + +/***/ }), + /***/ "../../../node_modules/copy-to-clipboard/index.js": /*!********************************************************!*\ !*** ../../../node_modules/copy-to-clipboard/index.js ***! \********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var deselectCurrent = __webpack_require__(/*! toggle-selection */ "../../../node_modules/toggle-selection/index.js"); @@ -11488,6 +28739,7 @@ module.exports = copy; \***********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -11504,6 +28756,7 @@ const isNode = exports.isNode = false; \****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) { @@ -12065,6 +29318,7 @@ exports.decodeXML = decodeXML; \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; // Adapted from https://github.com/mathiasbynens/he/blob/36afe179392226cf1b6ccdb16ebbb7a5a844d93a/src/he.js#L106-L134 @@ -12124,6 +29378,7 @@ exports["default"] = decodeCodePoint; \****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __importDefault = void 0 && (void 0).__importDefault || function (mod) { @@ -12209,6 +29464,7 @@ function encodeHTMLTrieRe(regExp, str) { \****************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -12322,6 +29578,7 @@ exports.escapeText = getEscaper(/[&<>\u00A0]/g, new Map([[38, "&"], [60, "&l \************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; // Generated using scripts/write-decode-map.ts @@ -12342,6 +29599,7 @@ exports["default"] = new Uint16Array( \***********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; // Generated using scripts/write-decode-map.ts @@ -12362,6 +29620,7 @@ exports["default"] = new Uint16Array( \*******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; // Generated using scripts/write-encode-map.ts @@ -12636,6 +29895,7 @@ exports["default"] = new Map( /* #__PURE__ */restoreDiff([[9, " "], [0, "&Ne \***************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -12880,6 +30140,7 @@ Object.defineProperty(exports, "decodeXMLStrict", ({ \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -21547,6 +38808,7 @@ exports.wrapHandler = wrapHandler; \*************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -21667,6 +38929,7 @@ exports.getFrameData = getFrameData; \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -21697,6 +38960,7 @@ exports.getNonce = getNonce; \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; /*! @@ -21799,6 +39063,7 @@ function isValidObject(val) { \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -22367,6 +39632,7 @@ function isWebSocket(val) { \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -22568,6 +39834,7 @@ function stringifyMessage(msg, replacer) { \*****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; var __createBinding = void 0 && (void 0).__createBinding || (Object.create ? function (o, m, k, k2) { @@ -22604,6 +39871,7 @@ __exportStar(__webpack_require__(/*! ./common */ "../../../node_modules/graphql- \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -22917,6 +40185,7 @@ function handleProtocols(protocols) { \******************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -22980,6 +40249,7 @@ function limitCloseReason(reason, whenTooLong) { \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -23195,6 +40465,7 @@ function formatError(error) { \*****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -23242,6 +40513,7 @@ var _locatedError = __webpack_require__(/*! ./locatedError.mjs */ "../../../node \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -23283,6 +40555,7 @@ function isLocatedGraphQLError(error) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -23310,6 +40583,7 @@ function syntaxError(source, position, description) { \*****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -23450,6 +40724,7 @@ function getFieldEntryKey(node) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24127,6 +41402,7 @@ function getFieldDef(schema, parentType, fieldNode) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24205,6 +41481,7 @@ var _values = __webpack_require__(/*! ./values.mjs */ "../../../node_modules/gra \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24271,6 +41548,7 @@ function mapAsyncIterator(iterable, callback) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24470,6 +41748,7 @@ async function executeSubscription(exeContext) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24661,6 +41940,7 @@ function hasOwnProperty(obj, prop) { \*************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -24790,6 +42070,7 @@ function graphqlImpl(args) { \***********************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26078,6 +43359,7 @@ var _index6 = __webpack_require__(/*! ./utilities/index.mjs */ "../../../node_mo \******************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26117,6 +43399,7 @@ function pathToArray(path) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26138,6 +43421,7 @@ function devAssert(condition, message) { \************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26177,6 +43461,7 @@ function didYouMean(firstArg, secondArg) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26208,6 +43493,7 @@ function groupBy(list, keyFn) { \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26229,6 +43515,7 @@ function identityFunc(x) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26328,6 +43615,7 @@ function getObjectTag(object) { \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26391,6 +43679,7 @@ spurious results.`); \***********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26412,6 +43701,7 @@ function invariant(condition, message) { \*****************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26434,6 +43724,7 @@ function isAsyncIterable(maybeAsyncIterable) { \******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26469,6 +43760,7 @@ function isIterableObject(maybeIterable) { \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26491,6 +43783,7 @@ function isObjectLike(value) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26513,6 +43806,7 @@ function isPromise(value) { \********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26562,6 +43856,7 @@ function keyMap(list, keyFn) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26601,6 +43896,7 @@ function keyValMap(list, keyFn, valFn) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26627,6 +43923,7 @@ function mapValue(map, fn) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26669,6 +43966,7 @@ function memoize3(fn) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26734,6 +44032,7 @@ function isDigit(code) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26755,6 +44054,7 @@ function printPathArray(path) { \******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26786,6 +44086,7 @@ function promiseForObject(object) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26816,6 +44117,7 @@ function promiseReduce(values, callbackFn, initialValue) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26938,6 +44240,7 @@ function stringToArray(str) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26968,6 +44271,7 @@ class NonErrorThrown extends Error { \**********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -26996,6 +44300,7 @@ function toObjMap(obj) { \******************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27186,6 +44491,7 @@ var OperationTypeNode; \**************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27341,6 +44647,7 @@ function printBlockString(value, options) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27424,6 +44731,7 @@ function isNameContinue(code) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27470,6 +44778,7 @@ var DirectiveLocation; \********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27682,6 +44991,7 @@ var _directiveLocation = __webpack_require__(/*! ./directiveLocation.mjs */ "../ \********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -27752,6 +45062,7 @@ var Kind; \********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -28480,6 +45791,7 @@ function readName(lexer, start) { \***********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -28521,6 +45833,7 @@ function getLocation(source, position) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -29871,6 +47184,7 @@ function getTokenKindDesc(kind) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -29926,6 +47240,7 @@ function isTypeExtensionNode(node) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -29983,6 +47298,7 @@ function printPrefixedLines(lines) { \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30022,6 +47338,7 @@ const escapeSequences = ['\\u0000', '\\u0001', '\\u0002', '\\u0003', '\\u0004', \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30380,6 +47697,7 @@ function hasMultilineItems(maybeArray) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30431,6 +47749,7 @@ function isSource(source) { \************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30481,6 +47800,7 @@ var TokenKind; \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30807,6 +48127,7 @@ function getVisitFn(visitor, kind, isLeaving) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -30858,6 +48179,7 @@ function assertEnumValueName(name) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -31823,6 +49145,7 @@ function isRequiredInputField(field) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -32000,6 +49323,7 @@ function isSpecifiedDirective(directive) { \****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -32555,6 +49879,7 @@ var _assertName = __webpack_require__(/*! ./assertName.mjs */ "../../../node_mod \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -33073,6 +50398,7 @@ function isIntrospectionType(type) { \******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -33297,6 +50623,7 @@ function serializeObject(outputValue) { \*****************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -33617,6 +50944,7 @@ function collectReferencedTypes(type, typeSet) { \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34024,6 +51352,7 @@ function getDeprecatedDirectiveNode(definitionNode) { \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34322,6 +51651,7 @@ function visitWithTypeInfo(typeInfo, visitor) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34372,6 +51702,7 @@ function isValidNameError(name) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34537,6 +51868,7 @@ const integerStringRegExp = /^-?(?:0|[1-9][0-9]*)$/; \******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34628,6 +51960,7 @@ function buildSchema(source, options) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -34888,6 +52221,7 @@ function buildClientSchema(introspection, options) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -35017,6 +52351,7 @@ function coerceInputValueImpl(inputValue, type, onError, path) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -35049,6 +52384,7 @@ function concatAST(documents) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -35595,6 +52931,7 @@ function isOneOf(node) { \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -35991,6 +53328,7 @@ function diff(oldArray, newArray) { \*************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36136,6 +53474,7 @@ function getIntrospectionQuery(options) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36178,6 +53517,7 @@ function getOperationAST(documentAST, operationName) { \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36231,6 +53571,7 @@ function getOperationRootType(schema, operation) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36452,6 +53793,7 @@ var _findBreakingChanges = __webpack_require__(/*! ./findBreakingChanges.mjs */ \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36498,6 +53840,7 @@ function introspectionFromSchema(schema, options) { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36649,6 +53992,7 @@ function sortBy(array, mapToKey) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36856,6 +54200,7 @@ function printDescription(def, indentation = '', firstInBlock = true) { \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36937,6 +54282,7 @@ function collectDependencies(selectionSet) { \*****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -36990,6 +54336,7 @@ function sortFields(fields) { \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37103,6 +54450,7 @@ function stripIgnoredCharacters(source) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37207,6 +54555,7 @@ function doTypesOverlap(schema, typeA, typeB) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37240,6 +54589,7 @@ function typeFromAST(schema, typeNode) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37398,6 +54748,7 @@ function isMissingVariable(valueNode, variables) { \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37452,6 +54803,7 @@ function valueFromASTUntyped(valueNode, variables) { \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37636,6 +54988,7 @@ exports.ValidationContext = ValidationContext; \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37936,6 +55289,7 @@ var _NoSchemaIntrospectionCustomRule = __webpack_require__(/*! ./rules/custom/No \************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -37977,6 +55331,7 @@ function ExecutableDefinitionsRule(context) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38089,6 +55444,7 @@ function getSuggestedFieldNames(type, fieldName) { \****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38142,6 +55498,7 @@ function FragmentsOnCompositeTypesRule(context) { \*********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38233,6 +55590,7 @@ function KnownArgumentNamesOnDirectivesRule(context) { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38360,6 +55718,7 @@ function getDirectiveLocationForOperation(operation) { \*********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38397,6 +55756,7 @@ function KnownFragmentNamesRule(context) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38458,6 +55818,7 @@ function isSDLNode(value) { \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38498,6 +55859,7 @@ function LoneAnonymousOperationRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38541,6 +55903,7 @@ function LoneSchemaDefinitionRule(context) { \************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38620,6 +55983,7 @@ function MaxIntrospectionDepthRule(context) { \*******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38694,6 +56058,7 @@ function NoFragmentCyclesRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38744,6 +56109,7 @@ function NoUndefinedVariablesRule(context) { \********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38800,6 +56166,7 @@ function NoUnusedFragmentsRule(context) { \********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -38854,6 +56221,7 @@ function NoUnusedVariablesRule(context) { \*******************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39318,6 +56686,7 @@ class PairSet { \**************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39381,6 +56750,7 @@ function getFragmentType(context, name) { \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39508,6 +56878,7 @@ function extensionKindToTypeName(kind) { \****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39619,6 +56990,7 @@ function isRequiredArgumentNode(arg) { \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39668,6 +57040,7 @@ function ScalarLeafsRule(context) { \***************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39733,6 +57106,7 @@ function SingleFieldSubscriptionsRule(context) { \********************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39802,6 +57176,7 @@ function UniqueArgumentDefinitionNamesRule(context) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39849,6 +57224,7 @@ function UniqueArgumentNamesRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39893,6 +57269,7 @@ function UniqueDirectiveNamesRule(context) { \******************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -39970,6 +57347,7 @@ function UniqueDirectivesPerLocationRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40029,6 +57407,7 @@ function UniqueEnumValueNamesRule(context) { \*****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40097,6 +57476,7 @@ function hasField(type, fieldName) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40137,6 +57517,7 @@ function UniqueFragmentNamesRule(context) { \************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40189,6 +57570,7 @@ function UniqueInputFieldNamesRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40231,6 +57613,7 @@ function UniqueOperationNamesRule(context) { \***********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40289,6 +57672,7 @@ function UniqueOperationTypesRule(context) { \******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40339,6 +57723,7 @@ function UniqueTypeNamesRule(context) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40381,6 +57766,7 @@ function UniqueVariableNamesRule(context) { \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40550,6 +57936,7 @@ function validateOneOfInputObject(context, node, type, fieldNodeMap, variableDef \*************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40591,6 +57978,7 @@ function VariablesAreInputTypesRule(context) { \*****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40677,6 +58065,7 @@ function allowedVariableUsage(schema, varType, varDefaultValue, locationType, lo \****************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40762,6 +58151,7 @@ function NoDeprecatedCustomRule(context) { \*************************************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40802,6 +58192,7 @@ function NoSchemaIntrospectionCustomRule(context) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -40925,6 +58316,7 @@ const specifiedSDLRules = exports.specifiedSDLRules = Object.freeze([_LoneSchema \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -41040,6 +58432,7 @@ function assertValidSDLExtension(documentAST, schema) { \*************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -41072,6 +58465,7 @@ const versionInfo = exports.versionInfo = Object.freeze({ \**************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -41103,6 +58497,7 @@ if (true) { \******************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; /*! * is-plain-object * @@ -41145,6 +58540,7 @@ module.exports = function isPlainObject(o) { \***************************************************/ /***/ (function(module) { +"use strict"; /*! * is-primitive * @@ -41169,6 +58565,7 @@ module.exports = function isPrimitive(val) { \**********************************************/ /***/ (function(module) { +"use strict"; var toString = {}.toString; @@ -41184,6 +58581,7 @@ module.exports = Array.isArray || function (arr) { \***********************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; /*! * isobject * @@ -41206,6 +58604,7 @@ module.exports = function isObject(val) { \***********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var uc_micro = __webpack_require__(/*! uc.micro */ "../../../node_modules/uc.micro/build/index.cjs.js"); @@ -41899,6 +59298,7 @@ module.exports = LinkifyIt; \***********************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var mdurl = __webpack_require__(/*! mdurl */ "../../../node_modules/mdurl/build/index.cjs.js"); @@ -47438,6 +64838,7 @@ module.exports = MarkdownIt; \******************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; /* eslint-disable no-bitwise */ @@ -47934,6 +65335,7 @@ exports.parse = urlParse; \****************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; var e = new TextDecoder(); @@ -48003,6 +65405,7 @@ exports.meros = t; \******************************************************/ /***/ (function(module) { +"use strict"; function nullthrows(x, message) { @@ -48027,6 +65430,7 @@ Object.defineProperty(module.exports, "__esModule", ({ \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -48981,6 +66385,7 @@ exports.wrap = wrap; \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; /** Highest positive signed 32-bit float value */ @@ -49415,12 +66820,293 @@ var _default = exports["default"] = punycode; /***/ }), +/***/ "../../../node_modules/react-compiler-runtime/dist/index.js": +/*!******************************************************************!*\ + !*** ../../../node_modules/react-compiler-runtime/dist/index.js ***! + \******************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @lightSyntaxTransform + * @noflow + * @nolint + * @preventMunge + * @preserve-invariant-messages + */ + +"use no memo"; +'use strict'; + +var React = __webpack_require__(/*! react */ "react"); +function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { + return e[k]; + } + }); + } + }); + } + n.default = e; + return Object.freeze(n); +} +var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React); +var _a, _b; +const { + useRef, + useEffect, + isValidElement +} = React__namespace; +const ReactSecretInternals = (_a = React__namespace.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE) !== null && _a !== void 0 ? _a : React__namespace.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED; +const $empty = Symbol.for('react.memo_cache_sentinel'); +const c = typeof ((_b = React__namespace.__COMPILER_RUNTIME) === null || _b === void 0 ? void 0 : _b.c) === 'function' ? React__namespace.__COMPILER_RUNTIME.c : function c(size) { + return React__namespace.useMemo(() => { + const $ = new Array(size); + for (let ii = 0; ii < size; ii++) { + $[ii] = $empty; + } + $[$empty] = true; + return $; + }, []); +}; +const LazyGuardDispatcher = {}; +['readContext', 'useCallback', 'useContext', 'useEffect', 'useImperativeHandle', 'useInsertionEffect', 'useLayoutEffect', 'useMemo', 'useReducer', 'useRef', 'useState', 'useDebugValue', 'useDeferredValue', 'useTransition', 'useMutableSource', 'useSyncExternalStore', 'useId', 'unstable_isNewReconciler', 'getCacheSignal', 'getCacheForType', 'useCacheRefresh'].forEach(name => { + LazyGuardDispatcher[name] = () => { + throw new Error(`[React] Unexpected React hook call (${name}) from a React compiled function. ` + "Check that all hooks are called directly and named according to convention ('use[A-Z]') "); + }; +}); +let originalDispatcher = null; +LazyGuardDispatcher['useMemoCache'] = count => { + if (originalDispatcher == null) { + throw new Error('React Compiler internal invariant violation: unexpected null dispatcher'); + } else { + return originalDispatcher.useMemoCache(count); + } +}; +var GuardKind; +(function (GuardKind) { + GuardKind[GuardKind["PushGuardContext"] = 0] = "PushGuardContext"; + GuardKind[GuardKind["PopGuardContext"] = 1] = "PopGuardContext"; + GuardKind[GuardKind["PushExpectHook"] = 2] = "PushExpectHook"; + GuardKind[GuardKind["PopExpectHook"] = 3] = "PopExpectHook"; +})(GuardKind || (GuardKind = {})); +function setCurrent(newDispatcher) { + ReactSecretInternals.ReactCurrentDispatcher.current = newDispatcher; + return ReactSecretInternals.ReactCurrentDispatcher.current; +} +const guardFrames = []; +function $dispatcherGuard(kind) { + const curr = ReactSecretInternals.ReactCurrentDispatcher.current; + if (kind === GuardKind.PushGuardContext) { + guardFrames.push(curr); + if (guardFrames.length === 1) { + originalDispatcher = curr; + } + if (curr === LazyGuardDispatcher) { + throw new Error(`[React] Unexpected call to custom hook or component from a React compiled function. ` + "Check that (1) all hooks are called directly and named according to convention ('use[A-Z]') " + 'and (2) components are returned as JSX instead of being directly invoked.'); + } + setCurrent(LazyGuardDispatcher); + } else if (kind === GuardKind.PopGuardContext) { + const lastFrame = guardFrames.pop(); + if (lastFrame == null) { + throw new Error('React Compiler internal error: unexpected null in guard stack'); + } + if (guardFrames.length === 0) { + originalDispatcher = null; + } + setCurrent(lastFrame); + } else if (kind === GuardKind.PushExpectHook) { + guardFrames.push(curr); + setCurrent(originalDispatcher); + } else if (kind === GuardKind.PopExpectHook) { + const lastFrame = guardFrames.pop(); + if (lastFrame == null) { + throw new Error('React Compiler internal error: unexpected null in guard stack'); + } + setCurrent(lastFrame); + } else { + throw new Error('React Compiler internal error: unreachable block' + kind); + } +} +function $reset($) { + for (let ii = 0; ii < $.length; ii++) { + $[ii] = $empty; + } +} +function $makeReadOnly() { + throw new Error('TODO: implement $makeReadOnly in react-compiler-runtime'); +} +const renderCounterRegistry = new Map(); +function clearRenderCounterRegistry() { + for (const counters of renderCounterRegistry.values()) { + counters.forEach(counter => { + counter.count = 0; + }); + } +} +function registerRenderCounter(name, val) { + let counters = renderCounterRegistry.get(name); + if (counters == null) { + counters = new Set(); + renderCounterRegistry.set(name, counters); + } + counters.add(val); +} +function removeRenderCounter(name, val) { + const counters = renderCounterRegistry.get(name); + if (counters == null) { + return; + } + counters.delete(val); +} +function useRenderCounter(name) { + const val = useRef(null); + if (val.current != null) { + val.current.count += 1; + } + useEffect(() => { + if (val.current == null) { + const counter = { + count: 0 + }; + registerRenderCounter(name, counter); + val.current = counter; + } + return () => { + if (val.current !== null) { + removeRenderCounter(name, val.current); + } + }; + }); +} +const seenErrors = new Set(); +function $structuralCheck(oldValue, newValue, variableName, fnName, kind, loc) { + function error(l, r, path, depth) { + const str = `${fnName}:${loc} [${kind}] ${variableName}${path} changed from ${l} to ${r} at depth ${depth}`; + if (seenErrors.has(str)) { + return; + } + seenErrors.add(str); + console.error(str); + } + const depthLimit = 2; + function recur(oldValue, newValue, path, depth) { + if (depth > depthLimit) { + return; + } else if (oldValue === newValue) { + return; + } else if (typeof oldValue !== typeof newValue) { + error(`type ${typeof oldValue}`, `type ${typeof newValue}`, path, depth); + } else if (typeof oldValue === 'object') { + const oldArray = Array.isArray(oldValue); + const newArray = Array.isArray(newValue); + if (oldValue === null && newValue !== null) { + error('null', `type ${typeof newValue}`, path, depth); + } else if (newValue === null) { + error(`type ${typeof oldValue}`, 'null', path, depth); + } else if (oldValue instanceof Map) { + if (!(newValue instanceof Map)) { + error(`Map instance`, `other value`, path, depth); + } else if (oldValue.size !== newValue.size) { + error(`Map instance with size ${oldValue.size}`, `Map instance with size ${newValue.size}`, path, depth); + } else { + for (const [k, v] of oldValue) { + if (!newValue.has(k)) { + error(`Map instance with key ${k}`, `Map instance without key ${k}`, path, depth); + } else { + recur(v, newValue.get(k), `${path}.get(${k})`, depth + 1); + } + } + } + } else if (newValue instanceof Map) { + error('other value', `Map instance`, path, depth); + } else if (oldValue instanceof Set) { + if (!(newValue instanceof Set)) { + error(`Set instance`, `other value`, path, depth); + } else if (oldValue.size !== newValue.size) { + error(`Set instance with size ${oldValue.size}`, `Set instance with size ${newValue.size}`, path, depth); + } else { + for (const v of newValue) { + if (!oldValue.has(v)) { + error(`Set instance without element ${v}`, `Set instance with element ${v}`, path, depth); + } + } + } + } else if (newValue instanceof Set) { + error('other value', `Set instance`, path, depth); + } else if (oldArray || newArray) { + if (oldArray !== newArray) { + error(`type ${oldArray ? 'array' : 'object'}`, `type ${newArray ? 'array' : 'object'}`, path, depth); + } else if (oldValue.length !== newValue.length) { + error(`array with length ${oldValue.length}`, `array with length ${newValue.length}`, path, depth); + } else { + for (let ii = 0; ii < oldValue.length; ii++) { + recur(oldValue[ii], newValue[ii], `${path}[${ii}]`, depth + 1); + } + } + } else if (isValidElement(oldValue) || isValidElement(newValue)) { + if (isValidElement(oldValue) !== isValidElement(newValue)) { + error(`type ${isValidElement(oldValue) ? 'React element' : 'object'}`, `type ${isValidElement(newValue) ? 'React element' : 'object'}`, path, depth); + } else if (oldValue.type !== newValue.type) { + error(`React element of type ${oldValue.type}`, `React element of type ${newValue.type}`, path, depth); + } else { + recur(oldValue.props, newValue.props, `[props of ${path}]`, depth + 1); + } + } else { + for (const key in newValue) { + if (!(key in oldValue)) { + error(`object without key ${key}`, `object with key ${key}`, path, depth); + } + } + for (const key in oldValue) { + if (!(key in newValue)) { + error(`object with key ${key}`, `object without key ${key}`, path, depth); + } else { + recur(oldValue[key], newValue[key], `${path}.${key}`, depth + 1); + } + } + } + } else if (typeof oldValue === 'function') { + return; + } else if (isNaN(oldValue) || isNaN(newValue)) { + if (isNaN(oldValue) !== isNaN(newValue)) { + error(`${isNaN(oldValue) ? 'NaN' : 'non-NaN value'}`, `${isNaN(newValue) ? 'NaN' : 'non-NaN value'}`, path, depth); + } + } else if (oldValue !== newValue) { + error(oldValue, newValue, path, depth); + } + } + recur(oldValue, newValue, '', 0); +} +exports.$dispatcherGuard = $dispatcherGuard; +exports.$makeReadOnly = $makeReadOnly; +exports.$reset = $reset; +exports.$structuralCheck = $structuralCheck; +exports.c = c; +exports.clearRenderCounterRegistry = clearRenderCounterRegistry; +exports.renderCounterRegistry = renderCounterRegistry; +exports.useRenderCounter = useRenderCounter; + +/***/ }), + /***/ "../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js": /*!******************************************************************************!*\ !*** ../../../node_modules/react-remove-scroll-bar/dist/es2015/component.js ***! \******************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49472,6 +67158,7 @@ exports.RemoveScrollBar = RemoveScrollBar; \******************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49495,6 +67182,7 @@ var removedBarSizeVariable = exports.removedBarSizeVariable = '--removed-body-sc \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49548,6 +67236,7 @@ var _utils = __webpack_require__(/*! ./utils */ "../../../node_modules/react-rem \**************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49602,6 +67291,7 @@ exports.getGapWidth = getGapWidth; \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49632,6 +67322,7 @@ var _default = exports["default"] = ReactRemoveScroll; \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49822,6 +67513,7 @@ function RemoveScrollSideCar(props) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49900,6 +67592,7 @@ RemoveScroll.classNames = { \*********************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -49935,6 +67628,7 @@ var nonPassive = exports.nonPassive = passiveSupported ? { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50052,6 +67746,7 @@ exports.handleScroll = handleScroll; \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50074,6 +67769,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50091,6 +67787,7 @@ var effectCar = exports.effectCar = (0, _useSidecar.createSidecarMedium)(); \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50110,6 +67807,7 @@ var _default = exports["default"] = (0, _useSidecar.exportSidecar)(_medium.effec \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50143,6 +67841,7 @@ exports.styleSingleton = styleSingleton; \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50183,6 +67882,7 @@ exports.styleHookSingleton = styleHookSingleton; \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50218,6 +67918,7 @@ var _hook = __webpack_require__(/*! ./hook */ "../../../node_modules/react-style \****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -50280,6 +67981,7 @@ exports.stylesheetSingleton = stylesheetSingleton; \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; /** * @license React * react-jsx-runtime.development.js @@ -51418,6 +69120,7 @@ if (true) { \**************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; if (false) {} else { @@ -51432,6 +69135,7 @@ if (false) {} else { \************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; /*! * set-value * @@ -51578,6 +69282,7 @@ module.exports = setValue; \**********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -51802,6 +69507,7 @@ exports.vw = vw; \*******************************************************/ /***/ (function(module) { +"use strict"; module.exports = function () { @@ -51844,6 +69550,7 @@ module.exports = function () { \*************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52412,6 +70119,7 @@ var _default = exports["default"] = { \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; var regex$5 = /[\0-\uD7FF\uE000-\uFFFF]|[\uD800-\uDBFF][\uDC00-\uDFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/; @@ -52435,6 +70143,7 @@ exports.Z = regex; \***********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52471,6 +70180,7 @@ function assignRef(ref, value) { \***********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52509,6 +70219,7 @@ function createCallbackRef(callback) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52585,6 +70296,7 @@ var _refToCallback = __webpack_require__(/*! ./refToCallback */ "../../../node_m \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52622,6 +70334,7 @@ function mergeRefs(refs) { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52687,6 +70400,7 @@ function useRefToCallback(ref) { \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52718,6 +70432,7 @@ function transformRef(ref, transformer) { \*************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52756,6 +70471,7 @@ function useMergeRefs(refs, defaultValue) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52812,6 +70528,7 @@ function useCallbackRef(initialValue, callback) { \*****************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52847,6 +70564,7 @@ function useTransformRef(ref, transformer) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52871,6 +70589,7 @@ exports.setConfig = setConfig; \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52891,6 +70610,7 @@ var env = exports.env = { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52927,6 +70647,7 @@ function exportSidecar(medium, exported) { \************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -52963,6 +70684,7 @@ function sidecar(importer, errorComponent) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -53032,6 +70754,7 @@ function useRealSidecar(importer, effect) { \**************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -53094,6 +70817,7 @@ var _exports = __webpack_require__(/*! ./exports */ "../../../node_modules/use-s \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -53205,6 +70929,7 @@ function createSidecarMedium(options) { \*******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -53273,6 +70998,7 @@ function renderCar(WrappedComponent, defaults) { \*************************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; /* -------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. @@ -55541,12584 +73267,20 @@ var Is; /***/ }), -/***/ "../../graphiql-react/dist/SchemaReference.cjs.js": -/*!********************************************************!*\ - !*** ../../graphiql-react/dist/SchemaReference.cjs.js ***! - \********************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const forEachState = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); -function getTypeInfo(schema, tokenState) { - const info = { - schema, - type: null, - parentType: null, - inputType: null, - directiveDef: null, - fieldDef: null, - argDef: null, - argDefs: null, - objectFieldDefs: null - }; - forEachState.forEachState(tokenState, state => { - var _a, _b; - switch (state.kind) { - case "Query": - case "ShortQuery": - info.type = schema.getQueryType(); - break; - case "Mutation": - info.type = schema.getMutationType(); - break; - case "Subscription": - info.type = schema.getSubscriptionType(); - break; - case "InlineFragment": - case "FragmentDefinition": - if (state.type) { - info.type = schema.getType(state.type); - } - break; - case "Field": - case "AliasedField": - info.fieldDef = info.type && state.name ? getFieldDef(schema, info.parentType, state.name) : null; - info.type = (_a = info.fieldDef) === null || _a === void 0 ? void 0 : _a.type; - break; - case "SelectionSet": - info.parentType = info.type ? graphql.getNamedType(info.type) : null; - break; - case "Directive": - info.directiveDef = state.name ? schema.getDirective(state.name) : null; - break; - case "Arguments": - const parentDef = state.prevState ? state.prevState.kind === "Field" ? info.fieldDef : state.prevState.kind === "Directive" ? info.directiveDef : state.prevState.kind === "AliasedField" ? state.prevState.name && getFieldDef(schema, info.parentType, state.prevState.name) : null : null; - info.argDefs = parentDef ? parentDef.args : null; - break; - case "Argument": - info.argDef = null; - if (info.argDefs) { - for (let i = 0; i < info.argDefs.length; i++) { - if (info.argDefs[i].name === state.name) { - info.argDef = info.argDefs[i]; - break; - } - } - } - info.inputType = (_b = info.argDef) === null || _b === void 0 ? void 0 : _b.type; - break; - case "EnumValue": - const enumType = info.inputType ? graphql.getNamedType(info.inputType) : null; - info.enumValue = enumType instanceof graphql.GraphQLEnumType ? find(enumType.getValues(), val => val.value === state.name) : null; - break; - case "ListValue": - const nullableType = info.inputType ? graphql.getNullableType(info.inputType) : null; - info.inputType = nullableType instanceof graphql.GraphQLList ? nullableType.ofType : null; - break; - case "ObjectValue": - const objectType = info.inputType ? graphql.getNamedType(info.inputType) : null; - info.objectFieldDefs = objectType instanceof graphql.GraphQLInputObjectType ? objectType.getFields() : null; - break; - case "ObjectField": - const objectField = state.name && info.objectFieldDefs ? info.objectFieldDefs[state.name] : null; - info.inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; - info.fieldDef = objectField; - break; - case "NamedType": - info.type = state.name ? schema.getType(state.name) : null; - break; - } - }); - return info; -} -function getFieldDef(schema, type, fieldName) { - if (fieldName === graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { - return graphql.SchemaMetaFieldDef; - } - if (fieldName === graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { - return graphql.TypeMetaFieldDef; - } - if (fieldName === graphql.TypeNameMetaFieldDef.name && graphql.isCompositeType(type)) { - return graphql.TypeNameMetaFieldDef; - } - if (type && type.getFields) { - return type.getFields()[fieldName]; - } -} -function find(array, predicate) { - for (let i = 0; i < array.length; i++) { - if (predicate(array[i])) { - return array[i]; - } - } -} -function getFieldReference(typeInfo) { - return { - kind: "Field", - schema: typeInfo.schema, - field: typeInfo.fieldDef, - type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType - }; -} -function getDirectiveReference(typeInfo) { - return { - kind: "Directive", - schema: typeInfo.schema, - directive: typeInfo.directiveDef - }; -} -function getArgumentReference(typeInfo) { - return typeInfo.directiveDef ? { - kind: "Argument", - schema: typeInfo.schema, - argument: typeInfo.argDef, - directive: typeInfo.directiveDef - } : { - kind: "Argument", - schema: typeInfo.schema, - argument: typeInfo.argDef, - field: typeInfo.fieldDef, - type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType - }; -} -function getEnumValueReference(typeInfo) { - return { - kind: "EnumValue", - value: typeInfo.enumValue || void 0, - type: typeInfo.inputType ? graphql.getNamedType(typeInfo.inputType) : void 0 - }; -} -function getTypeReference(typeInfo, type) { - return { - kind: "Type", - schema: typeInfo.schema, - type: type || typeInfo.type - }; -} -function isMetaField(fieldDef) { - return fieldDef.name.slice(0, 2) === "__"; -} -exports.getArgumentReference = getArgumentReference; -exports.getDirectiveReference = getDirectiveReference; -exports.getEnumValueReference = getEnumValueReference; -exports.getFieldReference = getFieldReference; -exports.getTypeInfo = getTypeInfo; -exports.getTypeReference = getTypeReference; - -/***/ }), - -/***/ "../../graphiql-react/dist/brace-fold.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/brace-fold.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var braceFold$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - function bracketFolding(pairs) { - return function (cm, start) { - var line = start.line, - lineText = cm.getLine(line); - function findOpening(pair) { - var tokenType; - for (var at = start.ch, pass = 0;;) { - var found2 = at <= 0 ? -1 : lineText.lastIndexOf(pair[0], at - 1); - if (found2 == -1) { - if (pass == 1) break; - pass = 1; - at = lineText.length; - continue; - } - if (pass == 1 && found2 < start.ch) break; - tokenType = cm.getTokenTypeAt(CodeMirror.Pos(line, found2 + 1)); - if (!/^(comment|string)/.test(tokenType)) return { - ch: found2 + 1, - tokenType, - pair - }; - at = found2 - 1; - } - } - function findRange(found2) { - var count = 1, - lastLine = cm.lastLine(), - end, - startCh = found2.ch, - endCh; - outer: for (var i2 = line; i2 <= lastLine; ++i2) { - var text = cm.getLine(i2), - pos = i2 == line ? startCh : 0; - for (;;) { - var nextOpen = text.indexOf(found2.pair[0], pos), - nextClose = text.indexOf(found2.pair[1], pos); - if (nextOpen < 0) nextOpen = text.length; - if (nextClose < 0) nextClose = text.length; - pos = Math.min(nextOpen, nextClose); - if (pos == text.length) break; - if (cm.getTokenTypeAt(CodeMirror.Pos(i2, pos + 1)) == found2.tokenType) { - if (pos == nextOpen) ++count;else if (! --count) { - end = i2; - endCh = pos; - break outer; - } - } - ++pos; - } - } - if (end == null || line == end) return null; - return { - from: CodeMirror.Pos(line, startCh), - to: CodeMirror.Pos(end, endCh) - }; - } - var found = []; - for (var i = 0; i < pairs.length; i++) { - var open = findOpening(pairs[i]); - if (open) found.push(open); - } - found.sort(function (a, b) { - return a.ch - b.ch; - }); - for (var i = 0; i < found.length; i++) { - var range = findRange(found[i]); - if (range) return range; - } - return null; - }; - } - CodeMirror.registerHelper("fold", "brace", bracketFolding([["{", "}"], ["[", "]"]])); - CodeMirror.registerHelper("fold", "brace-paren", bracketFolding([["{", "}"], ["[", "]"], ["(", ")"]])); - CodeMirror.registerHelper("fold", "import", function (cm, start) { - function hasImport(line) { - if (line < cm.firstLine() || line > cm.lastLine()) return null; - var start2 = cm.getTokenAt(CodeMirror.Pos(line, 1)); - if (!/\S/.test(start2.string)) start2 = cm.getTokenAt(CodeMirror.Pos(line, start2.end + 1)); - if (start2.type != "keyword" || start2.string != "import") return null; - for (var i = line, e = Math.min(cm.lastLine(), line + 10); i <= e; ++i) { - var text = cm.getLine(i), - semi = text.indexOf(";"); - if (semi != -1) return { - startCh: start2.end, - end: CodeMirror.Pos(i, semi) - }; - } - } - var startLine = start.line, - has = hasImport(startLine), - prev; - if (!has || hasImport(startLine - 1) || (prev = hasImport(startLine - 2)) && prev.end.line == startLine - 1) return null; - for (var end = has.end;;) { - var next = hasImport(end.line + 1); - if (next == null) break; - end = next.end; - } - return { - from: cm.clipPos(CodeMirror.Pos(startLine, has.startCh + 1)), - to: end - }; - }); - CodeMirror.registerHelper("fold", "include", function (cm, start) { - function hasInclude(line) { - if (line < cm.firstLine() || line > cm.lastLine()) return null; - var start2 = cm.getTokenAt(CodeMirror.Pos(line, 1)); - if (!/\S/.test(start2.string)) start2 = cm.getTokenAt(CodeMirror.Pos(line, start2.end + 1)); - if (start2.type == "meta" && start2.string.slice(0, 8) == "#include") return start2.start + 8; - } - var startLine = start.line, - has = hasInclude(startLine); - if (has == null || hasInclude(startLine - 1) != null) return null; - for (var end = startLine;;) { - var next = hasInclude(end + 1); - if (next == null) break; - ++end; - } - return { - from: CodeMirror.Pos(startLine, has + 1), - to: cm.clipPos(CodeMirror.Pos(end)) - }; - }); - }); -})(); -var braceFoldExports = braceFold$2.exports; -const braceFold = /* @__PURE__ */codemirror.getDefaultExportFromCjs(braceFoldExports); -const braceFold$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: braceFold -}, [braceFoldExports]); -exports.braceFold = braceFold$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/closebrackets.cjs.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/closebrackets.cjs.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var closebrackets$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var defaults = { - pairs: `()[]{}''""`, - closeBefore: `)]}'":;>`, - triples: "", - explode: "[]{}" - }; - var Pos = CodeMirror.Pos; - CodeMirror.defineOption("autoCloseBrackets", false, function (cm, val, old) { - if (old && old != CodeMirror.Init) { - cm.removeKeyMap(keyMap); - cm.state.closeBrackets = null; - } - if (val) { - ensureBound(getOption(val, "pairs")); - cm.state.closeBrackets = val; - cm.addKeyMap(keyMap); - } - }); - function getOption(conf, name) { - if (name == "pairs" && typeof conf == "string") return conf; - if (typeof conf == "object" && conf[name] != null) return conf[name]; - return defaults[name]; - } - var keyMap = { - Backspace: handleBackspace, - Enter: handleEnter - }; - function ensureBound(chars) { - for (var i = 0; i < chars.length; i++) { - var ch = chars.charAt(i), - key = "'" + ch + "'"; - if (!keyMap[key]) keyMap[key] = handler(ch); - } - } - ensureBound(defaults.pairs + "`"); - function handler(ch) { - return function (cm) { - return handleChar(cm, ch); - }; - } - function getConfig(cm) { - var deflt = cm.state.closeBrackets; - if (!deflt || deflt.override) return deflt; - var mode = cm.getModeAt(cm.getCursor()); - return mode.closeBrackets || deflt; - } - function handleBackspace(cm) { - var conf = getConfig(cm); - if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; - var pairs = getOption(conf, "pairs"); - var ranges = cm.listSelections(); - for (var i = 0; i < ranges.length; i++) { - if (!ranges[i].empty()) return CodeMirror.Pass; - var around = charsAround(cm, ranges[i].head); - if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; - } - for (var i = ranges.length - 1; i >= 0; i--) { - var cur = ranges[i].head; - cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1), "+delete"); - } - } - function handleEnter(cm) { - var conf = getConfig(cm); - var explode = conf && getOption(conf, "explode"); - if (!explode || cm.getOption("disableInput")) return CodeMirror.Pass; - var ranges = cm.listSelections(); - for (var i = 0; i < ranges.length; i++) { - if (!ranges[i].empty()) return CodeMirror.Pass; - var around = charsAround(cm, ranges[i].head); - if (!around || explode.indexOf(around) % 2 != 0) return CodeMirror.Pass; - } - cm.operation(function () { - var linesep = cm.lineSeparator() || "\n"; - cm.replaceSelection(linesep + linesep, null); - moveSel(cm, -1); - ranges = cm.listSelections(); - for (var i2 = 0; i2 < ranges.length; i2++) { - var line = ranges[i2].head.line; - cm.indentLine(line, null, true); - cm.indentLine(line + 1, null, true); - } - }); - } - function moveSel(cm, dir) { - var newRanges = [], - ranges = cm.listSelections(), - primary = 0; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (range.head == cm.getCursor()) primary = i; - var pos = range.head.ch || dir > 0 ? { - line: range.head.line, - ch: range.head.ch + dir - } : { - line: range.head.line - 1 - }; - newRanges.push({ - anchor: pos, - head: pos - }); - } - cm.setSelections(newRanges, primary); - } - function contractSelection(sel) { - var inverted = CodeMirror.cmpPos(sel.anchor, sel.head) > 0; - return { - anchor: new Pos(sel.anchor.line, sel.anchor.ch + (inverted ? -1 : 1)), - head: new Pos(sel.head.line, sel.head.ch + (inverted ? 1 : -1)) - }; - } - function handleChar(cm, ch) { - var conf = getConfig(cm); - if (!conf || cm.getOption("disableInput")) return CodeMirror.Pass; - var pairs = getOption(conf, "pairs"); - var pos = pairs.indexOf(ch); - if (pos == -1) return CodeMirror.Pass; - var closeBefore = getOption(conf, "closeBefore"); - var triples = getOption(conf, "triples"); - var identical = pairs.charAt(pos + 1) == ch; - var ranges = cm.listSelections(); - var opening = pos % 2 == 0; - var type; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i], - cur = range.head, - curType; - var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); - if (opening && !range.empty()) { - curType = "surround"; - } else if ((identical || !opening) && next == ch) { - if (identical && stringStartsAfter(cm, cur)) curType = "both";else if (triples.indexOf(ch) >= 0 && cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == ch + ch + ch) curType = "skipThree";else curType = "skip"; - } else if (identical && cur.ch > 1 && triples.indexOf(ch) >= 0 && cm.getRange(Pos(cur.line, cur.ch - 2), cur) == ch + ch) { - if (cur.ch > 2 && /\bstring/.test(cm.getTokenTypeAt(Pos(cur.line, cur.ch - 2)))) return CodeMirror.Pass; - curType = "addFour"; - } else if (identical) { - var prev = cur.ch == 0 ? " " : cm.getRange(Pos(cur.line, cur.ch - 1), cur); - if (!CodeMirror.isWordChar(next) && prev != ch && !CodeMirror.isWordChar(prev)) curType = "both";else return CodeMirror.Pass; - } else if (opening && (next.length === 0 || /\s/.test(next) || closeBefore.indexOf(next) > -1)) { - curType = "both"; - } else { - return CodeMirror.Pass; - } - if (!type) type = curType;else if (type != curType) return CodeMirror.Pass; - } - var left = pos % 2 ? pairs.charAt(pos - 1) : ch; - var right = pos % 2 ? ch : pairs.charAt(pos + 1); - cm.operation(function () { - if (type == "skip") { - moveSel(cm, 1); - } else if (type == "skipThree") { - moveSel(cm, 3); - } else if (type == "surround") { - var sels = cm.getSelections(); - for (var i2 = 0; i2 < sels.length; i2++) sels[i2] = left + sels[i2] + right; - cm.replaceSelections(sels, "around"); - sels = cm.listSelections().slice(); - for (var i2 = 0; i2 < sels.length; i2++) sels[i2] = contractSelection(sels[i2]); - cm.setSelections(sels); - } else if (type == "both") { - cm.replaceSelection(left + right, null); - cm.triggerElectric(left + right); - moveSel(cm, -1); - } else if (type == "addFour") { - cm.replaceSelection(left + left + left + left, "before"); - moveSel(cm, 1); - } - }); - } - function charsAround(cm, pos) { - var str = cm.getRange(Pos(pos.line, pos.ch - 1), Pos(pos.line, pos.ch + 1)); - return str.length == 2 ? str : null; - } - function stringStartsAfter(cm, pos) { - var token = cm.getTokenAt(Pos(pos.line, pos.ch + 1)); - return /\bstring/.test(token.type) && token.start == pos.ch && (pos.ch == 0 || !/\bstring/.test(cm.getTokenTypeAt(pos))); - } - }); -})(); -var closebracketsExports = closebrackets$2.exports; -const closebrackets = /* @__PURE__ */codemirror.getDefaultExportFromCjs(closebracketsExports); -const closebrackets$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: closebrackets -}, [closebracketsExports]); -exports.closebrackets = closebrackets$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/codemirror.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/codemirror.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror$1 = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var codemirrorExports = codemirror$1.requireCodemirror(); -const CodeMirror = /* @__PURE__ */codemirror$1.getDefaultExportFromCjs(codemirrorExports); -const codemirror = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: CodeMirror -}, [codemirrorExports]); -exports.CodeMirror = CodeMirror; -exports.codemirror = codemirror; - -/***/ }), - -/***/ "../../graphiql-react/dist/codemirror.cjs2.js": -/*!****************************************************!*\ - !*** ../../graphiql-react/dist/codemirror.cjs2.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof __webpack_require__.g !== "undefined" ? __webpack_require__.g : typeof self !== "undefined" ? self : {}; -function getDefaultExportFromCjs(x) { - return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x; -} -var codemirror = { - exports: {} -}; -var hasRequiredCodemirror; -function requireCodemirror() { - if (hasRequiredCodemirror) return codemirror.exports; - hasRequiredCodemirror = 1; - (function (module2, exports2) { - (function (global2, factory) { - module2.exports = factory(); - })(commonjsGlobal, function () { - var userAgent = navigator.userAgent; - var platform = navigator.platform; - var gecko = /gecko\/\d/i.test(userAgent); - var ie_upto10 = /MSIE \d/.test(userAgent); - var ie_11up = /Trident\/(?:[7-9]|\d{2,})\..*rv:(\d+)/.exec(userAgent); - var edge = /Edge\/(\d+)/.exec(userAgent); - var ie = ie_upto10 || ie_11up || edge; - var ie_version = ie && (ie_upto10 ? document.documentMode || 6 : +(edge || ie_11up)[1]); - var webkit = !edge && /WebKit\//.test(userAgent); - var qtwebkit = webkit && /Qt\/\d+\.\d+/.test(userAgent); - var chrome = !edge && /Chrome\//.test(userAgent); - var presto = /Opera\//.test(userAgent); - var safari = /Apple Computer/.test(navigator.vendor); - var mac_geMountainLion = /Mac OS X 1\d\D([8-9]|\d\d)\D/.test(userAgent); - var phantom = /PhantomJS/.test(userAgent); - var ios = safari && (/Mobile\/\w+/.test(userAgent) || navigator.maxTouchPoints > 2); - var android = /Android/.test(userAgent); - var mobile = ios || android || /webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(userAgent); - var mac = ios || /Mac/.test(platform); - var chromeOS = /\bCrOS\b/.test(userAgent); - var windows = /win/i.test(platform); - var presto_version = presto && userAgent.match(/Version\/(\d*\.\d*)/); - if (presto_version) { - presto_version = Number(presto_version[1]); - } - if (presto_version && presto_version >= 15) { - presto = false; - webkit = true; - } - var flipCtrlCmd = mac && (qtwebkit || presto && (presto_version == null || presto_version < 12.11)); - var captureRightClick = gecko || ie && ie_version >= 9; - function classTest(cls) { - return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); - } - var rmClass = function (node, cls) { - var current = node.className; - var match = classTest(cls).exec(current); - if (match) { - var after = current.slice(match.index + match[0].length); - node.className = current.slice(0, match.index) + (after ? match[1] + after : ""); - } - }; - function removeChildren(e) { - for (var count = e.childNodes.length; count > 0; --count) { - e.removeChild(e.firstChild); - } - return e; - } - function removeChildrenAndAdd(parent, e) { - return removeChildren(parent).appendChild(e); - } - function elt(tag, content, className, style) { - var e = document.createElement(tag); - if (className) { - e.className = className; - } - if (style) { - e.style.cssText = style; - } - if (typeof content == "string") { - e.appendChild(document.createTextNode(content)); - } else if (content) { - for (var i2 = 0; i2 < content.length; ++i2) { - e.appendChild(content[i2]); - } - } - return e; - } - function eltP(tag, content, className, style) { - var e = elt(tag, content, className, style); - e.setAttribute("role", "presentation"); - return e; - } - var range; - if (document.createRange) { - range = function (node, start, end, endNode) { - var r = document.createRange(); - r.setEnd(endNode || node, end); - r.setStart(node, start); - return r; - }; - } else { - range = function (node, start, end) { - var r = document.body.createTextRange(); - try { - r.moveToElementText(node.parentNode); - } catch (e) { - return r; - } - r.collapse(true); - r.moveEnd("character", end); - r.moveStart("character", start); - return r; - }; - } - function contains(parent, child) { - if (child.nodeType == 3) { - child = child.parentNode; - } - if (parent.contains) { - return parent.contains(child); - } - do { - if (child.nodeType == 11) { - child = child.host; - } - if (child == parent) { - return true; - } - } while (child = child.parentNode); - } - function activeElt() { - var activeElement; - try { - activeElement = document.activeElement; - } catch (e) { - activeElement = document.body || null; - } - while (activeElement && activeElement.shadowRoot && activeElement.shadowRoot.activeElement) { - activeElement = activeElement.shadowRoot.activeElement; - } - return activeElement; - } - function addClass(node, cls) { - var current = node.className; - if (!classTest(cls).test(current)) { - node.className += (current ? " " : "") + cls; - } - } - function joinClasses(a, b) { - var as = a.split(" "); - for (var i2 = 0; i2 < as.length; i2++) { - if (as[i2] && !classTest(as[i2]).test(b)) { - b += " " + as[i2]; - } - } - return b; - } - var selectInput = function (node) { - node.select(); - }; - if (ios) { - selectInput = function (node) { - node.selectionStart = 0; - node.selectionEnd = node.value.length; - }; - } else if (ie) { - selectInput = function (node) { - try { - node.select(); - } catch (_e) {} - }; - } - function bind(f) { - var args = Array.prototype.slice.call(arguments, 1); - return function () { - return f.apply(null, args); - }; - } - function copyObj(obj, target, overwrite) { - if (!target) { - target = {}; - } - for (var prop2 in obj) { - if (obj.hasOwnProperty(prop2) && (overwrite !== false || !target.hasOwnProperty(prop2))) { - target[prop2] = obj[prop2]; - } - } - return target; - } - function countColumn(string, end, tabSize, startIndex, startValue) { - if (end == null) { - end = string.search(/[^\s\u00a0]/); - if (end == -1) { - end = string.length; - } - } - for (var i2 = startIndex || 0, n = startValue || 0;;) { - var nextTab = string.indexOf(" ", i2); - if (nextTab < 0 || nextTab >= end) { - return n + (end - i2); - } - n += nextTab - i2; - n += tabSize - n % tabSize; - i2 = nextTab + 1; - } - } - var Delayed = function () { - this.id = null; - this.f = null; - this.time = 0; - this.handler = bind(this.onTimeout, this); - }; - Delayed.prototype.onTimeout = function (self2) { - self2.id = 0; - if (self2.time <= + /* @__PURE__ */new Date()) { - self2.f(); - } else { - setTimeout(self2.handler, self2.time - + /* @__PURE__ */new Date()); - } - }; - Delayed.prototype.set = function (ms, f) { - this.f = f; - var time = + /* @__PURE__ */new Date() + ms; - if (!this.id || time < this.time) { - clearTimeout(this.id); - this.id = setTimeout(this.handler, ms); - this.time = time; - } - }; - function indexOf(array, elt2) { - for (var i2 = 0; i2 < array.length; ++i2) { - if (array[i2] == elt2) { - return i2; - } - } - return -1; - } - var scrollerGap = 50; - var Pass = { - toString: function () { - return "CodeMirror.Pass"; - } - }; - var sel_dontScroll = { - scroll: false - }, - sel_mouse = { - origin: "*mouse" - }, - sel_move = { - origin: "+move" - }; - function findColumn(string, goal, tabSize) { - for (var pos = 0, col = 0;;) { - var nextTab = string.indexOf(" ", pos); - if (nextTab == -1) { - nextTab = string.length; - } - var skipped = nextTab - pos; - if (nextTab == string.length || col + skipped >= goal) { - return pos + Math.min(skipped, goal - col); - } - col += nextTab - pos; - col += tabSize - col % tabSize; - pos = nextTab + 1; - if (col >= goal) { - return pos; - } - } - } - var spaceStrs = [""]; - function spaceStr(n) { - while (spaceStrs.length <= n) { - spaceStrs.push(lst(spaceStrs) + " "); - } - return spaceStrs[n]; - } - function lst(arr) { - return arr[arr.length - 1]; - } - function map(array, f) { - var out = []; - for (var i2 = 0; i2 < array.length; i2++) { - out[i2] = f(array[i2], i2); - } - return out; - } - function insertSorted(array, value, score) { - var pos = 0, - priority = score(value); - while (pos < array.length && score(array[pos]) <= priority) { - pos++; - } - array.splice(pos, 0, value); - } - function nothing() {} - function createObj(base, props) { - var inst; - if (Object.create) { - inst = Object.create(base); - } else { - nothing.prototype = base; - inst = new nothing(); - } - if (props) { - copyObj(props, inst); - } - return inst; - } - var nonASCIISingleCaseWordChar = /[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/; - function isWordCharBasic(ch) { - return /\w/.test(ch) || ch > "€" && (ch.toUpperCase() != ch.toLowerCase() || nonASCIISingleCaseWordChar.test(ch)); - } - function isWordChar(ch, helper) { - if (!helper) { - return isWordCharBasic(ch); - } - if (helper.source.indexOf("\\w") > -1 && isWordCharBasic(ch)) { - return true; - } - return helper.test(ch); - } - function isEmpty(obj) { - for (var n in obj) { - if (obj.hasOwnProperty(n) && obj[n]) { - return false; - } - } - return true; - } - var extendingChars = /[\u0300-\u036f\u0483-\u0489\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u064b-\u065e\u0670\u06d6-\u06dc\u06de-\u06e4\u06e7\u06e8\u06ea-\u06ed\u0711\u0730-\u074a\u07a6-\u07b0\u07eb-\u07f3\u0816-\u0819\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0900-\u0902\u093c\u0941-\u0948\u094d\u0951-\u0955\u0962\u0963\u0981\u09bc\u09be\u09c1-\u09c4\u09cd\u09d7\u09e2\u09e3\u0a01\u0a02\u0a3c\u0a41\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a70\u0a71\u0a75\u0a81\u0a82\u0abc\u0ac1-\u0ac5\u0ac7\u0ac8\u0acd\u0ae2\u0ae3\u0b01\u0b3c\u0b3e\u0b3f\u0b41-\u0b44\u0b4d\u0b56\u0b57\u0b62\u0b63\u0b82\u0bbe\u0bc0\u0bcd\u0bd7\u0c3e-\u0c40\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62\u0c63\u0cbc\u0cbf\u0cc2\u0cc6\u0ccc\u0ccd\u0cd5\u0cd6\u0ce2\u0ce3\u0d3e\u0d41-\u0d44\u0d4d\u0d57\u0d62\u0d63\u0dca\u0dcf\u0dd2-\u0dd4\u0dd6\u0ddf\u0e31\u0e34-\u0e3a\u0e47-\u0e4e\u0eb1\u0eb4-\u0eb9\u0ebb\u0ebc\u0ec8-\u0ecd\u0f18\u0f19\u0f35\u0f37\u0f39\u0f71-\u0f7e\u0f80-\u0f84\u0f86\u0f87\u0f90-\u0f97\u0f99-\u0fbc\u0fc6\u102d-\u1030\u1032-\u1037\u1039\u103a\u103d\u103e\u1058\u1059\u105e-\u1060\u1071-\u1074\u1082\u1085\u1086\u108d\u109d\u135f\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17b7-\u17bd\u17c6\u17c9-\u17d3\u17dd\u180b-\u180d\u18a9\u1920-\u1922\u1927\u1928\u1932\u1939-\u193b\u1a17\u1a18\u1a56\u1a58-\u1a5e\u1a60\u1a62\u1a65-\u1a6c\u1a73-\u1a7c\u1a7f\u1b00-\u1b03\u1b34\u1b36-\u1b3a\u1b3c\u1b42\u1b6b-\u1b73\u1b80\u1b81\u1ba2-\u1ba5\u1ba8\u1ba9\u1c2c-\u1c33\u1c36\u1c37\u1cd0-\u1cd2\u1cd4-\u1ce0\u1ce2-\u1ce8\u1ced\u1dc0-\u1de6\u1dfd-\u1dff\u200c\u200d\u20d0-\u20f0\u2cef-\u2cf1\u2de0-\u2dff\u302a-\u302f\u3099\u309a\ua66f-\ua672\ua67c\ua67d\ua6f0\ua6f1\ua802\ua806\ua80b\ua825\ua826\ua8c4\ua8e0-\ua8f1\ua926-\ua92d\ua947-\ua951\ua980-\ua982\ua9b3\ua9b6-\ua9b9\ua9bc\uaa29-\uaa2e\uaa31\uaa32\uaa35\uaa36\uaa43\uaa4c\uaab0\uaab2-\uaab4\uaab7\uaab8\uaabe\uaabf\uaac1\uabe5\uabe8\uabed\udc00-\udfff\ufb1e\ufe00-\ufe0f\ufe20-\ufe26\uff9e\uff9f]/; - function isExtendingChar(ch) { - return ch.charCodeAt(0) >= 768 && extendingChars.test(ch); - } - function skipExtendingChars(str, pos, dir) { - while ((dir < 0 ? pos > 0 : pos < str.length) && isExtendingChar(str.charAt(pos))) { - pos += dir; - } - return pos; - } - function findFirst(pred, from, to) { - var dir = from > to ? -1 : 1; - for (;;) { - if (from == to) { - return from; - } - var midF = (from + to) / 2, - mid = dir < 0 ? Math.ceil(midF) : Math.floor(midF); - if (mid == from) { - return pred(mid) ? from : to; - } - if (pred(mid)) { - to = mid; - } else { - from = mid + dir; - } - } - } - function iterateBidiSections(order, from, to, f) { - if (!order) { - return f(from, to, "ltr", 0); - } - var found = false; - for (var i2 = 0; i2 < order.length; ++i2) { - var part = order[i2]; - if (part.from < to && part.to > from || from == to && part.to == from) { - f(Math.max(part.from, from), Math.min(part.to, to), part.level == 1 ? "rtl" : "ltr", i2); - found = true; - } - } - if (!found) { - f(from, to, "ltr"); - } - } - var bidiOther = null; - function getBidiPartAt(order, ch, sticky) { - var found; - bidiOther = null; - for (var i2 = 0; i2 < order.length; ++i2) { - var cur = order[i2]; - if (cur.from < ch && cur.to > ch) { - return i2; - } - if (cur.to == ch) { - if (cur.from != cur.to && sticky == "before") { - found = i2; - } else { - bidiOther = i2; - } - } - if (cur.from == ch) { - if (cur.from != cur.to && sticky != "before") { - found = i2; - } else { - bidiOther = i2; - } - } - } - return found != null ? found : bidiOther; - } - var bidiOrdering = /* @__PURE__ */function () { - var lowTypes = "bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN"; - var arabicTypes = "nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111"; - function charType(code) { - if (code <= 247) { - return lowTypes.charAt(code); - } else if (1424 <= code && code <= 1524) { - return "R"; - } else if (1536 <= code && code <= 1785) { - return arabicTypes.charAt(code - 1536); - } else if (1774 <= code && code <= 2220) { - return "r"; - } else if (8192 <= code && code <= 8203) { - return "w"; - } else if (code == 8204) { - return "b"; - } else { - return "L"; - } - } - var bidiRE = /[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/; - var isNeutral = /[stwN]/, - isStrong = /[LRr]/, - countsAsLeft = /[Lb1n]/, - countsAsNum = /[1n]/; - function BidiSpan(level, from, to) { - this.level = level; - this.from = from; - this.to = to; - } - return function (str, direction) { - var outerType = direction == "ltr" ? "L" : "R"; - if (str.length == 0 || direction == "ltr" && !bidiRE.test(str)) { - return false; - } - var len = str.length, - types = []; - for (var i2 = 0; i2 < len; ++i2) { - types.push(charType(str.charCodeAt(i2))); - } - for (var i$12 = 0, prev = outerType; i$12 < len; ++i$12) { - var type = types[i$12]; - if (type == "m") { - types[i$12] = prev; - } else { - prev = type; - } - } - for (var i$22 = 0, cur = outerType; i$22 < len; ++i$22) { - var type$1 = types[i$22]; - if (type$1 == "1" && cur == "r") { - types[i$22] = "n"; - } else if (isStrong.test(type$1)) { - cur = type$1; - if (type$1 == "r") { - types[i$22] = "R"; - } - } - } - for (var i$3 = 1, prev$1 = types[0]; i$3 < len - 1; ++i$3) { - var type$2 = types[i$3]; - if (type$2 == "+" && prev$1 == "1" && types[i$3 + 1] == "1") { - types[i$3] = "1"; - } else if (type$2 == "," && prev$1 == types[i$3 + 1] && (prev$1 == "1" || prev$1 == "n")) { - types[i$3] = prev$1; - } - prev$1 = type$2; - } - for (var i$4 = 0; i$4 < len; ++i$4) { - var type$3 = types[i$4]; - if (type$3 == ",") { - types[i$4] = "N"; - } else if (type$3 == "%") { - var end = void 0; - for (end = i$4 + 1; end < len && types[end] == "%"; ++end) {} - var replace = i$4 && types[i$4 - 1] == "!" || end < len && types[end] == "1" ? "1" : "N"; - for (var j = i$4; j < end; ++j) { - types[j] = replace; - } - i$4 = end - 1; - } - } - for (var i$5 = 0, cur$1 = outerType; i$5 < len; ++i$5) { - var type$4 = types[i$5]; - if (cur$1 == "L" && type$4 == "1") { - types[i$5] = "L"; - } else if (isStrong.test(type$4)) { - cur$1 = type$4; - } - } - for (var i$6 = 0; i$6 < len; ++i$6) { - if (isNeutral.test(types[i$6])) { - var end$1 = void 0; - for (end$1 = i$6 + 1; end$1 < len && isNeutral.test(types[end$1]); ++end$1) {} - var before = (i$6 ? types[i$6 - 1] : outerType) == "L"; - var after = (end$1 < len ? types[end$1] : outerType) == "L"; - var replace$1 = before == after ? before ? "L" : "R" : outerType; - for (var j$1 = i$6; j$1 < end$1; ++j$1) { - types[j$1] = replace$1; - } - i$6 = end$1 - 1; - } - } - var order = [], - m; - for (var i$7 = 0; i$7 < len;) { - if (countsAsLeft.test(types[i$7])) { - var start = i$7; - for (++i$7; i$7 < len && countsAsLeft.test(types[i$7]); ++i$7) {} - order.push(new BidiSpan(0, start, i$7)); - } else { - var pos = i$7, - at = order.length, - isRTL = direction == "rtl" ? 1 : 0; - for (++i$7; i$7 < len && types[i$7] != "L"; ++i$7) {} - for (var j$2 = pos; j$2 < i$7;) { - if (countsAsNum.test(types[j$2])) { - if (pos < j$2) { - order.splice(at, 0, new BidiSpan(1, pos, j$2)); - at += isRTL; - } - var nstart = j$2; - for (++j$2; j$2 < i$7 && countsAsNum.test(types[j$2]); ++j$2) {} - order.splice(at, 0, new BidiSpan(2, nstart, j$2)); - at += isRTL; - pos = j$2; - } else { - ++j$2; - } - } - if (pos < i$7) { - order.splice(at, 0, new BidiSpan(1, pos, i$7)); - } - } - } - if (direction == "ltr") { - if (order[0].level == 1 && (m = str.match(/^\s+/))) { - order[0].from = m[0].length; - order.unshift(new BidiSpan(0, 0, m[0].length)); - } - if (lst(order).level == 1 && (m = str.match(/\s+$/))) { - lst(order).to -= m[0].length; - order.push(new BidiSpan(0, len - m[0].length, len)); - } - } - return direction == "rtl" ? order.reverse() : order; - }; - }(); - function getOrder(line, direction) { - var order = line.order; - if (order == null) { - order = line.order = bidiOrdering(line.text, direction); - } - return order; - } - var noHandlers = []; - var on = function (emitter, type, f) { - if (emitter.addEventListener) { - emitter.addEventListener(type, f, false); - } else if (emitter.attachEvent) { - emitter.attachEvent("on" + type, f); - } else { - var map2 = emitter._handlers || (emitter._handlers = {}); - map2[type] = (map2[type] || noHandlers).concat(f); - } - }; - function getHandlers(emitter, type) { - return emitter._handlers && emitter._handlers[type] || noHandlers; - } - function off(emitter, type, f) { - if (emitter.removeEventListener) { - emitter.removeEventListener(type, f, false); - } else if (emitter.detachEvent) { - emitter.detachEvent("on" + type, f); - } else { - var map2 = emitter._handlers, - arr = map2 && map2[type]; - if (arr) { - var index = indexOf(arr, f); - if (index > -1) { - map2[type] = arr.slice(0, index).concat(arr.slice(index + 1)); - } - } - } - } - function signal(emitter, type) { - var handlers = getHandlers(emitter, type); - if (!handlers.length) { - return; - } - var args = Array.prototype.slice.call(arguments, 2); - for (var i2 = 0; i2 < handlers.length; ++i2) { - handlers[i2].apply(null, args); - } - } - function signalDOMEvent(cm, e, override) { - if (typeof e == "string") { - e = { - type: e, - preventDefault: function () { - this.defaultPrevented = true; - } - }; - } - signal(cm, override || e.type, cm, e); - return e_defaultPrevented(e) || e.codemirrorIgnore; - } - function signalCursorActivity(cm) { - var arr = cm._handlers && cm._handlers.cursorActivity; - if (!arr) { - return; - } - var set = cm.curOp.cursorActivityHandlers || (cm.curOp.cursorActivityHandlers = []); - for (var i2 = 0; i2 < arr.length; ++i2) { - if (indexOf(set, arr[i2]) == -1) { - set.push(arr[i2]); - } - } - } - function hasHandler(emitter, type) { - return getHandlers(emitter, type).length > 0; - } - function eventMixin(ctor) { - ctor.prototype.on = function (type, f) { - on(this, type, f); - }; - ctor.prototype.off = function (type, f) { - off(this, type, f); - }; - } - function e_preventDefault(e) { - if (e.preventDefault) { - e.preventDefault(); - } else { - e.returnValue = false; - } - } - function e_stopPropagation(e) { - if (e.stopPropagation) { - e.stopPropagation(); - } else { - e.cancelBubble = true; - } - } - function e_defaultPrevented(e) { - return e.defaultPrevented != null ? e.defaultPrevented : e.returnValue == false; - } - function e_stop(e) { - e_preventDefault(e); - e_stopPropagation(e); - } - function e_target(e) { - return e.target || e.srcElement; - } - function e_button(e) { - var b = e.which; - if (b == null) { - if (e.button & 1) { - b = 1; - } else if (e.button & 2) { - b = 3; - } else if (e.button & 4) { - b = 2; - } - } - if (mac && e.ctrlKey && b == 1) { - b = 3; - } - return b; - } - var dragAndDrop = function () { - if (ie && ie_version < 9) { - return false; - } - var div = elt("div"); - return "draggable" in div || "dragDrop" in div; - }(); - var zwspSupported; - function zeroWidthElement(measure) { - if (zwspSupported == null) { - var test = elt("span", "​"); - removeChildrenAndAdd(measure, elt("span", [test, document.createTextNode("x")])); - if (measure.firstChild.offsetHeight != 0) { - zwspSupported = test.offsetWidth <= 1 && test.offsetHeight > 2 && !(ie && ie_version < 8); - } - } - var node = zwspSupported ? elt("span", "​") : elt("span", " ", null, "display: inline-block; width: 1px; margin-right: -1px"); - node.setAttribute("cm-text", ""); - return node; - } - var badBidiRects; - function hasBadBidiRects(measure) { - if (badBidiRects != null) { - return badBidiRects; - } - var txt = removeChildrenAndAdd(measure, document.createTextNode("AخA")); - var r0 = range(txt, 0, 1).getBoundingClientRect(); - var r1 = range(txt, 1, 2).getBoundingClientRect(); - removeChildren(measure); - if (!r0 || r0.left == r0.right) { - return false; - } - return badBidiRects = r1.right - r0.right < 3; - } - var splitLinesAuto = "\n\nb".split(/\n/).length != 3 ? function (string) { - var pos = 0, - result = [], - l = string.length; - while (pos <= l) { - var nl = string.indexOf("\n", pos); - if (nl == -1) { - nl = string.length; - } - var line = string.slice(pos, string.charAt(nl - 1) == "\r" ? nl - 1 : nl); - var rt = line.indexOf("\r"); - if (rt != -1) { - result.push(line.slice(0, rt)); - pos += rt + 1; - } else { - result.push(line); - pos = nl + 1; - } - } - return result; - } : function (string) { - return string.split(/\r\n?|\n/); - }; - var hasSelection = window.getSelection ? function (te) { - try { - return te.selectionStart != te.selectionEnd; - } catch (e) { - return false; - } - } : function (te) { - var range2; - try { - range2 = te.ownerDocument.selection.createRange(); - } catch (e) {} - if (!range2 || range2.parentElement() != te) { - return false; - } - return range2.compareEndPoints("StartToEnd", range2) != 0; - }; - var hasCopyEvent = function () { - var e = elt("div"); - if ("oncopy" in e) { - return true; - } - e.setAttribute("oncopy", "return;"); - return typeof e.oncopy == "function"; - }(); - var badZoomedRects = null; - function hasBadZoomedRects(measure) { - if (badZoomedRects != null) { - return badZoomedRects; - } - var node = removeChildrenAndAdd(measure, elt("span", "x")); - var normal = node.getBoundingClientRect(); - var fromRange = range(node, 0, 1).getBoundingClientRect(); - return badZoomedRects = Math.abs(normal.left - fromRange.left) > 1; - } - var modes = {}, - mimeModes = {}; - function defineMode(name, mode) { - if (arguments.length > 2) { - mode.dependencies = Array.prototype.slice.call(arguments, 2); - } - modes[name] = mode; - } - function defineMIME(mime, spec) { - mimeModes[mime] = spec; - } - function resolveMode(spec) { - if (typeof spec == "string" && mimeModes.hasOwnProperty(spec)) { - spec = mimeModes[spec]; - } else if (spec && typeof spec.name == "string" && mimeModes.hasOwnProperty(spec.name)) { - var found = mimeModes[spec.name]; - if (typeof found == "string") { - found = { - name: found - }; - } - spec = createObj(found, spec); - spec.name = found.name; - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec)) { - return resolveMode("application/xml"); - } else if (typeof spec == "string" && /^[\w\-]+\/[\w\-]+\+json$/.test(spec)) { - return resolveMode("application/json"); - } - if (typeof spec == "string") { - return { - name: spec - }; - } else { - return spec || { - name: "null" - }; - } - } - function getMode(options, spec) { - spec = resolveMode(spec); - var mfactory = modes[spec.name]; - if (!mfactory) { - return getMode(options, "text/plain"); - } - var modeObj = mfactory(options, spec); - if (modeExtensions.hasOwnProperty(spec.name)) { - var exts = modeExtensions[spec.name]; - for (var prop2 in exts) { - if (!exts.hasOwnProperty(prop2)) { - continue; - } - if (modeObj.hasOwnProperty(prop2)) { - modeObj["_" + prop2] = modeObj[prop2]; - } - modeObj[prop2] = exts[prop2]; - } - } - modeObj.name = spec.name; - if (spec.helperType) { - modeObj.helperType = spec.helperType; - } - if (spec.modeProps) { - for (var prop$1 in spec.modeProps) { - modeObj[prop$1] = spec.modeProps[prop$1]; - } - } - return modeObj; - } - var modeExtensions = {}; - function extendMode(mode, properties) { - var exts = modeExtensions.hasOwnProperty(mode) ? modeExtensions[mode] : modeExtensions[mode] = {}; - copyObj(properties, exts); - } - function copyState(mode, state) { - if (state === true) { - return state; - } - if (mode.copyState) { - return mode.copyState(state); - } - var nstate = {}; - for (var n in state) { - var val = state[n]; - if (val instanceof Array) { - val = val.concat([]); - } - nstate[n] = val; - } - return nstate; - } - function innerMode(mode, state) { - var info; - while (mode.innerMode) { - info = mode.innerMode(state); - if (!info || info.mode == mode) { - break; - } - state = info.state; - mode = info.mode; - } - return info || { - mode, - state - }; - } - function startState(mode, a1, a2) { - return mode.startState ? mode.startState(a1, a2) : true; - } - var StringStream = function (string, tabSize, lineOracle) { - this.pos = this.start = 0; - this.string = string; - this.tabSize = tabSize || 8; - this.lastColumnPos = this.lastColumnValue = 0; - this.lineStart = 0; - this.lineOracle = lineOracle; - }; - StringStream.prototype.eol = function () { - return this.pos >= this.string.length; - }; - StringStream.prototype.sol = function () { - return this.pos == this.lineStart; - }; - StringStream.prototype.peek = function () { - return this.string.charAt(this.pos) || void 0; - }; - StringStream.prototype.next = function () { - if (this.pos < this.string.length) { - return this.string.charAt(this.pos++); - } - }; - StringStream.prototype.eat = function (match) { - var ch = this.string.charAt(this.pos); - var ok; - if (typeof match == "string") { - ok = ch == match; - } else { - ok = ch && (match.test ? match.test(ch) : match(ch)); - } - if (ok) { - ++this.pos; - return ch; - } - }; - StringStream.prototype.eatWhile = function (match) { - var start = this.pos; - while (this.eat(match)) {} - return this.pos > start; - }; - StringStream.prototype.eatSpace = function () { - var start = this.pos; - while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) { - ++this.pos; - } - return this.pos > start; - }; - StringStream.prototype.skipToEnd = function () { - this.pos = this.string.length; - }; - StringStream.prototype.skipTo = function (ch) { - var found = this.string.indexOf(ch, this.pos); - if (found > -1) { - this.pos = found; - return true; - } - }; - StringStream.prototype.backUp = function (n) { - this.pos -= n; - }; - StringStream.prototype.column = function () { - if (this.lastColumnPos < this.start) { - this.lastColumnValue = countColumn(this.string, this.start, this.tabSize, this.lastColumnPos, this.lastColumnValue); - this.lastColumnPos = this.start; - } - return this.lastColumnValue - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); - }; - StringStream.prototype.indentation = function () { - return countColumn(this.string, null, this.tabSize) - (this.lineStart ? countColumn(this.string, this.lineStart, this.tabSize) : 0); - }; - StringStream.prototype.match = function (pattern, consume, caseInsensitive) { - if (typeof pattern == "string") { - var cased = function (str) { - return caseInsensitive ? str.toLowerCase() : str; - }; - var substr = this.string.substr(this.pos, pattern.length); - if (cased(substr) == cased(pattern)) { - if (consume !== false) { - this.pos += pattern.length; - } - return true; - } - } else { - var match = this.string.slice(this.pos).match(pattern); - if (match && match.index > 0) { - return null; - } - if (match && consume !== false) { - this.pos += match[0].length; - } - return match; - } - }; - StringStream.prototype.current = function () { - return this.string.slice(this.start, this.pos); - }; - StringStream.prototype.hideFirstChars = function (n, inner) { - this.lineStart += n; - try { - return inner(); - } finally { - this.lineStart -= n; - } - }; - StringStream.prototype.lookAhead = function (n) { - var oracle = this.lineOracle; - return oracle && oracle.lookAhead(n); - }; - StringStream.prototype.baseToken = function () { - var oracle = this.lineOracle; - return oracle && oracle.baseToken(this.pos); - }; - function getLine(doc, n) { - n -= doc.first; - if (n < 0 || n >= doc.size) { - throw new Error("There is no line " + (n + doc.first) + " in the document."); - } - var chunk = doc; - while (!chunk.lines) { - for (var i2 = 0;; ++i2) { - var child = chunk.children[i2], - sz = child.chunkSize(); - if (n < sz) { - chunk = child; - break; - } - n -= sz; - } - } - return chunk.lines[n]; - } - function getBetween(doc, start, end) { - var out = [], - n = start.line; - doc.iter(start.line, end.line + 1, function (line) { - var text = line.text; - if (n == end.line) { - text = text.slice(0, end.ch); - } - if (n == start.line) { - text = text.slice(start.ch); - } - out.push(text); - ++n; - }); - return out; - } - function getLines(doc, from, to) { - var out = []; - doc.iter(from, to, function (line) { - out.push(line.text); - }); - return out; - } - function updateLineHeight(line, height) { - var diff = height - line.height; - if (diff) { - for (var n = line; n; n = n.parent) { - n.height += diff; - } - } - } - function lineNo(line) { - if (line.parent == null) { - return null; - } - var cur = line.parent, - no = indexOf(cur.lines, line); - for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) { - for (var i2 = 0;; ++i2) { - if (chunk.children[i2] == cur) { - break; - } - no += chunk.children[i2].chunkSize(); - } - } - return no + cur.first; - } - function lineAtHeight(chunk, h) { - var n = chunk.first; - outer: do { - for (var i$12 = 0; i$12 < chunk.children.length; ++i$12) { - var child = chunk.children[i$12], - ch = child.height; - if (h < ch) { - chunk = child; - continue outer; - } - h -= ch; - n += child.chunkSize(); - } - return n; - } while (!chunk.lines); - var i2 = 0; - for (; i2 < chunk.lines.length; ++i2) { - var line = chunk.lines[i2], - lh = line.height; - if (h < lh) { - break; - } - h -= lh; - } - return n + i2; - } - function isLine(doc, l) { - return l >= doc.first && l < doc.first + doc.size; - } - function lineNumberFor(options, i2) { - return String(options.lineNumberFormatter(i2 + options.firstLineNumber)); - } - function Pos(line, ch, sticky) { - if (sticky === void 0) sticky = null; - if (!(this instanceof Pos)) { - return new Pos(line, ch, sticky); - } - this.line = line; - this.ch = ch; - this.sticky = sticky; - } - function cmp(a, b) { - return a.line - b.line || a.ch - b.ch; - } - function equalCursorPos(a, b) { - return a.sticky == b.sticky && cmp(a, b) == 0; - } - function copyPos(x) { - return Pos(x.line, x.ch); - } - function maxPos(a, b) { - return cmp(a, b) < 0 ? b : a; - } - function minPos(a, b) { - return cmp(a, b) < 0 ? a : b; - } - function clipLine(doc, n) { - return Math.max(doc.first, Math.min(n, doc.first + doc.size - 1)); - } - function clipPos(doc, pos) { - if (pos.line < doc.first) { - return Pos(doc.first, 0); - } - var last = doc.first + doc.size - 1; - if (pos.line > last) { - return Pos(last, getLine(doc, last).text.length); - } - return clipToLen(pos, getLine(doc, pos.line).text.length); - } - function clipToLen(pos, linelen) { - var ch = pos.ch; - if (ch == null || ch > linelen) { - return Pos(pos.line, linelen); - } else if (ch < 0) { - return Pos(pos.line, 0); - } else { - return pos; - } - } - function clipPosArray(doc, array) { - var out = []; - for (var i2 = 0; i2 < array.length; i2++) { - out[i2] = clipPos(doc, array[i2]); - } - return out; - } - var SavedContext = function (state, lookAhead) { - this.state = state; - this.lookAhead = lookAhead; - }; - var Context = function (doc, state, line, lookAhead) { - this.state = state; - this.doc = doc; - this.line = line; - this.maxLookAhead = lookAhead || 0; - this.baseTokens = null; - this.baseTokenPos = 1; - }; - Context.prototype.lookAhead = function (n) { - var line = this.doc.getLine(this.line + n); - if (line != null && n > this.maxLookAhead) { - this.maxLookAhead = n; - } - return line; - }; - Context.prototype.baseToken = function (n) { - if (!this.baseTokens) { - return null; - } - while (this.baseTokens[this.baseTokenPos] <= n) { - this.baseTokenPos += 2; - } - var type = this.baseTokens[this.baseTokenPos + 1]; - return { - type: type && type.replace(/( |^)overlay .*/, ""), - size: this.baseTokens[this.baseTokenPos] - n - }; - }; - Context.prototype.nextLine = function () { - this.line++; - if (this.maxLookAhead > 0) { - this.maxLookAhead--; - } - }; - Context.fromSaved = function (doc, saved, line) { - if (saved instanceof SavedContext) { - return new Context(doc, copyState(doc.mode, saved.state), line, saved.lookAhead); - } else { - return new Context(doc, copyState(doc.mode, saved), line); - } - }; - Context.prototype.save = function (copy) { - var state = copy !== false ? copyState(this.doc.mode, this.state) : this.state; - return this.maxLookAhead > 0 ? new SavedContext(state, this.maxLookAhead) : state; - }; - function highlightLine(cm, line, context, forceToEnd) { - var st = [cm.state.modeGen], - lineClasses = {}; - runMode(cm, line.text, cm.doc.mode, context, function (end, style) { - return st.push(end, style); - }, lineClasses, forceToEnd); - var state = context.state; - var loop = function (o2) { - context.baseTokens = st; - var overlay = cm.state.overlays[o2], - i2 = 1, - at = 0; - context.state = true; - runMode(cm, line.text, overlay.mode, context, function (end, style) { - var start = i2; - while (at < end) { - var i_end = st[i2]; - if (i_end > end) { - st.splice(i2, 1, end, st[i2 + 1], i_end); - } - i2 += 2; - at = Math.min(end, i_end); - } - if (!style) { - return; - } - if (overlay.opaque) { - st.splice(start, i2 - start, end, "overlay " + style); - i2 = start + 2; - } else { - for (; start < i2; start += 2) { - var cur = st[start + 1]; - st[start + 1] = (cur ? cur + " " : "") + "overlay " + style; - } - } - }, lineClasses); - context.state = state; - context.baseTokens = null; - context.baseTokenPos = 1; - }; - for (var o = 0; o < cm.state.overlays.length; ++o) loop(o); - return { - styles: st, - classes: lineClasses.bgClass || lineClasses.textClass ? lineClasses : null - }; - } - function getLineStyles(cm, line, updateFrontier) { - if (!line.styles || line.styles[0] != cm.state.modeGen) { - var context = getContextBefore(cm, lineNo(line)); - var resetState = line.text.length > cm.options.maxHighlightLength && copyState(cm.doc.mode, context.state); - var result = highlightLine(cm, line, context); - if (resetState) { - context.state = resetState; - } - line.stateAfter = context.save(!resetState); - line.styles = result.styles; - if (result.classes) { - line.styleClasses = result.classes; - } else if (line.styleClasses) { - line.styleClasses = null; - } - if (updateFrontier === cm.doc.highlightFrontier) { - cm.doc.modeFrontier = Math.max(cm.doc.modeFrontier, ++cm.doc.highlightFrontier); - } - } - return line.styles; - } - function getContextBefore(cm, n, precise) { - var doc = cm.doc, - display = cm.display; - if (!doc.mode.startState) { - return new Context(doc, true, n); - } - var start = findStartLine(cm, n, precise); - var saved = start > doc.first && getLine(doc, start - 1).stateAfter; - var context = saved ? Context.fromSaved(doc, saved, start) : new Context(doc, startState(doc.mode), start); - doc.iter(start, n, function (line) { - processLine(cm, line.text, context); - var pos = context.line; - line.stateAfter = pos == n - 1 || pos % 5 == 0 || pos >= display.viewFrom && pos < display.viewTo ? context.save() : null; - context.nextLine(); - }); - if (precise) { - doc.modeFrontier = context.line; - } - return context; - } - function processLine(cm, text, context, startAt) { - var mode = cm.doc.mode; - var stream = new StringStream(text, cm.options.tabSize, context); - stream.start = stream.pos = startAt || 0; - if (text == "") { - callBlankLine(mode, context.state); - } - while (!stream.eol()) { - readToken(mode, stream, context.state); - stream.start = stream.pos; - } - } - function callBlankLine(mode, state) { - if (mode.blankLine) { - return mode.blankLine(state); - } - if (!mode.innerMode) { - return; - } - var inner = innerMode(mode, state); - if (inner.mode.blankLine) { - return inner.mode.blankLine(inner.state); - } - } - function readToken(mode, stream, state, inner) { - for (var i2 = 0; i2 < 10; i2++) { - if (inner) { - inner[0] = innerMode(mode, state).mode; - } - var style = mode.token(stream, state); - if (stream.pos > stream.start) { - return style; - } - } - throw new Error("Mode " + mode.name + " failed to advance stream."); - } - var Token = function (stream, type, state) { - this.start = stream.start; - this.end = stream.pos; - this.string = stream.current(); - this.type = type || null; - this.state = state; - }; - function takeToken(cm, pos, precise, asArray) { - var doc = cm.doc, - mode = doc.mode, - style; - pos = clipPos(doc, pos); - var line = getLine(doc, pos.line), - context = getContextBefore(cm, pos.line, precise); - var stream = new StringStream(line.text, cm.options.tabSize, context), - tokens; - if (asArray) { - tokens = []; - } - while ((asArray || stream.pos < pos.ch) && !stream.eol()) { - stream.start = stream.pos; - style = readToken(mode, stream, context.state); - if (asArray) { - tokens.push(new Token(stream, style, copyState(doc.mode, context.state))); - } - } - return asArray ? tokens : new Token(stream, style, context.state); - } - function extractLineClasses(type, output) { - if (type) { - for (;;) { - var lineClass = type.match(/(?:^|\s+)line-(background-)?(\S+)/); - if (!lineClass) { - break; - } - type = type.slice(0, lineClass.index) + type.slice(lineClass.index + lineClass[0].length); - var prop2 = lineClass[1] ? "bgClass" : "textClass"; - if (output[prop2] == null) { - output[prop2] = lineClass[2]; - } else if (!new RegExp("(?:^|\\s)" + lineClass[2] + "(?:$|\\s)").test(output[prop2])) { - output[prop2] += " " + lineClass[2]; - } - } - } - return type; - } - function runMode(cm, text, mode, context, f, lineClasses, forceToEnd) { - var flattenSpans = mode.flattenSpans; - if (flattenSpans == null) { - flattenSpans = cm.options.flattenSpans; - } - var curStart = 0, - curStyle = null; - var stream = new StringStream(text, cm.options.tabSize, context), - style; - var inner = cm.options.addModeClass && [null]; - if (text == "") { - extractLineClasses(callBlankLine(mode, context.state), lineClasses); - } - while (!stream.eol()) { - if (stream.pos > cm.options.maxHighlightLength) { - flattenSpans = false; - if (forceToEnd) { - processLine(cm, text, context, stream.pos); - } - stream.pos = text.length; - style = null; - } else { - style = extractLineClasses(readToken(mode, stream, context.state, inner), lineClasses); - } - if (inner) { - var mName = inner[0].name; - if (mName) { - style = "m-" + (style ? mName + " " + style : mName); - } - } - if (!flattenSpans || curStyle != style) { - while (curStart < stream.start) { - curStart = Math.min(stream.start, curStart + 5e3); - f(curStart, curStyle); - } - curStyle = style; - } - stream.start = stream.pos; - } - while (curStart < stream.pos) { - var pos = Math.min(stream.pos, curStart + 5e3); - f(pos, curStyle); - curStart = pos; - } - } - function findStartLine(cm, n, precise) { - var minindent, - minline, - doc = cm.doc; - var lim = precise ? -1 : n - (cm.doc.mode.innerMode ? 1e3 : 100); - for (var search = n; search > lim; --search) { - if (search <= doc.first) { - return doc.first; - } - var line = getLine(doc, search - 1), - after = line.stateAfter; - if (after && (!precise || search + (after instanceof SavedContext ? after.lookAhead : 0) <= doc.modeFrontier)) { - return search; - } - var indented = countColumn(line.text, null, cm.options.tabSize); - if (minline == null || minindent > indented) { - minline = search - 1; - minindent = indented; - } - } - return minline; - } - function retreatFrontier(doc, n) { - doc.modeFrontier = Math.min(doc.modeFrontier, n); - if (doc.highlightFrontier < n - 10) { - return; - } - var start = doc.first; - for (var line = n - 1; line > start; line--) { - var saved = getLine(doc, line).stateAfter; - if (saved && (!(saved instanceof SavedContext) || line + saved.lookAhead < n)) { - start = line + 1; - break; - } - } - doc.highlightFrontier = Math.min(doc.highlightFrontier, start); - } - var sawReadOnlySpans = false, - sawCollapsedSpans = false; - function seeReadOnlySpans() { - sawReadOnlySpans = true; - } - function seeCollapsedSpans() { - sawCollapsedSpans = true; - } - function MarkedSpan(marker, from, to) { - this.marker = marker; - this.from = from; - this.to = to; - } - function getMarkedSpanFor(spans, marker) { - if (spans) { - for (var i2 = 0; i2 < spans.length; ++i2) { - var span = spans[i2]; - if (span.marker == marker) { - return span; - } - } - } - } - function removeMarkedSpan(spans, span) { - var r; - for (var i2 = 0; i2 < spans.length; ++i2) { - if (spans[i2] != span) { - (r || (r = [])).push(spans[i2]); - } - } - return r; - } - function addMarkedSpan(line, span, op) { - var inThisOp = op && window.WeakSet && (op.markedSpans || (op.markedSpans = /* @__PURE__ */new WeakSet())); - if (inThisOp && line.markedSpans && inThisOp.has(line.markedSpans)) { - line.markedSpans.push(span); - } else { - line.markedSpans = line.markedSpans ? line.markedSpans.concat([span]) : [span]; - if (inThisOp) { - inThisOp.add(line.markedSpans); - } - } - span.marker.attachLine(line); - } - function markedSpansBefore(old, startCh, isInsert) { - var nw; - if (old) { - for (var i2 = 0; i2 < old.length; ++i2) { - var span = old[i2], - marker = span.marker; - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh); - if (startsBefore || span.from == startCh && marker.type == "bookmark" && (!isInsert || !span.marker.insertLeft)) { - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= startCh : span.to > startCh); - (nw || (nw = [])).push(new MarkedSpan(marker, span.from, endsAfter ? null : span.to)); - } - } - } - return nw; - } - function markedSpansAfter(old, endCh, isInsert) { - var nw; - if (old) { - for (var i2 = 0; i2 < old.length; ++i2) { - var span = old[i2], - marker = span.marker; - var endsAfter = span.to == null || (marker.inclusiveRight ? span.to >= endCh : span.to > endCh); - if (endsAfter || span.from == endCh && marker.type == "bookmark" && (!isInsert || span.marker.insertLeft)) { - var startsBefore = span.from == null || (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh); - (nw || (nw = [])).push(new MarkedSpan(marker, startsBefore ? null : span.from - endCh, span.to == null ? null : span.to - endCh)); - } - } - } - return nw; - } - function stretchSpansOverChange(doc, change) { - if (change.full) { - return null; - } - var oldFirst = isLine(doc, change.from.line) && getLine(doc, change.from.line).markedSpans; - var oldLast = isLine(doc, change.to.line) && getLine(doc, change.to.line).markedSpans; - if (!oldFirst && !oldLast) { - return null; - } - var startCh = change.from.ch, - endCh = change.to.ch, - isInsert = cmp(change.from, change.to) == 0; - var first = markedSpansBefore(oldFirst, startCh, isInsert); - var last = markedSpansAfter(oldLast, endCh, isInsert); - var sameLine = change.text.length == 1, - offset = lst(change.text).length + (sameLine ? startCh : 0); - if (first) { - for (var i2 = 0; i2 < first.length; ++i2) { - var span = first[i2]; - if (span.to == null) { - var found = getMarkedSpanFor(last, span.marker); - if (!found) { - span.to = startCh; - } else if (sameLine) { - span.to = found.to == null ? null : found.to + offset; - } - } - } - } - if (last) { - for (var i$12 = 0; i$12 < last.length; ++i$12) { - var span$1 = last[i$12]; - if (span$1.to != null) { - span$1.to += offset; - } - if (span$1.from == null) { - var found$1 = getMarkedSpanFor(first, span$1.marker); - if (!found$1) { - span$1.from = offset; - if (sameLine) { - (first || (first = [])).push(span$1); - } - } - } else { - span$1.from += offset; - if (sameLine) { - (first || (first = [])).push(span$1); - } - } - } - } - if (first) { - first = clearEmptySpans(first); - } - if (last && last != first) { - last = clearEmptySpans(last); - } - var newMarkers = [first]; - if (!sameLine) { - var gap = change.text.length - 2, - gapMarkers; - if (gap > 0 && first) { - for (var i$22 = 0; i$22 < first.length; ++i$22) { - if (first[i$22].to == null) { - (gapMarkers || (gapMarkers = [])).push(new MarkedSpan(first[i$22].marker, null, null)); - } - } - } - for (var i$3 = 0; i$3 < gap; ++i$3) { - newMarkers.push(gapMarkers); - } - newMarkers.push(last); - } - return newMarkers; - } - function clearEmptySpans(spans) { - for (var i2 = 0; i2 < spans.length; ++i2) { - var span = spans[i2]; - if (span.from != null && span.from == span.to && span.marker.clearWhenEmpty !== false) { - spans.splice(i2--, 1); - } - } - if (!spans.length) { - return null; - } - return spans; - } - function removeReadOnlyRanges(doc, from, to) { - var markers = null; - doc.iter(from.line, to.line + 1, function (line) { - if (line.markedSpans) { - for (var i3 = 0; i3 < line.markedSpans.length; ++i3) { - var mark = line.markedSpans[i3].marker; - if (mark.readOnly && (!markers || indexOf(markers, mark) == -1)) { - (markers || (markers = [])).push(mark); - } - } - } - }); - if (!markers) { - return null; - } - var parts = [{ - from, - to - }]; - for (var i2 = 0; i2 < markers.length; ++i2) { - var mk = markers[i2], - m = mk.find(0); - for (var j = 0; j < parts.length; ++j) { - var p = parts[j]; - if (cmp(p.to, m.from) < 0 || cmp(p.from, m.to) > 0) { - continue; - } - var newParts = [j, 1], - dfrom = cmp(p.from, m.from), - dto = cmp(p.to, m.to); - if (dfrom < 0 || !mk.inclusiveLeft && !dfrom) { - newParts.push({ - from: p.from, - to: m.from - }); - } - if (dto > 0 || !mk.inclusiveRight && !dto) { - newParts.push({ - from: m.to, - to: p.to - }); - } - parts.splice.apply(parts, newParts); - j += newParts.length - 3; - } - } - return parts; - } - function detachMarkedSpans(line) { - var spans = line.markedSpans; - if (!spans) { - return; - } - for (var i2 = 0; i2 < spans.length; ++i2) { - spans[i2].marker.detachLine(line); - } - line.markedSpans = null; - } - function attachMarkedSpans(line, spans) { - if (!spans) { - return; - } - for (var i2 = 0; i2 < spans.length; ++i2) { - spans[i2].marker.attachLine(line); - } - line.markedSpans = spans; - } - function extraLeft(marker) { - return marker.inclusiveLeft ? -1 : 0; - } - function extraRight(marker) { - return marker.inclusiveRight ? 1 : 0; - } - function compareCollapsedMarkers(a, b) { - var lenDiff = a.lines.length - b.lines.length; - if (lenDiff != 0) { - return lenDiff; - } - var aPos = a.find(), - bPos = b.find(); - var fromCmp = cmp(aPos.from, bPos.from) || extraLeft(a) - extraLeft(b); - if (fromCmp) { - return -fromCmp; - } - var toCmp = cmp(aPos.to, bPos.to) || extraRight(a) - extraRight(b); - if (toCmp) { - return toCmp; - } - return b.id - a.id; - } - function collapsedSpanAtSide(line, start) { - var sps = sawCollapsedSpans && line.markedSpans, - found; - if (sps) { - for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { - sp = sps[i2]; - if (sp.marker.collapsed && (start ? sp.from : sp.to) == null && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { - found = sp.marker; - } - } - } - return found; - } - function collapsedSpanAtStart(line) { - return collapsedSpanAtSide(line, true); - } - function collapsedSpanAtEnd(line) { - return collapsedSpanAtSide(line, false); - } - function collapsedSpanAround(line, ch) { - var sps = sawCollapsedSpans && line.markedSpans, - found; - if (sps) { - for (var i2 = 0; i2 < sps.length; ++i2) { - var sp = sps[i2]; - if (sp.marker.collapsed && (sp.from == null || sp.from < ch) && (sp.to == null || sp.to > ch) && (!found || compareCollapsedMarkers(found, sp.marker) < 0)) { - found = sp.marker; - } - } - } - return found; - } - function conflictingCollapsedRange(doc, lineNo2, from, to, marker) { - var line = getLine(doc, lineNo2); - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { - for (var i2 = 0; i2 < sps.length; ++i2) { - var sp = sps[i2]; - if (!sp.marker.collapsed) { - continue; - } - var found = sp.marker.find(0); - var fromCmp = cmp(found.from, from) || extraLeft(sp.marker) - extraLeft(marker); - var toCmp = cmp(found.to, to) || extraRight(sp.marker) - extraRight(marker); - if (fromCmp >= 0 && toCmp <= 0 || fromCmp <= 0 && toCmp >= 0) { - continue; - } - if (fromCmp <= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.to, from) >= 0 : cmp(found.to, from) > 0) || fromCmp >= 0 && (sp.marker.inclusiveRight && marker.inclusiveLeft ? cmp(found.from, to) <= 0 : cmp(found.from, to) < 0)) { - return true; - } - } - } - } - function visualLine(line) { - var merged; - while (merged = collapsedSpanAtStart(line)) { - line = merged.find(-1, true).line; - } - return line; - } - function visualLineEnd(line) { - var merged; - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line; - } - return line; - } - function visualLineContinued(line) { - var merged, lines; - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line; - (lines || (lines = [])).push(line); - } - return lines; - } - function visualLineNo(doc, lineN) { - var line = getLine(doc, lineN), - vis = visualLine(line); - if (line == vis) { - return lineN; - } - return lineNo(vis); - } - function visualLineEndNo(doc, lineN) { - if (lineN > doc.lastLine()) { - return lineN; - } - var line = getLine(doc, lineN), - merged; - if (!lineIsHidden(doc, line)) { - return lineN; - } - while (merged = collapsedSpanAtEnd(line)) { - line = merged.find(1, true).line; - } - return lineNo(line) + 1; - } - function lineIsHidden(doc, line) { - var sps = sawCollapsedSpans && line.markedSpans; - if (sps) { - for (var sp = void 0, i2 = 0; i2 < sps.length; ++i2) { - sp = sps[i2]; - if (!sp.marker.collapsed) { - continue; - } - if (sp.from == null) { - return true; - } - if (sp.marker.widgetNode) { - continue; - } - if (sp.from == 0 && sp.marker.inclusiveLeft && lineIsHiddenInner(doc, line, sp)) { - return true; - } - } - } - } - function lineIsHiddenInner(doc, line, span) { - if (span.to == null) { - var end = span.marker.find(1, true); - return lineIsHiddenInner(doc, end.line, getMarkedSpanFor(end.line.markedSpans, span.marker)); - } - if (span.marker.inclusiveRight && span.to == line.text.length) { - return true; - } - for (var sp = void 0, i2 = 0; i2 < line.markedSpans.length; ++i2) { - sp = line.markedSpans[i2]; - if (sp.marker.collapsed && !sp.marker.widgetNode && sp.from == span.to && (sp.to == null || sp.to != span.from) && (sp.marker.inclusiveLeft || span.marker.inclusiveRight) && lineIsHiddenInner(doc, line, sp)) { - return true; - } - } - } - function heightAtLine(lineObj) { - lineObj = visualLine(lineObj); - var h = 0, - chunk = lineObj.parent; - for (var i2 = 0; i2 < chunk.lines.length; ++i2) { - var line = chunk.lines[i2]; - if (line == lineObj) { - break; - } else { - h += line.height; - } - } - for (var p = chunk.parent; p; chunk = p, p = chunk.parent) { - for (var i$12 = 0; i$12 < p.children.length; ++i$12) { - var cur = p.children[i$12]; - if (cur == chunk) { - break; - } else { - h += cur.height; - } - } - } - return h; - } - function lineLength(line) { - if (line.height == 0) { - return 0; - } - var len = line.text.length, - merged, - cur = line; - while (merged = collapsedSpanAtStart(cur)) { - var found = merged.find(0, true); - cur = found.from.line; - len += found.from.ch - found.to.ch; - } - cur = line; - while (merged = collapsedSpanAtEnd(cur)) { - var found$1 = merged.find(0, true); - len -= cur.text.length - found$1.from.ch; - cur = found$1.to.line; - len += cur.text.length - found$1.to.ch; - } - return len; - } - function findMaxLine(cm) { - var d = cm.display, - doc = cm.doc; - d.maxLine = getLine(doc, doc.first); - d.maxLineLength = lineLength(d.maxLine); - d.maxLineChanged = true; - doc.iter(function (line) { - var len = lineLength(line); - if (len > d.maxLineLength) { - d.maxLineLength = len; - d.maxLine = line; - } - }); - } - var Line = function (text, markedSpans, estimateHeight2) { - this.text = text; - attachMarkedSpans(this, markedSpans); - this.height = estimateHeight2 ? estimateHeight2(this) : 1; - }; - Line.prototype.lineNo = function () { - return lineNo(this); - }; - eventMixin(Line); - function updateLine(line, text, markedSpans, estimateHeight2) { - line.text = text; - if (line.stateAfter) { - line.stateAfter = null; - } - if (line.styles) { - line.styles = null; - } - if (line.order != null) { - line.order = null; - } - detachMarkedSpans(line); - attachMarkedSpans(line, markedSpans); - var estHeight = estimateHeight2 ? estimateHeight2(line) : 1; - if (estHeight != line.height) { - updateLineHeight(line, estHeight); - } - } - function cleanUpLine(line) { - line.parent = null; - detachMarkedSpans(line); - } - var styleToClassCache = {}, - styleToClassCacheWithMode = {}; - function interpretTokenStyle(style, options) { - if (!style || /^\s*$/.test(style)) { - return null; - } - var cache = options.addModeClass ? styleToClassCacheWithMode : styleToClassCache; - return cache[style] || (cache[style] = style.replace(/\S+/g, "cm-$&")); - } - function buildLineContent(cm, lineView) { - var content = eltP("span", null, null, webkit ? "padding-right: .1px" : null); - var builder = { - pre: eltP("pre", [content], "CodeMirror-line"), - content, - col: 0, - pos: 0, - cm, - trailingSpace: false, - splitSpaces: cm.getOption("lineWrapping") - }; - lineView.measure = {}; - for (var i2 = 0; i2 <= (lineView.rest ? lineView.rest.length : 0); i2++) { - var line = i2 ? lineView.rest[i2 - 1] : lineView.line, - order = void 0; - builder.pos = 0; - builder.addToken = buildToken; - if (hasBadBidiRects(cm.display.measure) && (order = getOrder(line, cm.doc.direction))) { - builder.addToken = buildTokenBadBidi(builder.addToken, order); - } - builder.map = []; - var allowFrontierUpdate = lineView != cm.display.externalMeasured && lineNo(line); - insertLineContent(line, builder, getLineStyles(cm, line, allowFrontierUpdate)); - if (line.styleClasses) { - if (line.styleClasses.bgClass) { - builder.bgClass = joinClasses(line.styleClasses.bgClass, builder.bgClass || ""); - } - if (line.styleClasses.textClass) { - builder.textClass = joinClasses(line.styleClasses.textClass, builder.textClass || ""); - } - } - if (builder.map.length == 0) { - builder.map.push(0, 0, builder.content.appendChild(zeroWidthElement(cm.display.measure))); - } - if (i2 == 0) { - lineView.measure.map = builder.map; - lineView.measure.cache = {}; - } else { - (lineView.measure.maps || (lineView.measure.maps = [])).push(builder.map); - (lineView.measure.caches || (lineView.measure.caches = [])).push({}); - } - } - if (webkit) { - var last = builder.content.lastChild; - if (/\bcm-tab\b/.test(last.className) || last.querySelector && last.querySelector(".cm-tab")) { - builder.content.className = "cm-tab-wrap-hack"; - } - } - signal(cm, "renderLine", cm, lineView.line, builder.pre); - if (builder.pre.className) { - builder.textClass = joinClasses(builder.pre.className, builder.textClass || ""); - } - return builder; - } - function defaultSpecialCharPlaceholder(ch) { - var token = elt("span", "•", "cm-invalidchar"); - token.title = "\\u" + ch.charCodeAt(0).toString(16); - token.setAttribute("aria-label", token.title); - return token; - } - function buildToken(builder, text, style, startStyle, endStyle, css, attributes) { - if (!text) { - return; - } - var displayText = builder.splitSpaces ? splitSpaces(text, builder.trailingSpace) : text; - var special = builder.cm.state.specialChars, - mustWrap = false; - var content; - if (!special.test(text)) { - builder.col += text.length; - content = document.createTextNode(displayText); - builder.map.push(builder.pos, builder.pos + text.length, content); - if (ie && ie_version < 9) { - mustWrap = true; - } - builder.pos += text.length; - } else { - content = document.createDocumentFragment(); - var pos = 0; - while (true) { - special.lastIndex = pos; - var m = special.exec(text); - var skipped = m ? m.index - pos : text.length - pos; - if (skipped) { - var txt = document.createTextNode(displayText.slice(pos, pos + skipped)); - if (ie && ie_version < 9) { - content.appendChild(elt("span", [txt])); - } else { - content.appendChild(txt); - } - builder.map.push(builder.pos, builder.pos + skipped, txt); - builder.col += skipped; - builder.pos += skipped; - } - if (!m) { - break; - } - pos += skipped + 1; - var txt$1 = void 0; - if (m[0] == " ") { - var tabSize = builder.cm.options.tabSize, - tabWidth = tabSize - builder.col % tabSize; - txt$1 = content.appendChild(elt("span", spaceStr(tabWidth), "cm-tab")); - txt$1.setAttribute("role", "presentation"); - txt$1.setAttribute("cm-text", " "); - builder.col += tabWidth; - } else if (m[0] == "\r" || m[0] == "\n") { - txt$1 = content.appendChild(elt("span", m[0] == "\r" ? "␍" : "␤", "cm-invalidchar")); - txt$1.setAttribute("cm-text", m[0]); - builder.col += 1; - } else { - txt$1 = builder.cm.options.specialCharPlaceholder(m[0]); - txt$1.setAttribute("cm-text", m[0]); - if (ie && ie_version < 9) { - content.appendChild(elt("span", [txt$1])); - } else { - content.appendChild(txt$1); - } - builder.col += 1; - } - builder.map.push(builder.pos, builder.pos + 1, txt$1); - builder.pos++; - } - } - builder.trailingSpace = displayText.charCodeAt(text.length - 1) == 32; - if (style || startStyle || endStyle || mustWrap || css || attributes) { - var fullStyle = style || ""; - if (startStyle) { - fullStyle += startStyle; - } - if (endStyle) { - fullStyle += endStyle; - } - var token = elt("span", [content], fullStyle, css); - if (attributes) { - for (var attr in attributes) { - if (attributes.hasOwnProperty(attr) && attr != "style" && attr != "class") { - token.setAttribute(attr, attributes[attr]); - } - } - } - return builder.content.appendChild(token); - } - builder.content.appendChild(content); - } - function splitSpaces(text, trailingBefore) { - if (text.length > 1 && !/ /.test(text)) { - return text; - } - var spaceBefore = trailingBefore, - result = ""; - for (var i2 = 0; i2 < text.length; i2++) { - var ch = text.charAt(i2); - if (ch == " " && spaceBefore && (i2 == text.length - 1 || text.charCodeAt(i2 + 1) == 32)) { - ch = " "; - } - result += ch; - spaceBefore = ch == " "; - } - return result; - } - function buildTokenBadBidi(inner, order) { - return function (builder, text, style, startStyle, endStyle, css, attributes) { - style = style ? style + " cm-force-border" : "cm-force-border"; - var start = builder.pos, - end = start + text.length; - for (;;) { - var part = void 0; - for (var i2 = 0; i2 < order.length; i2++) { - part = order[i2]; - if (part.to > start && part.from <= start) { - break; - } - } - if (part.to >= end) { - return inner(builder, text, style, startStyle, endStyle, css, attributes); - } - inner(builder, text.slice(0, part.to - start), style, startStyle, null, css, attributes); - startStyle = null; - text = text.slice(part.to - start); - start = part.to; - } - }; - } - function buildCollapsedSpan(builder, size, marker, ignoreWidget) { - var widget = !ignoreWidget && marker.widgetNode; - if (widget) { - builder.map.push(builder.pos, builder.pos + size, widget); - } - if (!ignoreWidget && builder.cm.display.input.needsContentAttribute) { - if (!widget) { - widget = builder.content.appendChild(document.createElement("span")); - } - widget.setAttribute("cm-marker", marker.id); - } - if (widget) { - builder.cm.display.input.setUneditable(widget); - builder.content.appendChild(widget); - } - builder.pos += size; - builder.trailingSpace = false; - } - function insertLineContent(line, builder, styles) { - var spans = line.markedSpans, - allText = line.text, - at = 0; - if (!spans) { - for (var i$12 = 1; i$12 < styles.length; i$12 += 2) { - builder.addToken(builder, allText.slice(at, at = styles[i$12]), interpretTokenStyle(styles[i$12 + 1], builder.cm.options)); - } - return; - } - var len = allText.length, - pos = 0, - i2 = 1, - text = "", - style, - css; - var nextChange = 0, - spanStyle, - spanEndStyle, - spanStartStyle, - collapsed, - attributes; - for (;;) { - if (nextChange == pos) { - spanStyle = spanEndStyle = spanStartStyle = css = ""; - attributes = null; - collapsed = null; - nextChange = Infinity; - var foundBookmarks = [], - endStyles = void 0; - for (var j = 0; j < spans.length; ++j) { - var sp = spans[j], - m = sp.marker; - if (m.type == "bookmark" && sp.from == pos && m.widgetNode) { - foundBookmarks.push(m); - } else if (sp.from <= pos && (sp.to == null || sp.to > pos || m.collapsed && sp.to == pos && sp.from == pos)) { - if (sp.to != null && sp.to != pos && nextChange > sp.to) { - nextChange = sp.to; - spanEndStyle = ""; - } - if (m.className) { - spanStyle += " " + m.className; - } - if (m.css) { - css = (css ? css + ";" : "") + m.css; - } - if (m.startStyle && sp.from == pos) { - spanStartStyle += " " + m.startStyle; - } - if (m.endStyle && sp.to == nextChange) { - (endStyles || (endStyles = [])).push(m.endStyle, sp.to); - } - if (m.title) { - (attributes || (attributes = {})).title = m.title; - } - if (m.attributes) { - for (var attr in m.attributes) { - (attributes || (attributes = {}))[attr] = m.attributes[attr]; - } - } - if (m.collapsed && (!collapsed || compareCollapsedMarkers(collapsed.marker, m) < 0)) { - collapsed = sp; - } - } else if (sp.from > pos && nextChange > sp.from) { - nextChange = sp.from; - } - } - if (endStyles) { - for (var j$1 = 0; j$1 < endStyles.length; j$1 += 2) { - if (endStyles[j$1 + 1] == nextChange) { - spanEndStyle += " " + endStyles[j$1]; - } - } - } - if (!collapsed || collapsed.from == pos) { - for (var j$2 = 0; j$2 < foundBookmarks.length; ++j$2) { - buildCollapsedSpan(builder, 0, foundBookmarks[j$2]); - } - } - if (collapsed && (collapsed.from || 0) == pos) { - buildCollapsedSpan(builder, (collapsed.to == null ? len + 1 : collapsed.to) - pos, collapsed.marker, collapsed.from == null); - if (collapsed.to == null) { - return; - } - if (collapsed.to == pos) { - collapsed = false; - } - } - } - if (pos >= len) { - break; - } - var upto = Math.min(len, nextChange); - while (true) { - if (text) { - var end = pos + text.length; - if (!collapsed) { - var tokenText = end > upto ? text.slice(0, upto - pos) : text; - builder.addToken(builder, tokenText, style ? style + spanStyle : spanStyle, spanStartStyle, pos + tokenText.length == nextChange ? spanEndStyle : "", css, attributes); - } - if (end >= upto) { - text = text.slice(upto - pos); - pos = upto; - break; - } - pos = end; - spanStartStyle = ""; - } - text = allText.slice(at, at = styles[i2++]); - style = interpretTokenStyle(styles[i2++], builder.cm.options); - } - } - } - function LineView(doc, line, lineN) { - this.line = line; - this.rest = visualLineContinued(line); - this.size = this.rest ? lineNo(lst(this.rest)) - lineN + 1 : 1; - this.node = this.text = null; - this.hidden = lineIsHidden(doc, line); - } - function buildViewArray(cm, from, to) { - var array = [], - nextPos; - for (var pos = from; pos < to; pos = nextPos) { - var view = new LineView(cm.doc, getLine(cm.doc, pos), pos); - nextPos = pos + view.size; - array.push(view); - } - return array; - } - var operationGroup = null; - function pushOperation(op) { - if (operationGroup) { - operationGroup.ops.push(op); - } else { - op.ownsGroup = operationGroup = { - ops: [op], - delayedCallbacks: [] - }; - } - } - function fireCallbacksForOps(group) { - var callbacks = group.delayedCallbacks, - i2 = 0; - do { - for (; i2 < callbacks.length; i2++) { - callbacks[i2].call(null); - } - for (var j = 0; j < group.ops.length; j++) { - var op = group.ops[j]; - if (op.cursorActivityHandlers) { - while (op.cursorActivityCalled < op.cursorActivityHandlers.length) { - op.cursorActivityHandlers[op.cursorActivityCalled++].call(null, op.cm); - } - } - } - } while (i2 < callbacks.length); - } - function finishOperation(op, endCb) { - var group = op.ownsGroup; - if (!group) { - return; - } - try { - fireCallbacksForOps(group); - } finally { - operationGroup = null; - endCb(group); - } - } - var orphanDelayedCallbacks = null; - function signalLater(emitter, type) { - var arr = getHandlers(emitter, type); - if (!arr.length) { - return; - } - var args = Array.prototype.slice.call(arguments, 2), - list; - if (operationGroup) { - list = operationGroup.delayedCallbacks; - } else if (orphanDelayedCallbacks) { - list = orphanDelayedCallbacks; - } else { - list = orphanDelayedCallbacks = []; - setTimeout(fireOrphanDelayed, 0); - } - var loop = function (i3) { - list.push(function () { - return arr[i3].apply(null, args); - }); - }; - for (var i2 = 0; i2 < arr.length; ++i2) loop(i2); - } - function fireOrphanDelayed() { - var delayed = orphanDelayedCallbacks; - orphanDelayedCallbacks = null; - for (var i2 = 0; i2 < delayed.length; ++i2) { - delayed[i2](); - } - } - function updateLineForChanges(cm, lineView, lineN, dims) { - for (var j = 0; j < lineView.changes.length; j++) { - var type = lineView.changes[j]; - if (type == "text") { - updateLineText(cm, lineView); - } else if (type == "gutter") { - updateLineGutter(cm, lineView, lineN, dims); - } else if (type == "class") { - updateLineClasses(cm, lineView); - } else if (type == "widget") { - updateLineWidgets(cm, lineView, dims); - } - } - lineView.changes = null; - } - function ensureLineWrapped(lineView) { - if (lineView.node == lineView.text) { - lineView.node = elt("div", null, null, "position: relative"); - if (lineView.text.parentNode) { - lineView.text.parentNode.replaceChild(lineView.node, lineView.text); - } - lineView.node.appendChild(lineView.text); - if (ie && ie_version < 8) { - lineView.node.style.zIndex = 2; - } - } - return lineView.node; - } - function updateLineBackground(cm, lineView) { - var cls = lineView.bgClass ? lineView.bgClass + " " + (lineView.line.bgClass || "") : lineView.line.bgClass; - if (cls) { - cls += " CodeMirror-linebackground"; - } - if (lineView.background) { - if (cls) { - lineView.background.className = cls; - } else { - lineView.background.parentNode.removeChild(lineView.background); - lineView.background = null; - } - } else if (cls) { - var wrap = ensureLineWrapped(lineView); - lineView.background = wrap.insertBefore(elt("div", null, cls), wrap.firstChild); - cm.display.input.setUneditable(lineView.background); - } - } - function getLineContent(cm, lineView) { - var ext = cm.display.externalMeasured; - if (ext && ext.line == lineView.line) { - cm.display.externalMeasured = null; - lineView.measure = ext.measure; - return ext.built; - } - return buildLineContent(cm, lineView); - } - function updateLineText(cm, lineView) { - var cls = lineView.text.className; - var built = getLineContent(cm, lineView); - if (lineView.text == lineView.node) { - lineView.node = built.pre; - } - lineView.text.parentNode.replaceChild(built.pre, lineView.text); - lineView.text = built.pre; - if (built.bgClass != lineView.bgClass || built.textClass != lineView.textClass) { - lineView.bgClass = built.bgClass; - lineView.textClass = built.textClass; - updateLineClasses(cm, lineView); - } else if (cls) { - lineView.text.className = cls; - } - } - function updateLineClasses(cm, lineView) { - updateLineBackground(cm, lineView); - if (lineView.line.wrapClass) { - ensureLineWrapped(lineView).className = lineView.line.wrapClass; - } else if (lineView.node != lineView.text) { - lineView.node.className = ""; - } - var textClass = lineView.textClass ? lineView.textClass + " " + (lineView.line.textClass || "") : lineView.line.textClass; - lineView.text.className = textClass || ""; - } - function updateLineGutter(cm, lineView, lineN, dims) { - if (lineView.gutter) { - lineView.node.removeChild(lineView.gutter); - lineView.gutter = null; - } - if (lineView.gutterBackground) { - lineView.node.removeChild(lineView.gutterBackground); - lineView.gutterBackground = null; - } - if (lineView.line.gutterClass) { - var wrap = ensureLineWrapped(lineView); - lineView.gutterBackground = elt("div", null, "CodeMirror-gutter-background " + lineView.line.gutterClass, "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px; width: " + dims.gutterTotalWidth + "px"); - cm.display.input.setUneditable(lineView.gutterBackground); - wrap.insertBefore(lineView.gutterBackground, lineView.text); - } - var markers = lineView.line.gutterMarkers; - if (cm.options.lineNumbers || markers) { - var wrap$1 = ensureLineWrapped(lineView); - var gutterWrap = lineView.gutter = elt("div", null, "CodeMirror-gutter-wrapper", "left: " + (cm.options.fixedGutter ? dims.fixedPos : -dims.gutterTotalWidth) + "px"); - gutterWrap.setAttribute("aria-hidden", "true"); - cm.display.input.setUneditable(gutterWrap); - wrap$1.insertBefore(gutterWrap, lineView.text); - if (lineView.line.gutterClass) { - gutterWrap.className += " " + lineView.line.gutterClass; - } - if (cm.options.lineNumbers && (!markers || !markers["CodeMirror-linenumbers"])) { - lineView.lineNumber = gutterWrap.appendChild(elt("div", lineNumberFor(cm.options, lineN), "CodeMirror-linenumber CodeMirror-gutter-elt", "left: " + dims.gutterLeft["CodeMirror-linenumbers"] + "px; width: " + cm.display.lineNumInnerWidth + "px")); - } - if (markers) { - for (var k = 0; k < cm.display.gutterSpecs.length; ++k) { - var id = cm.display.gutterSpecs[k].className, - found = markers.hasOwnProperty(id) && markers[id]; - if (found) { - gutterWrap.appendChild(elt("div", [found], "CodeMirror-gutter-elt", "left: " + dims.gutterLeft[id] + "px; width: " + dims.gutterWidth[id] + "px")); - } - } - } - } - } - function updateLineWidgets(cm, lineView, dims) { - if (lineView.alignable) { - lineView.alignable = null; - } - var isWidget = classTest("CodeMirror-linewidget"); - for (var node = lineView.node.firstChild, next = void 0; node; node = next) { - next = node.nextSibling; - if (isWidget.test(node.className)) { - lineView.node.removeChild(node); - } - } - insertLineWidgets(cm, lineView, dims); - } - function buildLineElement(cm, lineView, lineN, dims) { - var built = getLineContent(cm, lineView); - lineView.text = lineView.node = built.pre; - if (built.bgClass) { - lineView.bgClass = built.bgClass; - } - if (built.textClass) { - lineView.textClass = built.textClass; - } - updateLineClasses(cm, lineView); - updateLineGutter(cm, lineView, lineN, dims); - insertLineWidgets(cm, lineView, dims); - return lineView.node; - } - function insertLineWidgets(cm, lineView, dims) { - insertLineWidgetsFor(cm, lineView.line, lineView, dims, true); - if (lineView.rest) { - for (var i2 = 0; i2 < lineView.rest.length; i2++) { - insertLineWidgetsFor(cm, lineView.rest[i2], lineView, dims, false); - } - } - } - function insertLineWidgetsFor(cm, line, lineView, dims, allowAbove) { - if (!line.widgets) { - return; - } - var wrap = ensureLineWrapped(lineView); - for (var i2 = 0, ws = line.widgets; i2 < ws.length; ++i2) { - var widget = ws[i2], - node = elt("div", [widget.node], "CodeMirror-linewidget" + (widget.className ? " " + widget.className : "")); - if (!widget.handleMouseEvents) { - node.setAttribute("cm-ignore-events", "true"); - } - positionLineWidget(widget, node, lineView, dims); - cm.display.input.setUneditable(node); - if (allowAbove && widget.above) { - wrap.insertBefore(node, lineView.gutter || lineView.text); - } else { - wrap.appendChild(node); - } - signalLater(widget, "redraw"); - } - } - function positionLineWidget(widget, node, lineView, dims) { - if (widget.noHScroll) { - (lineView.alignable || (lineView.alignable = [])).push(node); - var width = dims.wrapperWidth; - node.style.left = dims.fixedPos + "px"; - if (!widget.coverGutter) { - width -= dims.gutterTotalWidth; - node.style.paddingLeft = dims.gutterTotalWidth + "px"; - } - node.style.width = width + "px"; - } - if (widget.coverGutter) { - node.style.zIndex = 5; - node.style.position = "relative"; - if (!widget.noHScroll) { - node.style.marginLeft = -dims.gutterTotalWidth + "px"; - } - } - } - function widgetHeight(widget) { - if (widget.height != null) { - return widget.height; - } - var cm = widget.doc.cm; - if (!cm) { - return 0; - } - if (!contains(document.body, widget.node)) { - var parentStyle = "position: relative;"; - if (widget.coverGutter) { - parentStyle += "margin-left: -" + cm.display.gutters.offsetWidth + "px;"; - } - if (widget.noHScroll) { - parentStyle += "width: " + cm.display.wrapper.clientWidth + "px;"; - } - removeChildrenAndAdd(cm.display.measure, elt("div", [widget.node], null, parentStyle)); - } - return widget.height = widget.node.parentNode.offsetHeight; - } - function eventInWidget(display, e) { - for (var n = e_target(e); n != display.wrapper; n = n.parentNode) { - if (!n || n.nodeType == 1 && n.getAttribute("cm-ignore-events") == "true" || n.parentNode == display.sizer && n != display.mover) { - return true; - } - } - } - function paddingTop(display) { - return display.lineSpace.offsetTop; - } - function paddingVert(display) { - return display.mover.offsetHeight - display.lineSpace.offsetHeight; - } - function paddingH(display) { - if (display.cachedPaddingH) { - return display.cachedPaddingH; - } - var e = removeChildrenAndAdd(display.measure, elt("pre", "x", "CodeMirror-line-like")); - var style = window.getComputedStyle ? window.getComputedStyle(e) : e.currentStyle; - var data = { - left: parseInt(style.paddingLeft), - right: parseInt(style.paddingRight) - }; - if (!isNaN(data.left) && !isNaN(data.right)) { - display.cachedPaddingH = data; - } - return data; - } - function scrollGap(cm) { - return scrollerGap - cm.display.nativeBarWidth; - } - function displayWidth(cm) { - return cm.display.scroller.clientWidth - scrollGap(cm) - cm.display.barWidth; - } - function displayHeight(cm) { - return cm.display.scroller.clientHeight - scrollGap(cm) - cm.display.barHeight; - } - function ensureLineHeights(cm, lineView, rect) { - var wrapping = cm.options.lineWrapping; - var curWidth = wrapping && displayWidth(cm); - if (!lineView.measure.heights || wrapping && lineView.measure.width != curWidth) { - var heights = lineView.measure.heights = []; - if (wrapping) { - lineView.measure.width = curWidth; - var rects = lineView.text.firstChild.getClientRects(); - for (var i2 = 0; i2 < rects.length - 1; i2++) { - var cur = rects[i2], - next = rects[i2 + 1]; - if (Math.abs(cur.bottom - next.bottom) > 2) { - heights.push((cur.bottom + next.top) / 2 - rect.top); - } - } - } - heights.push(rect.bottom - rect.top); - } - } - function mapFromLineView(lineView, line, lineN) { - if (lineView.line == line) { - return { - map: lineView.measure.map, - cache: lineView.measure.cache - }; - } - if (lineView.rest) { - for (var i2 = 0; i2 < lineView.rest.length; i2++) { - if (lineView.rest[i2] == line) { - return { - map: lineView.measure.maps[i2], - cache: lineView.measure.caches[i2] - }; - } - } - for (var i$12 = 0; i$12 < lineView.rest.length; i$12++) { - if (lineNo(lineView.rest[i$12]) > lineN) { - return { - map: lineView.measure.maps[i$12], - cache: lineView.measure.caches[i$12], - before: true - }; - } - } - } - } - function updateExternalMeasurement(cm, line) { - line = visualLine(line); - var lineN = lineNo(line); - var view = cm.display.externalMeasured = new LineView(cm.doc, line, lineN); - view.lineN = lineN; - var built = view.built = buildLineContent(cm, view); - view.text = built.pre; - removeChildrenAndAdd(cm.display.lineMeasure, built.pre); - return view; - } - function measureChar(cm, line, ch, bias) { - return measureCharPrepared(cm, prepareMeasureForLine(cm, line), ch, bias); - } - function findViewForLine(cm, lineN) { - if (lineN >= cm.display.viewFrom && lineN < cm.display.viewTo) { - return cm.display.view[findViewIndex(cm, lineN)]; - } - var ext = cm.display.externalMeasured; - if (ext && lineN >= ext.lineN && lineN < ext.lineN + ext.size) { - return ext; - } - } - function prepareMeasureForLine(cm, line) { - var lineN = lineNo(line); - var view = findViewForLine(cm, lineN); - if (view && !view.text) { - view = null; - } else if (view && view.changes) { - updateLineForChanges(cm, view, lineN, getDimensions(cm)); - cm.curOp.forceUpdate = true; - } - if (!view) { - view = updateExternalMeasurement(cm, line); - } - var info = mapFromLineView(view, line, lineN); - return { - line, - view, - rect: null, - map: info.map, - cache: info.cache, - before: info.before, - hasHeights: false - }; - } - function measureCharPrepared(cm, prepared, ch, bias, varHeight) { - if (prepared.before) { - ch = -1; - } - var key = ch + (bias || ""), - found; - if (prepared.cache.hasOwnProperty(key)) { - found = prepared.cache[key]; - } else { - if (!prepared.rect) { - prepared.rect = prepared.view.text.getBoundingClientRect(); - } - if (!prepared.hasHeights) { - ensureLineHeights(cm, prepared.view, prepared.rect); - prepared.hasHeights = true; - } - found = measureCharInner(cm, prepared, ch, bias); - if (!found.bogus) { - prepared.cache[key] = found; - } - } - return { - left: found.left, - right: found.right, - top: varHeight ? found.rtop : found.top, - bottom: varHeight ? found.rbottom : found.bottom - }; - } - var nullRect = { - left: 0, - right: 0, - top: 0, - bottom: 0 - }; - function nodeAndOffsetInLineMap(map2, ch, bias) { - var node, start, end, collapse, mStart, mEnd; - for (var i2 = 0; i2 < map2.length; i2 += 3) { - mStart = map2[i2]; - mEnd = map2[i2 + 1]; - if (ch < mStart) { - start = 0; - end = 1; - collapse = "left"; - } else if (ch < mEnd) { - start = ch - mStart; - end = start + 1; - } else if (i2 == map2.length - 3 || ch == mEnd && map2[i2 + 3] > ch) { - end = mEnd - mStart; - start = end - 1; - if (ch >= mEnd) { - collapse = "right"; - } - } - if (start != null) { - node = map2[i2 + 2]; - if (mStart == mEnd && bias == (node.insertLeft ? "left" : "right")) { - collapse = bias; - } - if (bias == "left" && start == 0) { - while (i2 && map2[i2 - 2] == map2[i2 - 3] && map2[i2 - 1].insertLeft) { - node = map2[(i2 -= 3) + 2]; - collapse = "left"; - } - } - if (bias == "right" && start == mEnd - mStart) { - while (i2 < map2.length - 3 && map2[i2 + 3] == map2[i2 + 4] && !map2[i2 + 5].insertLeft) { - node = map2[(i2 += 3) + 2]; - collapse = "right"; - } - } - break; - } - } - return { - node, - start, - end, - collapse, - coverStart: mStart, - coverEnd: mEnd - }; - } - function getUsefulRect(rects, bias) { - var rect = nullRect; - if (bias == "left") { - for (var i2 = 0; i2 < rects.length; i2++) { - if ((rect = rects[i2]).left != rect.right) { - break; - } - } - } else { - for (var i$12 = rects.length - 1; i$12 >= 0; i$12--) { - if ((rect = rects[i$12]).left != rect.right) { - break; - } - } - } - return rect; - } - function measureCharInner(cm, prepared, ch, bias) { - var place = nodeAndOffsetInLineMap(prepared.map, ch, bias); - var node = place.node, - start = place.start, - end = place.end, - collapse = place.collapse; - var rect; - if (node.nodeType == 3) { - for (var i$12 = 0; i$12 < 4; i$12++) { - while (start && isExtendingChar(prepared.line.text.charAt(place.coverStart + start))) { - --start; - } - while (place.coverStart + end < place.coverEnd && isExtendingChar(prepared.line.text.charAt(place.coverStart + end))) { - ++end; - } - if (ie && ie_version < 9 && start == 0 && end == place.coverEnd - place.coverStart) { - rect = node.parentNode.getBoundingClientRect(); - } else { - rect = getUsefulRect(range(node, start, end).getClientRects(), bias); - } - if (rect.left || rect.right || start == 0) { - break; - } - end = start; - start = start - 1; - collapse = "right"; - } - if (ie && ie_version < 11) { - rect = maybeUpdateRectForZooming(cm.display.measure, rect); - } - } else { - if (start > 0) { - collapse = bias = "right"; - } - var rects; - if (cm.options.lineWrapping && (rects = node.getClientRects()).length > 1) { - rect = rects[bias == "right" ? rects.length - 1 : 0]; - } else { - rect = node.getBoundingClientRect(); - } - } - if (ie && ie_version < 9 && !start && (!rect || !rect.left && !rect.right)) { - var rSpan = node.parentNode.getClientRects()[0]; - if (rSpan) { - rect = { - left: rSpan.left, - right: rSpan.left + charWidth(cm.display), - top: rSpan.top, - bottom: rSpan.bottom - }; - } else { - rect = nullRect; - } - } - var rtop = rect.top - prepared.rect.top, - rbot = rect.bottom - prepared.rect.top; - var mid = (rtop + rbot) / 2; - var heights = prepared.view.measure.heights; - var i2 = 0; - for (; i2 < heights.length - 1; i2++) { - if (mid < heights[i2]) { - break; - } - } - var top = i2 ? heights[i2 - 1] : 0, - bot = heights[i2]; - var result = { - left: (collapse == "right" ? rect.right : rect.left) - prepared.rect.left, - right: (collapse == "left" ? rect.left : rect.right) - prepared.rect.left, - top, - bottom: bot - }; - if (!rect.left && !rect.right) { - result.bogus = true; - } - if (!cm.options.singleCursorHeightPerLine) { - result.rtop = rtop; - result.rbottom = rbot; - } - return result; - } - function maybeUpdateRectForZooming(measure, rect) { - if (!window.screen || screen.logicalXDPI == null || screen.logicalXDPI == screen.deviceXDPI || !hasBadZoomedRects(measure)) { - return rect; - } - var scaleX = screen.logicalXDPI / screen.deviceXDPI; - var scaleY = screen.logicalYDPI / screen.deviceYDPI; - return { - left: rect.left * scaleX, - right: rect.right * scaleX, - top: rect.top * scaleY, - bottom: rect.bottom * scaleY - }; - } - function clearLineMeasurementCacheFor(lineView) { - if (lineView.measure) { - lineView.measure.cache = {}; - lineView.measure.heights = null; - if (lineView.rest) { - for (var i2 = 0; i2 < lineView.rest.length; i2++) { - lineView.measure.caches[i2] = {}; - } - } - } - } - function clearLineMeasurementCache(cm) { - cm.display.externalMeasure = null; - removeChildren(cm.display.lineMeasure); - for (var i2 = 0; i2 < cm.display.view.length; i2++) { - clearLineMeasurementCacheFor(cm.display.view[i2]); - } - } - function clearCaches(cm) { - clearLineMeasurementCache(cm); - cm.display.cachedCharWidth = cm.display.cachedTextHeight = cm.display.cachedPaddingH = null; - if (!cm.options.lineWrapping) { - cm.display.maxLineChanged = true; - } - cm.display.lineNumChars = null; - } - function pageScrollX() { - if (chrome && android) { - return -(document.body.getBoundingClientRect().left - parseInt(getComputedStyle(document.body).marginLeft)); - } - return window.pageXOffset || (document.documentElement || document.body).scrollLeft; - } - function pageScrollY() { - if (chrome && android) { - return -(document.body.getBoundingClientRect().top - parseInt(getComputedStyle(document.body).marginTop)); - } - return window.pageYOffset || (document.documentElement || document.body).scrollTop; - } - function widgetTopHeight(lineObj) { - var ref = visualLine(lineObj); - var widgets = ref.widgets; - var height = 0; - if (widgets) { - for (var i2 = 0; i2 < widgets.length; ++i2) { - if (widgets[i2].above) { - height += widgetHeight(widgets[i2]); - } - } - } - return height; - } - function intoCoordSystem(cm, lineObj, rect, context, includeWidgets) { - if (!includeWidgets) { - var height = widgetTopHeight(lineObj); - rect.top += height; - rect.bottom += height; - } - if (context == "line") { - return rect; - } - if (!context) { - context = "local"; - } - var yOff = heightAtLine(lineObj); - if (context == "local") { - yOff += paddingTop(cm.display); - } else { - yOff -= cm.display.viewOffset; - } - if (context == "page" || context == "window") { - var lOff = cm.display.lineSpace.getBoundingClientRect(); - yOff += lOff.top + (context == "window" ? 0 : pageScrollY()); - var xOff = lOff.left + (context == "window" ? 0 : pageScrollX()); - rect.left += xOff; - rect.right += xOff; - } - rect.top += yOff; - rect.bottom += yOff; - return rect; - } - function fromCoordSystem(cm, coords, context) { - if (context == "div") { - return coords; - } - var left = coords.left, - top = coords.top; - if (context == "page") { - left -= pageScrollX(); - top -= pageScrollY(); - } else if (context == "local" || !context) { - var localBox = cm.display.sizer.getBoundingClientRect(); - left += localBox.left; - top += localBox.top; - } - var lineSpaceBox = cm.display.lineSpace.getBoundingClientRect(); - return { - left: left - lineSpaceBox.left, - top: top - lineSpaceBox.top - }; - } - function charCoords(cm, pos, context, lineObj, bias) { - if (!lineObj) { - lineObj = getLine(cm.doc, pos.line); - } - return intoCoordSystem(cm, lineObj, measureChar(cm, lineObj, pos.ch, bias), context); - } - function cursorCoords(cm, pos, context, lineObj, preparedMeasure, varHeight) { - lineObj = lineObj || getLine(cm.doc, pos.line); - if (!preparedMeasure) { - preparedMeasure = prepareMeasureForLine(cm, lineObj); - } - function get(ch2, right) { - var m = measureCharPrepared(cm, preparedMeasure, ch2, right ? "right" : "left", varHeight); - if (right) { - m.left = m.right; - } else { - m.right = m.left; - } - return intoCoordSystem(cm, lineObj, m, context); - } - var order = getOrder(lineObj, cm.doc.direction), - ch = pos.ch, - sticky = pos.sticky; - if (ch >= lineObj.text.length) { - ch = lineObj.text.length; - sticky = "before"; - } else if (ch <= 0) { - ch = 0; - sticky = "after"; - } - if (!order) { - return get(sticky == "before" ? ch - 1 : ch, sticky == "before"); - } - function getBidi(ch2, partPos2, invert) { - var part = order[partPos2], - right = part.level == 1; - return get(invert ? ch2 - 1 : ch2, right != invert); - } - var partPos = getBidiPartAt(order, ch, sticky); - var other = bidiOther; - var val = getBidi(ch, partPos, sticky == "before"); - if (other != null) { - val.other = getBidi(ch, other, sticky != "before"); - } - return val; - } - function estimateCoords(cm, pos) { - var left = 0; - pos = clipPos(cm.doc, pos); - if (!cm.options.lineWrapping) { - left = charWidth(cm.display) * pos.ch; - } - var lineObj = getLine(cm.doc, pos.line); - var top = heightAtLine(lineObj) + paddingTop(cm.display); - return { - left, - right: left, - top, - bottom: top + lineObj.height - }; - } - function PosWithInfo(line, ch, sticky, outside, xRel) { - var pos = Pos(line, ch, sticky); - pos.xRel = xRel; - if (outside) { - pos.outside = outside; - } - return pos; - } - function coordsChar(cm, x, y) { - var doc = cm.doc; - y += cm.display.viewOffset; - if (y < 0) { - return PosWithInfo(doc.first, 0, null, -1, -1); - } - var lineN = lineAtHeight(doc, y), - last = doc.first + doc.size - 1; - if (lineN > last) { - return PosWithInfo(doc.first + doc.size - 1, getLine(doc, last).text.length, null, 1, 1); - } - if (x < 0) { - x = 0; - } - var lineObj = getLine(doc, lineN); - for (;;) { - var found = coordsCharInner(cm, lineObj, lineN, x, y); - var collapsed = collapsedSpanAround(lineObj, found.ch + (found.xRel > 0 || found.outside > 0 ? 1 : 0)); - if (!collapsed) { - return found; - } - var rangeEnd = collapsed.find(1); - if (rangeEnd.line == lineN) { - return rangeEnd; - } - lineObj = getLine(doc, lineN = rangeEnd.line); - } - } - function wrappedLineExtent(cm, lineObj, preparedMeasure, y) { - y -= widgetTopHeight(lineObj); - var end = lineObj.text.length; - var begin = findFirst(function (ch) { - return measureCharPrepared(cm, preparedMeasure, ch - 1).bottom <= y; - }, end, 0); - end = findFirst(function (ch) { - return measureCharPrepared(cm, preparedMeasure, ch).top > y; - }, begin, end); - return { - begin, - end - }; - } - function wrappedLineExtentChar(cm, lineObj, preparedMeasure, target) { - if (!preparedMeasure) { - preparedMeasure = prepareMeasureForLine(cm, lineObj); - } - var targetTop = intoCoordSystem(cm, lineObj, measureCharPrepared(cm, preparedMeasure, target), "line").top; - return wrappedLineExtent(cm, lineObj, preparedMeasure, targetTop); - } - function boxIsAfter(box, x, y, left) { - return box.bottom <= y ? false : box.top > y ? true : (left ? box.left : box.right) > x; - } - function coordsCharInner(cm, lineObj, lineNo2, x, y) { - y -= heightAtLine(lineObj); - var preparedMeasure = prepareMeasureForLine(cm, lineObj); - var widgetHeight2 = widgetTopHeight(lineObj); - var begin = 0, - end = lineObj.text.length, - ltr = true; - var order = getOrder(lineObj, cm.doc.direction); - if (order) { - var part = (cm.options.lineWrapping ? coordsBidiPartWrapped : coordsBidiPart)(cm, lineObj, lineNo2, preparedMeasure, order, x, y); - ltr = part.level != 1; - begin = ltr ? part.from : part.to - 1; - end = ltr ? part.to : part.from - 1; - } - var chAround = null, - boxAround = null; - var ch = findFirst(function (ch2) { - var box = measureCharPrepared(cm, preparedMeasure, ch2); - box.top += widgetHeight2; - box.bottom += widgetHeight2; - if (!boxIsAfter(box, x, y, false)) { - return false; - } - if (box.top <= y && box.left <= x) { - chAround = ch2; - boxAround = box; - } - return true; - }, begin, end); - var baseX, - sticky, - outside = false; - if (boxAround) { - var atLeft = x - boxAround.left < boxAround.right - x, - atStart = atLeft == ltr; - ch = chAround + (atStart ? 0 : 1); - sticky = atStart ? "after" : "before"; - baseX = atLeft ? boxAround.left : boxAround.right; - } else { - if (!ltr && (ch == end || ch == begin)) { - ch++; - } - sticky = ch == 0 ? "after" : ch == lineObj.text.length ? "before" : measureCharPrepared(cm, preparedMeasure, ch - (ltr ? 1 : 0)).bottom + widgetHeight2 <= y == ltr ? "after" : "before"; - var coords = cursorCoords(cm, Pos(lineNo2, ch, sticky), "line", lineObj, preparedMeasure); - baseX = coords.left; - outside = y < coords.top ? -1 : y >= coords.bottom ? 1 : 0; - } - ch = skipExtendingChars(lineObj.text, ch, 1); - return PosWithInfo(lineNo2, ch, sticky, outside, x - baseX); - } - function coordsBidiPart(cm, lineObj, lineNo2, preparedMeasure, order, x, y) { - var index = findFirst(function (i2) { - var part2 = order[i2], - ltr2 = part2.level != 1; - return boxIsAfter(cursorCoords(cm, Pos(lineNo2, ltr2 ? part2.to : part2.from, ltr2 ? "before" : "after"), "line", lineObj, preparedMeasure), x, y, true); - }, 0, order.length - 1); - var part = order[index]; - if (index > 0) { - var ltr = part.level != 1; - var start = cursorCoords(cm, Pos(lineNo2, ltr ? part.from : part.to, ltr ? "after" : "before"), "line", lineObj, preparedMeasure); - if (boxIsAfter(start, x, y, true) && start.top > y) { - part = order[index - 1]; - } - } - return part; - } - function coordsBidiPartWrapped(cm, lineObj, _lineNo, preparedMeasure, order, x, y) { - var ref = wrappedLineExtent(cm, lineObj, preparedMeasure, y); - var begin = ref.begin; - var end = ref.end; - if (/\s/.test(lineObj.text.charAt(end - 1))) { - end--; - } - var part = null, - closestDist = null; - for (var i2 = 0; i2 < order.length; i2++) { - var p = order[i2]; - if (p.from >= end || p.to <= begin) { - continue; - } - var ltr = p.level != 1; - var endX = measureCharPrepared(cm, preparedMeasure, ltr ? Math.min(end, p.to) - 1 : Math.max(begin, p.from)).right; - var dist = endX < x ? x - endX + 1e9 : endX - x; - if (!part || closestDist > dist) { - part = p; - closestDist = dist; - } - } - if (!part) { - part = order[order.length - 1]; - } - if (part.from < begin) { - part = { - from: begin, - to: part.to, - level: part.level - }; - } - if (part.to > end) { - part = { - from: part.from, - to: end, - level: part.level - }; - } - return part; - } - var measureText; - function textHeight(display) { - if (display.cachedTextHeight != null) { - return display.cachedTextHeight; - } - if (measureText == null) { - measureText = elt("pre", null, "CodeMirror-line-like"); - for (var i2 = 0; i2 < 49; ++i2) { - measureText.appendChild(document.createTextNode("x")); - measureText.appendChild(elt("br")); - } - measureText.appendChild(document.createTextNode("x")); - } - removeChildrenAndAdd(display.measure, measureText); - var height = measureText.offsetHeight / 50; - if (height > 3) { - display.cachedTextHeight = height; - } - removeChildren(display.measure); - return height || 1; - } - function charWidth(display) { - if (display.cachedCharWidth != null) { - return display.cachedCharWidth; - } - var anchor = elt("span", "xxxxxxxxxx"); - var pre = elt("pre", [anchor], "CodeMirror-line-like"); - removeChildrenAndAdd(display.measure, pre); - var rect = anchor.getBoundingClientRect(), - width = (rect.right - rect.left) / 10; - if (width > 2) { - display.cachedCharWidth = width; - } - return width || 10; - } - function getDimensions(cm) { - var d = cm.display, - left = {}, - width = {}; - var gutterLeft = d.gutters.clientLeft; - for (var n = d.gutters.firstChild, i2 = 0; n; n = n.nextSibling, ++i2) { - var id = cm.display.gutterSpecs[i2].className; - left[id] = n.offsetLeft + n.clientLeft + gutterLeft; - width[id] = n.clientWidth; - } - return { - fixedPos: compensateForHScroll(d), - gutterTotalWidth: d.gutters.offsetWidth, - gutterLeft: left, - gutterWidth: width, - wrapperWidth: d.wrapper.clientWidth - }; - } - function compensateForHScroll(display) { - return display.scroller.getBoundingClientRect().left - display.sizer.getBoundingClientRect().left; - } - function estimateHeight(cm) { - var th = textHeight(cm.display), - wrapping = cm.options.lineWrapping; - var perLine = wrapping && Math.max(5, cm.display.scroller.clientWidth / charWidth(cm.display) - 3); - return function (line) { - if (lineIsHidden(cm.doc, line)) { - return 0; - } - var widgetsHeight = 0; - if (line.widgets) { - for (var i2 = 0; i2 < line.widgets.length; i2++) { - if (line.widgets[i2].height) { - widgetsHeight += line.widgets[i2].height; - } - } - } - if (wrapping) { - return widgetsHeight + (Math.ceil(line.text.length / perLine) || 1) * th; - } else { - return widgetsHeight + th; - } - }; - } - function estimateLineHeights(cm) { - var doc = cm.doc, - est = estimateHeight(cm); - doc.iter(function (line) { - var estHeight = est(line); - if (estHeight != line.height) { - updateLineHeight(line, estHeight); - } - }); - } - function posFromMouse(cm, e, liberal, forRect) { - var display = cm.display; - if (!liberal && e_target(e).getAttribute("cm-not-content") == "true") { - return null; - } - var x, - y, - space = display.lineSpace.getBoundingClientRect(); - try { - x = e.clientX - space.left; - y = e.clientY - space.top; - } catch (e$1) { - return null; - } - var coords = coordsChar(cm, x, y), - line; - if (forRect && coords.xRel > 0 && (line = getLine(cm.doc, coords.line).text).length == coords.ch) { - var colDiff = countColumn(line, line.length, cm.options.tabSize) - line.length; - coords = Pos(coords.line, Math.max(0, Math.round((x - paddingH(cm.display).left) / charWidth(cm.display)) - colDiff)); - } - return coords; - } - function findViewIndex(cm, n) { - if (n >= cm.display.viewTo) { - return null; - } - n -= cm.display.viewFrom; - if (n < 0) { - return null; - } - var view = cm.display.view; - for (var i2 = 0; i2 < view.length; i2++) { - n -= view[i2].size; - if (n < 0) { - return i2; - } - } - } - function regChange(cm, from, to, lendiff) { - if (from == null) { - from = cm.doc.first; - } - if (to == null) { - to = cm.doc.first + cm.doc.size; - } - if (!lendiff) { - lendiff = 0; - } - var display = cm.display; - if (lendiff && to < display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers > from)) { - display.updateLineNumbers = from; - } - cm.curOp.viewChanged = true; - if (from >= display.viewTo) { - if (sawCollapsedSpans && visualLineNo(cm.doc, from) < display.viewTo) { - resetView(cm); - } - } else if (to <= display.viewFrom) { - if (sawCollapsedSpans && visualLineEndNo(cm.doc, to + lendiff) > display.viewFrom) { - resetView(cm); - } else { - display.viewFrom += lendiff; - display.viewTo += lendiff; - } - } else if (from <= display.viewFrom && to >= display.viewTo) { - resetView(cm); - } else if (from <= display.viewFrom) { - var cut = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cut) { - display.view = display.view.slice(cut.index); - display.viewFrom = cut.lineN; - display.viewTo += lendiff; - } else { - resetView(cm); - } - } else if (to >= display.viewTo) { - var cut$1 = viewCuttingPoint(cm, from, from, -1); - if (cut$1) { - display.view = display.view.slice(0, cut$1.index); - display.viewTo = cut$1.lineN; - } else { - resetView(cm); - } - } else { - var cutTop = viewCuttingPoint(cm, from, from, -1); - var cutBot = viewCuttingPoint(cm, to, to + lendiff, 1); - if (cutTop && cutBot) { - display.view = display.view.slice(0, cutTop.index).concat(buildViewArray(cm, cutTop.lineN, cutBot.lineN)).concat(display.view.slice(cutBot.index)); - display.viewTo += lendiff; - } else { - resetView(cm); - } - } - var ext = display.externalMeasured; - if (ext) { - if (to < ext.lineN) { - ext.lineN += lendiff; - } else if (from < ext.lineN + ext.size) { - display.externalMeasured = null; - } - } - } - function regLineChange(cm, line, type) { - cm.curOp.viewChanged = true; - var display = cm.display, - ext = cm.display.externalMeasured; - if (ext && line >= ext.lineN && line < ext.lineN + ext.size) { - display.externalMeasured = null; - } - if (line < display.viewFrom || line >= display.viewTo) { - return; - } - var lineView = display.view[findViewIndex(cm, line)]; - if (lineView.node == null) { - return; - } - var arr = lineView.changes || (lineView.changes = []); - if (indexOf(arr, type) == -1) { - arr.push(type); - } - } - function resetView(cm) { - cm.display.viewFrom = cm.display.viewTo = cm.doc.first; - cm.display.view = []; - cm.display.viewOffset = 0; - } - function viewCuttingPoint(cm, oldN, newN, dir) { - var index = findViewIndex(cm, oldN), - diff, - view = cm.display.view; - if (!sawCollapsedSpans || newN == cm.doc.first + cm.doc.size) { - return { - index, - lineN: newN - }; - } - var n = cm.display.viewFrom; - for (var i2 = 0; i2 < index; i2++) { - n += view[i2].size; - } - if (n != oldN) { - if (dir > 0) { - if (index == view.length - 1) { - return null; - } - diff = n + view[index].size - oldN; - index++; - } else { - diff = n - oldN; - } - oldN += diff; - newN += diff; - } - while (visualLineNo(cm.doc, newN) != newN) { - if (index == (dir < 0 ? 0 : view.length - 1)) { - return null; - } - newN += dir * view[index - (dir < 0 ? 1 : 0)].size; - index += dir; - } - return { - index, - lineN: newN - }; - } - function adjustView(cm, from, to) { - var display = cm.display, - view = display.view; - if (view.length == 0 || from >= display.viewTo || to <= display.viewFrom) { - display.view = buildViewArray(cm, from, to); - display.viewFrom = from; - } else { - if (display.viewFrom > from) { - display.view = buildViewArray(cm, from, display.viewFrom).concat(display.view); - } else if (display.viewFrom < from) { - display.view = display.view.slice(findViewIndex(cm, from)); - } - display.viewFrom = from; - if (display.viewTo < to) { - display.view = display.view.concat(buildViewArray(cm, display.viewTo, to)); - } else if (display.viewTo > to) { - display.view = display.view.slice(0, findViewIndex(cm, to)); - } - } - display.viewTo = to; - } - function countDirtyView(cm) { - var view = cm.display.view, - dirty = 0; - for (var i2 = 0; i2 < view.length; i2++) { - var lineView = view[i2]; - if (!lineView.hidden && (!lineView.node || lineView.changes)) { - ++dirty; - } - } - return dirty; - } - function updateSelection(cm) { - cm.display.input.showSelection(cm.display.input.prepareSelection()); - } - function prepareSelection(cm, primary) { - if (primary === void 0) primary = true; - var doc = cm.doc, - result = {}; - var curFragment = result.cursors = document.createDocumentFragment(); - var selFragment = result.selection = document.createDocumentFragment(); - var customCursor = cm.options.$customCursor; - if (customCursor) { - primary = true; - } - for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { - if (!primary && i2 == doc.sel.primIndex) { - continue; - } - var range2 = doc.sel.ranges[i2]; - if (range2.from().line >= cm.display.viewTo || range2.to().line < cm.display.viewFrom) { - continue; - } - var collapsed = range2.empty(); - if (customCursor) { - var head = customCursor(cm, range2); - if (head) { - drawSelectionCursor(cm, head, curFragment); - } - } else if (collapsed || cm.options.showCursorWhenSelecting) { - drawSelectionCursor(cm, range2.head, curFragment); - } - if (!collapsed) { - drawSelectionRange(cm, range2, selFragment); - } - } - return result; - } - function drawSelectionCursor(cm, head, output) { - var pos = cursorCoords(cm, head, "div", null, null, !cm.options.singleCursorHeightPerLine); - var cursor = output.appendChild(elt("div", " ", "CodeMirror-cursor")); - cursor.style.left = pos.left + "px"; - cursor.style.top = pos.top + "px"; - cursor.style.height = Math.max(0, pos.bottom - pos.top) * cm.options.cursorHeight + "px"; - if (/\bcm-fat-cursor\b/.test(cm.getWrapperElement().className)) { - var charPos = charCoords(cm, head, "div", null, null); - var width = charPos.right - charPos.left; - cursor.style.width = (width > 0 ? width : cm.defaultCharWidth()) + "px"; - } - if (pos.other) { - var otherCursor = output.appendChild(elt("div", " ", "CodeMirror-cursor CodeMirror-secondarycursor")); - otherCursor.style.display = ""; - otherCursor.style.left = pos.other.left + "px"; - otherCursor.style.top = pos.other.top + "px"; - otherCursor.style.height = (pos.other.bottom - pos.other.top) * 0.85 + "px"; - } - } - function cmpCoords(a, b) { - return a.top - b.top || a.left - b.left; - } - function drawSelectionRange(cm, range2, output) { - var display = cm.display, - doc = cm.doc; - var fragment = document.createDocumentFragment(); - var padding = paddingH(cm.display), - leftSide = padding.left; - var rightSide = Math.max(display.sizerWidth, displayWidth(cm) - display.sizer.offsetLeft) - padding.right; - var docLTR = doc.direction == "ltr"; - function add(left, top, width, bottom) { - if (top < 0) { - top = 0; - } - top = Math.round(top); - bottom = Math.round(bottom); - fragment.appendChild(elt("div", null, "CodeMirror-selected", "position: absolute; left: " + left + "px;\n top: " + top + "px; width: " + (width == null ? rightSide - left : width) + "px;\n height: " + (bottom - top) + "px")); - } - function drawForLine(line, fromArg, toArg) { - var lineObj = getLine(doc, line); - var lineLen = lineObj.text.length; - var start, end; - function coords(ch, bias) { - return charCoords(cm, Pos(line, ch), "div", lineObj, bias); - } - function wrapX(pos, dir, side) { - var extent = wrappedLineExtentChar(cm, lineObj, null, pos); - var prop2 = dir == "ltr" == (side == "after") ? "left" : "right"; - var ch = side == "after" ? extent.begin : extent.end - (/\s/.test(lineObj.text.charAt(extent.end - 1)) ? 2 : 1); - return coords(ch, prop2)[prop2]; - } - var order = getOrder(lineObj, doc.direction); - iterateBidiSections(order, fromArg || 0, toArg == null ? lineLen : toArg, function (from, to, dir, i2) { - var ltr = dir == "ltr"; - var fromPos = coords(from, ltr ? "left" : "right"); - var toPos = coords(to - 1, ltr ? "right" : "left"); - var openStart = fromArg == null && from == 0, - openEnd = toArg == null && to == lineLen; - var first = i2 == 0, - last = !order || i2 == order.length - 1; - if (toPos.top - fromPos.top <= 3) { - var openLeft = (docLTR ? openStart : openEnd) && first; - var openRight = (docLTR ? openEnd : openStart) && last; - var left = openLeft ? leftSide : (ltr ? fromPos : toPos).left; - var right = openRight ? rightSide : (ltr ? toPos : fromPos).right; - add(left, fromPos.top, right - left, fromPos.bottom); - } else { - var topLeft, topRight, botLeft, botRight; - if (ltr) { - topLeft = docLTR && openStart && first ? leftSide : fromPos.left; - topRight = docLTR ? rightSide : wrapX(from, dir, "before"); - botLeft = docLTR ? leftSide : wrapX(to, dir, "after"); - botRight = docLTR && openEnd && last ? rightSide : toPos.right; - } else { - topLeft = !docLTR ? leftSide : wrapX(from, dir, "before"); - topRight = !docLTR && openStart && first ? rightSide : fromPos.right; - botLeft = !docLTR && openEnd && last ? leftSide : toPos.left; - botRight = !docLTR ? rightSide : wrapX(to, dir, "after"); - } - add(topLeft, fromPos.top, topRight - topLeft, fromPos.bottom); - if (fromPos.bottom < toPos.top) { - add(leftSide, fromPos.bottom, null, toPos.top); - } - add(botLeft, toPos.top, botRight - botLeft, toPos.bottom); - } - if (!start || cmpCoords(fromPos, start) < 0) { - start = fromPos; - } - if (cmpCoords(toPos, start) < 0) { - start = toPos; - } - if (!end || cmpCoords(fromPos, end) < 0) { - end = fromPos; - } - if (cmpCoords(toPos, end) < 0) { - end = toPos; - } - }); - return { - start, - end - }; - } - var sFrom = range2.from(), - sTo = range2.to(); - if (sFrom.line == sTo.line) { - drawForLine(sFrom.line, sFrom.ch, sTo.ch); - } else { - var fromLine = getLine(doc, sFrom.line), - toLine = getLine(doc, sTo.line); - var singleVLine = visualLine(fromLine) == visualLine(toLine); - var leftEnd = drawForLine(sFrom.line, sFrom.ch, singleVLine ? fromLine.text.length + 1 : null).end; - var rightStart = drawForLine(sTo.line, singleVLine ? 0 : null, sTo.ch).start; - if (singleVLine) { - if (leftEnd.top < rightStart.top - 2) { - add(leftEnd.right, leftEnd.top, null, leftEnd.bottom); - add(leftSide, rightStart.top, rightStart.left, rightStart.bottom); - } else { - add(leftEnd.right, leftEnd.top, rightStart.left - leftEnd.right, leftEnd.bottom); - } - } - if (leftEnd.bottom < rightStart.top) { - add(leftSide, leftEnd.bottom, null, rightStart.top); - } - } - output.appendChild(fragment); - } - function restartBlink(cm) { - if (!cm.state.focused) { - return; - } - var display = cm.display; - clearInterval(display.blinker); - var on2 = true; - display.cursorDiv.style.visibility = ""; - if (cm.options.cursorBlinkRate > 0) { - display.blinker = setInterval(function () { - if (!cm.hasFocus()) { - onBlur(cm); - } - display.cursorDiv.style.visibility = (on2 = !on2) ? "" : "hidden"; - }, cm.options.cursorBlinkRate); - } else if (cm.options.cursorBlinkRate < 0) { - display.cursorDiv.style.visibility = "hidden"; - } - } - function ensureFocus(cm) { - if (!cm.hasFocus()) { - cm.display.input.focus(); - if (!cm.state.focused) { - onFocus(cm); - } - } - } - function delayBlurEvent(cm) { - cm.state.delayingBlurEvent = true; - setTimeout(function () { - if (cm.state.delayingBlurEvent) { - cm.state.delayingBlurEvent = false; - if (cm.state.focused) { - onBlur(cm); - } - } - }, 100); - } - function onFocus(cm, e) { - if (cm.state.delayingBlurEvent && !cm.state.draggingText) { - cm.state.delayingBlurEvent = false; - } - if (cm.options.readOnly == "nocursor") { - return; - } - if (!cm.state.focused) { - signal(cm, "focus", cm, e); - cm.state.focused = true; - addClass(cm.display.wrapper, "CodeMirror-focused"); - if (!cm.curOp && cm.display.selForContextMenu != cm.doc.sel) { - cm.display.input.reset(); - if (webkit) { - setTimeout(function () { - return cm.display.input.reset(true); - }, 20); - } - } - cm.display.input.receivedFocus(); - } - restartBlink(cm); - } - function onBlur(cm, e) { - if (cm.state.delayingBlurEvent) { - return; - } - if (cm.state.focused) { - signal(cm, "blur", cm, e); - cm.state.focused = false; - rmClass(cm.display.wrapper, "CodeMirror-focused"); - } - clearInterval(cm.display.blinker); - setTimeout(function () { - if (!cm.state.focused) { - cm.display.shift = false; - } - }, 150); - } - function updateHeightsInViewport(cm) { - var display = cm.display; - var prevBottom = display.lineDiv.offsetTop; - var viewTop = Math.max(0, display.scroller.getBoundingClientRect().top); - var oldHeight = display.lineDiv.getBoundingClientRect().top; - var mustScroll = 0; - for (var i2 = 0; i2 < display.view.length; i2++) { - var cur = display.view[i2], - wrapping = cm.options.lineWrapping; - var height = void 0, - width = 0; - if (cur.hidden) { - continue; - } - oldHeight += cur.line.height; - if (ie && ie_version < 8) { - var bot = cur.node.offsetTop + cur.node.offsetHeight; - height = bot - prevBottom; - prevBottom = bot; - } else { - var box = cur.node.getBoundingClientRect(); - height = box.bottom - box.top; - if (!wrapping && cur.text.firstChild) { - width = cur.text.firstChild.getBoundingClientRect().right - box.left - 1; - } - } - var diff = cur.line.height - height; - if (diff > 5e-3 || diff < -5e-3) { - if (oldHeight < viewTop) { - mustScroll -= diff; - } - updateLineHeight(cur.line, height); - updateWidgetHeight(cur.line); - if (cur.rest) { - for (var j = 0; j < cur.rest.length; j++) { - updateWidgetHeight(cur.rest[j]); - } - } - } - if (width > cm.display.sizerWidth) { - var chWidth = Math.ceil(width / charWidth(cm.display)); - if (chWidth > cm.display.maxLineLength) { - cm.display.maxLineLength = chWidth; - cm.display.maxLine = cur.line; - cm.display.maxLineChanged = true; - } - } - } - if (Math.abs(mustScroll) > 2) { - display.scroller.scrollTop += mustScroll; - } - } - function updateWidgetHeight(line) { - if (line.widgets) { - for (var i2 = 0; i2 < line.widgets.length; ++i2) { - var w = line.widgets[i2], - parent = w.node.parentNode; - if (parent) { - w.height = parent.offsetHeight; - } - } - } - } - function visibleLines(display, doc, viewport) { - var top = viewport && viewport.top != null ? Math.max(0, viewport.top) : display.scroller.scrollTop; - top = Math.floor(top - paddingTop(display)); - var bottom = viewport && viewport.bottom != null ? viewport.bottom : top + display.wrapper.clientHeight; - var from = lineAtHeight(doc, top), - to = lineAtHeight(doc, bottom); - if (viewport && viewport.ensure) { - var ensureFrom = viewport.ensure.from.line, - ensureTo = viewport.ensure.to.line; - if (ensureFrom < from) { - from = ensureFrom; - to = lineAtHeight(doc, heightAtLine(getLine(doc, ensureFrom)) + display.wrapper.clientHeight); - } else if (Math.min(ensureTo, doc.lastLine()) >= to) { - from = lineAtHeight(doc, heightAtLine(getLine(doc, ensureTo)) - display.wrapper.clientHeight); - to = ensureTo; - } - } - return { - from, - to: Math.max(to, from + 1) - }; - } - function maybeScrollWindow(cm, rect) { - if (signalDOMEvent(cm, "scrollCursorIntoView")) { - return; - } - var display = cm.display, - box = display.sizer.getBoundingClientRect(), - doScroll = null; - if (rect.top + box.top < 0) { - doScroll = true; - } else if (rect.bottom + box.top > (window.innerHeight || document.documentElement.clientHeight)) { - doScroll = false; - } - if (doScroll != null && !phantom) { - var scrollNode = elt("div", "​", null, "position: absolute;\n top: " + (rect.top - display.viewOffset - paddingTop(cm.display)) + "px;\n height: " + (rect.bottom - rect.top + scrollGap(cm) + display.barHeight) + "px;\n left: " + rect.left + "px; width: " + Math.max(2, rect.right - rect.left) + "px;"); - cm.display.lineSpace.appendChild(scrollNode); - scrollNode.scrollIntoView(doScroll); - cm.display.lineSpace.removeChild(scrollNode); - } - } - function scrollPosIntoView(cm, pos, end, margin) { - if (margin == null) { - margin = 0; - } - var rect; - if (!cm.options.lineWrapping && pos == end) { - end = pos.sticky == "before" ? Pos(pos.line, pos.ch + 1, "before") : pos; - pos = pos.ch ? Pos(pos.line, pos.sticky == "before" ? pos.ch - 1 : pos.ch, "after") : pos; - } - for (var limit = 0; limit < 5; limit++) { - var changed = false; - var coords = cursorCoords(cm, pos); - var endCoords = !end || end == pos ? coords : cursorCoords(cm, end); - rect = { - left: Math.min(coords.left, endCoords.left), - top: Math.min(coords.top, endCoords.top) - margin, - right: Math.max(coords.left, endCoords.left), - bottom: Math.max(coords.bottom, endCoords.bottom) + margin - }; - var scrollPos = calculateScrollPos(cm, rect); - var startTop = cm.doc.scrollTop, - startLeft = cm.doc.scrollLeft; - if (scrollPos.scrollTop != null) { - updateScrollTop(cm, scrollPos.scrollTop); - if (Math.abs(cm.doc.scrollTop - startTop) > 1) { - changed = true; - } - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft); - if (Math.abs(cm.doc.scrollLeft - startLeft) > 1) { - changed = true; - } - } - if (!changed) { - break; - } - } - return rect; - } - function scrollIntoView(cm, rect) { - var scrollPos = calculateScrollPos(cm, rect); - if (scrollPos.scrollTop != null) { - updateScrollTop(cm, scrollPos.scrollTop); - } - if (scrollPos.scrollLeft != null) { - setScrollLeft(cm, scrollPos.scrollLeft); - } - } - function calculateScrollPos(cm, rect) { - var display = cm.display, - snapMargin = textHeight(cm.display); - if (rect.top < 0) { - rect.top = 0; - } - var screentop = cm.curOp && cm.curOp.scrollTop != null ? cm.curOp.scrollTop : display.scroller.scrollTop; - var screen2 = displayHeight(cm), - result = {}; - if (rect.bottom - rect.top > screen2) { - rect.bottom = rect.top + screen2; - } - var docBottom = cm.doc.height + paddingVert(display); - var atTop = rect.top < snapMargin, - atBottom = rect.bottom > docBottom - snapMargin; - if (rect.top < screentop) { - result.scrollTop = atTop ? 0 : rect.top; - } else if (rect.bottom > screentop + screen2) { - var newTop = Math.min(rect.top, (atBottom ? docBottom : rect.bottom) - screen2); - if (newTop != screentop) { - result.scrollTop = newTop; - } - } - var gutterSpace = cm.options.fixedGutter ? 0 : display.gutters.offsetWidth; - var screenleft = cm.curOp && cm.curOp.scrollLeft != null ? cm.curOp.scrollLeft : display.scroller.scrollLeft - gutterSpace; - var screenw = displayWidth(cm) - display.gutters.offsetWidth; - var tooWide = rect.right - rect.left > screenw; - if (tooWide) { - rect.right = rect.left + screenw; - } - if (rect.left < 10) { - result.scrollLeft = 0; - } else if (rect.left < screenleft) { - result.scrollLeft = Math.max(0, rect.left + gutterSpace - (tooWide ? 0 : 10)); - } else if (rect.right > screenw + screenleft - 3) { - result.scrollLeft = rect.right + (tooWide ? 0 : 10) - screenw; - } - return result; - } - function addToScrollTop(cm, top) { - if (top == null) { - return; - } - resolveScrollToPos(cm); - cm.curOp.scrollTop = (cm.curOp.scrollTop == null ? cm.doc.scrollTop : cm.curOp.scrollTop) + top; - } - function ensureCursorVisible(cm) { - resolveScrollToPos(cm); - var cur = cm.getCursor(); - cm.curOp.scrollToPos = { - from: cur, - to: cur, - margin: cm.options.cursorScrollMargin - }; - } - function scrollToCoords(cm, x, y) { - if (x != null || y != null) { - resolveScrollToPos(cm); - } - if (x != null) { - cm.curOp.scrollLeft = x; - } - if (y != null) { - cm.curOp.scrollTop = y; - } - } - function scrollToRange(cm, range2) { - resolveScrollToPos(cm); - cm.curOp.scrollToPos = range2; - } - function resolveScrollToPos(cm) { - var range2 = cm.curOp.scrollToPos; - if (range2) { - cm.curOp.scrollToPos = null; - var from = estimateCoords(cm, range2.from), - to = estimateCoords(cm, range2.to); - scrollToCoordsRange(cm, from, to, range2.margin); - } - } - function scrollToCoordsRange(cm, from, to, margin) { - var sPos = calculateScrollPos(cm, { - left: Math.min(from.left, to.left), - top: Math.min(from.top, to.top) - margin, - right: Math.max(from.right, to.right), - bottom: Math.max(from.bottom, to.bottom) + margin - }); - scrollToCoords(cm, sPos.scrollLeft, sPos.scrollTop); - } - function updateScrollTop(cm, val) { - if (Math.abs(cm.doc.scrollTop - val) < 2) { - return; - } - if (!gecko) { - updateDisplaySimple(cm, { - top: val - }); - } - setScrollTop(cm, val, true); - if (gecko) { - updateDisplaySimple(cm); - } - startWorker(cm, 100); - } - function setScrollTop(cm, val, forceScroll) { - val = Math.max(0, Math.min(cm.display.scroller.scrollHeight - cm.display.scroller.clientHeight, val)); - if (cm.display.scroller.scrollTop == val && !forceScroll) { - return; - } - cm.doc.scrollTop = val; - cm.display.scrollbars.setScrollTop(val); - if (cm.display.scroller.scrollTop != val) { - cm.display.scroller.scrollTop = val; - } - } - function setScrollLeft(cm, val, isScroller, forceScroll) { - val = Math.max(0, Math.min(val, cm.display.scroller.scrollWidth - cm.display.scroller.clientWidth)); - if ((isScroller ? val == cm.doc.scrollLeft : Math.abs(cm.doc.scrollLeft - val) < 2) && !forceScroll) { - return; - } - cm.doc.scrollLeft = val; - alignHorizontally(cm); - if (cm.display.scroller.scrollLeft != val) { - cm.display.scroller.scrollLeft = val; - } - cm.display.scrollbars.setScrollLeft(val); - } - function measureForScrollbars(cm) { - var d = cm.display, - gutterW = d.gutters.offsetWidth; - var docH = Math.round(cm.doc.height + paddingVert(cm.display)); - return { - clientHeight: d.scroller.clientHeight, - viewHeight: d.wrapper.clientHeight, - scrollWidth: d.scroller.scrollWidth, - clientWidth: d.scroller.clientWidth, - viewWidth: d.wrapper.clientWidth, - barLeft: cm.options.fixedGutter ? gutterW : 0, - docHeight: docH, - scrollHeight: docH + scrollGap(cm) + d.barHeight, - nativeBarWidth: d.nativeBarWidth, - gutterWidth: gutterW - }; - } - var NativeScrollbars = function (place, scroll, cm) { - this.cm = cm; - var vert = this.vert = elt("div", [elt("div", null, null, "min-width: 1px")], "CodeMirror-vscrollbar"); - var horiz = this.horiz = elt("div", [elt("div", null, null, "height: 100%; min-height: 1px")], "CodeMirror-hscrollbar"); - vert.tabIndex = horiz.tabIndex = -1; - place(vert); - place(horiz); - on(vert, "scroll", function () { - if (vert.clientHeight) { - scroll(vert.scrollTop, "vertical"); - } - }); - on(horiz, "scroll", function () { - if (horiz.clientWidth) { - scroll(horiz.scrollLeft, "horizontal"); - } - }); - this.checkedZeroWidth = false; - if (ie && ie_version < 8) { - this.horiz.style.minHeight = this.vert.style.minWidth = "18px"; - } - }; - NativeScrollbars.prototype.update = function (measure) { - var needsH = measure.scrollWidth > measure.clientWidth + 1; - var needsV = measure.scrollHeight > measure.clientHeight + 1; - var sWidth = measure.nativeBarWidth; - if (needsV) { - this.vert.style.display = "block"; - this.vert.style.bottom = needsH ? sWidth + "px" : "0"; - var totalHeight = measure.viewHeight - (needsH ? sWidth : 0); - this.vert.firstChild.style.height = Math.max(0, measure.scrollHeight - measure.clientHeight + totalHeight) + "px"; - } else { - this.vert.scrollTop = 0; - this.vert.style.display = ""; - this.vert.firstChild.style.height = "0"; - } - if (needsH) { - this.horiz.style.display = "block"; - this.horiz.style.right = needsV ? sWidth + "px" : "0"; - this.horiz.style.left = measure.barLeft + "px"; - var totalWidth = measure.viewWidth - measure.barLeft - (needsV ? sWidth : 0); - this.horiz.firstChild.style.width = Math.max(0, measure.scrollWidth - measure.clientWidth + totalWidth) + "px"; - } else { - this.horiz.style.display = ""; - this.horiz.firstChild.style.width = "0"; - } - if (!this.checkedZeroWidth && measure.clientHeight > 0) { - if (sWidth == 0) { - this.zeroWidthHack(); - } - this.checkedZeroWidth = true; - } - return { - right: needsV ? sWidth : 0, - bottom: needsH ? sWidth : 0 - }; - }; - NativeScrollbars.prototype.setScrollLeft = function (pos) { - if (this.horiz.scrollLeft != pos) { - this.horiz.scrollLeft = pos; - } - if (this.disableHoriz) { - this.enableZeroWidthBar(this.horiz, this.disableHoriz, "horiz"); - } - }; - NativeScrollbars.prototype.setScrollTop = function (pos) { - if (this.vert.scrollTop != pos) { - this.vert.scrollTop = pos; - } - if (this.disableVert) { - this.enableZeroWidthBar(this.vert, this.disableVert, "vert"); - } - }; - NativeScrollbars.prototype.zeroWidthHack = function () { - var w = mac && !mac_geMountainLion ? "12px" : "18px"; - this.horiz.style.height = this.vert.style.width = w; - this.horiz.style.pointerEvents = this.vert.style.pointerEvents = "none"; - this.disableHoriz = new Delayed(); - this.disableVert = new Delayed(); - }; - NativeScrollbars.prototype.enableZeroWidthBar = function (bar, delay, type) { - bar.style.pointerEvents = "auto"; - function maybeDisable() { - var box = bar.getBoundingClientRect(); - var elt2 = type == "vert" ? document.elementFromPoint(box.right - 1, (box.top + box.bottom) / 2) : document.elementFromPoint((box.right + box.left) / 2, box.bottom - 1); - if (elt2 != bar) { - bar.style.pointerEvents = "none"; - } else { - delay.set(1e3, maybeDisable); - } - } - delay.set(1e3, maybeDisable); - }; - NativeScrollbars.prototype.clear = function () { - var parent = this.horiz.parentNode; - parent.removeChild(this.horiz); - parent.removeChild(this.vert); - }; - var NullScrollbars = function () {}; - NullScrollbars.prototype.update = function () { - return { - bottom: 0, - right: 0 - }; - }; - NullScrollbars.prototype.setScrollLeft = function () {}; - NullScrollbars.prototype.setScrollTop = function () {}; - NullScrollbars.prototype.clear = function () {}; - function updateScrollbars(cm, measure) { - if (!measure) { - measure = measureForScrollbars(cm); - } - var startWidth = cm.display.barWidth, - startHeight = cm.display.barHeight; - updateScrollbarsInner(cm, measure); - for (var i2 = 0; i2 < 4 && startWidth != cm.display.barWidth || startHeight != cm.display.barHeight; i2++) { - if (startWidth != cm.display.barWidth && cm.options.lineWrapping) { - updateHeightsInViewport(cm); - } - updateScrollbarsInner(cm, measureForScrollbars(cm)); - startWidth = cm.display.barWidth; - startHeight = cm.display.barHeight; - } - } - function updateScrollbarsInner(cm, measure) { - var d = cm.display; - var sizes = d.scrollbars.update(measure); - d.sizer.style.paddingRight = (d.barWidth = sizes.right) + "px"; - d.sizer.style.paddingBottom = (d.barHeight = sizes.bottom) + "px"; - d.heightForcer.style.borderBottom = sizes.bottom + "px solid transparent"; - if (sizes.right && sizes.bottom) { - d.scrollbarFiller.style.display = "block"; - d.scrollbarFiller.style.height = sizes.bottom + "px"; - d.scrollbarFiller.style.width = sizes.right + "px"; - } else { - d.scrollbarFiller.style.display = ""; - } - if (sizes.bottom && cm.options.coverGutterNextToScrollbar && cm.options.fixedGutter) { - d.gutterFiller.style.display = "block"; - d.gutterFiller.style.height = sizes.bottom + "px"; - d.gutterFiller.style.width = measure.gutterWidth + "px"; - } else { - d.gutterFiller.style.display = ""; - } - } - var scrollbarModel = { - "native": NativeScrollbars, - "null": NullScrollbars - }; - function initScrollbars(cm) { - if (cm.display.scrollbars) { - cm.display.scrollbars.clear(); - if (cm.display.scrollbars.addClass) { - rmClass(cm.display.wrapper, cm.display.scrollbars.addClass); - } - } - cm.display.scrollbars = new scrollbarModel[cm.options.scrollbarStyle](function (node) { - cm.display.wrapper.insertBefore(node, cm.display.scrollbarFiller); - on(node, "mousedown", function () { - if (cm.state.focused) { - setTimeout(function () { - return cm.display.input.focus(); - }, 0); - } - }); - node.setAttribute("cm-not-content", "true"); - }, function (pos, axis) { - if (axis == "horizontal") { - setScrollLeft(cm, pos); - } else { - updateScrollTop(cm, pos); - } - }, cm); - if (cm.display.scrollbars.addClass) { - addClass(cm.display.wrapper, cm.display.scrollbars.addClass); - } - } - var nextOpId = 0; - function startOperation(cm) { - cm.curOp = { - cm, - viewChanged: false, - // Flag that indicates that lines might need to be redrawn - startHeight: cm.doc.height, - // Used to detect need to update scrollbar - forceUpdate: false, - // Used to force a redraw - updateInput: 0, - // Whether to reset the input textarea - typing: false, - // Whether this reset should be careful to leave existing text (for compositing) - changeObjs: null, - // Accumulated changes, for firing change events - cursorActivityHandlers: null, - // Set of handlers to fire cursorActivity on - cursorActivityCalled: 0, - // Tracks which cursorActivity handlers have been called already - selectionChanged: false, - // Whether the selection needs to be redrawn - updateMaxLine: false, - // Set when the widest line needs to be determined anew - scrollLeft: null, - scrollTop: null, - // Intermediate scroll position, not pushed to DOM yet - scrollToPos: null, - // Used to scroll to a specific position - focus: false, - id: ++nextOpId, - // Unique ID - markArrays: null - // Used by addMarkedSpan - }; - pushOperation(cm.curOp); - } - function endOperation(cm) { - var op = cm.curOp; - if (op) { - finishOperation(op, function (group) { - for (var i2 = 0; i2 < group.ops.length; i2++) { - group.ops[i2].cm.curOp = null; - } - endOperations(group); - }); - } - } - function endOperations(group) { - var ops = group.ops; - for (var i2 = 0; i2 < ops.length; i2++) { - endOperation_R1(ops[i2]); - } - for (var i$12 = 0; i$12 < ops.length; i$12++) { - endOperation_W1(ops[i$12]); - } - for (var i$22 = 0; i$22 < ops.length; i$22++) { - endOperation_R2(ops[i$22]); - } - for (var i$3 = 0; i$3 < ops.length; i$3++) { - endOperation_W2(ops[i$3]); - } - for (var i$4 = 0; i$4 < ops.length; i$4++) { - endOperation_finish(ops[i$4]); - } - } - function endOperation_R1(op) { - var cm = op.cm, - display = cm.display; - maybeClipScrollbars(cm); - if (op.updateMaxLine) { - findMaxLine(cm); - } - op.mustUpdate = op.viewChanged || op.forceUpdate || op.scrollTop != null || op.scrollToPos && (op.scrollToPos.from.line < display.viewFrom || op.scrollToPos.to.line >= display.viewTo) || display.maxLineChanged && cm.options.lineWrapping; - op.update = op.mustUpdate && new DisplayUpdate(cm, op.mustUpdate && { - top: op.scrollTop, - ensure: op.scrollToPos - }, op.forceUpdate); - } - function endOperation_W1(op) { - op.updatedDisplay = op.mustUpdate && updateDisplayIfNeeded(op.cm, op.update); - } - function endOperation_R2(op) { - var cm = op.cm, - display = cm.display; - if (op.updatedDisplay) { - updateHeightsInViewport(cm); - } - op.barMeasure = measureForScrollbars(cm); - if (display.maxLineChanged && !cm.options.lineWrapping) { - op.adjustWidthTo = measureChar(cm, display.maxLine, display.maxLine.text.length).left + 3; - cm.display.sizerWidth = op.adjustWidthTo; - op.barMeasure.scrollWidth = Math.max(display.scroller.clientWidth, display.sizer.offsetLeft + op.adjustWidthTo + scrollGap(cm) + cm.display.barWidth); - op.maxScrollLeft = Math.max(0, display.sizer.offsetLeft + op.adjustWidthTo - displayWidth(cm)); - } - if (op.updatedDisplay || op.selectionChanged) { - op.preparedSelection = display.input.prepareSelection(); - } - } - function endOperation_W2(op) { - var cm = op.cm; - if (op.adjustWidthTo != null) { - cm.display.sizer.style.minWidth = op.adjustWidthTo + "px"; - if (op.maxScrollLeft < cm.doc.scrollLeft) { - setScrollLeft(cm, Math.min(cm.display.scroller.scrollLeft, op.maxScrollLeft), true); - } - cm.display.maxLineChanged = false; - } - var takeFocus = op.focus && op.focus == activeElt(); - if (op.preparedSelection) { - cm.display.input.showSelection(op.preparedSelection, takeFocus); - } - if (op.updatedDisplay || op.startHeight != cm.doc.height) { - updateScrollbars(cm, op.barMeasure); - } - if (op.updatedDisplay) { - setDocumentHeight(cm, op.barMeasure); - } - if (op.selectionChanged) { - restartBlink(cm); - } - if (cm.state.focused && op.updateInput) { - cm.display.input.reset(op.typing); - } - if (takeFocus) { - ensureFocus(op.cm); - } - } - function endOperation_finish(op) { - var cm = op.cm, - display = cm.display, - doc = cm.doc; - if (op.updatedDisplay) { - postUpdateDisplay(cm, op.update); - } - if (display.wheelStartX != null && (op.scrollTop != null || op.scrollLeft != null || op.scrollToPos)) { - display.wheelStartX = display.wheelStartY = null; - } - if (op.scrollTop != null) { - setScrollTop(cm, op.scrollTop, op.forceScroll); - } - if (op.scrollLeft != null) { - setScrollLeft(cm, op.scrollLeft, true, true); - } - if (op.scrollToPos) { - var rect = scrollPosIntoView(cm, clipPos(doc, op.scrollToPos.from), clipPos(doc, op.scrollToPos.to), op.scrollToPos.margin); - maybeScrollWindow(cm, rect); - } - var hidden = op.maybeHiddenMarkers, - unhidden = op.maybeUnhiddenMarkers; - if (hidden) { - for (var i2 = 0; i2 < hidden.length; ++i2) { - if (!hidden[i2].lines.length) { - signal(hidden[i2], "hide"); - } - } - } - if (unhidden) { - for (var i$12 = 0; i$12 < unhidden.length; ++i$12) { - if (unhidden[i$12].lines.length) { - signal(unhidden[i$12], "unhide"); - } - } - } - if (display.wrapper.offsetHeight) { - doc.scrollTop = cm.display.scroller.scrollTop; - } - if (op.changeObjs) { - signal(cm, "changes", cm, op.changeObjs); - } - if (op.update) { - op.update.finish(); - } - } - function runInOp(cm, f) { - if (cm.curOp) { - return f(); - } - startOperation(cm); - try { - return f(); - } finally { - endOperation(cm); - } - } - function operation(cm, f) { - return function () { - if (cm.curOp) { - return f.apply(cm, arguments); - } - startOperation(cm); - try { - return f.apply(cm, arguments); - } finally { - endOperation(cm); - } - }; - } - function methodOp(f) { - return function () { - if (this.curOp) { - return f.apply(this, arguments); - } - startOperation(this); - try { - return f.apply(this, arguments); - } finally { - endOperation(this); - } - }; - } - function docMethodOp(f) { - return function () { - var cm = this.cm; - if (!cm || cm.curOp) { - return f.apply(this, arguments); - } - startOperation(cm); - try { - return f.apply(this, arguments); - } finally { - endOperation(cm); - } - }; - } - function startWorker(cm, time) { - if (cm.doc.highlightFrontier < cm.display.viewTo) { - cm.state.highlight.set(time, bind(highlightWorker, cm)); - } - } - function highlightWorker(cm) { - var doc = cm.doc; - if (doc.highlightFrontier >= cm.display.viewTo) { - return; - } - var end = + /* @__PURE__ */new Date() + cm.options.workTime; - var context = getContextBefore(cm, doc.highlightFrontier); - var changedLines = []; - doc.iter(context.line, Math.min(doc.first + doc.size, cm.display.viewTo + 500), function (line) { - if (context.line >= cm.display.viewFrom) { - var oldStyles = line.styles; - var resetState = line.text.length > cm.options.maxHighlightLength ? copyState(doc.mode, context.state) : null; - var highlighted = highlightLine(cm, line, context, true); - if (resetState) { - context.state = resetState; - } - line.styles = highlighted.styles; - var oldCls = line.styleClasses, - newCls = highlighted.classes; - if (newCls) { - line.styleClasses = newCls; - } else if (oldCls) { - line.styleClasses = null; - } - var ischange = !oldStyles || oldStyles.length != line.styles.length || oldCls != newCls && (!oldCls || !newCls || oldCls.bgClass != newCls.bgClass || oldCls.textClass != newCls.textClass); - for (var i2 = 0; !ischange && i2 < oldStyles.length; ++i2) { - ischange = oldStyles[i2] != line.styles[i2]; - } - if (ischange) { - changedLines.push(context.line); - } - line.stateAfter = context.save(); - context.nextLine(); - } else { - if (line.text.length <= cm.options.maxHighlightLength) { - processLine(cm, line.text, context); - } - line.stateAfter = context.line % 5 == 0 ? context.save() : null; - context.nextLine(); - } - if (+ /* @__PURE__ */new Date() > end) { - startWorker(cm, cm.options.workDelay); - return true; - } - }); - doc.highlightFrontier = context.line; - doc.modeFrontier = Math.max(doc.modeFrontier, context.line); - if (changedLines.length) { - runInOp(cm, function () { - for (var i2 = 0; i2 < changedLines.length; i2++) { - regLineChange(cm, changedLines[i2], "text"); - } - }); - } - } - var DisplayUpdate = function (cm, viewport, force) { - var display = cm.display; - this.viewport = viewport; - this.visible = visibleLines(display, cm.doc, viewport); - this.editorIsHidden = !display.wrapper.offsetWidth; - this.wrapperHeight = display.wrapper.clientHeight; - this.wrapperWidth = display.wrapper.clientWidth; - this.oldDisplayWidth = displayWidth(cm); - this.force = force; - this.dims = getDimensions(cm); - this.events = []; - }; - DisplayUpdate.prototype.signal = function (emitter, type) { - if (hasHandler(emitter, type)) { - this.events.push(arguments); - } - }; - DisplayUpdate.prototype.finish = function () { - for (var i2 = 0; i2 < this.events.length; i2++) { - signal.apply(null, this.events[i2]); - } - }; - function maybeClipScrollbars(cm) { - var display = cm.display; - if (!display.scrollbarsClipped && display.scroller.offsetWidth) { - display.nativeBarWidth = display.scroller.offsetWidth - display.scroller.clientWidth; - display.heightForcer.style.height = scrollGap(cm) + "px"; - display.sizer.style.marginBottom = -display.nativeBarWidth + "px"; - display.sizer.style.borderRightWidth = scrollGap(cm) + "px"; - display.scrollbarsClipped = true; - } - } - function selectionSnapshot(cm) { - if (cm.hasFocus()) { - return null; - } - var active = activeElt(); - if (!active || !contains(cm.display.lineDiv, active)) { - return null; - } - var result = { - activeElt: active - }; - if (window.getSelection) { - var sel = window.getSelection(); - if (sel.anchorNode && sel.extend && contains(cm.display.lineDiv, sel.anchorNode)) { - result.anchorNode = sel.anchorNode; - result.anchorOffset = sel.anchorOffset; - result.focusNode = sel.focusNode; - result.focusOffset = sel.focusOffset; - } - } - return result; - } - function restoreSelection(snapshot) { - if (!snapshot || !snapshot.activeElt || snapshot.activeElt == activeElt()) { - return; - } - snapshot.activeElt.focus(); - if (!/^(INPUT|TEXTAREA)$/.test(snapshot.activeElt.nodeName) && snapshot.anchorNode && contains(document.body, snapshot.anchorNode) && contains(document.body, snapshot.focusNode)) { - var sel = window.getSelection(), - range2 = document.createRange(); - range2.setEnd(snapshot.anchorNode, snapshot.anchorOffset); - range2.collapse(false); - sel.removeAllRanges(); - sel.addRange(range2); - sel.extend(snapshot.focusNode, snapshot.focusOffset); - } - } - function updateDisplayIfNeeded(cm, update) { - var display = cm.display, - doc = cm.doc; - if (update.editorIsHidden) { - resetView(cm); - return false; - } - if (!update.force && update.visible.from >= display.viewFrom && update.visible.to <= display.viewTo && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo) && display.renderedView == display.view && countDirtyView(cm) == 0) { - return false; - } - if (maybeUpdateLineNumberWidth(cm)) { - resetView(cm); - update.dims = getDimensions(cm); - } - var end = doc.first + doc.size; - var from = Math.max(update.visible.from - cm.options.viewportMargin, doc.first); - var to = Math.min(end, update.visible.to + cm.options.viewportMargin); - if (display.viewFrom < from && from - display.viewFrom < 20) { - from = Math.max(doc.first, display.viewFrom); - } - if (display.viewTo > to && display.viewTo - to < 20) { - to = Math.min(end, display.viewTo); - } - if (sawCollapsedSpans) { - from = visualLineNo(cm.doc, from); - to = visualLineEndNo(cm.doc, to); - } - var different = from != display.viewFrom || to != display.viewTo || display.lastWrapHeight != update.wrapperHeight || display.lastWrapWidth != update.wrapperWidth; - adjustView(cm, from, to); - display.viewOffset = heightAtLine(getLine(cm.doc, display.viewFrom)); - cm.display.mover.style.top = display.viewOffset + "px"; - var toUpdate = countDirtyView(cm); - if (!different && toUpdate == 0 && !update.force && display.renderedView == display.view && (display.updateLineNumbers == null || display.updateLineNumbers >= display.viewTo)) { - return false; - } - var selSnapshot = selectionSnapshot(cm); - if (toUpdate > 4) { - display.lineDiv.style.display = "none"; - } - patchDisplay(cm, display.updateLineNumbers, update.dims); - if (toUpdate > 4) { - display.lineDiv.style.display = ""; - } - display.renderedView = display.view; - restoreSelection(selSnapshot); - removeChildren(display.cursorDiv); - removeChildren(display.selectionDiv); - display.gutters.style.height = display.sizer.style.minHeight = 0; - if (different) { - display.lastWrapHeight = update.wrapperHeight; - display.lastWrapWidth = update.wrapperWidth; - startWorker(cm, 400); - } - display.updateLineNumbers = null; - return true; - } - function postUpdateDisplay(cm, update) { - var viewport = update.viewport; - for (var first = true;; first = false) { - if (!first || !cm.options.lineWrapping || update.oldDisplayWidth == displayWidth(cm)) { - if (viewport && viewport.top != null) { - viewport = { - top: Math.min(cm.doc.height + paddingVert(cm.display) - displayHeight(cm), viewport.top) - }; - } - update.visible = visibleLines(cm.display, cm.doc, viewport); - if (update.visible.from >= cm.display.viewFrom && update.visible.to <= cm.display.viewTo) { - break; - } - } else if (first) { - update.visible = visibleLines(cm.display, cm.doc, viewport); - } - if (!updateDisplayIfNeeded(cm, update)) { - break; - } - updateHeightsInViewport(cm); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.force = false; - } - update.signal(cm, "update", cm); - if (cm.display.viewFrom != cm.display.reportedViewFrom || cm.display.viewTo != cm.display.reportedViewTo) { - update.signal(cm, "viewportChange", cm, cm.display.viewFrom, cm.display.viewTo); - cm.display.reportedViewFrom = cm.display.viewFrom; - cm.display.reportedViewTo = cm.display.viewTo; - } - } - function updateDisplaySimple(cm, viewport) { - var update = new DisplayUpdate(cm, viewport); - if (updateDisplayIfNeeded(cm, update)) { - updateHeightsInViewport(cm); - postUpdateDisplay(cm, update); - var barMeasure = measureForScrollbars(cm); - updateSelection(cm); - updateScrollbars(cm, barMeasure); - setDocumentHeight(cm, barMeasure); - update.finish(); - } - } - function patchDisplay(cm, updateNumbersFrom, dims) { - var display = cm.display, - lineNumbers = cm.options.lineNumbers; - var container = display.lineDiv, - cur = container.firstChild; - function rm(node2) { - var next = node2.nextSibling; - if (webkit && mac && cm.display.currentWheelTarget == node2) { - node2.style.display = "none"; - } else { - node2.parentNode.removeChild(node2); - } - return next; - } - var view = display.view, - lineN = display.viewFrom; - for (var i2 = 0; i2 < view.length; i2++) { - var lineView = view[i2]; - if (lineView.hidden) ;else if (!lineView.node || lineView.node.parentNode != container) { - var node = buildLineElement(cm, lineView, lineN, dims); - container.insertBefore(node, cur); - } else { - while (cur != lineView.node) { - cur = rm(cur); - } - var updateNumber = lineNumbers && updateNumbersFrom != null && updateNumbersFrom <= lineN && lineView.lineNumber; - if (lineView.changes) { - if (indexOf(lineView.changes, "gutter") > -1) { - updateNumber = false; - } - updateLineForChanges(cm, lineView, lineN, dims); - } - if (updateNumber) { - removeChildren(lineView.lineNumber); - lineView.lineNumber.appendChild(document.createTextNode(lineNumberFor(cm.options, lineN))); - } - cur = lineView.node.nextSibling; - } - lineN += lineView.size; - } - while (cur) { - cur = rm(cur); - } - } - function updateGutterSpace(display) { - var width = display.gutters.offsetWidth; - display.sizer.style.marginLeft = width + "px"; - signalLater(display, "gutterChanged", display); - } - function setDocumentHeight(cm, measure) { - cm.display.sizer.style.minHeight = measure.docHeight + "px"; - cm.display.heightForcer.style.top = measure.docHeight + "px"; - cm.display.gutters.style.height = measure.docHeight + cm.display.barHeight + scrollGap(cm) + "px"; - } - function alignHorizontally(cm) { - var display = cm.display, - view = display.view; - if (!display.alignWidgets && (!display.gutters.firstChild || !cm.options.fixedGutter)) { - return; - } - var comp = compensateForHScroll(display) - display.scroller.scrollLeft + cm.doc.scrollLeft; - var gutterW = display.gutters.offsetWidth, - left = comp + "px"; - for (var i2 = 0; i2 < view.length; i2++) { - if (!view[i2].hidden) { - if (cm.options.fixedGutter) { - if (view[i2].gutter) { - view[i2].gutter.style.left = left; - } - if (view[i2].gutterBackground) { - view[i2].gutterBackground.style.left = left; - } - } - var align = view[i2].alignable; - if (align) { - for (var j = 0; j < align.length; j++) { - align[j].style.left = left; - } - } - } - } - if (cm.options.fixedGutter) { - display.gutters.style.left = comp + gutterW + "px"; - } - } - function maybeUpdateLineNumberWidth(cm) { - if (!cm.options.lineNumbers) { - return false; - } - var doc = cm.doc, - last = lineNumberFor(cm.options, doc.first + doc.size - 1), - display = cm.display; - if (last.length != display.lineNumChars) { - var test = display.measure.appendChild(elt("div", [elt("div", last)], "CodeMirror-linenumber CodeMirror-gutter-elt")); - var innerW = test.firstChild.offsetWidth, - padding = test.offsetWidth - innerW; - display.lineGutter.style.width = ""; - display.lineNumInnerWidth = Math.max(innerW, display.lineGutter.offsetWidth - padding) + 1; - display.lineNumWidth = display.lineNumInnerWidth + padding; - display.lineNumChars = display.lineNumInnerWidth ? last.length : -1; - display.lineGutter.style.width = display.lineNumWidth + "px"; - updateGutterSpace(cm.display); - return true; - } - return false; - } - function getGutters(gutters, lineNumbers) { - var result = [], - sawLineNumbers = false; - for (var i2 = 0; i2 < gutters.length; i2++) { - var name = gutters[i2], - style = null; - if (typeof name != "string") { - style = name.style; - name = name.className; - } - if (name == "CodeMirror-linenumbers") { - if (!lineNumbers) { - continue; - } else { - sawLineNumbers = true; - } - } - result.push({ - className: name, - style - }); - } - if (lineNumbers && !sawLineNumbers) { - result.push({ - className: "CodeMirror-linenumbers", - style: null - }); - } - return result; - } - function renderGutters(display) { - var gutters = display.gutters, - specs = display.gutterSpecs; - removeChildren(gutters); - display.lineGutter = null; - for (var i2 = 0; i2 < specs.length; ++i2) { - var ref = specs[i2]; - var className = ref.className; - var style = ref.style; - var gElt = gutters.appendChild(elt("div", null, "CodeMirror-gutter " + className)); - if (style) { - gElt.style.cssText = style; - } - if (className == "CodeMirror-linenumbers") { - display.lineGutter = gElt; - gElt.style.width = (display.lineNumWidth || 1) + "px"; - } - } - gutters.style.display = specs.length ? "" : "none"; - updateGutterSpace(display); - } - function updateGutters(cm) { - renderGutters(cm.display); - regChange(cm); - alignHorizontally(cm); - } - function Display(place, doc, input, options) { - var d = this; - this.input = input; - d.scrollbarFiller = elt("div", null, "CodeMirror-scrollbar-filler"); - d.scrollbarFiller.setAttribute("cm-not-content", "true"); - d.gutterFiller = elt("div", null, "CodeMirror-gutter-filler"); - d.gutterFiller.setAttribute("cm-not-content", "true"); - d.lineDiv = eltP("div", null, "CodeMirror-code"); - d.selectionDiv = elt("div", null, null, "position: relative; z-index: 1"); - d.cursorDiv = elt("div", null, "CodeMirror-cursors"); - d.measure = elt("div", null, "CodeMirror-measure"); - d.lineMeasure = elt("div", null, "CodeMirror-measure"); - d.lineSpace = eltP("div", [d.measure, d.lineMeasure, d.selectionDiv, d.cursorDiv, d.lineDiv], null, "position: relative; outline: none"); - var lines = eltP("div", [d.lineSpace], "CodeMirror-lines"); - d.mover = elt("div", [lines], null, "position: relative"); - d.sizer = elt("div", [d.mover], "CodeMirror-sizer"); - d.sizerWidth = null; - d.heightForcer = elt("div", null, null, "position: absolute; height: " + scrollerGap + "px; width: 1px;"); - d.gutters = elt("div", null, "CodeMirror-gutters"); - d.lineGutter = null; - d.scroller = elt("div", [d.sizer, d.heightForcer, d.gutters], "CodeMirror-scroll"); - d.scroller.setAttribute("tabIndex", "-1"); - d.wrapper = elt("div", [d.scrollbarFiller, d.gutterFiller, d.scroller], "CodeMirror"); - d.wrapper.setAttribute("translate", "no"); - if (ie && ie_version < 8) { - d.gutters.style.zIndex = -1; - d.scroller.style.paddingRight = 0; - } - if (!webkit && !(gecko && mobile)) { - d.scroller.draggable = true; - } - if (place) { - if (place.appendChild) { - place.appendChild(d.wrapper); - } else { - place(d.wrapper); - } - } - d.viewFrom = d.viewTo = doc.first; - d.reportedViewFrom = d.reportedViewTo = doc.first; - d.view = []; - d.renderedView = null; - d.externalMeasured = null; - d.viewOffset = 0; - d.lastWrapHeight = d.lastWrapWidth = 0; - d.updateLineNumbers = null; - d.nativeBarWidth = d.barHeight = d.barWidth = 0; - d.scrollbarsClipped = false; - d.lineNumWidth = d.lineNumInnerWidth = d.lineNumChars = null; - d.alignWidgets = false; - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - d.maxLine = null; - d.maxLineLength = 0; - d.maxLineChanged = false; - d.wheelDX = d.wheelDY = d.wheelStartX = d.wheelStartY = null; - d.shift = false; - d.selForContextMenu = null; - d.activeTouch = null; - d.gutterSpecs = getGutters(options.gutters, options.lineNumbers); - renderGutters(d); - input.init(d); - } - var wheelSamples = 0, - wheelPixelsPerUnit = null; - if (ie) { - wheelPixelsPerUnit = -0.53; - } else if (gecko) { - wheelPixelsPerUnit = 15; - } else if (chrome) { - wheelPixelsPerUnit = -0.7; - } else if (safari) { - wheelPixelsPerUnit = -1 / 3; - } - function wheelEventDelta(e) { - var dx = e.wheelDeltaX, - dy = e.wheelDeltaY; - if (dx == null && e.detail && e.axis == e.HORIZONTAL_AXIS) { - dx = e.detail; - } - if (dy == null && e.detail && e.axis == e.VERTICAL_AXIS) { - dy = e.detail; - } else if (dy == null) { - dy = e.wheelDelta; - } - return { - x: dx, - y: dy - }; - } - function wheelEventPixels(e) { - var delta = wheelEventDelta(e); - delta.x *= wheelPixelsPerUnit; - delta.y *= wheelPixelsPerUnit; - return delta; - } - function onScrollWheel(cm, e) { - var delta = wheelEventDelta(e), - dx = delta.x, - dy = delta.y; - var pixelsPerUnit = wheelPixelsPerUnit; - if (e.deltaMode === 0) { - dx = e.deltaX; - dy = e.deltaY; - pixelsPerUnit = 1; - } - var display = cm.display, - scroll = display.scroller; - var canScrollX = scroll.scrollWidth > scroll.clientWidth; - var canScrollY = scroll.scrollHeight > scroll.clientHeight; - if (!(dx && canScrollX || dy && canScrollY)) { - return; - } - if (dy && mac && webkit) { - outer: for (var cur = e.target, view = display.view; cur != scroll; cur = cur.parentNode) { - for (var i2 = 0; i2 < view.length; i2++) { - if (view[i2].node == cur) { - cm.display.currentWheelTarget = cur; - break outer; - } - } - } - } - if (dx && !gecko && !presto && pixelsPerUnit != null) { - if (dy && canScrollY) { - updateScrollTop(cm, Math.max(0, scroll.scrollTop + dy * pixelsPerUnit)); - } - setScrollLeft(cm, Math.max(0, scroll.scrollLeft + dx * pixelsPerUnit)); - if (!dy || dy && canScrollY) { - e_preventDefault(e); - } - display.wheelStartX = null; - return; - } - if (dy && pixelsPerUnit != null) { - var pixels = dy * pixelsPerUnit; - var top = cm.doc.scrollTop, - bot = top + display.wrapper.clientHeight; - if (pixels < 0) { - top = Math.max(0, top + pixels - 50); - } else { - bot = Math.min(cm.doc.height, bot + pixels + 50); - } - updateDisplaySimple(cm, { - top, - bottom: bot - }); - } - if (wheelSamples < 20 && e.deltaMode !== 0) { - if (display.wheelStartX == null) { - display.wheelStartX = scroll.scrollLeft; - display.wheelStartY = scroll.scrollTop; - display.wheelDX = dx; - display.wheelDY = dy; - setTimeout(function () { - if (display.wheelStartX == null) { - return; - } - var movedX = scroll.scrollLeft - display.wheelStartX; - var movedY = scroll.scrollTop - display.wheelStartY; - var sample = movedY && display.wheelDY && movedY / display.wheelDY || movedX && display.wheelDX && movedX / display.wheelDX; - display.wheelStartX = display.wheelStartY = null; - if (!sample) { - return; - } - wheelPixelsPerUnit = (wheelPixelsPerUnit * wheelSamples + sample) / (wheelSamples + 1); - ++wheelSamples; - }, 200); - } else { - display.wheelDX += dx; - display.wheelDY += dy; - } - } - } - var Selection = function (ranges, primIndex) { - this.ranges = ranges; - this.primIndex = primIndex; - }; - Selection.prototype.primary = function () { - return this.ranges[this.primIndex]; - }; - Selection.prototype.equals = function (other) { - if (other == this) { - return true; - } - if (other.primIndex != this.primIndex || other.ranges.length != this.ranges.length) { - return false; - } - for (var i2 = 0; i2 < this.ranges.length; i2++) { - var here = this.ranges[i2], - there = other.ranges[i2]; - if (!equalCursorPos(here.anchor, there.anchor) || !equalCursorPos(here.head, there.head)) { - return false; - } - } - return true; - }; - Selection.prototype.deepCopy = function () { - var out = []; - for (var i2 = 0; i2 < this.ranges.length; i2++) { - out[i2] = new Range(copyPos(this.ranges[i2].anchor), copyPos(this.ranges[i2].head)); - } - return new Selection(out, this.primIndex); - }; - Selection.prototype.somethingSelected = function () { - for (var i2 = 0; i2 < this.ranges.length; i2++) { - if (!this.ranges[i2].empty()) { - return true; - } - } - return false; - }; - Selection.prototype.contains = function (pos, end) { - if (!end) { - end = pos; - } - for (var i2 = 0; i2 < this.ranges.length; i2++) { - var range2 = this.ranges[i2]; - if (cmp(end, range2.from()) >= 0 && cmp(pos, range2.to()) <= 0) { - return i2; - } - } - return -1; - }; - var Range = function (anchor, head) { - this.anchor = anchor; - this.head = head; - }; - Range.prototype.from = function () { - return minPos(this.anchor, this.head); - }; - Range.prototype.to = function () { - return maxPos(this.anchor, this.head); - }; - Range.prototype.empty = function () { - return this.head.line == this.anchor.line && this.head.ch == this.anchor.ch; - }; - function normalizeSelection(cm, ranges, primIndex) { - var mayTouch = cm && cm.options.selectionsMayTouch; - var prim = ranges[primIndex]; - ranges.sort(function (a, b) { - return cmp(a.from(), b.from()); - }); - primIndex = indexOf(ranges, prim); - for (var i2 = 1; i2 < ranges.length; i2++) { - var cur = ranges[i2], - prev = ranges[i2 - 1]; - var diff = cmp(prev.to(), cur.from()); - if (mayTouch && !cur.empty() ? diff > 0 : diff >= 0) { - var from = minPos(prev.from(), cur.from()), - to = maxPos(prev.to(), cur.to()); - var inv = prev.empty() ? cur.from() == cur.head : prev.from() == prev.head; - if (i2 <= primIndex) { - --primIndex; - } - ranges.splice(--i2, 2, new Range(inv ? to : from, inv ? from : to)); - } - } - return new Selection(ranges, primIndex); - } - function simpleSelection(anchor, head) { - return new Selection([new Range(anchor, head || anchor)], 0); - } - function changeEnd(change) { - if (!change.text) { - return change.to; - } - return Pos(change.from.line + change.text.length - 1, lst(change.text).length + (change.text.length == 1 ? change.from.ch : 0)); - } - function adjustForChange(pos, change) { - if (cmp(pos, change.from) < 0) { - return pos; - } - if (cmp(pos, change.to) <= 0) { - return changeEnd(change); - } - var line = pos.line + change.text.length - (change.to.line - change.from.line) - 1, - ch = pos.ch; - if (pos.line == change.to.line) { - ch += changeEnd(change).ch - change.to.ch; - } - return Pos(line, ch); - } - function computeSelAfterChange(doc, change) { - var out = []; - for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { - var range2 = doc.sel.ranges[i2]; - out.push(new Range(adjustForChange(range2.anchor, change), adjustForChange(range2.head, change))); - } - return normalizeSelection(doc.cm, out, doc.sel.primIndex); - } - function offsetPos(pos, old, nw) { - if (pos.line == old.line) { - return Pos(nw.line, pos.ch - old.ch + nw.ch); - } else { - return Pos(nw.line + (pos.line - old.line), pos.ch); - } - } - function computeReplacedSel(doc, changes, hint) { - var out = []; - var oldPrev = Pos(doc.first, 0), - newPrev = oldPrev; - for (var i2 = 0; i2 < changes.length; i2++) { - var change = changes[i2]; - var from = offsetPos(change.from, oldPrev, newPrev); - var to = offsetPos(changeEnd(change), oldPrev, newPrev); - oldPrev = change.to; - newPrev = to; - if (hint == "around") { - var range2 = doc.sel.ranges[i2], - inv = cmp(range2.head, range2.anchor) < 0; - out[i2] = new Range(inv ? to : from, inv ? from : to); - } else { - out[i2] = new Range(from, from); - } - } - return new Selection(out, doc.sel.primIndex); - } - function loadMode(cm) { - cm.doc.mode = getMode(cm.options, cm.doc.modeOption); - resetModeState(cm); - } - function resetModeState(cm) { - cm.doc.iter(function (line) { - if (line.stateAfter) { - line.stateAfter = null; - } - if (line.styles) { - line.styles = null; - } - }); - cm.doc.modeFrontier = cm.doc.highlightFrontier = cm.doc.first; - startWorker(cm, 100); - cm.state.modeGen++; - if (cm.curOp) { - regChange(cm); - } - } - function isWholeLineUpdate(doc, change) { - return change.from.ch == 0 && change.to.ch == 0 && lst(change.text) == "" && (!doc.cm || doc.cm.options.wholeLineUpdateBefore); - } - function updateDoc(doc, change, markedSpans, estimateHeight2) { - function spansFor(n) { - return markedSpans ? markedSpans[n] : null; - } - function update(line, text2, spans) { - updateLine(line, text2, spans, estimateHeight2); - signalLater(line, "change", line, change); - } - function linesFor(start, end) { - var result = []; - for (var i2 = start; i2 < end; ++i2) { - result.push(new Line(text[i2], spansFor(i2), estimateHeight2)); - } - return result; - } - var from = change.from, - to = change.to, - text = change.text; - var firstLine = getLine(doc, from.line), - lastLine = getLine(doc, to.line); - var lastText = lst(text), - lastSpans = spansFor(text.length - 1), - nlines = to.line - from.line; - if (change.full) { - doc.insert(0, linesFor(0, text.length)); - doc.remove(text.length, doc.size - text.length); - } else if (isWholeLineUpdate(doc, change)) { - var added = linesFor(0, text.length - 1); - update(lastLine, lastLine.text, lastSpans); - if (nlines) { - doc.remove(from.line, nlines); - } - if (added.length) { - doc.insert(from.line, added); - } - } else if (firstLine == lastLine) { - if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + lastText + firstLine.text.slice(to.ch), lastSpans); - } else { - var added$1 = linesFor(1, text.length - 1); - added$1.push(new Line(lastText + firstLine.text.slice(to.ch), lastSpans, estimateHeight2)); - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - doc.insert(from.line + 1, added$1); - } - } else if (text.length == 1) { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0] + lastLine.text.slice(to.ch), spansFor(0)); - doc.remove(from.line + 1, nlines); - } else { - update(firstLine, firstLine.text.slice(0, from.ch) + text[0], spansFor(0)); - update(lastLine, lastText + lastLine.text.slice(to.ch), lastSpans); - var added$2 = linesFor(1, text.length - 1); - if (nlines > 1) { - doc.remove(from.line + 1, nlines - 1); - } - doc.insert(from.line + 1, added$2); - } - signalLater(doc, "change", doc, change); - } - function linkedDocs(doc, f, sharedHistOnly) { - function propagate(doc2, skip, sharedHist) { - if (doc2.linked) { - for (var i2 = 0; i2 < doc2.linked.length; ++i2) { - var rel = doc2.linked[i2]; - if (rel.doc == skip) { - continue; - } - var shared = sharedHist && rel.sharedHist; - if (sharedHistOnly && !shared) { - continue; - } - f(rel.doc, shared); - propagate(rel.doc, doc2, shared); - } - } - } - propagate(doc, null, true); - } - function attachDoc(cm, doc) { - if (doc.cm) { - throw new Error("This document is already in use."); - } - cm.doc = doc; - doc.cm = cm; - estimateLineHeights(cm); - loadMode(cm); - setDirectionClass(cm); - cm.options.direction = doc.direction; - if (!cm.options.lineWrapping) { - findMaxLine(cm); - } - cm.options.mode = doc.modeOption; - regChange(cm); - } - function setDirectionClass(cm) { - (cm.doc.direction == "rtl" ? addClass : rmClass)(cm.display.lineDiv, "CodeMirror-rtl"); - } - function directionChanged(cm) { - runInOp(cm, function () { - setDirectionClass(cm); - regChange(cm); - }); - } - function History(prev) { - this.done = []; - this.undone = []; - this.undoDepth = prev ? prev.undoDepth : Infinity; - this.lastModTime = this.lastSelTime = 0; - this.lastOp = this.lastSelOp = null; - this.lastOrigin = this.lastSelOrigin = null; - this.generation = this.maxGeneration = prev ? prev.maxGeneration : 1; - } - function historyChangeFromChange(doc, change) { - var histChange = { - from: copyPos(change.from), - to: changeEnd(change), - text: getBetween(doc, change.from, change.to) - }; - attachLocalSpans(doc, histChange, change.from.line, change.to.line + 1); - linkedDocs(doc, function (doc2) { - return attachLocalSpans(doc2, histChange, change.from.line, change.to.line + 1); - }, true); - return histChange; - } - function clearSelectionEvents(array) { - while (array.length) { - var last = lst(array); - if (last.ranges) { - array.pop(); - } else { - break; - } - } - } - function lastChangeEvent(hist, force) { - if (force) { - clearSelectionEvents(hist.done); - return lst(hist.done); - } else if (hist.done.length && !lst(hist.done).ranges) { - return lst(hist.done); - } else if (hist.done.length > 1 && !hist.done[hist.done.length - 2].ranges) { - hist.done.pop(); - return lst(hist.done); - } - } - function addChangeToHistory(doc, change, selAfter, opId) { - var hist = doc.history; - hist.undone.length = 0; - var time = + /* @__PURE__ */new Date(), - cur; - var last; - if ((hist.lastOp == opId || hist.lastOrigin == change.origin && change.origin && (change.origin.charAt(0) == "+" && hist.lastModTime > time - (doc.cm ? doc.cm.options.historyEventDelay : 500) || change.origin.charAt(0) == "*")) && (cur = lastChangeEvent(hist, hist.lastOp == opId))) { - last = lst(cur.changes); - if (cmp(change.from, change.to) == 0 && cmp(change.from, last.to) == 0) { - last.to = changeEnd(change); - } else { - cur.changes.push(historyChangeFromChange(doc, change)); - } - } else { - var before = lst(hist.done); - if (!before || !before.ranges) { - pushSelectionToHistory(doc.sel, hist.done); - } - cur = { - changes: [historyChangeFromChange(doc, change)], - generation: hist.generation - }; - hist.done.push(cur); - while (hist.done.length > hist.undoDepth) { - hist.done.shift(); - if (!hist.done[0].ranges) { - hist.done.shift(); - } - } - } - hist.done.push(selAfter); - hist.generation = ++hist.maxGeneration; - hist.lastModTime = hist.lastSelTime = time; - hist.lastOp = hist.lastSelOp = opId; - hist.lastOrigin = hist.lastSelOrigin = change.origin; - if (!last) { - signal(doc, "historyAdded"); - } - } - function selectionEventCanBeMerged(doc, origin, prev, sel) { - var ch = origin.charAt(0); - return ch == "*" || ch == "+" && prev.ranges.length == sel.ranges.length && prev.somethingSelected() == sel.somethingSelected() && /* @__PURE__ */new Date() - doc.history.lastSelTime <= (doc.cm ? doc.cm.options.historyEventDelay : 500); - } - function addSelectionToHistory(doc, sel, opId, options) { - var hist = doc.history, - origin = options && options.origin; - if (opId == hist.lastSelOp || origin && hist.lastSelOrigin == origin && (hist.lastModTime == hist.lastSelTime && hist.lastOrigin == origin || selectionEventCanBeMerged(doc, origin, lst(hist.done), sel))) { - hist.done[hist.done.length - 1] = sel; - } else { - pushSelectionToHistory(sel, hist.done); - } - hist.lastSelTime = + /* @__PURE__ */new Date(); - hist.lastSelOrigin = origin; - hist.lastSelOp = opId; - if (options && options.clearRedo !== false) { - clearSelectionEvents(hist.undone); - } - } - function pushSelectionToHistory(sel, dest) { - var top = lst(dest); - if (!(top && top.ranges && top.equals(sel))) { - dest.push(sel); - } - } - function attachLocalSpans(doc, change, from, to) { - var existing = change["spans_" + doc.id], - n = 0; - doc.iter(Math.max(doc.first, from), Math.min(doc.first + doc.size, to), function (line) { - if (line.markedSpans) { - (existing || (existing = change["spans_" + doc.id] = {}))[n] = line.markedSpans; - } - ++n; - }); - } - function removeClearedSpans(spans) { - if (!spans) { - return null; - } - var out; - for (var i2 = 0; i2 < spans.length; ++i2) { - if (spans[i2].marker.explicitlyCleared) { - if (!out) { - out = spans.slice(0, i2); - } - } else if (out) { - out.push(spans[i2]); - } - } - return !out ? spans : out.length ? out : null; - } - function getOldSpans(doc, change) { - var found = change["spans_" + doc.id]; - if (!found) { - return null; - } - var nw = []; - for (var i2 = 0; i2 < change.text.length; ++i2) { - nw.push(removeClearedSpans(found[i2])); - } - return nw; - } - function mergeOldSpans(doc, change) { - var old = getOldSpans(doc, change); - var stretched = stretchSpansOverChange(doc, change); - if (!old) { - return stretched; - } - if (!stretched) { - return old; - } - for (var i2 = 0; i2 < old.length; ++i2) { - var oldCur = old[i2], - stretchCur = stretched[i2]; - if (oldCur && stretchCur) { - spans: for (var j = 0; j < stretchCur.length; ++j) { - var span = stretchCur[j]; - for (var k = 0; k < oldCur.length; ++k) { - if (oldCur[k].marker == span.marker) { - continue spans; - } - } - oldCur.push(span); - } - } else if (stretchCur) { - old[i2] = stretchCur; - } - } - return old; - } - function copyHistoryArray(events, newGroup, instantiateSel) { - var copy = []; - for (var i2 = 0; i2 < events.length; ++i2) { - var event = events[i2]; - if (event.ranges) { - copy.push(instantiateSel ? Selection.prototype.deepCopy.call(event) : event); - continue; - } - var changes = event.changes, - newChanges = []; - copy.push({ - changes: newChanges - }); - for (var j = 0; j < changes.length; ++j) { - var change = changes[j], - m = void 0; - newChanges.push({ - from: change.from, - to: change.to, - text: change.text - }); - if (newGroup) { - for (var prop2 in change) { - if (m = prop2.match(/^spans_(\d+)$/)) { - if (indexOf(newGroup, Number(m[1])) > -1) { - lst(newChanges)[prop2] = change[prop2]; - delete change[prop2]; - } - } - } - } - } - } - return copy; - } - function extendRange(range2, head, other, extend) { - if (extend) { - var anchor = range2.anchor; - if (other) { - var posBefore = cmp(head, anchor) < 0; - if (posBefore != cmp(other, anchor) < 0) { - anchor = head; - head = other; - } else if (posBefore != cmp(head, other) < 0) { - head = other; - } - } - return new Range(anchor, head); - } else { - return new Range(other || head, head); - } - } - function extendSelection(doc, head, other, options, extend) { - if (extend == null) { - extend = doc.cm && (doc.cm.display.shift || doc.extend); - } - setSelection(doc, new Selection([extendRange(doc.sel.primary(), head, other, extend)], 0), options); - } - function extendSelections(doc, heads, options) { - var out = []; - var extend = doc.cm && (doc.cm.display.shift || doc.extend); - for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { - out[i2] = extendRange(doc.sel.ranges[i2], heads[i2], null, extend); - } - var newSel = normalizeSelection(doc.cm, out, doc.sel.primIndex); - setSelection(doc, newSel, options); - } - function replaceOneSelection(doc, i2, range2, options) { - var ranges = doc.sel.ranges.slice(0); - ranges[i2] = range2; - setSelection(doc, normalizeSelection(doc.cm, ranges, doc.sel.primIndex), options); - } - function setSimpleSelection(doc, anchor, head, options) { - setSelection(doc, simpleSelection(anchor, head), options); - } - function filterSelectionChange(doc, sel, options) { - var obj = { - ranges: sel.ranges, - update: function (ranges) { - this.ranges = []; - for (var i2 = 0; i2 < ranges.length; i2++) { - this.ranges[i2] = new Range(clipPos(doc, ranges[i2].anchor), clipPos(doc, ranges[i2].head)); - } - }, - origin: options && options.origin - }; - signal(doc, "beforeSelectionChange", doc, obj); - if (doc.cm) { - signal(doc.cm, "beforeSelectionChange", doc.cm, obj); - } - if (obj.ranges != sel.ranges) { - return normalizeSelection(doc.cm, obj.ranges, obj.ranges.length - 1); - } else { - return sel; - } - } - function setSelectionReplaceHistory(doc, sel, options) { - var done = doc.history.done, - last = lst(done); - if (last && last.ranges) { - done[done.length - 1] = sel; - setSelectionNoUndo(doc, sel, options); - } else { - setSelection(doc, sel, options); - } - } - function setSelection(doc, sel, options) { - setSelectionNoUndo(doc, sel, options); - addSelectionToHistory(doc, doc.sel, doc.cm ? doc.cm.curOp.id : NaN, options); - } - function setSelectionNoUndo(doc, sel, options) { - if (hasHandler(doc, "beforeSelectionChange") || doc.cm && hasHandler(doc.cm, "beforeSelectionChange")) { - sel = filterSelectionChange(doc, sel, options); - } - var bias = options && options.bias || (cmp(sel.primary().head, doc.sel.primary().head) < 0 ? -1 : 1); - setSelectionInner(doc, skipAtomicInSelection(doc, sel, bias, true)); - if (!(options && options.scroll === false) && doc.cm && doc.cm.getOption("readOnly") != "nocursor") { - ensureCursorVisible(doc.cm); - } - } - function setSelectionInner(doc, sel) { - if (sel.equals(doc.sel)) { - return; - } - doc.sel = sel; - if (doc.cm) { - doc.cm.curOp.updateInput = 1; - doc.cm.curOp.selectionChanged = true; - signalCursorActivity(doc.cm); - } - signalLater(doc, "cursorActivity", doc); - } - function reCheckSelection(doc) { - setSelectionInner(doc, skipAtomicInSelection(doc, doc.sel, null, false)); - } - function skipAtomicInSelection(doc, sel, bias, mayClear) { - var out; - for (var i2 = 0; i2 < sel.ranges.length; i2++) { - var range2 = sel.ranges[i2]; - var old = sel.ranges.length == doc.sel.ranges.length && doc.sel.ranges[i2]; - var newAnchor = skipAtomic(doc, range2.anchor, old && old.anchor, bias, mayClear); - var newHead = skipAtomic(doc, range2.head, old && old.head, bias, mayClear); - if (out || newAnchor != range2.anchor || newHead != range2.head) { - if (!out) { - out = sel.ranges.slice(0, i2); - } - out[i2] = new Range(newAnchor, newHead); - } - } - return out ? normalizeSelection(doc.cm, out, sel.primIndex) : sel; - } - function skipAtomicInner(doc, pos, oldPos, dir, mayClear) { - var line = getLine(doc, pos.line); - if (line.markedSpans) { - for (var i2 = 0; i2 < line.markedSpans.length; ++i2) { - var sp = line.markedSpans[i2], - m = sp.marker; - var preventCursorLeft = "selectLeft" in m ? !m.selectLeft : m.inclusiveLeft; - var preventCursorRight = "selectRight" in m ? !m.selectRight : m.inclusiveRight; - if ((sp.from == null || (preventCursorLeft ? sp.from <= pos.ch : sp.from < pos.ch)) && (sp.to == null || (preventCursorRight ? sp.to >= pos.ch : sp.to > pos.ch))) { - if (mayClear) { - signal(m, "beforeCursorEnter"); - if (m.explicitlyCleared) { - if (!line.markedSpans) { - break; - } else { - --i2; - continue; - } - } - } - if (!m.atomic) { - continue; - } - if (oldPos) { - var near = m.find(dir < 0 ? 1 : -1), - diff = void 0; - if (dir < 0 ? preventCursorRight : preventCursorLeft) { - near = movePos(doc, near, -dir, near && near.line == pos.line ? line : null); - } - if (near && near.line == pos.line && (diff = cmp(near, oldPos)) && (dir < 0 ? diff < 0 : diff > 0)) { - return skipAtomicInner(doc, near, pos, dir, mayClear); - } - } - var far = m.find(dir < 0 ? -1 : 1); - if (dir < 0 ? preventCursorLeft : preventCursorRight) { - far = movePos(doc, far, dir, far.line == pos.line ? line : null); - } - return far ? skipAtomicInner(doc, far, pos, dir, mayClear) : null; - } - } - } - return pos; - } - function skipAtomic(doc, pos, oldPos, bias, mayClear) { - var dir = bias || 1; - var found = skipAtomicInner(doc, pos, oldPos, dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, dir, true) || skipAtomicInner(doc, pos, oldPos, -dir, mayClear) || !mayClear && skipAtomicInner(doc, pos, oldPos, -dir, true); - if (!found) { - doc.cantEdit = true; - return Pos(doc.first, 0); - } - return found; - } - function movePos(doc, pos, dir, line) { - if (dir < 0 && pos.ch == 0) { - if (pos.line > doc.first) { - return clipPos(doc, Pos(pos.line - 1)); - } else { - return null; - } - } else if (dir > 0 && pos.ch == (line || getLine(doc, pos.line)).text.length) { - if (pos.line < doc.first + doc.size - 1) { - return Pos(pos.line + 1, 0); - } else { - return null; - } - } else { - return new Pos(pos.line, pos.ch + dir); - } - } - function selectAll(cm) { - cm.setSelection(Pos(cm.firstLine(), 0), Pos(cm.lastLine()), sel_dontScroll); - } - function filterChange(doc, change, update) { - var obj = { - canceled: false, - from: change.from, - to: change.to, - text: change.text, - origin: change.origin, - cancel: function () { - return obj.canceled = true; - } - }; - if (update) { - obj.update = function (from, to, text, origin) { - if (from) { - obj.from = clipPos(doc, from); - } - if (to) { - obj.to = clipPos(doc, to); - } - if (text) { - obj.text = text; - } - if (origin !== void 0) { - obj.origin = origin; - } - }; - } - signal(doc, "beforeChange", doc, obj); - if (doc.cm) { - signal(doc.cm, "beforeChange", doc.cm, obj); - } - if (obj.canceled) { - if (doc.cm) { - doc.cm.curOp.updateInput = 2; - } - return null; - } - return { - from: obj.from, - to: obj.to, - text: obj.text, - origin: obj.origin - }; - } - function makeChange(doc, change, ignoreReadOnly) { - if (doc.cm) { - if (!doc.cm.curOp) { - return operation(doc.cm, makeChange)(doc, change, ignoreReadOnly); - } - if (doc.cm.state.suppressEdits) { - return; - } - } - if (hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange")) { - change = filterChange(doc, change, true); - if (!change) { - return; - } - } - var split = sawReadOnlySpans && !ignoreReadOnly && removeReadOnlyRanges(doc, change.from, change.to); - if (split) { - for (var i2 = split.length - 1; i2 >= 0; --i2) { - makeChangeInner(doc, { - from: split[i2].from, - to: split[i2].to, - text: i2 ? [""] : change.text, - origin: change.origin - }); - } - } else { - makeChangeInner(doc, change); - } - } - function makeChangeInner(doc, change) { - if (change.text.length == 1 && change.text[0] == "" && cmp(change.from, change.to) == 0) { - return; - } - var selAfter = computeSelAfterChange(doc, change); - addChangeToHistory(doc, change, selAfter, doc.cm ? doc.cm.curOp.id : NaN); - makeChangeSingleDoc(doc, change, selAfter, stretchSpansOverChange(doc, change)); - var rebased = []; - linkedDocs(doc, function (doc2, sharedHist) { - if (!sharedHist && indexOf(rebased, doc2.history) == -1) { - rebaseHist(doc2.history, change); - rebased.push(doc2.history); - } - makeChangeSingleDoc(doc2, change, null, stretchSpansOverChange(doc2, change)); - }); - } - function makeChangeFromHistory(doc, type, allowSelectionOnly) { - var suppress = doc.cm && doc.cm.state.suppressEdits; - if (suppress && !allowSelectionOnly) { - return; - } - var hist = doc.history, - event, - selAfter = doc.sel; - var source = type == "undo" ? hist.done : hist.undone, - dest = type == "undo" ? hist.undone : hist.done; - var i2 = 0; - for (; i2 < source.length; i2++) { - event = source[i2]; - if (allowSelectionOnly ? event.ranges && !event.equals(doc.sel) : !event.ranges) { - break; - } - } - if (i2 == source.length) { - return; - } - hist.lastOrigin = hist.lastSelOrigin = null; - for (;;) { - event = source.pop(); - if (event.ranges) { - pushSelectionToHistory(event, dest); - if (allowSelectionOnly && !event.equals(doc.sel)) { - setSelection(doc, event, { - clearRedo: false - }); - return; - } - selAfter = event; - } else if (suppress) { - source.push(event); - return; - } else { - break; - } - } - var antiChanges = []; - pushSelectionToHistory(selAfter, dest); - dest.push({ - changes: antiChanges, - generation: hist.generation - }); - hist.generation = event.generation || ++hist.maxGeneration; - var filter = hasHandler(doc, "beforeChange") || doc.cm && hasHandler(doc.cm, "beforeChange"); - var loop = function (i3) { - var change = event.changes[i3]; - change.origin = type; - if (filter && !filterChange(doc, change, false)) { - source.length = 0; - return {}; - } - antiChanges.push(historyChangeFromChange(doc, change)); - var after = i3 ? computeSelAfterChange(doc, change) : lst(source); - makeChangeSingleDoc(doc, change, after, mergeOldSpans(doc, change)); - if (!i3 && doc.cm) { - doc.cm.scrollIntoView({ - from: change.from, - to: changeEnd(change) - }); - } - var rebased = []; - linkedDocs(doc, function (doc2, sharedHist) { - if (!sharedHist && indexOf(rebased, doc2.history) == -1) { - rebaseHist(doc2.history, change); - rebased.push(doc2.history); - } - makeChangeSingleDoc(doc2, change, null, mergeOldSpans(doc2, change)); - }); - }; - for (var i$12 = event.changes.length - 1; i$12 >= 0; --i$12) { - var returned = loop(i$12); - if (returned) return returned.v; - } - } - function shiftDoc(doc, distance) { - if (distance == 0) { - return; - } - doc.first += distance; - doc.sel = new Selection(map(doc.sel.ranges, function (range2) { - return new Range(Pos(range2.anchor.line + distance, range2.anchor.ch), Pos(range2.head.line + distance, range2.head.ch)); - }), doc.sel.primIndex); - if (doc.cm) { - regChange(doc.cm, doc.first, doc.first - distance, distance); - for (var d = doc.cm.display, l = d.viewFrom; l < d.viewTo; l++) { - regLineChange(doc.cm, l, "gutter"); - } - } - } - function makeChangeSingleDoc(doc, change, selAfter, spans) { - if (doc.cm && !doc.cm.curOp) { - return operation(doc.cm, makeChangeSingleDoc)(doc, change, selAfter, spans); - } - if (change.to.line < doc.first) { - shiftDoc(doc, change.text.length - 1 - (change.to.line - change.from.line)); - return; - } - if (change.from.line > doc.lastLine()) { - return; - } - if (change.from.line < doc.first) { - var shift = change.text.length - 1 - (doc.first - change.from.line); - shiftDoc(doc, shift); - change = { - from: Pos(doc.first, 0), - to: Pos(change.to.line + shift, change.to.ch), - text: [lst(change.text)], - origin: change.origin - }; - } - var last = doc.lastLine(); - if (change.to.line > last) { - change = { - from: change.from, - to: Pos(last, getLine(doc, last).text.length), - text: [change.text[0]], - origin: change.origin - }; - } - change.removed = getBetween(doc, change.from, change.to); - if (!selAfter) { - selAfter = computeSelAfterChange(doc, change); - } - if (doc.cm) { - makeChangeSingleDocInEditor(doc.cm, change, spans); - } else { - updateDoc(doc, change, spans); - } - setSelectionNoUndo(doc, selAfter, sel_dontScroll); - if (doc.cantEdit && skipAtomic(doc, Pos(doc.firstLine(), 0))) { - doc.cantEdit = false; - } - } - function makeChangeSingleDocInEditor(cm, change, spans) { - var doc = cm.doc, - display = cm.display, - from = change.from, - to = change.to; - var recomputeMaxLength = false, - checkWidthStart = from.line; - if (!cm.options.lineWrapping) { - checkWidthStart = lineNo(visualLine(getLine(doc, from.line))); - doc.iter(checkWidthStart, to.line + 1, function (line) { - if (line == display.maxLine) { - recomputeMaxLength = true; - return true; - } - }); - } - if (doc.sel.contains(change.from, change.to) > -1) { - signalCursorActivity(cm); - } - updateDoc(doc, change, spans, estimateHeight(cm)); - if (!cm.options.lineWrapping) { - doc.iter(checkWidthStart, from.line + change.text.length, function (line) { - var len = lineLength(line); - if (len > display.maxLineLength) { - display.maxLine = line; - display.maxLineLength = len; - display.maxLineChanged = true; - recomputeMaxLength = false; - } - }); - if (recomputeMaxLength) { - cm.curOp.updateMaxLine = true; - } - } - retreatFrontier(doc, from.line); - startWorker(cm, 400); - var lendiff = change.text.length - (to.line - from.line) - 1; - if (change.full) { - regChange(cm); - } else if (from.line == to.line && change.text.length == 1 && !isWholeLineUpdate(cm.doc, change)) { - regLineChange(cm, from.line, "text"); - } else { - regChange(cm, from.line, to.line + 1, lendiff); - } - var changesHandler = hasHandler(cm, "changes"), - changeHandler = hasHandler(cm, "change"); - if (changeHandler || changesHandler) { - var obj = { - from, - to, - text: change.text, - removed: change.removed, - origin: change.origin - }; - if (changeHandler) { - signalLater(cm, "change", cm, obj); - } - if (changesHandler) { - (cm.curOp.changeObjs || (cm.curOp.changeObjs = [])).push(obj); - } - } - cm.display.selForContextMenu = null; - } - function replaceRange(doc, code, from, to, origin) { - var assign; - if (!to) { - to = from; - } - if (cmp(to, from) < 0) { - assign = [to, from], from = assign[0], to = assign[1]; - } - if (typeof code == "string") { - code = doc.splitLines(code); - } - makeChange(doc, { - from, - to, - text: code, - origin - }); - } - function rebaseHistSelSingle(pos, from, to, diff) { - if (to < pos.line) { - pos.line += diff; - } else if (from < pos.line) { - pos.line = from; - pos.ch = 0; - } - } - function rebaseHistArray(array, from, to, diff) { - for (var i2 = 0; i2 < array.length; ++i2) { - var sub = array[i2], - ok = true; - if (sub.ranges) { - if (!sub.copied) { - sub = array[i2] = sub.deepCopy(); - sub.copied = true; - } - for (var j = 0; j < sub.ranges.length; j++) { - rebaseHistSelSingle(sub.ranges[j].anchor, from, to, diff); - rebaseHistSelSingle(sub.ranges[j].head, from, to, diff); - } - continue; - } - for (var j$1 = 0; j$1 < sub.changes.length; ++j$1) { - var cur = sub.changes[j$1]; - if (to < cur.from.line) { - cur.from = Pos(cur.from.line + diff, cur.from.ch); - cur.to = Pos(cur.to.line + diff, cur.to.ch); - } else if (from <= cur.to.line) { - ok = false; - break; - } - } - if (!ok) { - array.splice(0, i2 + 1); - i2 = 0; - } - } - } - function rebaseHist(hist, change) { - var from = change.from.line, - to = change.to.line, - diff = change.text.length - (to - from) - 1; - rebaseHistArray(hist.done, from, to, diff); - rebaseHistArray(hist.undone, from, to, diff); - } - function changeLine(doc, handle, changeType, op) { - var no = handle, - line = handle; - if (typeof handle == "number") { - line = getLine(doc, clipLine(doc, handle)); - } else { - no = lineNo(handle); - } - if (no == null) { - return null; - } - if (op(line, no) && doc.cm) { - regLineChange(doc.cm, no, changeType); - } - return line; - } - function LeafChunk(lines) { - this.lines = lines; - this.parent = null; - var height = 0; - for (var i2 = 0; i2 < lines.length; ++i2) { - lines[i2].parent = this; - height += lines[i2].height; - } - this.height = height; - } - LeafChunk.prototype = { - chunkSize: function () { - return this.lines.length; - }, - // Remove the n lines at offset 'at'. - removeInner: function (at, n) { - for (var i2 = at, e = at + n; i2 < e; ++i2) { - var line = this.lines[i2]; - this.height -= line.height; - cleanUpLine(line); - signalLater(line, "delete"); - } - this.lines.splice(at, n); - }, - // Helper used to collapse a small branch into a single leaf. - collapse: function (lines) { - lines.push.apply(lines, this.lines); - }, - // Insert the given array of lines at offset 'at', count them as - // having the given height. - insertInner: function (at, lines, height) { - this.height += height; - this.lines = this.lines.slice(0, at).concat(lines).concat(this.lines.slice(at)); - for (var i2 = 0; i2 < lines.length; ++i2) { - lines[i2].parent = this; - } - }, - // Used to iterate over a part of the tree. - iterN: function (at, n, op) { - for (var e = at + n; at < e; ++at) { - if (op(this.lines[at])) { - return true; - } - } - } - }; - function BranchChunk(children) { - this.children = children; - var size = 0, - height = 0; - for (var i2 = 0; i2 < children.length; ++i2) { - var ch = children[i2]; - size += ch.chunkSize(); - height += ch.height; - ch.parent = this; - } - this.size = size; - this.height = height; - this.parent = null; - } - BranchChunk.prototype = { - chunkSize: function () { - return this.size; - }, - removeInner: function (at, n) { - this.size -= n; - for (var i2 = 0; i2 < this.children.length; ++i2) { - var child = this.children[i2], - sz = child.chunkSize(); - if (at < sz) { - var rm = Math.min(n, sz - at), - oldHeight = child.height; - child.removeInner(at, rm); - this.height -= oldHeight - child.height; - if (sz == rm) { - this.children.splice(i2--, 1); - child.parent = null; - } - if ((n -= rm) == 0) { - break; - } - at = 0; - } else { - at -= sz; - } - } - if (this.size - n < 25 && (this.children.length > 1 || !(this.children[0] instanceof LeafChunk))) { - var lines = []; - this.collapse(lines); - this.children = [new LeafChunk(lines)]; - this.children[0].parent = this; - } - }, - collapse: function (lines) { - for (var i2 = 0; i2 < this.children.length; ++i2) { - this.children[i2].collapse(lines); - } - }, - insertInner: function (at, lines, height) { - this.size += lines.length; - this.height += height; - for (var i2 = 0; i2 < this.children.length; ++i2) { - var child = this.children[i2], - sz = child.chunkSize(); - if (at <= sz) { - child.insertInner(at, lines, height); - if (child.lines && child.lines.length > 50) { - var remaining = child.lines.length % 25 + 25; - for (var pos = remaining; pos < child.lines.length;) { - var leaf = new LeafChunk(child.lines.slice(pos, pos += 25)); - child.height -= leaf.height; - this.children.splice(++i2, 0, leaf); - leaf.parent = this; - } - child.lines = child.lines.slice(0, remaining); - this.maybeSpill(); - } - break; - } - at -= sz; - } - }, - // When a node has grown, check whether it should be split. - maybeSpill: function () { - if (this.children.length <= 10) { - return; - } - var me = this; - do { - var spilled = me.children.splice(me.children.length - 5, 5); - var sibling = new BranchChunk(spilled); - if (!me.parent) { - var copy = new BranchChunk(me.children); - copy.parent = me; - me.children = [copy, sibling]; - me = copy; - } else { - me.size -= sibling.size; - me.height -= sibling.height; - var myIndex = indexOf(me.parent.children, me); - me.parent.children.splice(myIndex + 1, 0, sibling); - } - sibling.parent = me.parent; - } while (me.children.length > 10); - me.parent.maybeSpill(); - }, - iterN: function (at, n, op) { - for (var i2 = 0; i2 < this.children.length; ++i2) { - var child = this.children[i2], - sz = child.chunkSize(); - if (at < sz) { - var used = Math.min(n, sz - at); - if (child.iterN(at, used, op)) { - return true; - } - if ((n -= used) == 0) { - break; - } - at = 0; - } else { - at -= sz; - } - } - } - }; - var LineWidget = function (doc, node, options) { - if (options) { - for (var opt in options) { - if (options.hasOwnProperty(opt)) { - this[opt] = options[opt]; - } - } - } - this.doc = doc; - this.node = node; - }; - LineWidget.prototype.clear = function () { - var cm = this.doc.cm, - ws = this.line.widgets, - line = this.line, - no = lineNo(line); - if (no == null || !ws) { - return; - } - for (var i2 = 0; i2 < ws.length; ++i2) { - if (ws[i2] == this) { - ws.splice(i2--, 1); - } - } - if (!ws.length) { - line.widgets = null; - } - var height = widgetHeight(this); - updateLineHeight(line, Math.max(0, line.height - height)); - if (cm) { - runInOp(cm, function () { - adjustScrollWhenAboveVisible(cm, line, -height); - regLineChange(cm, no, "widget"); - }); - signalLater(cm, "lineWidgetCleared", cm, this, no); - } - }; - LineWidget.prototype.changed = function () { - var this$1$1 = this; - var oldH = this.height, - cm = this.doc.cm, - line = this.line; - this.height = null; - var diff = widgetHeight(this) - oldH; - if (!diff) { - return; - } - if (!lineIsHidden(this.doc, line)) { - updateLineHeight(line, line.height + diff); - } - if (cm) { - runInOp(cm, function () { - cm.curOp.forceUpdate = true; - adjustScrollWhenAboveVisible(cm, line, diff); - signalLater(cm, "lineWidgetChanged", cm, this$1$1, lineNo(line)); - }); - } - }; - eventMixin(LineWidget); - function adjustScrollWhenAboveVisible(cm, line, diff) { - if (heightAtLine(line) < (cm.curOp && cm.curOp.scrollTop || cm.doc.scrollTop)) { - addToScrollTop(cm, diff); - } - } - function addLineWidget(doc, handle, node, options) { - var widget = new LineWidget(doc, node, options); - var cm = doc.cm; - if (cm && widget.noHScroll) { - cm.display.alignWidgets = true; - } - changeLine(doc, handle, "widget", function (line) { - var widgets = line.widgets || (line.widgets = []); - if (widget.insertAt == null) { - widgets.push(widget); - } else { - widgets.splice(Math.min(widgets.length, Math.max(0, widget.insertAt)), 0, widget); - } - widget.line = line; - if (cm && !lineIsHidden(doc, line)) { - var aboveVisible = heightAtLine(line) < doc.scrollTop; - updateLineHeight(line, line.height + widgetHeight(widget)); - if (aboveVisible) { - addToScrollTop(cm, widget.height); - } - cm.curOp.forceUpdate = true; - } - return true; - }); - if (cm) { - signalLater(cm, "lineWidgetAdded", cm, widget, typeof handle == "number" ? handle : lineNo(handle)); - } - return widget; - } - var nextMarkerId = 0; - var TextMarker = function (doc, type) { - this.lines = []; - this.type = type; - this.doc = doc; - this.id = ++nextMarkerId; - }; - TextMarker.prototype.clear = function () { - if (this.explicitlyCleared) { - return; - } - var cm = this.doc.cm, - withOp = cm && !cm.curOp; - if (withOp) { - startOperation(cm); - } - if (hasHandler(this, "clear")) { - var found = this.find(); - if (found) { - signalLater(this, "clear", found.from, found.to); - } - } - var min = null, - max = null; - for (var i2 = 0; i2 < this.lines.length; ++i2) { - var line = this.lines[i2]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (cm && !this.collapsed) { - regLineChange(cm, lineNo(line), "text"); - } else if (cm) { - if (span.to != null) { - max = lineNo(line); - } - if (span.from != null) { - min = lineNo(line); - } - } - line.markedSpans = removeMarkedSpan(line.markedSpans, span); - if (span.from == null && this.collapsed && !lineIsHidden(this.doc, line) && cm) { - updateLineHeight(line, textHeight(cm.display)); - } - } - if (cm && this.collapsed && !cm.options.lineWrapping) { - for (var i$12 = 0; i$12 < this.lines.length; ++i$12) { - var visual = visualLine(this.lines[i$12]), - len = lineLength(visual); - if (len > cm.display.maxLineLength) { - cm.display.maxLine = visual; - cm.display.maxLineLength = len; - cm.display.maxLineChanged = true; - } - } - } - if (min != null && cm && this.collapsed) { - regChange(cm, min, max + 1); - } - this.lines.length = 0; - this.explicitlyCleared = true; - if (this.atomic && this.doc.cantEdit) { - this.doc.cantEdit = false; - if (cm) { - reCheckSelection(cm.doc); - } - } - if (cm) { - signalLater(cm, "markerCleared", cm, this, min, max); - } - if (withOp) { - endOperation(cm); - } - if (this.parent) { - this.parent.clear(); - } - }; - TextMarker.prototype.find = function (side, lineObj) { - if (side == null && this.type == "bookmark") { - side = 1; - } - var from, to; - for (var i2 = 0; i2 < this.lines.length; ++i2) { - var line = this.lines[i2]; - var span = getMarkedSpanFor(line.markedSpans, this); - if (span.from != null) { - from = Pos(lineObj ? line : lineNo(line), span.from); - if (side == -1) { - return from; - } - } - if (span.to != null) { - to = Pos(lineObj ? line : lineNo(line), span.to); - if (side == 1) { - return to; - } - } - } - return from && { - from, - to - }; - }; - TextMarker.prototype.changed = function () { - var this$1$1 = this; - var pos = this.find(-1, true), - widget = this, - cm = this.doc.cm; - if (!pos || !cm) { - return; - } - runInOp(cm, function () { - var line = pos.line, - lineN = lineNo(pos.line); - var view = findViewForLine(cm, lineN); - if (view) { - clearLineMeasurementCacheFor(view); - cm.curOp.selectionChanged = cm.curOp.forceUpdate = true; - } - cm.curOp.updateMaxLine = true; - if (!lineIsHidden(widget.doc, line) && widget.height != null) { - var oldHeight = widget.height; - widget.height = null; - var dHeight = widgetHeight(widget) - oldHeight; - if (dHeight) { - updateLineHeight(line, line.height + dHeight); - } - } - signalLater(cm, "markerChanged", cm, this$1$1); - }); - }; - TextMarker.prototype.attachLine = function (line) { - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - if (!op.maybeHiddenMarkers || indexOf(op.maybeHiddenMarkers, this) == -1) { - (op.maybeUnhiddenMarkers || (op.maybeUnhiddenMarkers = [])).push(this); - } - } - this.lines.push(line); - }; - TextMarker.prototype.detachLine = function (line) { - this.lines.splice(indexOf(this.lines, line), 1); - if (!this.lines.length && this.doc.cm) { - var op = this.doc.cm.curOp; - (op.maybeHiddenMarkers || (op.maybeHiddenMarkers = [])).push(this); - } - }; - eventMixin(TextMarker); - function markText(doc, from, to, options, type) { - if (options && options.shared) { - return markTextShared(doc, from, to, options, type); - } - if (doc.cm && !doc.cm.curOp) { - return operation(doc.cm, markText)(doc, from, to, options, type); - } - var marker = new TextMarker(doc, type), - diff = cmp(from, to); - if (options) { - copyObj(options, marker, false); - } - if (diff > 0 || diff == 0 && marker.clearWhenEmpty !== false) { - return marker; - } - if (marker.replacedWith) { - marker.collapsed = true; - marker.widgetNode = eltP("span", [marker.replacedWith], "CodeMirror-widget"); - if (!options.handleMouseEvents) { - marker.widgetNode.setAttribute("cm-ignore-events", "true"); - } - if (options.insertLeft) { - marker.widgetNode.insertLeft = true; - } - } - if (marker.collapsed) { - if (conflictingCollapsedRange(doc, from.line, from, to, marker) || from.line != to.line && conflictingCollapsedRange(doc, to.line, from, to, marker)) { - throw new Error("Inserting collapsed marker partially overlapping an existing one"); - } - seeCollapsedSpans(); - } - if (marker.addToHistory) { - addChangeToHistory(doc, { - from, - to, - origin: "markText" - }, doc.sel, NaN); - } - var curLine = from.line, - cm = doc.cm, - updateMaxLine; - doc.iter(curLine, to.line + 1, function (line) { - if (cm && marker.collapsed && !cm.options.lineWrapping && visualLine(line) == cm.display.maxLine) { - updateMaxLine = true; - } - if (marker.collapsed && curLine != from.line) { - updateLineHeight(line, 0); - } - addMarkedSpan(line, new MarkedSpan(marker, curLine == from.line ? from.ch : null, curLine == to.line ? to.ch : null), doc.cm && doc.cm.curOp); - ++curLine; - }); - if (marker.collapsed) { - doc.iter(from.line, to.line + 1, function (line) { - if (lineIsHidden(doc, line)) { - updateLineHeight(line, 0); - } - }); - } - if (marker.clearOnEnter) { - on(marker, "beforeCursorEnter", function () { - return marker.clear(); - }); - } - if (marker.readOnly) { - seeReadOnlySpans(); - if (doc.history.done.length || doc.history.undone.length) { - doc.clearHistory(); - } - } - if (marker.collapsed) { - marker.id = ++nextMarkerId; - marker.atomic = true; - } - if (cm) { - if (updateMaxLine) { - cm.curOp.updateMaxLine = true; - } - if (marker.collapsed) { - regChange(cm, from.line, to.line + 1); - } else if (marker.className || marker.startStyle || marker.endStyle || marker.css || marker.attributes || marker.title) { - for (var i2 = from.line; i2 <= to.line; i2++) { - regLineChange(cm, i2, "text"); - } - } - if (marker.atomic) { - reCheckSelection(cm.doc); - } - signalLater(cm, "markerAdded", cm, marker); - } - return marker; - } - var SharedTextMarker = function (markers, primary) { - this.markers = markers; - this.primary = primary; - for (var i2 = 0; i2 < markers.length; ++i2) { - markers[i2].parent = this; - } - }; - SharedTextMarker.prototype.clear = function () { - if (this.explicitlyCleared) { - return; - } - this.explicitlyCleared = true; - for (var i2 = 0; i2 < this.markers.length; ++i2) { - this.markers[i2].clear(); - } - signalLater(this, "clear"); - }; - SharedTextMarker.prototype.find = function (side, lineObj) { - return this.primary.find(side, lineObj); - }; - eventMixin(SharedTextMarker); - function markTextShared(doc, from, to, options, type) { - options = copyObj(options); - options.shared = false; - var markers = [markText(doc, from, to, options, type)], - primary = markers[0]; - var widget = options.widgetNode; - linkedDocs(doc, function (doc2) { - if (widget) { - options.widgetNode = widget.cloneNode(true); - } - markers.push(markText(doc2, clipPos(doc2, from), clipPos(doc2, to), options, type)); - for (var i2 = 0; i2 < doc2.linked.length; ++i2) { - if (doc2.linked[i2].isParent) { - return; - } - } - primary = lst(markers); - }); - return new SharedTextMarker(markers, primary); - } - function findSharedMarkers(doc) { - return doc.findMarks(Pos(doc.first, 0), doc.clipPos(Pos(doc.lastLine())), function (m) { - return m.parent; - }); - } - function copySharedMarkers(doc, markers) { - for (var i2 = 0; i2 < markers.length; i2++) { - var marker = markers[i2], - pos = marker.find(); - var mFrom = doc.clipPos(pos.from), - mTo = doc.clipPos(pos.to); - if (cmp(mFrom, mTo)) { - var subMark = markText(doc, mFrom, mTo, marker.primary, marker.primary.type); - marker.markers.push(subMark); - subMark.parent = marker; - } - } - } - function detachSharedMarkers(markers) { - var loop = function (i3) { - var marker = markers[i3], - linked = [marker.primary.doc]; - linkedDocs(marker.primary.doc, function (d) { - return linked.push(d); - }); - for (var j = 0; j < marker.markers.length; j++) { - var subMarker = marker.markers[j]; - if (indexOf(linked, subMarker.doc) == -1) { - subMarker.parent = null; - marker.markers.splice(j--, 1); - } - } - }; - for (var i2 = 0; i2 < markers.length; i2++) loop(i2); - } - var nextDocId = 0; - var Doc = function (text, mode, firstLine, lineSep, direction) { - if (!(this instanceof Doc)) { - return new Doc(text, mode, firstLine, lineSep, direction); - } - if (firstLine == null) { - firstLine = 0; - } - BranchChunk.call(this, [new LeafChunk([new Line("", null)])]); - this.first = firstLine; - this.scrollTop = this.scrollLeft = 0; - this.cantEdit = false; - this.cleanGeneration = 1; - this.modeFrontier = this.highlightFrontier = firstLine; - var start = Pos(firstLine, 0); - this.sel = simpleSelection(start); - this.history = new History(null); - this.id = ++nextDocId; - this.modeOption = mode; - this.lineSep = lineSep; - this.direction = direction == "rtl" ? "rtl" : "ltr"; - this.extend = false; - if (typeof text == "string") { - text = this.splitLines(text); - } - updateDoc(this, { - from: start, - to: start, - text - }); - setSelection(this, simpleSelection(start), sel_dontScroll); - }; - Doc.prototype = createObj(BranchChunk.prototype, { - constructor: Doc, - // Iterate over the document. Supports two forms -- with only one - // argument, it calls that for each line in the document. With - // three, it iterates over the range given by the first two (with - // the second being non-inclusive). - iter: function (from, to, op) { - if (op) { - this.iterN(from - this.first, to - from, op); - } else { - this.iterN(this.first, this.first + this.size, from); - } - }, - // Non-public interface for adding and removing lines. - insert: function (at, lines) { - var height = 0; - for (var i2 = 0; i2 < lines.length; ++i2) { - height += lines[i2].height; - } - this.insertInner(at - this.first, lines, height); - }, - remove: function (at, n) { - this.removeInner(at - this.first, n); - }, - // From here, the methods are part of the public interface. Most - // are also available from CodeMirror (editor) instances. - getValue: function (lineSep) { - var lines = getLines(this, this.first, this.first + this.size); - if (lineSep === false) { - return lines; - } - return lines.join(lineSep || this.lineSeparator()); - }, - setValue: docMethodOp(function (code) { - var top = Pos(this.first, 0), - last = this.first + this.size - 1; - makeChange(this, { - from: top, - to: Pos(last, getLine(this, last).text.length), - text: this.splitLines(code), - origin: "setValue", - full: true - }, true); - if (this.cm) { - scrollToCoords(this.cm, 0, 0); - } - setSelection(this, simpleSelection(top), sel_dontScroll); - }), - replaceRange: function (code, from, to, origin) { - from = clipPos(this, from); - to = to ? clipPos(this, to) : from; - replaceRange(this, code, from, to, origin); - }, - getRange: function (from, to, lineSep) { - var lines = getBetween(this, clipPos(this, from), clipPos(this, to)); - if (lineSep === false) { - return lines; - } - if (lineSep === "") { - return lines.join(""); - } - return lines.join(lineSep || this.lineSeparator()); - }, - getLine: function (line) { - var l = this.getLineHandle(line); - return l && l.text; - }, - getLineHandle: function (line) { - if (isLine(this, line)) { - return getLine(this, line); - } - }, - getLineNumber: function (line) { - return lineNo(line); - }, - getLineHandleVisualStart: function (line) { - if (typeof line == "number") { - line = getLine(this, line); - } - return visualLine(line); - }, - lineCount: function () { - return this.size; - }, - firstLine: function () { - return this.first; - }, - lastLine: function () { - return this.first + this.size - 1; - }, - clipPos: function (pos) { - return clipPos(this, pos); - }, - getCursor: function (start) { - var range2 = this.sel.primary(), - pos; - if (start == null || start == "head") { - pos = range2.head; - } else if (start == "anchor") { - pos = range2.anchor; - } else if (start == "end" || start == "to" || start === false) { - pos = range2.to(); - } else { - pos = range2.from(); - } - return pos; - }, - listSelections: function () { - return this.sel.ranges; - }, - somethingSelected: function () { - return this.sel.somethingSelected(); - }, - setCursor: docMethodOp(function (line, ch, options) { - setSimpleSelection(this, clipPos(this, typeof line == "number" ? Pos(line, ch || 0) : line), null, options); - }), - setSelection: docMethodOp(function (anchor, head, options) { - setSimpleSelection(this, clipPos(this, anchor), clipPos(this, head || anchor), options); - }), - extendSelection: docMethodOp(function (head, other, options) { - extendSelection(this, clipPos(this, head), other && clipPos(this, other), options); - }), - extendSelections: docMethodOp(function (heads, options) { - extendSelections(this, clipPosArray(this, heads), options); - }), - extendSelectionsBy: docMethodOp(function (f, options) { - var heads = map(this.sel.ranges, f); - extendSelections(this, clipPosArray(this, heads), options); - }), - setSelections: docMethodOp(function (ranges, primary, options) { - if (!ranges.length) { - return; - } - var out = []; - for (var i2 = 0; i2 < ranges.length; i2++) { - out[i2] = new Range(clipPos(this, ranges[i2].anchor), clipPos(this, ranges[i2].head || ranges[i2].anchor)); - } - if (primary == null) { - primary = Math.min(ranges.length - 1, this.sel.primIndex); - } - setSelection(this, normalizeSelection(this.cm, out, primary), options); - }), - addSelection: docMethodOp(function (anchor, head, options) { - var ranges = this.sel.ranges.slice(0); - ranges.push(new Range(clipPos(this, anchor), clipPos(this, head || anchor))); - setSelection(this, normalizeSelection(this.cm, ranges, ranges.length - 1), options); - }), - getSelection: function (lineSep) { - var ranges = this.sel.ranges, - lines; - for (var i2 = 0; i2 < ranges.length; i2++) { - var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); - lines = lines ? lines.concat(sel) : sel; - } - if (lineSep === false) { - return lines; - } else { - return lines.join(lineSep || this.lineSeparator()); - } - }, - getSelections: function (lineSep) { - var parts = [], - ranges = this.sel.ranges; - for (var i2 = 0; i2 < ranges.length; i2++) { - var sel = getBetween(this, ranges[i2].from(), ranges[i2].to()); - if (lineSep !== false) { - sel = sel.join(lineSep || this.lineSeparator()); - } - parts[i2] = sel; - } - return parts; - }, - replaceSelection: function (code, collapse, origin) { - var dup = []; - for (var i2 = 0; i2 < this.sel.ranges.length; i2++) { - dup[i2] = code; - } - this.replaceSelections(dup, collapse, origin || "+input"); - }, - replaceSelections: docMethodOp(function (code, collapse, origin) { - var changes = [], - sel = this.sel; - for (var i2 = 0; i2 < sel.ranges.length; i2++) { - var range2 = sel.ranges[i2]; - changes[i2] = { - from: range2.from(), - to: range2.to(), - text: this.splitLines(code[i2]), - origin - }; - } - var newSel = collapse && collapse != "end" && computeReplacedSel(this, changes, collapse); - for (var i$12 = changes.length - 1; i$12 >= 0; i$12--) { - makeChange(this, changes[i$12]); - } - if (newSel) { - setSelectionReplaceHistory(this, newSel); - } else if (this.cm) { - ensureCursorVisible(this.cm); - } - }), - undo: docMethodOp(function () { - makeChangeFromHistory(this, "undo"); - }), - redo: docMethodOp(function () { - makeChangeFromHistory(this, "redo"); - }), - undoSelection: docMethodOp(function () { - makeChangeFromHistory(this, "undo", true); - }), - redoSelection: docMethodOp(function () { - makeChangeFromHistory(this, "redo", true); - }), - setExtending: function (val) { - this.extend = val; - }, - getExtending: function () { - return this.extend; - }, - historySize: function () { - var hist = this.history, - done = 0, - undone = 0; - for (var i2 = 0; i2 < hist.done.length; i2++) { - if (!hist.done[i2].ranges) { - ++done; - } - } - for (var i$12 = 0; i$12 < hist.undone.length; i$12++) { - if (!hist.undone[i$12].ranges) { - ++undone; - } - } - return { - undo: done, - redo: undone - }; - }, - clearHistory: function () { - var this$1$1 = this; - this.history = new History(this.history); - linkedDocs(this, function (doc) { - return doc.history = this$1$1.history; - }, true); - }, - markClean: function () { - this.cleanGeneration = this.changeGeneration(true); - }, - changeGeneration: function (forceSplit) { - if (forceSplit) { - this.history.lastOp = this.history.lastSelOp = this.history.lastOrigin = null; - } - return this.history.generation; - }, - isClean: function (gen) { - return this.history.generation == (gen || this.cleanGeneration); - }, - getHistory: function () { - return { - done: copyHistoryArray(this.history.done), - undone: copyHistoryArray(this.history.undone) - }; - }, - setHistory: function (histData) { - var hist = this.history = new History(this.history); - hist.done = copyHistoryArray(histData.done.slice(0), null, true); - hist.undone = copyHistoryArray(histData.undone.slice(0), null, true); - }, - setGutterMarker: docMethodOp(function (line, gutterID, value) { - return changeLine(this, line, "gutter", function (line2) { - var markers = line2.gutterMarkers || (line2.gutterMarkers = {}); - markers[gutterID] = value; - if (!value && isEmpty(markers)) { - line2.gutterMarkers = null; - } - return true; - }); - }), - clearGutter: docMethodOp(function (gutterID) { - var this$1$1 = this; - this.iter(function (line) { - if (line.gutterMarkers && line.gutterMarkers[gutterID]) { - changeLine(this$1$1, line, "gutter", function () { - line.gutterMarkers[gutterID] = null; - if (isEmpty(line.gutterMarkers)) { - line.gutterMarkers = null; - } - return true; - }); - } - }); - }), - lineInfo: function (line) { - var n; - if (typeof line == "number") { - if (!isLine(this, line)) { - return null; - } - n = line; - line = getLine(this, line); - if (!line) { - return null; - } - } else { - n = lineNo(line); - if (n == null) { - return null; - } - } - return { - line: n, - handle: line, - text: line.text, - gutterMarkers: line.gutterMarkers, - textClass: line.textClass, - bgClass: line.bgClass, - wrapClass: line.wrapClass, - widgets: line.widgets - }; - }, - addLineClass: docMethodOp(function (handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; - if (!line[prop2]) { - line[prop2] = cls; - } else if (classTest(cls).test(line[prop2])) { - return false; - } else { - line[prop2] += " " + cls; - } - return true; - }); - }), - removeLineClass: docMethodOp(function (handle, where, cls) { - return changeLine(this, handle, where == "gutter" ? "gutter" : "class", function (line) { - var prop2 = where == "text" ? "textClass" : where == "background" ? "bgClass" : where == "gutter" ? "gutterClass" : "wrapClass"; - var cur = line[prop2]; - if (!cur) { - return false; - } else if (cls == null) { - line[prop2] = null; - } else { - var found = cur.match(classTest(cls)); - if (!found) { - return false; - } - var end = found.index + found[0].length; - line[prop2] = cur.slice(0, found.index) + (!found.index || end == cur.length ? "" : " ") + cur.slice(end) || null; - } - return true; - }); - }), - addLineWidget: docMethodOp(function (handle, node, options) { - return addLineWidget(this, handle, node, options); - }), - removeLineWidget: function (widget) { - widget.clear(); - }, - markText: function (from, to, options) { - return markText(this, clipPos(this, from), clipPos(this, to), options, options && options.type || "range"); - }, - setBookmark: function (pos, options) { - var realOpts = { - replacedWith: options && (options.nodeType == null ? options.widget : options), - insertLeft: options && options.insertLeft, - clearWhenEmpty: false, - shared: options && options.shared, - handleMouseEvents: options && options.handleMouseEvents - }; - pos = clipPos(this, pos); - return markText(this, pos, pos, realOpts, "bookmark"); - }, - findMarksAt: function (pos) { - pos = clipPos(this, pos); - var markers = [], - spans = getLine(this, pos.line).markedSpans; - if (spans) { - for (var i2 = 0; i2 < spans.length; ++i2) { - var span = spans[i2]; - if ((span.from == null || span.from <= pos.ch) && (span.to == null || span.to >= pos.ch)) { - markers.push(span.marker.parent || span.marker); - } - } - } - return markers; - }, - findMarks: function (from, to, filter) { - from = clipPos(this, from); - to = clipPos(this, to); - var found = [], - lineNo2 = from.line; - this.iter(from.line, to.line + 1, function (line) { - var spans = line.markedSpans; - if (spans) { - for (var i2 = 0; i2 < spans.length; i2++) { - var span = spans[i2]; - if (!(span.to != null && lineNo2 == from.line && from.ch >= span.to || span.from == null && lineNo2 != from.line || span.from != null && lineNo2 == to.line && span.from >= to.ch) && (!filter || filter(span.marker))) { - found.push(span.marker.parent || span.marker); - } - } - } - ++lineNo2; - }); - return found; - }, - getAllMarks: function () { - var markers = []; - this.iter(function (line) { - var sps = line.markedSpans; - if (sps) { - for (var i2 = 0; i2 < sps.length; ++i2) { - if (sps[i2].from != null) { - markers.push(sps[i2].marker); - } - } - } - }); - return markers; - }, - posFromIndex: function (off2) { - var ch, - lineNo2 = this.first, - sepSize = this.lineSeparator().length; - this.iter(function (line) { - var sz = line.text.length + sepSize; - if (sz > off2) { - ch = off2; - return true; - } - off2 -= sz; - ++lineNo2; - }); - return clipPos(this, Pos(lineNo2, ch)); - }, - indexFromPos: function (coords) { - coords = clipPos(this, coords); - var index = coords.ch; - if (coords.line < this.first || coords.ch < 0) { - return 0; - } - var sepSize = this.lineSeparator().length; - this.iter(this.first, coords.line, function (line) { - index += line.text.length + sepSize; - }); - return index; - }, - copy: function (copyHistory) { - var doc = new Doc(getLines(this, this.first, this.first + this.size), this.modeOption, this.first, this.lineSep, this.direction); - doc.scrollTop = this.scrollTop; - doc.scrollLeft = this.scrollLeft; - doc.sel = this.sel; - doc.extend = false; - if (copyHistory) { - doc.history.undoDepth = this.history.undoDepth; - doc.setHistory(this.getHistory()); - } - return doc; - }, - linkedDoc: function (options) { - if (!options) { - options = {}; - } - var from = this.first, - to = this.first + this.size; - if (options.from != null && options.from > from) { - from = options.from; - } - if (options.to != null && options.to < to) { - to = options.to; - } - var copy = new Doc(getLines(this, from, to), options.mode || this.modeOption, from, this.lineSep, this.direction); - if (options.sharedHist) { - copy.history = this.history; - } - (this.linked || (this.linked = [])).push({ - doc: copy, - sharedHist: options.sharedHist - }); - copy.linked = [{ - doc: this, - isParent: true, - sharedHist: options.sharedHist - }]; - copySharedMarkers(copy, findSharedMarkers(this)); - return copy; - }, - unlinkDoc: function (other) { - if (other instanceof CodeMirror) { - other = other.doc; - } - if (this.linked) { - for (var i2 = 0; i2 < this.linked.length; ++i2) { - var link = this.linked[i2]; - if (link.doc != other) { - continue; - } - this.linked.splice(i2, 1); - other.unlinkDoc(this); - detachSharedMarkers(findSharedMarkers(this)); - break; - } - } - if (other.history == this.history) { - var splitIds = [other.id]; - linkedDocs(other, function (doc) { - return splitIds.push(doc.id); - }, true); - other.history = new History(null); - other.history.done = copyHistoryArray(this.history.done, splitIds); - other.history.undone = copyHistoryArray(this.history.undone, splitIds); - } - }, - iterLinkedDocs: function (f) { - linkedDocs(this, f); - }, - getMode: function () { - return this.mode; - }, - getEditor: function () { - return this.cm; - }, - splitLines: function (str) { - if (this.lineSep) { - return str.split(this.lineSep); - } - return splitLinesAuto(str); - }, - lineSeparator: function () { - return this.lineSep || "\n"; - }, - setDirection: docMethodOp(function (dir) { - if (dir != "rtl") { - dir = "ltr"; - } - if (dir == this.direction) { - return; - } - this.direction = dir; - this.iter(function (line) { - return line.order = null; - }); - if (this.cm) { - directionChanged(this.cm); - } - }) - }); - Doc.prototype.eachLine = Doc.prototype.iter; - var lastDrop = 0; - function onDrop(e) { - var cm = this; - clearDragCursor(cm); - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { - return; - } - e_preventDefault(e); - if (ie) { - lastDrop = + /* @__PURE__ */new Date(); - } - var pos = posFromMouse(cm, e, true), - files = e.dataTransfer.files; - if (!pos || cm.isReadOnly()) { - return; - } - if (files && files.length && window.FileReader && window.File) { - var n = files.length, - text = Array(n), - read = 0; - var markAsReadAndPasteIfAllFilesAreRead = function () { - if (++read == n) { - operation(cm, function () { - pos = clipPos(cm.doc, pos); - var change = { - from: pos, - to: pos, - text: cm.doc.splitLines(text.filter(function (t) { - return t != null; - }).join(cm.doc.lineSeparator())), - origin: "paste" - }; - makeChange(cm.doc, change); - setSelectionReplaceHistory(cm.doc, simpleSelection(clipPos(cm.doc, pos), clipPos(cm.doc, changeEnd(change)))); - })(); - } - }; - var readTextFromFile = function (file, i3) { - if (cm.options.allowDropFileTypes && indexOf(cm.options.allowDropFileTypes, file.type) == -1) { - markAsReadAndPasteIfAllFilesAreRead(); - return; - } - var reader = new FileReader(); - reader.onerror = function () { - return markAsReadAndPasteIfAllFilesAreRead(); - }; - reader.onload = function () { - var content = reader.result; - if (/[\x00-\x08\x0e-\x1f]{2}/.test(content)) { - markAsReadAndPasteIfAllFilesAreRead(); - return; - } - text[i3] = content; - markAsReadAndPasteIfAllFilesAreRead(); - }; - reader.readAsText(file); - }; - for (var i2 = 0; i2 < files.length; i2++) { - readTextFromFile(files[i2], i2); - } - } else { - if (cm.state.draggingText && cm.doc.sel.contains(pos) > -1) { - cm.state.draggingText(e); - setTimeout(function () { - return cm.display.input.focus(); - }, 20); - return; - } - try { - var text$1 = e.dataTransfer.getData("Text"); - if (text$1) { - var selected; - if (cm.state.draggingText && !cm.state.draggingText.copy) { - selected = cm.listSelections(); - } - setSelectionNoUndo(cm.doc, simpleSelection(pos, pos)); - if (selected) { - for (var i$12 = 0; i$12 < selected.length; ++i$12) { - replaceRange(cm.doc, "", selected[i$12].anchor, selected[i$12].head, "drag"); - } - } - cm.replaceSelection(text$1, "around", "paste"); - cm.display.input.focus(); - } - } catch (e$1) {} - } - } - function onDragStart(cm, e) { - if (ie && (!cm.state.draggingText || + /* @__PURE__ */new Date() - lastDrop < 100)) { - e_stop(e); - return; - } - if (signalDOMEvent(cm, e) || eventInWidget(cm.display, e)) { - return; - } - e.dataTransfer.setData("Text", cm.getSelection()); - e.dataTransfer.effectAllowed = "copyMove"; - if (e.dataTransfer.setDragImage && !safari) { - var img = elt("img", null, null, "position: fixed; left: 0; top: 0;"); - img.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=="; - if (presto) { - img.width = img.height = 1; - cm.display.wrapper.appendChild(img); - img._top = img.offsetTop; - } - e.dataTransfer.setDragImage(img, 0, 0); - if (presto) { - img.parentNode.removeChild(img); - } - } - } - function onDragOver(cm, e) { - var pos = posFromMouse(cm, e); - if (!pos) { - return; - } - var frag = document.createDocumentFragment(); - drawSelectionCursor(cm, pos, frag); - if (!cm.display.dragCursor) { - cm.display.dragCursor = elt("div", null, "CodeMirror-cursors CodeMirror-dragcursors"); - cm.display.lineSpace.insertBefore(cm.display.dragCursor, cm.display.cursorDiv); - } - removeChildrenAndAdd(cm.display.dragCursor, frag); - } - function clearDragCursor(cm) { - if (cm.display.dragCursor) { - cm.display.lineSpace.removeChild(cm.display.dragCursor); - cm.display.dragCursor = null; - } - } - function forEachCodeMirror(f) { - if (!document.getElementsByClassName) { - return; - } - var byClass = document.getElementsByClassName("CodeMirror"), - editors = []; - for (var i2 = 0; i2 < byClass.length; i2++) { - var cm = byClass[i2].CodeMirror; - if (cm) { - editors.push(cm); - } - } - if (editors.length) { - editors[0].operation(function () { - for (var i3 = 0; i3 < editors.length; i3++) { - f(editors[i3]); - } - }); - } - } - var globalsRegistered = false; - function ensureGlobalHandlers() { - if (globalsRegistered) { - return; - } - registerGlobalHandlers(); - globalsRegistered = true; - } - function registerGlobalHandlers() { - var resizeTimer; - on(window, "resize", function () { - if (resizeTimer == null) { - resizeTimer = setTimeout(function () { - resizeTimer = null; - forEachCodeMirror(onResize); - }, 100); - } - }); - on(window, "blur", function () { - return forEachCodeMirror(onBlur); - }); - } - function onResize(cm) { - var d = cm.display; - d.cachedCharWidth = d.cachedTextHeight = d.cachedPaddingH = null; - d.scrollbarsClipped = false; - cm.setSize(); - } - var keyNames = { - 3: "Pause", - 8: "Backspace", - 9: "Tab", - 13: "Enter", - 16: "Shift", - 17: "Ctrl", - 18: "Alt", - 19: "Pause", - 20: "CapsLock", - 27: "Esc", - 32: "Space", - 33: "PageUp", - 34: "PageDown", - 35: "End", - 36: "Home", - 37: "Left", - 38: "Up", - 39: "Right", - 40: "Down", - 44: "PrintScrn", - 45: "Insert", - 46: "Delete", - 59: ";", - 61: "=", - 91: "Mod", - 92: "Mod", - 93: "Mod", - 106: "*", - 107: "=", - 109: "-", - 110: ".", - 111: "/", - 145: "ScrollLock", - 173: "-", - 186: ";", - 187: "=", - 188: ",", - 189: "-", - 190: ".", - 191: "/", - 192: "`", - 219: "[", - 220: "\\", - 221: "]", - 222: "'", - 224: "Mod", - 63232: "Up", - 63233: "Down", - 63234: "Left", - 63235: "Right", - 63272: "Delete", - 63273: "Home", - 63275: "End", - 63276: "PageUp", - 63277: "PageDown", - 63302: "Insert" - }; - for (var i = 0; i < 10; i++) { - keyNames[i + 48] = keyNames[i + 96] = String(i); - } - for (var i$1 = 65; i$1 <= 90; i$1++) { - keyNames[i$1] = String.fromCharCode(i$1); - } - for (var i$2 = 1; i$2 <= 12; i$2++) { - keyNames[i$2 + 111] = keyNames[i$2 + 63235] = "F" + i$2; - } - var keyMap = {}; - keyMap.basic = { - "Left": "goCharLeft", - "Right": "goCharRight", - "Up": "goLineUp", - "Down": "goLineDown", - "End": "goLineEnd", - "Home": "goLineStartSmart", - "PageUp": "goPageUp", - "PageDown": "goPageDown", - "Delete": "delCharAfter", - "Backspace": "delCharBefore", - "Shift-Backspace": "delCharBefore", - "Tab": "defaultTab", - "Shift-Tab": "indentAuto", - "Enter": "newlineAndIndent", - "Insert": "toggleOverwrite", - "Esc": "singleSelection" - }; - keyMap.pcDefault = { - "Ctrl-A": "selectAll", - "Ctrl-D": "deleteLine", - "Ctrl-Z": "undo", - "Shift-Ctrl-Z": "redo", - "Ctrl-Y": "redo", - "Ctrl-Home": "goDocStart", - "Ctrl-End": "goDocEnd", - "Ctrl-Up": "goLineUp", - "Ctrl-Down": "goLineDown", - "Ctrl-Left": "goGroupLeft", - "Ctrl-Right": "goGroupRight", - "Alt-Left": "goLineStart", - "Alt-Right": "goLineEnd", - "Ctrl-Backspace": "delGroupBefore", - "Ctrl-Delete": "delGroupAfter", - "Ctrl-S": "save", - "Ctrl-F": "find", - "Ctrl-G": "findNext", - "Shift-Ctrl-G": "findPrev", - "Shift-Ctrl-F": "replace", - "Shift-Ctrl-R": "replaceAll", - "Ctrl-[": "indentLess", - "Ctrl-]": "indentMore", - "Ctrl-U": "undoSelection", - "Shift-Ctrl-U": "redoSelection", - "Alt-U": "redoSelection", - "fallthrough": "basic" - }; - keyMap.emacsy = { - "Ctrl-F": "goCharRight", - "Ctrl-B": "goCharLeft", - "Ctrl-P": "goLineUp", - "Ctrl-N": "goLineDown", - "Ctrl-A": "goLineStart", - "Ctrl-E": "goLineEnd", - "Ctrl-V": "goPageDown", - "Shift-Ctrl-V": "goPageUp", - "Ctrl-D": "delCharAfter", - "Ctrl-H": "delCharBefore", - "Alt-Backspace": "delWordBefore", - "Ctrl-K": "killLine", - "Ctrl-T": "transposeChars", - "Ctrl-O": "openLine" - }; - keyMap.macDefault = { - "Cmd-A": "selectAll", - "Cmd-D": "deleteLine", - "Cmd-Z": "undo", - "Shift-Cmd-Z": "redo", - "Cmd-Y": "redo", - "Cmd-Home": "goDocStart", - "Cmd-Up": "goDocStart", - "Cmd-End": "goDocEnd", - "Cmd-Down": "goDocEnd", - "Alt-Left": "goGroupLeft", - "Alt-Right": "goGroupRight", - "Cmd-Left": "goLineLeft", - "Cmd-Right": "goLineRight", - "Alt-Backspace": "delGroupBefore", - "Ctrl-Alt-Backspace": "delGroupAfter", - "Alt-Delete": "delGroupAfter", - "Cmd-S": "save", - "Cmd-F": "find", - "Cmd-G": "findNext", - "Shift-Cmd-G": "findPrev", - "Cmd-Alt-F": "replace", - "Shift-Cmd-Alt-F": "replaceAll", - "Cmd-[": "indentLess", - "Cmd-]": "indentMore", - "Cmd-Backspace": "delWrappedLineLeft", - "Cmd-Delete": "delWrappedLineRight", - "Cmd-U": "undoSelection", - "Shift-Cmd-U": "redoSelection", - "Ctrl-Up": "goDocStart", - "Ctrl-Down": "goDocEnd", - "fallthrough": ["basic", "emacsy"] - }; - keyMap["default"] = mac ? keyMap.macDefault : keyMap.pcDefault; - function normalizeKeyName(name) { - var parts = name.split(/-(?!$)/); - name = parts[parts.length - 1]; - var alt, ctrl, shift, cmd; - for (var i2 = 0; i2 < parts.length - 1; i2++) { - var mod = parts[i2]; - if (/^(cmd|meta|m)$/i.test(mod)) { - cmd = true; - } else if (/^a(lt)?$/i.test(mod)) { - alt = true; - } else if (/^(c|ctrl|control)$/i.test(mod)) { - ctrl = true; - } else if (/^s(hift)?$/i.test(mod)) { - shift = true; - } else { - throw new Error("Unrecognized modifier name: " + mod); - } - } - if (alt) { - name = "Alt-" + name; - } - if (ctrl) { - name = "Ctrl-" + name; - } - if (cmd) { - name = "Cmd-" + name; - } - if (shift) { - name = "Shift-" + name; - } - return name; - } - function normalizeKeyMap(keymap) { - var copy = {}; - for (var keyname in keymap) { - if (keymap.hasOwnProperty(keyname)) { - var value = keymap[keyname]; - if (/^(name|fallthrough|(de|at)tach)$/.test(keyname)) { - continue; - } - if (value == "...") { - delete keymap[keyname]; - continue; - } - var keys = map(keyname.split(" "), normalizeKeyName); - for (var i2 = 0; i2 < keys.length; i2++) { - var val = void 0, - name = void 0; - if (i2 == keys.length - 1) { - name = keys.join(" "); - val = value; - } else { - name = keys.slice(0, i2 + 1).join(" "); - val = "..."; - } - var prev = copy[name]; - if (!prev) { - copy[name] = val; - } else if (prev != val) { - throw new Error("Inconsistent bindings for " + name); - } - } - delete keymap[keyname]; - } - } - for (var prop2 in copy) { - keymap[prop2] = copy[prop2]; - } - return keymap; - } - function lookupKey(key, map2, handle, context) { - map2 = getKeyMap(map2); - var found = map2.call ? map2.call(key, context) : map2[key]; - if (found === false) { - return "nothing"; - } - if (found === "...") { - return "multi"; - } - if (found != null && handle(found)) { - return "handled"; - } - if (map2.fallthrough) { - if (Object.prototype.toString.call(map2.fallthrough) != "[object Array]") { - return lookupKey(key, map2.fallthrough, handle, context); - } - for (var i2 = 0; i2 < map2.fallthrough.length; i2++) { - var result = lookupKey(key, map2.fallthrough[i2], handle, context); - if (result) { - return result; - } - } - } - } - function isModifierKey(value) { - var name = typeof value == "string" ? value : keyNames[value.keyCode]; - return name == "Ctrl" || name == "Alt" || name == "Shift" || name == "Mod"; - } - function addModifierNames(name, event, noShift) { - var base = name; - if (event.altKey && base != "Alt") { - name = "Alt-" + name; - } - if ((flipCtrlCmd ? event.metaKey : event.ctrlKey) && base != "Ctrl") { - name = "Ctrl-" + name; - } - if ((flipCtrlCmd ? event.ctrlKey : event.metaKey) && base != "Mod") { - name = "Cmd-" + name; - } - if (!noShift && event.shiftKey && base != "Shift") { - name = "Shift-" + name; - } - return name; - } - function keyName(event, noShift) { - if (presto && event.keyCode == 34 && event["char"]) { - return false; - } - var name = keyNames[event.keyCode]; - if (name == null || event.altGraphKey) { - return false; - } - if (event.keyCode == 3 && event.code) { - name = event.code; - } - return addModifierNames(name, event, noShift); - } - function getKeyMap(val) { - return typeof val == "string" ? keyMap[val] : val; - } - function deleteNearSelection(cm, compute) { - var ranges = cm.doc.sel.ranges, - kill = []; - for (var i2 = 0; i2 < ranges.length; i2++) { - var toKill = compute(ranges[i2]); - while (kill.length && cmp(toKill.from, lst(kill).to) <= 0) { - var replaced = kill.pop(); - if (cmp(replaced.from, toKill.from) < 0) { - toKill.from = replaced.from; - break; - } - } - kill.push(toKill); - } - runInOp(cm, function () { - for (var i3 = kill.length - 1; i3 >= 0; i3--) { - replaceRange(cm.doc, "", kill[i3].from, kill[i3].to, "+delete"); - } - ensureCursorVisible(cm); - }); - } - function moveCharLogically(line, ch, dir) { - var target = skipExtendingChars(line.text, ch + dir, dir); - return target < 0 || target > line.text.length ? null : target; - } - function moveLogically(line, start, dir) { - var ch = moveCharLogically(line, start.ch, dir); - return ch == null ? null : new Pos(start.line, ch, dir < 0 ? "after" : "before"); - } - function endOfLine(visually, cm, lineObj, lineNo2, dir) { - if (visually) { - if (cm.doc.direction == "rtl") { - dir = -dir; - } - var order = getOrder(lineObj, cm.doc.direction); - if (order) { - var part = dir < 0 ? lst(order) : order[0]; - var moveInStorageOrder = dir < 0 == (part.level == 1); - var sticky = moveInStorageOrder ? "after" : "before"; - var ch; - if (part.level > 0 || cm.doc.direction == "rtl") { - var prep = prepareMeasureForLine(cm, lineObj); - ch = dir < 0 ? lineObj.text.length - 1 : 0; - var targetTop = measureCharPrepared(cm, prep, ch).top; - ch = findFirst(function (ch2) { - return measureCharPrepared(cm, prep, ch2).top == targetTop; - }, dir < 0 == (part.level == 1) ? part.from : part.to - 1, ch); - if (sticky == "before") { - ch = moveCharLogically(lineObj, ch, 1); - } - } else { - ch = dir < 0 ? part.to : part.from; - } - return new Pos(lineNo2, ch, sticky); - } - } - return new Pos(lineNo2, dir < 0 ? lineObj.text.length : 0, dir < 0 ? "before" : "after"); - } - function moveVisually(cm, line, start, dir) { - var bidi = getOrder(line, cm.doc.direction); - if (!bidi) { - return moveLogically(line, start, dir); - } - if (start.ch >= line.text.length) { - start.ch = line.text.length; - start.sticky = "before"; - } else if (start.ch <= 0) { - start.ch = 0; - start.sticky = "after"; - } - var partPos = getBidiPartAt(bidi, start.ch, start.sticky), - part = bidi[partPos]; - if (cm.doc.direction == "ltr" && part.level % 2 == 0 && (dir > 0 ? part.to > start.ch : part.from < start.ch)) { - return moveLogically(line, start, dir); - } - var mv = function (pos, dir2) { - return moveCharLogically(line, pos instanceof Pos ? pos.ch : pos, dir2); - }; - var prep; - var getWrappedLineExtent = function (ch2) { - if (!cm.options.lineWrapping) { - return { - begin: 0, - end: line.text.length - }; - } - prep = prep || prepareMeasureForLine(cm, line); - return wrappedLineExtentChar(cm, line, prep, ch2); - }; - var wrappedLineExtent2 = getWrappedLineExtent(start.sticky == "before" ? mv(start, -1) : start.ch); - if (cm.doc.direction == "rtl" || part.level == 1) { - var moveInStorageOrder = part.level == 1 == dir < 0; - var ch = mv(start, moveInStorageOrder ? 1 : -1); - if (ch != null && (!moveInStorageOrder ? ch >= part.from && ch >= wrappedLineExtent2.begin : ch <= part.to && ch <= wrappedLineExtent2.end)) { - var sticky = moveInStorageOrder ? "before" : "after"; - return new Pos(start.line, ch, sticky); - } - } - var searchInVisualLine = function (partPos2, dir2, wrappedLineExtent3) { - var getRes = function (ch3, moveInStorageOrder3) { - return moveInStorageOrder3 ? new Pos(start.line, mv(ch3, 1), "before") : new Pos(start.line, ch3, "after"); - }; - for (; partPos2 >= 0 && partPos2 < bidi.length; partPos2 += dir2) { - var part2 = bidi[partPos2]; - var moveInStorageOrder2 = dir2 > 0 == (part2.level != 1); - var ch2 = moveInStorageOrder2 ? wrappedLineExtent3.begin : mv(wrappedLineExtent3.end, -1); - if (part2.from <= ch2 && ch2 < part2.to) { - return getRes(ch2, moveInStorageOrder2); - } - ch2 = moveInStorageOrder2 ? part2.from : mv(part2.to, -1); - if (wrappedLineExtent3.begin <= ch2 && ch2 < wrappedLineExtent3.end) { - return getRes(ch2, moveInStorageOrder2); - } - } - }; - var res = searchInVisualLine(partPos + dir, dir, wrappedLineExtent2); - if (res) { - return res; - } - var nextCh = dir > 0 ? wrappedLineExtent2.end : mv(wrappedLineExtent2.begin, -1); - if (nextCh != null && !(dir > 0 && nextCh == line.text.length)) { - res = searchInVisualLine(dir > 0 ? 0 : bidi.length - 1, dir, getWrappedLineExtent(nextCh)); - if (res) { - return res; - } - } - return null; - } - var commands = { - selectAll, - singleSelection: function (cm) { - return cm.setSelection(cm.getCursor("anchor"), cm.getCursor("head"), sel_dontScroll); - }, - killLine: function (cm) { - return deleteNearSelection(cm, function (range2) { - if (range2.empty()) { - var len = getLine(cm.doc, range2.head.line).text.length; - if (range2.head.ch == len && range2.head.line < cm.lastLine()) { - return { - from: range2.head, - to: Pos(range2.head.line + 1, 0) - }; - } else { - return { - from: range2.head, - to: Pos(range2.head.line, len) - }; - } - } else { - return { - from: range2.from(), - to: range2.to() - }; - } - }); - }, - deleteLine: function (cm) { - return deleteNearSelection(cm, function (range2) { - return { - from: Pos(range2.from().line, 0), - to: clipPos(cm.doc, Pos(range2.to().line + 1, 0)) - }; - }); - }, - delLineLeft: function (cm) { - return deleteNearSelection(cm, function (range2) { - return { - from: Pos(range2.from().line, 0), - to: range2.from() - }; - }); - }, - delWrappedLineLeft: function (cm) { - return deleteNearSelection(cm, function (range2) { - var top = cm.charCoords(range2.head, "div").top + 5; - var leftPos = cm.coordsChar({ - left: 0, - top - }, "div"); - return { - from: leftPos, - to: range2.from() - }; - }); - }, - delWrappedLineRight: function (cm) { - return deleteNearSelection(cm, function (range2) { - var top = cm.charCoords(range2.head, "div").top + 5; - var rightPos = cm.coordsChar({ - left: cm.display.lineDiv.offsetWidth + 100, - top - }, "div"); - return { - from: range2.from(), - to: rightPos - }; - }); - }, - undo: function (cm) { - return cm.undo(); - }, - redo: function (cm) { - return cm.redo(); - }, - undoSelection: function (cm) { - return cm.undoSelection(); - }, - redoSelection: function (cm) { - return cm.redoSelection(); - }, - goDocStart: function (cm) { - return cm.extendSelection(Pos(cm.firstLine(), 0)); - }, - goDocEnd: function (cm) { - return cm.extendSelection(Pos(cm.lastLine())); - }, - goLineStart: function (cm) { - return cm.extendSelectionsBy(function (range2) { - return lineStart(cm, range2.head.line); - }, { - origin: "+move", - bias: 1 - }); - }, - goLineStartSmart: function (cm) { - return cm.extendSelectionsBy(function (range2) { - return lineStartSmart(cm, range2.head); - }, { - origin: "+move", - bias: 1 - }); - }, - goLineEnd: function (cm) { - return cm.extendSelectionsBy(function (range2) { - return lineEnd(cm, range2.head.line); - }, { - origin: "+move", - bias: -1 - }); - }, - goLineRight: function (cm) { - return cm.extendSelectionsBy(function (range2) { - var top = cm.cursorCoords(range2.head, "div").top + 5; - return cm.coordsChar({ - left: cm.display.lineDiv.offsetWidth + 100, - top - }, "div"); - }, sel_move); - }, - goLineLeft: function (cm) { - return cm.extendSelectionsBy(function (range2) { - var top = cm.cursorCoords(range2.head, "div").top + 5; - return cm.coordsChar({ - left: 0, - top - }, "div"); - }, sel_move); - }, - goLineLeftSmart: function (cm) { - return cm.extendSelectionsBy(function (range2) { - var top = cm.cursorCoords(range2.head, "div").top + 5; - var pos = cm.coordsChar({ - left: 0, - top - }, "div"); - if (pos.ch < cm.getLine(pos.line).search(/\S/)) { - return lineStartSmart(cm, range2.head); - } - return pos; - }, sel_move); - }, - goLineUp: function (cm) { - return cm.moveV(-1, "line"); - }, - goLineDown: function (cm) { - return cm.moveV(1, "line"); - }, - goPageUp: function (cm) { - return cm.moveV(-1, "page"); - }, - goPageDown: function (cm) { - return cm.moveV(1, "page"); - }, - goCharLeft: function (cm) { - return cm.moveH(-1, "char"); - }, - goCharRight: function (cm) { - return cm.moveH(1, "char"); - }, - goColumnLeft: function (cm) { - return cm.moveH(-1, "column"); - }, - goColumnRight: function (cm) { - return cm.moveH(1, "column"); - }, - goWordLeft: function (cm) { - return cm.moveH(-1, "word"); - }, - goGroupRight: function (cm) { - return cm.moveH(1, "group"); - }, - goGroupLeft: function (cm) { - return cm.moveH(-1, "group"); - }, - goWordRight: function (cm) { - return cm.moveH(1, "word"); - }, - delCharBefore: function (cm) { - return cm.deleteH(-1, "codepoint"); - }, - delCharAfter: function (cm) { - return cm.deleteH(1, "char"); - }, - delWordBefore: function (cm) { - return cm.deleteH(-1, "word"); - }, - delWordAfter: function (cm) { - return cm.deleteH(1, "word"); - }, - delGroupBefore: function (cm) { - return cm.deleteH(-1, "group"); - }, - delGroupAfter: function (cm) { - return cm.deleteH(1, "group"); - }, - indentAuto: function (cm) { - return cm.indentSelection("smart"); - }, - indentMore: function (cm) { - return cm.indentSelection("add"); - }, - indentLess: function (cm) { - return cm.indentSelection("subtract"); - }, - insertTab: function (cm) { - return cm.replaceSelection(" "); - }, - insertSoftTab: function (cm) { - var spaces = [], - ranges = cm.listSelections(), - tabSize = cm.options.tabSize; - for (var i2 = 0; i2 < ranges.length; i2++) { - var pos = ranges[i2].from(); - var col = countColumn(cm.getLine(pos.line), pos.ch, tabSize); - spaces.push(spaceStr(tabSize - col % tabSize)); - } - cm.replaceSelections(spaces); - }, - defaultTab: function (cm) { - if (cm.somethingSelected()) { - cm.indentSelection("add"); - } else { - cm.execCommand("insertTab"); - } - }, - // Swap the two chars left and right of each selection's head. - // Move cursor behind the two swapped characters afterwards. - // - // Doesn't consider line feeds a character. - // Doesn't scan more than one line above to find a character. - // Doesn't do anything on an empty line. - // Doesn't do anything with non-empty selections. - transposeChars: function (cm) { - return runInOp(cm, function () { - var ranges = cm.listSelections(), - newSel = []; - for (var i2 = 0; i2 < ranges.length; i2++) { - if (!ranges[i2].empty()) { - continue; - } - var cur = ranges[i2].head, - line = getLine(cm.doc, cur.line).text; - if (line) { - if (cur.ch == line.length) { - cur = new Pos(cur.line, cur.ch - 1); - } - if (cur.ch > 0) { - cur = new Pos(cur.line, cur.ch + 1); - cm.replaceRange(line.charAt(cur.ch - 1) + line.charAt(cur.ch - 2), Pos(cur.line, cur.ch - 2), cur, "+transpose"); - } else if (cur.line > cm.doc.first) { - var prev = getLine(cm.doc, cur.line - 1).text; - if (prev) { - cur = new Pos(cur.line, 1); - cm.replaceRange(line.charAt(0) + cm.doc.lineSeparator() + prev.charAt(prev.length - 1), Pos(cur.line - 1, prev.length - 1), cur, "+transpose"); - } - } - } - newSel.push(new Range(cur, cur)); - } - cm.setSelections(newSel); - }); - }, - newlineAndIndent: function (cm) { - return runInOp(cm, function () { - var sels = cm.listSelections(); - for (var i2 = sels.length - 1; i2 >= 0; i2--) { - cm.replaceRange(cm.doc.lineSeparator(), sels[i2].anchor, sels[i2].head, "+input"); - } - sels = cm.listSelections(); - for (var i$12 = 0; i$12 < sels.length; i$12++) { - cm.indentLine(sels[i$12].from().line, null, true); - } - ensureCursorVisible(cm); - }); - }, - openLine: function (cm) { - return cm.replaceSelection("\n", "start"); - }, - toggleOverwrite: function (cm) { - return cm.toggleOverwrite(); - } - }; - function lineStart(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLine(line); - if (visual != line) { - lineN = lineNo(visual); - } - return endOfLine(true, cm, visual, lineN, 1); - } - function lineEnd(cm, lineN) { - var line = getLine(cm.doc, lineN); - var visual = visualLineEnd(line); - if (visual != line) { - lineN = lineNo(visual); - } - return endOfLine(true, cm, line, lineN, -1); - } - function lineStartSmart(cm, pos) { - var start = lineStart(cm, pos.line); - var line = getLine(cm.doc, start.line); - var order = getOrder(line, cm.doc.direction); - if (!order || order[0].level == 0) { - var firstNonWS = Math.max(start.ch, line.text.search(/\S/)); - var inWS = pos.line == start.line && pos.ch <= firstNonWS && pos.ch; - return Pos(start.line, inWS ? 0 : firstNonWS, start.sticky); - } - return start; - } - function doHandleBinding(cm, bound, dropShift) { - if (typeof bound == "string") { - bound = commands[bound]; - if (!bound) { - return false; - } - } - cm.display.input.ensurePolled(); - var prevShift = cm.display.shift, - done = false; - try { - if (cm.isReadOnly()) { - cm.state.suppressEdits = true; - } - if (dropShift) { - cm.display.shift = false; - } - done = bound(cm) != Pass; - } finally { - cm.display.shift = prevShift; - cm.state.suppressEdits = false; - } - return done; - } - function lookupKeyForEditor(cm, name, handle) { - for (var i2 = 0; i2 < cm.state.keyMaps.length; i2++) { - var result = lookupKey(name, cm.state.keyMaps[i2], handle, cm); - if (result) { - return result; - } - } - return cm.options.extraKeys && lookupKey(name, cm.options.extraKeys, handle, cm) || lookupKey(name, cm.options.keyMap, handle, cm); - } - var stopSeq = new Delayed(); - function dispatchKey(cm, name, e, handle) { - var seq = cm.state.keySeq; - if (seq) { - if (isModifierKey(name)) { - return "handled"; - } - if (/\'$/.test(name)) { - cm.state.keySeq = null; - } else { - stopSeq.set(50, function () { - if (cm.state.keySeq == seq) { - cm.state.keySeq = null; - cm.display.input.reset(); - } - }); - } - if (dispatchKeyInner(cm, seq + " " + name, e, handle)) { - return true; - } - } - return dispatchKeyInner(cm, name, e, handle); - } - function dispatchKeyInner(cm, name, e, handle) { - var result = lookupKeyForEditor(cm, name, handle); - if (result == "multi") { - cm.state.keySeq = name; - } - if (result == "handled") { - signalLater(cm, "keyHandled", cm, name, e); - } - if (result == "handled" || result == "multi") { - e_preventDefault(e); - restartBlink(cm); - } - return !!result; - } - function handleKeyBinding(cm, e) { - var name = keyName(e, true); - if (!name) { - return false; - } - if (e.shiftKey && !cm.state.keySeq) { - return dispatchKey(cm, "Shift-" + name, e, function (b) { - return doHandleBinding(cm, b, true); - }) || dispatchKey(cm, name, e, function (b) { - if (typeof b == "string" ? /^go[A-Z]/.test(b) : b.motion) { - return doHandleBinding(cm, b); - } - }); - } else { - return dispatchKey(cm, name, e, function (b) { - return doHandleBinding(cm, b); - }); - } - } - function handleCharBinding(cm, e, ch) { - return dispatchKey(cm, "'" + ch + "'", e, function (b) { - return doHandleBinding(cm, b, true); - }); - } - var lastStoppedKey = null; - function onKeyDown(e) { - var cm = this; - if (e.target && e.target != cm.display.input.getField()) { - return; - } - cm.curOp.focus = activeElt(); - if (signalDOMEvent(cm, e)) { - return; - } - if (ie && ie_version < 11 && e.keyCode == 27) { - e.returnValue = false; - } - var code = e.keyCode; - cm.display.shift = code == 16 || e.shiftKey; - var handled = handleKeyBinding(cm, e); - if (presto) { - lastStoppedKey = handled ? code : null; - if (!handled && code == 88 && !hasCopyEvent && (mac ? e.metaKey : e.ctrlKey)) { - cm.replaceSelection("", null, "cut"); - } - } - if (gecko && !mac && !handled && code == 46 && e.shiftKey && !e.ctrlKey && document.execCommand) { - document.execCommand("cut"); - } - if (code == 18 && !/\bCodeMirror-crosshair\b/.test(cm.display.lineDiv.className)) { - showCrossHair(cm); - } - } - function showCrossHair(cm) { - var lineDiv = cm.display.lineDiv; - addClass(lineDiv, "CodeMirror-crosshair"); - function up(e) { - if (e.keyCode == 18 || !e.altKey) { - rmClass(lineDiv, "CodeMirror-crosshair"); - off(document, "keyup", up); - off(document, "mouseover", up); - } - } - on(document, "keyup", up); - on(document, "mouseover", up); - } - function onKeyUp(e) { - if (e.keyCode == 16) { - this.doc.sel.shift = false; - } - signalDOMEvent(this, e); - } - function onKeyPress(e) { - var cm = this; - if (e.target && e.target != cm.display.input.getField()) { - return; - } - if (eventInWidget(cm.display, e) || signalDOMEvent(cm, e) || e.ctrlKey && !e.altKey || mac && e.metaKey) { - return; - } - var keyCode = e.keyCode, - charCode = e.charCode; - if (presto && keyCode == lastStoppedKey) { - lastStoppedKey = null; - e_preventDefault(e); - return; - } - if (presto && (!e.which || e.which < 10) && handleKeyBinding(cm, e)) { - return; - } - var ch = String.fromCharCode(charCode == null ? keyCode : charCode); - if (ch == "\b") { - return; - } - if (handleCharBinding(cm, e, ch)) { - return; - } - cm.display.input.onKeyPress(e); - } - var DOUBLECLICK_DELAY = 400; - var PastClick = function (time, pos, button) { - this.time = time; - this.pos = pos; - this.button = button; - }; - PastClick.prototype.compare = function (time, pos, button) { - return this.time + DOUBLECLICK_DELAY > time && cmp(pos, this.pos) == 0 && button == this.button; - }; - var lastClick, lastDoubleClick; - function clickRepeat(pos, button) { - var now = + /* @__PURE__ */new Date(); - if (lastDoubleClick && lastDoubleClick.compare(now, pos, button)) { - lastClick = lastDoubleClick = null; - return "triple"; - } else if (lastClick && lastClick.compare(now, pos, button)) { - lastDoubleClick = new PastClick(now, pos, button); - lastClick = null; - return "double"; - } else { - lastClick = new PastClick(now, pos, button); - lastDoubleClick = null; - return "single"; - } - } - function onMouseDown(e) { - var cm = this, - display = cm.display; - if (signalDOMEvent(cm, e) || display.activeTouch && display.input.supportsTouch()) { - return; - } - display.input.ensurePolled(); - display.shift = e.shiftKey; - if (eventInWidget(display, e)) { - if (!webkit) { - display.scroller.draggable = false; - setTimeout(function () { - return display.scroller.draggable = true; - }, 100); - } - return; - } - if (clickInGutter(cm, e)) { - return; - } - var pos = posFromMouse(cm, e), - button = e_button(e), - repeat = pos ? clickRepeat(pos, button) : "single"; - window.focus(); - if (button == 1 && cm.state.selectingText) { - cm.state.selectingText(e); - } - if (pos && handleMappedButton(cm, button, pos, repeat, e)) { - return; - } - if (button == 1) { - if (pos) { - leftButtonDown(cm, pos, repeat, e); - } else if (e_target(e) == display.scroller) { - e_preventDefault(e); - } - } else if (button == 2) { - if (pos) { - extendSelection(cm.doc, pos); - } - setTimeout(function () { - return display.input.focus(); - }, 20); - } else if (button == 3) { - if (captureRightClick) { - cm.display.input.onContextMenu(e); - } else { - delayBlurEvent(cm); - } - } - } - function handleMappedButton(cm, button, pos, repeat, event) { - var name = "Click"; - if (repeat == "double") { - name = "Double" + name; - } else if (repeat == "triple") { - name = "Triple" + name; - } - name = (button == 1 ? "Left" : button == 2 ? "Middle" : "Right") + name; - return dispatchKey(cm, addModifierNames(name, event), event, function (bound) { - if (typeof bound == "string") { - bound = commands[bound]; - } - if (!bound) { - return false; - } - var done = false; - try { - if (cm.isReadOnly()) { - cm.state.suppressEdits = true; - } - done = bound(cm, pos) != Pass; - } finally { - cm.state.suppressEdits = false; - } - return done; - }); - } - function configureMouse(cm, repeat, event) { - var option = cm.getOption("configureMouse"); - var value = option ? option(cm, repeat, event) : {}; - if (value.unit == null) { - var rect = chromeOS ? event.shiftKey && event.metaKey : event.altKey; - value.unit = rect ? "rectangle" : repeat == "single" ? "char" : repeat == "double" ? "word" : "line"; - } - if (value.extend == null || cm.doc.extend) { - value.extend = cm.doc.extend || event.shiftKey; - } - if (value.addNew == null) { - value.addNew = mac ? event.metaKey : event.ctrlKey; - } - if (value.moveOnDrag == null) { - value.moveOnDrag = !(mac ? event.altKey : event.ctrlKey); - } - return value; - } - function leftButtonDown(cm, pos, repeat, event) { - if (ie) { - setTimeout(bind(ensureFocus, cm), 0); - } else { - cm.curOp.focus = activeElt(); - } - var behavior = configureMouse(cm, repeat, event); - var sel = cm.doc.sel, - contained; - if (cm.options.dragDrop && dragAndDrop && !cm.isReadOnly() && repeat == "single" && (contained = sel.contains(pos)) > -1 && (cmp((contained = sel.ranges[contained]).from(), pos) < 0 || pos.xRel > 0) && (cmp(contained.to(), pos) > 0 || pos.xRel < 0)) { - leftButtonStartDrag(cm, event, pos, behavior); - } else { - leftButtonSelect(cm, event, pos, behavior); - } - } - function leftButtonStartDrag(cm, event, pos, behavior) { - var display = cm.display, - moved = false; - var dragEnd = operation(cm, function (e) { - if (webkit) { - display.scroller.draggable = false; - } - cm.state.draggingText = false; - if (cm.state.delayingBlurEvent) { - if (cm.hasFocus()) { - cm.state.delayingBlurEvent = false; - } else { - delayBlurEvent(cm); - } - } - off(display.wrapper.ownerDocument, "mouseup", dragEnd); - off(display.wrapper.ownerDocument, "mousemove", mouseMove); - off(display.scroller, "dragstart", dragStart); - off(display.scroller, "drop", dragEnd); - if (!moved) { - e_preventDefault(e); - if (!behavior.addNew) { - extendSelection(cm.doc, pos, null, null, behavior.extend); - } - if (webkit && !safari || ie && ie_version == 9) { - setTimeout(function () { - display.wrapper.ownerDocument.body.focus({ - preventScroll: true - }); - display.input.focus(); - }, 20); - } else { - display.input.focus(); - } - } - }); - var mouseMove = function (e2) { - moved = moved || Math.abs(event.clientX - e2.clientX) + Math.abs(event.clientY - e2.clientY) >= 10; - }; - var dragStart = function () { - return moved = true; - }; - if (webkit) { - display.scroller.draggable = true; - } - cm.state.draggingText = dragEnd; - dragEnd.copy = !behavior.moveOnDrag; - on(display.wrapper.ownerDocument, "mouseup", dragEnd); - on(display.wrapper.ownerDocument, "mousemove", mouseMove); - on(display.scroller, "dragstart", dragStart); - on(display.scroller, "drop", dragEnd); - cm.state.delayingBlurEvent = true; - setTimeout(function () { - return display.input.focus(); - }, 20); - if (display.scroller.dragDrop) { - display.scroller.dragDrop(); - } - } - function rangeForUnit(cm, pos, unit) { - if (unit == "char") { - return new Range(pos, pos); - } - if (unit == "word") { - return cm.findWordAt(pos); - } - if (unit == "line") { - return new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); - } - var result = unit(cm, pos); - return new Range(result.from, result.to); - } - function leftButtonSelect(cm, event, start, behavior) { - if (ie) { - delayBlurEvent(cm); - } - var display = cm.display, - doc = cm.doc; - e_preventDefault(event); - var ourRange, - ourIndex, - startSel = doc.sel, - ranges = startSel.ranges; - if (behavior.addNew && !behavior.extend) { - ourIndex = doc.sel.contains(start); - if (ourIndex > -1) { - ourRange = ranges[ourIndex]; - } else { - ourRange = new Range(start, start); - } - } else { - ourRange = doc.sel.primary(); - ourIndex = doc.sel.primIndex; - } - if (behavior.unit == "rectangle") { - if (!behavior.addNew) { - ourRange = new Range(start, start); - } - start = posFromMouse(cm, event, true, true); - ourIndex = -1; - } else { - var range2 = rangeForUnit(cm, start, behavior.unit); - if (behavior.extend) { - ourRange = extendRange(ourRange, range2.anchor, range2.head, behavior.extend); - } else { - ourRange = range2; - } - } - if (!behavior.addNew) { - ourIndex = 0; - setSelection(doc, new Selection([ourRange], 0), sel_mouse); - startSel = doc.sel; - } else if (ourIndex == -1) { - ourIndex = ranges.length; - setSelection(doc, normalizeSelection(cm, ranges.concat([ourRange]), ourIndex), { - scroll: false, - origin: "*mouse" - }); - } else if (ranges.length > 1 && ranges[ourIndex].empty() && behavior.unit == "char" && !behavior.extend) { - setSelection(doc, normalizeSelection(cm, ranges.slice(0, ourIndex).concat(ranges.slice(ourIndex + 1)), 0), { - scroll: false, - origin: "*mouse" - }); - startSel = doc.sel; - } else { - replaceOneSelection(doc, ourIndex, ourRange, sel_mouse); - } - var lastPos = start; - function extendTo(pos) { - if (cmp(lastPos, pos) == 0) { - return; - } - lastPos = pos; - if (behavior.unit == "rectangle") { - var ranges2 = [], - tabSize = cm.options.tabSize; - var startCol = countColumn(getLine(doc, start.line).text, start.ch, tabSize); - var posCol = countColumn(getLine(doc, pos.line).text, pos.ch, tabSize); - var left = Math.min(startCol, posCol), - right = Math.max(startCol, posCol); - for (var line = Math.min(start.line, pos.line), end = Math.min(cm.lastLine(), Math.max(start.line, pos.line)); line <= end; line++) { - var text = getLine(doc, line).text, - leftPos = findColumn(text, left, tabSize); - if (left == right) { - ranges2.push(new Range(Pos(line, leftPos), Pos(line, leftPos))); - } else if (text.length > leftPos) { - ranges2.push(new Range(Pos(line, leftPos), Pos(line, findColumn(text, right, tabSize)))); - } - } - if (!ranges2.length) { - ranges2.push(new Range(start, start)); - } - setSelection(doc, normalizeSelection(cm, startSel.ranges.slice(0, ourIndex).concat(ranges2), ourIndex), { - origin: "*mouse", - scroll: false - }); - cm.scrollIntoView(pos); - } else { - var oldRange = ourRange; - var range3 = rangeForUnit(cm, pos, behavior.unit); - var anchor = oldRange.anchor, - head; - if (cmp(range3.anchor, anchor) > 0) { - head = range3.head; - anchor = minPos(oldRange.from(), range3.anchor); - } else { - head = range3.anchor; - anchor = maxPos(oldRange.to(), range3.head); - } - var ranges$1 = startSel.ranges.slice(0); - ranges$1[ourIndex] = bidiSimplify(cm, new Range(clipPos(doc, anchor), head)); - setSelection(doc, normalizeSelection(cm, ranges$1, ourIndex), sel_mouse); - } - } - var editorSize = display.wrapper.getBoundingClientRect(); - var counter = 0; - function extend(e) { - var curCount = ++counter; - var cur = posFromMouse(cm, e, true, behavior.unit == "rectangle"); - if (!cur) { - return; - } - if (cmp(cur, lastPos) != 0) { - cm.curOp.focus = activeElt(); - extendTo(cur); - var visible = visibleLines(display, doc); - if (cur.line >= visible.to || cur.line < visible.from) { - setTimeout(operation(cm, function () { - if (counter == curCount) { - extend(e); - } - }), 150); - } - } else { - var outside = e.clientY < editorSize.top ? -20 : e.clientY > editorSize.bottom ? 20 : 0; - if (outside) { - setTimeout(operation(cm, function () { - if (counter != curCount) { - return; - } - display.scroller.scrollTop += outside; - extend(e); - }), 50); - } - } - } - function done(e) { - cm.state.selectingText = false; - counter = Infinity; - if (e) { - e_preventDefault(e); - display.input.focus(); - } - off(display.wrapper.ownerDocument, "mousemove", move); - off(display.wrapper.ownerDocument, "mouseup", up); - doc.history.lastSelOrigin = null; - } - var move = operation(cm, function (e) { - if (e.buttons === 0 || !e_button(e)) { - done(e); - } else { - extend(e); - } - }); - var up = operation(cm, done); - cm.state.selectingText = up; - on(display.wrapper.ownerDocument, "mousemove", move); - on(display.wrapper.ownerDocument, "mouseup", up); - } - function bidiSimplify(cm, range2) { - var anchor = range2.anchor; - var head = range2.head; - var anchorLine = getLine(cm.doc, anchor.line); - if (cmp(anchor, head) == 0 && anchor.sticky == head.sticky) { - return range2; - } - var order = getOrder(anchorLine); - if (!order) { - return range2; - } - var index = getBidiPartAt(order, anchor.ch, anchor.sticky), - part = order[index]; - if (part.from != anchor.ch && part.to != anchor.ch) { - return range2; - } - var boundary = index + (part.from == anchor.ch == (part.level != 1) ? 0 : 1); - if (boundary == 0 || boundary == order.length) { - return range2; - } - var leftSide; - if (head.line != anchor.line) { - leftSide = (head.line - anchor.line) * (cm.doc.direction == "ltr" ? 1 : -1) > 0; - } else { - var headIndex = getBidiPartAt(order, head.ch, head.sticky); - var dir = headIndex - index || (head.ch - anchor.ch) * (part.level == 1 ? -1 : 1); - if (headIndex == boundary - 1 || headIndex == boundary) { - leftSide = dir < 0; - } else { - leftSide = dir > 0; - } - } - var usePart = order[boundary + (leftSide ? -1 : 0)]; - var from = leftSide == (usePart.level == 1); - var ch = from ? usePart.from : usePart.to, - sticky = from ? "after" : "before"; - return anchor.ch == ch && anchor.sticky == sticky ? range2 : new Range(new Pos(anchor.line, ch, sticky), head); - } - function gutterEvent(cm, e, type, prevent) { - var mX, mY; - if (e.touches) { - mX = e.touches[0].clientX; - mY = e.touches[0].clientY; - } else { - try { - mX = e.clientX; - mY = e.clientY; - } catch (e$1) { - return false; - } - } - if (mX >= Math.floor(cm.display.gutters.getBoundingClientRect().right)) { - return false; - } - if (prevent) { - e_preventDefault(e); - } - var display = cm.display; - var lineBox = display.lineDiv.getBoundingClientRect(); - if (mY > lineBox.bottom || !hasHandler(cm, type)) { - return e_defaultPrevented(e); - } - mY -= lineBox.top - display.viewOffset; - for (var i2 = 0; i2 < cm.display.gutterSpecs.length; ++i2) { - var g = display.gutters.childNodes[i2]; - if (g && g.getBoundingClientRect().right >= mX) { - var line = lineAtHeight(cm.doc, mY); - var gutter = cm.display.gutterSpecs[i2]; - signal(cm, type, cm, line, gutter.className, e); - return e_defaultPrevented(e); - } - } - } - function clickInGutter(cm, e) { - return gutterEvent(cm, e, "gutterClick", true); - } - function onContextMenu(cm, e) { - if (eventInWidget(cm.display, e) || contextMenuInGutter(cm, e)) { - return; - } - if (signalDOMEvent(cm, e, "contextmenu")) { - return; - } - if (!captureRightClick) { - cm.display.input.onContextMenu(e); - } - } - function contextMenuInGutter(cm, e) { - if (!hasHandler(cm, "gutterContextMenu")) { - return false; - } - return gutterEvent(cm, e, "gutterContextMenu", false); - } - function themeChanged(cm) { - cm.display.wrapper.className = cm.display.wrapper.className.replace(/\s*cm-s-\S+/g, "") + cm.options.theme.replace(/(^|\s)\s*/g, " cm-s-"); - clearCaches(cm); - } - var Init = { - toString: function () { - return "CodeMirror.Init"; - } - }; - var defaults = {}; - var optionHandlers = {}; - function defineOptions(CodeMirror2) { - var optionHandlers2 = CodeMirror2.optionHandlers; - function option(name, deflt, handle, notOnInit) { - CodeMirror2.defaults[name] = deflt; - if (handle) { - optionHandlers2[name] = notOnInit ? function (cm, val, old) { - if (old != Init) { - handle(cm, val, old); - } - } : handle; - } - } - CodeMirror2.defineOption = option; - CodeMirror2.Init = Init; - option("value", "", function (cm, val) { - return cm.setValue(val); - }, true); - option("mode", null, function (cm, val) { - cm.doc.modeOption = val; - loadMode(cm); - }, true); - option("indentUnit", 2, loadMode, true); - option("indentWithTabs", false); - option("smartIndent", true); - option("tabSize", 4, function (cm) { - resetModeState(cm); - clearCaches(cm); - regChange(cm); - }, true); - option("lineSeparator", null, function (cm, val) { - cm.doc.lineSep = val; - if (!val) { - return; - } - var newBreaks = [], - lineNo2 = cm.doc.first; - cm.doc.iter(function (line) { - for (var pos = 0;;) { - var found = line.text.indexOf(val, pos); - if (found == -1) { - break; - } - pos = found + val.length; - newBreaks.push(Pos(lineNo2, found)); - } - lineNo2++; - }); - for (var i2 = newBreaks.length - 1; i2 >= 0; i2--) { - replaceRange(cm.doc, val, newBreaks[i2], Pos(newBreaks[i2].line, newBreaks[i2].ch + val.length)); - } - }); - option("specialChars", /[\u0000-\u001f\u007f-\u009f\u00ad\u061c\u200b\u200e\u200f\u2028\u2029\ufeff\ufff9-\ufffc]/g, function (cm, val, old) { - cm.state.specialChars = new RegExp(val.source + (val.test(" ") ? "" : "| "), "g"); - if (old != Init) { - cm.refresh(); - } - }); - option("specialCharPlaceholder", defaultSpecialCharPlaceholder, function (cm) { - return cm.refresh(); - }, true); - option("electricChars", true); - option("inputStyle", mobile ? "contenteditable" : "textarea", function () { - throw new Error("inputStyle can not (yet) be changed in a running editor"); - }, true); - option("spellcheck", false, function (cm, val) { - return cm.getInputField().spellcheck = val; - }, true); - option("autocorrect", false, function (cm, val) { - return cm.getInputField().autocorrect = val; - }, true); - option("autocapitalize", false, function (cm, val) { - return cm.getInputField().autocapitalize = val; - }, true); - option("rtlMoveVisually", !windows); - option("wholeLineUpdateBefore", true); - option("theme", "default", function (cm) { - themeChanged(cm); - updateGutters(cm); - }, true); - option("keyMap", "default", function (cm, val, old) { - var next = getKeyMap(val); - var prev = old != Init && getKeyMap(old); - if (prev && prev.detach) { - prev.detach(cm, next); - } - if (next.attach) { - next.attach(cm, prev || null); - } - }); - option("extraKeys", null); - option("configureMouse", null); - option("lineWrapping", false, wrappingChanged, true); - option("gutters", [], function (cm, val) { - cm.display.gutterSpecs = getGutters(val, cm.options.lineNumbers); - updateGutters(cm); - }, true); - option("fixedGutter", true, function (cm, val) { - cm.display.gutters.style.left = val ? compensateForHScroll(cm.display) + "px" : "0"; - cm.refresh(); - }, true); - option("coverGutterNextToScrollbar", false, function (cm) { - return updateScrollbars(cm); - }, true); - option("scrollbarStyle", "native", function (cm) { - initScrollbars(cm); - updateScrollbars(cm); - cm.display.scrollbars.setScrollTop(cm.doc.scrollTop); - cm.display.scrollbars.setScrollLeft(cm.doc.scrollLeft); - }, true); - option("lineNumbers", false, function (cm, val) { - cm.display.gutterSpecs = getGutters(cm.options.gutters, val); - updateGutters(cm); - }, true); - option("firstLineNumber", 1, updateGutters, true); - option("lineNumberFormatter", function (integer) { - return integer; - }, updateGutters, true); - option("showCursorWhenSelecting", false, updateSelection, true); - option("resetSelectionOnContextMenu", true); - option("lineWiseCopyCut", true); - option("pasteLinesPerSelection", true); - option("selectionsMayTouch", false); - option("readOnly", false, function (cm, val) { - if (val == "nocursor") { - onBlur(cm); - cm.display.input.blur(); - } - cm.display.input.readOnlyChanged(val); - }); - option("screenReaderLabel", null, function (cm, val) { - val = val === "" ? null : val; - cm.display.input.screenReaderLabelChanged(val); - }); - option("disableInput", false, function (cm, val) { - if (!val) { - cm.display.input.reset(); - } - }, true); - option("dragDrop", true, dragDropChanged); - option("allowDropFileTypes", null); - option("cursorBlinkRate", 530); - option("cursorScrollMargin", 0); - option("cursorHeight", 1, updateSelection, true); - option("singleCursorHeightPerLine", true, updateSelection, true); - option("workTime", 100); - option("workDelay", 100); - option("flattenSpans", true, resetModeState, true); - option("addModeClass", false, resetModeState, true); - option("pollInterval", 100); - option("undoDepth", 200, function (cm, val) { - return cm.doc.history.undoDepth = val; - }); - option("historyEventDelay", 1250); - option("viewportMargin", 10, function (cm) { - return cm.refresh(); - }, true); - option("maxHighlightLength", 1e4, resetModeState, true); - option("moveInputWithCursor", true, function (cm, val) { - if (!val) { - cm.display.input.resetPosition(); - } - }); - option("tabindex", null, function (cm, val) { - return cm.display.input.getField().tabIndex = val || ""; - }); - option("autofocus", null); - option("direction", "ltr", function (cm, val) { - return cm.doc.setDirection(val); - }, true); - option("phrases", null); - } - function dragDropChanged(cm, value, old) { - var wasOn = old && old != Init; - if (!value != !wasOn) { - var funcs = cm.display.dragFunctions; - var toggle = value ? on : off; - toggle(cm.display.scroller, "dragstart", funcs.start); - toggle(cm.display.scroller, "dragenter", funcs.enter); - toggle(cm.display.scroller, "dragover", funcs.over); - toggle(cm.display.scroller, "dragleave", funcs.leave); - toggle(cm.display.scroller, "drop", funcs.drop); - } - } - function wrappingChanged(cm) { - if (cm.options.lineWrapping) { - addClass(cm.display.wrapper, "CodeMirror-wrap"); - cm.display.sizer.style.minWidth = ""; - cm.display.sizerWidth = null; - } else { - rmClass(cm.display.wrapper, "CodeMirror-wrap"); - findMaxLine(cm); - } - estimateLineHeights(cm); - regChange(cm); - clearCaches(cm); - setTimeout(function () { - return updateScrollbars(cm); - }, 100); - } - function CodeMirror(place, options) { - var this$1$1 = this; - if (!(this instanceof CodeMirror)) { - return new CodeMirror(place, options); - } - this.options = options = options ? copyObj(options) : {}; - copyObj(defaults, options, false); - var doc = options.value; - if (typeof doc == "string") { - doc = new Doc(doc, options.mode, null, options.lineSeparator, options.direction); - } else if (options.mode) { - doc.modeOption = options.mode; - } - this.doc = doc; - var input = new CodeMirror.inputStyles[options.inputStyle](this); - var display = this.display = new Display(place, doc, input, options); - display.wrapper.CodeMirror = this; - themeChanged(this); - if (options.lineWrapping) { - this.display.wrapper.className += " CodeMirror-wrap"; - } - initScrollbars(this); - this.state = { - keyMaps: [], - // stores maps added by addKeyMap - overlays: [], - // highlighting overlays, as added by addOverlay - modeGen: 0, - // bumped when mode/overlay changes, used to invalidate highlighting info - overwrite: false, - delayingBlurEvent: false, - focused: false, - suppressEdits: false, - // used to disable editing during key handlers when in readOnly mode - pasteIncoming: -1, - cutIncoming: -1, - // help recognize paste/cut edits in input.poll - selectingText: false, - draggingText: false, - highlight: new Delayed(), - // stores highlight worker timeout - keySeq: null, - // Unfinished key sequence - specialChars: null - }; - if (options.autofocus && !mobile) { - display.input.focus(); - } - if (ie && ie_version < 11) { - setTimeout(function () { - return this$1$1.display.input.reset(true); - }, 20); - } - registerEventHandlers(this); - ensureGlobalHandlers(); - startOperation(this); - this.curOp.forceUpdate = true; - attachDoc(this, doc); - if (options.autofocus && !mobile || this.hasFocus()) { - setTimeout(function () { - if (this$1$1.hasFocus() && !this$1$1.state.focused) { - onFocus(this$1$1); - } - }, 20); - } else { - onBlur(this); - } - for (var opt in optionHandlers) { - if (optionHandlers.hasOwnProperty(opt)) { - optionHandlers[opt](this, options[opt], Init); - } - } - maybeUpdateLineNumberWidth(this); - if (options.finishInit) { - options.finishInit(this); - } - for (var i2 = 0; i2 < initHooks.length; ++i2) { - initHooks[i2](this); - } - endOperation(this); - if (webkit && options.lineWrapping && getComputedStyle(display.lineDiv).textRendering == "optimizelegibility") { - display.lineDiv.style.textRendering = "auto"; - } - } - CodeMirror.defaults = defaults; - CodeMirror.optionHandlers = optionHandlers; - function registerEventHandlers(cm) { - var d = cm.display; - on(d.scroller, "mousedown", operation(cm, onMouseDown)); - if (ie && ie_version < 11) { - on(d.scroller, "dblclick", operation(cm, function (e) { - if (signalDOMEvent(cm, e)) { - return; - } - var pos = posFromMouse(cm, e); - if (!pos || clickInGutter(cm, e) || eventInWidget(cm.display, e)) { - return; - } - e_preventDefault(e); - var word = cm.findWordAt(pos); - extendSelection(cm.doc, word.anchor, word.head); - })); - } else { - on(d.scroller, "dblclick", function (e) { - return signalDOMEvent(cm, e) || e_preventDefault(e); - }); - } - on(d.scroller, "contextmenu", function (e) { - return onContextMenu(cm, e); - }); - on(d.input.getField(), "contextmenu", function (e) { - if (!d.scroller.contains(e.target)) { - onContextMenu(cm, e); - } - }); - var touchFinished, - prevTouch = { - end: 0 - }; - function finishTouch() { - if (d.activeTouch) { - touchFinished = setTimeout(function () { - return d.activeTouch = null; - }, 1e3); - prevTouch = d.activeTouch; - prevTouch.end = + /* @__PURE__ */new Date(); - } - } - function isMouseLikeTouchEvent(e) { - if (e.touches.length != 1) { - return false; - } - var touch = e.touches[0]; - return touch.radiusX <= 1 && touch.radiusY <= 1; - } - function farAway(touch, other) { - if (other.left == null) { - return true; - } - var dx = other.left - touch.left, - dy = other.top - touch.top; - return dx * dx + dy * dy > 20 * 20; - } - on(d.scroller, "touchstart", function (e) { - if (!signalDOMEvent(cm, e) && !isMouseLikeTouchEvent(e) && !clickInGutter(cm, e)) { - d.input.ensurePolled(); - clearTimeout(touchFinished); - var now = + /* @__PURE__ */new Date(); - d.activeTouch = { - start: now, - moved: false, - prev: now - prevTouch.end <= 300 ? prevTouch : null - }; - if (e.touches.length == 1) { - d.activeTouch.left = e.touches[0].pageX; - d.activeTouch.top = e.touches[0].pageY; - } - } - }); - on(d.scroller, "touchmove", function () { - if (d.activeTouch) { - d.activeTouch.moved = true; - } - }); - on(d.scroller, "touchend", function (e) { - var touch = d.activeTouch; - if (touch && !eventInWidget(d, e) && touch.left != null && !touch.moved && /* @__PURE__ */new Date() - touch.start < 300) { - var pos = cm.coordsChar(d.activeTouch, "page"), - range2; - if (!touch.prev || farAway(touch, touch.prev)) { - range2 = new Range(pos, pos); - } else if (!touch.prev.prev || farAway(touch, touch.prev.prev)) { - range2 = cm.findWordAt(pos); - } else { - range2 = new Range(Pos(pos.line, 0), clipPos(cm.doc, Pos(pos.line + 1, 0))); - } - cm.setSelection(range2.anchor, range2.head); - cm.focus(); - e_preventDefault(e); - } - finishTouch(); - }); - on(d.scroller, "touchcancel", finishTouch); - on(d.scroller, "scroll", function () { - if (d.scroller.clientHeight) { - updateScrollTop(cm, d.scroller.scrollTop); - setScrollLeft(cm, d.scroller.scrollLeft, true); - signal(cm, "scroll", cm); - } - }); - on(d.scroller, "mousewheel", function (e) { - return onScrollWheel(cm, e); - }); - on(d.scroller, "DOMMouseScroll", function (e) { - return onScrollWheel(cm, e); - }); - on(d.wrapper, "scroll", function () { - return d.wrapper.scrollTop = d.wrapper.scrollLeft = 0; - }); - d.dragFunctions = { - enter: function (e) { - if (!signalDOMEvent(cm, e)) { - e_stop(e); - } - }, - over: function (e) { - if (!signalDOMEvent(cm, e)) { - onDragOver(cm, e); - e_stop(e); - } - }, - start: function (e) { - return onDragStart(cm, e); - }, - drop: operation(cm, onDrop), - leave: function (e) { - if (!signalDOMEvent(cm, e)) { - clearDragCursor(cm); - } - } - }; - var inp = d.input.getField(); - on(inp, "keyup", function (e) { - return onKeyUp.call(cm, e); - }); - on(inp, "keydown", operation(cm, onKeyDown)); - on(inp, "keypress", operation(cm, onKeyPress)); - on(inp, "focus", function (e) { - return onFocus(cm, e); - }); - on(inp, "blur", function (e) { - return onBlur(cm, e); - }); - } - var initHooks = []; - CodeMirror.defineInitHook = function (f) { - return initHooks.push(f); - }; - function indentLine(cm, n, how, aggressive) { - var doc = cm.doc, - state; - if (how == null) { - how = "add"; - } - if (how == "smart") { - if (!doc.mode.indent) { - how = "prev"; - } else { - state = getContextBefore(cm, n).state; - } - } - var tabSize = cm.options.tabSize; - var line = getLine(doc, n), - curSpace = countColumn(line.text, null, tabSize); - if (line.stateAfter) { - line.stateAfter = null; - } - var curSpaceString = line.text.match(/^\s*/)[0], - indentation; - if (!aggressive && !/\S/.test(line.text)) { - indentation = 0; - how = "not"; - } else if (how == "smart") { - indentation = doc.mode.indent(state, line.text.slice(curSpaceString.length), line.text); - if (indentation == Pass || indentation > 150) { - if (!aggressive) { - return; - } - how = "prev"; - } - } - if (how == "prev") { - if (n > doc.first) { - indentation = countColumn(getLine(doc, n - 1).text, null, tabSize); - } else { - indentation = 0; - } - } else if (how == "add") { - indentation = curSpace + cm.options.indentUnit; - } else if (how == "subtract") { - indentation = curSpace - cm.options.indentUnit; - } else if (typeof how == "number") { - indentation = curSpace + how; - } - indentation = Math.max(0, indentation); - var indentString = "", - pos = 0; - if (cm.options.indentWithTabs) { - for (var i2 = Math.floor(indentation / tabSize); i2; --i2) { - pos += tabSize; - indentString += " "; - } - } - if (pos < indentation) { - indentString += spaceStr(indentation - pos); - } - if (indentString != curSpaceString) { - replaceRange(doc, indentString, Pos(n, 0), Pos(n, curSpaceString.length), "+input"); - line.stateAfter = null; - return true; - } else { - for (var i$12 = 0; i$12 < doc.sel.ranges.length; i$12++) { - var range2 = doc.sel.ranges[i$12]; - if (range2.head.line == n && range2.head.ch < curSpaceString.length) { - var pos$1 = Pos(n, curSpaceString.length); - replaceOneSelection(doc, i$12, new Range(pos$1, pos$1)); - break; - } - } - } - } - var lastCopied = null; - function setLastCopied(newLastCopied) { - lastCopied = newLastCopied; - } - function applyTextInput(cm, inserted, deleted, sel, origin) { - var doc = cm.doc; - cm.display.shift = false; - if (!sel) { - sel = doc.sel; - } - var recent = + /* @__PURE__ */new Date() - 200; - var paste = origin == "paste" || cm.state.pasteIncoming > recent; - var textLines = splitLinesAuto(inserted), - multiPaste = null; - if (paste && sel.ranges.length > 1) { - if (lastCopied && lastCopied.text.join("\n") == inserted) { - if (sel.ranges.length % lastCopied.text.length == 0) { - multiPaste = []; - for (var i2 = 0; i2 < lastCopied.text.length; i2++) { - multiPaste.push(doc.splitLines(lastCopied.text[i2])); - } - } - } else if (textLines.length == sel.ranges.length && cm.options.pasteLinesPerSelection) { - multiPaste = map(textLines, function (l) { - return [l]; - }); - } - } - var updateInput = cm.curOp.updateInput; - for (var i$12 = sel.ranges.length - 1; i$12 >= 0; i$12--) { - var range2 = sel.ranges[i$12]; - var from = range2.from(), - to = range2.to(); - if (range2.empty()) { - if (deleted && deleted > 0) { - from = Pos(from.line, from.ch - deleted); - } else if (cm.state.overwrite && !paste) { - to = Pos(to.line, Math.min(getLine(doc, to.line).text.length, to.ch + lst(textLines).length)); - } else if (paste && lastCopied && lastCopied.lineWise && lastCopied.text.join("\n") == textLines.join("\n")) { - from = to = Pos(from.line, 0); - } - } - var changeEvent = { - from, - to, - text: multiPaste ? multiPaste[i$12 % multiPaste.length] : textLines, - origin: origin || (paste ? "paste" : cm.state.cutIncoming > recent ? "cut" : "+input") - }; - makeChange(cm.doc, changeEvent); - signalLater(cm, "inputRead", cm, changeEvent); - } - if (inserted && !paste) { - triggerElectric(cm, inserted); - } - ensureCursorVisible(cm); - if (cm.curOp.updateInput < 2) { - cm.curOp.updateInput = updateInput; - } - cm.curOp.typing = true; - cm.state.pasteIncoming = cm.state.cutIncoming = -1; - } - function handlePaste(e, cm) { - var pasted = e.clipboardData && e.clipboardData.getData("Text"); - if (pasted) { - e.preventDefault(); - if (!cm.isReadOnly() && !cm.options.disableInput) { - runInOp(cm, function () { - return applyTextInput(cm, pasted, 0, null, "paste"); - }); - } - return true; - } - } - function triggerElectric(cm, inserted) { - if (!cm.options.electricChars || !cm.options.smartIndent) { - return; - } - var sel = cm.doc.sel; - for (var i2 = sel.ranges.length - 1; i2 >= 0; i2--) { - var range2 = sel.ranges[i2]; - if (range2.head.ch > 100 || i2 && sel.ranges[i2 - 1].head.line == range2.head.line) { - continue; - } - var mode = cm.getModeAt(range2.head); - var indented = false; - if (mode.electricChars) { - for (var j = 0; j < mode.electricChars.length; j++) { - if (inserted.indexOf(mode.electricChars.charAt(j)) > -1) { - indented = indentLine(cm, range2.head.line, "smart"); - break; - } - } - } else if (mode.electricInput) { - if (mode.electricInput.test(getLine(cm.doc, range2.head.line).text.slice(0, range2.head.ch))) { - indented = indentLine(cm, range2.head.line, "smart"); - } - } - if (indented) { - signalLater(cm, "electricInput", cm, range2.head.line); - } - } - } - function copyableRanges(cm) { - var text = [], - ranges = []; - for (var i2 = 0; i2 < cm.doc.sel.ranges.length; i2++) { - var line = cm.doc.sel.ranges[i2].head.line; - var lineRange = { - anchor: Pos(line, 0), - head: Pos(line + 1, 0) - }; - ranges.push(lineRange); - text.push(cm.getRange(lineRange.anchor, lineRange.head)); - } - return { - text, - ranges - }; - } - function disableBrowserMagic(field, spellcheck, autocorrect, autocapitalize) { - field.setAttribute("autocorrect", autocorrect ? "" : "off"); - field.setAttribute("autocapitalize", autocapitalize ? "" : "off"); - field.setAttribute("spellcheck", !!spellcheck); - } - function hiddenTextarea() { - var te = elt("textarea", null, null, "position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; min-height: 1em; outline: none"); - var div = elt("div", [te], null, "overflow: hidden; position: relative; width: 3px; height: 0px;"); - if (webkit) { - te.style.width = "1000px"; - } else { - te.setAttribute("wrap", "off"); - } - if (ios) { - te.style.border = "1px solid black"; - } - disableBrowserMagic(te); - return div; - } - function addEditorMethods(CodeMirror2) { - var optionHandlers2 = CodeMirror2.optionHandlers; - var helpers = CodeMirror2.helpers = {}; - CodeMirror2.prototype = { - constructor: CodeMirror2, - focus: function () { - window.focus(); - this.display.input.focus(); - }, - setOption: function (option, value) { - var options = this.options, - old = options[option]; - if (options[option] == value && option != "mode") { - return; - } - options[option] = value; - if (optionHandlers2.hasOwnProperty(option)) { - operation(this, optionHandlers2[option])(this, value, old); - } - signal(this, "optionChange", this, option); - }, - getOption: function (option) { - return this.options[option]; - }, - getDoc: function () { - return this.doc; - }, - addKeyMap: function (map2, bottom) { - this.state.keyMaps[bottom ? "push" : "unshift"](getKeyMap(map2)); - }, - removeKeyMap: function (map2) { - var maps = this.state.keyMaps; - for (var i2 = 0; i2 < maps.length; ++i2) { - if (maps[i2] == map2 || maps[i2].name == map2) { - maps.splice(i2, 1); - return true; - } - } - }, - addOverlay: methodOp(function (spec, options) { - var mode = spec.token ? spec : CodeMirror2.getMode(this.options, spec); - if (mode.startState) { - throw new Error("Overlays may not be stateful."); - } - insertSorted(this.state.overlays, { - mode, - modeSpec: spec, - opaque: options && options.opaque, - priority: options && options.priority || 0 - }, function (overlay) { - return overlay.priority; - }); - this.state.modeGen++; - regChange(this); - }), - removeOverlay: methodOp(function (spec) { - var overlays = this.state.overlays; - for (var i2 = 0; i2 < overlays.length; ++i2) { - var cur = overlays[i2].modeSpec; - if (cur == spec || typeof spec == "string" && cur.name == spec) { - overlays.splice(i2, 1); - this.state.modeGen++; - regChange(this); - return; - } - } - }), - indentLine: methodOp(function (n, dir, aggressive) { - if (typeof dir != "string" && typeof dir != "number") { - if (dir == null) { - dir = this.options.smartIndent ? "smart" : "prev"; - } else { - dir = dir ? "add" : "subtract"; - } - } - if (isLine(this.doc, n)) { - indentLine(this, n, dir, aggressive); - } - }), - indentSelection: methodOp(function (how) { - var ranges = this.doc.sel.ranges, - end = -1; - for (var i2 = 0; i2 < ranges.length; i2++) { - var range2 = ranges[i2]; - if (!range2.empty()) { - var from = range2.from(), - to = range2.to(); - var start = Math.max(end, from.line); - end = Math.min(this.lastLine(), to.line - (to.ch ? 0 : 1)) + 1; - for (var j = start; j < end; ++j) { - indentLine(this, j, how); - } - var newRanges = this.doc.sel.ranges; - if (from.ch == 0 && ranges.length == newRanges.length && newRanges[i2].from().ch > 0) { - replaceOneSelection(this.doc, i2, new Range(from, newRanges[i2].to()), sel_dontScroll); - } - } else if (range2.head.line > end) { - indentLine(this, range2.head.line, how, true); - end = range2.head.line; - if (i2 == this.doc.sel.primIndex) { - ensureCursorVisible(this); - } - } - } - }), - // Fetch the parser token for a given character. Useful for hacks - // that want to inspect the mode state (say, for completion). - getTokenAt: function (pos, precise) { - return takeToken(this, pos, precise); - }, - getLineTokens: function (line, precise) { - return takeToken(this, Pos(line), precise, true); - }, - getTokenTypeAt: function (pos) { - pos = clipPos(this.doc, pos); - var styles = getLineStyles(this, getLine(this.doc, pos.line)); - var before = 0, - after = (styles.length - 1) / 2, - ch = pos.ch; - var type; - if (ch == 0) { - type = styles[2]; - } else { - for (;;) { - var mid = before + after >> 1; - if ((mid ? styles[mid * 2 - 1] : 0) >= ch) { - after = mid; - } else if (styles[mid * 2 + 1] < ch) { - before = mid + 1; - } else { - type = styles[mid * 2 + 2]; - break; - } - } - } - var cut = type ? type.indexOf("overlay ") : -1; - return cut < 0 ? type : cut == 0 ? null : type.slice(0, cut - 1); - }, - getModeAt: function (pos) { - var mode = this.doc.mode; - if (!mode.innerMode) { - return mode; - } - return CodeMirror2.innerMode(mode, this.getTokenAt(pos).state).mode; - }, - getHelper: function (pos, type) { - return this.getHelpers(pos, type)[0]; - }, - getHelpers: function (pos, type) { - var found = []; - if (!helpers.hasOwnProperty(type)) { - return found; - } - var help = helpers[type], - mode = this.getModeAt(pos); - if (typeof mode[type] == "string") { - if (help[mode[type]]) { - found.push(help[mode[type]]); - } - } else if (mode[type]) { - for (var i2 = 0; i2 < mode[type].length; i2++) { - var val = help[mode[type][i2]]; - if (val) { - found.push(val); - } - } - } else if (mode.helperType && help[mode.helperType]) { - found.push(help[mode.helperType]); - } else if (help[mode.name]) { - found.push(help[mode.name]); - } - for (var i$12 = 0; i$12 < help._global.length; i$12++) { - var cur = help._global[i$12]; - if (cur.pred(mode, this) && indexOf(found, cur.val) == -1) { - found.push(cur.val); - } - } - return found; - }, - getStateAfter: function (line, precise) { - var doc = this.doc; - line = clipLine(doc, line == null ? doc.first + doc.size - 1 : line); - return getContextBefore(this, line + 1, precise).state; - }, - cursorCoords: function (start, mode) { - var pos, - range2 = this.doc.sel.primary(); - if (start == null) { - pos = range2.head; - } else if (typeof start == "object") { - pos = clipPos(this.doc, start); - } else { - pos = start ? range2.from() : range2.to(); - } - return cursorCoords(this, pos, mode || "page"); - }, - charCoords: function (pos, mode) { - return charCoords(this, clipPos(this.doc, pos), mode || "page"); - }, - coordsChar: function (coords, mode) { - coords = fromCoordSystem(this, coords, mode || "page"); - return coordsChar(this, coords.left, coords.top); - }, - lineAtHeight: function (height, mode) { - height = fromCoordSystem(this, { - top: height, - left: 0 - }, mode || "page").top; - return lineAtHeight(this.doc, height + this.display.viewOffset); - }, - heightAtLine: function (line, mode, includeWidgets) { - var end = false, - lineObj; - if (typeof line == "number") { - var last = this.doc.first + this.doc.size - 1; - if (line < this.doc.first) { - line = this.doc.first; - } else if (line > last) { - line = last; - end = true; - } - lineObj = getLine(this.doc, line); - } else { - lineObj = line; - } - return intoCoordSystem(this, lineObj, { - top: 0, - left: 0 - }, mode || "page", includeWidgets || end).top + (end ? this.doc.height - heightAtLine(lineObj) : 0); - }, - defaultTextHeight: function () { - return textHeight(this.display); - }, - defaultCharWidth: function () { - return charWidth(this.display); - }, - getViewport: function () { - return { - from: this.display.viewFrom, - to: this.display.viewTo - }; - }, - addWidget: function (pos, node, scroll, vert, horiz) { - var display = this.display; - pos = cursorCoords(this, clipPos(this.doc, pos)); - var top = pos.bottom, - left = pos.left; - node.style.position = "absolute"; - node.setAttribute("cm-ignore-events", "true"); - this.display.input.setUneditable(node); - display.sizer.appendChild(node); - if (vert == "over") { - top = pos.top; - } else if (vert == "above" || vert == "near") { - var vspace = Math.max(display.wrapper.clientHeight, this.doc.height), - hspace = Math.max(display.sizer.clientWidth, display.lineSpace.clientWidth); - if ((vert == "above" || pos.bottom + node.offsetHeight > vspace) && pos.top > node.offsetHeight) { - top = pos.top - node.offsetHeight; - } else if (pos.bottom + node.offsetHeight <= vspace) { - top = pos.bottom; - } - if (left + node.offsetWidth > hspace) { - left = hspace - node.offsetWidth; - } - } - node.style.top = top + "px"; - node.style.left = node.style.right = ""; - if (horiz == "right") { - left = display.sizer.clientWidth - node.offsetWidth; - node.style.right = "0px"; - } else { - if (horiz == "left") { - left = 0; - } else if (horiz == "middle") { - left = (display.sizer.clientWidth - node.offsetWidth) / 2; - } - node.style.left = left + "px"; - } - if (scroll) { - scrollIntoView(this, { - left, - top, - right: left + node.offsetWidth, - bottom: top + node.offsetHeight - }); - } - }, - triggerOnKeyDown: methodOp(onKeyDown), - triggerOnKeyPress: methodOp(onKeyPress), - triggerOnKeyUp: onKeyUp, - triggerOnMouseDown: methodOp(onMouseDown), - execCommand: function (cmd) { - if (commands.hasOwnProperty(cmd)) { - return commands[cmd].call(null, this); - } - }, - triggerElectric: methodOp(function (text) { - triggerElectric(this, text); - }), - findPosH: function (from, amount, unit, visually) { - var dir = 1; - if (amount < 0) { - dir = -1; - amount = -amount; - } - var cur = clipPos(this.doc, from); - for (var i2 = 0; i2 < amount; ++i2) { - cur = findPosH(this.doc, cur, dir, unit, visually); - if (cur.hitSide) { - break; - } - } - return cur; - }, - moveH: methodOp(function (dir, unit) { - var this$1$1 = this; - this.extendSelectionsBy(function (range2) { - if (this$1$1.display.shift || this$1$1.doc.extend || range2.empty()) { - return findPosH(this$1$1.doc, range2.head, dir, unit, this$1$1.options.rtlMoveVisually); - } else { - return dir < 0 ? range2.from() : range2.to(); - } - }, sel_move); - }), - deleteH: methodOp(function (dir, unit) { - var sel = this.doc.sel, - doc = this.doc; - if (sel.somethingSelected()) { - doc.replaceSelection("", null, "+delete"); - } else { - deleteNearSelection(this, function (range2) { - var other = findPosH(doc, range2.head, dir, unit, false); - return dir < 0 ? { - from: other, - to: range2.head - } : { - from: range2.head, - to: other - }; - }); - } - }), - findPosV: function (from, amount, unit, goalColumn) { - var dir = 1, - x = goalColumn; - if (amount < 0) { - dir = -1; - amount = -amount; - } - var cur = clipPos(this.doc, from); - for (var i2 = 0; i2 < amount; ++i2) { - var coords = cursorCoords(this, cur, "div"); - if (x == null) { - x = coords.left; - } else { - coords.left = x; - } - cur = findPosV(this, coords, dir, unit); - if (cur.hitSide) { - break; - } - } - return cur; - }, - moveV: methodOp(function (dir, unit) { - var this$1$1 = this; - var doc = this.doc, - goals = []; - var collapse = !this.display.shift && !doc.extend && doc.sel.somethingSelected(); - doc.extendSelectionsBy(function (range2) { - if (collapse) { - return dir < 0 ? range2.from() : range2.to(); - } - var headPos = cursorCoords(this$1$1, range2.head, "div"); - if (range2.goalColumn != null) { - headPos.left = range2.goalColumn; - } - goals.push(headPos.left); - var pos = findPosV(this$1$1, headPos, dir, unit); - if (unit == "page" && range2 == doc.sel.primary()) { - addToScrollTop(this$1$1, charCoords(this$1$1, pos, "div").top - headPos.top); - } - return pos; - }, sel_move); - if (goals.length) { - for (var i2 = 0; i2 < doc.sel.ranges.length; i2++) { - doc.sel.ranges[i2].goalColumn = goals[i2]; - } - } - }), - // Find the word at the given position (as returned by coordsChar). - findWordAt: function (pos) { - var doc = this.doc, - line = getLine(doc, pos.line).text; - var start = pos.ch, - end = pos.ch; - if (line) { - var helper = this.getHelper(pos, "wordChars"); - if ((pos.sticky == "before" || end == line.length) && start) { - --start; - } else { - ++end; - } - var startChar = line.charAt(start); - var check = isWordChar(startChar, helper) ? function (ch) { - return isWordChar(ch, helper); - } : /\s/.test(startChar) ? function (ch) { - return /\s/.test(ch); - } : function (ch) { - return !/\s/.test(ch) && !isWordChar(ch); - }; - while (start > 0 && check(line.charAt(start - 1))) { - --start; - } - while (end < line.length && check(line.charAt(end))) { - ++end; - } - } - return new Range(Pos(pos.line, start), Pos(pos.line, end)); - }, - toggleOverwrite: function (value) { - if (value != null && value == this.state.overwrite) { - return; - } - if (this.state.overwrite = !this.state.overwrite) { - addClass(this.display.cursorDiv, "CodeMirror-overwrite"); - } else { - rmClass(this.display.cursorDiv, "CodeMirror-overwrite"); - } - signal(this, "overwriteToggle", this, this.state.overwrite); - }, - hasFocus: function () { - return this.display.input.getField() == activeElt(); - }, - isReadOnly: function () { - return !!(this.options.readOnly || this.doc.cantEdit); - }, - scrollTo: methodOp(function (x, y) { - scrollToCoords(this, x, y); - }), - getScrollInfo: function () { - var scroller = this.display.scroller; - return { - left: scroller.scrollLeft, - top: scroller.scrollTop, - height: scroller.scrollHeight - scrollGap(this) - this.display.barHeight, - width: scroller.scrollWidth - scrollGap(this) - this.display.barWidth, - clientHeight: displayHeight(this), - clientWidth: displayWidth(this) - }; - }, - scrollIntoView: methodOp(function (range2, margin) { - if (range2 == null) { - range2 = { - from: this.doc.sel.primary().head, - to: null - }; - if (margin == null) { - margin = this.options.cursorScrollMargin; - } - } else if (typeof range2 == "number") { - range2 = { - from: Pos(range2, 0), - to: null - }; - } else if (range2.from == null) { - range2 = { - from: range2, - to: null - }; - } - if (!range2.to) { - range2.to = range2.from; - } - range2.margin = margin || 0; - if (range2.from.line != null) { - scrollToRange(this, range2); - } else { - scrollToCoordsRange(this, range2.from, range2.to, range2.margin); - } - }), - setSize: methodOp(function (width, height) { - var this$1$1 = this; - var interpret = function (val) { - return typeof val == "number" || /^\d+$/.test(String(val)) ? val + "px" : val; - }; - if (width != null) { - this.display.wrapper.style.width = interpret(width); - } - if (height != null) { - this.display.wrapper.style.height = interpret(height); - } - if (this.options.lineWrapping) { - clearLineMeasurementCache(this); - } - var lineNo2 = this.display.viewFrom; - this.doc.iter(lineNo2, this.display.viewTo, function (line) { - if (line.widgets) { - for (var i2 = 0; i2 < line.widgets.length; i2++) { - if (line.widgets[i2].noHScroll) { - regLineChange(this$1$1, lineNo2, "widget"); - break; - } - } - } - ++lineNo2; - }); - this.curOp.forceUpdate = true; - signal(this, "refresh", this); - }), - operation: function (f) { - return runInOp(this, f); - }, - startOperation: function () { - return startOperation(this); - }, - endOperation: function () { - return endOperation(this); - }, - refresh: methodOp(function () { - var oldHeight = this.display.cachedTextHeight; - regChange(this); - this.curOp.forceUpdate = true; - clearCaches(this); - scrollToCoords(this, this.doc.scrollLeft, this.doc.scrollTop); - updateGutterSpace(this.display); - if (oldHeight == null || Math.abs(oldHeight - textHeight(this.display)) > 0.5 || this.options.lineWrapping) { - estimateLineHeights(this); - } - signal(this, "refresh", this); - }), - swapDoc: methodOp(function (doc) { - var old = this.doc; - old.cm = null; - if (this.state.selectingText) { - this.state.selectingText(); - } - attachDoc(this, doc); - clearCaches(this); - this.display.input.reset(); - scrollToCoords(this, doc.scrollLeft, doc.scrollTop); - this.curOp.forceScroll = true; - signalLater(this, "swapDoc", this, old); - return old; - }), - phrase: function (phraseText) { - var phrases = this.options.phrases; - return phrases && Object.prototype.hasOwnProperty.call(phrases, phraseText) ? phrases[phraseText] : phraseText; - }, - getInputField: function () { - return this.display.input.getField(); - }, - getWrapperElement: function () { - return this.display.wrapper; - }, - getScrollerElement: function () { - return this.display.scroller; - }, - getGutterElement: function () { - return this.display.gutters; - } - }; - eventMixin(CodeMirror2); - CodeMirror2.registerHelper = function (type, name, value) { - if (!helpers.hasOwnProperty(type)) { - helpers[type] = CodeMirror2[type] = { - _global: [] - }; - } - helpers[type][name] = value; - }; - CodeMirror2.registerGlobalHelper = function (type, name, predicate, value) { - CodeMirror2.registerHelper(type, name, value); - helpers[type]._global.push({ - pred: predicate, - val: value - }); - }; - } - function findPosH(doc, pos, dir, unit, visually) { - var oldPos = pos; - var origDir = dir; - var lineObj = getLine(doc, pos.line); - var lineDir = visually && doc.direction == "rtl" ? -dir : dir; - function findNextLine() { - var l = pos.line + lineDir; - if (l < doc.first || l >= doc.first + doc.size) { - return false; - } - pos = new Pos(l, pos.ch, pos.sticky); - return lineObj = getLine(doc, l); - } - function moveOnce(boundToLine) { - var next; - if (unit == "codepoint") { - var ch = lineObj.text.charCodeAt(pos.ch + (dir > 0 ? 0 : -1)); - if (isNaN(ch)) { - next = null; - } else { - var astral = dir > 0 ? ch >= 55296 && ch < 56320 : ch >= 56320 && ch < 57343; - next = new Pos(pos.line, Math.max(0, Math.min(lineObj.text.length, pos.ch + dir * (astral ? 2 : 1))), -dir); - } - } else if (visually) { - next = moveVisually(doc.cm, lineObj, pos, dir); - } else { - next = moveLogically(lineObj, pos, dir); - } - if (next == null) { - if (!boundToLine && findNextLine()) { - pos = endOfLine(visually, doc.cm, lineObj, pos.line, lineDir); - } else { - return false; - } - } else { - pos = next; - } - return true; - } - if (unit == "char" || unit == "codepoint") { - moveOnce(); - } else if (unit == "column") { - moveOnce(true); - } else if (unit == "word" || unit == "group") { - var sawType = null, - group = unit == "group"; - var helper = doc.cm && doc.cm.getHelper(pos, "wordChars"); - for (var first = true;; first = false) { - if (dir < 0 && !moveOnce(!first)) { - break; - } - var cur = lineObj.text.charAt(pos.ch) || "\n"; - var type = isWordChar(cur, helper) ? "w" : group && cur == "\n" ? "n" : !group || /\s/.test(cur) ? null : "p"; - if (group && !first && !type) { - type = "s"; - } - if (sawType && sawType != type) { - if (dir < 0) { - dir = 1; - moveOnce(); - pos.sticky = "after"; - } - break; - } - if (type) { - sawType = type; - } - if (dir > 0 && !moveOnce(!first)) { - break; - } - } - } - var result = skipAtomic(doc, pos, oldPos, origDir, true); - if (equalCursorPos(oldPos, result)) { - result.hitSide = true; - } - return result; - } - function findPosV(cm, pos, dir, unit) { - var doc = cm.doc, - x = pos.left, - y; - if (unit == "page") { - var pageSize = Math.min(cm.display.wrapper.clientHeight, window.innerHeight || document.documentElement.clientHeight); - var moveAmount = Math.max(pageSize - 0.5 * textHeight(cm.display), 3); - y = (dir > 0 ? pos.bottom : pos.top) + dir * moveAmount; - } else if (unit == "line") { - y = dir > 0 ? pos.bottom + 3 : pos.top - 3; - } - var target; - for (;;) { - target = coordsChar(cm, x, y); - if (!target.outside) { - break; - } - if (dir < 0 ? y <= 0 : y >= doc.height) { - target.hitSide = true; - break; - } - y += dir * 5; - } - return target; - } - var ContentEditableInput = function (cm) { - this.cm = cm; - this.lastAnchorNode = this.lastAnchorOffset = this.lastFocusNode = this.lastFocusOffset = null; - this.polling = new Delayed(); - this.composing = null; - this.gracePeriod = false; - this.readDOMTimeout = null; - }; - ContentEditableInput.prototype.init = function (display) { - var this$1$1 = this; - var input = this, - cm = input.cm; - var div = input.div = display.lineDiv; - div.contentEditable = true; - disableBrowserMagic(div, cm.options.spellcheck, cm.options.autocorrect, cm.options.autocapitalize); - function belongsToInput(e) { - for (var t = e.target; t; t = t.parentNode) { - if (t == div) { - return true; - } - if (/\bCodeMirror-(?:line)?widget\b/.test(t.className)) { - break; - } - } - return false; - } - on(div, "paste", function (e) { - if (!belongsToInput(e) || signalDOMEvent(cm, e) || handlePaste(e, cm)) { - return; - } - if (ie_version <= 11) { - setTimeout(operation(cm, function () { - return this$1$1.updateFromDOM(); - }), 20); - } - }); - on(div, "compositionstart", function (e) { - this$1$1.composing = { - data: e.data, - done: false - }; - }); - on(div, "compositionupdate", function (e) { - if (!this$1$1.composing) { - this$1$1.composing = { - data: e.data, - done: false - }; - } - }); - on(div, "compositionend", function (e) { - if (this$1$1.composing) { - if (e.data != this$1$1.composing.data) { - this$1$1.readFromDOMSoon(); - } - this$1$1.composing.done = true; - } - }); - on(div, "touchstart", function () { - return input.forceCompositionEnd(); - }); - on(div, "input", function () { - if (!this$1$1.composing) { - this$1$1.readFromDOMSoon(); - } - }); - function onCopyCut(e) { - if (!belongsToInput(e) || signalDOMEvent(cm, e)) { - return; - } - if (cm.somethingSelected()) { - setLastCopied({ - lineWise: false, - text: cm.getSelections() - }); - if (e.type == "cut") { - cm.replaceSelection("", null, "cut"); - } - } else if (!cm.options.lineWiseCopyCut) { - return; - } else { - var ranges = copyableRanges(cm); - setLastCopied({ - lineWise: true, - text: ranges.text - }); - if (e.type == "cut") { - cm.operation(function () { - cm.setSelections(ranges.ranges, 0, sel_dontScroll); - cm.replaceSelection("", null, "cut"); - }); - } - } - if (e.clipboardData) { - e.clipboardData.clearData(); - var content = lastCopied.text.join("\n"); - e.clipboardData.setData("Text", content); - if (e.clipboardData.getData("Text") == content) { - e.preventDefault(); - return; - } - } - var kludge = hiddenTextarea(), - te = kludge.firstChild; - cm.display.lineSpace.insertBefore(kludge, cm.display.lineSpace.firstChild); - te.value = lastCopied.text.join("\n"); - var hadFocus = activeElt(); - selectInput(te); - setTimeout(function () { - cm.display.lineSpace.removeChild(kludge); - hadFocus.focus(); - if (hadFocus == div) { - input.showPrimarySelection(); - } - }, 50); - } - on(div, "copy", onCopyCut); - on(div, "cut", onCopyCut); - }; - ContentEditableInput.prototype.screenReaderLabelChanged = function (label) { - if (label) { - this.div.setAttribute("aria-label", label); - } else { - this.div.removeAttribute("aria-label"); - } - }; - ContentEditableInput.prototype.prepareSelection = function () { - var result = prepareSelection(this.cm, false); - result.focus = activeElt() == this.div; - return result; - }; - ContentEditableInput.prototype.showSelection = function (info, takeFocus) { - if (!info || !this.cm.display.view.length) { - return; - } - if (info.focus || takeFocus) { - this.showPrimarySelection(); - } - this.showMultipleSelections(info); - }; - ContentEditableInput.prototype.getSelection = function () { - return this.cm.display.wrapper.ownerDocument.getSelection(); - }; - ContentEditableInput.prototype.showPrimarySelection = function () { - var sel = this.getSelection(), - cm = this.cm, - prim = cm.doc.sel.primary(); - var from = prim.from(), - to = prim.to(); - if (cm.display.viewTo == cm.display.viewFrom || from.line >= cm.display.viewTo || to.line < cm.display.viewFrom) { - sel.removeAllRanges(); - return; - } - var curAnchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var curFocus = domToPos(cm, sel.focusNode, sel.focusOffset); - if (curAnchor && !curAnchor.bad && curFocus && !curFocus.bad && cmp(minPos(curAnchor, curFocus), from) == 0 && cmp(maxPos(curAnchor, curFocus), to) == 0) { - return; - } - var view = cm.display.view; - var start = from.line >= cm.display.viewFrom && posToDOM(cm, from) || { - node: view[0].measure.map[2], - offset: 0 - }; - var end = to.line < cm.display.viewTo && posToDOM(cm, to); - if (!end) { - var measure = view[view.length - 1].measure; - var map2 = measure.maps ? measure.maps[measure.maps.length - 1] : measure.map; - end = { - node: map2[map2.length - 1], - offset: map2[map2.length - 2] - map2[map2.length - 3] - }; - } - if (!start || !end) { - sel.removeAllRanges(); - return; - } - var old = sel.rangeCount && sel.getRangeAt(0), - rng; - try { - rng = range(start.node, start.offset, end.offset, end.node); - } catch (e) {} - if (rng) { - if (!gecko && cm.state.focused) { - sel.collapse(start.node, start.offset); - if (!rng.collapsed) { - sel.removeAllRanges(); - sel.addRange(rng); - } - } else { - sel.removeAllRanges(); - sel.addRange(rng); - } - if (old && sel.anchorNode == null) { - sel.addRange(old); - } else if (gecko) { - this.startGracePeriod(); - } - } - this.rememberSelection(); - }; - ContentEditableInput.prototype.startGracePeriod = function () { - var this$1$1 = this; - clearTimeout(this.gracePeriod); - this.gracePeriod = setTimeout(function () { - this$1$1.gracePeriod = false; - if (this$1$1.selectionChanged()) { - this$1$1.cm.operation(function () { - return this$1$1.cm.curOp.selectionChanged = true; - }); - } - }, 20); - }; - ContentEditableInput.prototype.showMultipleSelections = function (info) { - removeChildrenAndAdd(this.cm.display.cursorDiv, info.cursors); - removeChildrenAndAdd(this.cm.display.selectionDiv, info.selection); - }; - ContentEditableInput.prototype.rememberSelection = function () { - var sel = this.getSelection(); - this.lastAnchorNode = sel.anchorNode; - this.lastAnchorOffset = sel.anchorOffset; - this.lastFocusNode = sel.focusNode; - this.lastFocusOffset = sel.focusOffset; - }; - ContentEditableInput.prototype.selectionInEditor = function () { - var sel = this.getSelection(); - if (!sel.rangeCount) { - return false; - } - var node = sel.getRangeAt(0).commonAncestorContainer; - return contains(this.div, node); - }; - ContentEditableInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor") { - if (!this.selectionInEditor() || activeElt() != this.div) { - this.showSelection(this.prepareSelection(), true); - } - this.div.focus(); - } - }; - ContentEditableInput.prototype.blur = function () { - this.div.blur(); - }; - ContentEditableInput.prototype.getField = function () { - return this.div; - }; - ContentEditableInput.prototype.supportsTouch = function () { - return true; - }; - ContentEditableInput.prototype.receivedFocus = function () { - var this$1$1 = this; - var input = this; - if (this.selectionInEditor()) { - setTimeout(function () { - return this$1$1.pollSelection(); - }, 20); - } else { - runInOp(this.cm, function () { - return input.cm.curOp.selectionChanged = true; - }); - } - function poll() { - if (input.cm.state.focused) { - input.pollSelection(); - input.polling.set(input.cm.options.pollInterval, poll); - } - } - this.polling.set(this.cm.options.pollInterval, poll); - }; - ContentEditableInput.prototype.selectionChanged = function () { - var sel = this.getSelection(); - return sel.anchorNode != this.lastAnchorNode || sel.anchorOffset != this.lastAnchorOffset || sel.focusNode != this.lastFocusNode || sel.focusOffset != this.lastFocusOffset; - }; - ContentEditableInput.prototype.pollSelection = function () { - if (this.readDOMTimeout != null || this.gracePeriod || !this.selectionChanged()) { - return; - } - var sel = this.getSelection(), - cm = this.cm; - if (android && chrome && this.cm.display.gutterSpecs.length && isInGutter(sel.anchorNode)) { - this.cm.triggerOnKeyDown({ - type: "keydown", - keyCode: 8, - preventDefault: Math.abs - }); - this.blur(); - this.focus(); - return; - } - if (this.composing) { - return; - } - this.rememberSelection(); - var anchor = domToPos(cm, sel.anchorNode, sel.anchorOffset); - var head = domToPos(cm, sel.focusNode, sel.focusOffset); - if (anchor && head) { - runInOp(cm, function () { - setSelection(cm.doc, simpleSelection(anchor, head), sel_dontScroll); - if (anchor.bad || head.bad) { - cm.curOp.selectionChanged = true; - } - }); - } - }; - ContentEditableInput.prototype.pollContent = function () { - if (this.readDOMTimeout != null) { - clearTimeout(this.readDOMTimeout); - this.readDOMTimeout = null; - } - var cm = this.cm, - display = cm.display, - sel = cm.doc.sel.primary(); - var from = sel.from(), - to = sel.to(); - if (from.ch == 0 && from.line > cm.firstLine()) { - from = Pos(from.line - 1, getLine(cm.doc, from.line - 1).length); - } - if (to.ch == getLine(cm.doc, to.line).text.length && to.line < cm.lastLine()) { - to = Pos(to.line + 1, 0); - } - if (from.line < display.viewFrom || to.line > display.viewTo - 1) { - return false; - } - var fromIndex, fromLine, fromNode; - if (from.line == display.viewFrom || (fromIndex = findViewIndex(cm, from.line)) == 0) { - fromLine = lineNo(display.view[0].line); - fromNode = display.view[0].node; - } else { - fromLine = lineNo(display.view[fromIndex].line); - fromNode = display.view[fromIndex - 1].node.nextSibling; - } - var toIndex = findViewIndex(cm, to.line); - var toLine, toNode; - if (toIndex == display.view.length - 1) { - toLine = display.viewTo - 1; - toNode = display.lineDiv.lastChild; - } else { - toLine = lineNo(display.view[toIndex + 1].line) - 1; - toNode = display.view[toIndex + 1].node.previousSibling; - } - if (!fromNode) { - return false; - } - var newText = cm.doc.splitLines(domTextBetween(cm, fromNode, toNode, fromLine, toLine)); - var oldText = getBetween(cm.doc, Pos(fromLine, 0), Pos(toLine, getLine(cm.doc, toLine).text.length)); - while (newText.length > 1 && oldText.length > 1) { - if (lst(newText) == lst(oldText)) { - newText.pop(); - oldText.pop(); - toLine--; - } else if (newText[0] == oldText[0]) { - newText.shift(); - oldText.shift(); - fromLine++; - } else { - break; - } - } - var cutFront = 0, - cutEnd = 0; - var newTop = newText[0], - oldTop = oldText[0], - maxCutFront = Math.min(newTop.length, oldTop.length); - while (cutFront < maxCutFront && newTop.charCodeAt(cutFront) == oldTop.charCodeAt(cutFront)) { - ++cutFront; - } - var newBot = lst(newText), - oldBot = lst(oldText); - var maxCutEnd = Math.min(newBot.length - (newText.length == 1 ? cutFront : 0), oldBot.length - (oldText.length == 1 ? cutFront : 0)); - while (cutEnd < maxCutEnd && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { - ++cutEnd; - } - if (newText.length == 1 && oldText.length == 1 && fromLine == from.line) { - while (cutFront && cutFront > from.ch && newBot.charCodeAt(newBot.length - cutEnd - 1) == oldBot.charCodeAt(oldBot.length - cutEnd - 1)) { - cutFront--; - cutEnd++; - } - } - newText[newText.length - 1] = newBot.slice(0, newBot.length - cutEnd).replace(/^\u200b+/, ""); - newText[0] = newText[0].slice(cutFront).replace(/\u200b+$/, ""); - var chFrom = Pos(fromLine, cutFront); - var chTo = Pos(toLine, oldText.length ? lst(oldText).length - cutEnd : 0); - if (newText.length > 1 || newText[0] || cmp(chFrom, chTo)) { - replaceRange(cm.doc, newText, chFrom, chTo, "+input"); - return true; - } - }; - ContentEditableInput.prototype.ensurePolled = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.reset = function () { - this.forceCompositionEnd(); - }; - ContentEditableInput.prototype.forceCompositionEnd = function () { - if (!this.composing) { - return; - } - clearTimeout(this.readDOMTimeout); - this.composing = null; - this.updateFromDOM(); - this.div.blur(); - this.div.focus(); - }; - ContentEditableInput.prototype.readFromDOMSoon = function () { - var this$1$1 = this; - if (this.readDOMTimeout != null) { - return; - } - this.readDOMTimeout = setTimeout(function () { - this$1$1.readDOMTimeout = null; - if (this$1$1.composing) { - if (this$1$1.composing.done) { - this$1$1.composing = null; - } else { - return; - } - } - this$1$1.updateFromDOM(); - }, 80); - }; - ContentEditableInput.prototype.updateFromDOM = function () { - var this$1$1 = this; - if (this.cm.isReadOnly() || !this.pollContent()) { - runInOp(this.cm, function () { - return regChange(this$1$1.cm); - }); - } - }; - ContentEditableInput.prototype.setUneditable = function (node) { - node.contentEditable = "false"; - }; - ContentEditableInput.prototype.onKeyPress = function (e) { - if (e.charCode == 0 || this.composing) { - return; - } - e.preventDefault(); - if (!this.cm.isReadOnly()) { - operation(this.cm, applyTextInput)(this.cm, String.fromCharCode(e.charCode == null ? e.keyCode : e.charCode), 0); - } - }; - ContentEditableInput.prototype.readOnlyChanged = function (val) { - this.div.contentEditable = String(val != "nocursor"); - }; - ContentEditableInput.prototype.onContextMenu = function () {}; - ContentEditableInput.prototype.resetPosition = function () {}; - ContentEditableInput.prototype.needsContentAttribute = true; - function posToDOM(cm, pos) { - var view = findViewForLine(cm, pos.line); - if (!view || view.hidden) { - return null; - } - var line = getLine(cm.doc, pos.line); - var info = mapFromLineView(view, line, pos.line); - var order = getOrder(line, cm.doc.direction), - side = "left"; - if (order) { - var partPos = getBidiPartAt(order, pos.ch); - side = partPos % 2 ? "right" : "left"; - } - var result = nodeAndOffsetInLineMap(info.map, pos.ch, side); - result.offset = result.collapse == "right" ? result.end : result.start; - return result; - } - function isInGutter(node) { - for (var scan = node; scan; scan = scan.parentNode) { - if (/CodeMirror-gutter-wrapper/.test(scan.className)) { - return true; - } - } - return false; - } - function badPos(pos, bad) { - if (bad) { - pos.bad = true; - } - return pos; - } - function domTextBetween(cm, from, to, fromLine, toLine) { - var text = "", - closing = false, - lineSep = cm.doc.lineSeparator(), - extraLinebreak = false; - function recognizeMarker(id) { - return function (marker) { - return marker.id == id; - }; - } - function close() { - if (closing) { - text += lineSep; - if (extraLinebreak) { - text += lineSep; - } - closing = extraLinebreak = false; - } - } - function addText(str) { - if (str) { - close(); - text += str; - } - } - function walk(node) { - if (node.nodeType == 1) { - var cmText = node.getAttribute("cm-text"); - if (cmText) { - addText(cmText); - return; - } - var markerID = node.getAttribute("cm-marker"), - range2; - if (markerID) { - var found = cm.findMarks(Pos(fromLine, 0), Pos(toLine + 1, 0), recognizeMarker(+markerID)); - if (found.length && (range2 = found[0].find(0))) { - addText(getBetween(cm.doc, range2.from, range2.to).join(lineSep)); - } - return; - } - if (node.getAttribute("contenteditable") == "false") { - return; - } - var isBlock = /^(pre|div|p|li|table|br)$/i.test(node.nodeName); - if (!/^br$/i.test(node.nodeName) && node.textContent.length == 0) { - return; - } - if (isBlock) { - close(); - } - for (var i2 = 0; i2 < node.childNodes.length; i2++) { - walk(node.childNodes[i2]); - } - if (/^(pre|p)$/i.test(node.nodeName)) { - extraLinebreak = true; - } - if (isBlock) { - closing = true; - } - } else if (node.nodeType == 3) { - addText(node.nodeValue.replace(/\u200b/g, "").replace(/\u00a0/g, " ")); - } - } - for (;;) { - walk(from); - if (from == to) { - break; - } - from = from.nextSibling; - extraLinebreak = false; - } - return text; - } - function domToPos(cm, node, offset) { - var lineNode; - if (node == cm.display.lineDiv) { - lineNode = cm.display.lineDiv.childNodes[offset]; - if (!lineNode) { - return badPos(cm.clipPos(Pos(cm.display.viewTo - 1)), true); - } - node = null; - offset = 0; - } else { - for (lineNode = node;; lineNode = lineNode.parentNode) { - if (!lineNode || lineNode == cm.display.lineDiv) { - return null; - } - if (lineNode.parentNode && lineNode.parentNode == cm.display.lineDiv) { - break; - } - } - } - for (var i2 = 0; i2 < cm.display.view.length; i2++) { - var lineView = cm.display.view[i2]; - if (lineView.node == lineNode) { - return locateNodeInLineView(lineView, node, offset); - } - } - } - function locateNodeInLineView(lineView, node, offset) { - var wrapper = lineView.text.firstChild, - bad = false; - if (!node || !contains(wrapper, node)) { - return badPos(Pos(lineNo(lineView.line), 0), true); - } - if (node == wrapper) { - bad = true; - node = wrapper.childNodes[offset]; - offset = 0; - if (!node) { - var line = lineView.rest ? lst(lineView.rest) : lineView.line; - return badPos(Pos(lineNo(line), line.text.length), bad); - } - } - var textNode = node.nodeType == 3 ? node : null, - topNode = node; - if (!textNode && node.childNodes.length == 1 && node.firstChild.nodeType == 3) { - textNode = node.firstChild; - if (offset) { - offset = textNode.nodeValue.length; - } - } - while (topNode.parentNode != wrapper) { - topNode = topNode.parentNode; - } - var measure = lineView.measure, - maps = measure.maps; - function find(textNode2, topNode2, offset2) { - for (var i2 = -1; i2 < (maps ? maps.length : 0); i2++) { - var map2 = i2 < 0 ? measure.map : maps[i2]; - for (var j = 0; j < map2.length; j += 3) { - var curNode = map2[j + 2]; - if (curNode == textNode2 || curNode == topNode2) { - var line2 = lineNo(i2 < 0 ? lineView.line : lineView.rest[i2]); - var ch = map2[j] + offset2; - if (offset2 < 0 || curNode != textNode2) { - ch = map2[j + (offset2 ? 1 : 0)]; - } - return Pos(line2, ch); - } - } - } - } - var found = find(textNode, topNode, offset); - if (found) { - return badPos(found, bad); - } - for (var after = topNode.nextSibling, dist = textNode ? textNode.nodeValue.length - offset : 0; after; after = after.nextSibling) { - found = find(after, after.firstChild, 0); - if (found) { - return badPos(Pos(found.line, found.ch - dist), bad); - } else { - dist += after.textContent.length; - } - } - for (var before = topNode.previousSibling, dist$1 = offset; before; before = before.previousSibling) { - found = find(before, before.firstChild, -1); - if (found) { - return badPos(Pos(found.line, found.ch + dist$1), bad); - } else { - dist$1 += before.textContent.length; - } - } - } - var TextareaInput = function (cm) { - this.cm = cm; - this.prevInput = ""; - this.pollingFast = false; - this.polling = new Delayed(); - this.hasSelection = false; - this.composing = null; - }; - TextareaInput.prototype.init = function (display) { - var this$1$1 = this; - var input = this, - cm = this.cm; - this.createField(display); - var te = this.textarea; - display.wrapper.insertBefore(this.wrapper, display.wrapper.firstChild); - if (ios) { - te.style.width = "0px"; - } - on(te, "input", function () { - if (ie && ie_version >= 9 && this$1$1.hasSelection) { - this$1$1.hasSelection = null; - } - input.poll(); - }); - on(te, "paste", function (e) { - if (signalDOMEvent(cm, e) || handlePaste(e, cm)) { - return; - } - cm.state.pasteIncoming = + /* @__PURE__ */new Date(); - input.fastPoll(); - }); - function prepareCopyCut(e) { - if (signalDOMEvent(cm, e)) { - return; - } - if (cm.somethingSelected()) { - setLastCopied({ - lineWise: false, - text: cm.getSelections() - }); - } else if (!cm.options.lineWiseCopyCut) { - return; - } else { - var ranges = copyableRanges(cm); - setLastCopied({ - lineWise: true, - text: ranges.text - }); - if (e.type == "cut") { - cm.setSelections(ranges.ranges, null, sel_dontScroll); - } else { - input.prevInput = ""; - te.value = ranges.text.join("\n"); - selectInput(te); - } - } - if (e.type == "cut") { - cm.state.cutIncoming = + /* @__PURE__ */new Date(); - } - } - on(te, "cut", prepareCopyCut); - on(te, "copy", prepareCopyCut); - on(display.scroller, "paste", function (e) { - if (eventInWidget(display, e) || signalDOMEvent(cm, e)) { - return; - } - if (!te.dispatchEvent) { - cm.state.pasteIncoming = + /* @__PURE__ */new Date(); - input.focus(); - return; - } - var event = new Event("paste"); - event.clipboardData = e.clipboardData; - te.dispatchEvent(event); - }); - on(display.lineSpace, "selectstart", function (e) { - if (!eventInWidget(display, e)) { - e_preventDefault(e); - } - }); - on(te, "compositionstart", function () { - var start = cm.getCursor("from"); - if (input.composing) { - input.composing.range.clear(); - } - input.composing = { - start, - range: cm.markText(start, cm.getCursor("to"), { - className: "CodeMirror-composing" - }) - }; - }); - on(te, "compositionend", function () { - if (input.composing) { - input.poll(); - input.composing.range.clear(); - input.composing = null; - } - }); - }; - TextareaInput.prototype.createField = function (_display) { - this.wrapper = hiddenTextarea(); - this.textarea = this.wrapper.firstChild; - }; - TextareaInput.prototype.screenReaderLabelChanged = function (label) { - if (label) { - this.textarea.setAttribute("aria-label", label); - } else { - this.textarea.removeAttribute("aria-label"); - } - }; - TextareaInput.prototype.prepareSelection = function () { - var cm = this.cm, - display = cm.display, - doc = cm.doc; - var result = prepareSelection(cm); - if (cm.options.moveInputWithCursor) { - var headPos = cursorCoords(cm, doc.sel.primary().head, "div"); - var wrapOff = display.wrapper.getBoundingClientRect(), - lineOff = display.lineDiv.getBoundingClientRect(); - result.teTop = Math.max(0, Math.min(display.wrapper.clientHeight - 10, headPos.top + lineOff.top - wrapOff.top)); - result.teLeft = Math.max(0, Math.min(display.wrapper.clientWidth - 10, headPos.left + lineOff.left - wrapOff.left)); - } - return result; - }; - TextareaInput.prototype.showSelection = function (drawn) { - var cm = this.cm, - display = cm.display; - removeChildrenAndAdd(display.cursorDiv, drawn.cursors); - removeChildrenAndAdd(display.selectionDiv, drawn.selection); - if (drawn.teTop != null) { - this.wrapper.style.top = drawn.teTop + "px"; - this.wrapper.style.left = drawn.teLeft + "px"; - } - }; - TextareaInput.prototype.reset = function (typing) { - if (this.contextMenuPending || this.composing) { - return; - } - var cm = this.cm; - if (cm.somethingSelected()) { - this.prevInput = ""; - var content = cm.getSelection(); - this.textarea.value = content; - if (cm.state.focused) { - selectInput(this.textarea); - } - if (ie && ie_version >= 9) { - this.hasSelection = content; - } - } else if (!typing) { - this.prevInput = this.textarea.value = ""; - if (ie && ie_version >= 9) { - this.hasSelection = null; - } - } - }; - TextareaInput.prototype.getField = function () { - return this.textarea; - }; - TextareaInput.prototype.supportsTouch = function () { - return false; - }; - TextareaInput.prototype.focus = function () { - if (this.cm.options.readOnly != "nocursor" && (!mobile || activeElt() != this.textarea)) { - try { - this.textarea.focus(); - } catch (e) {} - } - }; - TextareaInput.prototype.blur = function () { - this.textarea.blur(); - }; - TextareaInput.prototype.resetPosition = function () { - this.wrapper.style.top = this.wrapper.style.left = 0; - }; - TextareaInput.prototype.receivedFocus = function () { - this.slowPoll(); - }; - TextareaInput.prototype.slowPoll = function () { - var this$1$1 = this; - if (this.pollingFast) { - return; - } - this.polling.set(this.cm.options.pollInterval, function () { - this$1$1.poll(); - if (this$1$1.cm.state.focused) { - this$1$1.slowPoll(); - } - }); - }; - TextareaInput.prototype.fastPoll = function () { - var missed = false, - input = this; - input.pollingFast = true; - function p() { - var changed = input.poll(); - if (!changed && !missed) { - missed = true; - input.polling.set(60, p); - } else { - input.pollingFast = false; - input.slowPoll(); - } - } - input.polling.set(20, p); - }; - TextareaInput.prototype.poll = function () { - var this$1$1 = this; - var cm = this.cm, - input = this.textarea, - prevInput = this.prevInput; - if (this.contextMenuPending || !cm.state.focused || hasSelection(input) && !prevInput && !this.composing || cm.isReadOnly() || cm.options.disableInput || cm.state.keySeq) { - return false; - } - var text = input.value; - if (text == prevInput && !cm.somethingSelected()) { - return false; - } - if (ie && ie_version >= 9 && this.hasSelection === text || mac && /[\uf700-\uf7ff]/.test(text)) { - cm.display.input.reset(); - return false; - } - if (cm.doc.sel == cm.display.selForContextMenu) { - var first = text.charCodeAt(0); - if (first == 8203 && !prevInput) { - prevInput = "​"; - } - if (first == 8666) { - this.reset(); - return this.cm.execCommand("undo"); - } - } - var same = 0, - l = Math.min(prevInput.length, text.length); - while (same < l && prevInput.charCodeAt(same) == text.charCodeAt(same)) { - ++same; - } - runInOp(cm, function () { - applyTextInput(cm, text.slice(same), prevInput.length - same, null, this$1$1.composing ? "*compose" : null); - if (text.length > 1e3 || text.indexOf("\n") > -1) { - input.value = this$1$1.prevInput = ""; - } else { - this$1$1.prevInput = text; - } - if (this$1$1.composing) { - this$1$1.composing.range.clear(); - this$1$1.composing.range = cm.markText(this$1$1.composing.start, cm.getCursor("to"), { - className: "CodeMirror-composing" - }); - } - }); - return true; - }; - TextareaInput.prototype.ensurePolled = function () { - if (this.pollingFast && this.poll()) { - this.pollingFast = false; - } - }; - TextareaInput.prototype.onKeyPress = function () { - if (ie && ie_version >= 9) { - this.hasSelection = null; - } - this.fastPoll(); - }; - TextareaInput.prototype.onContextMenu = function (e) { - var input = this, - cm = input.cm, - display = cm.display, - te = input.textarea; - if (input.contextMenuPending) { - input.contextMenuPending(); - } - var pos = posFromMouse(cm, e), - scrollPos = display.scroller.scrollTop; - if (!pos || presto) { - return; - } - var reset = cm.options.resetSelectionOnContextMenu; - if (reset && cm.doc.sel.contains(pos) == -1) { - operation(cm, setSelection)(cm.doc, simpleSelection(pos), sel_dontScroll); - } - var oldCSS = te.style.cssText, - oldWrapperCSS = input.wrapper.style.cssText; - var wrapperBox = input.wrapper.offsetParent.getBoundingClientRect(); - input.wrapper.style.cssText = "position: static"; - te.style.cssText = "position: absolute; width: 30px; height: 30px;\n top: " + (e.clientY - wrapperBox.top - 5) + "px; left: " + (e.clientX - wrapperBox.left - 5) + "px;\n z-index: 1000; background: " + (ie ? "rgba(255, 255, 255, .05)" : "transparent") + ";\n outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);"; - var oldScrollY; - if (webkit) { - oldScrollY = window.scrollY; - } - display.input.focus(); - if (webkit) { - window.scrollTo(null, oldScrollY); - } - display.input.reset(); - if (!cm.somethingSelected()) { - te.value = input.prevInput = " "; - } - input.contextMenuPending = rehide; - display.selForContextMenu = cm.doc.sel; - clearTimeout(display.detectingSelectAll); - function prepareSelectAllHack() { - if (te.selectionStart != null) { - var selected = cm.somethingSelected(); - var extval = "​" + (selected ? te.value : ""); - te.value = "⇚"; - te.value = extval; - input.prevInput = selected ? "" : "​"; - te.selectionStart = 1; - te.selectionEnd = extval.length; - display.selForContextMenu = cm.doc.sel; - } - } - function rehide() { - if (input.contextMenuPending != rehide) { - return; - } - input.contextMenuPending = false; - input.wrapper.style.cssText = oldWrapperCSS; - te.style.cssText = oldCSS; - if (ie && ie_version < 9) { - display.scrollbars.setScrollTop(display.scroller.scrollTop = scrollPos); - } - if (te.selectionStart != null) { - if (!ie || ie && ie_version < 9) { - prepareSelectAllHack(); - } - var i2 = 0, - poll = function () { - if (display.selForContextMenu == cm.doc.sel && te.selectionStart == 0 && te.selectionEnd > 0 && input.prevInput == "​") { - operation(cm, selectAll)(cm); - } else if (i2++ < 10) { - display.detectingSelectAll = setTimeout(poll, 500); - } else { - display.selForContextMenu = null; - display.input.reset(); - } - }; - display.detectingSelectAll = setTimeout(poll, 200); - } - } - if (ie && ie_version >= 9) { - prepareSelectAllHack(); - } - if (captureRightClick) { - e_stop(e); - var mouseup = function () { - off(window, "mouseup", mouseup); - setTimeout(rehide, 20); - }; - on(window, "mouseup", mouseup); - } else { - setTimeout(rehide, 50); - } - }; - TextareaInput.prototype.readOnlyChanged = function (val) { - if (!val) { - this.reset(); - } - this.textarea.disabled = val == "nocursor"; - this.textarea.readOnly = !!val; - }; - TextareaInput.prototype.setUneditable = function () {}; - TextareaInput.prototype.needsContentAttribute = false; - function fromTextArea(textarea, options) { - options = options ? copyObj(options) : {}; - options.value = textarea.value; - if (!options.tabindex && textarea.tabIndex) { - options.tabindex = textarea.tabIndex; - } - if (!options.placeholder && textarea.placeholder) { - options.placeholder = textarea.placeholder; - } - if (options.autofocus == null) { - var hasFocus = activeElt(); - options.autofocus = hasFocus == textarea || textarea.getAttribute("autofocus") != null && hasFocus == document.body; - } - function save() { - textarea.value = cm.getValue(); - } - var realSubmit; - if (textarea.form) { - on(textarea.form, "submit", save); - if (!options.leaveSubmitMethodAlone) { - var form = textarea.form; - realSubmit = form.submit; - try { - var wrappedSubmit = form.submit = function () { - save(); - form.submit = realSubmit; - form.submit(); - form.submit = wrappedSubmit; - }; - } catch (e) {} - } - } - options.finishInit = function (cm2) { - cm2.save = save; - cm2.getTextArea = function () { - return textarea; - }; - cm2.toTextArea = function () { - cm2.toTextArea = isNaN; - save(); - textarea.parentNode.removeChild(cm2.getWrapperElement()); - textarea.style.display = ""; - if (textarea.form) { - off(textarea.form, "submit", save); - if (!options.leaveSubmitMethodAlone && typeof textarea.form.submit == "function") { - textarea.form.submit = realSubmit; - } - } - }; - }; - textarea.style.display = "none"; - var cm = CodeMirror(function (node) { - return textarea.parentNode.insertBefore(node, textarea.nextSibling); - }, options); - return cm; - } - function addLegacyProps(CodeMirror2) { - CodeMirror2.off = off; - CodeMirror2.on = on; - CodeMirror2.wheelEventPixels = wheelEventPixels; - CodeMirror2.Doc = Doc; - CodeMirror2.splitLines = splitLinesAuto; - CodeMirror2.countColumn = countColumn; - CodeMirror2.findColumn = findColumn; - CodeMirror2.isWordChar = isWordCharBasic; - CodeMirror2.Pass = Pass; - CodeMirror2.signal = signal; - CodeMirror2.Line = Line; - CodeMirror2.changeEnd = changeEnd; - CodeMirror2.scrollbarModel = scrollbarModel; - CodeMirror2.Pos = Pos; - CodeMirror2.cmpPos = cmp; - CodeMirror2.modes = modes; - CodeMirror2.mimeModes = mimeModes; - CodeMirror2.resolveMode = resolveMode; - CodeMirror2.getMode = getMode; - CodeMirror2.modeExtensions = modeExtensions; - CodeMirror2.extendMode = extendMode; - CodeMirror2.copyState = copyState; - CodeMirror2.startState = startState; - CodeMirror2.innerMode = innerMode; - CodeMirror2.commands = commands; - CodeMirror2.keyMap = keyMap; - CodeMirror2.keyName = keyName; - CodeMirror2.isModifierKey = isModifierKey; - CodeMirror2.lookupKey = lookupKey; - CodeMirror2.normalizeKeyMap = normalizeKeyMap; - CodeMirror2.StringStream = StringStream; - CodeMirror2.SharedTextMarker = SharedTextMarker; - CodeMirror2.TextMarker = TextMarker; - CodeMirror2.LineWidget = LineWidget; - CodeMirror2.e_preventDefault = e_preventDefault; - CodeMirror2.e_stopPropagation = e_stopPropagation; - CodeMirror2.e_stop = e_stop; - CodeMirror2.addClass = addClass; - CodeMirror2.contains = contains; - CodeMirror2.rmClass = rmClass; - CodeMirror2.keyNames = keyNames; - } - defineOptions(CodeMirror); - addEditorMethods(CodeMirror); - var dontDelegate = "iter insert remove copy getEditor constructor".split(" "); - for (var prop in Doc.prototype) { - if (Doc.prototype.hasOwnProperty(prop) && indexOf(dontDelegate, prop) < 0) { - CodeMirror.prototype[prop] = /* @__PURE__ */function (method) { - return function () { - return method.apply(this.doc, arguments); - }; - }(Doc.prototype[prop]); - } - } - eventMixin(Doc); - CodeMirror.inputStyles = { - "textarea": TextareaInput, - "contenteditable": ContentEditableInput - }; - CodeMirror.defineMode = function (name) { - if (!CodeMirror.defaults.mode && name != "null") { - CodeMirror.defaults.mode = name; - } - defineMode.apply(this, arguments); - }; - CodeMirror.defineMIME = defineMIME; - CodeMirror.defineMode("null", function () { - return { - token: function (stream) { - return stream.skipToEnd(); - } - }; - }); - CodeMirror.defineMIME("text/plain", "null"); - CodeMirror.defineExtension = function (name, func) { - CodeMirror.prototype[name] = func; - }; - CodeMirror.defineDocExtension = function (name, func) { - Doc.prototype[name] = func; - }; - CodeMirror.fromTextArea = fromTextArea; - addLegacyProps(CodeMirror); - CodeMirror.version = "5.65.3"; - return CodeMirror; - }); - })(codemirror); - return codemirror.exports; -} -exports.getDefaultExportFromCjs = getDefaultExportFromCjs; -exports.requireCodemirror = requireCodemirror; - -/***/ }), - -/***/ "../../graphiql-react/dist/comment.cjs.js": -/*!************************************************!*\ - !*** ../../graphiql-react/dist/comment.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var comment$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var noOptions = {}; - var nonWS = /[^\s\u00a0]/; - var Pos = CodeMirror.Pos, - cmp = CodeMirror.cmpPos; - function firstNonWS(str) { - var found = str.search(nonWS); - return found == -1 ? 0 : found; - } - CodeMirror.commands.toggleComment = function (cm) { - cm.toggleComment(); - }; - CodeMirror.defineExtension("toggleComment", function (options) { - if (!options) options = noOptions; - var cm = this; - var minLine = Infinity, - ranges = this.listSelections(), - mode = null; - for (var i = ranges.length - 1; i >= 0; i--) { - var from = ranges[i].from(), - to = ranges[i].to(); - if (from.line >= minLine) continue; - if (to.line >= minLine) to = Pos(minLine, 0); - minLine = from.line; - if (mode == null) { - if (cm.uncomment(from, to, options)) mode = "un";else { - cm.lineComment(from, to, options); - mode = "line"; - } - } else if (mode == "un") { - cm.uncomment(from, to, options); - } else { - cm.lineComment(from, to, options); - } - } - }); - function probablyInsideString(cm, pos, line) { - return /\bstring\b/.test(cm.getTokenTypeAt(Pos(pos.line, 0))) && !/^[\'\"\`]/.test(line); - } - function getMode(cm, pos) { - var mode = cm.getMode(); - return mode.useInnerComments === false || !mode.innerMode ? mode : cm.getModeAt(pos); - } - CodeMirror.defineExtension("lineComment", function (from, to, options) { - if (!options) options = noOptions; - var self = this, - mode = getMode(self, from); - var firstLine = self.getLine(from.line); - if (firstLine == null || probablyInsideString(self, from, firstLine)) return; - var commentString = options.lineComment || mode.lineComment; - if (!commentString) { - if (options.blockCommentStart || mode.blockCommentStart) { - options.fullLines = true; - self.blockComment(from, to, options); - } - return; - } - var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); - var pad = options.padding == null ? " " : options.padding; - var blankLines = options.commentBlankLines || from.line == to.line; - self.operation(function () { - if (options.indent) { - var baseString = null; - for (var i = from.line; i < end; ++i) { - var line = self.getLine(i); - var whitespace = line.slice(0, firstNonWS(line)); - if (baseString == null || baseString.length > whitespace.length) { - baseString = whitespace; - } - } - for (var i = from.line; i < end; ++i) { - var line = self.getLine(i), - cut = baseString.length; - if (!blankLines && !nonWS.test(line)) continue; - if (line.slice(0, cut) != baseString) cut = firstNonWS(line); - self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); - } - } else { - for (var i = from.line; i < end; ++i) { - if (blankLines || nonWS.test(self.getLine(i))) self.replaceRange(commentString + pad, Pos(i, 0)); - } - } - }); - }); - CodeMirror.defineExtension("blockComment", function (from, to, options) { - if (!options) options = noOptions; - var self = this, - mode = getMode(self, from); - var startString = options.blockCommentStart || mode.blockCommentStart; - var endString = options.blockCommentEnd || mode.blockCommentEnd; - if (!startString || !endString) { - if ((options.lineComment || mode.lineComment) && options.fullLines != false) self.lineComment(from, to, options); - return; - } - if (/\bcomment\b/.test(self.getTokenTypeAt(Pos(from.line, 0)))) return; - var end = Math.min(to.line, self.lastLine()); - if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; - var pad = options.padding == null ? " " : options.padding; - if (from.line > end) return; - self.operation(function () { - if (options.fullLines != false) { - var lastLineHasText = nonWS.test(self.getLine(end)); - self.replaceRange(pad + endString, Pos(end)); - self.replaceRange(startString + pad, Pos(from.line, 0)); - var lead = options.blockCommentLead || mode.blockCommentLead; - if (lead != null) { - for (var i = from.line + 1; i <= end; ++i) if (i != end || lastLineHasText) self.replaceRange(lead + pad, Pos(i, 0)); - } - } else { - var atCursor = cmp(self.getCursor("to"), to) == 0, - empty = !self.somethingSelected(); - self.replaceRange(endString, to); - if (atCursor) self.setSelection(empty ? to : self.getCursor("from"), to); - self.replaceRange(startString, from); - } - }); - }); - CodeMirror.defineExtension("uncomment", function (from, to, options) { - if (!options) options = noOptions; - var self = this, - mode = getMode(self, from); - var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), - start = Math.min(from.line, end); - var lineString = options.lineComment || mode.lineComment, - lines = []; - var pad = options.padding == null ? " " : options.padding, - didSomething; - lineComment: { - if (!lineString) break lineComment; - for (var i = start; i <= end; ++i) { - var line = self.getLine(i); - var found = line.indexOf(lineString); - if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; - if (found == -1 && nonWS.test(line)) break lineComment; - if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; - lines.push(line); - } - self.operation(function () { - for (var i2 = start; i2 <= end; ++i2) { - var line2 = lines[i2 - start]; - var pos = line2.indexOf(lineString), - endPos = pos + lineString.length; - if (pos < 0) continue; - if (line2.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; - didSomething = true; - self.replaceRange("", Pos(i2, pos), Pos(i2, endPos)); - } - }); - if (didSomething) return true; - } - var startString = options.blockCommentStart || mode.blockCommentStart; - var endString = options.blockCommentEnd || mode.blockCommentEnd; - if (!startString || !endString) return false; - var lead = options.blockCommentLead || mode.blockCommentLead; - var startLine = self.getLine(start), - open = startLine.indexOf(startString); - if (open == -1) return false; - var endLine = end == start ? startLine : self.getLine(end); - var close = endLine.indexOf(endString, end == start ? open + startString.length : 0); - var insideStart = Pos(start, open + 1), - insideEnd = Pos(end, close + 1); - if (close == -1 || !/comment/.test(self.getTokenTypeAt(insideStart)) || !/comment/.test(self.getTokenTypeAt(insideEnd)) || self.getRange(insideStart, insideEnd, "\n").indexOf(endString) > -1) return false; - var lastStart = startLine.lastIndexOf(startString, from.ch); - var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); - if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; - firstEnd = endLine.indexOf(endString, to.ch); - var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); - lastStart = firstEnd == -1 || almostLastStart == -1 ? -1 : to.ch + almostLastStart; - if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; - self.operation(function () { - self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), Pos(end, close + endString.length)); - var openEnd = open + startString.length; - if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; - self.replaceRange("", Pos(start, open), Pos(start, openEnd)); - if (lead) for (var i2 = start + 1; i2 <= end; ++i2) { - var line2 = self.getLine(i2), - found2 = line2.indexOf(lead); - if (found2 == -1 || nonWS.test(line2.slice(0, found2))) continue; - var foundEnd = found2 + lead.length; - if (pad && line2.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; - self.replaceRange("", Pos(i2, found2), Pos(i2, foundEnd)); - } - }); - return true; - }); - }); -})(); -var commentExports = comment$2.exports; -const comment = /* @__PURE__ */codemirror.getDefaultExportFromCjs(commentExports); -const comment$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: comment -}, [commentExports]); -exports.comment = comment$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/dialog.cjs.js": -/*!***********************************************!*\ - !*** ../../graphiql-react/dist/dialog.cjs.js ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var dialog$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - function dialogDiv(cm, template, bottom) { - var wrap = cm.getWrapperElement(); - var dialog2; - dialog2 = wrap.appendChild(document.createElement("div")); - if (bottom) dialog2.className = "CodeMirror-dialog CodeMirror-dialog-bottom";else dialog2.className = "CodeMirror-dialog CodeMirror-dialog-top"; - if (typeof template == "string") { - dialog2.innerHTML = template; - } else { - dialog2.appendChild(template); - } - CodeMirror.addClass(wrap, "dialog-opened"); - return dialog2; - } - function closeNotification(cm, newVal) { - if (cm.state.currentNotificationClose) cm.state.currentNotificationClose(); - cm.state.currentNotificationClose = newVal; - } - CodeMirror.defineExtension("openDialog", function (template, callback, options) { - if (!options) options = {}; - closeNotification(this, null); - var dialog2 = dialogDiv(this, template, options.bottom); - var closed = false, - me = this; - function close(newVal) { - if (typeof newVal == "string") { - inp.value = newVal; - } else { - if (closed) return; - closed = true; - CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); - dialog2.parentNode.removeChild(dialog2); - me.focus(); - if (options.onClose) options.onClose(dialog2); - } - } - var inp = dialog2.getElementsByTagName("input")[0], - button; - if (inp) { - inp.focus(); - if (options.value) { - inp.value = options.value; - if (options.selectValueOnOpen !== false) { - inp.select(); - } - } - if (options.onInput) CodeMirror.on(inp, "input", function (e) { - options.onInput(e, inp.value, close); - }); - if (options.onKeyUp) CodeMirror.on(inp, "keyup", function (e) { - options.onKeyUp(e, inp.value, close); - }); - CodeMirror.on(inp, "keydown", function (e) { - if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { - return; - } - if (e.keyCode == 27 || options.closeOnEnter !== false && e.keyCode == 13) { - inp.blur(); - CodeMirror.e_stop(e); - close(); - } - if (e.keyCode == 13) callback(inp.value, e); - }); - if (options.closeOnBlur !== false) CodeMirror.on(dialog2, "focusout", function (evt) { - if (evt.relatedTarget !== null) close(); - }); - } else if (button = dialog2.getElementsByTagName("button")[0]) { - CodeMirror.on(button, "click", function () { - close(); - me.focus(); - }); - if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); - button.focus(); - } - return close; - }); - CodeMirror.defineExtension("openConfirm", function (template, callbacks, options) { - closeNotification(this, null); - var dialog2 = dialogDiv(this, template, options && options.bottom); - var buttons = dialog2.getElementsByTagName("button"); - var closed = false, - me = this, - blurring = 1; - function close() { - if (closed) return; - closed = true; - CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); - dialog2.parentNode.removeChild(dialog2); - me.focus(); - } - buttons[0].focus(); - for (var i = 0; i < buttons.length; ++i) { - var b = buttons[i]; - (function (callback) { - CodeMirror.on(b, "click", function (e) { - CodeMirror.e_preventDefault(e); - close(); - if (callback) callback(me); - }); - })(callbacks[i]); - CodeMirror.on(b, "blur", function () { - --blurring; - setTimeout(function () { - if (blurring <= 0) close(); - }, 200); - }); - CodeMirror.on(b, "focus", function () { - ++blurring; - }); - } - }); - CodeMirror.defineExtension("openNotification", function (template, options) { - closeNotification(this, close); - var dialog2 = dialogDiv(this, template, options && options.bottom); - var closed = false, - doneTimer; - var duration = options && typeof options.duration !== "undefined" ? options.duration : 5e3; - function close() { - if (closed) return; - closed = true; - clearTimeout(doneTimer); - CodeMirror.rmClass(dialog2.parentNode, "dialog-opened"); - dialog2.parentNode.removeChild(dialog2); - } - CodeMirror.on(dialog2, "click", function (e) { - CodeMirror.e_preventDefault(e); - close(); - }); - if (duration) doneTimer = setTimeout(close, duration); - return close; - }); - }); -})(); -var dialogExports = dialog$2.exports; -const dialog = /* @__PURE__ */codemirror.getDefaultExportFromCjs(dialogExports); -const dialog$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: dialog -}, [dialogExports]); -exports.dialog = dialog$1; -exports.dialogExports = dialogExports; - -/***/ }), - -/***/ "../../graphiql-react/dist/foldgutter.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/foldgutter.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var foldgutter$2 = { - exports: {} -}; -var foldcode = { - exports: {} -}; -var hasRequiredFoldcode; -function requireFoldcode() { - if (hasRequiredFoldcode) return foldcode.exports; - hasRequiredFoldcode = 1; - (function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - function doFold(cm, pos, options, force) { - if (options && options.call) { - var finder = options; - options = null; - } else { - var finder = getOption(cm, options, "rangeFinder"); - } - if (typeof pos == "number") pos = CodeMirror.Pos(pos, 0); - var minSize = getOption(cm, options, "minFoldSize"); - function getRange(allowFolded) { - var range2 = finder(cm, pos); - if (!range2 || range2.to.line - range2.from.line < minSize) return null; - if (force === "fold") return range2; - var marks = cm.findMarksAt(range2.from); - for (var i = 0; i < marks.length; ++i) { - if (marks[i].__isFold) { - if (!allowFolded) return null; - range2.cleared = true; - marks[i].clear(); - } - } - return range2; - } - var range = getRange(true); - if (getOption(cm, options, "scanUp")) while (!range && pos.line > cm.firstLine()) { - pos = CodeMirror.Pos(pos.line - 1, 0); - range = getRange(false); - } - if (!range || range.cleared || force === "unfold") return; - var myWidget = makeWidget(cm, options, range); - CodeMirror.on(myWidget, "mousedown", function (e) { - myRange.clear(); - CodeMirror.e_preventDefault(e); - }); - var myRange = cm.markText(range.from, range.to, { - replacedWith: myWidget, - clearOnEnter: getOption(cm, options, "clearOnEnter"), - __isFold: true - }); - myRange.on("clear", function (from, to) { - CodeMirror.signal(cm, "unfold", cm, from, to); - }); - CodeMirror.signal(cm, "fold", cm, range.from, range.to); - } - function makeWidget(cm, options, range) { - var widget = getOption(cm, options, "widget"); - if (typeof widget == "function") { - widget = widget(range.from, range.to); - } - if (typeof widget == "string") { - var text = document.createTextNode(widget); - widget = document.createElement("span"); - widget.appendChild(text); - widget.className = "CodeMirror-foldmarker"; - } else if (widget) { - widget = widget.cloneNode(true); - } - return widget; - } - CodeMirror.newFoldFunction = function (rangeFinder, widget) { - return function (cm, pos) { - doFold(cm, pos, { - rangeFinder, - widget - }); - }; - }; - CodeMirror.defineExtension("foldCode", function (pos, options, force) { - doFold(this, pos, options, force); - }); - CodeMirror.defineExtension("isFolded", function (pos) { - var marks = this.findMarksAt(pos); - for (var i = 0; i < marks.length; ++i) if (marks[i].__isFold) return true; - }); - CodeMirror.commands.toggleFold = function (cm) { - cm.foldCode(cm.getCursor()); - }; - CodeMirror.commands.fold = function (cm) { - cm.foldCode(cm.getCursor(), null, "fold"); - }; - CodeMirror.commands.unfold = function (cm) { - cm.foldCode(cm.getCursor(), { - scanUp: false - }, "unfold"); - }; - CodeMirror.commands.foldAll = function (cm) { - cm.operation(function () { - for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { - scanUp: false - }, "fold"); - }); - }; - CodeMirror.commands.unfoldAll = function (cm) { - cm.operation(function () { - for (var i = cm.firstLine(), e = cm.lastLine(); i <= e; i++) cm.foldCode(CodeMirror.Pos(i, 0), { - scanUp: false - }, "unfold"); - }); - }; - CodeMirror.registerHelper("fold", "combine", function () { - var funcs = Array.prototype.slice.call(arguments, 0); - return function (cm, start) { - for (var i = 0; i < funcs.length; ++i) { - var found = funcs[i](cm, start); - if (found) return found; - } - }; - }); - CodeMirror.registerHelper("fold", "auto", function (cm, start) { - var helpers = cm.getHelpers(start, "fold"); - for (var i = 0; i < helpers.length; i++) { - var cur = helpers[i](cm, start); - if (cur) return cur; - } - }); - var defaultOptions = { - rangeFinder: CodeMirror.fold.auto, - widget: "↔", - minFoldSize: 0, - scanUp: false, - clearOnEnter: true - }; - CodeMirror.defineOption("foldOptions", null); - function getOption(cm, options, name) { - if (options && options[name] !== void 0) return options[name]; - var editorOptions = cm.options.foldOptions; - if (editorOptions && editorOptions[name] !== void 0) return editorOptions[name]; - return defaultOptions[name]; - } - CodeMirror.defineExtension("foldOption", function (options, name) { - return getOption(this, options, name); - }); - }); - })(); - return foldcode.exports; -} -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror(), requireFoldcode()); - })(function (CodeMirror) { - CodeMirror.defineOption("foldGutter", false, function (cm, val, old) { - if (old && old != CodeMirror.Init) { - cm.clearGutter(cm.state.foldGutter.options.gutter); - cm.state.foldGutter = null; - cm.off("gutterClick", onGutterClick); - cm.off("changes", onChange); - cm.off("viewportChange", onViewportChange); - cm.off("fold", onFold); - cm.off("unfold", onFold); - cm.off("swapDoc", onChange); - } - if (val) { - cm.state.foldGutter = new State(parseOptions(val)); - updateInViewport(cm); - cm.on("gutterClick", onGutterClick); - cm.on("changes", onChange); - cm.on("viewportChange", onViewportChange); - cm.on("fold", onFold); - cm.on("unfold", onFold); - cm.on("swapDoc", onChange); - } - }); - var Pos = CodeMirror.Pos; - function State(options) { - this.options = options; - this.from = this.to = 0; - } - function parseOptions(opts) { - if (opts === true) opts = {}; - if (opts.gutter == null) opts.gutter = "CodeMirror-foldgutter"; - if (opts.indicatorOpen == null) opts.indicatorOpen = "CodeMirror-foldgutter-open"; - if (opts.indicatorFolded == null) opts.indicatorFolded = "CodeMirror-foldgutter-folded"; - return opts; - } - function isFolded(cm, line) { - var marks = cm.findMarks(Pos(line, 0), Pos(line + 1, 0)); - for (var i = 0; i < marks.length; ++i) { - if (marks[i].__isFold) { - var fromPos = marks[i].find(-1); - if (fromPos && fromPos.line === line) return marks[i]; - } - } - } - function marker(spec) { - if (typeof spec == "string") { - var elt = document.createElement("div"); - elt.className = spec + " CodeMirror-guttermarker-subtle"; - return elt; - } else { - return spec.cloneNode(true); - } - } - function updateFoldInfo(cm, from, to) { - var opts = cm.state.foldGutter.options, - cur = from - 1; - var minSize = cm.foldOption(opts, "minFoldSize"); - var func = cm.foldOption(opts, "rangeFinder"); - var clsFolded = typeof opts.indicatorFolded == "string" && classTest(opts.indicatorFolded); - var clsOpen = typeof opts.indicatorOpen == "string" && classTest(opts.indicatorOpen); - cm.eachLine(from, to, function (line) { - ++cur; - var mark = null; - var old = line.gutterMarkers; - if (old) old = old[opts.gutter]; - if (isFolded(cm, cur)) { - if (clsFolded && old && clsFolded.test(old.className)) return; - mark = marker(opts.indicatorFolded); - } else { - var pos = Pos(cur, 0); - var range = func && func(cm, pos); - if (range && range.to.line - range.from.line >= minSize) { - if (clsOpen && old && clsOpen.test(old.className)) return; - mark = marker(opts.indicatorOpen); - } - } - if (!mark && !old) return; - cm.setGutterMarker(line, opts.gutter, mark); - }); - } - function classTest(cls) { - return new RegExp("(^|\\s)" + cls + "(?:$|\\s)\\s*"); - } - function updateInViewport(cm) { - var vp = cm.getViewport(), - state = cm.state.foldGutter; - if (!state) return; - cm.operation(function () { - updateFoldInfo(cm, vp.from, vp.to); - }); - state.from = vp.from; - state.to = vp.to; - } - function onGutterClick(cm, line, gutter) { - var state = cm.state.foldGutter; - if (!state) return; - var opts = state.options; - if (gutter != opts.gutter) return; - var folded = isFolded(cm, line); - if (folded) folded.clear();else cm.foldCode(Pos(line, 0), opts); - } - function onChange(cm) { - var state = cm.state.foldGutter; - if (!state) return; - var opts = state.options; - state.from = state.to = 0; - clearTimeout(state.changeUpdate); - state.changeUpdate = setTimeout(function () { - updateInViewport(cm); - }, opts.foldOnChangeTimeSpan || 600); - } - function onViewportChange(cm) { - var state = cm.state.foldGutter; - if (!state) return; - var opts = state.options; - clearTimeout(state.changeUpdate); - state.changeUpdate = setTimeout(function () { - var vp = cm.getViewport(); - if (state.from == state.to || vp.from - state.to > 20 || state.from - vp.to > 20) { - updateInViewport(cm); - } else { - cm.operation(function () { - if (vp.from < state.from) { - updateFoldInfo(cm, vp.from, state.from); - state.from = vp.from; - } - if (vp.to > state.to) { - updateFoldInfo(cm, state.to, vp.to); - state.to = vp.to; - } - }); - } - }, opts.updateViewportTimeSpan || 400); - } - function onFold(cm, from) { - var state = cm.state.foldGutter; - if (!state) return; - var line = from.line; - if (line >= state.from && line < state.to) updateFoldInfo(cm, line, line + 1); - } - }); -})(); -var foldgutterExports = foldgutter$2.exports; -const foldgutter = /* @__PURE__ */codemirror.getDefaultExportFromCjs(foldgutterExports); -const foldgutter$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: foldgutter -}, [foldgutterExports]); -exports.foldgutter = foldgutter$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/forEachState.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/forEachState.cjs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -function forEachState(stack, fn) { - const reverseStateStack = []; - let state = stack; - while (state === null || state === void 0 ? void 0 : state.kind) { - reverseStateStack.push(state); - state = state.prevState; - } - for (let i = reverseStateStack.length - 1; i >= 0; i--) { - fn(reverseStateStack[i]); - } -} -exports.forEachState = forEachState; - -/***/ }), - -/***/ "../../graphiql-react/dist/hint.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/hint.cjs.js ***! - \*********************************************/ +/***/ "../../codemirror-graphql/esm/hint.js": +/*!********************************************!*\ + !*** ../../codemirror-graphql/esm/hint.js ***! + \********************************************/ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -__webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js"); -const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -codemirror.CodeMirror.registerHelper("hint", "graphql", (editor, options) => { +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +__webpack_require__(/*! codemirror/addon/hint/show-hint.js */ "../../../node_modules/codemirror/addon/hint/show-hint.js"); +var _graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.registerHelper('hint', 'graphql', (editor, options) => { const { schema, externalFragments, @@ -68130,8 +73292,8 @@ codemirror.CodeMirror.registerHelper("hint", "graphql", (editor, options) => { const cur = editor.getCursor(); const token = editor.getTokenAt(cur); const tokenStart = token.type !== null && /"|\w/.test(token.string[0]) ? token.start : token.end; - const position = new graphqlLanguageService.Position(cur.line, tokenStart); - const rawResults = graphqlLanguageService.getAutocompleteSuggestions(schema, editor.getValue(), position, token, externalFragments, autocompleteOptions); + const position = new _graphqlLanguageService.Position(cur.line, tokenStart); + const rawResults = (0, _graphqlLanguageService.getAutocompleteSuggestions)(schema, editor.getValue(), position, token, externalFragments, autocompleteOptions); const results = { list: rawResults.map(item => { var _a; @@ -68153,26 +73315,611 @@ codemirror.CodeMirror.registerHelper("hint", "graphql", (editor, options) => { } }; if ((results === null || results === void 0 ? void 0 : results.list) && results.list.length > 0) { - results.from = codemirror.CodeMirror.Pos(results.from.line, results.from.ch); - results.to = codemirror.CodeMirror.Pos(results.to.line, results.to.ch); - codemirror.CodeMirror.signal(editor, "hasCompletion", editor, results, token); + results.from = _codemirror.default.Pos(results.from.line, results.from.ch); + results.to = _codemirror.default.Pos(results.to.line, results.to.ch); + _codemirror.default.signal(editor, 'hasCompletion', editor, results, token); } return results; }); /***/ }), -/***/ "../../graphiql-react/dist/hint.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/hint.cjs2.js ***! - \**********************************************/ +/***/ "../../codemirror-graphql/esm/info.js": +/*!********************************************!*\ + !*** ../../codemirror-graphql/esm/info.js ***! + \********************************************/ /***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { +"use strict"; -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const forEachState = __webpack_require__(/*! ./forEachState.cjs.js */ "../../graphiql-react/dist/forEachState.cjs.js"); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _getTypeInfo = _interopRequireDefault(__webpack_require__(/*! ./utils/getTypeInfo */ "../../codemirror-graphql/esm/utils/getTypeInfo.js")); +var _SchemaReference = __webpack_require__(/*! ./utils/SchemaReference */ "../../codemirror-graphql/esm/utils/SchemaReference.js"); +__webpack_require__(/*! ./utils/info-addon */ "../../codemirror-graphql/esm/utils/info-addon.js"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.registerHelper('info', 'graphql', (token, options) => { + var _a; + if (!options.schema || !token.state) { + return; + } + const { + kind, + step + } = token.state; + const typeInfo = (0, _getTypeInfo.default)(options.schema, token.state); + if (kind === 'Field' && step === 0 && typeInfo.fieldDef || kind === 'AliasedField' && step === 2 && typeInfo.fieldDef || kind === 'ObjectField' && step === 0 && typeInfo.fieldDef) { + const header = document.createElement('div'); + header.className = 'CodeMirror-info-header'; + renderField(header, typeInfo, options); + const into = document.createElement('div'); + into.append(header); + renderDescription(into, options, typeInfo.fieldDef); + return into; + } + if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) { + const header = document.createElement('div'); + header.className = 'CodeMirror-info-header'; + renderDirective(header, typeInfo, options); + const into = document.createElement('div'); + into.append(header); + renderDescription(into, options, typeInfo.directiveDef); + return into; + } + if (kind === 'Argument' && step === 0 && typeInfo.argDef) { + const header = document.createElement('div'); + header.className = 'CodeMirror-info-header'; + renderArg(header, typeInfo, options); + const into = document.createElement('div'); + into.append(header); + renderDescription(into, options, typeInfo.argDef); + return into; + } + if (kind === 'EnumValue' && ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.description)) { + const header = document.createElement('div'); + header.className = 'CodeMirror-info-header'; + renderEnumValue(header, typeInfo, options); + const into = document.createElement('div'); + into.append(header); + renderDescription(into, options, typeInfo.enumValue); + return into; + } + if (kind === 'NamedType' && typeInfo.type && typeInfo.type.description) { + const header = document.createElement('div'); + header.className = 'CodeMirror-info-header'; + renderType(header, typeInfo, options, typeInfo.type); + const into = document.createElement('div'); + into.append(header); + renderDescription(into, options, typeInfo.type); + return into; + } +}); +function renderField(into, typeInfo, options) { + renderQualifiedField(into, typeInfo, options); + renderTypeAnnotation(into, typeInfo, options, typeInfo.type); +} +function renderQualifiedField(into, typeInfo, options) { + var _a; + const fieldName = ((_a = typeInfo.fieldDef) === null || _a === void 0 ? void 0 : _a.name) || ''; + text(into, fieldName, 'field-name', options, (0, _SchemaReference.getFieldReference)(typeInfo)); +} +function renderDirective(into, typeInfo, options) { + var _a; + const name = '@' + (((_a = typeInfo.directiveDef) === null || _a === void 0 ? void 0 : _a.name) || ''); + text(into, name, 'directive-name', options, (0, _SchemaReference.getDirectiveReference)(typeInfo)); +} +function renderArg(into, typeInfo, options) { + var _a; + const name = ((_a = typeInfo.argDef) === null || _a === void 0 ? void 0 : _a.name) || ''; + text(into, name, 'arg-name', options, (0, _SchemaReference.getArgumentReference)(typeInfo)); + renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType); +} +function renderEnumValue(into, typeInfo, options) { + var _a; + const name = ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.name) || ''; + renderType(into, typeInfo, options, typeInfo.inputType); + text(into, '.'); + text(into, name, 'enum-value', options, (0, _SchemaReference.getEnumValueReference)(typeInfo)); +} +function renderTypeAnnotation(into, typeInfo, options, t) { + const typeSpan = document.createElement('span'); + typeSpan.className = 'type-name-pill'; + if (t instanceof _graphql.GraphQLNonNull) { + renderType(typeSpan, typeInfo, options, t.ofType); + text(typeSpan, '!'); + } else if (t instanceof _graphql.GraphQLList) { + text(typeSpan, '['); + renderType(typeSpan, typeInfo, options, t.ofType); + text(typeSpan, ']'); + } else { + text(typeSpan, (t === null || t === void 0 ? void 0 : t.name) || '', 'type-name', options, (0, _SchemaReference.getTypeReference)(typeInfo, t)); + } + into.append(typeSpan); +} +function renderType(into, typeInfo, options, t) { + if (t instanceof _graphql.GraphQLNonNull) { + renderType(into, typeInfo, options, t.ofType); + text(into, '!'); + } else if (t instanceof _graphql.GraphQLList) { + text(into, '['); + renderType(into, typeInfo, options, t.ofType); + text(into, ']'); + } else { + text(into, (t === null || t === void 0 ? void 0 : t.name) || '', 'type-name', options, (0, _SchemaReference.getTypeReference)(typeInfo, t)); + } +} +function renderDescription(into, options, def) { + const { + description + } = def; + if (description) { + const descriptionDiv = document.createElement('div'); + descriptionDiv.className = 'info-description'; + if (options.renderDescription) { + descriptionDiv.innerHTML = options.renderDescription(description); + } else { + descriptionDiv.append(document.createTextNode(description)); + } + into.append(descriptionDiv); + } + renderDeprecation(into, options, def); +} +function renderDeprecation(into, options, def) { + const reason = def.deprecationReason; + if (reason) { + const deprecationDiv = document.createElement('div'); + deprecationDiv.className = 'info-deprecation'; + into.append(deprecationDiv); + const label = document.createElement('span'); + label.className = 'info-deprecation-label'; + label.append(document.createTextNode('Deprecated')); + deprecationDiv.append(label); + const reasonDiv = document.createElement('div'); + reasonDiv.className = 'info-deprecation-reason'; + if (options.renderDescription) { + reasonDiv.innerHTML = options.renderDescription(reason); + } else { + reasonDiv.append(document.createTextNode(reason)); + } + deprecationDiv.append(reasonDiv); + } +} +function text(into, content, className = '', options = { + onClick: null +}, ref = null) { + if (className) { + const { + onClick + } = options; + let node; + if (onClick) { + node = document.createElement('a'); + node.href = 'javascript:void 0'; + node.addEventListener('click', e => { + e.preventDefault(); + onClick(ref, e); + }); + } else { + node = document.createElement('span'); + } + node.className = className; + node.append(document.createTextNode(content)); + into.append(node); + } else { + into.append(document.createTextNode(content)); + } +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/jump.js": +/*!********************************************!*\ + !*** ../../codemirror-graphql/esm/jump.js ***! + \********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _getTypeInfo = _interopRequireDefault(__webpack_require__(/*! ./utils/getTypeInfo */ "../../codemirror-graphql/esm/utils/getTypeInfo.js")); +var _SchemaReference = __webpack_require__(/*! ./utils/SchemaReference */ "../../codemirror-graphql/esm/utils/SchemaReference.js"); +__webpack_require__(/*! ./utils/jump-addon */ "../../codemirror-graphql/esm/utils/jump-addon.js"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.registerHelper('jump', 'graphql', (token, options) => { + if (!options.schema || !options.onClick || !token.state) { + return; + } + const { + state + } = token; + const { + kind, + step + } = state; + const typeInfo = (0, _getTypeInfo.default)(options.schema, state); + if (kind === 'Field' && step === 0 && typeInfo.fieldDef || kind === 'AliasedField' && step === 2 && typeInfo.fieldDef) { + return (0, _SchemaReference.getFieldReference)(typeInfo); + } + if (kind === 'Directive' && step === 1 && typeInfo.directiveDef) { + return (0, _SchemaReference.getDirectiveReference)(typeInfo); + } + if (kind === 'Argument' && step === 0 && typeInfo.argDef) { + return (0, _SchemaReference.getArgumentReference)(typeInfo); + } + if (kind === 'EnumValue' && typeInfo.enumValue) { + return (0, _SchemaReference.getEnumValueReference)(typeInfo); + } + if (kind === 'NamedType' && typeInfo.type) { + return (0, _SchemaReference.getTypeReference)(typeInfo); + } +}); + +/***/ }), + +/***/ "../../codemirror-graphql/esm/lint.js": +/*!********************************************!*\ + !*** ../../codemirror-graphql/esm/lint.js ***! + \********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const SEVERITY = ['error', 'warning', 'information', 'hint']; +const TYPE = { + 'GraphQL: Validation': 'validation', + 'GraphQL: Deprecation': 'deprecation', + 'GraphQL: Syntax': 'syntax' +}; +_codemirror.default.registerHelper('lint', 'graphql', (text, options) => { + const { + schema, + validationRules, + externalFragments + } = options; + const rawResults = (0, _graphqlLanguageService.getDiagnostics)(text, schema, validationRules, undefined, externalFragments); + const results = rawResults.map(error => ({ + message: error.message, + severity: error.severity ? SEVERITY[error.severity - 1] : SEVERITY[0], + type: error.source ? TYPE[error.source] : undefined, + from: _codemirror.default.Pos(error.range.start.line, error.range.start.character), + to: _codemirror.default.Pos(error.range.end.line, error.range.end.character) + })); + return results; +}); + +/***/ }), + +/***/ "../../codemirror-graphql/esm/mode.js": +/*!********************************************!*\ + !*** ../../codemirror-graphql/esm/mode.js ***! + \********************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _modeFactory = _interopRequireDefault(__webpack_require__(/*! ./utils/mode-factory */ "../../codemirror-graphql/esm/utils/mode-factory.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.defineMode('graphql', _modeFactory.default); + +/***/ }), + +/***/ "../../codemirror-graphql/esm/results/mode.js": +/*!****************************************************!*\ + !*** ../../codemirror-graphql/esm/results/mode.js ***! + \****************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +var _modeIndent = _interopRequireDefault(__webpack_require__(/*! ../utils/mode-indent */ "../../codemirror-graphql/esm/utils/mode-indent.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.defineMode('graphql-results', config => { + const parser = (0, _graphqlLanguageService.onlineParser)({ + eatWhitespace: stream => stream.eatSpace(), + lexRules: LexRules, + parseRules: ParseRules, + editorConfig: { + tabSize: config.tabSize + } + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: _modeIndent.default, + electricInput: /^\s*[}\]]/, + fold: 'brace', + closeBrackets: { + pairs: '[]{}""', + explode: '[]{}' + } + }; +}); +const LexRules = { + Punctuation: /^\[|]|\{|\}|:|,/, + Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, + String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, + Keyword: /^true|false|null/ +}; +const ParseRules = { + Document: [(0, _graphqlLanguageService.p)('{'), (0, _graphqlLanguageService.list)('Entry', (0, _graphqlLanguageService.p)(',')), (0, _graphqlLanguageService.p)('}')], + Entry: [(0, _graphqlLanguageService.t)('String', 'def'), (0, _graphqlLanguageService.p)(':'), 'Value'], + Value(token) { + switch (token.kind) { + case 'Number': + return 'NumberValue'; + case 'String': + return 'StringValue'; + case 'Punctuation': + switch (token.value) { + case '[': + return 'ListValue'; + case '{': + return 'ObjectValue'; + } + return null; + case 'Keyword': + switch (token.value) { + case 'true': + case 'false': + return 'BooleanValue'; + case 'null': + return 'NullValue'; + } + return null; + } + }, + NumberValue: [(0, _graphqlLanguageService.t)('Number', 'number')], + StringValue: [(0, _graphqlLanguageService.t)('String', 'string')], + BooleanValue: [(0, _graphqlLanguageService.t)('Keyword', 'builtin')], + NullValue: [(0, _graphqlLanguageService.t)('Keyword', 'keyword')], + ListValue: [(0, _graphqlLanguageService.p)('['), (0, _graphqlLanguageService.list)('Value', (0, _graphqlLanguageService.p)(',')), (0, _graphqlLanguageService.p)(']')], + ObjectValue: [(0, _graphqlLanguageService.p)('{'), (0, _graphqlLanguageService.list)('ObjectField', (0, _graphqlLanguageService.p)(',')), (0, _graphqlLanguageService.p)('}')], + ObjectField: [(0, _graphqlLanguageService.t)('String', 'property'), (0, _graphqlLanguageService.p)(':'), 'Value'] +}; + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/SchemaReference.js": +/*!*************************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/SchemaReference.js ***! + \*************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.getArgumentReference = getArgumentReference; +exports.getDirectiveReference = getDirectiveReference; +exports.getEnumValueReference = getEnumValueReference; +exports.getFieldReference = getFieldReference; +exports.getTypeReference = getTypeReference; +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +function getFieldReference(typeInfo) { + return { + kind: 'Field', + schema: typeInfo.schema, + field: typeInfo.fieldDef, + type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType + }; +} +function getDirectiveReference(typeInfo) { + return { + kind: 'Directive', + schema: typeInfo.schema, + directive: typeInfo.directiveDef + }; +} +function getArgumentReference(typeInfo) { + return typeInfo.directiveDef ? { + kind: 'Argument', + schema: typeInfo.schema, + argument: typeInfo.argDef, + directive: typeInfo.directiveDef + } : { + kind: 'Argument', + schema: typeInfo.schema, + argument: typeInfo.argDef, + field: typeInfo.fieldDef, + type: isMetaField(typeInfo.fieldDef) ? null : typeInfo.parentType + }; +} +function getEnumValueReference(typeInfo) { + return { + kind: 'EnumValue', + value: typeInfo.enumValue || undefined, + type: typeInfo.inputType ? (0, _graphql.getNamedType)(typeInfo.inputType) : undefined + }; +} +function getTypeReference(typeInfo, type) { + return { + kind: 'Type', + schema: typeInfo.schema, + type: type || typeInfo.type + }; +} +function isMetaField(fieldDef) { + return fieldDef.name.slice(0, 2) === '__'; +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/forEachState.js": +/*!**********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/forEachState.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = forEachState; +function forEachState(stack, fn) { + const reverseStateStack = []; + let state = stack; + while (state === null || state === void 0 ? void 0 : state.kind) { + reverseStateStack.push(state); + state = state.prevState; + } + for (let i = reverseStateStack.length - 1; i >= 0; i--) { + fn(reverseStateStack[i]); + } +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/getTypeInfo.js": +/*!*********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/getTypeInfo.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = getTypeInfo; +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _forEachState = _interopRequireDefault(__webpack_require__(/*! ./forEachState */ "../../codemirror-graphql/esm/utils/forEachState.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +function getTypeInfo(schema, tokenState) { + const info = { + schema, + type: null, + parentType: null, + inputType: null, + directiveDef: null, + fieldDef: null, + argDef: null, + argDefs: null, + objectFieldDefs: null + }; + (0, _forEachState.default)(tokenState, state => { + var _a, _b; + switch (state.kind) { + case 'Query': + case 'ShortQuery': + info.type = schema.getQueryType(); + break; + case 'Mutation': + info.type = schema.getMutationType(); + break; + case 'Subscription': + info.type = schema.getSubscriptionType(); + break; + case 'InlineFragment': + case 'FragmentDefinition': + if (state.type) { + info.type = schema.getType(state.type); + } + break; + case 'Field': + case 'AliasedField': + info.fieldDef = info.type && state.name ? getFieldDef(schema, info.parentType, state.name) : null; + info.type = (_a = info.fieldDef) === null || _a === void 0 ? void 0 : _a.type; + break; + case 'SelectionSet': + info.parentType = info.type ? (0, _graphql.getNamedType)(info.type) : null; + break; + case 'Directive': + info.directiveDef = state.name ? schema.getDirective(state.name) : null; + break; + case 'Arguments': + const parentDef = state.prevState ? state.prevState.kind === 'Field' ? info.fieldDef : state.prevState.kind === 'Directive' ? info.directiveDef : state.prevState.kind === 'AliasedField' ? state.prevState.name && getFieldDef(schema, info.parentType, state.prevState.name) : null : null; + info.argDefs = parentDef ? parentDef.args : null; + break; + case 'Argument': + info.argDef = null; + if (info.argDefs) { + for (let i = 0; i < info.argDefs.length; i++) { + if (info.argDefs[i].name === state.name) { + info.argDef = info.argDefs[i]; + break; + } + } + } + info.inputType = (_b = info.argDef) === null || _b === void 0 ? void 0 : _b.type; + break; + case 'EnumValue': + const enumType = info.inputType ? (0, _graphql.getNamedType)(info.inputType) : null; + info.enumValue = enumType instanceof _graphql.GraphQLEnumType ? find(enumType.getValues(), val => val.value === state.name) : null; + break; + case 'ListValue': + const nullableType = info.inputType ? (0, _graphql.getNullableType)(info.inputType) : null; + info.inputType = nullableType instanceof _graphql.GraphQLList ? nullableType.ofType : null; + break; + case 'ObjectValue': + const objectType = info.inputType ? (0, _graphql.getNamedType)(info.inputType) : null; + info.objectFieldDefs = objectType instanceof _graphql.GraphQLInputObjectType ? objectType.getFields() : null; + break; + case 'ObjectField': + const objectField = state.name && info.objectFieldDefs ? info.objectFieldDefs[state.name] : null; + info.inputType = objectField === null || objectField === void 0 ? void 0 : objectField.type; + info.fieldDef = objectField; + break; + case 'NamedType': + info.type = state.name ? schema.getType(state.name) : null; + break; + } + }); + return info; +} +function getFieldDef(schema, type, fieldName) { + if (fieldName === _graphql.SchemaMetaFieldDef.name && schema.getQueryType() === type) { + return _graphql.SchemaMetaFieldDef; + } + if (fieldName === _graphql.TypeMetaFieldDef.name && schema.getQueryType() === type) { + return _graphql.TypeMetaFieldDef; + } + if (fieldName === _graphql.TypeNameMetaFieldDef.name && (0, _graphql.isCompositeType)(type)) { + return _graphql.TypeNameMetaFieldDef; + } + if (type && type.getFields) { + return type.getFields()[fieldName]; + } +} +function find(array, predicate) { + for (let i = 0; i < array.length; i++) { + if (predicate(array[i])) { + return array[i]; + } + } +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/hintList.js": +/*!******************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/hintList.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = hintList; function hintList(cursor, token, list) { const hints = filterAndSortList(list, normalizeText(token.string)); if (!hints) { @@ -68208,7 +73955,7 @@ function filterNonEmpty(array, predicate) { return filtered.length === 0 ? array : filtered; } function normalizeText(text) { - return text.toLowerCase().replaceAll(/\W/g, ""); + return text.toLowerCase().replaceAll(/\W/g, ''); } function getProximity(suggestion, text) { let proximity = lexicalDistance(text, suggestion); @@ -68241,26 +73988,668 @@ function lexicalDistance(a, b) { } return d[aLength][bLength]; } -codemirror.CodeMirror.registerHelper("hint", "graphql-variables", (editor, options) => { + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/info-addon.js": +/*!********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/info-addon.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.defineOption('info', false, (cm, options, old) => { + if (old && old !== _codemirror.default.Init) { + const oldOnMouseOver = cm.state.info.onMouseOver; + _codemirror.default.off(cm.getWrapperElement(), 'mouseover', oldOnMouseOver); + clearTimeout(cm.state.info.hoverTimeout); + delete cm.state.info; + } + if (options) { + const state = cm.state.info = createState(options); + state.onMouseOver = onMouseOver.bind(null, cm); + _codemirror.default.on(cm.getWrapperElement(), 'mouseover', state.onMouseOver); + } +}); +function createState(options) { + return { + options: options instanceof Function ? { + render: options + } : options === true ? {} : options + }; +} +function getHoverTime(cm) { + const { + options + } = cm.state.info; + return (options === null || options === void 0 ? void 0 : options.hoverTime) || 500; +} +function onMouseOver(cm, e) { + const state = cm.state.info; + const target = e.target || e.srcElement; + if (!(target instanceof HTMLElement)) { + return; + } + if (target.nodeName !== 'SPAN' || state.hoverTimeout !== undefined) { + return; + } + const box = target.getBoundingClientRect(); + const onMouseMove = function () { + clearTimeout(state.hoverTimeout); + state.hoverTimeout = setTimeout(onHover, hoverTime); + }; + const onMouseOut = function () { + _codemirror.default.off(document, 'mousemove', onMouseMove); + _codemirror.default.off(cm.getWrapperElement(), 'mouseout', onMouseOut); + clearTimeout(state.hoverTimeout); + state.hoverTimeout = undefined; + }; + const onHover = function () { + _codemirror.default.off(document, 'mousemove', onMouseMove); + _codemirror.default.off(cm.getWrapperElement(), 'mouseout', onMouseOut); + state.hoverTimeout = undefined; + onMouseHover(cm, box); + }; + const hoverTime = getHoverTime(cm); + state.hoverTimeout = setTimeout(onHover, hoverTime); + _codemirror.default.on(document, 'mousemove', onMouseMove); + _codemirror.default.on(cm.getWrapperElement(), 'mouseout', onMouseOut); +} +function onMouseHover(cm, box) { + const pos = cm.coordsChar({ + left: (box.left + box.right) / 2, + top: (box.top + box.bottom) / 2 + }, 'window'); + const state = cm.state.info; + const { + options + } = state; + const render = options.render || cm.getHelper(pos, 'info'); + if (render) { + const token = cm.getTokenAt(pos, true); + if (token) { + const info = render(token, options, cm, pos); + if (info) { + showPopup(cm, box, info); + } + } + } +} +function showPopup(cm, box, info) { + const popup = document.createElement('div'); + popup.className = 'CodeMirror-info'; + popup.append(info); + document.body.append(popup); + const popupBox = popup.getBoundingClientRect(); + const popupStyle = window.getComputedStyle(popup); + const popupWidth = popupBox.right - popupBox.left + parseFloat(popupStyle.marginLeft) + parseFloat(popupStyle.marginRight); + const popupHeight = popupBox.bottom - popupBox.top + parseFloat(popupStyle.marginTop) + parseFloat(popupStyle.marginBottom); + let topPos = box.bottom; + if (popupHeight > window.innerHeight - box.bottom - 15 && box.top > window.innerHeight - box.bottom) { + topPos = box.top - popupHeight; + } + if (topPos < 0) { + topPos = box.bottom; + } + let leftPos = Math.max(0, window.innerWidth - popupWidth - 15); + if (leftPos > box.left) { + leftPos = box.left; + } + popup.style.opacity = '1'; + popup.style.top = topPos + 'px'; + popup.style.left = leftPos + 'px'; + let popupTimeout; + const onMouseOverPopup = function () { + clearTimeout(popupTimeout); + }; + const onMouseOut = function () { + clearTimeout(popupTimeout); + popupTimeout = setTimeout(hidePopup, 200); + }; + const hidePopup = function () { + _codemirror.default.off(popup, 'mouseover', onMouseOverPopup); + _codemirror.default.off(popup, 'mouseout', onMouseOut); + _codemirror.default.off(cm.getWrapperElement(), 'mouseout', onMouseOut); + if (popup.style.opacity) { + popup.style.opacity = '0'; + setTimeout(() => { + if (popup.parentNode) { + popup.remove(); + } + }, 600); + } else if (popup.parentNode) { + popup.remove(); + } + }; + _codemirror.default.on(popup, 'mouseover', onMouseOverPopup); + _codemirror.default.on(popup, 'mouseout', onMouseOut); + _codemirror.default.on(cm.getWrapperElement(), 'mouseout', onMouseOut); +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/jsonParse.js": +/*!*******************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/jsonParse.js ***! + \*******************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports.JSONSyntaxError = void 0; +exports["default"] = jsonParse; +function jsonParse(str) { + string = str; + strLen = str.length; + start = end = lastEnd = -1; + ch(); + lex(); + const ast = parseObj(); + expect('EOF'); + return ast; +} +let string; +let strLen; +let start; +let end; +let lastEnd; +let code; +let kind; +function parseObj() { + const nodeStart = start; + const members = []; + expect('{'); + if (!skip('}')) { + do { + members.push(parseMember()); + } while (skip(',')); + expect('}'); + } + return { + kind: 'Object', + start: nodeStart, + end: lastEnd, + members + }; +} +function parseMember() { + const nodeStart = start; + const key = kind === 'String' ? curToken() : null; + expect('String'); + expect(':'); + const value = parseVal(); + return { + kind: 'Member', + start: nodeStart, + end: lastEnd, + key, + value + }; +} +function parseArr() { + const nodeStart = start; + const values = []; + expect('['); + if (!skip(']')) { + do { + values.push(parseVal()); + } while (skip(',')); + expect(']'); + } + return { + kind: 'Array', + start: nodeStart, + end: lastEnd, + values + }; +} +function parseVal() { + switch (kind) { + case '[': + return parseArr(); + case '{': + return parseObj(); + case 'String': + case 'Number': + case 'Boolean': + case 'Null': + const token = curToken(); + lex(); + return token; + } + expect('Value'); +} +function curToken() { + return { + kind, + start, + end, + value: JSON.parse(string.slice(start, end)) + }; +} +function expect(str) { + if (kind === str) { + lex(); + return; + } + let found; + if (kind === 'EOF') { + found = '[end of file]'; + } else if (end - start > 1) { + found = '`' + string.slice(start, end) + '`'; + } else { + const match = string.slice(start).match(/^.+?\b/); + found = '`' + (match ? match[0] : string[start]) + '`'; + } + throw syntaxError(`Expected ${str} but found ${found}.`); +} +class JSONSyntaxError extends Error { + constructor(message, position) { + super(message); + this.position = position; + } +} +exports.JSONSyntaxError = JSONSyntaxError; +function syntaxError(message) { + return new JSONSyntaxError(message, { + start, + end + }); +} +function skip(k) { + if (kind === k) { + lex(); + return true; + } +} +function ch() { + if (end < strLen) { + end++; + code = end === strLen ? 0 : string.charCodeAt(end); + } + return code; +} +function lex() { + lastEnd = end; + while (code === 9 || code === 10 || code === 13 || code === 32) { + ch(); + } + if (code === 0) { + kind = 'EOF'; + return; + } + start = end; + switch (code) { + case 34: + kind = 'String'; + return readString(); + case 45: + case 48: + case 49: + case 50: + case 51: + case 52: + case 53: + case 54: + case 55: + case 56: + case 57: + kind = 'Number'; + return readNumber(); + case 102: + if (string.slice(start, start + 5) !== 'false') { + break; + } + end += 4; + ch(); + kind = 'Boolean'; + return; + case 110: + if (string.slice(start, start + 4) !== 'null') { + break; + } + end += 3; + ch(); + kind = 'Null'; + return; + case 116: + if (string.slice(start, start + 4) !== 'true') { + break; + } + end += 3; + ch(); + kind = 'Boolean'; + return; + } + kind = string[start]; + ch(); +} +function readString() { + ch(); + while (code !== 34 && code > 31) { + if (code === 92) { + code = ch(); + switch (code) { + case 34: + case 47: + case 92: + case 98: + case 102: + case 110: + case 114: + case 116: + ch(); + break; + case 117: + ch(); + readHex(); + readHex(); + readHex(); + readHex(); + break; + default: + throw syntaxError('Bad character escape sequence.'); + } + } else if (end === strLen) { + throw syntaxError('Unterminated string.'); + } else { + ch(); + } + } + if (code === 34) { + ch(); + return; + } + throw syntaxError('Unterminated string.'); +} +function readHex() { + if (code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102) { + return ch(); + } + throw syntaxError('Expected hexadecimal digit.'); +} +function readNumber() { + if (code === 45) { + ch(); + } + if (code === 48) { + ch(); + } else { + readDigits(); + } + if (code === 46) { + ch(); + readDigits(); + } + if (code === 69 || code === 101) { + code = ch(); + if (code === 43 || code === 45) { + ch(); + } + readDigits(); + } +} +function readDigits() { + if (code < 48 || code > 57) { + throw syntaxError('Expected decimal digit.'); + } + do { + ch(); + } while (code >= 48 && code <= 57); +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/jump-addon.js": +/*!********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/jump-addon.js ***! + \********************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.defineOption('jump', false, (cm, options, old) => { + if (old && old !== _codemirror.default.Init) { + const oldOnMouseOver = cm.state.jump.onMouseOver; + _codemirror.default.off(cm.getWrapperElement(), 'mouseover', oldOnMouseOver); + const oldOnMouseOut = cm.state.jump.onMouseOut; + _codemirror.default.off(cm.getWrapperElement(), 'mouseout', oldOnMouseOut); + _codemirror.default.off(document, 'keydown', cm.state.jump.onKeyDown); + delete cm.state.jump; + } + if (options) { + const state = cm.state.jump = { + options, + onMouseOver: onMouseOver.bind(null, cm), + onMouseOut: onMouseOut.bind(null, cm), + onKeyDown: onKeyDown.bind(null, cm) + }; + _codemirror.default.on(cm.getWrapperElement(), 'mouseover', state.onMouseOver); + _codemirror.default.on(cm.getWrapperElement(), 'mouseout', state.onMouseOut); + _codemirror.default.on(document, 'keydown', state.onKeyDown); + } +}); +function onMouseOver(cm, event) { + const target = event.target || event.srcElement; + if (!(target instanceof HTMLElement)) { + return; + } + if ((target === null || target === void 0 ? void 0 : target.nodeName) !== 'SPAN') { + return; + } + const box = target.getBoundingClientRect(); + const cursor = { + left: (box.left + box.right) / 2, + top: (box.top + box.bottom) / 2 + }; + cm.state.jump.cursor = cursor; + if (cm.state.jump.isHoldingModifier) { + enableJumpMode(cm); + } +} +function onMouseOut(cm) { + if (!cm.state.jump.isHoldingModifier && cm.state.jump.cursor) { + cm.state.jump.cursor = null; + return; + } + if (cm.state.jump.isHoldingModifier && cm.state.jump.marker) { + disableJumpMode(cm); + } +} +function onKeyDown(cm, event) { + if (cm.state.jump.isHoldingModifier || !isJumpModifier(event.key)) { + return; + } + cm.state.jump.isHoldingModifier = true; + if (cm.state.jump.cursor) { + enableJumpMode(cm); + } + const onKeyUp = upEvent => { + if (upEvent.code !== event.code) { + return; + } + cm.state.jump.isHoldingModifier = false; + if (cm.state.jump.marker) { + disableJumpMode(cm); + } + _codemirror.default.off(document, 'keyup', onKeyUp); + _codemirror.default.off(document, 'click', onClick); + cm.off('mousedown', onMouseDown); + }; + const onClick = clickEvent => { + const { + destination, + options + } = cm.state.jump; + if (destination) { + options.onClick(destination, clickEvent); + } + }; + const onMouseDown = (_, downEvent) => { + if (cm.state.jump.destination) { + downEvent.codemirrorIgnore = true; + } + }; + _codemirror.default.on(document, 'keyup', onKeyUp); + _codemirror.default.on(document, 'click', onClick); + cm.on('mousedown', onMouseDown); +} +const isMac = typeof navigator !== 'undefined' && navigator.userAgent.includes('Mac'); +function isJumpModifier(key) { + return key === (isMac ? 'Meta' : 'Control'); +} +function enableJumpMode(cm) { + if (cm.state.jump.marker) { + return; + } + const { + cursor, + options + } = cm.state.jump; + const pos = cm.coordsChar(cursor); + const token = cm.getTokenAt(pos, true); + const getDestination = options.getDestination || cm.getHelper(pos, 'jump'); + if (getDestination) { + const destination = getDestination(token, options, cm); + if (destination) { + const marker = cm.markText({ + line: pos.line, + ch: token.start + }, { + line: pos.line, + ch: token.end + }, { + className: 'CodeMirror-jump-token' + }); + cm.state.jump.marker = marker; + cm.state.jump.destination = destination; + } + } +} +function disableJumpMode(cm) { + const { + marker + } = cm.state.jump; + cm.state.jump.marker = null; + cm.state.jump.destination = null; + marker.clear(); +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/mode-factory.js": +/*!**********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/mode-factory.js ***! + \**********************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = void 0; +var _graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +var _modeIndent = _interopRequireDefault(__webpack_require__(/*! ./mode-indent */ "../../codemirror-graphql/esm/utils/mode-indent.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +const graphqlModeFactory = config => { + const parser = (0, _graphqlLanguageService.onlineParser)({ + eatWhitespace: stream => stream.eatWhile(_graphqlLanguageService.isIgnored), + lexRules: _graphqlLanguageService.LexRules, + parseRules: _graphqlLanguageService.ParseRules, + editorConfig: { + tabSize: config.tabSize + } + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: _modeIndent.default, + electricInput: /^\s*[})\]]/, + fold: 'brace', + lineComment: '#', + closeBrackets: { + pairs: '()[]{}""', + explode: '()[]{}' + } + }; +}; +var _default = exports["default"] = graphqlModeFactory; + +/***/ }), + +/***/ "../../codemirror-graphql/esm/utils/mode-indent.js": +/*!*********************************************************!*\ + !*** ../../codemirror-graphql/esm/utils/mode-indent.js ***! + \*********************************************************/ +/***/ (function(__unused_webpack_module, exports) { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ + value: true +})); +exports["default"] = indent; +function indent(state, textAfter) { + var _a, _b; + const { + levels, + indentLevel + } = state; + const level = !levels || levels.length === 0 ? indentLevel : levels.at(-1) - (((_a = this.electricInput) === null || _a === void 0 ? void 0 : _a.test(textAfter)) ? 1 : 0); + return (level || 0) * (((_b = this.config) === null || _b === void 0 ? void 0 : _b.indentUnit) || 0); +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/variables/hint.js": +/*!******************************************************!*\ + !*** ../../codemirror-graphql/esm/variables/hint.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _forEachState = _interopRequireDefault(__webpack_require__(/*! ../utils/forEachState */ "../../codemirror-graphql/esm/utils/forEachState.js")); +var _hintList = _interopRequireDefault(__webpack_require__(/*! ../utils/hintList */ "../../codemirror-graphql/esm/utils/hintList.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.registerHelper('hint', 'graphql-variables', (editor, options) => { const cur = editor.getCursor(); const token = editor.getTokenAt(cur); const results = getVariablesHint(cur, token, options); if ((results === null || results === void 0 ? void 0 : results.list) && results.list.length > 0) { - results.from = codemirror.CodeMirror.Pos(results.from.line, results.from.ch); - results.to = codemirror.CodeMirror.Pos(results.to.line, results.to.ch); - codemirror.CodeMirror.signal(editor, "hasCompletion", editor, results, token); + results.from = _codemirror.default.Pos(results.from.line, results.from.ch); + results.to = _codemirror.default.Pos(results.to.line, results.to.ch); + _codemirror.default.signal(editor, 'hasCompletion', editor, results, token); } return results; }); function getVariablesHint(cur, token, options) { - const state = token.state.kind === "Invalid" ? token.state.prevState : token.state; + const state = token.state.kind === 'Invalid' ? token.state.prevState : token.state; const { kind, step } = state; - if (kind === "Document" && step === 0) { - return hintList(cur, token, [{ - text: "{" + if (kind === 'Document' && step === 0) { + return (0, _hintList.default)(cur, token, [{ + text: '{' }]); } const { @@ -68270,45 +74659,45 @@ function getVariablesHint(cur, token, options) { return; } const typeInfo = getTypeInfo(variableToType, token.state); - if (kind === "Document" || kind === "Variable" && step === 0) { + if (kind === 'Document' || kind === 'Variable' && step === 0) { const variableNames = Object.keys(variableToType); - return hintList(cur, token, variableNames.map(name => ({ + return (0, _hintList.default)(cur, token, variableNames.map(name => ({ text: `"${name}": `, type: variableToType[name] }))); } - if ((kind === "ObjectValue" || kind === "ObjectField" && step === 0) && typeInfo.fields) { + if ((kind === 'ObjectValue' || kind === 'ObjectField' && step === 0) && typeInfo.fields) { const inputFields = Object.keys(typeInfo.fields).map(fieldName => typeInfo.fields[fieldName]); - return hintList(cur, token, inputFields.map(field => ({ + return (0, _hintList.default)(cur, token, inputFields.map(field => ({ text: `"${field.name}": `, type: field.type, description: field.description }))); } - if (kind === "StringValue" || kind === "NumberValue" || kind === "BooleanValue" || kind === "NullValue" || kind === "ListValue" && step === 1 || kind === "ObjectField" && step === 2 || kind === "Variable" && step === 2) { - const namedInputType = typeInfo.type ? graphql.getNamedType(typeInfo.type) : void 0; - if (namedInputType instanceof graphql.GraphQLInputObjectType) { - return hintList(cur, token, [{ - text: "{" + if (kind === 'StringValue' || kind === 'NumberValue' || kind === 'BooleanValue' || kind === 'NullValue' || kind === 'ListValue' && step === 1 || kind === 'ObjectField' && step === 2 || kind === 'Variable' && step === 2) { + const namedInputType = typeInfo.type ? (0, _graphql.getNamedType)(typeInfo.type) : undefined; + if (namedInputType instanceof _graphql.GraphQLInputObjectType) { + return (0, _hintList.default)(cur, token, [{ + text: '{' }]); } - if (namedInputType instanceof graphql.GraphQLEnumType) { + if (namedInputType instanceof _graphql.GraphQLEnumType) { const values = namedInputType.getValues(); - return hintList(cur, token, values.map(value => ({ + return (0, _hintList.default)(cur, token, values.map(value => ({ text: `"${value.name}"`, type: namedInputType, description: value.description }))); } - if (namedInputType === graphql.GraphQLBoolean) { - return hintList(cur, token, [{ - text: "true", - type: graphql.GraphQLBoolean, - description: "Not false." + if (namedInputType === _graphql.GraphQLBoolean) { + return (0, _hintList.default)(cur, token, [{ + text: 'true', + type: _graphql.GraphQLBoolean, + description: 'Not false.' }, { - text: "false", - type: graphql.GraphQLBoolean, - description: "Not true." + text: 'false', + type: _graphql.GraphQLBoolean, + description: 'Not true.' }]); } } @@ -68318,26 +74707,26 @@ function getTypeInfo(variableToType, tokenState) { type: null, fields: null }; - forEachState.forEachState(tokenState, state => { + (0, _forEachState.default)(tokenState, state => { switch (state.kind) { - case "Variable": + case 'Variable': { info.type = variableToType[state.name]; break; } - case "ListValue": + case 'ListValue': { - const nullableType = info.type ? graphql.getNullableType(info.type) : void 0; - info.type = nullableType instanceof graphql.GraphQLList ? nullableType.ofType : null; + const nullableType = info.type ? (0, _graphql.getNullableType)(info.type) : undefined; + info.type = nullableType instanceof _graphql.GraphQLList ? nullableType.ofType : null; break; } - case "ObjectValue": + case 'ObjectValue': { - const objectType = info.type ? graphql.getNamedType(info.type) : void 0; - info.fields = objectType instanceof graphql.GraphQLInputObjectType ? objectType.getFields() : null; + const objectType = info.type ? (0, _graphql.getNamedType)(info.type) : undefined; + info.fields = objectType instanceof _graphql.GraphQLInputObjectType ? objectType.getFields() : null; break; } - case "ObjectField": + case 'ObjectField': { const objectField = state.name && info.fields ? info.fields[state.name] : null; info.type = objectField === null || objectField === void 0 ? void 0 : objectField.type; @@ -68350,18 +74739,260 @@ function getTypeInfo(variableToType, tokenState) { /***/ }), +/***/ "../../codemirror-graphql/esm/variables/lint.js": +/*!******************************************************!*\ + !*** ../../codemirror-graphql/esm/variables/lint.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); +var _jsonParse = _interopRequireWildcard(__webpack_require__(/*! ../utils/jsonParse */ "../../codemirror-graphql/esm/utils/jsonParse.js")); +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.registerHelper('lint', 'graphql-variables', (text, options, editor) => { + if (!text) { + return []; + } + let ast; + try { + ast = (0, _jsonParse.default)(text); + } catch (error) { + if (error instanceof _jsonParse.JSONSyntaxError) { + return [lintError(editor, error.position, error.message)]; + } + throw error; + } + const { + variableToType + } = options; + if (!variableToType) { + return []; + } + return validateVariables(editor, variableToType, ast); +}); +function validateVariables(editor, variableToType, variablesAST) { + var _a; + const errors = []; + for (const member of variablesAST.members) { + if (member) { + const variableName = (_a = member.key) === null || _a === void 0 ? void 0 : _a.value; + const type = variableToType[variableName]; + if (type) { + for (const [node, message] of validateValue(type, member.value)) { + errors.push(lintError(editor, node, message)); + } + } else { + errors.push(lintError(editor, member.key, `Variable "$${variableName}" does not appear in any GraphQL query.`)); + } + } + } + return errors; +} +function validateValue(type, valueAST) { + if (!type || !valueAST) { + return []; + } + if (type instanceof _graphql.GraphQLNonNull) { + if (valueAST.kind === 'Null') { + return [[valueAST, `Type "${type}" is non-nullable and cannot be null.`]]; + } + return validateValue(type.ofType, valueAST); + } + if (valueAST.kind === 'Null') { + return []; + } + if (type instanceof _graphql.GraphQLList) { + const itemType = type.ofType; + if (valueAST.kind === 'Array') { + const values = valueAST.values || []; + return mapCat(values, item => validateValue(itemType, item)); + } + return validateValue(itemType, valueAST); + } + if (type instanceof _graphql.GraphQLInputObjectType) { + if (valueAST.kind !== 'Object') { + return [[valueAST, `Type "${type}" must be an Object.`]]; + } + const providedFields = Object.create(null); + const fieldErrors = mapCat(valueAST.members, member => { + var _a; + const fieldName = (_a = member === null || member === void 0 ? void 0 : member.key) === null || _a === void 0 ? void 0 : _a.value; + providedFields[fieldName] = true; + const inputField = type.getFields()[fieldName]; + if (!inputField) { + return [[member.key, `Type "${type}" does not have a field "${fieldName}".`]]; + } + const fieldType = inputField ? inputField.type : undefined; + return validateValue(fieldType, member.value); + }); + for (const fieldName of Object.keys(type.getFields())) { + const field = type.getFields()[fieldName]; + if (!providedFields[fieldName] && field.type instanceof _graphql.GraphQLNonNull && !field.defaultValue) { + fieldErrors.push([valueAST, `Object of type "${type}" is missing required field "${fieldName}".`]); + } + } + return fieldErrors; + } + if (type.name === 'Boolean' && valueAST.kind !== 'Boolean' || type.name === 'String' && valueAST.kind !== 'String' || type.name === 'ID' && valueAST.kind !== 'Number' && valueAST.kind !== 'String' || type.name === 'Float' && valueAST.kind !== 'Number' || type.name === 'Int' && (valueAST.kind !== 'Number' || (valueAST.value | 0) !== valueAST.value)) { + return [[valueAST, `Expected value of type "${type}".`]]; + } + if ((type instanceof _graphql.GraphQLEnumType || type instanceof _graphql.GraphQLScalarType) && (valueAST.kind !== 'String' && valueAST.kind !== 'Number' && valueAST.kind !== 'Boolean' && valueAST.kind !== 'Null' || isNullish(type.parseValue(valueAST.value)))) { + return [[valueAST, `Expected value of type "${type}".`]]; + } + return []; +} +function lintError(editor, node, message) { + return { + message, + severity: 'error', + type: 'validation', + from: editor.posFromIndex(node.start), + to: editor.posFromIndex(node.end) + }; +} +function isNullish(value) { + return value === null || value === undefined || value !== value; +} +function mapCat(array, mapper) { + return Array.prototype.concat.apply([], array.map(mapper)); +} + +/***/ }), + +/***/ "../../codemirror-graphql/esm/variables/mode.js": +/*!******************************************************!*\ + !*** ../../codemirror-graphql/esm/variables/mode.js ***! + \******************************************************/ +/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { + +"use strict"; + + +var _codemirror = _interopRequireDefault(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js")); +var _graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); +var _modeIndent = _interopRequireDefault(__webpack_require__(/*! ../utils/mode-indent */ "../../codemirror-graphql/esm/utils/mode-indent.js")); +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } +_codemirror.default.defineMode('graphql-variables', config => { + const parser = (0, _graphqlLanguageService.onlineParser)({ + eatWhitespace: stream => stream.eatSpace(), + lexRules: LexRules, + parseRules: ParseRules, + editorConfig: { + tabSize: config.tabSize + } + }); + return { + config, + startState: parser.startState, + token: parser.token, + indent: _modeIndent.default, + electricInput: /^\s*[}\]]/, + fold: 'brace', + closeBrackets: { + pairs: '[]{}""', + explode: '[]{}' + } + }; +}); +const LexRules = { + Punctuation: /^\[|]|\{|\}|:|,/, + Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, + String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, + Keyword: /^true|false|null/ +}; +const ParseRules = { + Document: [(0, _graphqlLanguageService.p)('{'), (0, _graphqlLanguageService.list)('Variable', (0, _graphqlLanguageService.opt)((0, _graphqlLanguageService.p)(','))), (0, _graphqlLanguageService.p)('}')], + Variable: [namedKey('variable'), (0, _graphqlLanguageService.p)(':'), 'Value'], + Value(token) { + switch (token.kind) { + case 'Number': + return 'NumberValue'; + case 'String': + return 'StringValue'; + case 'Punctuation': + switch (token.value) { + case '[': + return 'ListValue'; + case '{': + return 'ObjectValue'; + } + return null; + case 'Keyword': + switch (token.value) { + case 'true': + case 'false': + return 'BooleanValue'; + case 'null': + return 'NullValue'; + } + return null; + } + }, + NumberValue: [(0, _graphqlLanguageService.t)('Number', 'number')], + StringValue: [(0, _graphqlLanguageService.t)('String', 'string')], + BooleanValue: [(0, _graphqlLanguageService.t)('Keyword', 'builtin')], + NullValue: [(0, _graphqlLanguageService.t)('Keyword', 'keyword')], + ListValue: [(0, _graphqlLanguageService.p)('['), (0, _graphqlLanguageService.list)('Value', (0, _graphqlLanguageService.opt)((0, _graphqlLanguageService.p)(','))), (0, _graphqlLanguageService.p)(']')], + ObjectValue: [(0, _graphqlLanguageService.p)('{'), (0, _graphqlLanguageService.list)('ObjectField', (0, _graphqlLanguageService.opt)((0, _graphqlLanguageService.p)(','))), (0, _graphqlLanguageService.p)('}')], + ObjectField: [namedKey('attribute'), (0, _graphqlLanguageService.p)(':'), 'Value'] +}; +function namedKey(style) { + return { + style, + match: token => token.kind === 'String', + update(state, token) { + state.name = token.value.slice(1, -1); + } + }; +} + +/***/ }), + /***/ "../../graphiql-react/dist/index.js": /*!******************************************!*\ !*** ../../graphiql-react/dist/index.js ***! \******************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; +function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } +function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { + get: () => from[key], + enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable + }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( +// If the importer is in node compatibility mode or this is not an ESM +// file that has been converted to a CommonJS file using a Babel- +// compatible transform (i.e. "__esModule" has not been set), then set +// "default" to the CommonJS "module.exports" for node compatibility. +isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { + value: mod, + enumerable: true +}) : target, mod)); Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const jsxRuntime = __webpack_require__(/*! react/jsx-runtime */ "../../../node_modules/react/jsx-runtime.js"); +const reactCompilerRuntime = __webpack_require__(/*! react-compiler-runtime */ "../../../node_modules/react-compiler-runtime/dist/index.js"); const React = __webpack_require__(/*! react */ "react"); const clsx = __webpack_require__(/*! clsx */ "../../../node_modules/clsx/dist/clsx.m.js"); const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); @@ -68422,19 +75053,49 @@ function createContextHook(context) { } const StorageContext = createNullableContext("StorageContext"); function StorageContextProvider(props) { + const $ = reactCompilerRuntime.c(8); const isInitialRender = React.useRef(true); - const [storage, setStorage] = React.useState(() => new toolkit.StorageAPI(props.storage)); - React.useEffect(() => { - if (isInitialRender.current) { - isInitialRender.current = false; - } else { - setStorage(new toolkit.StorageAPI(props.storage)); - } - }, [props.storage]); - return /* @__PURE__ */jsxRuntime.jsx(StorageContext.Provider, { - value: storage, - children: props.children - }); + let t0; + if ($[0] !== props.storage) { + t0 = () => new toolkit.StorageAPI(props.storage); + $[0] = props.storage; + $[1] = t0; + } else { + t0 = $[1]; + } + const [storage, setStorage] = React.useState(t0); + let t1; + let t2; + if ($[2] !== props.storage) { + t1 = () => { + if (isInitialRender.current) { + isInitialRender.current = false; + } else { + setStorage(new toolkit.StorageAPI(props.storage)); + } + }; + t2 = [props.storage]; + $[2] = props.storage; + $[3] = t1; + $[4] = t2; + } else { + t1 = $[3]; + t2 = $[4]; + } + React.useEffect(t1, t2); + let t3; + if ($[5] !== props.children || $[6] !== storage) { + t3 = /* @__PURE__ */jsxRuntime.jsx(StorageContext.Provider, { + value: storage, + children: props.children + }); + $[5] = props.children; + $[6] = storage; + $[7] = t3; + } else { + t3 = $[7]; + } + return t3; } const useStorageContext = createContextHook(StorageContext); const SvgArgument = ({ @@ -69255,67 +75916,208 @@ const TypeIcon = generateIcon(SvgType); function generateIcon(RawComponent) { const title = RawComponent.name.replace("Svg", "").replaceAll(/([A-Z])/g, " $1").trimStart().toLowerCase() + " icon"; function IconComponent(props) { - return /* @__PURE__ */jsxRuntime.jsx(RawComponent, { - title, - ...props - }); + const $ = reactCompilerRuntime.c(2); + let t0; + if ($[0] !== props) { + t0 = /* @__PURE__ */jsxRuntime.jsx(RawComponent, { + title, + ...props + }); + $[0] = props; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; } IconComponent.displayName = RawComponent.name; return IconComponent; } -const UnStyledButton = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("button", { - ...props, - ref, - className: clsx.clsx("graphiql-un-styled", props.className) -})); +const UnStyledButton = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-un-styled", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props || $[3] !== ref || $[4] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: t0 + }); + $[2] = props; + $[3] = ref; + $[4] = t0; + $[5] = t1; + } else { + t1 = $[5]; + } + return t1; +}); UnStyledButton.displayName = "UnStyledButton"; -const Button$1 = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("button", { - ...props, - ref, - className: clsx.clsx("graphiql-button", { - success: "graphiql-button-success", - error: "graphiql-button-error" - }[props.state], props.className) -})); +const Button$1 = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(7); + let t0; + if ($[0] !== props.className || $[1] !== props.state) { + t0 = clsx.clsx("graphiql-button", { + success: "graphiql-button-success", + error: "graphiql-button-error" + }[props.state], props.className); + $[0] = props.className; + $[1] = props.state; + $[2] = t0; + } else { + t0 = $[2]; + } + let t1; + if ($[3] !== props || $[4] !== ref || $[5] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: t0 + }); + $[3] = props; + $[4] = ref; + $[5] = t0; + $[6] = t1; + } else { + t1 = $[6]; + } + return t1; +}); Button$1.displayName = "Button"; -const ButtonGroup = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { - ...props, - ref, - className: clsx.clsx("graphiql-button-group", props.className) -})); +const ButtonGroup = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-button-group", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props || $[3] !== ref || $[4] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: t0 + }); + $[2] = props; + $[3] = ref; + $[4] = t0; + $[5] = t1; + } else { + t1 = $[5]; + } + return t1; +}); ButtonGroup.displayName = "ButtonGroup"; const createComponentGroup = (root, children) => Object.entries(children).reduce((r, [key, value]) => { r[key] = value; return r; }, root); -const DialogClose = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(D__namespace.Close, { - asChild: true, - children: /* @__PURE__ */jsxRuntime.jsxs(UnStyledButton, { - ...props, - ref, - type: "button", - className: clsx.clsx("graphiql-dialog-close", props.className), - children: [/* @__PURE__ */jsxRuntime.jsx(reactVisuallyHidden.Root, { +const DialogClose = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(8); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-dialog-close", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + let t2; + if ($[2] === Symbol.for("react.memo_cache_sentinel")) { + t1 = /* @__PURE__ */jsxRuntime.jsx(reactVisuallyHidden.Root, { children: "Close dialog" - }), /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {})] - }) -})); + }); + t2 = /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {}); + $[2] = t1; + $[3] = t2; + } else { + t1 = $[2]; + t2 = $[3]; + } + let t3; + if ($[4] !== props || $[5] !== ref || $[6] !== t0) { + t3 = /* @__PURE__ */jsxRuntime.jsx(D__namespace.Close, { + asChild: true, + children: /* @__PURE__ */jsxRuntime.jsxs(UnStyledButton, { + ...props, + ref, + type: "button", + className: t0, + children: [t1, t2] + }) + }); + $[4] = props; + $[5] = ref; + $[6] = t0; + $[7] = t3; + } else { + t3 = $[7]; + } + return t3; +}); DialogClose.displayName = "Dialog.Close"; -function DialogRoot({ - children, - ...props -}) { - return /* @__PURE__ */jsxRuntime.jsx(D__namespace.Root, { - ...props, - children: /* @__PURE__ */jsxRuntime.jsxs(D__namespace.Portal, { - children: [/* @__PURE__ */jsxRuntime.jsx(D__namespace.Overlay, { - className: "graphiql-dialog-overlay" - }), /* @__PURE__ */jsxRuntime.jsx(D__namespace.Content, { +function DialogRoot(t0) { + const $ = reactCompilerRuntime.c(9); + let children; + let props; + if ($[0] !== t0) { + ({ + children, + ...props + } = t0); + $[0] = t0; + $[1] = children; + $[2] = props; + } else { + children = $[1]; + props = $[2]; + } + let t1; + if ($[3] === Symbol.for("react.memo_cache_sentinel")) { + t1 = /* @__PURE__ */jsxRuntime.jsx(D__namespace.Overlay, { + className: "graphiql-dialog-overlay" + }); + $[3] = t1; + } else { + t1 = $[3]; + } + let t2; + if ($[4] !== children) { + t2 = /* @__PURE__ */jsxRuntime.jsxs(D__namespace.Portal, { + children: [t1, /* @__PURE__ */jsxRuntime.jsx(D__namespace.Content, { className: "graphiql-dialog", children })] - }) - }); + }); + $[4] = children; + $[5] = t2; + } else { + t2 = $[5]; + } + let t3; + if ($[6] !== props || $[7] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsx(D__namespace.Root, { + ...props, + children: t2 + }); + $[6] = props; + $[7] = t2; + $[8] = t3; + } else { + t3 = $[8]; + } + return t3; } const Dialog = createComponentGroup(DialogRoot, { Close: DialogClose, @@ -69323,31 +76125,95 @@ const Dialog = createComponentGroup(DialogRoot, { Trigger: D__namespace.Trigger, Description: D__namespace.Description }); -const Button = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Trigger, { - asChild: true, - children: /* @__PURE__ */jsxRuntime.jsx("button", { - ...props, - ref, - className: clsx.clsx("graphiql-un-styled", props.className) - }) -})); +const Button = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-un-styled", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props || $[3] !== ref || $[4] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Trigger, { + asChild: true, + children: /* @__PURE__ */jsxRuntime.jsx("button", { + ...props, + ref, + className: t0 + }) + }); + $[2] = props; + $[3] = ref; + $[4] = t0; + $[5] = t1; + } else { + t1 = $[5]; + } + return t1; +}); Button.displayName = "DropdownMenuButton"; -function Content({ - children, - align = "start", - sideOffset = 5, - className, - ...props -}) { - return /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Portal, { - children: /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Content, { - align, - sideOffset, - className: clsx.clsx("graphiql-dropdown-content", className), - ...props, - children - }) - }); +function Content(t0) { + const $ = reactCompilerRuntime.c(14); + let children; + let className; + let props; + let t1; + let t2; + if ($[0] !== t0) { + ({ + children, + align: t1, + sideOffset: t2, + className, + ...props + } = t0); + $[0] = t0; + $[1] = children; + $[2] = className; + $[3] = props; + $[4] = t1; + $[5] = t2; + } else { + children = $[1]; + className = $[2]; + props = $[3]; + t1 = $[4]; + t2 = $[5]; + } + const align = t1 === void 0 ? "start" : t1; + const sideOffset = t2 === void 0 ? 5 : t2; + let t3; + if ($[6] !== className) { + t3 = clsx.clsx("graphiql-dropdown-content", className); + $[6] = className; + $[7] = t3; + } else { + t3 = $[7]; + } + let t4; + if ($[8] !== align || $[9] !== children || $[10] !== props || $[11] !== sideOffset || $[12] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Portal, { + children: /* @__PURE__ */jsxRuntime.jsx(reactDropdownMenu.Content, { + align, + sideOffset, + className: t3, + ...props, + children + }) + }); + $[8] = align; + $[9] = children; + $[10] = props; + $[11] = sideOffset; + $[12] = t3; + $[13] = t4; + } else { + t4 = $[13]; + } + return t4; } const Item = ({ className, @@ -69367,38 +76233,132 @@ const markdown = new MarkdownIt({ breaks: true, linkify: true }); -const MarkdownContent = React.forwardRef(({ - children, - onlyShowFirstChild, - type, - ...props -}, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { - ...props, - ref, - className: clsx.clsx(`graphiql-markdown-${type}`, onlyShowFirstChild && "graphiql-markdown-preview", props.className), - dangerouslySetInnerHTML: { - __html: markdown.render(children) +const MarkdownContent = React.forwardRef((t0, ref) => { + const $ = reactCompilerRuntime.c(18); + let children; + let onlyShowFirstChild; + let props; + let type; + if ($[0] !== t0) { + ({ + children, + onlyShowFirstChild, + type, + ...props + } = t0); + $[0] = t0; + $[1] = children; + $[2] = onlyShowFirstChild; + $[3] = props; + $[4] = type; + } else { + children = $[1]; + onlyShowFirstChild = $[2]; + props = $[3]; + type = $[4]; } -})); + const t1 = `graphiql-markdown-${type}`; + const t2 = onlyShowFirstChild && "graphiql-markdown-preview"; + let t3; + if ($[5] !== props.className || $[6] !== t1 || $[7] !== t2) { + t3 = clsx.clsx(t1, t2, props.className); + $[5] = props.className; + $[6] = t1; + $[7] = t2; + $[8] = t3; + } else { + t3 = $[8]; + } + let t4; + if ($[9] !== children) { + t4 = markdown.render(children); + $[9] = children; + $[10] = t4; + } else { + t4 = $[10]; + } + let t5; + if ($[11] !== t4) { + t5 = { + __html: t4 + }; + $[11] = t4; + $[12] = t5; + } else { + t5 = $[12]; + } + let t6; + if ($[13] !== props || $[14] !== ref || $[15] !== t3 || $[16] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: t3, + dangerouslySetInnerHTML: t5 + }); + $[13] = props; + $[14] = ref; + $[15] = t3; + $[16] = t5; + $[17] = t6; + } else { + t6 = $[17]; + } + return t6; +}); MarkdownContent.displayName = "MarkdownContent"; -const Spinner = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx("div", { - ...props, - ref, - className: clsx.clsx("graphiql-spinner", props.className) -})); +const Spinner = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-spinner", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props || $[3] !== ref || $[4] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx("div", { + ...props, + ref, + className: t0 + }); + $[2] = props; + $[3] = ref; + $[4] = t0; + $[5] = t1; + } else { + t1 = $[5]; + } + return t1; +}); Spinner.displayName = "Spinner"; -function TooltipRoot({ - children, - align = "start", - side = "bottom", - sideOffset = 5, - label -}) { - return /* @__PURE__ */jsxRuntime.jsxs(T__namespace.Root, { - children: [/* @__PURE__ */jsxRuntime.jsx(T__namespace.Trigger, { +function TooltipRoot(t0) { + const $ = reactCompilerRuntime.c(10); + const { + children, + align: t1, + side: t2, + sideOffset: t3, + label + } = t0; + const align = t1 === void 0 ? "start" : t1; + const side = t2 === void 0 ? "bottom" : t2; + const sideOffset = t3 === void 0 ? 5 : t3; + let t4; + if ($[0] !== children) { + t4 = /* @__PURE__ */jsxRuntime.jsx(T__namespace.Trigger, { asChild: true, children - }), /* @__PURE__ */jsxRuntime.jsx(T__namespace.Portal, { + }); + $[0] = children; + $[1] = t4; + } else { + t4 = $[1]; + } + let t5; + if ($[2] !== align || $[3] !== label || $[4] !== side || $[5] !== sideOffset) { + t5 = /* @__PURE__ */jsxRuntime.jsx(T__namespace.Portal, { children: /* @__PURE__ */jsxRuntime.jsx(T__namespace.Content, { className: "graphiql-tooltip", align, @@ -69406,103 +76366,301 @@ function TooltipRoot({ sideOffset, children: label }) - })] - }); + }); + $[2] = align; + $[3] = label; + $[4] = side; + $[5] = sideOffset; + $[6] = t5; + } else { + t5 = $[6]; + } + let t6; + if ($[7] !== t4 || $[8] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsxs(T__namespace.Root, { + children: [t4, t5] + }); + $[7] = t4; + $[8] = t5; + $[9] = t6; + } else { + t6 = $[9]; + } + return t6; } const Tooltip = createComponentGroup(TooltipRoot, { Provider: T__namespace.Provider }); -const TabRoot = React.forwardRef(({ - isActive, - value, - children, - className, - ...props -}, ref) => /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Item, { - ...props, - ref, - value, - "aria-selected": isActive ? "true" : void 0, - role: "tab", - className: clsx.clsx("graphiql-tab", isActive && "graphiql-tab-active", className), - children -})); +const TabRoot = React.forwardRef((t0, ref) => { + const $ = reactCompilerRuntime.c(16); + let children; + let className; + let isActive; + let props; + let value; + if ($[0] !== t0) { + ({ + isActive, + value, + children, + className, + ...props + } = t0); + $[0] = t0; + $[1] = children; + $[2] = className; + $[3] = isActive; + $[4] = props; + $[5] = value; + } else { + children = $[1]; + className = $[2]; + isActive = $[3]; + props = $[4]; + value = $[5]; + } + const t1 = isActive ? "true" : void 0; + const t2 = isActive && "graphiql-tab-active"; + let t3; + if ($[6] !== className || $[7] !== t2) { + t3 = clsx.clsx("graphiql-tab", t2, className); + $[6] = className; + $[7] = t2; + $[8] = t3; + } else { + t3 = $[8]; + } + let t4; + if ($[9] !== children || $[10] !== props || $[11] !== ref || $[12] !== t1 || $[13] !== t3 || $[14] !== value) { + t4 = /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Item, { + ...props, + ref, + value, + "aria-selected": t1, + role: "tab", + className: t3, + children + }); + $[9] = children; + $[10] = props; + $[11] = ref; + $[12] = t1; + $[13] = t3; + $[14] = value; + $[15] = t4; + } else { + t4 = $[15]; + } + return t4; +}); TabRoot.displayName = "Tab"; -const TabButton = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { - ...props, - ref, - type: "button", - className: clsx.clsx("graphiql-tab-button", props.className), - children: props.children -})); +const TabButton = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-tab-button", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props || $[3] !== ref || $[4] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + ...props, + ref, + type: "button", + className: t0, + children: props.children + }); + $[2] = props; + $[3] = ref; + $[4] = t0; + $[5] = t1; + } else { + t1 = $[5]; + } + return t1; +}); TabButton.displayName = "Tab.Button"; -const TabClose = React.forwardRef((props, ref) => /* @__PURE__ */jsxRuntime.jsx(Tooltip, { - label: "Close Tab", - children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { - "aria-label": "Close Tab", - ...props, - ref, - type: "button", - className: clsx.clsx("graphiql-tab-close", props.className), - children: /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {}) - }) -})); +const TabClose = React.forwardRef((props, ref) => { + const $ = reactCompilerRuntime.c(7); + let t0; + if ($[0] !== props.className) { + t0 = clsx.clsx("graphiql-tab-close", props.className); + $[0] = props.className; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] === Symbol.for("react.memo_cache_sentinel")) { + t1 = /* @__PURE__ */jsxRuntime.jsx(CloseIcon, {}); + $[2] = t1; + } else { + t1 = $[2]; + } + let t2; + if ($[3] !== props || $[4] !== ref || $[5] !== t0) { + t2 = /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label: "Close Tab", + children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + "aria-label": "Close Tab", + ...props, + ref, + type: "button", + className: t0, + children: t1 + }) + }); + $[3] = props; + $[4] = ref; + $[5] = t0; + $[6] = t2; + } else { + t2 = $[6]; + } + return t2; +}); TabClose.displayName = "Tab.Close"; const Tab = createComponentGroup(TabRoot, { Button: TabButton, Close: TabClose }); -const Tabs = React.forwardRef(({ - values, - onReorder, - children, - className, - ...props -}, ref) => /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Group, { - ...props, - ref, - values, - onReorder, - axis: "x", - role: "tablist", - className: clsx.clsx("graphiql-tabs", className), - children -})); +const Tabs = React.forwardRef((t0, ref) => { + const $ = reactCompilerRuntime.c(15); + let children; + let className; + let onReorder; + let props; + let values; + if ($[0] !== t0) { + ({ + values, + onReorder, + children, + className, + ...props + } = t0); + $[0] = t0; + $[1] = children; + $[2] = className; + $[3] = onReorder; + $[4] = props; + $[5] = values; + } else { + children = $[1]; + className = $[2]; + onReorder = $[3]; + props = $[4]; + values = $[5]; + } + let t1; + if ($[6] !== className) { + t1 = clsx.clsx("graphiql-tabs", className); + $[6] = className; + $[7] = t1; + } else { + t1 = $[7]; + } + let t2; + if ($[8] !== children || $[9] !== onReorder || $[10] !== props || $[11] !== ref || $[12] !== t1 || $[13] !== values) { + t2 = /* @__PURE__ */jsxRuntime.jsx(framerMotion.Reorder.Group, { + ...props, + ref, + values, + onReorder, + axis: "x", + role: "tablist", + className: t1, + children + }); + $[8] = children; + $[9] = onReorder; + $[10] = props; + $[11] = ref; + $[12] = t1; + $[13] = values; + $[14] = t2; + } else { + t2 = $[14]; + } + return t2; +}); Tabs.displayName = "Tabs"; const HistoryContext = createNullableContext("HistoryContext"); -function HistoryContextProvider({ - maxHistoryLength = DEFAULT_HISTORY_LENGTH, - children -}) { - const storage = useStorageContext(); - const [historyStore] = React.useState(() => - // Fall back to a noop storage when the StorageContext is empty - new toolkit.HistoryStore(storage || new toolkit.StorageAPI(null), maxHistoryLength)); - const [items, setItems] = React.useState(() => historyStore.queries || []); - const value = React.useMemo(() => ({ - addToHistory(operation) { - historyStore.updateHistory(operation); - setItems(historyStore.queries); - }, - editLabel(operation, index) { - historyStore.editLabel(operation, index); - setItems(historyStore.queries); - }, - items, - toggleFavorite(operation) { - historyStore.toggleFavorite(operation); - setItems(historyStore.queries); - }, - setActive: item => item, - deleteFromHistory(item, clearFavorites) { - historyStore.deleteHistory(item, clearFavorites); - setItems(historyStore.queries); - } - }), [items, historyStore]); - return /* @__PURE__ */jsxRuntime.jsx(HistoryContext.Provider, { - value, +function HistoryContextProvider(t0) { + const $ = reactCompilerRuntime.c(11); + const { + maxHistoryLength: t1, children - }); + } = t0; + const maxHistoryLength = t1 === void 0 ? DEFAULT_HISTORY_LENGTH : t1; + const storage = useStorageContext(); + let t2; + if ($[0] !== maxHistoryLength || $[1] !== storage) { + t2 = () => new toolkit.HistoryStore(storage || new toolkit.StorageAPI(null), maxHistoryLength); + $[0] = maxHistoryLength; + $[1] = storage; + $[2] = t2; + } else { + t2 = $[2]; + } + const [historyStore] = React.useState(t2); + let t3; + if ($[3] !== historyStore.queries) { + t3 = () => historyStore.queries || []; + $[3] = historyStore.queries; + $[4] = t3; + } else { + t3 = $[4]; + } + const [items, setItems] = React.useState(t3); + let t4; + if ($[5] !== historyStore || $[6] !== items) { + t4 = { + addToHistory(operation) { + historyStore.updateHistory(operation); + setItems(historyStore.queries); + }, + editLabel(operation_0, index) { + historyStore.editLabel(operation_0, index); + setItems(historyStore.queries); + }, + items, + toggleFavorite(operation_1) { + historyStore.toggleFavorite(operation_1); + setItems(historyStore.queries); + }, + setActive: _temp$8, + deleteFromHistory(item_0, clearFavorites) { + historyStore.deleteHistory(item_0, clearFavorites); + setItems(historyStore.queries); + } + }; + $[5] = historyStore; + $[6] = items; + $[7] = t4; + } else { + t4 = $[7]; + } + const value = t4; + let t5; + if ($[8] !== children || $[9] !== value) { + t5 = /* @__PURE__ */jsxRuntime.jsx(HistoryContext.Provider, { + value, + children + }); + $[8] = children; + $[9] = value; + $[10] = t5; + } else { + t5 = $[10]; + } + return t5; +} +function _temp$8(item) { + return item; } const useHistoryContext = createContextHook(HistoryContext); const DEFAULT_HISTORY_LENGTH = 20; @@ -69517,9 +76675,9 @@ function History() { ...item, index: i })).reverse(); - const favorites = items.filter(item => item.favorite); + const favorites = items.filter(item_0 => item_0.favorite); if (favorites.length) { - items = items.filter(item => !item.favorite); + items = items.filter(item_1 => !item_1.favorite); } const [clearStatus, setClearStatus] = React.useState(null); React.useEffect(() => { @@ -69529,16 +76687,16 @@ function History() { }, 2e3); } }, [clearStatus]); - const handleClearStatus = React.useCallback(() => { + const handleClearStatus = () => { try { - for (const item of items) { - deleteFromHistory(item, true); + for (const item_2 of items) { + deleteFromHistory(item_2, true); } setClearStatus("success"); } catch { setClearStatus("error"); } - }, [deleteFromHistory, items]); + }; return /* @__PURE__ */jsxRuntime.jsxs("section", { "aria-label": "History", className: "graphiql-history", @@ -69556,101 +76714,202 @@ function History() { })] }), Boolean(favorites.length) && /* @__PURE__ */jsxRuntime.jsx("ul", { className: "graphiql-history-items", - children: favorites.map(item => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { - item - }, item.index)) + children: favorites.map(item_3 => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { + item: item_3 + }, item_3.index)) }), Boolean(favorites.length) && Boolean(items.length) && /* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-history-item-spacer" }), Boolean(items.length) && /* @__PURE__ */jsxRuntime.jsx("ul", { className: "graphiql-history-items", - children: items.map(item => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { - item - }, item.index)) + children: items.map(item_4 => /* @__PURE__ */jsxRuntime.jsx(HistoryItem, { + item: item_4 + }, item_4.index)) })] }); } function HistoryItem(props) { + const $ = reactCompilerRuntime.c(40); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true, + caller: HistoryItem + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { editLabel, toggleFavorite, deleteFromHistory, setActive - } = useHistoryContext({ - nonNull: true, - caller: HistoryItem - }); + } = useHistoryContext(t0); + let t1; + if ($[1] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: HistoryItem + }; + $[1] = t1; + } else { + t1 = $[1]; + } const { headerEditor, queryEditor, variableEditor - } = useEditorContext({ - nonNull: true, - caller: HistoryItem - }); + } = useEditorContext(t1); const inputRef = React.useRef(null); const buttonRef = React.useRef(null); const [isEditable, setIsEditable] = React.useState(false); - React.useEffect(() => { - var _a; - if (isEditable) { - (_a = inputRef.current) == null ? void 0 : _a.focus(); - } - }, [isEditable]); - const displayName = props.item.label || props.item.operationName || formatQuery(props.item.query); - const handleSave = React.useCallback(() => { - var _a; - setIsEditable(false); - const { - index, - ...item - } = props.item; - editLabel({ - ...item, - label: (_a = inputRef.current) == null ? void 0 : _a.value - }, index); - }, [editLabel, props.item]); - const handleClose = React.useCallback(() => { - setIsEditable(false); - }, []); - const handleEditLabel = React.useCallback(e => { - e.stopPropagation(); - setIsEditable(true); - }, []); - const handleHistoryItemClick = React.useCallback(() => { - const { - query, - variables, - headers - } = props.item; - queryEditor == null ? void 0 : queryEditor.setValue(query !== null && query !== void 0 ? query : ""); - variableEditor == null ? void 0 : variableEditor.setValue(variables !== null && variables !== void 0 ? variables : ""); - headerEditor == null ? void 0 : headerEditor.setValue(headers !== null && headers !== void 0 ? headers : ""); - setActive(props.item); - }, [headerEditor, props.item, queryEditor, setActive, variableEditor]); - const handleDeleteItemFromHistory = React.useCallback(e => { - e.stopPropagation(); - deleteFromHistory(props.item); - }, [props.item, deleteFromHistory]); - const handleToggleFavorite = React.useCallback(e => { - e.stopPropagation(); - toggleFavorite(props.item); - }, [props.item, toggleFavorite]); - return /* @__PURE__ */jsxRuntime.jsx("li", { - className: clsx.clsx("graphiql-history-item", isEditable && "editable"), - children: isEditable ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + let t2; + let t3; + if ($[2] !== isEditable) { + t2 = () => { + var _a; + if (isEditable) { + (_a = inputRef.current) == null ? void 0 : _a.focus(); + } + }; + t3 = [isEditable]; + $[2] = isEditable; + $[3] = t2; + $[4] = t3; + } else { + t2 = $[3]; + t3 = $[4]; + } + React.useEffect(t2, t3); + let t4; + if ($[5] !== props.item.label || $[6] !== props.item.operationName || $[7] !== props.item.query) { + t4 = props.item.label || props.item.operationName || formatQuery(props.item.query); + $[5] = props.item.label; + $[6] = props.item.operationName; + $[7] = props.item.query; + $[8] = t4; + } else { + t4 = $[8]; + } + const displayName = t4; + let t5; + if ($[9] !== editLabel || $[10] !== props.item) { + t5 = () => { + var _a; + setIsEditable(false); + const { + index, + ...item + } = props.item; + editLabel({ + ...item, + label: (_a = inputRef.current) == null ? void 0 : _a.value + }, index); + }; + $[9] = editLabel; + $[10] = props.item; + $[11] = t5; + } else { + t5 = $[11]; + } + const handleSave = t5; + let t6; + if ($[12] === Symbol.for("react.memo_cache_sentinel")) { + t6 = () => { + setIsEditable(false); + }; + $[12] = t6; + } else { + t6 = $[12]; + } + const handleClose = t6; + let t7; + if ($[13] === Symbol.for("react.memo_cache_sentinel")) { + t7 = e => { + e.stopPropagation(); + setIsEditable(true); + }; + $[13] = t7; + } else { + t7 = $[13]; + } + const handleEditLabel = t7; + let t8; + if ($[14] !== headerEditor || $[15] !== props.item || $[16] !== queryEditor || $[17] !== setActive || $[18] !== variableEditor) { + t8 = () => { + const { + query, + variables, + headers + } = props.item; + queryEditor == null ? void 0 : queryEditor.setValue(query !== null && query !== void 0 ? query : ""); + variableEditor == null ? void 0 : variableEditor.setValue(variables !== null && variables !== void 0 ? variables : ""); + headerEditor == null ? void 0 : headerEditor.setValue(headers !== null && headers !== void 0 ? headers : ""); + setActive(props.item); + }; + $[14] = headerEditor; + $[15] = props.item; + $[16] = queryEditor; + $[17] = setActive; + $[18] = variableEditor; + $[19] = t8; + } else { + t8 = $[19]; + } + const handleHistoryItemClick = t8; + let t9; + if ($[20] !== deleteFromHistory || $[21] !== props.item) { + t9 = e_0 => { + e_0.stopPropagation(); + deleteFromHistory(props.item); + }; + $[20] = deleteFromHistory; + $[21] = props.item; + $[22] = t9; + } else { + t9 = $[22]; + } + const handleDeleteItemFromHistory = t9; + let t10; + if ($[23] !== props.item || $[24] !== toggleFavorite) { + t10 = e_1 => { + e_1.stopPropagation(); + toggleFavorite(props.item); + }; + $[23] = props.item; + $[24] = toggleFavorite; + $[25] = t10; + } else { + t10 = $[25]; + } + const handleToggleFavorite = t10; + const t11 = isEditable && "editable"; + let t12; + if ($[26] !== t11) { + t12 = clsx.clsx("graphiql-history-item", t11); + $[26] = t11; + $[27] = t12; + } else { + t12 = $[27]; + } + let t13; + if ($[28] !== displayName || $[29] !== editLabel || $[30] !== handleDeleteItemFromHistory || $[31] !== handleHistoryItemClick || $[32] !== handleSave || $[33] !== handleToggleFavorite || $[34] !== isEditable || $[35] !== props.item) { + t13 = isEditable ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [/* @__PURE__ */jsxRuntime.jsx("input", { type: "text", defaultValue: props.item.label, ref: inputRef, - onKeyDown: e => { - if (e.key === "Esc") { + onKeyDown: e_2 => { + if (e_2.key === "Esc") { setIsEditable(false); - } else if (e.key === "Enter") { - setIsEditable(false); - editLabel({ - ...props.item, - label: e.currentTarget.value - }); + } else { + if (e_2.key === "Enter") { + setIsEditable(false); + editLabel({ + ...props.item, + label: e_2.currentTarget.value + }); + } } }, placeholder: "Type a label" @@ -69711,22 +76970,58 @@ function HistoryItem(props) { }) }) })] - }) - }); + }); + $[28] = displayName; + $[29] = editLabel; + $[30] = handleDeleteItemFromHistory; + $[31] = handleHistoryItemClick; + $[32] = handleSave; + $[33] = handleToggleFavorite; + $[34] = isEditable; + $[35] = props.item; + $[36] = t13; + } else { + t13 = $[36]; + } + let t14; + if ($[37] !== t12 || $[38] !== t13) { + t14 = /* @__PURE__ */jsxRuntime.jsx("li", { + className: t12, + children: t13 + }); + $[37] = t12; + $[38] = t13; + $[39] = t14; + } else { + t14 = $[39]; + } + return t14; } function formatQuery(query) { return query == null ? void 0 : query.split("\n").map(line => line.replace(/#(.*)/, "")).join(" ").replaceAll("{", " { ").replaceAll("}", " } ").replaceAll(/[\s]{2,}/g, " "); } const ExecutionContext = createNullableContext("ExecutionContext"); -function ExecutionContextProvider({ - fetcher, - getDefaultFieldNames, - children, - operationName -}) { +function ExecutionContextProvider(t0) { + const $ = reactCompilerRuntime.c(27); + const { + fetcher, + getDefaultFieldNames, + children, + operationName + } = t0; if (!fetcher) { throw new TypeError("The `ExecutionContextProvider` component requires a `fetcher` function to be passed as prop."); } + let t1; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: ExecutionContextProvider + }; + $[0] = t1; + } else { + t1 = $[0]; + } const { externalFragments, headerEditor, @@ -69734,162 +77029,228 @@ function ExecutionContextProvider({ responseEditor, variableEditor, updateActiveTabValues - } = useEditorContext({ - nonNull: true, - caller: ExecutionContextProvider - }); + } = useEditorContext(t1); const history = useHistoryContext(); - const autoCompleteLeafs = useAutoCompleteLeafs({ - getDefaultFieldNames, - caller: ExecutionContextProvider - }); + let t2; + if ($[1] !== getDefaultFieldNames) { + t2 = { + getDefaultFieldNames, + caller: ExecutionContextProvider + }; + $[1] = getDefaultFieldNames; + $[2] = t2; + } else { + t2 = $[2]; + } + const autoCompleteLeafs = useAutoCompleteLeafs(t2); const [isFetching, setIsFetching] = React.useState(false); const [subscription, setSubscription] = React.useState(null); const queryIdRef = React.useRef(0); - const stop = React.useCallback(() => { - subscription == null ? void 0 : subscription.unsubscribe(); - setIsFetching(false); - setSubscription(null); - }, [subscription]); - const run = React.useCallback(async () => { - var _ref; - if (!queryEditor || !responseEditor) { - return; - } - if (subscription) { - stop(); - return; - } - const setResponse = value2 => { - responseEditor.setValue(value2); - updateActiveTabValues({ - response: value2 - }); - }; - queryIdRef.current += 1; - const queryId = queryIdRef.current; - let query = autoCompleteLeafs() || queryEditor.getValue(); - const variablesString = variableEditor == null ? void 0 : variableEditor.getValue(); - let variables; - try { - variables = tryParseJsonObject({ - json: variablesString, - errorMessageParse: "Variables are invalid JSON", - errorMessageType: "Variables are not a JSON object." - }); - } catch (error) { - setResponse(error instanceof Error ? error.message : `${error}`); - return; - } - const headersString = headerEditor == null ? void 0 : headerEditor.getValue(); - let headers; - try { - headers = tryParseJsonObject({ - json: headersString, - errorMessageParse: "Headers are invalid JSON", - errorMessageType: "Headers are not a JSON object." - }); - } catch (error) { - setResponse(error instanceof Error ? error.message : `${error}`); - return; - } - if (externalFragments) { - const fragmentDependencies = queryEditor.documentAST ? graphqlLanguageService.getFragmentDependenciesForAST(queryEditor.documentAST, externalFragments) : []; - if (fragmentDependencies.length > 0) { - query += "\n" + fragmentDependencies.map(node => graphql.print(node)).join("\n"); - } - } - setResponse(""); - setIsFetching(true); - const opName = (_ref = operationName !== null && operationName !== void 0 ? operationName : queryEditor.operationName) !== null && _ref !== void 0 ? _ref : void 0; - history == null ? void 0 : history.addToHistory({ - query, - variables: variablesString, - headers: headersString, - operationName: opName - }); - try { - var _headers, _queryEditor$document; - const fullResponse = {}; - const handleResponse = result => { - if (queryId !== queryIdRef.current) { - return; - } - let maybeMultipart = Array.isArray(result) ? result : false; - if (!maybeMultipart && typeof result === "object" && result !== null && "hasNext" in result) { - maybeMultipart = [result]; - } - if (maybeMultipart) { - for (const part of maybeMultipart) { - mergeIncrementalResult(fullResponse, part); - } - setIsFetching(false); - setResponse(toolkit.formatResult(fullResponse)); - } else { - const response = toolkit.formatResult(result); - setIsFetching(false); - setResponse(response); - } - }; - const fetch2 = fetcher({ - query, - variables, - operationName: opName - }, { - headers: (_headers = headers) !== null && _headers !== void 0 ? _headers : void 0, - documentAST: (_queryEditor$document = queryEditor.documentAST) !== null && _queryEditor$document !== void 0 ? _queryEditor$document : void 0 - }); - const value2 = await Promise.resolve(fetch2); - if (toolkit.isObservable(value2)) { - setSubscription(value2.subscribe({ - next(result) { - handleResponse(result); - }, - error(error) { - setIsFetching(false); - if (error) { - setResponse(toolkit.formatError(error)); - } - setSubscription(null); - }, - complete() { - setIsFetching(false); - setSubscription(null); - } - })); - } else if (toolkit.isAsyncIterable(value2)) { - setSubscription({ - unsubscribe: () => { - var _a, _b; - return (_b = (_a = value2[Symbol.asyncIterator]()).return) == null ? void 0 : _b.call(_a); - } - }); - for await (const result of value2) { - handleResponse(result); - } - setIsFetching(false); - setSubscription(null); - } else { - handleResponse(value2); - } - } catch (error) { + let t3; + if ($[3] !== subscription) { + t3 = () => { + subscription == null ? void 0 : subscription.unsubscribe(); setIsFetching(false); - setResponse(toolkit.formatError(error)); setSubscription(null); - } - }, [autoCompleteLeafs, externalFragments, fetcher, headerEditor, history, operationName, queryEditor, responseEditor, stop, subscription, updateActiveTabValues, variableEditor]); + }; + $[3] = subscription; + $[4] = t3; + } else { + t3 = $[4]; + } + const stop = t3; + let t4; + if ($[5] !== autoCompleteLeafs || $[6] !== externalFragments || $[7] !== fetcher || $[8] !== headerEditor || $[9] !== history || $[10] !== operationName || $[11] !== queryEditor || $[12] !== responseEditor || $[13] !== stop || $[14] !== subscription || $[15] !== updateActiveTabValues || $[16] !== variableEditor) { + t4 = async () => { + var _ref, _headers2, _queryEditor$document; + if (!queryEditor || !responseEditor) { + return; + } + if (subscription) { + stop(); + return; + } + const setResponse = value => { + responseEditor.setValue(value); + updateActiveTabValues({ + response: value + }); + }; + queryIdRef.current = queryIdRef.current + 1; + const queryId = queryIdRef.current; + let query = autoCompleteLeafs() || queryEditor.getValue(); + const variablesString = variableEditor == null ? void 0 : variableEditor.getValue(); + let variables; + try { + variables = tryParseJsonObject({ + json: variablesString, + errorMessageParse: "Variables are invalid JSON", + errorMessageType: "Variables are not a JSON object." + }); + } catch (t52) { + const error = t52; + setResponse(error instanceof Error ? error.message : `${error}`); + return; + } + const headersString = headerEditor == null ? void 0 : headerEditor.getValue(); + let headers; + try { + headers = tryParseJsonObject({ + json: headersString, + errorMessageParse: "Headers are invalid JSON", + errorMessageType: "Headers are not a JSON object." + }); + } catch (t62) { + const error_0 = t62; + setResponse(error_0 instanceof Error ? error_0.message : `${error_0}`); + return; + } + if (externalFragments) { + const fragmentDependencies = queryEditor.documentAST ? graphqlLanguageService.getFragmentDependenciesForAST(queryEditor.documentAST, externalFragments) : []; + if (fragmentDependencies.length > 0) { + query = query + ("\n" + fragmentDependencies.map(_temp$7).join("\n")); + } + } + setResponse(""); + setIsFetching(true); + const opName = (_ref = operationName !== null && operationName !== void 0 ? operationName : queryEditor.operationName) !== null && _ref !== void 0 ? _ref : void 0; + history == null ? void 0 : history.addToHistory({ + query, + variables: variablesString, + headers: headersString, + operationName: opName + }); + const _headers = (_headers2 = headers) !== null && _headers2 !== void 0 ? _headers2 : void 0; + const documentAST = (_queryEditor$document = queryEditor.documentAST) !== null && _queryEditor$document !== void 0 ? _queryEditor$document : void 0; + try { + const fullResponse = {}; + const handleResponse = result => { + if (queryId !== queryIdRef.current) { + return; + } + let maybeMultipart = Array.isArray(result) ? result : false; + if (!maybeMultipart && typeof result === "object" && result !== null && "hasNext" in result) { + maybeMultipart = [result]; + } + if (maybeMultipart) { + for (const part of maybeMultipart) { + mergeIncrementalResult(fullResponse, part); + } + setIsFetching(false); + setResponse(toolkit.formatResult(fullResponse)); + } else { + const response = toolkit.formatResult(result); + setIsFetching(false); + setResponse(response); + } + }; + const fetch2 = fetcher({ + query, + variables, + operationName: opName + }, { + headers: _headers, + documentAST + }); + const value_0 = await Promise.resolve(fetch2); + if (toolkit.isObservable(value_0)) { + setSubscription(value_0.subscribe({ + next(result_0) { + handleResponse(result_0); + }, + error(error_2) { + setIsFetching(false); + if (error_2) { + setResponse(toolkit.formatError(error_2)); + } + setSubscription(null); + }, + complete() { + setIsFetching(false); + setSubscription(null); + } + })); + } else { + if (toolkit.isAsyncIterable(value_0)) { + setSubscription({ + unsubscribe: () => { + var _a, _b; + return (_b = (_a = value_0[Symbol.asyncIterator]()).return) == null ? void 0 : _b.call(_a); + } + }); + await handleAsyncResults(handleResponse, value_0); + setIsFetching(false); + setSubscription(null); + } else { + handleResponse(value_0); + } + } + } catch (t72) { + const error_1 = t72; + setIsFetching(false); + setResponse(toolkit.formatError(error_1)); + setSubscription(null); + } + }; + $[5] = autoCompleteLeafs; + $[6] = externalFragments; + $[7] = fetcher; + $[8] = headerEditor; + $[9] = history; + $[10] = operationName; + $[11] = queryEditor; + $[12] = responseEditor; + $[13] = stop; + $[14] = subscription; + $[15] = updateActiveTabValues; + $[16] = variableEditor; + $[17] = t4; + } else { + t4 = $[17]; + } + const run = t4; const isSubscribed = Boolean(subscription); - const value = React.useMemo(() => ({ - isFetching, - isSubscribed, - operationName: operationName !== null && operationName !== void 0 ? operationName : null, - run, - stop - }), [isFetching, isSubscribed, operationName, run, stop]); - return /* @__PURE__ */jsxRuntime.jsx(ExecutionContext.Provider, { - value, - children - }); + const t5 = operationName !== null && operationName !== void 0 ? operationName : null; + let t6; + if ($[18] !== isFetching || $[19] !== isSubscribed || $[20] !== run || $[21] !== stop || $[22] !== t5) { + t6 = { + isFetching, + isSubscribed, + operationName: t5, + run, + stop + }; + $[18] = isFetching; + $[19] = isSubscribed; + $[20] = run; + $[21] = stop; + $[22] = t5; + $[23] = t6; + } else { + t6 = $[23]; + } + const value_1 = t6; + let t7; + if ($[24] !== children || $[25] !== value_1) { + t7 = /* @__PURE__ */jsxRuntime.jsx(ExecutionContext.Provider, { + value: value_1, + children + }); + $[24] = children; + $[25] = value_1; + $[26] = t7; + } else { + t7 = $[26]; + } + return t7; +} +function _temp$7(node) { + return graphql.print(node); +} +async function handleAsyncResults(onResponse, value) { + for await (const result of value) { + onResponse(result); + } } const useExecutionContext = createContextHook(ExecutionContext); function tryParseJsonObject({ @@ -70017,13 +77378,12 @@ const commonKeys = { "Alt-Right": "goGroupRight" }; async function importCodeMirror(addons, options) { - const CodeMirror = await Promise.resolve().then(() => __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js")).then(n => n.codemirror).then(c => + const CodeMirror = await Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror */ "../../../node_modules/codemirror/lib/codemirror.js"))).then(c => // Depending on bundler and settings the dynamic import either returns a // function (e.g. parcel) or an object containing a `default` property typeof c === "function" ? c : c.default); - await Promise.all((options == null ? void 0 : options.useCommonAddons) === false ? addons : [Promise.resolve().then(() => __webpack_require__(/*! ./show-hint.cjs.js */ "../../graphiql-react/dist/show-hint.cjs.js")).then(n => n.showHint), Promise.resolve().then(() => __webpack_require__(/*! ./matchbrackets.cjs.js */ "../../graphiql-react/dist/matchbrackets.cjs.js")).then(n => n.matchbrackets), Promise.resolve().then(() => __webpack_require__(/*! ./closebrackets.cjs.js */ "../../graphiql-react/dist/closebrackets.cjs.js")).then(n => n.closebrackets), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(n => n.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(n => n.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs.js */ "../../graphiql-react/dist/lint.cjs.js")).then(n => n.lint), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(n => n.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(n => n.jumpToLine), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(n => n.dialog), - // @ts-expect-error - Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(n => n.sublime), ...addons]); + await Promise.all((options == null ? void 0 : options.useCommonAddons) === false ? addons : [Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/hint/show-hint.js */ "../../../node_modules/codemirror/addon/hint/show-hint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/edit/matchbrackets.js */ "../../../node_modules/codemirror/addon/edit/matchbrackets.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/edit/closebrackets.js */ "../../../node_modules/codemirror/addon/edit/closebrackets.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/fold/brace-fold.js */ "../../../node_modules/codemirror/addon/fold/brace-fold.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/fold/foldgutter.js */ "../../../node_modules/codemirror/addon/fold/foldgutter.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/lint/lint.js */ "../../../node_modules/codemirror/addon/lint/lint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/searchcursor.js */ "../../../node_modules/codemirror/addon/search/searchcursor.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/jump-to-line.js */ "../../../node_modules/codemirror/addon/search/jump-to-line.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/dialog/dialog.js */ "../../../node_modules/codemirror/addon/dialog/dialog.js"))), // @ts-expect-error + Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/keymap/sublime.js */ "../../../node_modules/codemirror/keymap/sublime.js"))), ...addons]); return CodeMirror; } const printDefault = ast => { @@ -70032,158 +77392,320 @@ const printDefault = ast => { } return graphql.print(ast); }; -function DefaultValue({ - field -}) { +function DefaultValue(t0) { + const $ = reactCompilerRuntime.c(12); + const { + field + } = t0; if (!("defaultValue" in field) || field.defaultValue === void 0) { return null; } - const ast = graphql.astFromValue(field.defaultValue, field.type); - if (!ast) { - return null; + const t1 = field.defaultValue; + const t2 = field.type; + let t3; + let t4; + let t5; + let t6; + if ($[0] !== field.defaultValue || $[1] !== field.type) { + t6 = Symbol.for("react.early_return_sentinel"); + bb0: { + const ast = graphql.astFromValue(t1, t2); + if (!ast) { + t6 = null; + break bb0; + } + t5 = " = "; + t3 = "graphiql-doc-explorer-default-value"; + t4 = printDefault(ast); + } + $[0] = field.defaultValue; + $[1] = field.type; + $[2] = t3; + $[3] = t4; + $[4] = t5; + $[5] = t6; + } else { + t3 = $[2]; + t4 = $[3]; + t5 = $[4]; + t6 = $[5]; } - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [" = ", /* @__PURE__ */jsxRuntime.jsx("span", { - className: "graphiql-doc-explorer-default-value", - children: printDefault(ast) - })] - }); + if (t6 !== Symbol.for("react.early_return_sentinel")) { + return t6; + } + let t7; + if ($[6] !== t3 || $[7] !== t4) { + t7 = /* @__PURE__ */jsxRuntime.jsx("span", { + className: t3, + children: t4 + }); + $[6] = t3; + $[7] = t4; + $[8] = t7; + } else { + t7 = $[8]; + } + let t8; + if ($[9] !== t5 || $[10] !== t7) { + t8 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t5, t7] + }); + $[9] = t5; + $[10] = t7; + $[11] = t8; + } else { + t8 = $[11]; + } + return t8; } const SchemaContext = createNullableContext("SchemaContext"); -function SchemaContextProvider(props) { - if (!props.fetcher) { +function SchemaContextProvider(t0) { + const $ = reactCompilerRuntime.c(38); + let fetcher; + let onSchemaChange; + let props; + if ($[0] !== t0) { + ({ + fetcher, + onSchemaChange, + ...props + } = t0); + $[0] = t0; + $[1] = fetcher; + $[2] = onSchemaChange; + $[3] = props; + } else { + fetcher = $[1]; + onSchemaChange = $[2]; + props = $[3]; + } + if (!fetcher) { throw new TypeError("The `SchemaContextProvider` component requires a `fetcher` function to be passed as prop."); } + let t1; + if ($[4] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: SchemaContextProvider + }; + $[4] = t1; + } else { + t1 = $[4]; + } const { initialHeaders, headerEditor - } = useEditorContext({ - nonNull: true, - caller: SchemaContextProvider - }); + } = useEditorContext(t1); const [schema, setSchema] = React.useState(); const [isFetching, setIsFetching] = React.useState(false); const [fetchError, setFetchError] = React.useState(null); const counterRef = React.useRef(0); - React.useEffect(() => { - setSchema(graphql.isSchema(props.schema) || props.schema === null || props.schema === void 0 ? props.schema : void 0); - counterRef.current++; - }, [props.schema]); + let t2; + let t3; + if ($[5] !== props.schema) { + t2 = () => { + setSchema(graphql.isSchema(props.schema) || props.schema == null ? props.schema : void 0); + counterRef.current = counterRef.current + 1; + }; + t3 = [props.schema]; + $[5] = props.schema; + $[6] = t2; + $[7] = t3; + } else { + t2 = $[6]; + t3 = $[7]; + } + React.useEffect(t2, t3); const headersRef = React.useRef(initialHeaders); - React.useEffect(() => { - if (headerEditor) { - headersRef.current = headerEditor.getValue(); - } - }); + let t4; + if ($[8] !== headerEditor) { + t4 = () => { + if (headerEditor) { + headersRef.current = headerEditor.getValue(); + } + }; + $[8] = headerEditor; + $[9] = t4; + } else { + t4 = $[9]; + } + React.useEffect(t4); + let t5; + if ($[10] !== props.inputValueDeprecation || $[11] !== props.introspectionQueryName || $[12] !== props.schemaDescription) { + t5 = { + inputValueDeprecation: props.inputValueDeprecation, + introspectionQueryName: props.introspectionQueryName, + schemaDescription: props.schemaDescription + }; + $[10] = props.inputValueDeprecation; + $[11] = props.introspectionQueryName; + $[12] = props.schemaDescription; + $[13] = t5; + } else { + t5 = $[13]; + } const { introspectionQuery, introspectionQueryName, introspectionQuerySansSubscriptions - } = useIntrospectionQuery({ - inputValueDeprecation: props.inputValueDeprecation, - introspectionQueryName: props.introspectionQueryName, - schemaDescription: props.schemaDescription - }); - const { - fetcher, - onSchemaChange, - dangerouslyAssumeSchemaIsValid, - children - } = props; - const introspect = React.useCallback(() => { - if (graphql.isSchema(props.schema) || props.schema === null) { - return; - } - const counter = ++counterRef.current; - const maybeIntrospectionData = props.schema; - async function fetchIntrospectionData() { - if (maybeIntrospectionData) { - return maybeIntrospectionData; - } - const parsedHeaders = parseHeaderString(headersRef.current); - if (!parsedHeaders.isValidJSON) { - setFetchError("Introspection failed as headers are invalid."); + } = useIntrospectionQuery(t5); + let t6; + if ($[14] !== fetcher || $[15] !== introspectionQuery || $[16] !== introspectionQueryName || $[17] !== introspectionQuerySansSubscriptions || $[18] !== onSchemaChange || $[19] !== props.schema) { + t6 = () => { + if (graphql.isSchema(props.schema) || props.schema === null) { return; } - const fetcherOpts = parsedHeaders.headers ? { - headers: parsedHeaders.headers - } : {}; - const fetch2 = toolkit.fetcherReturnToPromise(fetcher({ - query: introspectionQuery, - operationName: introspectionQueryName - }, fetcherOpts)); - if (!toolkit.isPromise(fetch2)) { - setFetchError("Fetcher did not return a Promise for introspection."); - return; - } - setIsFetching(true); - setFetchError(null); - let result = await fetch2; - if (typeof result !== "object" || result === null || !("data" in result)) { - const fetch22 = toolkit.fetcherReturnToPromise(fetcher({ - query: introspectionQuerySansSubscriptions, + const counter = counterRef.current = counterRef.current + 1; + const maybeIntrospectionData = props.schema; + const fetchIntrospectionData = async function fetchIntrospectionData2() { + if (maybeIntrospectionData) { + return maybeIntrospectionData; + } + const parsedHeaders = parseHeaderString(headersRef.current); + if (!parsedHeaders.isValidJSON) { + setFetchError("Introspection failed as headers are invalid."); + return; + } + const fetcherOpts = parsedHeaders.headers ? { + headers: parsedHeaders.headers + } : {}; + const fetch2 = toolkit.fetcherReturnToPromise(fetcher({ + query: introspectionQuery, operationName: introspectionQueryName }, fetcherOpts)); - if (!toolkit.isPromise(fetch22)) { - throw new Error("Fetcher did not return a Promise for introspection."); + if (!toolkit.isPromise(fetch2)) { + setFetchError("Fetcher did not return a Promise for introspection."); + return; } - result = await fetch22; - } - setIsFetching(false); - if ((result == null ? void 0 : result.data) && "__schema" in result.data) { - return result.data; - } - const responseString = typeof result === "string" ? result : toolkit.formatResult(result); - setFetchError(responseString); - } - fetchIntrospectionData().then(introspectionData => { - if (counter !== counterRef.current || !introspectionData) { - return; - } - try { - const newSchema = graphql.buildClientSchema(introspectionData); - setSchema(newSchema); - onSchemaChange == null ? void 0 : onSchemaChange(newSchema); - } catch (error) { - setFetchError(toolkit.formatError(error)); - } - }).catch(error => { - if (counter !== counterRef.current) { - return; - } - setFetchError(toolkit.formatError(error)); - setIsFetching(false); + setIsFetching(true); + setFetchError(null); + let result = await fetch2; + if (typeof result !== "object" || result === null || !("data" in result)) { + const fetch22 = toolkit.fetcherReturnToPromise(fetcher({ + query: introspectionQuerySansSubscriptions, + operationName: introspectionQueryName + }, fetcherOpts)); + if (!toolkit.isPromise(fetch22)) { + throw new Error("Fetcher did not return a Promise for introspection."); + } + result = await fetch22; + } + setIsFetching(false); + if ((result == null ? void 0 : result.data) && "__schema" in result.data) { + return result.data; + } + const responseString = typeof result === "string" ? result : toolkit.formatResult(result); + setFetchError(responseString); + }; + fetchIntrospectionData().then(introspectionData => { + if (counter !== counterRef.current || !introspectionData) { + return; + } + try { + const newSchema = graphql.buildClientSchema(introspectionData); + setSchema(newSchema); + if (onSchemaChange) { + onSchemaChange(newSchema); + } + } catch (t72) { + const error = t72; + setFetchError(toolkit.formatError(error)); + } + }).catch(error_0 => { + if (counter !== counterRef.current) { + return; + } + setFetchError(toolkit.formatError(error_0)); + setIsFetching(false); + }); + }; + $[14] = fetcher; + $[15] = introspectionQuery; + $[16] = introspectionQueryName; + $[17] = introspectionQuerySansSubscriptions; + $[18] = onSchemaChange; + $[19] = props.schema; + $[20] = t6; + } else { + t6 = $[20]; + } + const introspect = t6; + let t7; + let t8; + if ($[21] !== introspect) { + t7 = () => { + introspect(); + }; + t8 = [introspect]; + $[21] = introspect; + $[22] = t7; + $[23] = t8; + } else { + t7 = $[22]; + t8 = $[23]; + } + React.useEffect(t7, t8); + let t9; + if ($[24] !== introspect) { + t9 = () => { + const triggerIntrospection = function triggerIntrospection2(event) { + if (event.ctrlKey && event.key === "R") { + introspect(); + } + }; + window.addEventListener("keydown", triggerIntrospection); + return () => { + window.removeEventListener("keydown", triggerIntrospection); + }; + }; + $[24] = introspect; + $[25] = t9; + } else { + t9 = $[25]; + } + React.useEffect(t9); + let t10; + if ($[26] !== props.dangerouslyAssumeSchemaIsValid || $[27] !== schema) { + t10 = !schema || props.dangerouslyAssumeSchemaIsValid ? [] : graphql.validateSchema(schema); + $[26] = props.dangerouslyAssumeSchemaIsValid; + $[27] = schema; + $[28] = t10; + } else { + t10 = $[28]; + } + const validationErrors = t10; + let t11; + if ($[29] !== fetchError || $[30] !== introspect || $[31] !== isFetching || $[32] !== schema || $[33] !== validationErrors) { + t11 = { + fetchError, + introspect, + isFetching, + schema, + validationErrors + }; + $[29] = fetchError; + $[30] = introspect; + $[31] = isFetching; + $[32] = schema; + $[33] = validationErrors; + $[34] = t11; + } else { + t11 = $[34]; + } + const value = t11; + let t12; + if ($[35] !== props.children || $[36] !== value) { + t12 = /* @__PURE__ */jsxRuntime.jsx(SchemaContext.Provider, { + value, + children: props.children }); - }, [fetcher, introspectionQueryName, introspectionQuery, introspectionQuerySansSubscriptions, onSchemaChange, props.schema]); - React.useEffect(() => { - introspect(); - }, [introspect]); - React.useEffect(() => { - function triggerIntrospection(event) { - if (event.ctrlKey && event.key === "R") { - introspect(); - } - } - window.addEventListener("keydown", triggerIntrospection); - return () => window.removeEventListener("keydown", triggerIntrospection); - }); - const validationErrors = React.useMemo(() => { - if (!schema || dangerouslyAssumeSchemaIsValid) { - return []; - } - return graphql.validateSchema(schema); - }, [schema, dangerouslyAssumeSchemaIsValid]); - const value = React.useMemo(() => ({ - fetchError, - introspect, - isFetching, - schema, - validationErrors - }), [fetchError, introspect, isFetching, schema, validationErrors]); - return /* @__PURE__ */jsxRuntime.jsx(SchemaContext.Provider, { - value, - children - }); + $[35] = props.children; + $[36] = value; + $[37] = t12; + } else { + t12 = $[37]; + } + return t12; } const useSchemaContext = createContextHook(SchemaContext); function useIntrospectionQuery({ @@ -70191,22 +77713,20 @@ function useIntrospectionQuery({ introspectionQueryName, schemaDescription }) { - return React.useMemo(() => { - const queryName = introspectionQueryName || "IntrospectionQuery"; - let query = graphql.getIntrospectionQuery({ - inputValueDeprecation, - schemaDescription - }); - if (introspectionQueryName) { - query = query.replace("query IntrospectionQuery", `query ${queryName}`); - } - const querySansSubscriptions = query.replace("subscriptionType { name }", ""); - return { - introspectionQueryName: queryName, - introspectionQuery: query, - introspectionQuerySansSubscriptions: querySansSubscriptions - }; - }, [inputValueDeprecation, introspectionQueryName, schemaDescription]); + const queryName = introspectionQueryName || "IntrospectionQuery"; + let query = graphql.getIntrospectionQuery({ + inputValueDeprecation, + schemaDescription + }); + if (introspectionQueryName) { + query = query.replace("query IntrospectionQuery", `query ${queryName}`); + } + const querySansSubscriptions = query.replace("subscriptionType { name }", ""); + return { + introspectionQueryName: queryName, + introspectionQuery: query, + introspectionQuerySansSubscriptions: querySansSubscriptions + }; } function parseHeaderString(headersString) { let headers = null; @@ -70228,99 +77748,175 @@ const initialNavStackItem = { }; const ExplorerContext = createNullableContext("ExplorerContext"); function ExplorerContextProvider(props) { + const $ = reactCompilerRuntime.c(14); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true, + caller: ExplorerContextProvider + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { schema, validationErrors - } = useSchemaContext({ - nonNull: true, - caller: ExplorerContextProvider - }); - const [navStack, setNavStack] = React.useState([initialNavStackItem]); - const push = React.useCallback(item => { - setNavStack(currentState => { - const lastItem = currentState.at(-1); - return lastItem.def === item.def ? - // Avoid pushing duplicate items - currentState : [...currentState, item]; - }); - }, []); - const pop = React.useCallback(() => { - setNavStack(currentState => currentState.length > 1 ? currentState.slice(0, -1) : currentState); - }, []); - const reset = React.useCallback(() => { - setNavStack(currentState => currentState.length === 1 ? currentState : [initialNavStackItem]); - }, []); - React.useEffect(() => { - if (schema == null || validationErrors.length > 0) { - reset(); - } else { - setNavStack(oldNavStack => { - if (oldNavStack.length === 1) { - return oldNavStack; - } - const newNavStack = [initialNavStackItem]; - let lastEntity = null; - for (const item of oldNavStack) { - if (item === initialNavStackItem) { - continue; - } - if (item.def) { - if (graphql.isNamedType(item.def)) { - const newType = schema.getType(item.def.name); - if (newType) { - newNavStack.push({ - name: item.name, - def: newType - }); - lastEntity = newType; - } else { - break; - } - } else if (lastEntity === null) { - break; - } else if (graphql.isObjectType(lastEntity) || graphql.isInputObjectType(lastEntity)) { - const field = lastEntity.getFields()[item.name]; - if (field) { - newNavStack.push({ - name: item.name, - def: field - }); - } else { - break; - } - } else if (graphql.isScalarType(lastEntity) || graphql.isEnumType(lastEntity) || graphql.isInterfaceType(lastEntity) || graphql.isUnionType(lastEntity)) { - break; - } else { - const field = lastEntity; - const arg = field.args.find(a => a.name === item.name); - if (arg) { - newNavStack.push({ - name: item.name, - def: field - }); - } else { - break; - } - } - } else { - lastEntity = null; - newNavStack.push(item); - } - } - return newNavStack; + } = useSchemaContext(t0); + let t1; + if ($[1] === Symbol.for("react.memo_cache_sentinel")) { + t1 = [initialNavStackItem]; + $[1] = t1; + } else { + t1 = $[1]; + } + const [navStack, setNavStack] = React.useState(t1); + let t2; + if ($[2] === Symbol.for("react.memo_cache_sentinel")) { + t2 = item => { + setNavStack(currentState => { + const lastItem = currentState.at(-1); + return lastItem.def === item.def ? currentState : [...currentState, item]; }); - } - }, [reset, schema, validationErrors]); - const value = React.useMemo(() => ({ - explorerNavStack: navStack, - push, - pop, - reset - }), [navStack, push, pop, reset]); - return /* @__PURE__ */jsxRuntime.jsx(ExplorerContext.Provider, { - value, - children: props.children - }); + }; + $[2] = t2; + } else { + t2 = $[2]; + } + const push = t2; + let t3; + if ($[3] === Symbol.for("react.memo_cache_sentinel")) { + t3 = () => { + setNavStack(_temp$6); + }; + $[3] = t3; + } else { + t3 = $[3]; + } + const pop = t3; + let t4; + if ($[4] === Symbol.for("react.memo_cache_sentinel")) { + t4 = () => { + setNavStack(_temp2$3); + }; + $[4] = t4; + } else { + t4 = $[4]; + } + const reset = t4; + let t5; + let t6; + if ($[5] !== schema || $[6] !== validationErrors) { + t5 = () => { + if (schema == null || validationErrors.length > 0) { + reset(); + } else { + setNavStack(oldNavStack => { + if (oldNavStack.length === 1) { + return oldNavStack; + } + const newNavStack = [initialNavStackItem]; + let lastEntity = null; + for (const item_0 of oldNavStack) { + if (item_0 === initialNavStackItem) { + continue; + } + if (item_0.def) { + if (graphql.isNamedType(item_0.def)) { + const newType = schema.getType(item_0.def.name); + if (newType) { + newNavStack.push({ + name: item_0.name, + def: newType + }); + lastEntity = newType; + } else { + break; + } + } else { + if (lastEntity === null) { + break; + } else { + if (graphql.isObjectType(lastEntity) || graphql.isInputObjectType(lastEntity)) { + const field = lastEntity.getFields()[item_0.name]; + if (field) { + newNavStack.push({ + name: item_0.name, + def: field + }); + } else { + break; + } + } else { + if (graphql.isScalarType(lastEntity) || graphql.isEnumType(lastEntity) || graphql.isInterfaceType(lastEntity) || graphql.isUnionType(lastEntity)) { + break; + } else { + const field_0 = lastEntity; + const arg = field_0.args.find(a => a.name === item_0.name); + if (arg) { + newNavStack.push({ + name: item_0.name, + def: field_0 + }); + } else { + break; + } + } + } + } + } + } else { + lastEntity = null; + newNavStack.push(item_0); + } + } + return newNavStack; + }); + } + }; + t6 = [schema, validationErrors]; + $[5] = schema; + $[6] = validationErrors; + $[7] = t5; + $[8] = t6; + } else { + t5 = $[7]; + t6 = $[8]; + } + React.useEffect(t5, t6); + let t7; + if ($[9] !== navStack) { + t7 = { + explorerNavStack: navStack, + push, + pop, + reset + }; + $[9] = navStack; + $[10] = t7; + } else { + t7 = $[10]; + } + const value = t7; + let t8; + if ($[11] !== props.children || $[12] !== value) { + t8 = /* @__PURE__ */jsxRuntime.jsx(ExplorerContext.Provider, { + value, + children: props.children + }); + $[11] = props.children; + $[12] = value; + $[13] = t8; + } else { + t8 = $[13]; + } + return t8; +} +function _temp2$3(currentState_1) { + return currentState_1.length === 1 ? currentState_1 : [initialNavStackItem]; +} +function _temp$6(currentState_0) { + return currentState_0.length > 1 ? currentState_0.slice(0, -1) : currentState_0; } const useExplorerContext = createContextHook(ExplorerContext); function renderType(type, renderNamedType) { @@ -70337,52 +77933,122 @@ function renderType(type, renderNamedType) { return renderNamedType(type); } function TypeLink(props) { + const $ = reactCompilerRuntime.c(6); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true, + caller: TypeLink + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { push - } = useExplorerContext({ - nonNull: true, - caller: TypeLink - }); + } = useExplorerContext(t0); if (!props.type) { return null; } - return renderType(props.type, namedType => /* @__PURE__ */jsxRuntime.jsx("a", { - className: "graphiql-doc-explorer-type-name", - onClick: event => { - event.preventDefault(); - push({ - name: namedType.name, - def: namedType - }); - }, - href: "#", - children: namedType.name - })); + let t1; + if ($[1] !== push) { + t1 = namedType => /* @__PURE__ */jsxRuntime.jsx("a", { + className: "graphiql-doc-explorer-type-name", + onClick: event => { + event.preventDefault(); + push({ + name: namedType.name, + def: namedType + }); + }, + href: "#", + children: namedType.name + }); + $[1] = push; + $[2] = t1; + } else { + t1 = $[2]; + } + let t2; + if ($[3] !== props.type || $[4] !== t1) { + t2 = renderType(props.type, t1); + $[3] = props.type; + $[4] = t1; + $[5] = t2; + } else { + t2 = $[5]; + } + return t2; } -function Argument({ - arg, - showDefaultValue, - inline -}) { - const definition = /* @__PURE__ */jsxRuntime.jsxs("span", { - children: [/* @__PURE__ */jsxRuntime.jsx("span", { +function Argument(t0) { + const $ = reactCompilerRuntime.c(19); + const { + arg, + showDefaultValue, + inline + } = t0; + let t1; + if ($[0] !== arg.name) { + t1 = /* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-argument-name", children: arg.name - }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + }); + $[0] = arg.name; + $[1] = t1; + } else { + t1 = $[1]; + } + let t2; + if ($[2] !== arg.type) { + t2 = /* @__PURE__ */jsxRuntime.jsx(TypeLink, { type: arg.type - }), showDefaultValue !== false && /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { + }); + $[2] = arg.type; + $[3] = t2; + } else { + t2 = $[3]; + } + let t3; + if ($[4] !== arg || $[5] !== showDefaultValue) { + t3 = showDefaultValue !== false && /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { field: arg - })] - }); + }); + $[4] = arg; + $[5] = showDefaultValue; + $[6] = t3; + } else { + t3 = $[6]; + } + let t4; + if ($[7] !== t1 || $[8] !== t2 || $[9] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs("span", { + children: [t1, ": ", t2, t3] + }); + $[7] = t1; + $[8] = t2; + $[9] = t3; + $[10] = t4; + } else { + t4 = $[10]; + } + const definition = t4; if (inline) { return definition; } - return /* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-argument", - children: [definition, arg.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + let t5; + if ($[11] !== arg.description) { + t5 = arg.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { type: "description", children: arg.description - }) : null, arg.deprecationReason ? /* @__PURE__ */jsxRuntime.jsxs("div", { + }) : null; + $[11] = arg.description; + $[12] = t5; + } else { + t5 = $[12]; + } + let t6; + if ($[13] !== arg.deprecationReason) { + t6 = arg.deprecationReason ? /* @__PURE__ */jsxRuntime.jsxs("div", { className: "graphiql-doc-explorer-argument-deprecation", children: [/* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-doc-explorer-argument-deprecation-label", @@ -70391,42 +78057,115 @@ function Argument({ type: "deprecation", children: arg.deprecationReason })] - }) : null] - }); + }) : null; + $[13] = arg.deprecationReason; + $[14] = t6; + } else { + t6 = $[14]; + } + let t7; + if ($[15] !== definition || $[16] !== t5 || $[17] !== t6) { + t7 = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-argument", + children: [definition, t5, t6] + }); + $[15] = definition; + $[16] = t5; + $[17] = t6; + $[18] = t7; + } else { + t7 = $[18]; + } + return t7; } function DeprecationReason(props) { - var _props$preview; - return props.children ? /* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-deprecation", - children: [/* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-doc-explorer-deprecation-label", - children: "Deprecated" - }), /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { - type: "deprecation", - onlyShowFirstChild: (_props$preview = props.preview) !== null && _props$preview !== void 0 ? _props$preview : true, - children: props.children - })] - }) : null; + const $ = reactCompilerRuntime.c(3); + let t0; + if ($[0] !== props.children || $[1] !== props.preview) { + var _props$preview; + t0 = props.children ? /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-deprecation", + children: [/* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-deprecation-label", + children: "Deprecated" + }), /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "deprecation", + onlyShowFirstChild: (_props$preview = props.preview) !== null && _props$preview !== void 0 ? _props$preview : true, + children: props.children + })] + }) : null; + $[0] = props.children; + $[1] = props.preview; + $[2] = t0; + } else { + t0 = $[2]; + } + return t0; } -function Directive({ - directive -}) { - return /* @__PURE__ */jsxRuntime.jsxs("span", { - className: "graphiql-doc-explorer-directive", - children: ["@", directive.name.value] - }); +function Directive(t0) { + const $ = reactCompilerRuntime.c(2); + const { + directive + } = t0; + let t1; + if ($[0] !== directive.name.value) { + t1 = /* @__PURE__ */jsxRuntime.jsxs("span", { + className: "graphiql-doc-explorer-directive", + children: ["@", directive.name.value] + }); + $[0] = directive.name.value; + $[1] = t1; + } else { + t1 = $[1]; + } + return t1; } function ExplorerSection(props) { + const $ = reactCompilerRuntime.c(10); const Icon2 = TYPE_TO_ICON[props.title]; - return /* @__PURE__ */jsxRuntime.jsxs("div", { - children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + let t0; + if ($[0] !== Icon2) { + t0 = /* @__PURE__ */jsxRuntime.jsx(Icon2, {}); + $[0] = Icon2; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props.title || $[3] !== t0) { + t1 = /* @__PURE__ */jsxRuntime.jsxs("div", { className: "graphiql-doc-explorer-section-title", - children: [/* @__PURE__ */jsxRuntime.jsx(Icon2, {}), props.title] - }), /* @__PURE__ */jsxRuntime.jsx("div", { + children: [t0, props.title] + }); + $[2] = props.title; + $[3] = t0; + $[4] = t1; + } else { + t1 = $[4]; + } + let t2; + if ($[5] !== props.children) { + t2 = /* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-doc-explorer-section-content", children: props.children - })] - }); + }); + $[5] = props.children; + $[6] = t2; + } else { + t2 = $[6]; + } + let t3; + if ($[7] !== t1 || $[8] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [t1, t2] + }); + $[7] = t1; + $[8] = t2; + $[9] = t3; + } else { + t3 = $[9]; + } + return t3; } const TYPE_TO_ICON = { Arguments: ArgumentIcon, @@ -70444,130 +78183,380 @@ const TYPE_TO_ICON = { "All Schema Types": TypeIcon }; function FieldDocumentation(props) { - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [props.field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + const $ = reactCompilerRuntime.c(15); + let t0; + if ($[0] !== props.field.description) { + t0 = props.field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { type: "description", children: props.field.description - }) : null, /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { + }) : null; + $[0] = props.field.description; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== props.field.deprecationReason) { + t1 = /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { preview: false, children: props.field.deprecationReason - }), /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + }); + $[2] = props.field.deprecationReason; + $[3] = t1; + } else { + t1 = $[3]; + } + let t2; + if ($[4] !== props.field.type) { + t2 = /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Type", children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { type: props.field.type }) - }), /* @__PURE__ */jsxRuntime.jsx(Arguments, { + }); + $[4] = props.field.type; + $[5] = t2; + } else { + t2 = $[5]; + } + let t3; + let t4; + if ($[6] !== props.field) { + t3 = /* @__PURE__ */jsxRuntime.jsx(Arguments, { field: props.field - }), /* @__PURE__ */jsxRuntime.jsx(Directives, { + }); + t4 = /* @__PURE__ */jsxRuntime.jsx(Directives, { field: props.field - })] - }); + }); + $[6] = props.field; + $[7] = t3; + $[8] = t4; + } else { + t3 = $[7]; + t4 = $[8]; + } + let t5; + if ($[9] !== t0 || $[10] !== t1 || $[11] !== t2 || $[12] !== t3 || $[13] !== t4) { + t5 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t0, t1, t2, t3, t4] + }); + $[9] = t0; + $[10] = t1; + $[11] = t2; + $[12] = t3; + $[13] = t4; + $[14] = t5; + } else { + t5 = $[14]; + } + return t5; } -function Arguments({ - field -}) { +function Arguments(t0) { + const $ = reactCompilerRuntime.c(12); + const { + field + } = t0; const [showDeprecated, setShowDeprecated] = React.useState(false); - const handleShowDeprecated = React.useCallback(() => { - setShowDeprecated(true); - }, []); + let t1; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t1 = () => { + setShowDeprecated(true); + }; + $[0] = t1; + } else { + t1 = $[0]; + } + const handleShowDeprecated = t1; if (!("args" in field)) { return null; } - const args = []; - const deprecatedArgs = []; - for (const argument of field.args) { - if (argument.deprecationReason) { - deprecatedArgs.push(argument); - } else { - args.push(argument); + let args; + let deprecatedArgs; + let t2; + if ($[1] !== field.args) { + args = []; + deprecatedArgs = []; + for (const argument of field.args) { + if (argument.deprecationReason) { + deprecatedArgs.push(argument); + } else { + args.push(argument); + } } - } - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [args.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + t2 = args.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Arguments", - children: args.map(arg => /* @__PURE__ */jsxRuntime.jsx(Argument, { - arg - }, arg.name)) - }) : null, deprecatedArgs.length > 0 ? showDeprecated || args.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + children: args.map(_temp$5) + }) : null; + $[1] = field.args; + $[2] = args; + $[3] = deprecatedArgs; + $[4] = t2; + } else { + args = $[2]; + deprecatedArgs = $[3]; + t2 = $[4]; + } + let t3; + if ($[5] !== args.length || $[6] !== deprecatedArgs || $[7] !== showDeprecated) { + t3 = deprecatedArgs.length > 0 ? showDeprecated || args.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Deprecated Arguments", - children: deprecatedArgs.map(arg => /* @__PURE__ */jsxRuntime.jsx(Argument, { - arg - }, arg.name)) + children: deprecatedArgs.map(_temp2$2) }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { type: "button", onClick: handleShowDeprecated, children: "Show Deprecated Arguments" - }) : null] - }); + }) : null; + $[5] = args.length; + $[6] = deprecatedArgs; + $[7] = showDeprecated; + $[8] = t3; + } else { + t3 = $[8]; + } + let t4; + if ($[9] !== t2 || $[10] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t2, t3] + }); + $[9] = t2; + $[10] = t3; + $[11] = t4; + } else { + t4 = $[11]; + } + return t4; } -function Directives({ - field -}) { - var _a; - const directives = ((_a = field.astNode) == null ? void 0 : _a.directives) || []; +function _temp2$2(arg_0) { + return /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg: arg_0 + }, arg_0.name); +} +function _temp$5(arg) { + return /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg + }, arg.name); +} +function Directives(t0) { + var _a, _b, _c; + const $ = reactCompilerRuntime.c(6); + const { + field + } = t0; + let t1; + if ($[0] !== ((_a = field.astNode) == null ? void 0 : _a.directives)) { + t1 = ((_b = field.astNode) == null ? void 0 : _b.directives) || []; + $[0] = (_c = field.astNode) == null ? void 0 : _c.directives; + $[1] = t1; + } else { + t1 = $[1]; + } + const directives = t1; if (!directives || directives.length === 0) { return null; } - return /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { - title: "Directives", - children: directives.map(directive => /* @__PURE__ */jsxRuntime.jsx("div", { - children: /* @__PURE__ */jsxRuntime.jsx(Directive, { - directive - }) - }, directive.name.value)) - }); + let t2; + if ($[2] !== directives) { + t2 = directives.map(_temp3$2); + $[2] = directives; + $[3] = t2; + } else { + t2 = $[3]; + } + let t3; + if ($[4] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Directives", + children: t2 + }); + $[4] = t2; + $[5] = t3; + } else { + t3 = $[5]; + } + return t3; +} +function _temp3$2(directive) { + return /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(Directive, { + directive + }) + }, directive.name.value); } function SchemaDocumentation(props) { var _a, _b, _c, _d; - const queryType = props.schema.getQueryType(); - const mutationType = (_b = (_a = props.schema).getMutationType) == null ? void 0 : _b.call(_a); - const subscriptionType = (_d = (_c = props.schema).getSubscriptionType) == null ? void 0 : _d.call(_c); - const typeMap = props.schema.getTypeMap(); - const ignoreTypesInAllSchema = [queryType == null ? void 0 : queryType.name, mutationType == null ? void 0 : mutationType.name, subscriptionType == null ? void 0 : subscriptionType.name]; - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [/* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { - type: "description", - children: props.schema.description || "A GraphQL schema provides a root type for each kind of operation." - }), /* @__PURE__ */jsxRuntime.jsxs(ExplorerSection, { - title: "Root Types", - children: [queryType ? /* @__PURE__ */jsxRuntime.jsxs("div", { + const $ = reactCompilerRuntime.c(39); + let t0; + if ($[0] !== props.schema) { + t0 = props.schema.getQueryType(); + $[0] = props.schema; + $[1] = t0; + } else { + t0 = $[1]; + } + const queryType = t0; + let t1; + if ($[2] !== props.schema) { + t1 = (_b = (_a = props.schema).getMutationType) == null ? void 0 : _b.call(_a); + $[2] = props.schema; + $[3] = t1; + } else { + t1 = $[3]; + } + const mutationType = t1; + let t2; + if ($[4] !== props.schema) { + t2 = (_d = (_c = props.schema).getSubscriptionType) == null ? void 0 : _d.call(_c); + $[4] = props.schema; + $[5] = t2; + } else { + t2 = $[5]; + } + const subscriptionType = t2; + let T0; + let t3; + let t4; + let t5; + let t6; + if ($[6] !== mutationType || $[7] !== props.schema || $[8] !== queryType || $[9] !== subscriptionType) { + const typeMap = props.schema.getTypeMap(); + const t72 = queryType == null ? void 0 : queryType.name; + const t82 = mutationType == null ? void 0 : mutationType.name; + const t9 = subscriptionType == null ? void 0 : subscriptionType.name; + let t10; + if ($[15] !== t72 || $[16] !== t82 || $[17] !== t9) { + t10 = [t72, t82, t9]; + $[15] = t72; + $[16] = t82; + $[17] = t9; + $[18] = t10; + } else { + t10 = $[18]; + } + const ignoreTypesInAllSchema = t10; + const t11 = props.schema.description || "A GraphQL schema provides a root type for each kind of operation."; + if ($[19] !== t11) { + t5 = /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: t11 + }); + $[19] = t11; + $[20] = t5; + } else { + t5 = $[20]; + } + let t12; + if ($[21] !== queryType) { + t12 = queryType ? /* @__PURE__ */jsxRuntime.jsxs("div", { children: [/* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-root-type", children: "query" }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { type: queryType })] - }) : null, mutationType && /* @__PURE__ */jsxRuntime.jsxs("div", { + }) : null; + $[21] = queryType; + $[22] = t12; + } else { + t12 = $[22]; + } + let t13; + if ($[23] !== mutationType) { + t13 = mutationType && /* @__PURE__ */jsxRuntime.jsxs("div", { children: [/* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-root-type", children: "mutation" }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { type: mutationType })] - }), subscriptionType && /* @__PURE__ */jsxRuntime.jsxs("div", { + }); + $[23] = mutationType; + $[24] = t13; + } else { + t13 = $[24]; + } + let t14; + if ($[25] !== subscriptionType) { + t14 = subscriptionType && /* @__PURE__ */jsxRuntime.jsxs("div", { children: [/* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-root-type", children: "subscription" }), ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { type: subscriptionType })] - })] - }), /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { - title: "All Schema Types", - children: typeMap && /* @__PURE__ */jsxRuntime.jsx("div", { - children: Object.values(typeMap).map(type => { - if (ignoreTypesInAllSchema.includes(type.name) || type.name.startsWith("__")) { - return null; - } - return /* @__PURE__ */jsxRuntime.jsx("div", { - children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { - type - }) - }, type.name); - }) + }); + $[25] = subscriptionType; + $[26] = t14; + } else { + t14 = $[26]; + } + if ($[27] !== t12 || $[28] !== t13 || $[29] !== t14) { + t6 = /* @__PURE__ */jsxRuntime.jsxs(ExplorerSection, { + title: "Root Types", + children: [t12, t13, t14] + }); + $[27] = t12; + $[28] = t13; + $[29] = t14; + $[30] = t6; + } else { + t6 = $[30]; + } + T0 = ExplorerSection; + t3 = "All Schema Types"; + t4 = typeMap && /* @__PURE__ */jsxRuntime.jsx("div", { + children: Object.values(typeMap).map(type => { + if (ignoreTypesInAllSchema.includes(type.name) || type.name.startsWith("__")) { + return null; + } + return /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type + }) + }, type.name); }) - })] - }); + }); + $[6] = mutationType; + $[7] = props.schema; + $[8] = queryType; + $[9] = subscriptionType; + $[10] = T0; + $[11] = t3; + $[12] = t4; + $[13] = t5; + $[14] = t6; + } else { + T0 = $[10]; + t3 = $[11]; + t4 = $[12]; + t5 = $[13]; + t6 = $[14]; + } + let t7; + if ($[31] !== T0 || $[32] !== t3 || $[33] !== t4) { + t7 = /* @__PURE__ */jsxRuntime.jsx(T0, { + title: t3, + children: t4 + }); + $[31] = T0; + $[32] = t3; + $[33] = t4; + $[34] = t7; + } else { + t7 = $[34]; + } + let t8; + if ($[35] !== t5 || $[36] !== t6 || $[37] !== t7) { + t8 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t5, t6, t7] + }); + $[35] = t5; + $[36] = t6; + $[37] = t7; + $[38] = t8; + } else { + t8 = $[38]; + } + return t8; } function debounce(duration, fn) { let timeout; @@ -70582,6 +78571,8 @@ function debounce(duration, fn) { }; } function Search() { + "use no memo"; + const { explorerNavStack, push @@ -70643,7 +78634,7 @@ function Search() { autoComplete: "off", onFocus: handleFocus, onBlur: handleFocus, - onChange: event => setSearchValue(event.target.value), + onChange: event_0 => setSearchValue(event_0.target.value), placeholder: `${isMacOs ? "⌘" : "Ctrl"} K`, ref: inputRef, value: searchValue, @@ -70664,94 +78655,131 @@ function Search() { }, `within-${i}`)), results.within.length > 0 && results.types.length + results.fields.length > 0 ? /* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-doc-explorer-search-divider", children: "Other results" - }) : null, results.types.map((result, i) => /* @__PURE__ */jsxRuntime.jsx(react.Combobox.Option, { - value: result, + }) : null, results.types.map((result_0, i_0) => /* @__PURE__ */jsxRuntime.jsx(react.Combobox.Option, { + value: result_0, "data-cy": "doc-explorer-option", children: /* @__PURE__ */jsxRuntime.jsx(Type, { - type: result.type + type: result_0.type }) - }, `type-${i}`)), results.fields.map((result, i) => /* @__PURE__ */jsxRuntime.jsxs(react.Combobox.Option, { - value: result, + }, `type-${i_0}`)), results.fields.map((result_1, i_1) => /* @__PURE__ */jsxRuntime.jsxs(react.Combobox.Option, { + value: result_1, "data-cy": "doc-explorer-option", children: [/* @__PURE__ */jsxRuntime.jsx(Type, { - type: result.type + type: result_1.type }), ".", /* @__PURE__ */jsxRuntime.jsx(Field$1, { - field: result.field, - argument: result.argument + field: result_1.field, + argument: result_1.argument })] - }, `field-${i}`))] + }, `field-${i_1}`))] })] }); } +const _useSearchResults = useSearchResults; function useSearchResults(caller) { + const $ = reactCompilerRuntime.c(9); + const t0 = caller || _useSearchResults; + let t1; + if ($[0] !== t0) { + t1 = { + nonNull: true, + caller: t0 + }; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } const { explorerNavStack - } = useExplorerContext({ - nonNull: true, - caller: caller || useSearchResults - }); + } = useExplorerContext(t1); + const t2 = caller || _useSearchResults; + let t3; + if ($[2] !== t2) { + t3 = { + nonNull: true, + caller: t2 + }; + $[2] = t2; + $[3] = t3; + } else { + t3 = $[3]; + } const { schema - } = useSchemaContext({ - nonNull: true, - caller: caller || useSearchResults - }); - const navItem = explorerNavStack.at(-1); - return React.useCallback(searchValue => { - const matches = { - within: [], - types: [], - fields: [] - }; - if (!schema) { - return matches; - } - const withinType = navItem.def; - const typeMap = schema.getTypeMap(); - let typeNames = Object.keys(typeMap); - if (withinType) { - typeNames = typeNames.filter(n => n !== withinType.name); - typeNames.unshift(withinType.name); - } - for (const typeName of typeNames) { - if (matches.within.length + matches.types.length + matches.fields.length >= 100) { - break; + } = useSchemaContext(t3); + let t4; + if ($[4] !== explorerNavStack) { + t4 = explorerNavStack.at(-1); + $[4] = explorerNavStack; + $[5] = t4; + } else { + t4 = $[5]; + } + const navItem = t4; + let t5; + if ($[6] !== navItem || $[7] !== schema) { + t5 = searchValue => { + const matches = { + within: [], + types: [], + fields: [] + }; + if (!schema) { + return matches; } - const type = typeMap[typeName]; - if (withinType !== type && isMatch(typeName, searchValue)) { - matches.types.push({ - type - }); + const withinType = navItem.def; + const typeMap = schema.getTypeMap(); + let typeNames = Object.keys(typeMap); + if (withinType) { + typeNames = typeNames.filter(n => n !== withinType.name); + typeNames.unshift(withinType.name); } - if (!graphql.isObjectType(type) && !graphql.isInterfaceType(type) && !graphql.isInputObjectType(type)) { - continue; - } - const fields = type.getFields(); - for (const fieldName in fields) { - const field = fields[fieldName]; - let matchingArgs; - if (!isMatch(fieldName, searchValue)) { - if ("args" in field) { - matchingArgs = field.args.filter(arg => isMatch(arg.name, searchValue)); - if (matchingArgs.length === 0) { + for (const typeName of typeNames) { + if (matches.within.length + matches.types.length + matches.fields.length >= 100) { + break; + } + const type = typeMap[typeName]; + if (withinType !== type && isMatch(typeName, searchValue)) { + matches.types.push({ + type + }); + } + if (!graphql.isObjectType(type) && !graphql.isInterfaceType(type) && !graphql.isInputObjectType(type)) { + continue; + } + const fields = type.getFields(); + for (const fieldName in fields) { + const field = fields[fieldName]; + let matchingArgs; + if (!isMatch(fieldName, searchValue)) { + if ("args" in field) { + matchingArgs = field.args.filter(arg => isMatch(arg.name, searchValue)); + if (matchingArgs.length === 0) { + continue; + } + } else { continue; } - } else { - continue; } + matches[withinType === type ? "within" : "fields"].push(...(matchingArgs ? matchingArgs.map(argument => ({ + type, + field, + argument + })) : [{ + type, + field + }])); } - matches[withinType === type ? "within" : "fields"].push(...(matchingArgs ? matchingArgs.map(argument => ({ - type, - field, - argument - })) : [{ - type, - field - }])); } - } - return matches; - }, [navItem.def, schema]); + return matches; + }; + $[6] = navItem; + $[7] = schema; + $[8] = t5; + } else { + t5 = $[8]; + } + return t5; } function isMatch(sourceText, searchValue) { try { @@ -70762,307 +78790,804 @@ function isMatch(sourceText, searchValue) { } } function Type(props) { - return /* @__PURE__ */jsxRuntime.jsx("span", { - className: "graphiql-doc-explorer-search-type", - children: props.type.name - }); + const $ = reactCompilerRuntime.c(2); + let t0; + if ($[0] !== props.type.name) { + t0 = /* @__PURE__ */jsxRuntime.jsx("span", { + className: "graphiql-doc-explorer-search-type", + children: props.type.name + }); + $[0] = props.type.name; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; } -function Field$1({ - field, - argument -}) { - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [/* @__PURE__ */jsxRuntime.jsx("span", { +function Field$1(t0) { + const $ = reactCompilerRuntime.c(7); + const { + field, + argument + } = t0; + let t1; + if ($[0] !== field.name) { + t1 = /* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-search-field", children: field.name - }), argument ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + }); + $[0] = field.name; + $[1] = t1; + } else { + t1 = $[1]; + } + let t2; + if ($[2] !== argument) { + t2 = argument ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { children: ["(", /* @__PURE__ */jsxRuntime.jsx("span", { className: "graphiql-doc-explorer-search-argument", children: argument.name - }), ":", " ", renderType(argument.type, namedType => /* @__PURE__ */jsxRuntime.jsx(Type, { - type: namedType - })), ")"] - }) : null] + }), ":", " ", renderType(argument.type, _temp$4), ")"] + }) : null; + $[2] = argument; + $[3] = t2; + } else { + t2 = $[3]; + } + let t3; + if ($[4] !== t1 || $[5] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t1, t2] + }); + $[4] = t1; + $[5] = t2; + $[6] = t3; + } else { + t3 = $[6]; + } + return t3; +} +function _temp$4(namedType) { + return /* @__PURE__ */jsxRuntime.jsx(Type, { + type: namedType }); } function FieldLink(props) { + const $ = reactCompilerRuntime.c(7); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { push - } = useExplorerContext({ - nonNull: true - }); - return /* @__PURE__ */jsxRuntime.jsx("a", { - className: "graphiql-doc-explorer-field-name", - onClick: event => { + } = useExplorerContext(t0); + let t1; + if ($[1] !== props.field || $[2] !== push) { + t1 = event => { event.preventDefault(); push({ name: props.field.name, def: props.field }); - }, - href: "#", - children: props.field.name - }); + }; + $[1] = props.field; + $[2] = push; + $[3] = t1; + } else { + t1 = $[3]; + } + let t2; + if ($[4] !== props.field.name || $[5] !== t1) { + t2 = /* @__PURE__ */jsxRuntime.jsx("a", { + className: "graphiql-doc-explorer-field-name", + onClick: t1, + href: "#", + children: props.field.name + }); + $[4] = props.field.name; + $[5] = t1; + $[6] = t2; + } else { + t2 = $[6]; + } + return t2; } function TypeDocumentation(props) { - return graphql.isNamedType(props.type) ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [props.type.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { - type: "description", - children: props.type.description - }) : null, /* @__PURE__ */jsxRuntime.jsx(ImplementsInterfaces, { - type: props.type - }), /* @__PURE__ */jsxRuntime.jsx(Fields, { - type: props.type - }), /* @__PURE__ */jsxRuntime.jsx(EnumValues, { - type: props.type - }), /* @__PURE__ */jsxRuntime.jsx(PossibleTypes, { - type: props.type - })] - }) : null; + const $ = reactCompilerRuntime.c(2); + let t0; + if ($[0] !== props.type) { + t0 = graphql.isNamedType(props.type) ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [props.type.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + type: "description", + children: props.type.description + }) : null, /* @__PURE__ */jsxRuntime.jsx(ImplementsInterfaces, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(Fields, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(EnumValues, { + type: props.type + }), /* @__PURE__ */jsxRuntime.jsx(PossibleTypes, { + type: props.type + })] + }) : null; + $[0] = props.type; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; } -function ImplementsInterfaces({ - type -}) { +function ImplementsInterfaces(t0) { + const $ = reactCompilerRuntime.c(5); + const { + type + } = t0; if (!graphql.isObjectType(type)) { return null; } - const interfaces = type.getInterfaces(); - return interfaces.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { - title: "Implements", - children: type.getInterfaces().map(implementedInterface => /* @__PURE__ */jsxRuntime.jsx("div", { - children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { - type: implementedInterface - }) - }, implementedInterface.name)) - }) : null; + let t1; + if ($[0] !== type) { + t1 = type.getInterfaces(); + $[0] = type; + $[1] = t1; + } else { + t1 = $[1]; + } + const interfaces = t1; + let t2; + if ($[2] !== interfaces.length || $[3] !== type) { + t2 = interfaces.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: "Implements", + children: type.getInterfaces().map(_temp$3) + }) : null; + $[2] = interfaces.length; + $[3] = type; + $[4] = t2; + } else { + t2 = $[4]; + } + return t2; } -function Fields({ - type -}) { +function _temp$3(implementedInterface) { + return /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: implementedInterface + }) + }, implementedInterface.name); +} +function Fields(t0) { + const $ = reactCompilerRuntime.c(12); + const { + type + } = t0; const [showDeprecated, setShowDeprecated] = React.useState(false); - const handleShowDeprecated = React.useCallback(() => { - setShowDeprecated(true); - }, []); + let t1; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t1 = () => { + setShowDeprecated(true); + }; + $[0] = t1; + } else { + t1 = $[0]; + } + const handleShowDeprecated = t1; if (!graphql.isObjectType(type) && !graphql.isInterfaceType(type) && !graphql.isInputObjectType(type)) { return null; } - const fieldMap = type.getFields(); - const fields = []; - const deprecatedFields = []; - for (const field of Object.keys(fieldMap).map(name => fieldMap[name])) { - if (field.deprecationReason) { - deprecatedFields.push(field); - } else { - fields.push(field); + let deprecatedFields; + let fields; + let t2; + if ($[1] !== type) { + const fieldMap = type.getFields(); + fields = []; + deprecatedFields = []; + for (const field of Object.keys(fieldMap).map(name => fieldMap[name])) { + if (field.deprecationReason) { + deprecatedFields.push(field); + } else { + fields.push(field); + } } - } - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [fields.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + t2 = fields.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Fields", - children: fields.map(field => /* @__PURE__ */jsxRuntime.jsx(Field, { - field - }, field.name)) - }) : null, deprecatedFields.length > 0 ? showDeprecated || fields.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + children: fields.map(_temp2$1) + }) : null; + $[1] = type; + $[2] = deprecatedFields; + $[3] = fields; + $[4] = t2; + } else { + deprecatedFields = $[2]; + fields = $[3]; + t2 = $[4]; + } + let t3; + if ($[5] !== deprecatedFields || $[6] !== fields.length || $[7] !== showDeprecated) { + t3 = deprecatedFields.length > 0 ? showDeprecated || fields.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Deprecated Fields", - children: deprecatedFields.map(field => /* @__PURE__ */jsxRuntime.jsx(Field, { - field - }, field.name)) + children: deprecatedFields.map(_temp3$1) }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { type: "button", onClick: handleShowDeprecated, children: "Show Deprecated Fields" - }) : null] - }); + }) : null; + $[5] = deprecatedFields; + $[6] = fields.length; + $[7] = showDeprecated; + $[8] = t3; + } else { + t3 = $[8]; + } + let t4; + if ($[9] !== t2 || $[10] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t2, t3] + }); + $[9] = t2; + $[10] = t3; + $[11] = t4; + } else { + t4 = $[11]; + } + return t4; } -function Field({ - field -}) { - const args = "args" in field ? field.args.filter(arg => !arg.deprecationReason) : []; - return /* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-item", - children: [/* @__PURE__ */jsxRuntime.jsxs("div", { - children: [/* @__PURE__ */jsxRuntime.jsx(FieldLink, { - field - }), args.length > 0 ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: ["(", /* @__PURE__ */jsxRuntime.jsx("span", { - children: args.map(arg => args.length === 1 ? /* @__PURE__ */jsxRuntime.jsx(Argument, { - arg, +function _temp3$1(field_1) { + return /* @__PURE__ */jsxRuntime.jsx(Field, { + field: field_1 + }, field_1.name); +} +function _temp2$1(field_0) { + return /* @__PURE__ */jsxRuntime.jsx(Field, { + field: field_0 + }, field_0.name); +} +function Field(t0) { + const $ = reactCompilerRuntime.c(22); + const { + field + } = t0; + let t1; + let t2; + let t3; + if ($[0] !== field) { + const args = "args" in field ? field.args.filter(_temp4$1) : []; + t3 = "graphiql-doc-explorer-item"; + t1 = /* @__PURE__ */jsxRuntime.jsx(FieldLink, { + field + }); + t2 = args.length > 0 ? /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: ["(", /* @__PURE__ */jsxRuntime.jsx("span", { + children: args.map(arg_0 => args.length === 1 ? /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg: arg_0, + inline: true + }, arg_0.name) : /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-argument-multiple", + children: /* @__PURE__ */jsxRuntime.jsx(Argument, { + arg: arg_0, inline: true - }, arg.name) : /* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-doc-explorer-argument-multiple", - children: /* @__PURE__ */jsxRuntime.jsx(Argument, { - arg, - inline: true - }) - }, arg.name)) - }), ")"] - }) : null, ": ", /* @__PURE__ */jsxRuntime.jsx(TypeLink, { - type: field.type - }), /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { - field - })] - }), field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + }) + }, arg_0.name)) + }), ")"] + }) : null; + $[0] = field; + $[1] = t1; + $[2] = t2; + $[3] = t3; + } else { + t1 = $[1]; + t2 = $[2]; + t3 = $[3]; + } + let t4; + if ($[4] !== field.type) { + t4 = /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: field.type + }); + $[4] = field.type; + $[5] = t4; + } else { + t4 = $[5]; + } + let t5; + if ($[6] !== field) { + t5 = /* @__PURE__ */jsxRuntime.jsx(DefaultValue, { + field + }); + $[6] = field; + $[7] = t5; + } else { + t5 = $[7]; + } + let t6; + if ($[8] !== t1 || $[9] !== t2 || $[10] !== t4 || $[11] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [t1, t2, ": ", t4, t5] + }); + $[8] = t1; + $[9] = t2; + $[10] = t4; + $[11] = t5; + $[12] = t6; + } else { + t6 = $[12]; + } + let t7; + if ($[13] !== field.description) { + t7 = field.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { type: "description", onlyShowFirstChild: true, children: field.description - }) : null, /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { + }) : null; + $[13] = field.description; + $[14] = t7; + } else { + t7 = $[14]; + } + let t8; + if ($[15] !== field.deprecationReason) { + t8 = /* @__PURE__ */jsxRuntime.jsx(DeprecationReason, { children: field.deprecationReason - })] - }); + }); + $[15] = field.deprecationReason; + $[16] = t8; + } else { + t8 = $[16]; + } + let t9; + if ($[17] !== t3 || $[18] !== t6 || $[19] !== t7 || $[20] !== t8) { + t9 = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: t3, + children: [t6, t7, t8] + }); + $[17] = t3; + $[18] = t6; + $[19] = t7; + $[20] = t8; + $[21] = t9; + } else { + t9 = $[21]; + } + return t9; } -function EnumValues({ - type -}) { +function _temp4$1(arg) { + return !arg.deprecationReason; +} +function EnumValues(t0) { + const $ = reactCompilerRuntime.c(12); + const { + type + } = t0; const [showDeprecated, setShowDeprecated] = React.useState(false); - const handleShowDeprecated = React.useCallback(() => { - setShowDeprecated(true); - }, []); + let t1; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t1 = () => { + setShowDeprecated(true); + }; + $[0] = t1; + } else { + t1 = $[0]; + } + const handleShowDeprecated = t1; if (!graphql.isEnumType(type)) { return null; } - const values = []; - const deprecatedValues = []; - for (const value of type.getValues()) { - if (value.deprecationReason) { - deprecatedValues.push(value); - } else { - values.push(value); + let deprecatedValues; + let t2; + let values; + if ($[1] !== type) { + values = []; + deprecatedValues = []; + for (const value of type.getValues()) { + if (value.deprecationReason) { + deprecatedValues.push(value); + } else { + values.push(value); + } } - } - return /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { - children: [values.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + t2 = values.length > 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Enum Values", - children: values.map(value => /* @__PURE__ */jsxRuntime.jsx(EnumValue, { - value - }, value.name)) - }) : null, deprecatedValues.length > 0 ? showDeprecated || values.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + children: values.map(_temp5) + }) : null; + $[1] = type; + $[2] = deprecatedValues; + $[3] = t2; + $[4] = values; + } else { + deprecatedValues = $[2]; + t2 = $[3]; + values = $[4]; + } + let t3; + if ($[5] !== deprecatedValues || $[6] !== showDeprecated || $[7] !== values.length) { + t3 = deprecatedValues.length > 0 ? showDeprecated || values.length === 0 ? /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { title: "Deprecated Enum Values", - children: deprecatedValues.map(value => /* @__PURE__ */jsxRuntime.jsx(EnumValue, { - value - }, value.name)) + children: deprecatedValues.map(_temp6) }) : /* @__PURE__ */jsxRuntime.jsx(Button$1, { type: "button", onClick: handleShowDeprecated, children: "Show Deprecated Values" - }) : null] - }); + }) : null; + $[5] = deprecatedValues; + $[6] = showDeprecated; + $[7] = values.length; + $[8] = t3; + } else { + t3 = $[8]; + } + let t4; + if ($[9] !== t2 || $[10] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs(jsxRuntime.Fragment, { + children: [t2, t3] + }); + $[9] = t2; + $[10] = t3; + $[11] = t4; + } else { + t4 = $[11]; + } + return t4; } -function EnumValue({ - value -}) { - return /* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-item", - children: [/* @__PURE__ */jsxRuntime.jsx("div", { +function _temp6(value_1) { + return /* @__PURE__ */jsxRuntime.jsx(EnumValue, { + value: value_1 + }, value_1.name); +} +function _temp5(value_0) { + return /* @__PURE__ */jsxRuntime.jsx(EnumValue, { + value: value_0 + }, value_0.name); +} +function EnumValue(t0) { + const $ = reactCompilerRuntime.c(10); + const { + value + } = t0; + let t1; + if ($[0] !== value.name) { + t1 = /* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-doc-explorer-enum-value", children: value.name - }), value.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + }); + $[0] = value.name; + $[1] = t1; + } else { + t1 = $[1]; + } + let t2; + if ($[2] !== value.description) { + t2 = value.description ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { type: "description", children: value.description - }) : null, value.deprecationReason ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { + }) : null; + $[2] = value.description; + $[3] = t2; + } else { + t2 = $[3]; + } + let t3; + if ($[4] !== value.deprecationReason) { + t3 = value.deprecationReason ? /* @__PURE__ */jsxRuntime.jsx(MarkdownContent, { type: "deprecation", children: value.deprecationReason - }) : null] - }); + }) : null; + $[4] = value.deprecationReason; + $[5] = t3; + } else { + t3 = $[5]; + } + let t4; + if ($[6] !== t1 || $[7] !== t2 || $[8] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-item", + children: [t1, t2, t3] + }); + $[6] = t1; + $[7] = t2; + $[8] = t3; + $[9] = t4; + } else { + t4 = $[9]; + } + return t4; } -function PossibleTypes({ - type -}) { +function PossibleTypes(t0) { + const $ = reactCompilerRuntime.c(7); + const { + type + } = t0; + let t1; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true + }; + $[0] = t1; + } else { + t1 = $[0]; + } const { schema - } = useSchemaContext({ - nonNull: true - }); + } = useSchemaContext(t1); if (!schema || !graphql.isAbstractType(type)) { return null; } - return /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { - title: graphql.isInterfaceType(type) ? "Implementations" : "Possible Types", - children: schema.getPossibleTypes(type).map(possibleType => /* @__PURE__ */jsxRuntime.jsx("div", { - children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { - type: possibleType - }) - }, possibleType.name)) - }); + const t2 = graphql.isInterfaceType(type) ? "Implementations" : "Possible Types"; + let t3; + if ($[1] !== schema || $[2] !== type) { + t3 = schema.getPossibleTypes(type).map(_temp7); + $[1] = schema; + $[2] = type; + $[3] = t3; + } else { + t3 = $[3]; + } + let t4; + if ($[4] !== t2 || $[5] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsx(ExplorerSection, { + title: t2, + children: t3 + }); + $[4] = t2; + $[5] = t3; + $[6] = t4; + } else { + t4 = $[6]; + } + return t4; +} +function _temp7(possibleType) { + return /* @__PURE__ */jsxRuntime.jsx("div", { + children: /* @__PURE__ */jsxRuntime.jsx(TypeLink, { + type: possibleType + }) + }, possibleType.name); } function DocExplorer() { + const $ = reactCompilerRuntime.c(40); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true, + caller: DocExplorer + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { fetchError, isFetching, schema, validationErrors - } = useSchemaContext({ - nonNull: true, - caller: DocExplorer - }); + } = useSchemaContext(t0); + let t1; + if ($[1] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: DocExplorer + }; + $[1] = t1; + } else { + t1 = $[1]; + } const { explorerNavStack, pop - } = useExplorerContext({ - nonNull: true, - caller: DocExplorer - }); - const navItem = explorerNavStack.at(-1); - let content = null; - if (fetchError) { - content = /* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-doc-explorer-error", - children: "Error fetching schema" - }); - } else if (validationErrors.length > 0) { - content = /* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-error", - children: ["Schema is invalid: ", validationErrors[0].message] - }); - } else if (isFetching) { - content = /* @__PURE__ */jsxRuntime.jsx(Spinner, {}); - } else if (!schema) { - content = /* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-doc-explorer-error", - children: "No GraphQL schema available" - }); - } else if (explorerNavStack.length === 1) { - content = /* @__PURE__ */jsxRuntime.jsx(SchemaDocumentation, { - schema - }); - } else if (graphql.isType(navItem.def)) { - content = /* @__PURE__ */jsxRuntime.jsx(TypeDocumentation, { - type: navItem.def - }); - } else if (navItem.def) { - content = /* @__PURE__ */jsxRuntime.jsx(FieldDocumentation, { - field: navItem.def - }); + } = useExplorerContext(t1); + let content; + let navItem; + if ($[2] !== explorerNavStack || $[3] !== fetchError || $[4] !== isFetching || $[5] !== schema || $[6] !== validationErrors) { + navItem = explorerNavStack.at(-1); + content = null; + if (fetchError) { + let t22; + if ($[9] === Symbol.for("react.memo_cache_sentinel")) { + t22 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-error", + children: "Error fetching schema" + }); + $[9] = t22; + } else { + t22 = $[9]; + } + content = t22; + } else { + if (validationErrors.length > 0) { + const t22 = validationErrors[0]; + let t32; + if ($[10] !== t22.message) { + t32 = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-error", + children: ["Schema is invalid: ", t22.message] + }); + $[10] = t22.message; + $[11] = t32; + } else { + t32 = $[11]; + } + content = t32; + } else { + if (isFetching) { + let t22; + if ($[12] === Symbol.for("react.memo_cache_sentinel")) { + t22 = /* @__PURE__ */jsxRuntime.jsx(Spinner, {}); + $[12] = t22; + } else { + t22 = $[12]; + } + content = t22; + } else { + if (!schema) { + let t22; + if ($[13] === Symbol.for("react.memo_cache_sentinel")) { + t22 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-error", + children: "No GraphQL schema available" + }); + $[13] = t22; + } else { + t22 = $[13]; + } + content = t22; + } else { + if (explorerNavStack.length === 1) { + let t22; + if ($[14] !== schema) { + t22 = /* @__PURE__ */jsxRuntime.jsx(SchemaDocumentation, { + schema + }); + $[14] = schema; + $[15] = t22; + } else { + t22 = $[15]; + } + content = t22; + } else { + if (graphql.isType(navItem.def)) { + let t22; + if ($[16] !== navItem.def) { + t22 = /* @__PURE__ */jsxRuntime.jsx(TypeDocumentation, { + type: navItem.def + }); + $[16] = navItem.def; + $[17] = t22; + } else { + t22 = $[17]; + } + content = t22; + } else { + if (navItem.def) { + let t22; + if ($[18] !== navItem.def) { + t22 = /* @__PURE__ */jsxRuntime.jsx(FieldDocumentation, { + field: navItem.def + }); + $[18] = navItem.def; + $[19] = t22; + } else { + t22 = $[19]; + } + content = t22; + } + } + } + } + } + } + } + $[2] = explorerNavStack; + $[3] = fetchError; + $[4] = isFetching; + $[5] = schema; + $[6] = validationErrors; + $[7] = content; + $[8] = navItem; + } else { + content = $[7]; + navItem = $[8]; } let prevName; if (explorerNavStack.length > 1) { - prevName = explorerNavStack.at(-2).name; + let t22; + if ($[20] !== explorerNavStack) { + t22 = explorerNavStack.at(-2); + $[20] = explorerNavStack; + $[21] = t22; + } else { + t22 = $[21]; + } + prevName = t22.name; } - return /* @__PURE__ */jsxRuntime.jsxs("section", { - className: "graphiql-doc-explorer", - "aria-label": "Documentation Explorer", - children: [/* @__PURE__ */jsxRuntime.jsxs("div", { + let t2; + if ($[22] !== pop || $[23] !== prevName) { + t2 = prevName && /* @__PURE__ */jsxRuntime.jsxs("a", { + href: "#", + className: "graphiql-doc-explorer-back", + onClick: event => { + event.preventDefault(); + pop(); + }, + "aria-label": `Go back to ${prevName}`, + children: [/* @__PURE__ */jsxRuntime.jsx(ChevronLeftIcon, {}), prevName] + }); + $[22] = pop; + $[23] = prevName; + $[24] = t2; + } else { + t2 = $[24]; + } + let t3; + if ($[25] !== navItem.name) { + t3 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-doc-explorer-title", + children: navItem.name + }); + $[25] = navItem.name; + $[26] = t3; + } else { + t3 = $[26]; + } + let t4; + if ($[27] !== t2 || $[28] !== t3) { + t4 = /* @__PURE__ */jsxRuntime.jsxs("div", { + className: "graphiql-doc-explorer-header-content", + children: [t2, t3] + }); + $[27] = t2; + $[28] = t3; + $[29] = t4; + } else { + t4 = $[29]; + } + let t5; + if ($[30] !== navItem.name) { + t5 = /* @__PURE__ */jsxRuntime.jsx(Search, {}, navItem.name); + $[30] = navItem.name; + $[31] = t5; + } else { + t5 = $[31]; + } + let t6; + if ($[32] !== t4 || $[33] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsxs("div", { className: "graphiql-doc-explorer-header", - children: [/* @__PURE__ */jsxRuntime.jsxs("div", { - className: "graphiql-doc-explorer-header-content", - children: [prevName && /* @__PURE__ */jsxRuntime.jsxs("a", { - href: "#", - className: "graphiql-doc-explorer-back", - onClick: event => { - event.preventDefault(); - pop(); - }, - "aria-label": `Go back to ${prevName}`, - children: [/* @__PURE__ */jsxRuntime.jsx(ChevronLeftIcon, {}), prevName] - }), /* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-doc-explorer-title", - children: navItem.name - })] - }), /* @__PURE__ */jsxRuntime.jsx(Search, {}, navItem.name)] - }), /* @__PURE__ */jsxRuntime.jsx("div", { + children: [t4, t5] + }); + $[32] = t4; + $[33] = t5; + $[34] = t6; + } else { + t6 = $[34]; + } + let t7; + if ($[35] !== content) { + t7 = /* @__PURE__ */jsxRuntime.jsx("div", { className: "graphiql-doc-explorer-content", children: content - })] - }); + }); + $[35] = content; + $[36] = t7; + } else { + t7 = $[36]; + } + let t8; + if ($[37] !== t6 || $[38] !== t7) { + t8 = /* @__PURE__ */jsxRuntime.jsxs("section", { + className: "graphiql-doc-explorer", + "aria-label": "Documentation Explorer", + children: [t6, t7] + }); + $[37] = t6; + $[38] = t7; + $[39] = t8; + } else { + t8 = $[39]; + } + return t8; } const DOC_EXPLORER_PLUGIN = { title: "Documentation Explorer", @@ -71079,13 +79604,16 @@ const HISTORY_PLUGIN = { }; const PluginContext = createNullableContext("PluginContext"); function PluginContextProvider(props) { + const $ = reactCompilerRuntime.c(27); const storage = useStorageContext(); const explorerContext = useExplorerContext(); const historyContext = useHistoryContext(); const hasExplorerContext = Boolean(explorerContext); const hasHistoryContext = Boolean(historyContext); - const plugins = React.useMemo(() => { - const pluginList = []; + let t0; + let pluginList; + if ($[0] !== hasExplorerContext || $[1] !== hasHistoryContext || $[2] !== props.plugins) { + pluginList = []; const pluginTitles = {}; if (hasExplorerContext) { pluginList.push(DOC_EXPLORER_PLUGIN); @@ -71095,7 +79623,15 @@ function PluginContextProvider(props) { pluginList.push(HISTORY_PLUGIN); pluginTitles[HISTORY_PLUGIN.title] = true; } - for (const plugin of props.plugins || []) { + let t12; + if ($[4] !== props.plugins) { + t12 = props.plugins || []; + $[4] = props.plugins; + $[5] = t12; + } else { + t12 = $[5]; + } + for (const plugin of t12) { if (typeof plugin.title !== "string" || !plugin.title) { throw new Error("All GraphiQL plugins must have a unique title"); } @@ -71106,50 +79642,114 @@ function PluginContextProvider(props) { pluginTitles[plugin.title] = true; } } - return pluginList; - }, [hasExplorerContext, hasHistoryContext, props.plugins]); - const [visiblePlugin, internalSetVisiblePlugin] = React.useState(() => { - const storedValue = storage == null ? void 0 : storage.get(STORAGE_KEY$4); - const pluginForStoredValue = plugins.find(plugin => plugin.title === storedValue); - if (pluginForStoredValue) { - return pluginForStoredValue; - } - if (storedValue) { - storage == null ? void 0 : storage.set(STORAGE_KEY$4, ""); - } - if (!props.visiblePlugin) { - return null; - } - return plugins.find(plugin => (typeof props.visiblePlugin === "string" ? plugin.title : plugin) === props.visiblePlugin) || null; - }); + $[0] = hasExplorerContext; + $[1] = hasHistoryContext; + $[2] = props.plugins; + $[3] = pluginList; + } else { + pluginList = $[3]; + } + t0 = pluginList; + const plugins = t0; + let t1; + if ($[6] !== plugins || $[7] !== props.visiblePlugin || $[8] !== storage) { + t1 = () => { + const storedValue = storage == null ? void 0 : storage.get(STORAGE_KEY$4); + const pluginForStoredValue = plugins.find(plugin_0 => plugin_0.title === storedValue); + if (pluginForStoredValue) { + return pluginForStoredValue; + } + if (storedValue) { + storage == null ? void 0 : storage.set(STORAGE_KEY$4, ""); + } + if (!props.visiblePlugin) { + return null; + } + return plugins.find(plugin_1 => (typeof props.visiblePlugin === "string" ? plugin_1.title : plugin_1) === props.visiblePlugin) || null; + }; + $[6] = plugins; + $[7] = props.visiblePlugin; + $[8] = storage; + $[9] = t1; + } else { + t1 = $[9]; + } + const [visiblePlugin, internalSetVisiblePlugin] = React.useState(t1); const { onTogglePluginVisibility, children } = props; - const setVisiblePlugin = React.useCallback(plugin => { - const newVisiblePlugin = plugin ? plugins.find(p => (typeof plugin === "string" ? p.title : p) === plugin) || null : null; - internalSetVisiblePlugin(current => { - if (newVisiblePlugin === current) { - return current; + let t2; + if ($[10] !== onTogglePluginVisibility || $[11] !== plugins) { + t2 = plugin_2 => { + const newVisiblePlugin = plugin_2 ? plugins.find(p => (typeof plugin_2 === "string" ? p.title : p) === plugin_2) || null : null; + internalSetVisiblePlugin(current => { + if (newVisiblePlugin === current) { + return current; + } + onTogglePluginVisibility == null ? void 0 : onTogglePluginVisibility(newVisiblePlugin); + return newVisiblePlugin; + }); + }; + $[10] = onTogglePluginVisibility; + $[11] = plugins; + $[12] = t2; + } else { + t2 = $[12]; + } + const setVisiblePlugin = t2; + let t3; + if ($[13] !== props.visiblePlugin || $[14] !== setVisiblePlugin) { + t3 = () => { + if (props.visiblePlugin) { + setVisiblePlugin(props.visiblePlugin); } - onTogglePluginVisibility == null ? void 0 : onTogglePluginVisibility(newVisiblePlugin); - return newVisiblePlugin; + }; + $[13] = props.visiblePlugin; + $[14] = setVisiblePlugin; + $[15] = t3; + } else { + t3 = $[15]; + } + let t4; + if ($[16] !== plugins || $[17] !== props.visiblePlugin || $[18] !== setVisiblePlugin) { + t4 = [plugins, props.visiblePlugin, setVisiblePlugin]; + $[16] = plugins; + $[17] = props.visiblePlugin; + $[18] = setVisiblePlugin; + $[19] = t4; + } else { + t4 = $[19]; + } + React.useEffect(t3, t4); + let t5; + if ($[20] !== plugins || $[21] !== setVisiblePlugin || $[22] !== visiblePlugin) { + t5 = { + plugins, + setVisiblePlugin, + visiblePlugin + }; + $[20] = plugins; + $[21] = setVisiblePlugin; + $[22] = visiblePlugin; + $[23] = t5; + } else { + t5 = $[23]; + } + const value = t5; + let t6; + if ($[24] !== children || $[25] !== value) { + t6 = /* @__PURE__ */jsxRuntime.jsx(PluginContext.Provider, { + value, + children }); - }, [onTogglePluginVisibility, plugins]); - React.useEffect(() => { - if (props.visiblePlugin) { - setVisiblePlugin(props.visiblePlugin); - } - }, [plugins, props.visiblePlugin, setVisiblePlugin]); - const value = React.useMemo(() => ({ - plugins, - setVisiblePlugin, - visiblePlugin - }), [plugins, setVisiblePlugin, visiblePlugin]); - return /* @__PURE__ */jsxRuntime.jsx(PluginContext.Provider, { - value, - children - }); + $[24] = children; + $[25] = value; + $[26] = t6; + } else { + t6 = $[26]; + } + return t6; } const usePluginContext = createContextHook(PluginContext); const STORAGE_KEY$4 = "visiblePlugin"; @@ -71301,244 +79901,476 @@ function onHasCompletion(_cm, data, schema, explorer, plugin, callback) { } } function useSynchronizeValue(editor, value) { - React.useEffect(() => { - if (editor && typeof value === "string" && value !== editor.getValue()) { - editor.setValue(value); - } - }, [editor, value]); + const $ = reactCompilerRuntime.c(4); + let t0; + let t1; + if ($[0] !== editor || $[1] !== value) { + t0 = () => { + if (editor && typeof value === "string" && value !== editor.getValue()) { + editor.setValue(value); + } + }; + t1 = [editor, value]; + $[0] = editor; + $[1] = value; + $[2] = t0; + $[3] = t1; + } else { + t0 = $[2]; + t1 = $[3]; + } + React.useEffect(t0, t1); } function useSynchronizeOption(editor, option, value) { - React.useEffect(() => { - if (editor) { - editor.setOption(option, value); - } - }, [editor, option, value]); + const $ = reactCompilerRuntime.c(5); + let t0; + let t1; + if ($[0] !== editor || $[1] !== option || $[2] !== value) { + t0 = () => { + if (editor) { + editor.setOption(option, value); + } + }; + t1 = [editor, option, value]; + $[0] = editor; + $[1] = option; + $[2] = value; + $[3] = t0; + $[4] = t1; + } else { + t0 = $[3]; + t1 = $[4]; + } + React.useEffect(t0, t1); } function useChangeHandler(editor, callback, storageKey, tabProperty, caller) { + const $ = reactCompilerRuntime.c(10); + let t0; + if ($[0] !== caller) { + t0 = { + nonNull: true, + caller + }; + $[0] = caller; + $[1] = t0; + } else { + t0 = $[1]; + } const { updateActiveTabValues - } = useEditorContext({ - nonNull: true, - caller - }); + } = useEditorContext(t0); const storage = useStorageContext(); - React.useEffect(() => { - if (!editor) { - return; - } - const store = debounce(500, value => { - if (!storage || storageKey === null) { + let t1; + let t2; + if ($[2] !== callback || $[3] !== editor || $[4] !== storage || $[5] !== storageKey || $[6] !== tabProperty || $[7] !== updateActiveTabValues) { + t1 = () => { + if (!editor) { return; } - storage.set(storageKey, value); - }); - const updateTab = debounce(100, value => { - updateActiveTabValues({ - [tabProperty]: value + const store = debounce(500, value => { + if (!storage || storageKey === null) { + return; + } + storage.set(storageKey, value); }); - }); - const handleChange = (editorInstance, changeObj) => { - if (!changeObj) { - return; - } - const newValue = editorInstance.getValue(); - store(newValue); - updateTab(newValue); - callback == null ? void 0 : callback(newValue); - }; - editor.on("change", handleChange); - return () => editor.off("change", handleChange); - }, [callback, editor, storage, storageKey, tabProperty, updateActiveTabValues]); -} -function useCompletion(editor, callback, caller) { - const { - schema - } = useSchemaContext({ - nonNull: true, - caller - }); - const explorer = useExplorerContext(); - const plugin = usePluginContext(); - React.useEffect(() => { - if (!editor) { - return; - } - const handleCompletion = (instance, changeObj) => { - onHasCompletion(instance, changeObj, schema, explorer, plugin, type => { - callback == null ? void 0 : callback({ - kind: "Type", - type, - schema: schema || void 0 + const updateTab = debounce(100, value_0 => { + updateActiveTabValues({ + [tabProperty]: value_0 }); }); + const handleChange = (editorInstance, changeObj) => { + if (!changeObj) { + return; + } + const newValue = editorInstance.getValue(); + store(newValue); + updateTab(newValue); + callback == null ? void 0 : callback(newValue); + }; + editor.on("change", handleChange); + return () => editor.off("change", handleChange); }; - editor.on( - // @ts-expect-error @TODO additional args for hasCompletion event - "hasCompletion", handleCompletion); - return () => editor.off( - // @ts-expect-error @TODO additional args for hasCompletion event - "hasCompletion", handleCompletion); - }, [callback, editor, explorer, plugin, schema]); + t2 = [callback, editor, storage, storageKey, tabProperty, updateActiveTabValues]; + $[2] = callback; + $[3] = editor; + $[4] = storage; + $[5] = storageKey; + $[6] = tabProperty; + $[7] = updateActiveTabValues; + $[8] = t1; + $[9] = t2; + } else { + t1 = $[8]; + t2 = $[9]; + } + React.useEffect(t1, t2); } -function useKeyMap(editor, keys, callback) { - React.useEffect(() => { - if (!editor) { - return; - } - for (const key of keys) { - editor.removeKeyMap(key); - } - if (callback) { - const keyMap = {}; - for (const key of keys) { - keyMap[key] = () => callback(); - } - editor.addKeyMap(keyMap); - } - }, [editor, keys, callback]); -} -function useCopyQuery({ - caller, - onCopyQuery -} = {}) { - const { - queryEditor - } = useEditorContext({ - nonNull: true, - caller: caller || useCopyQuery - }); - return React.useCallback(() => { - if (!queryEditor) { - return; - } - const query = queryEditor.getValue(); - copyToClipboard(query); - onCopyQuery == null ? void 0 : onCopyQuery(query); - }, [queryEditor, onCopyQuery]); -} -function useMergeQuery({ - caller -} = {}) { - const { - queryEditor - } = useEditorContext({ - nonNull: true, - caller: caller || useMergeQuery - }); +function useCompletion(editor, callback, caller) { + const $ = reactCompilerRuntime.c(9); + let t0; + if ($[0] !== caller) { + t0 = { + nonNull: true, + caller + }; + $[0] = caller; + $[1] = t0; + } else { + t0 = $[1]; + } const { schema - } = useSchemaContext({ - nonNull: true, - caller: useMergeQuery - }); - return React.useCallback(() => { - const documentAST = queryEditor == null ? void 0 : queryEditor.documentAST; - const query = queryEditor == null ? void 0 : queryEditor.getValue(); - if (!documentAST || !query) { - return; - } - queryEditor.setValue(graphql.print(toolkit.mergeAst(documentAST, schema))); - }, [queryEditor, schema]); + } = useSchemaContext(t0); + const explorer = useExplorerContext(); + const plugin = usePluginContext(); + let t1; + let t2; + if ($[2] !== callback || $[3] !== editor || $[4] !== explorer || $[5] !== plugin || $[6] !== schema) { + t1 = () => { + if (!editor) { + return; + } + const handleCompletion = (instance, changeObj) => { + onHasCompletion(instance, changeObj, schema, explorer, plugin, type => { + callback == null ? void 0 : callback({ + kind: "Type", + type, + schema: schema || void 0 + }); + }); + }; + editor.on("hasCompletion", handleCompletion); + return () => editor.off("hasCompletion", handleCompletion); + }; + t2 = [callback, editor, explorer, plugin, schema]; + $[2] = callback; + $[3] = editor; + $[4] = explorer; + $[5] = plugin; + $[6] = schema; + $[7] = t1; + $[8] = t2; + } else { + t1 = $[7]; + t2 = $[8]; + } + React.useEffect(t1, t2); } -function usePrettifyEditors({ - caller -} = {}) { +function useKeyMap(editor, keys, callback) { + const $ = reactCompilerRuntime.c(5); + let t0; + let t1; + if ($[0] !== callback || $[1] !== editor || $[2] !== keys) { + t0 = () => { + if (!editor) { + return; + } + for (const key of keys) { + editor.removeKeyMap(key); + } + if (callback) { + const keyMap = {}; + for (const key_0 of keys) { + keyMap[key_0] = () => callback(); + } + editor.addKeyMap(keyMap); + } + }; + t1 = [editor, keys, callback]; + $[0] = callback; + $[1] = editor; + $[2] = keys; + $[3] = t0; + $[4] = t1; + } else { + t0 = $[3]; + t1 = $[4]; + } + React.useEffect(t0, t1); +} +const _useCopyQuery = useCopyQuery; +const _useMergeQuery = useMergeQuery; +const _usePrettifyEditors = usePrettifyEditors; +const _useAutoCompleteLeafs = useAutoCompleteLeafs; +function useCopyQuery(t0) { + const $ = reactCompilerRuntime.c(7); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + caller, + onCopyQuery + } = t1; + const t2 = caller || _useCopyQuery; + let t3; + if ($[2] !== t2) { + t3 = { + nonNull: true, + caller: t2 + }; + $[2] = t2; + $[3] = t3; + } else { + t3 = $[3]; + } + const { + queryEditor + } = useEditorContext(t3); + let t4; + if ($[4] !== onCopyQuery || $[5] !== queryEditor) { + t4 = () => { + if (!queryEditor) { + return; + } + const query = queryEditor.getValue(); + copyToClipboard(query); + onCopyQuery == null ? void 0 : onCopyQuery(query); + }; + $[4] = onCopyQuery; + $[5] = queryEditor; + $[6] = t4; + } else { + t4 = $[6]; + } + return t4; +} +function useMergeQuery(t0) { + const $ = reactCompilerRuntime.c(8); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + caller + } = t1; + const t2 = caller || _useMergeQuery; + let t3; + if ($[2] !== t2) { + t3 = { + nonNull: true, + caller: t2 + }; + $[2] = t2; + $[3] = t3; + } else { + t3 = $[3]; + } + const { + queryEditor + } = useEditorContext(t3); + let t4; + if ($[4] === Symbol.for("react.memo_cache_sentinel")) { + t4 = { + nonNull: true, + caller: _useMergeQuery + }; + $[4] = t4; + } else { + t4 = $[4]; + } + const { + schema + } = useSchemaContext(t4); + let t5; + if ($[5] !== queryEditor || $[6] !== schema) { + t5 = () => { + const documentAST = queryEditor == null ? void 0 : queryEditor.documentAST; + const query = queryEditor == null ? void 0 : queryEditor.getValue(); + if (!documentAST || !query) { + return; + } + queryEditor.setValue(graphql.print(toolkit.mergeAst(documentAST, schema))); + }; + $[5] = queryEditor; + $[6] = schema; + $[7] = t5; + } else { + t5 = $[7]; + } + return t5; +} +function usePrettifyEditors(t0) { + const $ = reactCompilerRuntime.c(8); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + caller + } = t1; + const t2 = caller || _usePrettifyEditors; + let t3; + if ($[2] !== t2) { + t3 = { + nonNull: true, + caller: t2 + }; + $[2] = t2; + $[3] = t3; + } else { + t3 = $[3]; + } const { queryEditor, headerEditor, variableEditor - } = useEditorContext({ - nonNull: true, - caller: caller || usePrettifyEditors - }); - return React.useCallback(() => { - if (variableEditor) { - const variableEditorContent = variableEditor.getValue(); - try { - const prettifiedVariableEditorContent = JSON.stringify(JSON.parse(variableEditorContent), null, 2); - if (prettifiedVariableEditorContent !== variableEditorContent) { - variableEditor.setValue(prettifiedVariableEditorContent); - } - } catch {} - } - if (headerEditor) { - const headerEditorContent = headerEditor.getValue(); - try { - const prettifiedHeaderEditorContent = JSON.stringify(JSON.parse(headerEditorContent), null, 2); - if (prettifiedHeaderEditorContent !== headerEditorContent) { - headerEditor.setValue(prettifiedHeaderEditorContent); - } - } catch {} - } - if (queryEditor) { - const editorContent = queryEditor.getValue(); - const prettifiedEditorContent = graphql.print(graphql.parse(editorContent)); - if (prettifiedEditorContent !== editorContent) { - queryEditor.setValue(prettifiedEditorContent); + } = useEditorContext(t3); + let t4; + if ($[4] !== headerEditor || $[5] !== queryEditor || $[6] !== variableEditor) { + t4 = () => { + if (variableEditor) { + const variableEditorContent = variableEditor.getValue(); + try { + const prettifiedVariableEditorContent = JSON.stringify(JSON.parse(variableEditorContent), null, 2); + if (prettifiedVariableEditorContent !== variableEditorContent) { + variableEditor.setValue(prettifiedVariableEditorContent); + } + } catch {} } - } - }, [queryEditor, variableEditor, headerEditor]); + if (headerEditor) { + const headerEditorContent = headerEditor.getValue(); + try { + const prettifiedHeaderEditorContent = JSON.stringify(JSON.parse(headerEditorContent), null, 2); + if (prettifiedHeaderEditorContent !== headerEditorContent) { + headerEditor.setValue(prettifiedHeaderEditorContent); + } + } catch {} + } + if (queryEditor) { + const editorContent = queryEditor.getValue(); + const prettifiedEditorContent = graphql.print(graphql.parse(editorContent)); + if (prettifiedEditorContent !== editorContent) { + queryEditor.setValue(prettifiedEditorContent); + } + } + }; + $[4] = headerEditor; + $[5] = queryEditor; + $[6] = variableEditor; + $[7] = t4; + } else { + t4 = $[7]; + } + return t4; } -function useAutoCompleteLeafs({ - getDefaultFieldNames, - caller -} = {}) { +function useAutoCompleteLeafs(t0) { + const $ = reactCompilerRuntime.c(10); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + getDefaultFieldNames, + caller + } = t1; + const t2 = caller || _useAutoCompleteLeafs; + let t3; + if ($[2] !== t2) { + t3 = { + nonNull: true, + caller: t2 + }; + $[2] = t2; + $[3] = t3; + } else { + t3 = $[3]; + } const { schema - } = useSchemaContext({ - nonNull: true, - caller: caller || useAutoCompleteLeafs - }); + } = useSchemaContext(t3); + const t4 = caller || _useAutoCompleteLeafs; + let t5; + if ($[4] !== t4) { + t5 = { + nonNull: true, + caller: t4 + }; + $[4] = t4; + $[5] = t5; + } else { + t5 = $[5]; + } const { queryEditor - } = useEditorContext({ - nonNull: true, - caller: caller || useAutoCompleteLeafs - }); - return React.useCallback(() => { - if (!queryEditor) { - return; - } - const query = queryEditor.getValue(); - const { - insertions, - result - } = toolkit.fillLeafs(schema, query, getDefaultFieldNames); - if (insertions && insertions.length > 0) { - queryEditor.operation(() => { - const cursor = queryEditor.getCursor(); - const cursorIndex = queryEditor.indexFromPos(cursor); - queryEditor.setValue(result || ""); - let added = 0; - const markers = insertions.map(({ - index, - string - }) => queryEditor.markText(queryEditor.posFromIndex(index + added), queryEditor.posFromIndex(index + (added += string.length)), { - className: "auto-inserted-leaf", - clearOnEnter: true, - title: "Automatically added leaf fields" - })); - setTimeout(() => { - for (const marker of markers) { - marker.clear(); + } = useEditorContext(t5); + let t6; + if ($[6] !== getDefaultFieldNames || $[7] !== queryEditor || $[8] !== schema) { + t6 = () => { + if (!queryEditor) { + return; + } + const query = queryEditor.getValue(); + const { + insertions, + result + } = toolkit.fillLeafs(schema, query, getDefaultFieldNames); + if (insertions && insertions.length > 0) { + queryEditor.operation(() => { + const cursor = queryEditor.getCursor(); + const cursorIndex = queryEditor.indexFromPos(cursor); + queryEditor.setValue(result || ""); + let added; + added = 0; + const markers = insertions.map(t7 => { + const { + index, + string + } = t7; + added = added + string.length; + return queryEditor.markText(queryEditor.posFromIndex(index + added), queryEditor.posFromIndex(index + added), { + className: "auto-inserted-leaf", + clearOnEnter: true, + title: "Automatically added leaf fields" + }); + }); + setTimeout(() => { + for (const marker of markers) { + marker.clear(); + } + }, 7e3); + let newCursorIndex = cursorIndex; + for (const { + index: index_0, + string: string_0 + } of insertions) { + if (index_0 < cursorIndex) { + newCursorIndex = newCursorIndex + string_0.length; + } } - }, 7e3); - let newCursorIndex = cursorIndex; - for (const { - index, - string - } of insertions) { - if (index < cursorIndex) { - newCursorIndex += string.length; - } - } - queryEditor.setCursor(queryEditor.posFromIndex(newCursorIndex)); - }); - } - return result; - }, [getDefaultFieldNames, queryEditor, schema]); + queryEditor.setCursor(queryEditor.posFromIndex(newCursorIndex)); + }); + } + return result; + }; + $[6] = getDefaultFieldNames; + $[7] = queryEditor; + $[8] = schema; + $[9] = t6; + } else { + t6 = $[9]; + } + return t6; } const useEditorState = editor => { + "use no memo"; + var _ref2; const context = useEditorContext({ nonNull: true @@ -71561,143 +80393,265 @@ const useVariablesEditorState = () => { const useHeadersEditorState = () => { return useEditorState("header"); }; -function useOptimisticState([upstreamState, upstreamSetState]) { - const lastStateRef = React.useRef({ - /** The last thing that we sent upstream; we're expecting this back */ - pending: null, - /** The last thing we received from upstream */ - last: upstreamState - }); +function useOptimisticState(t0) { + const $ = reactCompilerRuntime.c(12); + const [upstreamState, upstreamSetState] = t0; + let t1; + if ($[0] !== upstreamState) { + t1 = { + pending: null, + last: upstreamState + }; + $[0] = upstreamState; + $[1] = t1; + } else { + t1 = $[1]; + } + const lastStateRef = React.useRef(t1); const [state, setOperationsText] = React.useState(upstreamState); - React.useEffect(() => { - if (lastStateRef.current.last === upstreamState) ;else { - lastStateRef.current.last = upstreamState; - if (lastStateRef.current.pending === null) { - setOperationsText(upstreamState); - } else if (lastStateRef.current.pending === upstreamState) { - lastStateRef.current.pending = null; - if (upstreamState !== state) { - lastStateRef.current.pending = state; - upstreamSetState(state); + let t2; + let t3; + if ($[2] !== state || $[3] !== upstreamSetState || $[4] !== upstreamState) { + t2 = () => { + if (lastStateRef.current.last === upstreamState) ;else { + lastStateRef.current.last = upstreamState; + if (lastStateRef.current.pending === null) { + setOperationsText(upstreamState); + } else { + if (lastStateRef.current.pending === upstreamState) { + lastStateRef.current.pending = null; + if (upstreamState !== state) { + lastStateRef.current.pending = state; + upstreamSetState(state); + } + } else { + lastStateRef.current.pending = null; + setOperationsText(upstreamState); + } } - } else { - lastStateRef.current.pending = null; - setOperationsText(upstreamState); } - } - }, [upstreamState, state, upstreamSetState]); - const setState = React.useCallback(newState => { - setOperationsText(newState); - if (lastStateRef.current.pending === null && lastStateRef.current.last !== newState) { - lastStateRef.current.pending = newState; - upstreamSetState(newState); - } - }, [upstreamSetState]); - return React.useMemo(() => [state, setState], [state, setState]); + }; + t3 = [upstreamState, state, upstreamSetState]; + $[2] = state; + $[3] = upstreamSetState; + $[4] = upstreamState; + $[5] = t2; + $[6] = t3; + } else { + t2 = $[5]; + t3 = $[6]; + } + React.useEffect(t2, t3); + let t4; + if ($[7] !== upstreamSetState) { + t4 = newState => { + setOperationsText(newState); + if (lastStateRef.current.pending === null && lastStateRef.current.last !== newState) { + lastStateRef.current.pending = newState; + upstreamSetState(newState); + } + }; + $[7] = upstreamSetState; + $[8] = t4; + } else { + t4 = $[8]; + } + const setState = t4; + let t5; + if ($[9] !== setState || $[10] !== state) { + t5 = [state, setState]; + $[9] = setState; + $[10] = state; + $[11] = t5; + } else { + t5 = $[11]; + } + return t5; } -function useHeaderEditor({ - editorTheme = DEFAULT_EDITOR_THEME, - keyMap = DEFAULT_KEY_MAP, - onEdit, - readOnly = false -} = {}, caller) { +function importCodeMirrorImports$3() { + return importCodeMirror([// @ts-expect-error + Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/mode/javascript/javascript.js */ "../../../node_modules/codemirror/mode/javascript/javascript.js")))]); +} +const _useHeaderEditor = useHeaderEditor; +function useHeaderEditor(t0, caller) { + const $ = reactCompilerRuntime.c(17); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + editorTheme: t2, + keyMap: t3, + onEdit, + readOnly: t4 + } = t1; + const editorTheme = t2 === void 0 ? DEFAULT_EDITOR_THEME : t2; + const keyMap = t3 === void 0 ? DEFAULT_KEY_MAP : t3; + const readOnly = t4 === void 0 ? false : t4; + const t5 = caller || _useHeaderEditor; + let t6; + if ($[2] !== t5) { + t6 = { + nonNull: true, + caller: t5 + }; + $[2] = t5; + $[3] = t6; + } else { + t6 = $[3]; + } const { initialHeaders, headerEditor, setHeaderEditor, shouldPersistHeaders - } = useEditorContext({ - nonNull: true, - caller: caller || useHeaderEditor - }); + } = useEditorContext(t6); const executionContext = useExecutionContext(); - const merge = useMergeQuery({ - caller: caller || useHeaderEditor - }); - const prettify = usePrettifyEditors({ - caller: caller || useHeaderEditor - }); - const ref = React.useRef(null); - React.useEffect(() => { - let isActive = true; - void importCodeMirror([ - // @ts-expect-error - Promise.resolve().then(() => __webpack_require__(/*! ./javascript.cjs.js */ "../../graphiql-react/dist/javascript.cjs.js")).then(n => n.javascript)]).then(CodeMirror => { - if (!isActive) { - return; - } - const container = ref.current; - if (!container) { - return; - } - const newEditor = CodeMirror(container, { - value: initialHeaders, - lineNumbers: true, - tabSize: 2, - mode: { - name: "javascript", - json: true - }, - theme: editorTheme, - autoCloseBrackets: true, - matchBrackets: true, - showCursorWhenSelecting: true, - readOnly: readOnly ? "nocursor" : false, - foldGutter: true, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: commonKeys - }); - newEditor.addKeyMap({ - "Cmd-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Ctrl-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Alt-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Shift-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - } - }); - newEditor.on("keyup", (editorInstance, event) => { - const { - code, - key, - shiftKey - } = event; - const isLetter = code.startsWith("Key"); - const isNumber = !shiftKey && code.startsWith("Digit"); - if (isLetter || isNumber || key === "_" || key === '"') { - editorInstance.execCommand("autocomplete"); - } - }); - setHeaderEditor(newEditor); - }); - return () => { - isActive = false; + const t7 = caller || _useHeaderEditor; + let t8; + if ($[4] !== t7) { + t8 = { + caller: t7 }; - }, [editorTheme, initialHeaders, readOnly, setHeaderEditor]); + $[4] = t7; + $[5] = t8; + } else { + t8 = $[5]; + } + const merge = useMergeQuery(t8); + const t9 = caller || _useHeaderEditor; + let t10; + if ($[6] !== t9) { + t10 = { + caller: t9 + }; + $[6] = t9; + $[7] = t10; + } else { + t10 = $[7]; + } + const prettify = usePrettifyEditors(t10); + const ref = React.useRef(null); + let t11; + let t12; + if ($[8] !== editorTheme || $[9] !== initialHeaders || $[10] !== readOnly || $[11] !== setHeaderEditor) { + t11 = () => { + let isActive; + isActive = true; + importCodeMirrorImports$3().then(CodeMirror => { + if (!isActive) { + return; + } + const container = ref.current; + if (!container) { + return; + } + const newEditor = CodeMirror(container, { + value: initialHeaders, + lineNumbers: true, + tabSize: 2, + mode: { + name: "javascript", + json: true + }, + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + foldGutter: true, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: commonKeys + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + } + }); + newEditor.on("keyup", _temp$2); + setHeaderEditor(newEditor); + }); + return () => { + isActive = false; + }; + }; + t12 = [editorTheme, initialHeaders, readOnly, setHeaderEditor]; + $[8] = editorTheme; + $[9] = initialHeaders; + $[10] = readOnly; + $[11] = setHeaderEditor; + $[12] = t11; + $[13] = t12; + } else { + t11 = $[12]; + t12 = $[13]; + } + React.useEffect(t11, t12); useSynchronizeOption(headerEditor, "keyMap", keyMap); - useChangeHandler(headerEditor, onEdit, shouldPersistHeaders ? STORAGE_KEY$3 : null, "headers", useHeaderEditor); - useKeyMap(headerEditor, ["Cmd-Enter", "Ctrl-Enter"], executionContext == null ? void 0 : executionContext.run); - useKeyMap(headerEditor, ["Shift-Ctrl-P"], prettify); - useKeyMap(headerEditor, ["Shift-Ctrl-M"], merge); + useChangeHandler(headerEditor, onEdit, shouldPersistHeaders ? STORAGE_KEY$3 : null, "headers", _useHeaderEditor); + let t13; + if ($[14] === Symbol.for("react.memo_cache_sentinel")) { + t13 = ["Cmd-Enter", "Ctrl-Enter"]; + $[14] = t13; + } else { + t13 = $[14]; + } + useKeyMap(headerEditor, t13, executionContext == null ? void 0 : executionContext.run); + let t14; + if ($[15] === Symbol.for("react.memo_cache_sentinel")) { + t14 = ["Shift-Ctrl-P"]; + $[15] = t14; + } else { + t14 = $[15]; + } + useKeyMap(headerEditor, t14, prettify); + let t15; + if ($[16] === Symbol.for("react.memo_cache_sentinel")) { + t15 = ["Shift-Ctrl-M"]; + $[16] = t15; + } else { + t15 = $[16]; + } + useKeyMap(headerEditor, t15, merge); return ref; } +function _temp$2(editorInstance, event) { + const { + code, + key, + shiftKey + } = event; + const isLetter = code.startsWith("Key"); + const isNumber = !shiftKey && code.startsWith("Digit"); + if (isLetter || isNumber || key === "_" || key === '"') { + editorInstance.execCommand("autocomplete"); + } +} const STORAGE_KEY$3 = "headers"; const invalidCharacters = Array.from({ length: 11 @@ -71708,20 +80662,79 @@ const sanitizeRegex = new RegExp("[" + invalidCharacters.join("") + "]", "g"); function normalizeWhitespace(line) { return line.replace(sanitizeRegex, " "); } -function useQueryEditor({ - editorTheme = DEFAULT_EDITOR_THEME, - keyMap = DEFAULT_KEY_MAP, - onClickReference, - onCopyQuery, - onEdit, - readOnly = false -} = {}, caller) { +function importCodeMirrorImports$2() { + return importCodeMirror([Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/comment/comment.js */ "../../../node_modules/codemirror/addon/comment/comment.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/search.js */ "../../../node_modules/codemirror/addon/search/search.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/hint.js */ "../../codemirror-graphql/esm/hint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/lint.js */ "../../codemirror-graphql/esm/lint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/info.js */ "../../codemirror-graphql/esm/info.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/jump.js */ "../../codemirror-graphql/esm/jump.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/mode.js */ "../../codemirror-graphql/esm/mode.js")))]); +} +const _useQueryEditor = useQueryEditor; +function updateVariableEditor(variableEditor, operationFacts) { + variableEditor.state.lint.linterOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; + variableEditor.options.lint.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; + variableEditor.options.hintOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; +} +function updateEditorSchema(editor, schema) { + editor.state.lint.linterOptions.schema = schema; + editor.options.lint.schema = schema; + editor.options.hintOptions.schema = schema; + editor.options.info.schema = schema; + editor.options.jump.schema = schema; +} +function updateEditorValidationRules(editor, validationRules) { + editor.state.lint.linterOptions.validationRules = validationRules; + editor.options.lint.validationRules = validationRules; +} +function updateEditorExternalFragments(editor, externalFragmentList) { + editor.state.lint.linterOptions.externalFragments = externalFragmentList; + editor.options.lint.externalFragments = externalFragmentList; + editor.options.hintOptions.externalFragments = externalFragmentList; +} +function useQueryEditor(t0, caller) { + const $ = reactCompilerRuntime.c(41); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + editorTheme: t2, + keyMap: t3, + onClickReference, + onCopyQuery, + onEdit, + readOnly: t4 + } = t1; + const editorTheme = t2 === void 0 ? DEFAULT_EDITOR_THEME : t2; + const keyMap = t3 === void 0 ? DEFAULT_KEY_MAP : t3; + const readOnly = t4 === void 0 ? false : t4; + const t5 = caller || _useQueryEditor; + let t6; + if ($[2] !== t5) { + t6 = { + nonNull: true, + caller: t5 + }; + $[2] = t5; + $[3] = t6; + } else { + t6 = $[3]; + } const { schema - } = useSchemaContext({ - nonNull: true, - caller: caller || useQueryEditor - }); + } = useSchemaContext(t6); + const t7 = caller || _useQueryEditor; + let t8; + if ($[4] !== t7) { + t8 = { + nonNull: true, + caller: t7 + }; + $[4] = t7; + $[5] = t8; + } else { + t8 = $[5]; + } const { externalFragments, initialQuery, @@ -71731,321 +80744,484 @@ function useQueryEditor({ validationRules, variableEditor, updateActiveTabValues - } = useEditorContext({ - nonNull: true, - caller: caller || useQueryEditor - }); + } = useEditorContext(t8); const executionContext = useExecutionContext(); const storage = useStorageContext(); const explorer = useExplorerContext(); const plugin = usePluginContext(); - const copy = useCopyQuery({ - caller: caller || useQueryEditor, - onCopyQuery - }); - const merge = useMergeQuery({ - caller: caller || useQueryEditor - }); - const prettify = usePrettifyEditors({ - caller: caller || useQueryEditor - }); + const t9 = caller || _useQueryEditor; + let t10; + if ($[6] !== onCopyQuery || $[7] !== t9) { + t10 = { + caller: t9, + onCopyQuery + }; + $[6] = onCopyQuery; + $[7] = t9; + $[8] = t10; + } else { + t10 = $[8]; + } + const copy = useCopyQuery(t10); + const t11 = caller || _useQueryEditor; + let t12; + if ($[9] !== t11) { + t12 = { + caller: t11 + }; + $[9] = t11; + $[10] = t12; + } else { + t12 = $[10]; + } + const merge = useMergeQuery(t12); + const t13 = caller || _useQueryEditor; + let t14; + if ($[11] !== t13) { + t14 = { + caller: t13 + }; + $[11] = t13; + $[12] = t14; + } else { + t14 = $[12]; + } + const prettify = usePrettifyEditors(t14); const ref = React.useRef(null); const codeMirrorRef = React.useRef(); - const onClickReferenceRef = React.useRef(() => {}); - React.useEffect(() => { - onClickReferenceRef.current = reference => { - if (!explorer || !plugin) { - return; - } - plugin.setVisiblePlugin(DOC_EXPLORER_PLUGIN); - switch (reference.kind) { - case "Type": - { - explorer.push({ - name: reference.type.name, - def: reference.type - }); - break; - } - case "Field": - { - explorer.push({ - name: reference.field.name, - def: reference.field - }); - break; - } - case "Argument": - { - if (reference.field) { - explorer.push({ - name: reference.field.name, - def: reference.field - }); - } - break; - } - case "EnumValue": - { - if (reference.type) { + const onClickReferenceRef = React.useRef(_temp$1); + let t15; + let t16; + if ($[13] !== explorer || $[14] !== onClickReference || $[15] !== plugin) { + t15 = () => { + onClickReferenceRef.current = reference => { + if (!explorer || !plugin) { + return; + } + plugin.setVisiblePlugin(DOC_EXPLORER_PLUGIN); + bb47: switch (reference.kind) { + case "Type": + { explorer.push({ name: reference.type.name, def: reference.type }); + break bb47; } - break; - } - } - onClickReference == null ? void 0 : onClickReference(reference); + case "Field": + { + explorer.push({ + name: reference.field.name, + def: reference.field + }); + break bb47; + } + case "Argument": + { + if (reference.field) { + explorer.push({ + name: reference.field.name, + def: reference.field + }); + } + break bb47; + } + case "EnumValue": + { + if (reference.type) { + explorer.push({ + name: reference.type.name, + def: reference.type + }); + } + } + } + onClickReference == null ? void 0 : onClickReference(reference); + }; }; - }, [explorer, onClickReference, plugin]); - React.useEffect(() => { - let isActive = true; - void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./comment.cjs.js */ "../../graphiql-react/dist/comment.cjs.js")).then(n => n.comment), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(n => n.search), Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs.js */ "../../graphiql-react/dist/hint.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs2.js */ "../../graphiql-react/dist/lint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info.cjs.js */ "../../graphiql-react/dist/info.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./jump.cjs.js */ "../../graphiql-react/dist/jump.cjs.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs.js */ "../../graphiql-react/dist/mode.cjs.js"))]).then(CodeMirror => { - if (!isActive) { - return; - } - codeMirrorRef.current = CodeMirror; - const container = ref.current; - if (!container) { - return; - } - const newEditor = CodeMirror(container, { - value: initialQuery, - lineNumbers: true, - tabSize: 2, - foldGutter: true, - mode: "graphql", - theme: editorTheme, - autoCloseBrackets: true, - matchBrackets: true, - showCursorWhenSelecting: true, - readOnly: readOnly ? "nocursor" : false, - lint: { - // @ts-expect-error - schema: void 0, - validationRules: null, - // linting accepts string or FragmentDefinitionNode[] - externalFragments: void 0 - }, - hintOptions: { - // @ts-expect-error - schema: void 0, - closeOnUnfocus: false, - completeSingle: false, - container, - externalFragments: void 0, - autocompleteOptions: { - // for the query editor, restrict to executable type definitions - mode: graphqlLanguageService.GraphQLDocumentMode.EXECUTABLE - } - }, - info: { - schema: void 0, - renderDescription: text => markdown.render(text), - onClick(reference) { - onClickReferenceRef.current(reference); - } - }, - jump: { - schema: void 0, - onClick(reference) { - onClickReferenceRef.current(reference); - } - }, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: { - ...commonKeys, - "Cmd-S"() {}, - "Ctrl-S"() {} + t16 = [explorer, onClickReference, plugin]; + $[13] = explorer; + $[14] = onClickReference; + $[15] = plugin; + $[16] = t15; + $[17] = t16; + } else { + t15 = $[16]; + t16 = $[17]; + } + React.useEffect(t15, t16); + let t17; + let t18; + if ($[18] !== editorTheme || $[19] !== initialQuery || $[20] !== readOnly || $[21] !== setQueryEditor) { + t17 = () => { + let isActive; + isActive = true; + importCodeMirrorImports$2().then(CodeMirror => { + if (!isActive) { + return; } - }); - newEditor.addKeyMap({ - "Cmd-Space"() { - newEditor.showHint({ - completeSingle: true, - container - }); - }, - "Ctrl-Space"() { - newEditor.showHint({ - completeSingle: true, - container - }); - }, - "Alt-Space"() { - newEditor.showHint({ - completeSingle: true, - container - }); - }, - "Shift-Space"() { - newEditor.showHint({ - completeSingle: true, - container - }); - }, - "Shift-Alt-Space"() { - newEditor.showHint({ - completeSingle: true, - container - }); + codeMirrorRef.current = CodeMirror; + const container = ref.current; + if (!container) { + return; } - }); - newEditor.on("keyup", (editorInstance, event) => { - if (AUTO_COMPLETE_AFTER_KEY.test(event.key)) { - editorInstance.execCommand("autocomplete"); - } - }); - let showingHints = false; - newEditor.on("startCompletion", () => { - showingHints = true; - }); - newEditor.on("endCompletion", () => { + const newEditor = CodeMirror(container, { + value: initialQuery, + lineNumbers: true, + tabSize: 2, + foldGutter: true, + mode: "graphql", + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + lint: { + schema: void 0, + validationRules: null, + externalFragments: void 0 + }, + hintOptions: { + schema: void 0, + closeOnUnfocus: false, + completeSingle: false, + container, + externalFragments: void 0, + autocompleteOptions: { + mode: graphqlLanguageService.GraphQLDocumentMode.EXECUTABLE + } + }, + info: { + schema: void 0, + renderDescription: _temp2, + onClick(reference_0) { + onClickReferenceRef.current(reference_0); + } + }, + jump: { + schema: void 0, + onClick(reference_1) { + onClickReferenceRef.current(reference_1); + } + }, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: { + ...commonKeys, + "Cmd-S"() {}, + "Ctrl-S"() {} + } + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + }, + "Shift-Alt-Space"() { + newEditor.showHint({ + completeSingle: true, + container + }); + } + }); + newEditor.on("keyup", _temp3); + let showingHints; showingHints = false; + newEditor.on("startCompletion", () => { + showingHints = true; + }); + newEditor.on("endCompletion", () => { + showingHints = false; + }); + newEditor.on("keydown", (editorInstance_0, event_0) => { + if (event_0.key === "Escape" && showingHints) { + event_0.stopPropagation(); + } + }); + newEditor.on("beforeChange", _temp4); + newEditor.documentAST = null; + newEditor.operationName = null; + newEditor.operations = null; + newEditor.variableToType = null; + setQueryEditor(newEditor); }); - newEditor.on("keydown", (editorInstance, event) => { - if (event.key === "Escape" && showingHints) { - event.stopPropagation(); - } - }); - newEditor.on("beforeChange", (editorInstance, change) => { - var _a; - if (change.origin === "paste") { - const text = change.text.map(normalizeWhitespace); - (_a = change.update) == null ? void 0 : _a.call(change, change.from, change.to, text); - } - }); - newEditor.documentAST = null; - newEditor.operationName = null; - newEditor.operations = null; - newEditor.variableToType = null; - setQueryEditor(newEditor); - }); - return () => { - isActive = false; + return () => { + isActive = false; + }; }; - }, [editorTheme, initialQuery, readOnly, setQueryEditor]); + t18 = [editorTheme, initialQuery, readOnly, setQueryEditor]; + $[18] = editorTheme; + $[19] = initialQuery; + $[20] = readOnly; + $[21] = setQueryEditor; + $[22] = t17; + $[23] = t18; + } else { + t17 = $[22]; + t18 = $[23]; + } + React.useEffect(t17, t18); useSynchronizeOption(queryEditor, "keyMap", keyMap); - React.useEffect(() => { - if (!queryEditor) { - return; - } - function getAndUpdateOperationFacts(editorInstance) { - var _editorInstance$opera, _editorInstance$opera2, _ref3, _ref4; - var _a; - const operationFacts = graphqlLanguageService.getOperationFacts(schema, editorInstance.getValue()); - const operationName = toolkit.getSelectedOperationName((_editorInstance$opera = editorInstance.operations) !== null && _editorInstance$opera !== void 0 ? _editorInstance$opera : void 0, (_editorInstance$opera2 = editorInstance.operationName) !== null && _editorInstance$opera2 !== void 0 ? _editorInstance$opera2 : void 0, operationFacts == null ? void 0 : operationFacts.operations); - editorInstance.documentAST = (_ref3 = operationFacts == null ? void 0 : operationFacts.documentAST) !== null && _ref3 !== void 0 ? _ref3 : null; - editorInstance.operationName = operationName !== null && operationName !== void 0 ? operationName : null; - editorInstance.operations = (_ref4 = operationFacts == null ? void 0 : operationFacts.operations) !== null && _ref4 !== void 0 ? _ref4 : null; - if (variableEditor) { - variableEditor.state.lint.linterOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; - variableEditor.options.lint.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; - variableEditor.options.hintOptions.variableToType = operationFacts == null ? void 0 : operationFacts.variableToType; - (_a = codeMirrorRef.current) == null ? void 0 : _a.signal(variableEditor, "change", variableEditor); + let t19; + let t20; + if ($[24] !== onEdit || $[25] !== queryEditor || $[26] !== schema || $[27] !== setOperationName || $[28] !== storage || $[29] !== updateActiveTabValues || $[30] !== variableEditor) { + t19 = () => { + if (!queryEditor) { + return; } - return operationFacts ? { - ...operationFacts, - operationName - } : null; - } - const handleChange = debounce(100, editorInstance => { - var _ref5; - const query = editorInstance.getValue(); - storage == null ? void 0 : storage.set(STORAGE_KEY_QUERY, query); - const currentOperationName = editorInstance.operationName; - const operationFacts = getAndUpdateOperationFacts(editorInstance); - if ((operationFacts == null ? void 0 : operationFacts.operationName) !== void 0) { - storage == null ? void 0 : storage.set(STORAGE_KEY_OPERATION_NAME, operationFacts.operationName); - } - onEdit == null ? void 0 : onEdit(query, operationFacts == null ? void 0 : operationFacts.documentAST); - if ((operationFacts == null ? void 0 : operationFacts.operationName) && currentOperationName !== operationFacts.operationName) { - setOperationName(operationFacts.operationName); - } - updateActiveTabValues({ - query, - operationName: (_ref5 = operationFacts == null ? void 0 : operationFacts.operationName) !== null && _ref5 !== void 0 ? _ref5 : null + const getAndUpdateOperationFacts = function getAndUpdateOperationFacts2(editorInstance_2) { + var _editorInstance_2$ope, _editorInstance_2$ope2, _ref3, _ref4; + var _a; + const operationFacts = graphqlLanguageService.getOperationFacts(schema, editorInstance_2.getValue()); + const operationName = toolkit.getSelectedOperationName((_editorInstance_2$ope = editorInstance_2.operations) !== null && _editorInstance_2$ope !== void 0 ? _editorInstance_2$ope : void 0, (_editorInstance_2$ope2 = editorInstance_2.operationName) !== null && _editorInstance_2$ope2 !== void 0 ? _editorInstance_2$ope2 : void 0, operationFacts == null ? void 0 : operationFacts.operations); + editorInstance_2.documentAST = (_ref3 = operationFacts == null ? void 0 : operationFacts.documentAST) !== null && _ref3 !== void 0 ? _ref3 : null; + editorInstance_2.operationName = operationName !== null && operationName !== void 0 ? operationName : null; + editorInstance_2.operations = (_ref4 = operationFacts == null ? void 0 : operationFacts.operations) !== null && _ref4 !== void 0 ? _ref4 : null; + if (variableEditor) { + updateVariableEditor(variableEditor, operationFacts); + (_a = codeMirrorRef.current) == null ? void 0 : _a.signal(variableEditor, "change", variableEditor); + } + return operationFacts ? { + ...operationFacts, + operationName + } : null; + }; + const handleChange = debounce(100, editorInstance_3 => { + var _ref5; + const query = editorInstance_3.getValue(); + storage == null ? void 0 : storage.set(STORAGE_KEY_QUERY, query); + const currentOperationName = editorInstance_3.operationName; + const operationFacts_0 = getAndUpdateOperationFacts(editorInstance_3); + if ((operationFacts_0 == null ? void 0 : operationFacts_0.operationName) !== void 0) { + storage == null ? void 0 : storage.set(STORAGE_KEY_OPERATION_NAME, operationFacts_0.operationName); + } + onEdit == null ? void 0 : onEdit(query, operationFacts_0 == null ? void 0 : operationFacts_0.documentAST); + if ((operationFacts_0 == null ? void 0 : operationFacts_0.operationName) && currentOperationName !== operationFacts_0.operationName) { + setOperationName(operationFacts_0.operationName); + } + updateActiveTabValues({ + query, + operationName: (_ref5 = operationFacts_0 == null ? void 0 : operationFacts_0.operationName) !== null && _ref5 !== void 0 ? _ref5 : null + }); }); - }); - getAndUpdateOperationFacts(queryEditor); - queryEditor.on("change", handleChange); - return () => queryEditor.off("change", handleChange); - }, [onEdit, queryEditor, schema, setOperationName, storage, variableEditor, updateActiveTabValues]); + getAndUpdateOperationFacts(queryEditor); + queryEditor.on("change", handleChange); + return () => queryEditor.off("change", handleChange); + }; + t20 = [onEdit, queryEditor, schema, setOperationName, storage, variableEditor, updateActiveTabValues]; + $[24] = onEdit; + $[25] = queryEditor; + $[26] = schema; + $[27] = setOperationName; + $[28] = storage; + $[29] = updateActiveTabValues; + $[30] = variableEditor; + $[31] = t19; + $[32] = t20; + } else { + t19 = $[31]; + t20 = $[32]; + } + React.useEffect(t19, t20); useSynchronizeSchema(queryEditor, schema !== null && schema !== void 0 ? schema : null, codeMirrorRef); useSynchronizeValidationRules(queryEditor, validationRules !== null && validationRules !== void 0 ? validationRules : null, codeMirrorRef); useSynchronizeExternalFragments(queryEditor, externalFragments, codeMirrorRef); - useCompletion(queryEditor, onClickReference || null, useQueryEditor); + useCompletion(queryEditor, onClickReference || null, _useQueryEditor); const run = executionContext == null ? void 0 : executionContext.run; - const runAtCursor = React.useCallback(() => { - var _a; - if (!run || !queryEditor || !queryEditor.operations || !queryEditor.hasFocus()) { - run == null ? void 0 : run(); - return; - } - const cursorIndex = queryEditor.indexFromPos(queryEditor.getCursor()); - let operationName; - for (const operation of queryEditor.operations) { - if (operation.loc && operation.loc.start <= cursorIndex && operation.loc.end >= cursorIndex) { - operationName = (_a = operation.name) == null ? void 0 : _a.value; + let t21; + if ($[33] !== queryEditor || $[34] !== run || $[35] !== setOperationName) { + t21 = () => { + var _a; + if (!run || !queryEditor || !queryEditor.operations || !queryEditor.hasFocus()) { + run == null ? void 0 : run(); + return; } - } - if (operationName && operationName !== queryEditor.operationName) { - setOperationName(operationName); - } - run(); - }, [queryEditor, run, setOperationName]); - useKeyMap(queryEditor, ["Cmd-Enter", "Ctrl-Enter"], runAtCursor); - useKeyMap(queryEditor, ["Shift-Ctrl-C"], copy); - useKeyMap(queryEditor, ["Shift-Ctrl-P", - // Shift-Ctrl-P is hard coded in Firefox for private browsing so adding an alternative to prettify - "Shift-Ctrl-F"], prettify); - useKeyMap(queryEditor, ["Shift-Ctrl-M"], merge); + const cursorIndex = queryEditor.indexFromPos(queryEditor.getCursor()); + let operationName_0; + for (const operation of queryEditor.operations) { + if (operation.loc && operation.loc.start <= cursorIndex && operation.loc.end >= cursorIndex) { + operationName_0 = (_a = operation.name) == null ? void 0 : _a.value; + } + } + if (operationName_0 && operationName_0 !== queryEditor.operationName) { + setOperationName(operationName_0); + } + run(); + }; + $[33] = queryEditor; + $[34] = run; + $[35] = setOperationName; + $[36] = t21; + } else { + t21 = $[36]; + } + const runAtCursor = t21; + let t22; + if ($[37] === Symbol.for("react.memo_cache_sentinel")) { + t22 = ["Cmd-Enter", "Ctrl-Enter"]; + $[37] = t22; + } else { + t22 = $[37]; + } + useKeyMap(queryEditor, t22, runAtCursor); + let t23; + if ($[38] === Symbol.for("react.memo_cache_sentinel")) { + t23 = ["Shift-Ctrl-C"]; + $[38] = t23; + } else { + t23 = $[38]; + } + useKeyMap(queryEditor, t23, copy); + let t24; + if ($[39] === Symbol.for("react.memo_cache_sentinel")) { + t24 = ["Shift-Ctrl-P", "Shift-Ctrl-F"]; + $[39] = t24; + } else { + t24 = $[39]; + } + useKeyMap(queryEditor, t24, prettify); + let t25; + if ($[40] === Symbol.for("react.memo_cache_sentinel")) { + t25 = ["Shift-Ctrl-M"]; + $[40] = t25; + } else { + t25 = $[40]; + } + useKeyMap(queryEditor, t25, merge); return ref; } +function _temp4(editorInstance_1, change) { + var _a; + if (change.origin === "paste") { + const text_0 = change.text.map(normalizeWhitespace); + (_a = change.update) == null ? void 0 : _a.call(change, change.from, change.to, text_0); + } +} +function _temp3(editorInstance, event) { + if (AUTO_COMPLETE_AFTER_KEY.test(event.key)) { + editorInstance.execCommand("autocomplete"); + } +} +function _temp2(text) { + return markdown.render(text); +} +function _temp$1() {} function useSynchronizeSchema(editor, schema, codeMirrorRef) { - React.useEffect(() => { - if (!editor) { - return; - } - const didChange = editor.options.lint.schema !== schema; - editor.state.lint.linterOptions.schema = schema; - editor.options.lint.schema = schema; - editor.options.hintOptions.schema = schema; - editor.options.info.schema = schema; - editor.options.jump.schema = schema; - if (didChange && codeMirrorRef.current) { - codeMirrorRef.current.signal(editor, "change", editor); - } - }, [editor, schema, codeMirrorRef]); + const $ = reactCompilerRuntime.c(5); + let t0; + let t1; + if ($[0] !== codeMirrorRef || $[1] !== editor || $[2] !== schema) { + t0 = () => { + if (!editor) { + return; + } + const didChange = editor.options.lint.schema !== schema; + updateEditorSchema(editor, schema); + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }; + t1 = [editor, schema, codeMirrorRef]; + $[0] = codeMirrorRef; + $[1] = editor; + $[2] = schema; + $[3] = t0; + $[4] = t1; + } else { + t0 = $[3]; + t1 = $[4]; + } + React.useEffect(t0, t1); } function useSynchronizeValidationRules(editor, validationRules, codeMirrorRef) { - React.useEffect(() => { - if (!editor) { - return; - } - const didChange = editor.options.lint.validationRules !== validationRules; - editor.state.lint.linterOptions.validationRules = validationRules; - editor.options.lint.validationRules = validationRules; - if (didChange && codeMirrorRef.current) { - codeMirrorRef.current.signal(editor, "change", editor); - } - }, [editor, validationRules, codeMirrorRef]); + const $ = reactCompilerRuntime.c(5); + let t0; + let t1; + if ($[0] !== codeMirrorRef || $[1] !== editor || $[2] !== validationRules) { + t0 = () => { + if (!editor) { + return; + } + const didChange = editor.options.lint.validationRules !== validationRules; + updateEditorValidationRules(editor, validationRules); + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }; + t1 = [editor, validationRules, codeMirrorRef]; + $[0] = codeMirrorRef; + $[1] = editor; + $[2] = validationRules; + $[3] = t0; + $[4] = t1; + } else { + t0 = $[3]; + t1 = $[4]; + } + React.useEffect(t0, t1); } function useSynchronizeExternalFragments(editor, externalFragments, codeMirrorRef) { - const externalFragmentList = React.useMemo(() => [...externalFragments.values()], [externalFragments]); - React.useEffect(() => { - if (!editor) { - return; - } - const didChange = editor.options.lint.externalFragments !== externalFragmentList; - editor.state.lint.linterOptions.externalFragments = externalFragmentList; - editor.options.lint.externalFragments = externalFragmentList; - editor.options.hintOptions.externalFragments = externalFragmentList; - if (didChange && codeMirrorRef.current) { - codeMirrorRef.current.signal(editor, "change", editor); - } - }, [editor, externalFragmentList, codeMirrorRef]); + const $ = reactCompilerRuntime.c(9); + let t0; + if ($[0] !== externalFragments) { + t0 = externalFragments.values(); + $[0] = externalFragments; + $[1] = t0; + } else { + t0 = $[1]; + } + let t1; + if ($[2] !== t0) { + t1 = [...t0]; + $[2] = t0; + $[3] = t1; + } else { + t1 = $[3]; + } + const externalFragmentList = t1; + let t2; + let t3; + if ($[4] !== codeMirrorRef || $[5] !== editor || $[6] !== externalFragmentList) { + t2 = () => { + if (!editor) { + return; + } + const didChange = editor.options.lint.externalFragments !== externalFragmentList; + updateEditorExternalFragments(editor, externalFragmentList); + if (didChange && codeMirrorRef.current) { + codeMirrorRef.current.signal(editor, "change", editor); + } + }; + t3 = [editor, externalFragmentList, codeMirrorRef]; + $[4] = codeMirrorRef; + $[5] = editor; + $[6] = externalFragmentList; + $[7] = t2; + $[8] = t3; + } else { + t2 = $[7]; + t3 = $[8]; + } + React.useEffect(t2, t3); } const AUTO_COMPLETE_AFTER_KEY = /^[a-zA-Z0-9_@(]$/; const STORAGE_KEY_QUERY = "query"; @@ -72250,325 +81426,606 @@ function clearHeadersFromTabs(storage) { } const DEFAULT_TITLE = ""; const STORAGE_KEY$2 = "tabState"; -function useVariableEditor({ - editorTheme = DEFAULT_EDITOR_THEME, - keyMap = DEFAULT_KEY_MAP, - onClickReference, - onEdit, - readOnly = false -} = {}, caller) { +function importCodeMirrorImports$1() { + return importCodeMirror([Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/variables/hint.js */ "../../codemirror-graphql/esm/variables/hint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/variables/lint.js */ "../../codemirror-graphql/esm/variables/lint.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/variables/mode.js */ "../../codemirror-graphql/esm/variables/mode.js")))]); +} +const _useVariableEditor = useVariableEditor; +function useVariableEditor(t0, caller) { + const $ = reactCompilerRuntime.c(17); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + editorTheme: t2, + keyMap: t3, + onClickReference, + onEdit, + readOnly: t4 + } = t1; + const editorTheme = t2 === void 0 ? DEFAULT_EDITOR_THEME : t2; + const keyMap = t3 === void 0 ? DEFAULT_KEY_MAP : t3; + const readOnly = t4 === void 0 ? false : t4; + const t5 = caller || _useVariableEditor; + let t6; + if ($[2] !== t5) { + t6 = { + nonNull: true, + caller: t5 + }; + $[2] = t5; + $[3] = t6; + } else { + t6 = $[3]; + } const { initialVariables, variableEditor, setVariableEditor - } = useEditorContext({ - nonNull: true, - caller: caller || useVariableEditor - }); + } = useEditorContext(t6); const executionContext = useExecutionContext(); - const merge = useMergeQuery({ - caller: caller || useVariableEditor - }); - const prettify = usePrettifyEditors({ - caller: caller || useVariableEditor - }); + const t7 = caller || _useVariableEditor; + let t8; + if ($[4] !== t7) { + t8 = { + caller: t7 + }; + $[4] = t7; + $[5] = t8; + } else { + t8 = $[5]; + } + const merge = useMergeQuery(t8); + const t9 = caller || _useVariableEditor; + let t10; + if ($[6] !== t9) { + t10 = { + caller: t9 + }; + $[6] = t9; + $[7] = t10; + } else { + t10 = $[7]; + } + const prettify = usePrettifyEditors(t10); const ref = React.useRef(null); const codeMirrorRef = React.useRef(); - React.useEffect(() => { - let isActive = true; - void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./hint.cjs2.js */ "../../graphiql-react/dist/hint.cjs2.js")), Promise.resolve().then(() => __webpack_require__(/*! ./lint.cjs3.js */ "../../graphiql-react/dist/lint.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs2.js */ "../../graphiql-react/dist/mode.cjs2.js"))]).then(CodeMirror => { - if (!isActive) { - return; - } - codeMirrorRef.current = CodeMirror; - const container = ref.current; - if (!container) { - return; - } - const newEditor = CodeMirror(container, { - value: initialVariables, - lineNumbers: true, - tabSize: 2, - mode: "graphql-variables", - theme: editorTheme, - autoCloseBrackets: true, - matchBrackets: true, - showCursorWhenSelecting: true, - readOnly: readOnly ? "nocursor" : false, - foldGutter: true, - lint: { - // @ts-expect-error - variableToType: void 0 - }, - hintOptions: { - closeOnUnfocus: false, - completeSingle: false, - container, - // @ts-expect-error - variableToType: void 0 - }, - gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], - extraKeys: commonKeys - }); - newEditor.addKeyMap({ - "Cmd-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Ctrl-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Alt-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); - }, - "Shift-Space"() { - newEditor.showHint({ - completeSingle: false, - container - }); + let t11; + let t12; + if ($[8] !== editorTheme || $[9] !== initialVariables || $[10] !== readOnly || $[11] !== setVariableEditor) { + t11 = () => { + let isActive; + isActive = true; + importCodeMirrorImports$1().then(CodeMirror => { + if (!isActive) { + return; } - }); - newEditor.on("keyup", (editorInstance, event) => { - const { - code, - key, - shiftKey - } = event; - const isLetter = code.startsWith("Key"); - const isNumber = !shiftKey && code.startsWith("Digit"); - if (isLetter || isNumber || key === "_" || key === '"') { - editorInstance.execCommand("autocomplete"); + codeMirrorRef.current = CodeMirror; + const container = ref.current; + if (!container) { + return; } + const newEditor = CodeMirror(container, { + value: initialVariables, + lineNumbers: true, + tabSize: 2, + mode: "graphql-variables", + theme: editorTheme, + autoCloseBrackets: true, + matchBrackets: true, + showCursorWhenSelecting: true, + readOnly: readOnly ? "nocursor" : false, + foldGutter: true, + lint: { + variableToType: void 0 + }, + hintOptions: { + closeOnUnfocus: false, + completeSingle: false, + container, + variableToType: void 0 + }, + gutters: ["CodeMirror-linenumbers", "CodeMirror-foldgutter"], + extraKeys: commonKeys + }); + newEditor.addKeyMap({ + "Cmd-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Ctrl-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Alt-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + }, + "Shift-Space"() { + newEditor.showHint({ + completeSingle: false, + container + }); + } + }); + newEditor.on("keyup", _temp); + setVariableEditor(newEditor); }); - setVariableEditor(newEditor); - }); - return () => { - isActive = false; + return () => { + isActive = false; + }; }; - }, [editorTheme, initialVariables, readOnly, setVariableEditor]); + t12 = [editorTheme, initialVariables, readOnly, setVariableEditor]; + $[8] = editorTheme; + $[9] = initialVariables; + $[10] = readOnly; + $[11] = setVariableEditor; + $[12] = t11; + $[13] = t12; + } else { + t11 = $[12]; + t12 = $[13]; + } + React.useEffect(t11, t12); useSynchronizeOption(variableEditor, "keyMap", keyMap); - useChangeHandler(variableEditor, onEdit, STORAGE_KEY$1, "variables", useVariableEditor); - useCompletion(variableEditor, onClickReference || null, useVariableEditor); - useKeyMap(variableEditor, ["Cmd-Enter", "Ctrl-Enter"], executionContext == null ? void 0 : executionContext.run); - useKeyMap(variableEditor, ["Shift-Ctrl-P"], prettify); - useKeyMap(variableEditor, ["Shift-Ctrl-M"], merge); + useChangeHandler(variableEditor, onEdit, STORAGE_KEY$1, "variables", _useVariableEditor); + useCompletion(variableEditor, onClickReference || null, _useVariableEditor); + let t13; + if ($[14] === Symbol.for("react.memo_cache_sentinel")) { + t13 = ["Cmd-Enter", "Ctrl-Enter"]; + $[14] = t13; + } else { + t13 = $[14]; + } + useKeyMap(variableEditor, t13, executionContext == null ? void 0 : executionContext.run); + let t14; + if ($[15] === Symbol.for("react.memo_cache_sentinel")) { + t14 = ["Shift-Ctrl-P"]; + $[15] = t14; + } else { + t14 = $[15]; + } + useKeyMap(variableEditor, t14, prettify); + let t15; + if ($[16] === Symbol.for("react.memo_cache_sentinel")) { + t15 = ["Shift-Ctrl-M"]; + $[16] = t15; + } else { + t15 = $[16]; + } + useKeyMap(variableEditor, t15, merge); return ref; } +function _temp(editorInstance, event) { + const { + code, + key, + shiftKey + } = event; + const isLetter = code.startsWith("Key"); + const isNumber = !shiftKey && code.startsWith("Digit"); + if (isLetter || isNumber || key === "_" || key === '"') { + editorInstance.execCommand("autocomplete"); + } +} const STORAGE_KEY$1 = "variables"; const EditorContext = createNullableContext("EditorContext"); function EditorContextProvider(props) { + const $ = reactCompilerRuntime.c(89); const storage = useStorageContext(); const [headerEditor, setHeaderEditor] = React.useState(null); const [queryEditor, setQueryEditor] = React.useState(null); const [responseEditor, setResponseEditor] = React.useState(null); const [variableEditor, setVariableEditor] = React.useState(null); - const [shouldPersistHeaders, setShouldPersistHeadersInternal] = React.useState(() => { - const isStored = (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) !== null; - return props.shouldPersistHeaders !== false && isStored ? (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) === "true" : Boolean(props.shouldPersistHeaders); - }); + let t0; + if ($[0] !== props.shouldPersistHeaders || $[1] !== storage) { + t0 = () => { + const isStored = (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) !== null; + return props.shouldPersistHeaders !== false && isStored ? (storage == null ? void 0 : storage.get(PERSIST_HEADERS_STORAGE_KEY)) === "true" : Boolean(props.shouldPersistHeaders); + }; + $[0] = props.shouldPersistHeaders; + $[1] = storage; + $[2] = t0; + } else { + t0 = $[2]; + } + const [shouldPersistHeaders, setShouldPersistHeadersInternal] = React.useState(t0); useSynchronizeValue(headerEditor, props.headers); useSynchronizeValue(queryEditor, props.query); useSynchronizeValue(responseEditor, props.response); useSynchronizeValue(variableEditor, props.variables); - const storeTabs = useStoreTabs({ - storage, - shouldPersistHeaders - }); - const [initialState] = React.useState(() => { - var _ref13, _props$query, _ref14, _props$variables, _ref15, _props$headers, _props$response, _ref16, _ref17; - const query = (_ref13 = (_props$query = props.query) !== null && _props$query !== void 0 ? _props$query : storage == null ? void 0 : storage.get(STORAGE_KEY_QUERY)) !== null && _ref13 !== void 0 ? _ref13 : null; - const variables = (_ref14 = (_props$variables = props.variables) !== null && _props$variables !== void 0 ? _props$variables : storage == null ? void 0 : storage.get(STORAGE_KEY$1)) !== null && _ref14 !== void 0 ? _ref14 : null; - const headers = (_ref15 = (_props$headers = props.headers) !== null && _props$headers !== void 0 ? _props$headers : storage == null ? void 0 : storage.get(STORAGE_KEY$3)) !== null && _ref15 !== void 0 ? _ref15 : null; - const response = (_props$response = props.response) !== null && _props$response !== void 0 ? _props$response : ""; - const tabState2 = getDefaultTabState({ - query, - variables, - headers, - defaultTabs: props.defaultTabs, - defaultQuery: props.defaultQuery || DEFAULT_QUERY, - defaultHeaders: props.defaultHeaders, + let t1; + if ($[3] !== shouldPersistHeaders || $[4] !== storage) { + t1 = { storage, shouldPersistHeaders - }); - storeTabs(tabState2); - return { - query: (_ref16 = query !== null && query !== void 0 ? query : tabState2.activeTabIndex === 0 ? tabState2.tabs[0].query : null) !== null && _ref16 !== void 0 ? _ref16 : "", - variables: variables !== null && variables !== void 0 ? variables : "", - headers: (_ref17 = headers !== null && headers !== void 0 ? headers : props.defaultHeaders) !== null && _ref17 !== void 0 ? _ref17 : "", - response, - tabState: tabState2 }; - }); - const [tabState, setTabState] = React.useState(initialState.tabState); - const setShouldPersistHeaders = React.useCallback(persist => { - if (persist) { - var _ref18; - storage == null ? void 0 : storage.set(STORAGE_KEY$3, (_ref18 = headerEditor == null ? void 0 : headerEditor.getValue()) !== null && _ref18 !== void 0 ? _ref18 : ""); - const serializedTabs = serializeTabState(tabState, true); - storage == null ? void 0 : storage.set(STORAGE_KEY$2, serializedTabs); - } else { - storage == null ? void 0 : storage.set(STORAGE_KEY$3, ""); - clearHeadersFromTabs(storage); - } - setShouldPersistHeadersInternal(persist); - storage == null ? void 0 : storage.set(PERSIST_HEADERS_STORAGE_KEY, persist.toString()); - }, [storage, tabState, headerEditor]); + $[3] = shouldPersistHeaders; + $[4] = storage; + $[5] = t1; + } else { + t1 = $[5]; + } + const storeTabs = useStoreTabs(t1); + let t2; + if ($[6] !== props.defaultHeaders || $[7] !== props.defaultQuery || $[8] !== props.defaultTabs || $[9] !== props.headers || $[10] !== props.query || $[11] !== props.response || $[12] !== props.variables || $[13] !== shouldPersistHeaders || $[14] !== storage || $[15] !== storeTabs) { + t2 = () => { + var _ref13, _props$query, _ref14, _props$variables, _ref15, _props$headers, _props$response, _ref16, _ref17; + const query = (_ref13 = (_props$query = props.query) !== null && _props$query !== void 0 ? _props$query : storage == null ? void 0 : storage.get(STORAGE_KEY_QUERY)) !== null && _ref13 !== void 0 ? _ref13 : null; + const variables = (_ref14 = (_props$variables = props.variables) !== null && _props$variables !== void 0 ? _props$variables : storage == null ? void 0 : storage.get(STORAGE_KEY$1)) !== null && _ref14 !== void 0 ? _ref14 : null; + const headers = (_ref15 = (_props$headers = props.headers) !== null && _props$headers !== void 0 ? _props$headers : storage == null ? void 0 : storage.get(STORAGE_KEY$3)) !== null && _ref15 !== void 0 ? _ref15 : null; + const response = (_props$response = props.response) !== null && _props$response !== void 0 ? _props$response : ""; + const tabState = getDefaultTabState({ + query, + variables, + headers, + defaultTabs: props.defaultTabs, + defaultQuery: props.defaultQuery || DEFAULT_QUERY, + defaultHeaders: props.defaultHeaders, + storage, + shouldPersistHeaders + }); + storeTabs(tabState); + return { + query: (_ref16 = query !== null && query !== void 0 ? query : tabState.activeTabIndex === 0 ? tabState.tabs[0].query : null) !== null && _ref16 !== void 0 ? _ref16 : "", + variables: variables !== null && variables !== void 0 ? variables : "", + headers: (_ref17 = headers !== null && headers !== void 0 ? headers : props.defaultHeaders) !== null && _ref17 !== void 0 ? _ref17 : "", + response, + tabState + }; + }; + $[6] = props.defaultHeaders; + $[7] = props.defaultQuery; + $[8] = props.defaultTabs; + $[9] = props.headers; + $[10] = props.query; + $[11] = props.response; + $[12] = props.variables; + $[13] = shouldPersistHeaders; + $[14] = storage; + $[15] = storeTabs; + $[16] = t2; + } else { + t2 = $[16]; + } + const [initialState] = React.useState(t2); + const [tabState_0, setTabState] = React.useState(initialState.tabState); + let t3; + if ($[17] !== headerEditor || $[18] !== storage || $[19] !== tabState_0) { + t3 = persist => { + if (persist) { + var _ref18; + storage == null ? void 0 : storage.set(STORAGE_KEY$3, (_ref18 = headerEditor == null ? void 0 : headerEditor.getValue()) !== null && _ref18 !== void 0 ? _ref18 : ""); + const serializedTabs = serializeTabState(tabState_0, true); + storage == null ? void 0 : storage.set(STORAGE_KEY$2, serializedTabs); + } else { + storage == null ? void 0 : storage.set(STORAGE_KEY$3, ""); + clearHeadersFromTabs(storage); + } + setShouldPersistHeadersInternal(persist); + storage == null ? void 0 : storage.set(PERSIST_HEADERS_STORAGE_KEY, persist.toString()); + }; + $[17] = headerEditor; + $[18] = storage; + $[19] = tabState_0; + $[20] = t3; + } else { + t3 = $[20]; + } + const setShouldPersistHeaders = t3; const lastShouldPersistHeadersProp = React.useRef(); - React.useEffect(() => { - const propValue = Boolean(props.shouldPersistHeaders); - if ((lastShouldPersistHeadersProp == null ? void 0 : lastShouldPersistHeadersProp.current) !== propValue) { - setShouldPersistHeaders(propValue); - lastShouldPersistHeadersProp.current = propValue; - } - }, [props.shouldPersistHeaders, setShouldPersistHeaders]); - const synchronizeActiveTabValues = useSynchronizeActiveTabValues({ - queryEditor, - variableEditor, - headerEditor, - responseEditor - }); + let t4; + let t5; + if ($[21] !== props.shouldPersistHeaders || $[22] !== setShouldPersistHeaders) { + t4 = () => { + const propValue = Boolean(props.shouldPersistHeaders); + if ((lastShouldPersistHeadersProp == null ? void 0 : lastShouldPersistHeadersProp.current) !== propValue) { + setShouldPersistHeaders(propValue); + lastShouldPersistHeadersProp.current = propValue; + } + }; + t5 = [props.shouldPersistHeaders, setShouldPersistHeaders]; + $[21] = props.shouldPersistHeaders; + $[22] = setShouldPersistHeaders; + $[23] = t4; + $[24] = t5; + } else { + t4 = $[23]; + t5 = $[24]; + } + React.useEffect(t4, t5); + let t6; + if ($[25] !== headerEditor || $[26] !== queryEditor || $[27] !== responseEditor || $[28] !== variableEditor) { + t6 = { + queryEditor, + variableEditor, + headerEditor, + responseEditor + }; + $[25] = headerEditor; + $[26] = queryEditor; + $[27] = responseEditor; + $[28] = variableEditor; + $[29] = t6; + } else { + t6 = $[29]; + } + const synchronizeActiveTabValues = useSynchronizeActiveTabValues(t6); const { onTabChange, defaultHeaders, defaultQuery, children } = props; - const setEditorValues = useSetEditorValues({ - queryEditor, - variableEditor, - headerEditor, - responseEditor, - defaultHeaders - }); - const addTab = React.useCallback(() => { - setTabState(current => { - const updatedValues = synchronizeActiveTabValues(current); - const updated = { - tabs: [...updatedValues.tabs, createTab({ - headers: defaultHeaders, - query: defaultQuery !== null && defaultQuery !== void 0 ? defaultQuery : DEFAULT_QUERY - })], - activeTabIndex: updatedValues.tabs.length - }; - storeTabs(updated); - setEditorValues(updated.tabs[updated.activeTabIndex]); - onTabChange == null ? void 0 : onTabChange(updated); - return updated; - }); - }, [defaultHeaders, defaultQuery, onTabChange, setEditorValues, storeTabs, synchronizeActiveTabValues]); - const changeTab = React.useCallback(index => { - setTabState(current => { - const updated = { - ...current, - activeTabIndex: index - }; - storeTabs(updated); - setEditorValues(updated.tabs[updated.activeTabIndex]); - onTabChange == null ? void 0 : onTabChange(updated); - return updated; - }); - }, [onTabChange, setEditorValues, storeTabs]); - const moveTab = React.useCallback(newOrder => { - setTabState(current => { - const activeTab = current.tabs[current.activeTabIndex]; - const updated = { - tabs: newOrder, - activeTabIndex: newOrder.indexOf(activeTab) - }; - storeTabs(updated); - setEditorValues(updated.tabs[updated.activeTabIndex]); - onTabChange == null ? void 0 : onTabChange(updated); - return updated; - }); - }, [onTabChange, setEditorValues, storeTabs]); - const closeTab = React.useCallback(index => { - setTabState(current => { - const updated = { - tabs: current.tabs.filter((_tab, i) => index !== i), - activeTabIndex: Math.max(current.activeTabIndex - 1, 0) - }; - storeTabs(updated); - setEditorValues(updated.tabs[updated.activeTabIndex]); - onTabChange == null ? void 0 : onTabChange(updated); - return updated; - }); - }, [onTabChange, setEditorValues, storeTabs]); - const updateActiveTabValues = React.useCallback(partialTab => { - setTabState(current => { - const updated = setPropertiesInActiveTab(current, partialTab); - storeTabs(updated); - onTabChange == null ? void 0 : onTabChange(updated); - return updated; - }); - }, [onTabChange, storeTabs]); + let t7; + if ($[30] !== defaultHeaders || $[31] !== headerEditor || $[32] !== queryEditor || $[33] !== responseEditor || $[34] !== variableEditor) { + t7 = { + queryEditor, + variableEditor, + headerEditor, + responseEditor, + defaultHeaders + }; + $[30] = defaultHeaders; + $[31] = headerEditor; + $[32] = queryEditor; + $[33] = responseEditor; + $[34] = variableEditor; + $[35] = t7; + } else { + t7 = $[35]; + } + const setEditorValues = useSetEditorValues(t7); + let t8; + if ($[36] !== defaultHeaders || $[37] !== defaultQuery || $[38] !== onTabChange || $[39] !== setEditorValues || $[40] !== storeTabs || $[41] !== synchronizeActiveTabValues) { + t8 = () => { + setTabState(current => { + const updatedValues = synchronizeActiveTabValues(current); + const updated = { + tabs: [...updatedValues.tabs, createTab({ + headers: defaultHeaders, + query: defaultQuery !== null && defaultQuery !== void 0 ? defaultQuery : DEFAULT_QUERY + })], + activeTabIndex: updatedValues.tabs.length + }; + storeTabs(updated); + setEditorValues(updated.tabs[updated.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated); + return updated; + }); + }; + $[36] = defaultHeaders; + $[37] = defaultQuery; + $[38] = onTabChange; + $[39] = setEditorValues; + $[40] = storeTabs; + $[41] = synchronizeActiveTabValues; + $[42] = t8; + } else { + t8 = $[42]; + } + const addTab = t8; + let t9; + if ($[43] !== onTabChange || $[44] !== setEditorValues || $[45] !== storeTabs) { + t9 = index => { + setTabState(current_0 => { + const updated_0 = { + ...current_0, + activeTabIndex: index + }; + storeTabs(updated_0); + setEditorValues(updated_0.tabs[updated_0.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated_0); + return updated_0; + }); + }; + $[43] = onTabChange; + $[44] = setEditorValues; + $[45] = storeTabs; + $[46] = t9; + } else { + t9 = $[46]; + } + const changeTab = t9; + let t10; + if ($[47] !== onTabChange || $[48] !== setEditorValues || $[49] !== storeTabs) { + t10 = newOrder => { + setTabState(current_1 => { + const activeTab = current_1.tabs[current_1.activeTabIndex]; + const updated_1 = { + tabs: newOrder, + activeTabIndex: newOrder.indexOf(activeTab) + }; + storeTabs(updated_1); + setEditorValues(updated_1.tabs[updated_1.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated_1); + return updated_1; + }); + }; + $[47] = onTabChange; + $[48] = setEditorValues; + $[49] = storeTabs; + $[50] = t10; + } else { + t10 = $[50]; + } + const moveTab = t10; + let t11; + if ($[51] !== onTabChange || $[52] !== setEditorValues || $[53] !== storeTabs) { + t11 = index_0 => { + setTabState(current_2 => { + const updated_2 = { + tabs: current_2.tabs.filter((_tab, i) => index_0 !== i), + activeTabIndex: Math.max(current_2.activeTabIndex - 1, 0) + }; + storeTabs(updated_2); + setEditorValues(updated_2.tabs[updated_2.activeTabIndex]); + onTabChange == null ? void 0 : onTabChange(updated_2); + return updated_2; + }); + }; + $[51] = onTabChange; + $[52] = setEditorValues; + $[53] = storeTabs; + $[54] = t11; + } else { + t11 = $[54]; + } + const closeTab = t11; + let t12; + if ($[55] !== onTabChange || $[56] !== storeTabs) { + t12 = partialTab => { + setTabState(current_3 => { + const updated_3 = setPropertiesInActiveTab(current_3, partialTab); + storeTabs(updated_3); + onTabChange == null ? void 0 : onTabChange(updated_3); + return updated_3; + }); + }; + $[55] = onTabChange; + $[56] = storeTabs; + $[57] = t12; + } else { + t12 = $[57]; + } + const updateActiveTabValues = t12; const { onEditOperationName } = props; - const setOperationName = React.useCallback(operationName => { - if (!queryEditor) { - return; - } - queryEditor.operationName = operationName; - updateActiveTabValues({ - operationName - }); - onEditOperationName == null ? void 0 : onEditOperationName(operationName); - }, [onEditOperationName, queryEditor, updateActiveTabValues]); - const externalFragments = React.useMemo(() => { - const map = /* @__PURE__ */new Map(); + let t13; + if ($[58] !== onEditOperationName || $[59] !== queryEditor || $[60] !== updateActiveTabValues) { + t13 = operationName => { + if (!queryEditor) { + return; + } + updateQueryEditor(queryEditor, operationName); + updateActiveTabValues({ + operationName + }); + onEditOperationName == null ? void 0 : onEditOperationName(operationName); + }; + $[58] = onEditOperationName; + $[59] = queryEditor; + $[60] = updateActiveTabValues; + $[61] = t13; + } else { + t13 = $[61]; + } + const setOperationName = t13; + let t14; + let map; + if ($[62] !== props.externalFragments) { + map = /* @__PURE__ */new Map(); if (Array.isArray(props.externalFragments)) { for (const fragment of props.externalFragments) { map.set(fragment.name.value, fragment); } - } else if (typeof props.externalFragments === "string") { - graphql.visit(graphql.parse(props.externalFragments, {}), { - FragmentDefinition(fragment) { - map.set(fragment.name.value, fragment); + } else { + if (typeof props.externalFragments === "string") { + graphql.visit(graphql.parse(props.externalFragments, {}), { + FragmentDefinition(fragment_0) { + map.set(fragment_0.name.value, fragment_0); + } + }); + } else { + if (props.externalFragments) { + throw new Error("The `externalFragments` prop must either be a string that contains the fragment definitions in SDL or a list of FragmentDefinitionNode objects."); } - }); - } else if (props.externalFragments) { - throw new Error("The `externalFragments` prop must either be a string that contains the fragment definitions in SDL or a list of FragmentDefinitionNode objects."); + } } - return map; - }, [props.externalFragments]); - const validationRules = React.useMemo(() => props.validationRules || [], [props.validationRules]); - const value = React.useMemo(() => ({ - ...tabState, - addTab, - changeTab, - moveTab, - closeTab, - updateActiveTabValues, - headerEditor, - queryEditor, - responseEditor, - variableEditor, - setHeaderEditor, - setQueryEditor, - setResponseEditor, - setVariableEditor, - setOperationName, - initialQuery: initialState.query, - initialVariables: initialState.variables, - initialHeaders: initialState.headers, - initialResponse: initialState.response, - externalFragments, - validationRules, - shouldPersistHeaders, - setShouldPersistHeaders - }), [tabState, addTab, changeTab, moveTab, closeTab, updateActiveTabValues, headerEditor, queryEditor, responseEditor, variableEditor, setOperationName, initialState, externalFragments, validationRules, shouldPersistHeaders, setShouldPersistHeaders]); - return /* @__PURE__ */jsxRuntime.jsx(EditorContext.Provider, { - value, - children - }); + $[62] = props.externalFragments; + $[63] = map; + } else { + map = $[63]; + } + t14 = map; + const externalFragments = t14; + let t15; + if ($[64] !== props.validationRules) { + t15 = props.validationRules || []; + $[64] = props.validationRules; + $[65] = t15; + } else { + t15 = $[65]; + } + const validationRules = t15; + let t16; + if ($[66] !== addTab || $[67] !== changeTab || $[68] !== closeTab || $[69] !== externalFragments || $[70] !== headerEditor || $[71] !== initialState.headers || $[72] !== initialState.query || $[73] !== initialState.response || $[74] !== initialState.variables || $[75] !== moveTab || $[76] !== queryEditor || $[77] !== responseEditor || $[78] !== setOperationName || $[79] !== setShouldPersistHeaders || $[80] !== shouldPersistHeaders || $[81] !== tabState_0 || $[82] !== updateActiveTabValues || $[83] !== validationRules || $[84] !== variableEditor) { + t16 = { + ...tabState_0, + addTab, + changeTab, + moveTab, + closeTab, + updateActiveTabValues, + headerEditor, + queryEditor, + responseEditor, + variableEditor, + setHeaderEditor, + setQueryEditor, + setResponseEditor, + setVariableEditor, + setOperationName, + initialQuery: initialState.query, + initialVariables: initialState.variables, + initialHeaders: initialState.headers, + initialResponse: initialState.response, + externalFragments, + validationRules, + shouldPersistHeaders, + setShouldPersistHeaders + }; + $[66] = addTab; + $[67] = changeTab; + $[68] = closeTab; + $[69] = externalFragments; + $[70] = headerEditor; + $[71] = initialState.headers; + $[72] = initialState.query; + $[73] = initialState.response; + $[74] = initialState.variables; + $[75] = moveTab; + $[76] = queryEditor; + $[77] = responseEditor; + $[78] = setOperationName; + $[79] = setShouldPersistHeaders; + $[80] = shouldPersistHeaders; + $[81] = tabState_0; + $[82] = updateActiveTabValues; + $[83] = validationRules; + $[84] = variableEditor; + $[85] = t16; + } else { + t16 = $[85]; + } + const value = t16; + let t17; + if ($[86] !== children || $[87] !== value) { + t17 = /* @__PURE__ */jsxRuntime.jsx(EditorContext.Provider, { + value, + children + }); + $[86] = children; + $[87] = value; + $[88] = t17; + } else { + t17 = $[88]; + } + return t17; +} +function updateQueryEditor(queryEditor, operationName) { + queryEditor.operationName = operationName; } const useEditorContext = createContextHook(EditorContext); const PERSIST_HEADERS_STORAGE_KEY = "shouldPersistHeaders"; @@ -72604,73 +82061,177 @@ const DEFAULT_QUERY = `# Welcome to GraphiQL # `; -function HeaderEditor({ - isHidden, - ...hookArgs -}) { +function HeaderEditor(t0) { + const $ = reactCompilerRuntime.c(13); + let hookArgs; + let isHidden; + if ($[0] !== t0) { + ({ + isHidden, + ...hookArgs + } = t0); + $[0] = t0; + $[1] = hookArgs; + $[2] = isHidden; + } else { + hookArgs = $[1]; + isHidden = $[2]; + } + let t1; + if ($[3] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: HeaderEditor + }; + $[3] = t1; + } else { + t1 = $[3]; + } const { headerEditor - } = useEditorContext({ - nonNull: true, - caller: HeaderEditor - }); + } = useEditorContext(t1); const ref = useHeaderEditor(hookArgs, HeaderEditor); - React.useEffect(() => { - if (!isHidden) { - headerEditor == null ? void 0 : headerEditor.refresh(); - } - }, [headerEditor, isHidden]); - return /* @__PURE__ */jsxRuntime.jsx("div", { - className: clsx.clsx("graphiql-editor", isHidden && "hidden"), - ref - }); + let t2; + let t3; + if ($[4] !== headerEditor || $[5] !== isHidden) { + t2 = () => { + if (!isHidden) { + headerEditor == null ? void 0 : headerEditor.refresh(); + } + }; + t3 = [headerEditor, isHidden]; + $[4] = headerEditor; + $[5] = isHidden; + $[6] = t2; + $[7] = t3; + } else { + t2 = $[6]; + t3 = $[7]; + } + React.useEffect(t2, t3); + const t4 = isHidden && "hidden"; + let t5; + if ($[8] !== t4) { + t5 = clsx.clsx("graphiql-editor", t4); + $[8] = t4; + $[9] = t5; + } else { + t5 = $[9]; + } + let t6; + if ($[10] !== ref || $[11] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: t5, + ref + }); + $[10] = ref; + $[11] = t5; + $[12] = t6; + } else { + t6 = $[12]; + } + return t6; } function ImagePreview(props) { var _a; - const [dimensions, setDimensions] = React.useState({ - width: null, - height: null - }); + const $ = reactCompilerRuntime.c(14); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + width: null, + height: null + }; + $[0] = t0; + } else { + t0 = $[0]; + } + const [dimensions, setDimensions] = React.useState(t0); const [mime, setMime] = React.useState(null); const ref = React.useRef(null); const src = (_a = tokenToURL(props.token)) == null ? void 0 : _a.href; - React.useEffect(() => { - if (!ref.current) { - return; - } - if (!src) { - setDimensions({ - width: null, - height: null - }); - setMime(null); - return; - } - fetch(src, { - method: "HEAD" - }).then(response => { - setMime(response.headers.get("Content-Type")); - }).catch(() => { - setMime(null); - }); - }, [src]); - const dims = dimensions.width !== null && dimensions.height !== null ? /* @__PURE__ */jsxRuntime.jsxs("div", { - children: [dimensions.width, "x", dimensions.height, mime === null ? null : " " + mime] - }) : null; - return /* @__PURE__ */jsxRuntime.jsxs("div", { - children: [/* @__PURE__ */jsxRuntime.jsx("img", { - onLoad: () => { - var _ref19, _ref20; - var _a2, _b; + let t1; + let t2; + if ($[1] !== src) { + t1 = () => { + if (!ref.current) { + return; + } + if (!src) { setDimensions({ - width: (_ref19 = (_a2 = ref.current) == null ? void 0 : _a2.naturalWidth) !== null && _ref19 !== void 0 ? _ref19 : null, - height: (_ref20 = (_b = ref.current) == null ? void 0 : _b.naturalHeight) !== null && _ref20 !== void 0 ? _ref20 : null + width: null, + height: null }); - }, + setMime(null); + return; + } + fetch(src, { + method: "HEAD" + }).then(response => { + setMime(response.headers.get("Content-Type")); + }).catch(() => { + setMime(null); + }); + }; + t2 = [src]; + $[1] = src; + $[2] = t1; + $[3] = t2; + } else { + t1 = $[2]; + t2 = $[3]; + } + React.useEffect(t1, t2); + let t3; + if ($[4] !== dimensions.height || $[5] !== dimensions.width || $[6] !== mime) { + t3 = dimensions.width !== null && dimensions.height !== null ? /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [dimensions.width, "x", dimensions.height, mime === null ? null : " " + mime] + }) : null; + $[4] = dimensions.height; + $[5] = dimensions.width; + $[6] = mime; + $[7] = t3; + } else { + t3 = $[7]; + } + const dims = t3; + let t4; + if ($[8] === Symbol.for("react.memo_cache_sentinel")) { + t4 = () => { + var _ref19, _ref20; + var _a2, _b; + setDimensions({ + width: (_ref19 = (_a2 = ref.current) == null ? void 0 : _a2.naturalWidth) !== null && _ref19 !== void 0 ? _ref19 : null, + height: (_ref20 = (_b = ref.current) == null ? void 0 : _b.naturalHeight) !== null && _ref20 !== void 0 ? _ref20 : null + }); + }; + $[8] = t4; + } else { + t4 = $[8]; + } + let t5; + if ($[9] !== src) { + t5 = /* @__PURE__ */jsxRuntime.jsx("img", { + onLoad: t4, ref, src - }), dims] - }); + }); + $[9] = src; + $[10] = t5; + } else { + t5 = $[10]; + } + let t6; + if ($[11] !== dims || $[12] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsxs("div", { + children: [t5, dims] + }); + $[11] = dims; + $[12] = t5; + $[13] = t6; + } else { + t6 = $[13]; + } + return t6; } ImagePreview.shouldRender = function shouldRender(token) { const url = tokenToURL(token); @@ -72694,513 +82255,1050 @@ function isImageURL(url) { return /\.(bmp|gif|jpe?g|png|svg|webp)$/.test(url.pathname); } function QueryEditor(props) { + const $ = reactCompilerRuntime.c(2); const ref = useQueryEditor(props, QueryEditor); - return /* @__PURE__ */jsxRuntime.jsx("div", { - className: "graphiql-editor", - ref + let t0; + if ($[0] !== ref) { + t0 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: "graphiql-editor", + ref + }); + $[0] = ref; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; +} +function importCodeMirrorImports() { + return importCodeMirror([Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/fold/foldgutter.js */ "../../../node_modules/codemirror/addon/fold/foldgutter.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/fold/brace-fold.js */ "../../../node_modules/codemirror/addon/fold/brace-fold.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/dialog/dialog.js */ "../../../node_modules/codemirror/addon/dialog/dialog.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/search.js */ "../../../node_modules/codemirror/addon/search/search.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/searchcursor.js */ "../../../node_modules/codemirror/addon/search/searchcursor.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/addon/search/jump-to-line.js */ "../../../node_modules/codemirror/addon/search/jump-to-line.js"))), // @ts-expect-error + Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror/keymap/sublime.js */ "../../../node_modules/codemirror/keymap/sublime.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/results/mode.js */ "../../codemirror-graphql/esm/results/mode.js"))), Promise.resolve().then(() => _interopRequireWildcard(__webpack_require__(/*! codemirror-graphql/esm/utils/info-addon.js */ "../../codemirror-graphql/esm/utils/info-addon.js")))], { + useCommonAddons: false }); } -function useResponseEditor({ - responseTooltip, - editorTheme = DEFAULT_EDITOR_THEME, - keyMap = DEFAULT_KEY_MAP -} = {}, caller) { +const _useResponseEditor = useResponseEditor; +function useResponseEditor(t0, caller) { + const $ = reactCompilerRuntime.c(19); + let t1; + if ($[0] !== t0) { + t1 = t0 === void 0 ? {} : t0; + $[0] = t0; + $[1] = t1; + } else { + t1 = $[1]; + } + const { + responseTooltip, + editorTheme: t2, + keyMap: t3 + } = t1; + const editorTheme = t2 === void 0 ? DEFAULT_EDITOR_THEME : t2; + const keyMap = t3 === void 0 ? DEFAULT_KEY_MAP : t3; + const t4 = caller || _useResponseEditor; + let t5; + if ($[2] !== t4) { + t5 = { + nonNull: true, + caller: t4 + }; + $[2] = t4; + $[3] = t5; + } else { + t5 = $[3]; + } const { fetchError, validationErrors - } = useSchemaContext({ - nonNull: true, - caller: caller || useResponseEditor - }); + } = useSchemaContext(t5); + const t6 = caller || _useResponseEditor; + let t7; + if ($[4] !== t6) { + t7 = { + nonNull: true, + caller: t6 + }; + $[4] = t6; + $[5] = t7; + } else { + t7 = $[5]; + } const { initialResponse, responseEditor, setResponseEditor - } = useEditorContext({ - nonNull: true, - caller: caller || useResponseEditor - }); + } = useEditorContext(t7); const ref = React.useRef(null); const responseTooltipRef = React.useRef(responseTooltip); - React.useEffect(() => { - responseTooltipRef.current = responseTooltip; - }, [responseTooltip]); - React.useEffect(() => { - let isActive = true; - void importCodeMirror([Promise.resolve().then(() => __webpack_require__(/*! ./foldgutter.cjs.js */ "../../graphiql-react/dist/foldgutter.cjs.js")).then(n => n.foldgutter), Promise.resolve().then(() => __webpack_require__(/*! ./brace-fold.cjs.js */ "../../graphiql-react/dist/brace-fold.cjs.js")).then(n => n.braceFold), Promise.resolve().then(() => __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js")).then(n => n.dialog), Promise.resolve().then(() => __webpack_require__(/*! ./search.cjs.js */ "../../graphiql-react/dist/search.cjs.js")).then(n => n.search), Promise.resolve().then(() => __webpack_require__(/*! ./searchcursor.cjs.js */ "../../graphiql-react/dist/searchcursor.cjs.js")).then(n => n.searchcursor), Promise.resolve().then(() => __webpack_require__(/*! ./jump-to-line.cjs.js */ "../../graphiql-react/dist/jump-to-line.cjs.js")).then(n => n.jumpToLine), - // @ts-expect-error - Promise.resolve().then(() => __webpack_require__(/*! ./sublime.cjs.js */ "../../graphiql-react/dist/sublime.cjs.js")).then(n => n.sublime), Promise.resolve().then(() => __webpack_require__(/*! ./mode.cjs3.js */ "../../graphiql-react/dist/mode.cjs3.js")), Promise.resolve().then(() => __webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"))], { - useCommonAddons: false - }).then(CodeMirror => { - if (!isActive) { - return; - } - const tooltipDiv = document.createElement("div"); - CodeMirror.registerHelper("info", "graphql-results", (token, _options, _cm, pos) => { - const infoElements = []; - const ResponseTooltipComponent = responseTooltipRef.current; - if (ResponseTooltipComponent) { - infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ResponseTooltipComponent, { - pos, - token - })); - } - if (ImagePreview.shouldRender(token)) { - infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ImagePreview, { - token - }, "image-preview")); - } - if (!infoElements.length) { - ReactDOM.unmountComponentAtNode(tooltipDiv); - return null; - } - ReactDOM.render(infoElements, tooltipDiv); - return tooltipDiv; - }); - const container = ref.current; - if (!container) { - return; - } - const newEditor = CodeMirror(container, { - value: initialResponse, - lineWrapping: true, - readOnly: true, - theme: editorTheme, - mode: "graphql-results", - foldGutter: true, - gutters: ["CodeMirror-foldgutter"], - // @ts-expect-error - info: true, - extraKeys: commonKeys - }); - setResponseEditor(newEditor); - }); - return () => { - isActive = false; + let t8; + let t9; + if ($[6] !== responseTooltip) { + t8 = () => { + responseTooltipRef.current = responseTooltip; }; - }, [editorTheme, initialResponse, setResponseEditor]); + t9 = [responseTooltip]; + $[6] = responseTooltip; + $[7] = t8; + $[8] = t9; + } else { + t8 = $[7]; + t9 = $[8]; + } + React.useEffect(t8, t9); + let t10; + let t11; + if ($[9] !== editorTheme || $[10] !== initialResponse || $[11] !== setResponseEditor) { + t10 = () => { + let isActive; + isActive = true; + importCodeMirrorImports().then(CodeMirror => { + if (!isActive) { + return; + } + const tooltipDiv = document.createElement("div"); + CodeMirror.registerHelper("info", "graphql-results", (token, _options, _cm, pos) => { + const infoElements = []; + const ResponseTooltipComponent = responseTooltipRef.current; + if (ResponseTooltipComponent) { + infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ResponseTooltipComponent, { + pos, + token + })); + } + if (ImagePreview.shouldRender(token)) { + infoElements.push( /* @__PURE__ */jsxRuntime.jsx(ImagePreview, { + token + }, "image-preview")); + } + if (!infoElements.length) { + ReactDOM.unmountComponentAtNode(tooltipDiv); + return null; + } + ReactDOM.render(infoElements, tooltipDiv); + return tooltipDiv; + }); + const container = ref.current; + if (!container) { + return; + } + const newEditor = CodeMirror(container, { + value: initialResponse, + lineWrapping: true, + readOnly: true, + theme: editorTheme, + mode: "graphql-results", + foldGutter: true, + gutters: ["CodeMirror-foldgutter"], + info: true, + extraKeys: commonKeys + }); + setResponseEditor(newEditor); + }); + return () => { + isActive = false; + }; + }; + t11 = [editorTheme, initialResponse, setResponseEditor]; + $[9] = editorTheme; + $[10] = initialResponse; + $[11] = setResponseEditor; + $[12] = t10; + $[13] = t11; + } else { + t10 = $[12]; + t11 = $[13]; + } + React.useEffect(t10, t11); useSynchronizeOption(responseEditor, "keyMap", keyMap); - React.useEffect(() => { - if (fetchError) { - responseEditor == null ? void 0 : responseEditor.setValue(fetchError); - } - if (validationErrors.length > 0) { - responseEditor == null ? void 0 : responseEditor.setValue(toolkit.formatError(validationErrors)); - } - }, [responseEditor, fetchError, validationErrors]); + let t12; + let t13; + if ($[14] !== fetchError || $[15] !== responseEditor || $[16] !== validationErrors) { + t12 = () => { + if (fetchError) { + responseEditor == null ? void 0 : responseEditor.setValue(fetchError); + } + if (validationErrors.length > 0) { + responseEditor == null ? void 0 : responseEditor.setValue(toolkit.formatError(validationErrors)); + } + }; + t13 = [responseEditor, fetchError, validationErrors]; + $[14] = fetchError; + $[15] = responseEditor; + $[16] = validationErrors; + $[17] = t12; + $[18] = t13; + } else { + t12 = $[17]; + t13 = $[18]; + } + React.useEffect(t12, t13); return ref; } function ResponseEditor(props) { + const $ = reactCompilerRuntime.c(2); const ref = useResponseEditor(props, ResponseEditor); - return /* @__PURE__ */jsxRuntime.jsx("section", { - className: "result-window", - "aria-label": "Result Window", - "aria-live": "polite", - "aria-atomic": "true", - ref - }); + let t0; + if ($[0] !== ref) { + t0 = /* @__PURE__ */jsxRuntime.jsx("section", { + className: "result-window", + "aria-label": "Result Window", + "aria-live": "polite", + "aria-atomic": "true", + ref + }); + $[0] = ref; + $[1] = t0; + } else { + t0 = $[1]; + } + return t0; } -function VariableEditor({ - isHidden, - ...hookArgs -}) { +function VariableEditor(t0) { + const $ = reactCompilerRuntime.c(13); + let hookArgs; + let isHidden; + if ($[0] !== t0) { + ({ + isHidden, + ...hookArgs + } = t0); + $[0] = t0; + $[1] = hookArgs; + $[2] = isHidden; + } else { + hookArgs = $[1]; + isHidden = $[2]; + } + let t1; + if ($[3] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: VariableEditor + }; + $[3] = t1; + } else { + t1 = $[3]; + } const { variableEditor - } = useEditorContext({ - nonNull: true, - caller: VariableEditor - }); + } = useEditorContext(t1); const ref = useVariableEditor(hookArgs, VariableEditor); - React.useEffect(() => { - if (variableEditor && !isHidden) { - variableEditor.refresh(); - } - }, [variableEditor, isHidden]); - return /* @__PURE__ */jsxRuntime.jsx("div", { - className: clsx.clsx("graphiql-editor", isHidden && "hidden"), - ref - }); + let t2; + let t3; + if ($[4] !== isHidden || $[5] !== variableEditor) { + t2 = () => { + if (variableEditor && !isHidden) { + variableEditor.refresh(); + } + }; + t3 = [variableEditor, isHidden]; + $[4] = isHidden; + $[5] = variableEditor; + $[6] = t2; + $[7] = t3; + } else { + t2 = $[6]; + t3 = $[7]; + } + React.useEffect(t2, t3); + const t4 = isHidden && "hidden"; + let t5; + if ($[8] !== t4) { + t5 = clsx.clsx("graphiql-editor", t4); + $[8] = t4; + $[9] = t5; + } else { + t5 = $[9]; + } + let t6; + if ($[10] !== ref || $[11] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsx("div", { + className: t5, + ref + }); + $[10] = ref; + $[11] = t5; + $[12] = t6; + } else { + t6 = $[12]; + } + return t6; } -function GraphiQLProvider({ - children, - dangerouslyAssumeSchemaIsValid, - defaultQuery, - defaultHeaders, - defaultTabs, - externalFragments, - fetcher, - getDefaultFieldNames, - headers, - inputValueDeprecation, - introspectionQueryName, - maxHistoryLength, - onEditOperationName, - onSchemaChange, - onTabChange, - onTogglePluginVisibility, - operationName, - plugins, - query, - response, - schema, - schemaDescription, - shouldPersistHeaders, - storage, - validationRules, - variables, - visiblePlugin -}) { - return /* @__PURE__ */jsxRuntime.jsx(StorageContextProvider, { +function GraphiQLProvider(t0) { + const $ = reactCompilerRuntime.c(39); + const { + children, + dangerouslyAssumeSchemaIsValid, + defaultQuery, + defaultHeaders, + defaultTabs, + externalFragments, + fetcher, + getDefaultFieldNames, + headers, + inputValueDeprecation, + introspectionQueryName, + maxHistoryLength, + onEditOperationName, + onSchemaChange, + onTabChange, + onTogglePluginVisibility, + operationName, + plugins, + query, + response, + schema, + schemaDescription, + shouldPersistHeaders, storage, - children: /* @__PURE__ */jsxRuntime.jsx(HistoryContextProvider, { - maxHistoryLength, - children: /* @__PURE__ */jsxRuntime.jsx(EditorContextProvider, { - defaultQuery, - defaultHeaders, - defaultTabs, - externalFragments, - headers, - onEditOperationName, - onTabChange, - query, - response, - shouldPersistHeaders, - validationRules, - variables, - children: /* @__PURE__ */jsxRuntime.jsx(SchemaContextProvider, { - dangerouslyAssumeSchemaIsValid, - fetcher, - inputValueDeprecation, - introspectionQueryName, - onSchemaChange, - schema, - schemaDescription, - children: /* @__PURE__ */jsxRuntime.jsx(ExecutionContextProvider, { - getDefaultFieldNames, - fetcher, - operationName, - children: /* @__PURE__ */jsxRuntime.jsx(ExplorerContextProvider, { - children: /* @__PURE__ */jsxRuntime.jsx(PluginContextProvider, { - onTogglePluginVisibility, - plugins, - visiblePlugin, - children - }) - }) - }) - }) + validationRules, + variables, + visiblePlugin + } = t0; + let t1; + if ($[0] !== children || $[1] !== onTogglePluginVisibility || $[2] !== plugins || $[3] !== visiblePlugin) { + t1 = /* @__PURE__ */jsxRuntime.jsx(ExplorerContextProvider, { + children: /* @__PURE__ */jsxRuntime.jsx(PluginContextProvider, { + onTogglePluginVisibility, + plugins, + visiblePlugin, + children }) - }) - }); + }); + $[0] = children; + $[1] = onTogglePluginVisibility; + $[2] = plugins; + $[3] = visiblePlugin; + $[4] = t1; + } else { + t1 = $[4]; + } + let t2; + if ($[5] !== fetcher || $[6] !== getDefaultFieldNames || $[7] !== operationName || $[8] !== t1) { + t2 = /* @__PURE__ */jsxRuntime.jsx(ExecutionContextProvider, { + getDefaultFieldNames, + fetcher, + operationName, + children: t1 + }); + $[5] = fetcher; + $[6] = getDefaultFieldNames; + $[7] = operationName; + $[8] = t1; + $[9] = t2; + } else { + t2 = $[9]; + } + let t3; + if ($[10] !== dangerouslyAssumeSchemaIsValid || $[11] !== fetcher || $[12] !== inputValueDeprecation || $[13] !== introspectionQueryName || $[14] !== onSchemaChange || $[15] !== schema || $[16] !== schemaDescription || $[17] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsx(SchemaContextProvider, { + dangerouslyAssumeSchemaIsValid, + fetcher, + inputValueDeprecation, + introspectionQueryName, + onSchemaChange, + schema, + schemaDescription, + children: t2 + }); + $[10] = dangerouslyAssumeSchemaIsValid; + $[11] = fetcher; + $[12] = inputValueDeprecation; + $[13] = introspectionQueryName; + $[14] = onSchemaChange; + $[15] = schema; + $[16] = schemaDescription; + $[17] = t2; + $[18] = t3; + } else { + t3 = $[18]; + } + let t4; + if ($[19] !== defaultHeaders || $[20] !== defaultQuery || $[21] !== defaultTabs || $[22] !== externalFragments || $[23] !== headers || $[24] !== onEditOperationName || $[25] !== onTabChange || $[26] !== query || $[27] !== response || $[28] !== shouldPersistHeaders || $[29] !== t3 || $[30] !== validationRules || $[31] !== variables) { + t4 = /* @__PURE__ */jsxRuntime.jsx(EditorContextProvider, { + defaultQuery, + defaultHeaders, + defaultTabs, + externalFragments, + headers, + onEditOperationName, + onTabChange, + query, + response, + shouldPersistHeaders, + validationRules, + variables, + children: t3 + }); + $[19] = defaultHeaders; + $[20] = defaultQuery; + $[21] = defaultTabs; + $[22] = externalFragments; + $[23] = headers; + $[24] = onEditOperationName; + $[25] = onTabChange; + $[26] = query; + $[27] = response; + $[28] = shouldPersistHeaders; + $[29] = t3; + $[30] = validationRules; + $[31] = variables; + $[32] = t4; + } else { + t4 = $[32]; + } + let t5; + if ($[33] !== maxHistoryLength || $[34] !== t4) { + t5 = /* @__PURE__ */jsxRuntime.jsx(HistoryContextProvider, { + maxHistoryLength, + children: t4 + }); + $[33] = maxHistoryLength; + $[34] = t4; + $[35] = t5; + } else { + t5 = $[35]; + } + let t6; + if ($[36] !== storage || $[37] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsx(StorageContextProvider, { + storage, + children: t5 + }); + $[36] = storage; + $[37] = t5; + $[38] = t6; + } else { + t6 = $[38]; + } + return t6; } -function useTheme(defaultTheme = null) { +function useTheme(t0) { + const $ = reactCompilerRuntime.c(11); + const defaultTheme = t0 === void 0 ? null : t0; const storageContext = useStorageContext(); - const [theme, setThemeInternal] = React.useState(() => { - if (!storageContext) { - return null; - } - const stored = storageContext.get(STORAGE_KEY); - switch (stored) { - case "light": - return "light"; - case "dark": - return "dark"; - default: - if (typeof stored === "string") { - storageContext.set(STORAGE_KEY, ""); - } - return defaultTheme; - } - }); - React.useLayoutEffect(() => { - if (typeof window === "undefined") { - return; - } - document.body.classList.remove("graphiql-light", "graphiql-dark"); - if (theme) { - document.body.classList.add(`graphiql-${theme}`); - } - }, [theme]); - const setTheme = React.useCallback(newTheme => { - storageContext == null ? void 0 : storageContext.set(STORAGE_KEY, newTheme || ""); - setThemeInternal(newTheme); - }, [storageContext]); - return React.useMemo(() => ({ - theme, - setTheme - }), [theme, setTheme]); + let t1; + if ($[0] !== defaultTheme || $[1] !== storageContext) { + t1 = () => { + if (!storageContext) { + return null; + } + const stored = storageContext.get(STORAGE_KEY); + switch (stored) { + case "light": + { + return "light"; + } + case "dark": + { + return "dark"; + } + default: + { + if (typeof stored === "string") { + storageContext.set(STORAGE_KEY, ""); + } + return defaultTheme; + } + } + }; + $[0] = defaultTheme; + $[1] = storageContext; + $[2] = t1; + } else { + t1 = $[2]; + } + const [theme, setThemeInternal] = React.useState(t1); + let t2; + let t3; + if ($[3] !== theme) { + t2 = () => { + if (typeof window === "undefined") { + return; + } + document.body.classList.remove("graphiql-light", "graphiql-dark"); + if (theme) { + document.body.classList.add(`graphiql-${theme}`); + } + }; + t3 = [theme]; + $[3] = theme; + $[4] = t2; + $[5] = t3; + } else { + t2 = $[4]; + t3 = $[5]; + } + React.useLayoutEffect(t2, t3); + let t4; + if ($[6] !== storageContext) { + t4 = newTheme => { + storageContext == null ? void 0 : storageContext.set(STORAGE_KEY, newTheme || ""); + setThemeInternal(newTheme); + }; + $[6] = storageContext; + $[7] = t4; + } else { + t4 = $[7]; + } + const setTheme = t4; + let t5; + if ($[8] !== setTheme || $[9] !== theme) { + t5 = { + theme, + setTheme + }; + $[8] = setTheme; + $[9] = theme; + $[10] = t5; + } else { + t5 = $[10]; + } + return t5; } const STORAGE_KEY = "theme"; -function useDragResize({ - defaultSizeRelation = DEFAULT_FLEX, - direction, - initiallyHidden, - onHiddenElementChange, - sizeThresholdFirst = 100, - sizeThresholdSecond = 100, - storageKey -}) { +function useDragResize(t0) { + const $ = reactCompilerRuntime.c(31); + const { + defaultSizeRelation: t1, + direction, + initiallyHidden, + onHiddenElementChange, + sizeThresholdFirst: t2, + sizeThresholdSecond: t3, + storageKey + } = t0; + const defaultSizeRelation = t1 === void 0 ? DEFAULT_FLEX : t1; + const sizeThresholdFirst = t2 === void 0 ? 100 : t2; + const sizeThresholdSecond = t3 === void 0 ? 100 : t3; const storage = useStorageContext(); - const store = React.useMemo(() => debounce(500, value => { - if (storageKey) { - storage == null ? void 0 : storage.set(storageKey, value); - } - }), [storage, storageKey]); - const [hiddenElement, setHiddenElement] = React.useState(() => { - const storedValue = storageKey && (storage == null ? void 0 : storage.get(storageKey)); - if (storedValue === HIDE_FIRST || initiallyHidden === "first") { - return "first"; - } - if (storedValue === HIDE_SECOND || initiallyHidden === "second") { - return "second"; - } - return null; - }); - const setHiddenElementWithCallback = React.useCallback(element => { - if (element !== hiddenElement) { - setHiddenElement(element); - onHiddenElementChange == null ? void 0 : onHiddenElementChange(element); - } - }, [hiddenElement, onHiddenElementChange]); + let t4; + if ($[0] !== storage || $[1] !== storageKey) { + t4 = debounce(500, value => { + if (storageKey) { + storage == null ? void 0 : storage.set(storageKey, value); + } + }); + $[0] = storage; + $[1] = storageKey; + $[2] = t4; + } else { + t4 = $[2]; + } + const store = t4; + let t5; + if ($[3] !== initiallyHidden || $[4] !== storage || $[5] !== storageKey) { + t5 = () => { + const storedValue = storageKey && (storage == null ? void 0 : storage.get(storageKey)); + if (storedValue === HIDE_FIRST || initiallyHidden === "first") { + return "first"; + } + if (storedValue === HIDE_SECOND || initiallyHidden === "second") { + return "second"; + } + return null; + }; + $[3] = initiallyHidden; + $[4] = storage; + $[5] = storageKey; + $[6] = t5; + } else { + t5 = $[6]; + } + const [hiddenElement, setHiddenElement] = React.useState(t5); + let t6; + if ($[7] !== hiddenElement || $[8] !== onHiddenElementChange) { + t6 = element => { + if (element !== hiddenElement) { + setHiddenElement(element); + onHiddenElementChange == null ? void 0 : onHiddenElementChange(element); + } + }; + $[7] = hiddenElement; + $[8] = onHiddenElementChange; + $[9] = t6; + } else { + t6 = $[9]; + } + const setHiddenElementWithCallback = t6; const firstRef = React.useRef(null); const dragBarRef = React.useRef(null); const secondRef = React.useRef(null); const defaultFlexRef = React.useRef(`${defaultSizeRelation}`); - React.useLayoutEffect(() => { - const storedValue = storageKey && (storage == null ? void 0 : storage.get(storageKey)) || defaultFlexRef.current; - if (firstRef.current) { - firstRef.current.style.display = "flex"; - firstRef.current.style.flex = storedValue === HIDE_FIRST || storedValue === HIDE_SECOND ? defaultFlexRef.current : storedValue; - } - if (secondRef.current) { - secondRef.current.style.display = "flex"; - secondRef.current.style.flex = "1"; - } - if (dragBarRef.current) { - dragBarRef.current.style.display = "flex"; - } - }, [direction, storage, storageKey]); - const hide = React.useCallback(resizableElement => { - const element = resizableElement === "first" ? firstRef.current : secondRef.current; - if (!element) { - return; - } - element.style.left = "-1000px"; - element.style.position = "absolute"; - element.style.opacity = "0"; - element.style.height = "500px"; - element.style.width = "500px"; - if (firstRef.current) { - const flex = parseFloat(firstRef.current.style.flex); - if (!Number.isFinite(flex) || flex < 1) { - firstRef.current.style.flex = "1"; - } - } - }, []); - const show = React.useCallback(resizableElement => { - const element = resizableElement === "first" ? firstRef.current : secondRef.current; - if (!element) { - return; - } - element.style.width = ""; - element.style.height = ""; - element.style.opacity = ""; - element.style.position = ""; - element.style.left = ""; - if (storage && storageKey) { - const storedValue = storage.get(storageKey); - if (firstRef.current && storedValue !== HIDE_FIRST && storedValue !== HIDE_SECOND) { - firstRef.current.style.flex = storedValue || defaultFlexRef.current; - } - } - }, [storage, storageKey]); - React.useLayoutEffect(() => { - if (hiddenElement === "first") { - hide("first"); - } else { - show("first"); - } - if (hiddenElement === "second") { - hide("second"); - } else { - show("second"); - } - }, [hiddenElement, hide, show]); - React.useEffect(() => { - if (!dragBarRef.current || !firstRef.current || !secondRef.current) { - return; - } - const dragBarContainer = dragBarRef.current; - const firstContainer = firstRef.current; - const wrapper = firstContainer.parentElement; - const eventProperty = direction === "horizontal" ? "clientX" : "clientY"; - const rectProperty = direction === "horizontal" ? "left" : "top"; - const adjacentRectProperty = direction === "horizontal" ? "right" : "bottom"; - const sizeProperty = direction === "horizontal" ? "clientWidth" : "clientHeight"; - function handleMouseDown(downEvent) { - downEvent.preventDefault(); - const offset = downEvent[eventProperty] - dragBarContainer.getBoundingClientRect()[rectProperty]; - function handleMouseMove(moveEvent) { - if (moveEvent.buttons === 0) { - return handleMouseUp(); - } - const firstSize = moveEvent[eventProperty] - wrapper.getBoundingClientRect()[rectProperty] - offset; - const secondSize = wrapper.getBoundingClientRect()[adjacentRectProperty] - moveEvent[eventProperty] + offset - dragBarContainer[sizeProperty]; - if (firstSize < sizeThresholdFirst) { - setHiddenElementWithCallback("first"); - store(HIDE_FIRST); - } else if (secondSize < sizeThresholdSecond) { - setHiddenElementWithCallback("second"); - store(HIDE_SECOND); - } else { - setHiddenElementWithCallback(null); - const newFlex = `${firstSize / secondSize}`; - firstContainer.style.flex = newFlex; - store(newFlex); - } - } - function handleMouseUp() { - document.removeEventListener("mousemove", handleMouseMove); - document.removeEventListener("mouseup", handleMouseUp); - } - document.addEventListener("mousemove", handleMouseMove); - document.addEventListener("mouseup", handleMouseUp); - } - dragBarContainer.addEventListener("mousedown", handleMouseDown); - function reset() { + let t7; + if ($[10] !== storage || $[11] !== storageKey) { + t7 = () => { + const storedValue_0 = storageKey && (storage == null ? void 0 : storage.get(storageKey)) || defaultFlexRef.current; if (firstRef.current) { - firstRef.current.style.flex = defaultFlexRef.current; + firstRef.current.style.display = "flex"; + firstRef.current.style.flex = storedValue_0 === HIDE_FIRST || storedValue_0 === HIDE_SECOND ? defaultFlexRef.current : storedValue_0; + } + if (secondRef.current) { + secondRef.current.style.display = "flex"; + secondRef.current.style.flex = "1"; + } + if (dragBarRef.current) { + dragBarRef.current.style.display = "flex"; } - store(defaultFlexRef.current); - setHiddenElementWithCallback(null); - } - dragBarContainer.addEventListener("dblclick", reset); - return () => { - dragBarContainer.removeEventListener("mousedown", handleMouseDown); - dragBarContainer.removeEventListener("dblclick", reset); }; - }, [direction, setHiddenElementWithCallback, sizeThresholdFirst, sizeThresholdSecond, store]); - return React.useMemo(() => ({ - dragBarRef, - hiddenElement, - firstRef, - setHiddenElement, - secondRef - }), [hiddenElement, setHiddenElement]); + $[10] = storage; + $[11] = storageKey; + $[12] = t7; + } else { + t7 = $[12]; + } + let t8; + if ($[13] !== direction || $[14] !== storage || $[15] !== storageKey) { + t8 = [direction, storage, storageKey]; + $[13] = direction; + $[14] = storage; + $[15] = storageKey; + $[16] = t8; + } else { + t8 = $[16]; + } + React.useLayoutEffect(t7, t8); + let t10; + let t9; + if ($[17] !== hiddenElement || $[18] !== storage || $[19] !== storageKey) { + t9 = () => { + const hide = resizableElement => { + const element_0 = resizableElement === "first" ? firstRef.current : secondRef.current; + if (!element_0) { + return; + } + element_0.style.left = "-1000px"; + element_0.style.position = "absolute"; + element_0.style.opacity = "0"; + element_0.style.height = "500px"; + element_0.style.width = "500px"; + if (firstRef.current) { + const flex = parseFloat(firstRef.current.style.flex); + if (!Number.isFinite(flex) || flex < 1) { + firstRef.current.style.flex = "1"; + } + } + }; + const show = resizableElement_0 => { + const element_1 = resizableElement_0 === "first" ? firstRef.current : secondRef.current; + if (!element_1) { + return; + } + element_1.style.width = ""; + element_1.style.height = ""; + element_1.style.opacity = ""; + element_1.style.position = ""; + element_1.style.left = ""; + if (storage && storageKey) { + const storedValue_1 = storage.get(storageKey); + if (firstRef.current && storedValue_1 !== HIDE_FIRST && storedValue_1 !== HIDE_SECOND) { + firstRef.current.style.flex = storedValue_1 || defaultFlexRef.current; + } + } + }; + if (hiddenElement === "first") { + hide("first"); + } else { + show("first"); + } + if (hiddenElement === "second") { + hide("second"); + } else { + show("second"); + } + }; + t10 = [hiddenElement, storage, storageKey]; + $[17] = hiddenElement; + $[18] = storage; + $[19] = storageKey; + $[20] = t10; + $[21] = t9; + } else { + t10 = $[20]; + t9 = $[21]; + } + React.useLayoutEffect(t9, t10); + let t11; + let t12; + if ($[22] !== direction || $[23] !== setHiddenElementWithCallback || $[24] !== sizeThresholdFirst || $[25] !== sizeThresholdSecond || $[26] !== store) { + t11 = () => { + if (!dragBarRef.current || !firstRef.current || !secondRef.current) { + return; + } + const dragBarContainer = dragBarRef.current; + const firstContainer = firstRef.current; + const wrapper = firstContainer.parentElement; + const eventProperty = direction === "horizontal" ? "clientX" : "clientY"; + const rectProperty = direction === "horizontal" ? "left" : "top"; + const adjacentRectProperty = direction === "horizontal" ? "right" : "bottom"; + const sizeProperty = direction === "horizontal" ? "clientWidth" : "clientHeight"; + const handleMouseDown = function handleMouseDown2(downEvent) { + downEvent.preventDefault(); + const offset = downEvent[eventProperty] - dragBarContainer.getBoundingClientRect()[rectProperty]; + const handleMouseMove = function handleMouseMove2(moveEvent) { + if (moveEvent.buttons === 0) { + return handleMouseUp(); + } + const firstSize = moveEvent[eventProperty] - wrapper.getBoundingClientRect()[rectProperty] - offset; + const secondSize = wrapper.getBoundingClientRect()[adjacentRectProperty] - moveEvent[eventProperty] + offset - dragBarContainer[sizeProperty]; + if (firstSize < sizeThresholdFirst) { + setHiddenElementWithCallback("first"); + store(HIDE_FIRST); + } else { + if (secondSize < sizeThresholdSecond) { + setHiddenElementWithCallback("second"); + store(HIDE_SECOND); + } else { + setHiddenElementWithCallback(null); + const newFlex = `${firstSize / secondSize}`; + firstContainer.style.flex = newFlex; + store(newFlex); + } + } + }; + function handleMouseUp() { + document.removeEventListener("mousemove", handleMouseMove); + document.removeEventListener("mouseup", handleMouseUp); + } + document.addEventListener("mousemove", handleMouseMove); + document.addEventListener("mouseup", handleMouseUp); + }; + dragBarContainer.addEventListener("mousedown", handleMouseDown); + const reset = function reset2() { + if (firstRef.current) { + firstRef.current.style.flex = defaultFlexRef.current; + } + store(defaultFlexRef.current); + setHiddenElementWithCallback(null); + }; + dragBarContainer.addEventListener("dblclick", reset); + return () => { + dragBarContainer.removeEventListener("mousedown", handleMouseDown); + dragBarContainer.removeEventListener("dblclick", reset); + }; + }; + t12 = [direction, setHiddenElementWithCallback, sizeThresholdFirst, sizeThresholdSecond, store]; + $[22] = direction; + $[23] = setHiddenElementWithCallback; + $[24] = sizeThresholdFirst; + $[25] = sizeThresholdSecond; + $[26] = store; + $[27] = t11; + $[28] = t12; + } else { + t11 = $[27]; + t12 = $[28]; + } + React.useEffect(t11, t12); + let t13; + if ($[29] !== hiddenElement) { + t13 = { + dragBarRef, + hiddenElement, + firstRef, + setHiddenElement, + secondRef + }; + $[29] = hiddenElement; + $[30] = t13; + } else { + t13 = $[30]; + } + return t13; } const DEFAULT_FLEX = 1; const HIDE_FIRST = "hide-first"; const HIDE_SECOND = "hide-second"; -const ToolbarButton = React.forwardRef(({ - label, - onClick, - ...props -}, ref) => { +const ToolbarButton = React.forwardRef((t0, ref) => { + const $ = reactCompilerRuntime.c(19); + let label; + let onClick; + let props; + if ($[0] !== t0) { + ({ + label, + onClick, + ...props + } = t0); + $[0] = t0; + $[1] = label; + $[2] = onClick; + $[3] = props; + } else { + label = $[1]; + onClick = $[2]; + props = $[3]; + } const [error, setError] = React.useState(null); - const handleClick = React.useCallback(event => { - try { - onClick == null ? void 0 : onClick(event); - setError(null); - } catch (err) { - setError(err instanceof Error ? err : new Error(`Toolbar button click failed: ${err}`)); - } - }, [onClick]); - return /* @__PURE__ */jsxRuntime.jsx(Tooltip, { - label, - children: /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { + let t1; + if ($[4] !== onClick) { + t1 = event => { + try { + if (onClick) { + onClick(event); + } + setError(null); + } catch (t22) { + const err = t22; + setError(err instanceof Error ? err : new Error(`Toolbar button click failed: ${err}`)); + } + }; + $[4] = onClick; + $[5] = t1; + } else { + t1 = $[5]; + } + const handleClick = t1; + const t2 = error && "error"; + let t3; + if ($[6] !== props.className || $[7] !== t2) { + t3 = clsx.clsx("graphiql-toolbar-button", t2, props.className); + $[6] = props.className; + $[7] = t2; + $[8] = t3; + } else { + t3 = $[8]; + } + const t4 = error ? error.message : label; + const t5 = error ? "true" : props["aria-invalid"]; + let t6; + if ($[9] !== handleClick || $[10] !== props || $[11] !== ref || $[12] !== t3 || $[13] !== t4 || $[14] !== t5) { + t6 = /* @__PURE__ */jsxRuntime.jsx(UnStyledButton, { ...props, ref, type: "button", - className: clsx.clsx("graphiql-toolbar-button", error && "error", props.className), + className: t3, onClick: handleClick, - "aria-label": error ? error.message : label, - "aria-invalid": error ? "true" : props["aria-invalid"] - }) - }); + "aria-label": t4, + "aria-invalid": t5 + }); + $[9] = handleClick; + $[10] = props; + $[11] = ref; + $[12] = t3; + $[13] = t4; + $[14] = t5; + $[15] = t6; + } else { + t6 = $[15]; + } + let t7; + if ($[16] !== label || $[17] !== t6) { + t7 = /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: t6 + }); + $[16] = label; + $[17] = t6; + $[18] = t7; + } else { + t7 = $[18]; + } + return t7; }); ToolbarButton.displayName = "ToolbarButton"; function ExecuteButton() { + const $ = reactCompilerRuntime.c(19); + let t0; + if ($[0] === Symbol.for("react.memo_cache_sentinel")) { + t0 = { + nonNull: true, + caller: ExecuteButton + }; + $[0] = t0; + } else { + t0 = $[0]; + } const { queryEditor, setOperationName - } = useEditorContext({ - nonNull: true, - caller: ExecuteButton - }); + } = useEditorContext(t0); + let t1; + if ($[1] === Symbol.for("react.memo_cache_sentinel")) { + t1 = { + nonNull: true, + caller: ExecuteButton + }; + $[1] = t1; + } else { + t1 = $[1]; + } const { isFetching, isSubscribed, operationName, run, stop - } = useExecutionContext({ - nonNull: true, - caller: ExecuteButton - }); - const operations = (queryEditor == null ? void 0 : queryEditor.operations) || []; + } = useExecutionContext(t1); + let t2; + if ($[2] !== (queryEditor == null ? void 0 : queryEditor.operations)) { + t2 = (queryEditor == null ? void 0 : queryEditor.operations) || []; + $[2] = queryEditor == null ? void 0 : queryEditor.operations; + $[3] = t2; + } else { + t2 = $[3]; + } + const operations = t2; const hasOptions = operations.length > 1 && typeof operationName !== "string"; const isRunning = isFetching || isSubscribed; const label = `${isRunning ? "Stop" : "Execute"} query (Ctrl-Enter)`; - const buttonProps = { - type: "button", - className: "graphiql-execute-button", - children: isRunning ? /* @__PURE__ */jsxRuntime.jsx(StopIcon, {}) : /* @__PURE__ */jsxRuntime.jsx(PlayIcon, {}), - "aria-label": label - }; - return hasOptions && !isRunning ? /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { - children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { + let t3; + if ($[4] !== isRunning) { + t3 = isRunning ? /* @__PURE__ */jsxRuntime.jsx(StopIcon, {}) : /* @__PURE__ */jsxRuntime.jsx(PlayIcon, {}); + $[4] = isRunning; + $[5] = t3; + } else { + t3 = $[5]; + } + let t4; + if ($[6] !== label || $[7] !== t3) { + t4 = { + type: "button", + className: "graphiql-execute-button", + children: t3, + "aria-label": label + }; + $[6] = label; + $[7] = t3; + $[8] = t4; + } else { + t4 = $[8]; + } + const buttonProps = t4; + let t5; + if ($[9] !== buttonProps || $[10] !== hasOptions || $[11] !== isRunning || $[12] !== label || $[13] !== operations || $[14] !== queryEditor || $[15] !== run || $[16] !== setOperationName || $[17] !== stop) { + t5 = hasOptions && !isRunning ? /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { + children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { + ...buttonProps + }) + }), /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { + children: operations.map((operation, i) => { + const opName = operation.name ? operation.name.value : ``; + return /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Item, { + onSelect: () => { + var _a; + const selectedOperationName = (_a = operation.name) == null ? void 0 : _a.value; + if (queryEditor && selectedOperationName && selectedOperationName !== queryEditor.operationName) { + setOperationName(selectedOperationName); + } + run(); + }, + children: opName + }, `${opName}-${i}`); + }) + })] + }) : /* @__PURE__ */jsxRuntime.jsx(Tooltip, { label, - children: /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { - ...buttonProps - }) - }), /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { - children: operations.map((operation, i) => { - const opName = operation.name ? operation.name.value : ``; - return /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Item, { - onSelect: () => { - var _a; - const selectedOperationName = (_a = operation.name) == null ? void 0 : _a.value; - if (queryEditor && selectedOperationName && selectedOperationName !== queryEditor.operationName) { - setOperationName(selectedOperationName); - } + children: /* @__PURE__ */jsxRuntime.jsx("button", { + ...buttonProps, + onClick: () => { + if (isRunning) { + stop(); + } else { run(); - }, - children: opName - }, `${opName}-${i}`); - }) - })] - }) : /* @__PURE__ */jsxRuntime.jsx(Tooltip, { - label, - children: /* @__PURE__ */jsxRuntime.jsx("button", { - ...buttonProps, - onClick: () => { - if (isRunning) { - stop(); - } else { - run(); + } } - } - }) - }); + }) + }); + $[9] = buttonProps; + $[10] = hasOptions; + $[11] = isRunning; + $[12] = label; + $[13] = operations; + $[14] = queryEditor; + $[15] = run; + $[16] = setOperationName; + $[17] = stop; + $[18] = t5; + } else { + t5 = $[18]; + } + return t5; } -const ToolbarMenuRoot = ({ - button, - children, - label, - ...props -}) => /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { - ...props, - children: [/* @__PURE__ */jsxRuntime.jsx(Tooltip, { - label, - children: /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { - className: clsx.clsx("graphiql-un-styled graphiql-toolbar-menu", props.className), +const ToolbarMenuRoot = t0 => { + const $ = reactCompilerRuntime.c(20); + let button; + let children; + let label; + let props; + if ($[0] !== t0) { + ({ + button, + children, + label, + ...props + } = t0); + $[0] = t0; + $[1] = button; + $[2] = children; + $[3] = label; + $[4] = props; + } else { + button = $[1]; + children = $[2]; + label = $[3]; + props = $[4]; + } + let t1; + if ($[5] !== props.className) { + t1 = clsx.clsx("graphiql-un-styled graphiql-toolbar-menu", props.className); + $[5] = props.className; + $[6] = t1; + } else { + t1 = $[6]; + } + let t2; + if ($[7] !== button || $[8] !== label || $[9] !== t1) { + t2 = /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Button, { + className: t1, "aria-label": label, children: button - }) - }), /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { - children - })] -}); + }); + $[7] = button; + $[8] = label; + $[9] = t1; + $[10] = t2; + } else { + t2 = $[10]; + } + let t3; + if ($[11] !== label || $[12] !== t2) { + t3 = /* @__PURE__ */jsxRuntime.jsx(Tooltip, { + label, + children: t2 + }); + $[11] = label; + $[12] = t2; + $[13] = t3; + } else { + t3 = $[13]; + } + let t4; + if ($[14] !== children) { + t4 = /* @__PURE__ */jsxRuntime.jsx(DropdownMenu.Content, { + children + }); + $[14] = children; + $[15] = t4; + } else { + t4 = $[15]; + } + let t5; + if ($[16] !== props || $[17] !== t3 || $[18] !== t4) { + t5 = /* @__PURE__ */jsxRuntime.jsxs(DropdownMenu, { + ...props, + children: [t3, t4] + }); + $[16] = props; + $[17] = t3; + $[18] = t4; + $[19] = t5; + } else { + t5 = $[19]; + } + return t5; +}; const ToolbarMenu = createComponentGroup(ToolbarMenuRoot, { Item: DropdownMenu.Item }); @@ -73311,4833 +83409,13 @@ exports.useVariablesEditorState = useVariablesEditorState; /***/ }), -/***/ "../../graphiql-react/dist/info-addon.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/info-addon.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -codemirror.CodeMirror.defineOption("info", false, (cm, options, old) => { - if (old && old !== codemirror.CodeMirror.Init) { - const oldOnMouseOver = cm.state.info.onMouseOver; - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseover", oldOnMouseOver); - clearTimeout(cm.state.info.hoverTimeout); - delete cm.state.info; - } - if (options) { - const state = cm.state.info = createState(options); - state.onMouseOver = onMouseOver.bind(null, cm); - codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); - } -}); -function createState(options) { - return { - options: options instanceof Function ? { - render: options - } : options === true ? {} : options - }; -} -function getHoverTime(cm) { - const { - options - } = cm.state.info; - return (options === null || options === void 0 ? void 0 : options.hoverTime) || 500; -} -function onMouseOver(cm, e) { - const state = cm.state.info; - const target = e.target || e.srcElement; - if (!(target instanceof HTMLElement)) { - return; - } - if (target.nodeName !== "SPAN" || state.hoverTimeout !== void 0) { - return; - } - const box = target.getBoundingClientRect(); - const onMouseMove = function () { - clearTimeout(state.hoverTimeout); - state.hoverTimeout = setTimeout(onHover, hoverTime); - }; - const onMouseOut = function () { - codemirror.CodeMirror.off(document, "mousemove", onMouseMove); - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); - clearTimeout(state.hoverTimeout); - state.hoverTimeout = void 0; - }; - const onHover = function () { - codemirror.CodeMirror.off(document, "mousemove", onMouseMove); - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); - state.hoverTimeout = void 0; - onMouseHover(cm, box); - }; - const hoverTime = getHoverTime(cm); - state.hoverTimeout = setTimeout(onHover, hoverTime); - codemirror.CodeMirror.on(document, "mousemove", onMouseMove); - codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", onMouseOut); -} -function onMouseHover(cm, box) { - const pos = cm.coordsChar({ - left: (box.left + box.right) / 2, - top: (box.top + box.bottom) / 2 - }, "window"); - const state = cm.state.info; - const { - options - } = state; - const render = options.render || cm.getHelper(pos, "info"); - if (render) { - const token = cm.getTokenAt(pos, true); - if (token) { - const info = render(token, options, cm, pos); - if (info) { - showPopup(cm, box, info); - } - } - } -} -function showPopup(cm, box, info) { - const popup = document.createElement("div"); - popup.className = "CodeMirror-info"; - popup.append(info); - document.body.append(popup); - const popupBox = popup.getBoundingClientRect(); - const popupStyle = window.getComputedStyle(popup); - const popupWidth = popupBox.right - popupBox.left + parseFloat(popupStyle.marginLeft) + parseFloat(popupStyle.marginRight); - const popupHeight = popupBox.bottom - popupBox.top + parseFloat(popupStyle.marginTop) + parseFloat(popupStyle.marginBottom); - let topPos = box.bottom; - if (popupHeight > window.innerHeight - box.bottom - 15 && box.top > window.innerHeight - box.bottom) { - topPos = box.top - popupHeight; - } - if (topPos < 0) { - topPos = box.bottom; - } - let leftPos = Math.max(0, window.innerWidth - popupWidth - 15); - if (leftPos > box.left) { - leftPos = box.left; - } - popup.style.opacity = "1"; - popup.style.top = topPos + "px"; - popup.style.left = leftPos + "px"; - let popupTimeout; - const onMouseOverPopup = function () { - clearTimeout(popupTimeout); - }; - const onMouseOut = function () { - clearTimeout(popupTimeout); - popupTimeout = setTimeout(hidePopup, 200); - }; - const hidePopup = function () { - codemirror.CodeMirror.off(popup, "mouseover", onMouseOverPopup); - codemirror.CodeMirror.off(popup, "mouseout", onMouseOut); - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", onMouseOut); - if (popup.style.opacity) { - popup.style.opacity = "0"; - setTimeout(() => { - if (popup.parentNode) { - popup.remove(); - } - }, 600); - } else if (popup.parentNode) { - popup.remove(); - } - }; - codemirror.CodeMirror.on(popup, "mouseover", onMouseOverPopup); - codemirror.CodeMirror.on(popup, "mouseout", onMouseOut); - codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", onMouseOut); -} - -/***/ }), - -/***/ "../../graphiql-react/dist/info.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/info.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const SchemaReference = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); -__webpack_require__(/*! ./info-addon.cjs.js */ "../../graphiql-react/dist/info-addon.cjs.js"); -codemirror.CodeMirror.registerHelper("info", "graphql", (token, options) => { - var _a; - if (!options.schema || !token.state) { - return; - } - const { - kind, - step - } = token.state; - const typeInfo = SchemaReference.getTypeInfo(options.schema, token.state); - if (kind === "Field" && step === 0 && typeInfo.fieldDef || kind === "AliasedField" && step === 2 && typeInfo.fieldDef || kind === "ObjectField" && step === 0 && typeInfo.fieldDef) { - const header = document.createElement("div"); - header.className = "CodeMirror-info-header"; - renderField(header, typeInfo, options); - const into = document.createElement("div"); - into.append(header); - renderDescription(into, options, typeInfo.fieldDef); - return into; - } - if (kind === "Directive" && step === 1 && typeInfo.directiveDef) { - const header = document.createElement("div"); - header.className = "CodeMirror-info-header"; - renderDirective(header, typeInfo, options); - const into = document.createElement("div"); - into.append(header); - renderDescription(into, options, typeInfo.directiveDef); - return into; - } - if (kind === "Argument" && step === 0 && typeInfo.argDef) { - const header = document.createElement("div"); - header.className = "CodeMirror-info-header"; - renderArg(header, typeInfo, options); - const into = document.createElement("div"); - into.append(header); - renderDescription(into, options, typeInfo.argDef); - return into; - } - if (kind === "EnumValue" && ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.description)) { - const header = document.createElement("div"); - header.className = "CodeMirror-info-header"; - renderEnumValue(header, typeInfo, options); - const into = document.createElement("div"); - into.append(header); - renderDescription(into, options, typeInfo.enumValue); - return into; - } - if (kind === "NamedType" && typeInfo.type && typeInfo.type.description) { - const header = document.createElement("div"); - header.className = "CodeMirror-info-header"; - renderType(header, typeInfo, options, typeInfo.type); - const into = document.createElement("div"); - into.append(header); - renderDescription(into, options, typeInfo.type); - return into; - } -}); -function renderField(into, typeInfo, options) { - renderQualifiedField(into, typeInfo, options); - renderTypeAnnotation(into, typeInfo, options, typeInfo.type); -} -function renderQualifiedField(into, typeInfo, options) { - var _a; - const fieldName = ((_a = typeInfo.fieldDef) === null || _a === void 0 ? void 0 : _a.name) || ""; - text(into, fieldName, "field-name", options, SchemaReference.getFieldReference(typeInfo)); -} -function renderDirective(into, typeInfo, options) { - var _a; - const name = "@" + (((_a = typeInfo.directiveDef) === null || _a === void 0 ? void 0 : _a.name) || ""); - text(into, name, "directive-name", options, SchemaReference.getDirectiveReference(typeInfo)); -} -function renderArg(into, typeInfo, options) { - var _a; - const name = ((_a = typeInfo.argDef) === null || _a === void 0 ? void 0 : _a.name) || ""; - text(into, name, "arg-name", options, SchemaReference.getArgumentReference(typeInfo)); - renderTypeAnnotation(into, typeInfo, options, typeInfo.inputType); -} -function renderEnumValue(into, typeInfo, options) { - var _a; - const name = ((_a = typeInfo.enumValue) === null || _a === void 0 ? void 0 : _a.name) || ""; - renderType(into, typeInfo, options, typeInfo.inputType); - text(into, "."); - text(into, name, "enum-value", options, SchemaReference.getEnumValueReference(typeInfo)); -} -function renderTypeAnnotation(into, typeInfo, options, t) { - const typeSpan = document.createElement("span"); - typeSpan.className = "type-name-pill"; - if (t instanceof graphql.GraphQLNonNull) { - renderType(typeSpan, typeInfo, options, t.ofType); - text(typeSpan, "!"); - } else if (t instanceof graphql.GraphQLList) { - text(typeSpan, "["); - renderType(typeSpan, typeInfo, options, t.ofType); - text(typeSpan, "]"); - } else { - text(typeSpan, (t === null || t === void 0 ? void 0 : t.name) || "", "type-name", options, SchemaReference.getTypeReference(typeInfo, t)); - } - into.append(typeSpan); -} -function renderType(into, typeInfo, options, t) { - if (t instanceof graphql.GraphQLNonNull) { - renderType(into, typeInfo, options, t.ofType); - text(into, "!"); - } else if (t instanceof graphql.GraphQLList) { - text(into, "["); - renderType(into, typeInfo, options, t.ofType); - text(into, "]"); - } else { - text(into, (t === null || t === void 0 ? void 0 : t.name) || "", "type-name", options, SchemaReference.getTypeReference(typeInfo, t)); - } -} -function renderDescription(into, options, def) { - const { - description - } = def; - if (description) { - const descriptionDiv = document.createElement("div"); - descriptionDiv.className = "info-description"; - if (options.renderDescription) { - descriptionDiv.innerHTML = options.renderDescription(description); - } else { - descriptionDiv.append(document.createTextNode(description)); - } - into.append(descriptionDiv); - } - renderDeprecation(into, options, def); -} -function renderDeprecation(into, options, def) { - const reason = def.deprecationReason; - if (reason) { - const deprecationDiv = document.createElement("div"); - deprecationDiv.className = "info-deprecation"; - into.append(deprecationDiv); - const label = document.createElement("span"); - label.className = "info-deprecation-label"; - label.append(document.createTextNode("Deprecated")); - deprecationDiv.append(label); - const reasonDiv = document.createElement("div"); - reasonDiv.className = "info-deprecation-reason"; - if (options.renderDescription) { - reasonDiv.innerHTML = options.renderDescription(reason); - } else { - reasonDiv.append(document.createTextNode(reason)); - } - deprecationDiv.append(reasonDiv); - } -} -function text(into, content, className = "", options = { - onClick: null -}, ref = null) { - if (className) { - const { - onClick - } = options; - let node; - if (onClick) { - node = document.createElement("a"); - node.href = "javascript:void 0"; - node.addEventListener("click", e => { - e.preventDefault(); - onClick(ref, e); - }); - } else { - node = document.createElement("span"); - } - node.className = className; - node.append(document.createTextNode(content)); - into.append(node); - } else { - into.append(document.createTextNode(content)); - } -} - -/***/ }), - -/***/ "../../graphiql-react/dist/javascript.cjs.js": -/*!***************************************************!*\ - !*** ../../graphiql-react/dist/javascript.cjs.js ***! - \***************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var javascript$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - CodeMirror.defineMode("javascript", function (config, parserConfig) { - var indentUnit = config.indentUnit; - var statementIndent = parserConfig.statementIndent; - var jsonldMode = parserConfig.jsonld; - var jsonMode = parserConfig.json || jsonldMode; - var trackScope = parserConfig.trackScope !== false; - var isTS = parserConfig.typescript; - var wordRE = parserConfig.wordCharacters || /[\w$\xa1-\uffff]/; - var keywords = function () { - function kw(type2) { - return { - type: type2, - style: "keyword" - }; - } - var A = kw("keyword a"), - B = kw("keyword b"), - C = kw("keyword c"), - D = kw("keyword d"); - var operator = kw("operator"), - atom = { - type: "atom", - style: "atom" - }; - return { - "if": kw("if"), - "while": A, - "with": A, - "else": B, - "do": B, - "try": B, - "finally": B, - "return": D, - "break": D, - "continue": D, - "new": kw("new"), - "delete": C, - "void": C, - "throw": C, - "debugger": kw("debugger"), - "var": kw("var"), - "const": kw("var"), - "let": kw("var"), - "function": kw("function"), - "catch": kw("catch"), - "for": kw("for"), - "switch": kw("switch"), - "case": kw("case"), - "default": kw("default"), - "in": operator, - "typeof": operator, - "instanceof": operator, - "true": atom, - "false": atom, - "null": atom, - "undefined": atom, - "NaN": atom, - "Infinity": atom, - "this": kw("this"), - "class": kw("class"), - "super": kw("atom"), - "yield": C, - "export": kw("export"), - "import": kw("import"), - "extends": C, - "await": C - }; - }(); - var isOperatorChar = /[+\-*&%=<>!?|~^@]/; - var isJsonldKeyword = /^@(context|id|value|language|type|container|list|set|reverse|index|base|vocab|graph)"/; - function readRegexp(stream) { - var escaped = false, - next, - inSet = false; - while ((next = stream.next()) != null) { - if (!escaped) { - if (next == "/" && !inSet) return; - if (next == "[") inSet = true;else if (inSet && next == "]") inSet = false; - } - escaped = !escaped && next == "\\"; - } - } - var type, content; - function ret(tp, style, cont2) { - type = tp; - content = cont2; - return style; - } - function tokenBase(stream, state) { - var ch = stream.next(); - if (ch == '"' || ch == "'") { - state.tokenize = tokenString(ch); - return state.tokenize(stream, state); - } else if (ch == "." && stream.match(/^\d[\d_]*(?:[eE][+\-]?[\d_]+)?/)) { - return ret("number", "number"); - } else if (ch == "." && stream.match("..")) { - return ret("spread", "meta"); - } else if (/[\[\]{}\(\),;\:\.]/.test(ch)) { - return ret(ch); - } else if (ch == "=" && stream.eat(">")) { - return ret("=>", "operator"); - } else if (ch == "0" && stream.match(/^(?:x[\dA-Fa-f_]+|o[0-7_]+|b[01_]+)n?/)) { - return ret("number", "number"); - } else if (/\d/.test(ch)) { - stream.match(/^[\d_]*(?:n|(?:\.[\d_]*)?(?:[eE][+\-]?[\d_]+)?)?/); - return ret("number", "number"); - } else if (ch == "/") { - if (stream.eat("*")) { - state.tokenize = tokenComment; - return tokenComment(stream, state); - } else if (stream.eat("/")) { - stream.skipToEnd(); - return ret("comment", "comment"); - } else if (expressionAllowed(stream, state, 1)) { - readRegexp(stream); - stream.match(/^\b(([gimyus])(?![gimyus]*\2))+\b/); - return ret("regexp", "string-2"); - } else { - stream.eat("="); - return ret("operator", "operator", stream.current()); - } - } else if (ch == "`") { - state.tokenize = tokenQuasi; - return tokenQuasi(stream, state); - } else if (ch == "#" && stream.peek() == "!") { - stream.skipToEnd(); - return ret("meta", "meta"); - } else if (ch == "#" && stream.eatWhile(wordRE)) { - return ret("variable", "property"); - } else if (ch == "<" && stream.match("!--") || ch == "-" && stream.match("->") && !/\S/.test(stream.string.slice(0, stream.start))) { - stream.skipToEnd(); - return ret("comment", "comment"); - } else if (isOperatorChar.test(ch)) { - if (ch != ">" || !state.lexical || state.lexical.type != ">") { - if (stream.eat("=")) { - if (ch == "!" || ch == "=") stream.eat("="); - } else if (/[<>*+\-|&?]/.test(ch)) { - stream.eat(ch); - if (ch == ">") stream.eat(ch); - } - } - if (ch == "?" && stream.eat(".")) return ret("."); - return ret("operator", "operator", stream.current()); - } else if (wordRE.test(ch)) { - stream.eatWhile(wordRE); - var word = stream.current(); - if (state.lastType != ".") { - if (keywords.propertyIsEnumerable(word)) { - var kw = keywords[word]; - return ret(kw.type, kw.style, word); - } - if (word == "async" && stream.match(/^(\s|\/\*([^*]|\*(?!\/))*?\*\/)*[\[\(\w]/, false)) return ret("async", "keyword", word); - } - return ret("variable", "variable", word); - } - } - function tokenString(quote) { - return function (stream, state) { - var escaped = false, - next; - if (jsonldMode && stream.peek() == "@" && stream.match(isJsonldKeyword)) { - state.tokenize = tokenBase; - return ret("jsonld-keyword", "meta"); - } - while ((next = stream.next()) != null) { - if (next == quote && !escaped) break; - escaped = !escaped && next == "\\"; - } - if (!escaped) state.tokenize = tokenBase; - return ret("string", "string"); - }; - } - function tokenComment(stream, state) { - var maybeEnd = false, - ch; - while (ch = stream.next()) { - if (ch == "/" && maybeEnd) { - state.tokenize = tokenBase; - break; - } - maybeEnd = ch == "*"; - } - return ret("comment", "comment"); - } - function tokenQuasi(stream, state) { - var escaped = false, - next; - while ((next = stream.next()) != null) { - if (!escaped && (next == "`" || next == "$" && stream.eat("{"))) { - state.tokenize = tokenBase; - break; - } - escaped = !escaped && next == "\\"; - } - return ret("quasi", "string-2", stream.current()); - } - var brackets = "([{}])"; - function findFatArrow(stream, state) { - if (state.fatArrowAt) state.fatArrowAt = null; - var arrow = stream.string.indexOf("=>", stream.start); - if (arrow < 0) return; - if (isTS) { - var m = /:\s*(?:\w+(?:<[^>]*>|\[\])?|\{[^}]*\})\s*$/.exec(stream.string.slice(stream.start, arrow)); - if (m) arrow = m.index; - } - var depth = 0, - sawSomething = false; - for (var pos = arrow - 1; pos >= 0; --pos) { - var ch = stream.string.charAt(pos); - var bracket = brackets.indexOf(ch); - if (bracket >= 0 && bracket < 3) { - if (!depth) { - ++pos; - break; - } - if (--depth == 0) { - if (ch == "(") sawSomething = true; - break; - } - } else if (bracket >= 3 && bracket < 6) { - ++depth; - } else if (wordRE.test(ch)) { - sawSomething = true; - } else if (/["'\/`]/.test(ch)) { - for (;; --pos) { - if (pos == 0) return; - var next = stream.string.charAt(pos - 1); - if (next == ch && stream.string.charAt(pos - 2) != "\\") { - pos--; - break; - } - } - } else if (sawSomething && !depth) { - ++pos; - break; - } - } - if (sawSomething && !depth) state.fatArrowAt = pos; - } - var atomicTypes = { - "atom": true, - "number": true, - "variable": true, - "string": true, - "regexp": true, - "this": true, - "import": true, - "jsonld-keyword": true - }; - function JSLexical(indented, column, type2, align, prev, info) { - this.indented = indented; - this.column = column; - this.type = type2; - this.prev = prev; - this.info = info; - if (align != null) this.align = align; - } - function inScope(state, varname) { - if (!trackScope) return false; - for (var v = state.localVars; v; v = v.next) if (v.name == varname) return true; - for (var cx2 = state.context; cx2; cx2 = cx2.prev) { - for (var v = cx2.vars; v; v = v.next) if (v.name == varname) return true; - } - } - function parseJS(state, style, type2, content2, stream) { - var cc = state.cc; - cx.state = state; - cx.stream = stream; - cx.marked = null, cx.cc = cc; - cx.style = style; - if (!state.lexical.hasOwnProperty("align")) state.lexical.align = true; - while (true) { - var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement; - if (combinator(type2, content2)) { - while (cc.length && cc[cc.length - 1].lex) cc.pop()(); - if (cx.marked) return cx.marked; - if (type2 == "variable" && inScope(state, content2)) return "variable-2"; - return style; - } - } - } - var cx = { - state: null, - column: null, - marked: null, - cc: null - }; - function pass() { - for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i]); - } - function cont() { - pass.apply(null, arguments); - return true; - } - function inList(name, list) { - for (var v = list; v; v = v.next) if (v.name == name) return true; - return false; - } - function register(varname) { - var state = cx.state; - cx.marked = "def"; - if (!trackScope) return; - if (state.context) { - if (state.lexical.info == "var" && state.context && state.context.block) { - var newContext = registerVarScoped(varname, state.context); - if (newContext != null) { - state.context = newContext; - return; - } - } else if (!inList(varname, state.localVars)) { - state.localVars = new Var(varname, state.localVars); - return; - } - } - if (parserConfig.globalVars && !inList(varname, state.globalVars)) state.globalVars = new Var(varname, state.globalVars); - } - function registerVarScoped(varname, context) { - if (!context) { - return null; - } else if (context.block) { - var inner = registerVarScoped(varname, context.prev); - if (!inner) return null; - if (inner == context.prev) return context; - return new Context(inner, context.vars, true); - } else if (inList(varname, context.vars)) { - return context; - } else { - return new Context(context.prev, new Var(varname, context.vars), false); - } - } - function isModifier(name) { - return name == "public" || name == "private" || name == "protected" || name == "abstract" || name == "readonly"; - } - function Context(prev, vars, block2) { - this.prev = prev; - this.vars = vars; - this.block = block2; - } - function Var(name, next) { - this.name = name; - this.next = next; - } - var defaultVars = new Var("this", new Var("arguments", null)); - function pushcontext() { - cx.state.context = new Context(cx.state.context, cx.state.localVars, false); - cx.state.localVars = defaultVars; - } - function pushblockcontext() { - cx.state.context = new Context(cx.state.context, cx.state.localVars, true); - cx.state.localVars = null; - } - pushcontext.lex = pushblockcontext.lex = true; - function popcontext() { - cx.state.localVars = cx.state.context.vars; - cx.state.context = cx.state.context.prev; - } - popcontext.lex = true; - function pushlex(type2, info) { - var result = function () { - var state = cx.state, - indent = state.indented; - if (state.lexical.type == "stat") indent = state.lexical.indented;else for (var outer = state.lexical; outer && outer.type == ")" && outer.align; outer = outer.prev) indent = outer.indented; - state.lexical = new JSLexical(indent, cx.stream.column(), type2, null, state.lexical, info); - }; - result.lex = true; - return result; - } - function poplex() { - var state = cx.state; - if (state.lexical.prev) { - if (state.lexical.type == ")") state.indented = state.lexical.indented; - state.lexical = state.lexical.prev; - } - } - poplex.lex = true; - function expect(wanted) { - function exp(type2) { - if (type2 == wanted) return cont();else if (wanted == ";" || type2 == "}" || type2 == ")" || type2 == "]") return pass();else return cont(exp); - } - return exp; - } - function statement(type2, value) { - if (type2 == "var") return cont(pushlex("vardef", value), vardef, expect(";"), poplex); - if (type2 == "keyword a") return cont(pushlex("form"), parenExpr, statement, poplex); - if (type2 == "keyword b") return cont(pushlex("form"), statement, poplex); - if (type2 == "keyword d") return cx.stream.match(/^\s*$/, false) ? cont() : cont(pushlex("stat"), maybeexpression, expect(";"), poplex); - if (type2 == "debugger") return cont(expect(";")); - if (type2 == "{") return cont(pushlex("}"), pushblockcontext, block, poplex, popcontext); - if (type2 == ";") return cont(); - if (type2 == "if") { - if (cx.state.lexical.info == "else" && cx.state.cc[cx.state.cc.length - 1] == poplex) cx.state.cc.pop()(); - return cont(pushlex("form"), parenExpr, statement, poplex, maybeelse); - } - if (type2 == "function") return cont(functiondef); - if (type2 == "for") return cont(pushlex("form"), pushblockcontext, forspec, statement, popcontext, poplex); - if (type2 == "class" || isTS && value == "interface") { - cx.marked = "keyword"; - return cont(pushlex("form", type2 == "class" ? type2 : value), className, poplex); - } - if (type2 == "variable") { - if (isTS && value == "declare") { - cx.marked = "keyword"; - return cont(statement); - } else if (isTS && (value == "module" || value == "enum" || value == "type") && cx.stream.match(/^\s*\w/, false)) { - cx.marked = "keyword"; - if (value == "enum") return cont(enumdef);else if (value == "type") return cont(typename, expect("operator"), typeexpr, expect(";"));else return cont(pushlex("form"), pattern, expect("{"), pushlex("}"), block, poplex, poplex); - } else if (isTS && value == "namespace") { - cx.marked = "keyword"; - return cont(pushlex("form"), expression, statement, poplex); - } else if (isTS && value == "abstract") { - cx.marked = "keyword"; - return cont(statement); - } else { - return cont(pushlex("stat"), maybelabel); - } - } - if (type2 == "switch") return cont(pushlex("form"), parenExpr, expect("{"), pushlex("}", "switch"), pushblockcontext, block, poplex, poplex, popcontext); - if (type2 == "case") return cont(expression, expect(":")); - if (type2 == "default") return cont(expect(":")); - if (type2 == "catch") return cont(pushlex("form"), pushcontext, maybeCatchBinding, statement, poplex, popcontext); - if (type2 == "export") return cont(pushlex("stat"), afterExport, poplex); - if (type2 == "import") return cont(pushlex("stat"), afterImport, poplex); - if (type2 == "async") return cont(statement); - if (value == "@") return cont(expression, statement); - return pass(pushlex("stat"), expression, expect(";"), poplex); - } - function maybeCatchBinding(type2) { - if (type2 == "(") return cont(funarg, expect(")")); - } - function expression(type2, value) { - return expressionInner(type2, value, false); - } - function expressionNoComma(type2, value) { - return expressionInner(type2, value, true); - } - function parenExpr(type2) { - if (type2 != "(") return pass(); - return cont(pushlex(")"), maybeexpression, expect(")"), poplex); - } - function expressionInner(type2, value, noComma) { - if (cx.state.fatArrowAt == cx.stream.start) { - var body = noComma ? arrowBodyNoComma : arrowBody; - if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, expect("=>"), body, popcontext);else if (type2 == "variable") return pass(pushcontext, pattern, expect("=>"), body, popcontext); - } - var maybeop = noComma ? maybeoperatorNoComma : maybeoperatorComma; - if (atomicTypes.hasOwnProperty(type2)) return cont(maybeop); - if (type2 == "function") return cont(functiondef, maybeop); - if (type2 == "class" || isTS && value == "interface") { - cx.marked = "keyword"; - return cont(pushlex("form"), classExpression, poplex); - } - if (type2 == "keyword c" || type2 == "async") return cont(noComma ? expressionNoComma : expression); - if (type2 == "(") return cont(pushlex(")"), maybeexpression, expect(")"), poplex, maybeop); - if (type2 == "operator" || type2 == "spread") return cont(noComma ? expressionNoComma : expression); - if (type2 == "[") return cont(pushlex("]"), arrayLiteral, poplex, maybeop); - if (type2 == "{") return contCommasep(objprop, "}", null, maybeop); - if (type2 == "quasi") return pass(quasi, maybeop); - if (type2 == "new") return cont(maybeTarget(noComma)); - return cont(); - } - function maybeexpression(type2) { - if (type2.match(/[;\}\)\],]/)) return pass(); - return pass(expression); - } - function maybeoperatorComma(type2, value) { - if (type2 == ",") return cont(maybeexpression); - return maybeoperatorNoComma(type2, value, false); - } - function maybeoperatorNoComma(type2, value, noComma) { - var me = noComma == false ? maybeoperatorComma : maybeoperatorNoComma; - var expr = noComma == false ? expression : expressionNoComma; - if (type2 == "=>") return cont(pushcontext, noComma ? arrowBodyNoComma : arrowBody, popcontext); - if (type2 == "operator") { - if (/\+\+|--/.test(value) || isTS && value == "!") return cont(me); - if (isTS && value == "<" && cx.stream.match(/^([^<>]|<[^<>]*>)*>\s*\(/, false)) return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, me); - if (value == "?") return cont(expression, expect(":"), expr); - return cont(expr); - } - if (type2 == "quasi") { - return pass(quasi, me); - } - if (type2 == ";") return; - if (type2 == "(") return contCommasep(expressionNoComma, ")", "call", me); - if (type2 == ".") return cont(property, me); - if (type2 == "[") return cont(pushlex("]"), maybeexpression, expect("]"), poplex, me); - if (isTS && value == "as") { - cx.marked = "keyword"; - return cont(typeexpr, me); - } - if (type2 == "regexp") { - cx.state.lastType = cx.marked = "operator"; - cx.stream.backUp(cx.stream.pos - cx.stream.start - 1); - return cont(expr); - } - } - function quasi(type2, value) { - if (type2 != "quasi") return pass(); - if (value.slice(value.length - 2) != "${") return cont(quasi); - return cont(maybeexpression, continueQuasi); - } - function continueQuasi(type2) { - if (type2 == "}") { - cx.marked = "string-2"; - cx.state.tokenize = tokenQuasi; - return cont(quasi); - } - } - function arrowBody(type2) { - findFatArrow(cx.stream, cx.state); - return pass(type2 == "{" ? statement : expression); - } - function arrowBodyNoComma(type2) { - findFatArrow(cx.stream, cx.state); - return pass(type2 == "{" ? statement : expressionNoComma); - } - function maybeTarget(noComma) { - return function (type2) { - if (type2 == ".") return cont(noComma ? targetNoComma : target);else if (type2 == "variable" && isTS) return cont(maybeTypeArgs, noComma ? maybeoperatorNoComma : maybeoperatorComma);else return pass(noComma ? expressionNoComma : expression); - }; - } - function target(_, value) { - if (value == "target") { - cx.marked = "keyword"; - return cont(maybeoperatorComma); - } - } - function targetNoComma(_, value) { - if (value == "target") { - cx.marked = "keyword"; - return cont(maybeoperatorNoComma); - } - } - function maybelabel(type2) { - if (type2 == ":") return cont(poplex, statement); - return pass(maybeoperatorComma, expect(";"), poplex); - } - function property(type2) { - if (type2 == "variable") { - cx.marked = "property"; - return cont(); - } - } - function objprop(type2, value) { - if (type2 == "async") { - cx.marked = "property"; - return cont(objprop); - } else if (type2 == "variable" || cx.style == "keyword") { - cx.marked = "property"; - if (value == "get" || value == "set") return cont(getterSetter); - var m; - if (isTS && cx.state.fatArrowAt == cx.stream.start && (m = cx.stream.match(/^\s*:\s*/, false))) cx.state.fatArrowAt = cx.stream.pos + m[0].length; - return cont(afterprop); - } else if (type2 == "number" || type2 == "string") { - cx.marked = jsonldMode ? "property" : cx.style + " property"; - return cont(afterprop); - } else if (type2 == "jsonld-keyword") { - return cont(afterprop); - } else if (isTS && isModifier(value)) { - cx.marked = "keyword"; - return cont(objprop); - } else if (type2 == "[") { - return cont(expression, maybetype, expect("]"), afterprop); - } else if (type2 == "spread") { - return cont(expressionNoComma, afterprop); - } else if (value == "*") { - cx.marked = "keyword"; - return cont(objprop); - } else if (type2 == ":") { - return pass(afterprop); - } - } - function getterSetter(type2) { - if (type2 != "variable") return pass(afterprop); - cx.marked = "property"; - return cont(functiondef); - } - function afterprop(type2) { - if (type2 == ":") return cont(expressionNoComma); - if (type2 == "(") return pass(functiondef); - } - function commasep(what, end, sep) { - function proceed(type2, value) { - if (sep ? sep.indexOf(type2) > -1 : type2 == ",") { - var lex = cx.state.lexical; - if (lex.info == "call") lex.pos = (lex.pos || 0) + 1; - return cont(function (type3, value2) { - if (type3 == end || value2 == end) return pass(); - return pass(what); - }, proceed); - } - if (type2 == end || value == end) return cont(); - if (sep && sep.indexOf(";") > -1) return pass(what); - return cont(expect(end)); - } - return function (type2, value) { - if (type2 == end || value == end) return cont(); - return pass(what, proceed); - }; - } - function contCommasep(what, end, info) { - for (var i = 3; i < arguments.length; i++) cx.cc.push(arguments[i]); - return cont(pushlex(end, info), commasep(what, end), poplex); - } - function block(type2) { - if (type2 == "}") return cont(); - return pass(statement, block); - } - function maybetype(type2, value) { - if (isTS) { - if (type2 == ":") return cont(typeexpr); - if (value == "?") return cont(maybetype); - } - } - function maybetypeOrIn(type2, value) { - if (isTS && (type2 == ":" || value == "in")) return cont(typeexpr); - } - function mayberettype(type2) { - if (isTS && type2 == ":") { - if (cx.stream.match(/^\s*\w+\s+is\b/, false)) return cont(expression, isKW, typeexpr);else return cont(typeexpr); - } - } - function isKW(_, value) { - if (value == "is") { - cx.marked = "keyword"; - return cont(); - } - } - function typeexpr(type2, value) { - if (value == "keyof" || value == "typeof" || value == "infer" || value == "readonly") { - cx.marked = "keyword"; - return cont(value == "typeof" ? expressionNoComma : typeexpr); - } - if (type2 == "variable" || value == "void") { - cx.marked = "type"; - return cont(afterType); - } - if (value == "|" || value == "&") return cont(typeexpr); - if (type2 == "string" || type2 == "number" || type2 == "atom") return cont(afterType); - if (type2 == "[") return cont(pushlex("]"), commasep(typeexpr, "]", ","), poplex, afterType); - if (type2 == "{") return cont(pushlex("}"), typeprops, poplex, afterType); - if (type2 == "(") return cont(commasep(typearg, ")"), maybeReturnType, afterType); - if (type2 == "<") return cont(commasep(typeexpr, ">"), typeexpr); - if (type2 == "quasi") { - return pass(quasiType, afterType); - } - } - function maybeReturnType(type2) { - if (type2 == "=>") return cont(typeexpr); - } - function typeprops(type2) { - if (type2.match(/[\}\)\]]/)) return cont(); - if (type2 == "," || type2 == ";") return cont(typeprops); - return pass(typeprop, typeprops); - } - function typeprop(type2, value) { - if (type2 == "variable" || cx.style == "keyword") { - cx.marked = "property"; - return cont(typeprop); - } else if (value == "?" || type2 == "number" || type2 == "string") { - return cont(typeprop); - } else if (type2 == ":") { - return cont(typeexpr); - } else if (type2 == "[") { - return cont(expect("variable"), maybetypeOrIn, expect("]"), typeprop); - } else if (type2 == "(") { - return pass(functiondecl, typeprop); - } else if (!type2.match(/[;\}\)\],]/)) { - return cont(); - } - } - function quasiType(type2, value) { - if (type2 != "quasi") return pass(); - if (value.slice(value.length - 2) != "${") return cont(quasiType); - return cont(typeexpr, continueQuasiType); - } - function continueQuasiType(type2) { - if (type2 == "}") { - cx.marked = "string-2"; - cx.state.tokenize = tokenQuasi; - return cont(quasiType); - } - } - function typearg(type2, value) { - if (type2 == "variable" && cx.stream.match(/^\s*[?:]/, false) || value == "?") return cont(typearg); - if (type2 == ":") return cont(typeexpr); - if (type2 == "spread") return cont(typearg); - return pass(typeexpr); - } - function afterType(type2, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); - if (value == "|" || type2 == "." || value == "&") return cont(typeexpr); - if (type2 == "[") return cont(typeexpr, expect("]"), afterType); - if (value == "extends" || value == "implements") { - cx.marked = "keyword"; - return cont(typeexpr); - } - if (value == "?") return cont(typeexpr, expect(":"), typeexpr); - } - function maybeTypeArgs(_, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeexpr, ">"), poplex, afterType); - } - function typeparam() { - return pass(typeexpr, maybeTypeDefault); - } - function maybeTypeDefault(_, value) { - if (value == "=") return cont(typeexpr); - } - function vardef(_, value) { - if (value == "enum") { - cx.marked = "keyword"; - return cont(enumdef); - } - return pass(pattern, maybetype, maybeAssign, vardefCont); - } - function pattern(type2, value) { - if (isTS && isModifier(value)) { - cx.marked = "keyword"; - return cont(pattern); - } - if (type2 == "variable") { - register(value); - return cont(); - } - if (type2 == "spread") return cont(pattern); - if (type2 == "[") return contCommasep(eltpattern, "]"); - if (type2 == "{") return contCommasep(proppattern, "}"); - } - function proppattern(type2, value) { - if (type2 == "variable" && !cx.stream.match(/^\s*:/, false)) { - register(value); - return cont(maybeAssign); - } - if (type2 == "variable") cx.marked = "property"; - if (type2 == "spread") return cont(pattern); - if (type2 == "}") return pass(); - if (type2 == "[") return cont(expression, expect("]"), expect(":"), proppattern); - return cont(expect(":"), pattern, maybeAssign); - } - function eltpattern() { - return pass(pattern, maybeAssign); - } - function maybeAssign(_type, value) { - if (value == "=") return cont(expressionNoComma); - } - function vardefCont(type2) { - if (type2 == ",") return cont(vardef); - } - function maybeelse(type2, value) { - if (type2 == "keyword b" && value == "else") return cont(pushlex("form", "else"), statement, poplex); - } - function forspec(type2, value) { - if (value == "await") return cont(forspec); - if (type2 == "(") return cont(pushlex(")"), forspec1, poplex); - } - function forspec1(type2) { - if (type2 == "var") return cont(vardef, forspec2); - if (type2 == "variable") return cont(forspec2); - return pass(forspec2); - } - function forspec2(type2, value) { - if (type2 == ")") return cont(); - if (type2 == ";") return cont(forspec2); - if (value == "in" || value == "of") { - cx.marked = "keyword"; - return cont(expression, forspec2); - } - return pass(expression, forspec2); - } - function functiondef(type2, value) { - if (value == "*") { - cx.marked = "keyword"; - return cont(functiondef); - } - if (type2 == "variable") { - register(value); - return cont(functiondef); - } - if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, statement, popcontext); - if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondef); - } - function functiondecl(type2, value) { - if (value == "*") { - cx.marked = "keyword"; - return cont(functiondecl); - } - if (type2 == "variable") { - register(value); - return cont(functiondecl); - } - if (type2 == "(") return cont(pushcontext, pushlex(")"), commasep(funarg, ")"), poplex, mayberettype, popcontext); - if (isTS && value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, functiondecl); - } - function typename(type2, value) { - if (type2 == "keyword" || type2 == "variable") { - cx.marked = "type"; - return cont(typename); - } else if (value == "<") { - return cont(pushlex(">"), commasep(typeparam, ">"), poplex); - } - } - function funarg(type2, value) { - if (value == "@") cont(expression, funarg); - if (type2 == "spread") return cont(funarg); - if (isTS && isModifier(value)) { - cx.marked = "keyword"; - return cont(funarg); - } - if (isTS && type2 == "this") return cont(maybetype, maybeAssign); - return pass(pattern, maybetype, maybeAssign); - } - function classExpression(type2, value) { - if (type2 == "variable") return className(type2, value); - return classNameAfter(type2, value); - } - function className(type2, value) { - if (type2 == "variable") { - register(value); - return cont(classNameAfter); - } - } - function classNameAfter(type2, value) { - if (value == "<") return cont(pushlex(">"), commasep(typeparam, ">"), poplex, classNameAfter); - if (value == "extends" || value == "implements" || isTS && type2 == ",") { - if (value == "implements") cx.marked = "keyword"; - return cont(isTS ? typeexpr : expression, classNameAfter); - } - if (type2 == "{") return cont(pushlex("}"), classBody, poplex); - } - function classBody(type2, value) { - if (type2 == "async" || type2 == "variable" && (value == "static" || value == "get" || value == "set" || isTS && isModifier(value)) && cx.stream.match(/^\s+[\w$\xa1-\uffff]/, false)) { - cx.marked = "keyword"; - return cont(classBody); - } - if (type2 == "variable" || cx.style == "keyword") { - cx.marked = "property"; - return cont(classfield, classBody); - } - if (type2 == "number" || type2 == "string") return cont(classfield, classBody); - if (type2 == "[") return cont(expression, maybetype, expect("]"), classfield, classBody); - if (value == "*") { - cx.marked = "keyword"; - return cont(classBody); - } - if (isTS && type2 == "(") return pass(functiondecl, classBody); - if (type2 == ";" || type2 == ",") return cont(classBody); - if (type2 == "}") return cont(); - if (value == "@") return cont(expression, classBody); - } - function classfield(type2, value) { - if (value == "!") return cont(classfield); - if (value == "?") return cont(classfield); - if (type2 == ":") return cont(typeexpr, maybeAssign); - if (value == "=") return cont(expressionNoComma); - var context = cx.state.lexical.prev, - isInterface = context && context.info == "interface"; - return pass(isInterface ? functiondecl : functiondef); - } - function afterExport(type2, value) { - if (value == "*") { - cx.marked = "keyword"; - return cont(maybeFrom, expect(";")); - } - if (value == "default") { - cx.marked = "keyword"; - return cont(expression, expect(";")); - } - if (type2 == "{") return cont(commasep(exportField, "}"), maybeFrom, expect(";")); - return pass(statement); - } - function exportField(type2, value) { - if (value == "as") { - cx.marked = "keyword"; - return cont(expect("variable")); - } - if (type2 == "variable") return pass(expressionNoComma, exportField); - } - function afterImport(type2) { - if (type2 == "string") return cont(); - if (type2 == "(") return pass(expression); - if (type2 == ".") return pass(maybeoperatorComma); - return pass(importSpec, maybeMoreImports, maybeFrom); - } - function importSpec(type2, value) { - if (type2 == "{") return contCommasep(importSpec, "}"); - if (type2 == "variable") register(value); - if (value == "*") cx.marked = "keyword"; - return cont(maybeAs); - } - function maybeMoreImports(type2) { - if (type2 == ",") return cont(importSpec, maybeMoreImports); - } - function maybeAs(_type, value) { - if (value == "as") { - cx.marked = "keyword"; - return cont(importSpec); - } - } - function maybeFrom(_type, value) { - if (value == "from") { - cx.marked = "keyword"; - return cont(expression); - } - } - function arrayLiteral(type2) { - if (type2 == "]") return cont(); - return pass(commasep(expressionNoComma, "]")); - } - function enumdef() { - return pass(pushlex("form"), pattern, expect("{"), pushlex("}"), commasep(enummember, "}"), poplex, poplex); - } - function enummember() { - return pass(pattern, maybeAssign); - } - function isContinuedStatement(state, textAfter) { - return state.lastType == "operator" || state.lastType == "," || isOperatorChar.test(textAfter.charAt(0)) || /[,.]/.test(textAfter.charAt(0)); - } - function expressionAllowed(stream, state, backUp) { - return state.tokenize == tokenBase && /^(?:operator|sof|keyword [bcd]|case|new|export|default|spread|[\[{}\(,;:]|=>)$/.test(state.lastType) || state.lastType == "quasi" && /\{\s*$/.test(stream.string.slice(0, stream.pos - (backUp || 0))); - } - return { - startState: function (basecolumn) { - var state = { - tokenize: tokenBase, - lastType: "sof", - cc: [], - lexical: new JSLexical((basecolumn || 0) - indentUnit, 0, "block", false), - localVars: parserConfig.localVars, - context: parserConfig.localVars && new Context(null, null, false), - indented: basecolumn || 0 - }; - if (parserConfig.globalVars && typeof parserConfig.globalVars == "object") state.globalVars = parserConfig.globalVars; - return state; - }, - token: function (stream, state) { - if (stream.sol()) { - if (!state.lexical.hasOwnProperty("align")) state.lexical.align = false; - state.indented = stream.indentation(); - findFatArrow(stream, state); - } - if (state.tokenize != tokenComment && stream.eatSpace()) return null; - var style = state.tokenize(stream, state); - if (type == "comment") return style; - state.lastType = type == "operator" && (content == "++" || content == "--") ? "incdec" : type; - return parseJS(state, style, type, content, stream); - }, - indent: function (state, textAfter) { - if (state.tokenize == tokenComment || state.tokenize == tokenQuasi) return CodeMirror.Pass; - if (state.tokenize != tokenBase) return 0; - var firstChar = textAfter && textAfter.charAt(0), - lexical = state.lexical, - top; - if (!/^\s*else\b/.test(textAfter)) for (var i = state.cc.length - 1; i >= 0; --i) { - var c = state.cc[i]; - if (c == poplex) lexical = lexical.prev;else if (c != maybeelse && c != popcontext) break; - } - while ((lexical.type == "stat" || lexical.type == "form") && (firstChar == "}" || (top = state.cc[state.cc.length - 1]) && (top == maybeoperatorComma || top == maybeoperatorNoComma) && !/^[,\.=+\-*:?[\(]/.test(textAfter))) lexical = lexical.prev; - if (statementIndent && lexical.type == ")" && lexical.prev.type == "stat") lexical = lexical.prev; - var type2 = lexical.type, - closing = firstChar == type2; - if (type2 == "vardef") return lexical.indented + (state.lastType == "operator" || state.lastType == "," ? lexical.info.length + 1 : 0);else if (type2 == "form" && firstChar == "{") return lexical.indented;else if (type2 == "form") return lexical.indented + indentUnit;else if (type2 == "stat") return lexical.indented + (isContinuedStatement(state, textAfter) ? statementIndent || indentUnit : 0);else if (lexical.info == "switch" && !closing && parserConfig.doubleIndentSwitch != false) return lexical.indented + (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit);else if (lexical.align) return lexical.column + (closing ? 0 : 1);else return lexical.indented + (closing ? 0 : indentUnit); - }, - electricInput: /^\s*(?:case .*?:|default:|\{|\})$/, - blockCommentStart: jsonMode ? null : "/*", - blockCommentEnd: jsonMode ? null : "*/", - blockCommentContinue: jsonMode ? null : " * ", - lineComment: jsonMode ? null : "//", - fold: "brace", - closeBrackets: "()[]{}''\"\"``", - helperType: jsonMode ? "json" : "javascript", - jsonldMode, - jsonMode, - expressionAllowed, - skipExpression: function (state) { - parseJS(state, "atom", "atom", "true", new CodeMirror.StringStream("", 2, null)); - } - }; - }); - CodeMirror.registerHelper("wordChars", "javascript", /[\w$]/); - CodeMirror.defineMIME("text/javascript", "javascript"); - CodeMirror.defineMIME("text/ecmascript", "javascript"); - CodeMirror.defineMIME("application/javascript", "javascript"); - CodeMirror.defineMIME("application/x-javascript", "javascript"); - CodeMirror.defineMIME("application/ecmascript", "javascript"); - CodeMirror.defineMIME("application/json", { - name: "javascript", - json: true - }); - CodeMirror.defineMIME("application/x-json", { - name: "javascript", - json: true - }); - CodeMirror.defineMIME("application/manifest+json", { - name: "javascript", - json: true - }); - CodeMirror.defineMIME("application/ld+json", { - name: "javascript", - jsonld: true - }); - CodeMirror.defineMIME("text/typescript", { - name: "javascript", - typescript: true - }); - CodeMirror.defineMIME("application/typescript", { - name: "javascript", - typescript: true - }); - }); -})(); -var javascriptExports = javascript$2.exports; -const javascript = /* @__PURE__ */codemirror.getDefaultExportFromCjs(javascriptExports); -const javascript$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: javascript -}, [javascriptExports]); -exports.javascript = javascript$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/jump-to-line.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/jump-to-line.cjs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const dialog = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var jumpToLine$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror(), dialog.dialogExports); - })(function (CodeMirror) { - CodeMirror.defineOption("search", { - bottom: false - }); - function dialog2(cm, text, shortText, deflt, f) { - if (cm.openDialog) cm.openDialog(text, f, { - value: deflt, - selectValueOnOpen: true, - bottom: cm.options.search.bottom - });else f(prompt(shortText, deflt)); - } - function getJumpDialog(cm) { - return cm.phrase("Jump to line:") + ' ' + cm.phrase("(Use line:column or scroll% syntax)") + ""; - } - function interpretLine(cm, string) { - var num = Number(string); - if (/^[-+]/.test(string)) return cm.getCursor().line + num;else return num - 1; - } - CodeMirror.commands.jumpToLine = function (cm) { - var cur = cm.getCursor(); - dialog2(cm, getJumpDialog(cm), cm.phrase("Jump to line:"), cur.line + 1 + ":" + cur.ch, function (posStr) { - if (!posStr) return; - var match; - if (match = /^\s*([\+\-]?\d+)\s*\:\s*(\d+)\s*$/.exec(posStr)) { - cm.setCursor(interpretLine(cm, match[1]), Number(match[2])); - } else if (match = /^\s*([\+\-]?\d+(\.\d+)?)\%\s*/.exec(posStr)) { - var line = Math.round(cm.lineCount() * Number(match[1]) / 100); - if (/^[-+]/.test(match[1])) line = cur.line + line + 1; - cm.setCursor(line - 1, cur.ch); - } else if (match = /^\s*\:?\s*([\+\-]?\d+)\s*/.exec(posStr)) { - cm.setCursor(interpretLine(cm, match[1]), cur.ch); - } - }); - }; - CodeMirror.keyMap["default"]["Alt-G"] = "jumpToLine"; - }); -})(); -var jumpToLineExports = jumpToLine$2.exports; -const jumpToLine = /* @__PURE__ */codemirror.getDefaultExportFromCjs(jumpToLineExports); -const jumpToLine$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: jumpToLine -}, [jumpToLineExports]); -exports.jumpToLine = jumpToLine$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/jump.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/jump.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const SchemaReference = __webpack_require__(/*! ./SchemaReference.cjs.js */ "../../graphiql-react/dist/SchemaReference.cjs.js"); -codemirror.CodeMirror.defineOption("jump", false, (cm, options, old) => { - if (old && old !== codemirror.CodeMirror.Init) { - const oldOnMouseOver = cm.state.jump.onMouseOver; - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseover", oldOnMouseOver); - const oldOnMouseOut = cm.state.jump.onMouseOut; - codemirror.CodeMirror.off(cm.getWrapperElement(), "mouseout", oldOnMouseOut); - codemirror.CodeMirror.off(document, "keydown", cm.state.jump.onKeyDown); - delete cm.state.jump; - } - if (options) { - const state = cm.state.jump = { - options, - onMouseOver: onMouseOver.bind(null, cm), - onMouseOut: onMouseOut.bind(null, cm), - onKeyDown: onKeyDown.bind(null, cm) - }; - codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); - codemirror.CodeMirror.on(cm.getWrapperElement(), "mouseout", state.onMouseOut); - codemirror.CodeMirror.on(document, "keydown", state.onKeyDown); - } -}); -function onMouseOver(cm, event) { - const target = event.target || event.srcElement; - if (!(target instanceof HTMLElement)) { - return; - } - if ((target === null || target === void 0 ? void 0 : target.nodeName) !== "SPAN") { - return; - } - const box = target.getBoundingClientRect(); - const cursor = { - left: (box.left + box.right) / 2, - top: (box.top + box.bottom) / 2 - }; - cm.state.jump.cursor = cursor; - if (cm.state.jump.isHoldingModifier) { - enableJumpMode(cm); - } -} -function onMouseOut(cm) { - if (!cm.state.jump.isHoldingModifier && cm.state.jump.cursor) { - cm.state.jump.cursor = null; - return; - } - if (cm.state.jump.isHoldingModifier && cm.state.jump.marker) { - disableJumpMode(cm); - } -} -function onKeyDown(cm, event) { - if (cm.state.jump.isHoldingModifier || !isJumpModifier(event.key)) { - return; - } - cm.state.jump.isHoldingModifier = true; - if (cm.state.jump.cursor) { - enableJumpMode(cm); - } - const onKeyUp = upEvent => { - if (upEvent.code !== event.code) { - return; - } - cm.state.jump.isHoldingModifier = false; - if (cm.state.jump.marker) { - disableJumpMode(cm); - } - codemirror.CodeMirror.off(document, "keyup", onKeyUp); - codemirror.CodeMirror.off(document, "click", onClick); - cm.off("mousedown", onMouseDown); - }; - const onClick = clickEvent => { - const { - destination, - options - } = cm.state.jump; - if (destination) { - options.onClick(destination, clickEvent); - } - }; - const onMouseDown = (_, downEvent) => { - if (cm.state.jump.destination) { - downEvent.codemirrorIgnore = true; - } - }; - codemirror.CodeMirror.on(document, "keyup", onKeyUp); - codemirror.CodeMirror.on(document, "click", onClick); - cm.on("mousedown", onMouseDown); -} -const isMac = typeof navigator !== "undefined" && navigator.userAgent.includes("Mac"); -function isJumpModifier(key) { - return key === (isMac ? "Meta" : "Control"); -} -function enableJumpMode(cm) { - if (cm.state.jump.marker) { - return; - } - const { - cursor, - options - } = cm.state.jump; - const pos = cm.coordsChar(cursor); - const token = cm.getTokenAt(pos, true); - const getDestination = options.getDestination || cm.getHelper(pos, "jump"); - if (getDestination) { - const destination = getDestination(token, options, cm); - if (destination) { - const marker = cm.markText({ - line: pos.line, - ch: token.start - }, { - line: pos.line, - ch: token.end - }, { - className: "CodeMirror-jump-token" - }); - cm.state.jump.marker = marker; - cm.state.jump.destination = destination; - } - } -} -function disableJumpMode(cm) { - const { - marker - } = cm.state.jump; - cm.state.jump.marker = null; - cm.state.jump.destination = null; - marker.clear(); -} -codemirror.CodeMirror.registerHelper("jump", "graphql", (token, options) => { - if (!options.schema || !options.onClick || !token.state) { - return; - } - const { - state - } = token; - const { - kind, - step - } = state; - const typeInfo = SchemaReference.getTypeInfo(options.schema, state); - if (kind === "Field" && step === 0 && typeInfo.fieldDef || kind === "AliasedField" && step === 2 && typeInfo.fieldDef) { - return SchemaReference.getFieldReference(typeInfo); - } - if (kind === "Directive" && step === 1 && typeInfo.directiveDef) { - return SchemaReference.getDirectiveReference(typeInfo); - } - if (kind === "Argument" && step === 0 && typeInfo.argDef) { - return SchemaReference.getArgumentReference(typeInfo); - } - if (kind === "EnumValue" && typeInfo.enumValue) { - return SchemaReference.getEnumValueReference(typeInfo); - } - if (kind === "NamedType" && typeInfo.type) { - return SchemaReference.getTypeReference(typeInfo); - } -}); - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var lint$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var GUTTER_ID = "CodeMirror-lint-markers"; - var LINT_LINE_ID = "CodeMirror-lint-line-"; - function showTooltip(cm, e, content) { - var tt = document.createElement("div"); - tt.className = "CodeMirror-lint-tooltip cm-s-" + cm.options.theme; - tt.appendChild(content.cloneNode(true)); - if (cm.state.lint.options.selfContain) cm.getWrapperElement().appendChild(tt);else document.body.appendChild(tt); - function position(e2) { - if (!tt.parentNode) return CodeMirror.off(document, "mousemove", position); - tt.style.top = Math.max(0, e2.clientY - tt.offsetHeight - 5) + "px"; - tt.style.left = e2.clientX + 5 + "px"; - } - CodeMirror.on(document, "mousemove", position); - position(e); - if (tt.style.opacity != null) tt.style.opacity = 1; - return tt; - } - function rm(elt) { - if (elt.parentNode) elt.parentNode.removeChild(elt); - } - function hideTooltip(tt) { - if (!tt.parentNode) return; - if (tt.style.opacity == null) rm(tt); - tt.style.opacity = 0; - setTimeout(function () { - rm(tt); - }, 600); - } - function showTooltipFor(cm, e, content, node) { - var tooltip = showTooltip(cm, e, content); - function hide() { - CodeMirror.off(node, "mouseout", hide); - if (tooltip) { - hideTooltip(tooltip); - tooltip = null; - } - } - var poll = setInterval(function () { - if (tooltip) for (var n = node;; n = n.parentNode) { - if (n && n.nodeType == 11) n = n.host; - if (n == document.body) return; - if (!n) { - hide(); - break; - } - } - if (!tooltip) return clearInterval(poll); - }, 400); - CodeMirror.on(node, "mouseout", hide); - } - function LintState(cm, conf, hasGutter) { - this.marked = []; - if (conf instanceof Function) conf = { - getAnnotations: conf - }; - if (!conf || conf === true) conf = {}; - this.options = {}; - this.linterOptions = conf.options || {}; - for (var prop in defaults) this.options[prop] = defaults[prop]; - for (var prop in conf) { - if (defaults.hasOwnProperty(prop)) { - if (conf[prop] != null) this.options[prop] = conf[prop]; - } else if (!conf.options) { - this.linterOptions[prop] = conf[prop]; - } - } - this.timeout = null; - this.hasGutter = hasGutter; - this.onMouseOver = function (e) { - onMouseOver(cm, e); - }; - this.waitingFor = 0; - } - var defaults = { - highlightLines: false, - tooltips: true, - delay: 500, - lintOnChange: true, - getAnnotations: null, - async: false, - selfContain: null, - formatAnnotation: null, - onUpdateLinting: null - }; - function clearMarks(cm) { - var state = cm.state.lint; - if (state.hasGutter) cm.clearGutter(GUTTER_ID); - if (state.options.highlightLines) clearErrorLines(cm); - for (var i = 0; i < state.marked.length; ++i) state.marked[i].clear(); - state.marked.length = 0; - } - function clearErrorLines(cm) { - cm.eachLine(function (line) { - var has = line.wrapClass && /\bCodeMirror-lint-line-\w+\b/.exec(line.wrapClass); - if (has) cm.removeLineClass(line, "wrap", has[0]); - }); - } - function makeMarker(cm, labels, severity, multiple, tooltips) { - var marker = document.createElement("div"), - inner = marker; - marker.className = "CodeMirror-lint-marker CodeMirror-lint-marker-" + severity; - if (multiple) { - inner = marker.appendChild(document.createElement("div")); - inner.className = "CodeMirror-lint-marker CodeMirror-lint-marker-multiple"; - } - if (tooltips != false) CodeMirror.on(inner, "mouseover", function (e) { - showTooltipFor(cm, e, labels, inner); - }); - return marker; - } - function getMaxSeverity(a, b) { - if (a == "error") return a;else return b; - } - function groupByLine(annotations) { - var lines = []; - for (var i = 0; i < annotations.length; ++i) { - var ann = annotations[i], - line = ann.from.line; - (lines[line] || (lines[line] = [])).push(ann); - } - return lines; - } - function annotationTooltip(ann) { - var severity = ann.severity; - if (!severity) severity = "error"; - var tip = document.createElement("div"); - tip.className = "CodeMirror-lint-message CodeMirror-lint-message-" + severity; - if (typeof ann.messageHTML != "undefined") { - tip.innerHTML = ann.messageHTML; - } else { - tip.appendChild(document.createTextNode(ann.message)); - } - return tip; - } - function lintAsync(cm, getAnnotations) { - var state = cm.state.lint; - var id = ++state.waitingFor; - function abort() { - id = -1; - cm.off("change", abort); - } - cm.on("change", abort); - getAnnotations(cm.getValue(), function (annotations, arg2) { - cm.off("change", abort); - if (state.waitingFor != id) return; - if (arg2 && annotations instanceof CodeMirror) annotations = arg2; - cm.operation(function () { - updateLinting(cm, annotations); - }); - }, state.linterOptions, cm); - } - function startLinting(cm) { - var state = cm.state.lint; - if (!state) return; - var options = state.options; - var getAnnotations = options.getAnnotations || cm.getHelper(CodeMirror.Pos(0, 0), "lint"); - if (!getAnnotations) return; - if (options.async || getAnnotations.async) { - lintAsync(cm, getAnnotations); - } else { - var annotations = getAnnotations(cm.getValue(), state.linterOptions, cm); - if (!annotations) return; - if (annotations.then) annotations.then(function (issues) { - cm.operation(function () { - updateLinting(cm, issues); - }); - });else cm.operation(function () { - updateLinting(cm, annotations); - }); - } - } - function updateLinting(cm, annotationsNotSorted) { - var state = cm.state.lint; - if (!state) return; - var options = state.options; - clearMarks(cm); - var annotations = groupByLine(annotationsNotSorted); - for (var line = 0; line < annotations.length; ++line) { - var anns = annotations[line]; - if (!anns) continue; - var message = []; - anns = anns.filter(function (item) { - return message.indexOf(item.message) > -1 ? false : message.push(item.message); - }); - var maxSeverity = null; - var tipLabel = state.hasGutter && document.createDocumentFragment(); - for (var i = 0; i < anns.length; ++i) { - var ann = anns[i]; - var severity = ann.severity; - if (!severity) severity = "error"; - maxSeverity = getMaxSeverity(maxSeverity, severity); - if (options.formatAnnotation) ann = options.formatAnnotation(ann); - if (state.hasGutter) tipLabel.appendChild(annotationTooltip(ann)); - if (ann.to) state.marked.push(cm.markText(ann.from, ann.to, { - className: "CodeMirror-lint-mark CodeMirror-lint-mark-" + severity, - __annotation: ann - })); - } - if (state.hasGutter) cm.setGutterMarker(line, GUTTER_ID, makeMarker(cm, tipLabel, maxSeverity, annotations[line].length > 1, options.tooltips)); - if (options.highlightLines) cm.addLineClass(line, "wrap", LINT_LINE_ID + maxSeverity); - } - if (options.onUpdateLinting) options.onUpdateLinting(annotationsNotSorted, annotations, cm); - } - function onChange(cm) { - var state = cm.state.lint; - if (!state) return; - clearTimeout(state.timeout); - state.timeout = setTimeout(function () { - startLinting(cm); - }, state.options.delay); - } - function popupTooltips(cm, annotations, e) { - var target = e.target || e.srcElement; - var tooltip = document.createDocumentFragment(); - for (var i = 0; i < annotations.length; i++) { - var ann = annotations[i]; - tooltip.appendChild(annotationTooltip(ann)); - } - showTooltipFor(cm, e, tooltip, target); - } - function onMouseOver(cm, e) { - var target = e.target || e.srcElement; - if (!/\bCodeMirror-lint-mark-/.test(target.className)) return; - var box = target.getBoundingClientRect(), - x = (box.left + box.right) / 2, - y = (box.top + box.bottom) / 2; - var spans = cm.findMarksAt(cm.coordsChar({ - left: x, - top: y - }, "client")); - var annotations = []; - for (var i = 0; i < spans.length; ++i) { - var ann = spans[i].__annotation; - if (ann) annotations.push(ann); - } - if (annotations.length) popupTooltips(cm, annotations, e); - } - CodeMirror.defineOption("lint", false, function (cm, val, old) { - if (old && old != CodeMirror.Init) { - clearMarks(cm); - if (cm.state.lint.options.lintOnChange !== false) cm.off("change", onChange); - CodeMirror.off(cm.getWrapperElement(), "mouseover", cm.state.lint.onMouseOver); - clearTimeout(cm.state.lint.timeout); - delete cm.state.lint; - } - if (val) { - var gutters = cm.getOption("gutters"), - hasLintGutter = false; - for (var i = 0; i < gutters.length; ++i) if (gutters[i] == GUTTER_ID) hasLintGutter = true; - var state = cm.state.lint = new LintState(cm, val, hasLintGutter); - if (state.options.lintOnChange) cm.on("change", onChange); - if (state.options.tooltips != false && state.options.tooltips != "gutter") CodeMirror.on(cm.getWrapperElement(), "mouseover", state.onMouseOver); - startLinting(cm); - } - }); - CodeMirror.defineExtension("performLint", function () { - startLinting(this); - }); - }); -})(); -var lintExports = lint$2.exports; -const lint = /* @__PURE__ */codemirror.getDefaultExportFromCjs(lintExports); -const lint$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: lint -}, [lintExports]); -exports.lint = lint$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -const SEVERITY = ["error", "warning", "information", "hint"]; -const TYPE = { - "GraphQL: Validation": "validation", - "GraphQL: Deprecation": "deprecation", - "GraphQL: Syntax": "syntax" -}; -codemirror.CodeMirror.registerHelper("lint", "graphql", (text, options) => { - const { - schema, - validationRules, - externalFragments - } = options; - const rawResults = graphqlLanguageService.getDiagnostics(text, schema, validationRules, void 0, externalFragments); - const results = rawResults.map(error => ({ - message: error.message, - severity: error.severity ? SEVERITY[error.severity - 1] : SEVERITY[0], - type: error.source ? TYPE[error.source] : void 0, - from: codemirror.CodeMirror.Pos(error.range.start.line, error.range.start.character), - to: codemirror.CodeMirror.Pos(error.range.end.line, error.range.end.character) - })); - return results; -}); - -/***/ }), - -/***/ "../../graphiql-react/dist/lint.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/lint.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphql = __webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs"); -function jsonParse(str) { - string = str; - strLen = str.length; - start = end = lastEnd = -1; - ch(); - lex(); - const ast = parseObj(); - expect("EOF"); - return ast; -} -let string; -let strLen; -let start; -let end; -let lastEnd; -let code; -let kind; -function parseObj() { - const nodeStart = start; - const members = []; - expect("{"); - if (!skip("}")) { - do { - members.push(parseMember()); - } while (skip(",")); - expect("}"); - } - return { - kind: "Object", - start: nodeStart, - end: lastEnd, - members - }; -} -function parseMember() { - const nodeStart = start; - const key = kind === "String" ? curToken() : null; - expect("String"); - expect(":"); - const value = parseVal(); - return { - kind: "Member", - start: nodeStart, - end: lastEnd, - key, - value - }; -} -function parseArr() { - const nodeStart = start; - const values = []; - expect("["); - if (!skip("]")) { - do { - values.push(parseVal()); - } while (skip(",")); - expect("]"); - } - return { - kind: "Array", - start: nodeStart, - end: lastEnd, - values - }; -} -function parseVal() { - switch (kind) { - case "[": - return parseArr(); - case "{": - return parseObj(); - case "String": - case "Number": - case "Boolean": - case "Null": - const token = curToken(); - lex(); - return token; - } - expect("Value"); -} -function curToken() { - return { - kind, - start, - end, - value: JSON.parse(string.slice(start, end)) - }; -} -function expect(str) { - if (kind === str) { - lex(); - return; - } - let found; - if (kind === "EOF") { - found = "[end of file]"; - } else if (end - start > 1) { - found = "`" + string.slice(start, end) + "`"; - } else { - const match = string.slice(start).match(/^.+?\b/); - found = "`" + (match ? match[0] : string[start]) + "`"; - } - throw syntaxError(`Expected ${str} but found ${found}.`); -} -class JSONSyntaxError extends Error { - constructor(message, position) { - super(message); - this.position = position; - } -} -function syntaxError(message) { - return new JSONSyntaxError(message, { - start, - end - }); -} -function skip(k) { - if (kind === k) { - lex(); - return true; - } -} -function ch() { - if (end < strLen) { - end++; - code = end === strLen ? 0 : string.charCodeAt(end); - } - return code; -} -function lex() { - lastEnd = end; - while (code === 9 || code === 10 || code === 13 || code === 32) { - ch(); - } - if (code === 0) { - kind = "EOF"; - return; - } - start = end; - switch (code) { - case 34: - kind = "String"; - return readString(); - case 45: - case 48: - case 49: - case 50: - case 51: - case 52: - case 53: - case 54: - case 55: - case 56: - case 57: - kind = "Number"; - return readNumber(); - case 102: - if (string.slice(start, start + 5) !== "false") { - break; - } - end += 4; - ch(); - kind = "Boolean"; - return; - case 110: - if (string.slice(start, start + 4) !== "null") { - break; - } - end += 3; - ch(); - kind = "Null"; - return; - case 116: - if (string.slice(start, start + 4) !== "true") { - break; - } - end += 3; - ch(); - kind = "Boolean"; - return; - } - kind = string[start]; - ch(); -} -function readString() { - ch(); - while (code !== 34 && code > 31) { - if (code === 92) { - code = ch(); - switch (code) { - case 34: - case 47: - case 92: - case 98: - case 102: - case 110: - case 114: - case 116: - ch(); - break; - case 117: - ch(); - readHex(); - readHex(); - readHex(); - readHex(); - break; - default: - throw syntaxError("Bad character escape sequence."); - } - } else if (end === strLen) { - throw syntaxError("Unterminated string."); - } else { - ch(); - } - } - if (code === 34) { - ch(); - return; - } - throw syntaxError("Unterminated string."); -} -function readHex() { - if (code >= 48 && code <= 57 || code >= 65 && code <= 70 || code >= 97 && code <= 102) { - return ch(); - } - throw syntaxError("Expected hexadecimal digit."); -} -function readNumber() { - if (code === 45) { - ch(); - } - if (code === 48) { - ch(); - } else { - readDigits(); - } - if (code === 46) { - ch(); - readDigits(); - } - if (code === 69 || code === 101) { - code = ch(); - if (code === 43 || code === 45) { - ch(); - } - readDigits(); - } -} -function readDigits() { - if (code < 48 || code > 57) { - throw syntaxError("Expected decimal digit."); - } - do { - ch(); - } while (code >= 48 && code <= 57); -} -codemirror.CodeMirror.registerHelper("lint", "graphql-variables", (text, options, editor) => { - if (!text) { - return []; - } - let ast; - try { - ast = jsonParse(text); - } catch (error) { - if (error instanceof JSONSyntaxError) { - return [lintError(editor, error.position, error.message)]; - } - throw error; - } - const { - variableToType - } = options; - if (!variableToType) { - return []; - } - return validateVariables(editor, variableToType, ast); -}); -function validateVariables(editor, variableToType, variablesAST) { - var _a; - const errors = []; - for (const member of variablesAST.members) { - if (member) { - const variableName = (_a = member.key) === null || _a === void 0 ? void 0 : _a.value; - const type = variableToType[variableName]; - if (type) { - for (const [node, message] of validateValue(type, member.value)) { - errors.push(lintError(editor, node, message)); - } - } else { - errors.push(lintError(editor, member.key, `Variable "$${variableName}" does not appear in any GraphQL query.`)); - } - } - } - return errors; -} -function validateValue(type, valueAST) { - if (!type || !valueAST) { - return []; - } - if (type instanceof graphql.GraphQLNonNull) { - if (valueAST.kind === "Null") { - return [[valueAST, `Type "${type}" is non-nullable and cannot be null.`]]; - } - return validateValue(type.ofType, valueAST); - } - if (valueAST.kind === "Null") { - return []; - } - if (type instanceof graphql.GraphQLList) { - const itemType = type.ofType; - if (valueAST.kind === "Array") { - const values = valueAST.values || []; - return mapCat(values, item => validateValue(itemType, item)); - } - return validateValue(itemType, valueAST); - } - if (type instanceof graphql.GraphQLInputObjectType) { - if (valueAST.kind !== "Object") { - return [[valueAST, `Type "${type}" must be an Object.`]]; - } - const providedFields = /* @__PURE__ */Object.create(null); - const fieldErrors = mapCat(valueAST.members, member => { - var _a; - const fieldName = (_a = member === null || member === void 0 ? void 0 : member.key) === null || _a === void 0 ? void 0 : _a.value; - providedFields[fieldName] = true; - const inputField = type.getFields()[fieldName]; - if (!inputField) { - return [[member.key, `Type "${type}" does not have a field "${fieldName}".`]]; - } - const fieldType = inputField ? inputField.type : void 0; - return validateValue(fieldType, member.value); - }); - for (const fieldName of Object.keys(type.getFields())) { - const field = type.getFields()[fieldName]; - if (!providedFields[fieldName] && field.type instanceof graphql.GraphQLNonNull && !field.defaultValue) { - fieldErrors.push([valueAST, `Object of type "${type}" is missing required field "${fieldName}".`]); - } - } - return fieldErrors; - } - if (type.name === "Boolean" && valueAST.kind !== "Boolean" || type.name === "String" && valueAST.kind !== "String" || type.name === "ID" && valueAST.kind !== "Number" && valueAST.kind !== "String" || type.name === "Float" && valueAST.kind !== "Number" || type.name === "Int" && (valueAST.kind !== "Number" || (valueAST.value | 0) !== valueAST.value)) { - return [[valueAST, `Expected value of type "${type}".`]]; - } - if ((type instanceof graphql.GraphQLEnumType || type instanceof graphql.GraphQLScalarType) && (valueAST.kind !== "String" && valueAST.kind !== "Number" && valueAST.kind !== "Boolean" && valueAST.kind !== "Null" || isNullish(type.parseValue(valueAST.value)))) { - return [[valueAST, `Expected value of type "${type}".`]]; - } - return []; -} -function lintError(editor, node, message) { - return { - message, - severity: "error", - type: "validation", - from: editor.posFromIndex(node.start), - to: editor.posFromIndex(node.end) - }; -} -function isNullish(value) { - return value === null || value === void 0 || value !== value; -} -function mapCat(array, mapper) { - return Array.prototype.concat.apply([], array.map(mapper)); -} - -/***/ }), - -/***/ "../../graphiql-react/dist/matchbrackets.cjs.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const matchbrackets$2 = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var matchbracketsExports = matchbrackets$2.requireMatchbrackets(); -const matchbrackets = /* @__PURE__ */codemirror.getDefaultExportFromCjs(matchbracketsExports); -const matchbrackets$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: matchbrackets -}, [matchbracketsExports]); -exports.matchbrackets = matchbrackets$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/matchbrackets.cjs2.js": -/*!*******************************************************!*\ - !*** ../../graphiql-react/dist/matchbrackets.cjs2.js ***! - \*******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var matchbrackets = { - exports: {} -}; -var hasRequiredMatchbrackets; -function requireMatchbrackets() { - if (hasRequiredMatchbrackets) return matchbrackets.exports; - hasRequiredMatchbrackets = 1; - (function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && (document.documentMode == null || document.documentMode < 8); - var Pos = CodeMirror.Pos; - var matching = { - "(": ")>", - ")": "(<", - "[": "]>", - "]": "[<", - "{": "}>", - "}": "{<", - "<": ">>", - ">": "<<" - }; - function bracketRegex(config) { - return config && config.bracketRegex || /[(){}[\]]/; - } - function findMatchingBracket(cm, where, config) { - var line = cm.getLineHandle(where.line), - pos = where.ch - 1; - var afterCursor = config && config.afterCursor; - if (afterCursor == null) afterCursor = /(^| )cm-fat-cursor($| )/.test(cm.getWrapperElement().className); - var re = bracketRegex(config); - var match = !afterCursor && pos >= 0 && re.test(line.text.charAt(pos)) && matching[line.text.charAt(pos)] || re.test(line.text.charAt(pos + 1)) && matching[line.text.charAt(++pos)]; - if (!match) return null; - var dir = match.charAt(1) == ">" ? 1 : -1; - if (config && config.strict && dir > 0 != (pos == where.ch)) return null; - var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); - var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style, config); - if (found == null) return null; - return { - from: Pos(where.line, pos), - to: found && found.pos, - match: found && found.ch == match.charAt(0), - forward: dir > 0 - }; - } - function scanForBracket(cm, where, dir, style, config) { - var maxScanLen = config && config.maxScanLineLength || 1e4; - var maxScanLines = config && config.maxScanLines || 1e3; - var stack = []; - var re = bracketRegex(config); - var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) : Math.max(cm.firstLine() - 1, where.line - maxScanLines); - for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { - var line = cm.getLine(lineNo); - if (!line) continue; - var pos = dir > 0 ? 0 : line.length - 1, - end = dir > 0 ? line.length : -1; - if (line.length > maxScanLen) continue; - if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); - for (; pos != end; pos += dir) { - var ch = line.charAt(pos); - if (re.test(ch) && (style === void 0 || (cm.getTokenTypeAt(Pos(lineNo, pos + 1)) || "") == (style || ""))) { - var match = matching[ch]; - if (match && match.charAt(1) == ">" == dir > 0) stack.push(ch);else if (!stack.length) return { - pos: Pos(lineNo, pos), - ch - };else stack.pop(); - } - } - } - return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; - } - function matchBrackets(cm, autoclear, config) { - var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1e3, - highlightNonMatching = config && config.highlightNonMatching; - var marks = [], - ranges = cm.listSelections(); - for (var i = 0; i < ranges.length; i++) { - var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, config); - if (match && (match.match || highlightNonMatching !== false) && cm.getLine(match.from.line).length <= maxHighlightLen) { - var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; - marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), { - className: style - })); - if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), { - className: style - })); - } - } - if (marks.length) { - if (ie_lt8 && cm.state.focused) cm.focus(); - var clear = function () { - cm.operation(function () { - for (var i2 = 0; i2 < marks.length; i2++) marks[i2].clear(); - }); - }; - if (autoclear) setTimeout(clear, 800);else return clear; - } - } - function doMatchBrackets(cm) { - cm.operation(function () { - if (cm.state.matchBrackets.currentlyHighlighted) { - cm.state.matchBrackets.currentlyHighlighted(); - cm.state.matchBrackets.currentlyHighlighted = null; - } - cm.state.matchBrackets.currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); - }); - } - function clearHighlighted(cm) { - if (cm.state.matchBrackets && cm.state.matchBrackets.currentlyHighlighted) { - cm.state.matchBrackets.currentlyHighlighted(); - cm.state.matchBrackets.currentlyHighlighted = null; - } - } - CodeMirror.defineOption("matchBrackets", false, function (cm, val, old) { - if (old && old != CodeMirror.Init) { - cm.off("cursorActivity", doMatchBrackets); - cm.off("focus", doMatchBrackets); - cm.off("blur", clearHighlighted); - clearHighlighted(cm); - } - if (val) { - cm.state.matchBrackets = typeof val == "object" ? val : {}; - cm.on("cursorActivity", doMatchBrackets); - cm.on("focus", doMatchBrackets); - cm.on("blur", clearHighlighted); - } - }); - CodeMirror.defineExtension("matchBrackets", function () { - matchBrackets(this, true); - }); - CodeMirror.defineExtension("findMatchingBracket", function (pos, config, oldConfig) { - if (oldConfig || typeof config == "boolean") { - if (!oldConfig) { - config = config ? { - strict: true - } : null; - } else { - oldConfig.strict = config; - config = oldConfig; - } - } - return findMatchingBracket(this, pos, config); - }); - CodeMirror.defineExtension("scanForBracket", function (pos, dir, style, config) { - return scanForBracket(this, pos, dir, style, config); - }); - }); - })(); - return matchbrackets.exports; -} -exports.requireMatchbrackets = requireMatchbrackets; - -/***/ }), - -/***/ "../../graphiql-react/dist/mode-indent.cjs.js": -/*!****************************************************!*\ - !*** ../../graphiql-react/dist/mode-indent.cjs.js ***! - \****************************************************/ -/***/ (function(__unused_webpack_module, exports) { - - - -function indent(state, textAfter) { - var _a, _b; - const { - levels, - indentLevel - } = state; - const level = !levels || levels.length === 0 ? indentLevel : levels.at(-1) - (((_a = this.electricInput) === null || _a === void 0 ? void 0 : _a.test(textAfter)) ? 1 : 0); - return (level || 0) * (((_b = this.config) === null || _b === void 0 ? void 0 : _b.indentUnit) || 0); -} -exports.indent = indent; - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs.js": -/*!*********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs.js ***! - \*********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -const graphqlModeFactory = config => { - const parser = graphqlLanguageService.onlineParser({ - eatWhitespace: stream => stream.eatWhile(graphqlLanguageService.isIgnored), - lexRules: graphqlLanguageService.LexRules, - parseRules: graphqlLanguageService.ParseRules, - editorConfig: { - tabSize: config.tabSize - } - }); - return { - config, - startState: parser.startState, - token: parser.token, - indent: modeIndent.indent, - electricInput: /^\s*[})\]]/, - fold: "brace", - lineComment: "#", - closeBrackets: { - pairs: '()[]{}""', - explode: "()[]{}" - } - }; -}; -codemirror.CodeMirror.defineMode("graphql", graphqlModeFactory); - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs2.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs2.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -codemirror.CodeMirror.defineMode("graphql-variables", config => { - const parser = graphqlLanguageService.onlineParser({ - eatWhitespace: stream => stream.eatSpace(), - lexRules: LexRules, - parseRules: ParseRules, - editorConfig: { - tabSize: config.tabSize - } - }); - return { - config, - startState: parser.startState, - token: parser.token, - indent: modeIndent.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } - }; -}); -const LexRules = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ -}; -const ParseRules = { - Document: [graphqlLanguageService.p("{"), graphqlLanguageService.list("Variable", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("}")], - Variable: [namedKey("variable"), graphqlLanguageService.p(":"), "Value"], - Value(token) { - switch (token.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (token.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (token.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [graphqlLanguageService.t("Number", "number")], - StringValue: [graphqlLanguageService.t("String", "string")], - BooleanValue: [graphqlLanguageService.t("Keyword", "builtin")], - NullValue: [graphqlLanguageService.t("Keyword", "keyword")], - ListValue: [graphqlLanguageService.p("["), graphqlLanguageService.list("Value", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("]")], - ObjectValue: [graphqlLanguageService.p("{"), graphqlLanguageService.list("ObjectField", graphqlLanguageService.opt(graphqlLanguageService.p(","))), graphqlLanguageService.p("}")], - ObjectField: [namedKey("attribute"), graphqlLanguageService.p(":"), "Value"] -}; -function namedKey(style) { - return { - style, - match: token => token.kind === "String", - update(state, token) { - state.name = token.value.slice(1, -1); - } - }; -} - -/***/ }), - -/***/ "../../graphiql-react/dist/mode.cjs3.js": -/*!**********************************************!*\ - !*** ../../graphiql-react/dist/mode.cjs3.js ***! - \**********************************************/ -/***/ (function(__unused_webpack_module, __unused_webpack_exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs.js */ "../../graphiql-react/dist/codemirror.cjs.js"); -const graphqlLanguageService = __webpack_require__(/*! graphql-language-service */ "../../graphql-language-service/esm/index.js"); -const modeIndent = __webpack_require__(/*! ./mode-indent.cjs.js */ "../../graphiql-react/dist/mode-indent.cjs.js"); -codemirror.CodeMirror.defineMode("graphql-results", config => { - const parser = graphqlLanguageService.onlineParser({ - eatWhitespace: stream => stream.eatSpace(), - lexRules: LexRules, - parseRules: ParseRules, - editorConfig: { - tabSize: config.tabSize - } - }); - return { - config, - startState: parser.startState, - token: parser.token, - indent: modeIndent.indent, - electricInput: /^\s*[}\]]/, - fold: "brace", - closeBrackets: { - pairs: '[]{}""', - explode: "[]{}" - } - }; -}); -const LexRules = { - Punctuation: /^\[|]|\{|\}|:|,/, - Number: /^-?(?:0|(?:[1-9][0-9]*))(?:\.[0-9]*)?(?:[eE][+-]?[0-9]+)?/, - String: /^"(?:[^"\\]|\\(?:"|\/|\\|b|f|n|r|t|u[0-9a-fA-F]{4}))*"?/, - Keyword: /^true|false|null/ -}; -const ParseRules = { - Document: [graphqlLanguageService.p("{"), graphqlLanguageService.list("Entry", graphqlLanguageService.p(",")), graphqlLanguageService.p("}")], - Entry: [graphqlLanguageService.t("String", "def"), graphqlLanguageService.p(":"), "Value"], - Value(token) { - switch (token.kind) { - case "Number": - return "NumberValue"; - case "String": - return "StringValue"; - case "Punctuation": - switch (token.value) { - case "[": - return "ListValue"; - case "{": - return "ObjectValue"; - } - return null; - case "Keyword": - switch (token.value) { - case "true": - case "false": - return "BooleanValue"; - case "null": - return "NullValue"; - } - return null; - } - }, - NumberValue: [graphqlLanguageService.t("Number", "number")], - StringValue: [graphqlLanguageService.t("String", "string")], - BooleanValue: [graphqlLanguageService.t("Keyword", "builtin")], - NullValue: [graphqlLanguageService.t("Keyword", "keyword")], - ListValue: [graphqlLanguageService.p("["), graphqlLanguageService.list("Value", graphqlLanguageService.p(",")), graphqlLanguageService.p("]")], - ObjectValue: [graphqlLanguageService.p("{"), graphqlLanguageService.list("ObjectField", graphqlLanguageService.p(",")), graphqlLanguageService.p("}")], - ObjectField: [graphqlLanguageService.t("String", "property"), graphqlLanguageService.p(":"), "Value"] -}; - -/***/ }), - -/***/ "../../graphiql-react/dist/search.cjs.js": -/*!***********************************************!*\ - !*** ../../graphiql-react/dist/search.cjs.js ***! - \***********************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const searchcursor = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); -const dialog = __webpack_require__(/*! ./dialog.cjs.js */ "../../graphiql-react/dist/dialog.cjs.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var search$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror(), searchcursor.requireSearchcursor(), dialog.dialogExports); - })(function (CodeMirror) { - CodeMirror.defineOption("search", { - bottom: false - }); - function searchOverlay(query, caseInsensitive) { - if (typeof query == "string") query = new RegExp(query.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&"), caseInsensitive ? "gi" : "g");else if (!query.global) query = new RegExp(query.source, query.ignoreCase ? "gi" : "g"); - return { - token: function (stream) { - query.lastIndex = stream.pos; - var match = query.exec(stream.string); - if (match && match.index == stream.pos) { - stream.pos += match[0].length || 1; - return "searching"; - } else if (match) { - stream.pos = match.index; - } else { - stream.skipToEnd(); - } - } - }; - } - function SearchState() { - this.posFrom = this.posTo = this.lastQuery = this.query = null; - this.overlay = null; - } - function getSearchState(cm) { - return cm.state.search || (cm.state.search = new SearchState()); - } - function queryCaseInsensitive(query) { - return typeof query == "string" && query == query.toLowerCase(); - } - function getSearchCursor(cm, query, pos) { - return cm.getSearchCursor(query, pos, { - caseFold: queryCaseInsensitive(query), - multiline: true - }); - } - function persistentDialog(cm, text, deflt, onEnter, onKeyDown) { - cm.openDialog(text, onEnter, { - value: deflt, - selectValueOnOpen: true, - closeOnEnter: false, - onClose: function () { - clearSearch(cm); - }, - onKeyDown, - bottom: cm.options.search.bottom - }); - } - function dialog2(cm, text, shortText, deflt, f) { - if (cm.openDialog) cm.openDialog(text, f, { - value: deflt, - selectValueOnOpen: true, - bottom: cm.options.search.bottom - });else f(prompt(shortText, deflt)); - } - function confirmDialog(cm, text, shortText, fs) { - if (cm.openConfirm) cm.openConfirm(text, fs);else if (confirm(shortText)) fs[0](); - } - function parseString(string) { - return string.replace(/\\([nrt\\])/g, function (match, ch) { - if (ch == "n") return "\n"; - if (ch == "r") return "\r"; - if (ch == "t") return " "; - if (ch == "\\") return "\\"; - return match; - }); - } - function parseQuery(query) { - var isRE = query.match(/^\/(.*)\/([a-z]*)$/); - if (isRE) { - try { - query = new RegExp(isRE[1], isRE[2].indexOf("i") == -1 ? "" : "i"); - } catch (e) {} - } else { - query = parseString(query); - } - if (typeof query == "string" ? query == "" : query.test("")) query = /x^/; - return query; - } - function startSearch(cm, state, query) { - state.queryText = query; - state.query = parseQuery(query); - cm.removeOverlay(state.overlay, queryCaseInsensitive(state.query)); - state.overlay = searchOverlay(state.query, queryCaseInsensitive(state.query)); - cm.addOverlay(state.overlay); - if (cm.showMatchesOnScrollbar) { - if (state.annotate) { - state.annotate.clear(); - state.annotate = null; - } - state.annotate = cm.showMatchesOnScrollbar(state.query, queryCaseInsensitive(state.query)); - } - } - function doSearch(cm, rev, persistent, immediate) { - var state = getSearchState(cm); - if (state.query) return findNext(cm, rev); - var q = cm.getSelection() || state.lastQuery; - if (q instanceof RegExp && q.source == "x^") q = null; - if (persistent && cm.openDialog) { - var hiding = null; - var searchNext = function (query, event) { - CodeMirror.e_stop(event); - if (!query) return; - if (query != state.queryText) { - startSearch(cm, state, query); - state.posFrom = state.posTo = cm.getCursor(); - } - if (hiding) hiding.style.opacity = 1; - findNext(cm, event.shiftKey, function (_, to) { - var dialog3; - if (to.line < 3 && document.querySelector && (dialog3 = cm.display.wrapper.querySelector(".CodeMirror-dialog")) && dialog3.getBoundingClientRect().bottom - 4 > cm.cursorCoords(to, "window").top) (hiding = dialog3).style.opacity = 0.4; - }); - }; - persistentDialog(cm, getQueryDialog(cm), q, searchNext, function (event, query) { - var keyName = CodeMirror.keyName(event); - var extra = cm.getOption("extraKeys"), - cmd = extra && extra[keyName] || CodeMirror.keyMap[cm.getOption("keyMap")][keyName]; - if (cmd == "findNext" || cmd == "findPrev" || cmd == "findPersistentNext" || cmd == "findPersistentPrev") { - CodeMirror.e_stop(event); - startSearch(cm, getSearchState(cm), query); - cm.execCommand(cmd); - } else if (cmd == "find" || cmd == "findPersistent") { - CodeMirror.e_stop(event); - searchNext(query, event); - } - }); - if (immediate && q) { - startSearch(cm, state, q); - findNext(cm, rev); - } - } else { - dialog2(cm, getQueryDialog(cm), "Search for:", q, function (query) { - if (query && !state.query) cm.operation(function () { - startSearch(cm, state, query); - state.posFrom = state.posTo = cm.getCursor(); - findNext(cm, rev); - }); - }); - } - } - function findNext(cm, rev, callback) { - cm.operation(function () { - var state = getSearchState(cm); - var cursor = getSearchCursor(cm, state.query, rev ? state.posFrom : state.posTo); - if (!cursor.find(rev)) { - cursor = getSearchCursor(cm, state.query, rev ? CodeMirror.Pos(cm.lastLine()) : CodeMirror.Pos(cm.firstLine(), 0)); - if (!cursor.find(rev)) return; - } - cm.setSelection(cursor.from(), cursor.to()); - cm.scrollIntoView({ - from: cursor.from(), - to: cursor.to() - }, 20); - state.posFrom = cursor.from(); - state.posTo = cursor.to(); - if (callback) callback(cursor.from(), cursor.to()); - }); - } - function clearSearch(cm) { - cm.operation(function () { - var state = getSearchState(cm); - state.lastQuery = state.query; - if (!state.query) return; - state.query = state.queryText = null; - cm.removeOverlay(state.overlay); - if (state.annotate) { - state.annotate.clear(); - state.annotate = null; - } - }); - } - function el(tag, attrs) { - var element = tag ? document.createElement(tag) : document.createDocumentFragment(); - for (var key in attrs) { - element[key] = attrs[key]; - } - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - element.appendChild(typeof child == "string" ? document.createTextNode(child) : child); - } - return element; - } - function getQueryDialog(cm) { - return el("", null, el("span", { - className: "CodeMirror-search-label" - }, cm.phrase("Search:")), " ", el("input", { - type: "text", - "style": "width: 10em", - className: "CodeMirror-search-field" - }), " ", el("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, cm.phrase("(Use /re/ syntax for regexp search)"))); - } - function getReplaceQueryDialog(cm) { - return el("", null, " ", el("input", { - type: "text", - "style": "width: 10em", - className: "CodeMirror-search-field" - }), " ", el("span", { - style: "color: #888", - className: "CodeMirror-search-hint" - }, cm.phrase("(Use /re/ syntax for regexp search)"))); - } - function getReplacementQueryDialog(cm) { - return el("", null, el("span", { - className: "CodeMirror-search-label" - }, cm.phrase("With:")), " ", el("input", { - type: "text", - "style": "width: 10em", - className: "CodeMirror-search-field" - })); - } - function getDoReplaceConfirm(cm) { - return el("", null, el("span", { - className: "CodeMirror-search-label" - }, cm.phrase("Replace?")), " ", el("button", {}, cm.phrase("Yes")), " ", el("button", {}, cm.phrase("No")), " ", el("button", {}, cm.phrase("All")), " ", el("button", {}, cm.phrase("Stop"))); - } - function replaceAll(cm, query, text) { - cm.operation(function () { - for (var cursor = getSearchCursor(cm, query); cursor.findNext();) { - if (typeof query != "string") { - var match = cm.getRange(cursor.from(), cursor.to()).match(query); - cursor.replace(text.replace(/\$(\d)/g, function (_, i) { - return match[i]; - })); - } else cursor.replace(text); - } - }); - } - function replace(cm, all) { - if (cm.getOption("readOnly")) return; - var query = cm.getSelection() || getSearchState(cm).lastQuery; - var dialogText = all ? cm.phrase("Replace all:") : cm.phrase("Replace:"); - var fragment = el("", null, el("span", { - className: "CodeMirror-search-label" - }, dialogText), getReplaceQueryDialog(cm)); - dialog2(cm, fragment, dialogText, query, function (query2) { - if (!query2) return; - query2 = parseQuery(query2); - dialog2(cm, getReplacementQueryDialog(cm), cm.phrase("Replace with:"), "", function (text) { - text = parseString(text); - if (all) { - replaceAll(cm, query2, text); - } else { - clearSearch(cm); - var cursor = getSearchCursor(cm, query2, cm.getCursor("from")); - var advance = function () { - var start = cursor.from(), - match; - if (!(match = cursor.findNext())) { - cursor = getSearchCursor(cm, query2); - if (!(match = cursor.findNext()) || start && cursor.from().line == start.line && cursor.from().ch == start.ch) return; - } - cm.setSelection(cursor.from(), cursor.to()); - cm.scrollIntoView({ - from: cursor.from(), - to: cursor.to() - }); - confirmDialog(cm, getDoReplaceConfirm(cm), cm.phrase("Replace?"), [function () { - doReplace(match); - }, advance, function () { - replaceAll(cm, query2, text); - }]); - }; - var doReplace = function (match) { - cursor.replace(typeof query2 == "string" ? text : text.replace(/\$(\d)/g, function (_, i) { - return match[i]; - })); - advance(); - }; - advance(); - } - }); - }); - } - CodeMirror.commands.find = function (cm) { - clearSearch(cm); - doSearch(cm); - }; - CodeMirror.commands.findPersistent = function (cm) { - clearSearch(cm); - doSearch(cm, false, true); - }; - CodeMirror.commands.findPersistentNext = function (cm) { - doSearch(cm, false, true, true); - }; - CodeMirror.commands.findPersistentPrev = function (cm) { - doSearch(cm, true, true, true); - }; - CodeMirror.commands.findNext = doSearch; - CodeMirror.commands.findPrev = function (cm) { - doSearch(cm, true); - }; - CodeMirror.commands.clearSearch = clearSearch; - CodeMirror.commands.replace = replace; - CodeMirror.commands.replaceAll = function (cm) { - replace(cm, true); - }; - }); -})(); -var searchExports = search$2.exports; -const search = /* @__PURE__ */codemirror.getDefaultExportFromCjs(searchExports); -const search$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: search -}, [searchExports]); -exports.search = search$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/searchcursor.cjs.js": -/*!*****************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs.js ***! - \*****************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const searchcursor$2 = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var searchcursorExports = searchcursor$2.requireSearchcursor(); -const searchcursor = /* @__PURE__ */codemirror.getDefaultExportFromCjs(searchcursorExports); -const searchcursor$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: searchcursor -}, [searchcursorExports]); -exports.searchcursor = searchcursor$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/searchcursor.cjs2.js": -/*!******************************************************!*\ - !*** ../../graphiql-react/dist/searchcursor.cjs2.js ***! - \******************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -var searchcursor = { - exports: {} -}; -var hasRequiredSearchcursor; -function requireSearchcursor() { - if (hasRequiredSearchcursor) return searchcursor.exports; - hasRequiredSearchcursor = 1; - (function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var Pos = CodeMirror.Pos; - function regexpFlags(regexp) { - var flags = regexp.flags; - return flags != null ? flags : (regexp.ignoreCase ? "i" : "") + (regexp.global ? "g" : "") + (regexp.multiline ? "m" : ""); - } - function ensureFlags(regexp, flags) { - var current = regexpFlags(regexp), - target = current; - for (var i = 0; i < flags.length; i++) if (target.indexOf(flags.charAt(i)) == -1) target += flags.charAt(i); - return current == target ? regexp : new RegExp(regexp.source, target); - } - function maybeMultiline(regexp) { - return /\\s|\\n|\n|\\W|\\D|\[\^/.test(regexp.source); - } - function searchRegexpForward(doc, regexp, start) { - regexp = ensureFlags(regexp, "g"); - for (var line = start.line, ch = start.ch, last = doc.lastLine(); line <= last; line++, ch = 0) { - regexp.lastIndex = ch; - var string = doc.getLine(line), - match = regexp.exec(string); - if (match) return { - from: Pos(line, match.index), - to: Pos(line, match.index + match[0].length), - match - }; - } - } - function searchRegexpForwardMultiline(doc, regexp, start) { - if (!maybeMultiline(regexp)) return searchRegexpForward(doc, regexp, start); - regexp = ensureFlags(regexp, "gm"); - var string, - chunk = 1; - for (var line = start.line, last = doc.lastLine(); line <= last;) { - for (var i = 0; i < chunk; i++) { - if (line > last) break; - var curLine = doc.getLine(line++); - string = string == null ? curLine : string + "\n" + curLine; - } - chunk = chunk * 2; - regexp.lastIndex = start.ch; - var match = regexp.exec(string); - if (match) { - var before = string.slice(0, match.index).split("\n"), - inside = match[0].split("\n"); - var startLine = start.line + before.length - 1, - startCh = before[before.length - 1].length; - return { - from: Pos(startLine, startCh), - to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), - match - }; - } - } - } - function lastMatchIn(string, regexp, endMargin) { - var match, - from = 0; - while (from <= string.length) { - regexp.lastIndex = from; - var newMatch = regexp.exec(string); - if (!newMatch) break; - var end = newMatch.index + newMatch[0].length; - if (end > string.length - endMargin) break; - if (!match || end > match.index + match[0].length) match = newMatch; - from = newMatch.index + 1; - } - return match; - } - function searchRegexpBackward(doc, regexp, start) { - regexp = ensureFlags(regexp, "g"); - for (var line = start.line, ch = start.ch, first = doc.firstLine(); line >= first; line--, ch = -1) { - var string = doc.getLine(line); - var match = lastMatchIn(string, regexp, ch < 0 ? 0 : string.length - ch); - if (match) return { - from: Pos(line, match.index), - to: Pos(line, match.index + match[0].length), - match - }; - } - } - function searchRegexpBackwardMultiline(doc, regexp, start) { - if (!maybeMultiline(regexp)) return searchRegexpBackward(doc, regexp, start); - regexp = ensureFlags(regexp, "gm"); - var string, - chunkSize = 1, - endMargin = doc.getLine(start.line).length - start.ch; - for (var line = start.line, first = doc.firstLine(); line >= first;) { - for (var i = 0; i < chunkSize && line >= first; i++) { - var curLine = doc.getLine(line--); - string = string == null ? curLine : curLine + "\n" + string; - } - chunkSize *= 2; - var match = lastMatchIn(string, regexp, endMargin); - if (match) { - var before = string.slice(0, match.index).split("\n"), - inside = match[0].split("\n"); - var startLine = line + before.length, - startCh = before[before.length - 1].length; - return { - from: Pos(startLine, startCh), - to: Pos(startLine + inside.length - 1, inside.length == 1 ? startCh + inside[0].length : inside[inside.length - 1].length), - match - }; - } - } - } - var doFold, noFold; - if (String.prototype.normalize) { - doFold = function (str) { - return str.normalize("NFD").toLowerCase(); - }; - noFold = function (str) { - return str.normalize("NFD"); - }; - } else { - doFold = function (str) { - return str.toLowerCase(); - }; - noFold = function (str) { - return str; - }; - } - function adjustPos(orig, folded, pos, foldFunc) { - if (orig.length == folded.length) return pos; - for (var min = 0, max = pos + Math.max(0, orig.length - folded.length);;) { - if (min == max) return min; - var mid = min + max >> 1; - var len = foldFunc(orig.slice(0, mid)).length; - if (len == pos) return mid;else if (len > pos) max = mid;else min = mid + 1; - } - } - function searchStringForward(doc, query, start, caseFold) { - if (!query.length) return null; - var fold = caseFold ? doFold : noFold; - var lines = fold(query).split(/\r|\n\r?/); - search: for (var line = start.line, ch = start.ch, last = doc.lastLine() + 1 - lines.length; line <= last; line++, ch = 0) { - var orig = doc.getLine(line).slice(ch), - string = fold(orig); - if (lines.length == 1) { - var found = string.indexOf(lines[0]); - if (found == -1) continue search; - var start = adjustPos(orig, string, found, fold) + ch; - return { - from: Pos(line, adjustPos(orig, string, found, fold) + ch), - to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold) + ch) - }; - } else { - var cutFrom = string.length - lines[0].length; - if (string.slice(cutFrom) != lines[0]) continue search; - for (var i = 1; i < lines.length - 1; i++) if (fold(doc.getLine(line + i)) != lines[i]) continue search; - var end = doc.getLine(line + lines.length - 1), - endString = fold(end), - lastLine = lines[lines.length - 1]; - if (endString.slice(0, lastLine.length) != lastLine) continue search; - return { - from: Pos(line, adjustPos(orig, string, cutFrom, fold) + ch), - to: Pos(line + lines.length - 1, adjustPos(end, endString, lastLine.length, fold)) - }; - } - } - } - function searchStringBackward(doc, query, start, caseFold) { - if (!query.length) return null; - var fold = caseFold ? doFold : noFold; - var lines = fold(query).split(/\r|\n\r?/); - search: for (var line = start.line, ch = start.ch, first = doc.firstLine() - 1 + lines.length; line >= first; line--, ch = -1) { - var orig = doc.getLine(line); - if (ch > -1) orig = orig.slice(0, ch); - var string = fold(orig); - if (lines.length == 1) { - var found = string.lastIndexOf(lines[0]); - if (found == -1) continue search; - return { - from: Pos(line, adjustPos(orig, string, found, fold)), - to: Pos(line, adjustPos(orig, string, found + lines[0].length, fold)) - }; - } else { - var lastLine = lines[lines.length - 1]; - if (string.slice(0, lastLine.length) != lastLine) continue search; - for (var i = 1, start = line - lines.length + 1; i < lines.length - 1; i++) if (fold(doc.getLine(start + i)) != lines[i]) continue search; - var top = doc.getLine(line + 1 - lines.length), - topString = fold(top); - if (topString.slice(topString.length - lines[0].length) != lines[0]) continue search; - return { - from: Pos(line + 1 - lines.length, adjustPos(top, topString, top.length - lines[0].length, fold)), - to: Pos(line, adjustPos(orig, string, lastLine.length, fold)) - }; - } - } - } - function SearchCursor(doc, query, pos, options) { - this.atOccurrence = false; - this.afterEmptyMatch = false; - this.doc = doc; - pos = pos ? doc.clipPos(pos) : Pos(0, 0); - this.pos = { - from: pos, - to: pos - }; - var caseFold; - if (typeof options == "object") { - caseFold = options.caseFold; - } else { - caseFold = options; - options = null; - } - if (typeof query == "string") { - if (caseFold == null) caseFold = false; - this.matches = function (reverse, pos2) { - return (reverse ? searchStringBackward : searchStringForward)(doc, query, pos2, caseFold); - }; - } else { - query = ensureFlags(query, "gm"); - if (!options || options.multiline !== false) this.matches = function (reverse, pos2) { - return (reverse ? searchRegexpBackwardMultiline : searchRegexpForwardMultiline)(doc, query, pos2); - };else this.matches = function (reverse, pos2) { - return (reverse ? searchRegexpBackward : searchRegexpForward)(doc, query, pos2); - }; - } - } - SearchCursor.prototype = { - findNext: function () { - return this.find(false); - }, - findPrevious: function () { - return this.find(true); - }, - find: function (reverse) { - var head = this.doc.clipPos(reverse ? this.pos.from : this.pos.to); - if (this.afterEmptyMatch && this.atOccurrence) { - head = Pos(head.line, head.ch); - if (reverse) { - head.ch--; - if (head.ch < 0) { - head.line--; - head.ch = (this.doc.getLine(head.line) || "").length; - } - } else { - head.ch++; - if (head.ch > (this.doc.getLine(head.line) || "").length) { - head.ch = 0; - head.line++; - } - } - if (CodeMirror.cmpPos(head, this.doc.clipPos(head)) != 0) { - return this.atOccurrence = false; - } - } - var result = this.matches(reverse, head); - this.afterEmptyMatch = result && CodeMirror.cmpPos(result.from, result.to) == 0; - if (result) { - this.pos = result; - this.atOccurrence = true; - return this.pos.match || true; - } else { - var end = Pos(reverse ? this.doc.firstLine() : this.doc.lastLine() + 1, 0); - this.pos = { - from: end, - to: end - }; - return this.atOccurrence = false; - } - }, - from: function () { - if (this.atOccurrence) return this.pos.from; - }, - to: function () { - if (this.atOccurrence) return this.pos.to; - }, - replace: function (newText, origin) { - if (!this.atOccurrence) return; - var lines = CodeMirror.splitLines(newText); - this.doc.replaceRange(lines, this.pos.from, this.pos.to, origin); - this.pos.to = Pos(this.pos.from.line + lines.length - 1, lines[lines.length - 1].length + (lines.length == 1 ? this.pos.from.ch : 0)); - } - }; - CodeMirror.defineExtension("getSearchCursor", function (query, pos, caseFold) { - return new SearchCursor(this.doc, query, pos, caseFold); - }); - CodeMirror.defineDocExtension("getSearchCursor", function (query, pos, caseFold) { - return new SearchCursor(this, query, pos, caseFold); - }); - CodeMirror.defineExtension("selectMatches", function (query, caseFold) { - var ranges = []; - var cur = this.getSearchCursor(query, this.getCursor("from"), caseFold); - while (cur.findNext()) { - if (CodeMirror.cmpPos(cur.to(), this.getCursor("to")) > 0) break; - ranges.push({ - anchor: cur.from(), - head: cur.to() - }); - } - if (ranges.length) this.setSelections(ranges, 0); - }); - }); - })(); - return searchcursor.exports; -} -exports.requireSearchcursor = requireSearchcursor; - -/***/ }), - -/***/ "../../graphiql-react/dist/show-hint.cjs.js": -/*!**************************************************!*\ - !*** ../../graphiql-react/dist/show-hint.cjs.js ***! - \**************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var showHint$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror()); - })(function (CodeMirror) { - var HINT_ELEMENT_CLASS = "CodeMirror-hint"; - var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active"; - CodeMirror.showHint = function (cm, getHints, options) { - if (!getHints) return cm.showHint(options); - if (options && options.async) getHints.async = true; - var newOpts = { - hint: getHints - }; - if (options) for (var prop in options) newOpts[prop] = options[prop]; - return cm.showHint(newOpts); - }; - CodeMirror.defineExtension("showHint", function (options) { - options = parseOptions(this, this.getCursor("start"), options); - var selections = this.listSelections(); - if (selections.length > 1) return; - if (this.somethingSelected()) { - if (!options.hint.supportsSelection) return; - for (var i = 0; i < selections.length; i++) if (selections[i].head.line != selections[i].anchor.line) return; - } - if (this.state.completionActive) this.state.completionActive.close(); - var completion = this.state.completionActive = new Completion(this, options); - if (!completion.options.hint) return; - CodeMirror.signal(this, "startCompletion", this); - completion.update(true); - }); - CodeMirror.defineExtension("closeHint", function () { - if (this.state.completionActive) this.state.completionActive.close(); - }); - function Completion(cm, options) { - this.cm = cm; - this.options = options; - this.widget = null; - this.debounce = 0; - this.tick = 0; - this.startPos = this.cm.getCursor("start"); - this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length; - if (this.options.updateOnCursorActivity) { - var self = this; - cm.on("cursorActivity", this.activityFunc = function () { - self.cursorActivity(); - }); - } - } - var requestAnimationFrame = window.requestAnimationFrame || function (fn) { - return setTimeout(fn, 1e3 / 60); - }; - var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout; - Completion.prototype = { - close: function () { - if (!this.active()) return; - this.cm.state.completionActive = null; - this.tick = null; - if (this.options.updateOnCursorActivity) { - this.cm.off("cursorActivity", this.activityFunc); - } - if (this.widget && this.data) CodeMirror.signal(this.data, "close"); - if (this.widget) this.widget.close(); - CodeMirror.signal(this.cm, "endCompletion", this.cm); - }, - active: function () { - return this.cm.state.completionActive == this; - }, - pick: function (data, i) { - var completion = data.list[i], - self = this; - this.cm.operation(function () { - if (completion.hint) completion.hint(self.cm, data, completion);else self.cm.replaceRange(getText(completion), completion.from || data.from, completion.to || data.to, "complete"); - CodeMirror.signal(data, "pick", completion); - self.cm.scrollIntoView(); - }); - if (this.options.closeOnPick) { - this.close(); - } - }, - cursorActivity: function () { - if (this.debounce) { - cancelAnimationFrame(this.debounce); - this.debounce = 0; - } - var identStart = this.startPos; - if (this.data) { - identStart = this.data.from; - } - var pos = this.cm.getCursor(), - line = this.cm.getLine(pos.line); - if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch || pos.ch < identStart.ch || this.cm.somethingSelected() || !pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1))) { - this.close(); - } else { - var self = this; - this.debounce = requestAnimationFrame(function () { - self.update(); - }); - if (this.widget) this.widget.disable(); - } - }, - update: function (first) { - if (this.tick == null) return; - var self = this, - myTick = ++this.tick; - fetchHints(this.options.hint, this.cm, this.options, function (data) { - if (self.tick == myTick) self.finishUpdate(data, first); - }); - }, - finishUpdate: function (data, first) { - if (this.data) CodeMirror.signal(this.data, "update"); - var picked = this.widget && this.widget.picked || first && this.options.completeSingle; - if (this.widget) this.widget.close(); - this.data = data; - if (data && data.list.length) { - if (picked && data.list.length == 1) { - this.pick(data, 0); - } else { - this.widget = new Widget(this, data); - CodeMirror.signal(data, "shown"); - } - } - } - }; - function parseOptions(cm, pos, options) { - var editor = cm.options.hintOptions; - var out = {}; - for (var prop in defaultOptions) out[prop] = defaultOptions[prop]; - if (editor) { - for (var prop in editor) if (editor[prop] !== void 0) out[prop] = editor[prop]; - } - if (options) { - for (var prop in options) if (options[prop] !== void 0) out[prop] = options[prop]; - } - if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos); - return out; - } - function getText(completion) { - if (typeof completion == "string") return completion;else return completion.text; - } - function buildKeyMap(completion, handle) { - var baseMap = { - Up: function () { - handle.moveFocus(-1); - }, - Down: function () { - handle.moveFocus(1); - }, - PageUp: function () { - handle.moveFocus(-handle.menuSize() + 1, true); - }, - PageDown: function () { - handle.moveFocus(handle.menuSize() - 1, true); - }, - Home: function () { - handle.setFocus(0); - }, - End: function () { - handle.setFocus(handle.length - 1); - }, - Enter: handle.pick, - Tab: handle.pick, - Esc: handle.close - }; - var mac = /Mac/.test(navigator.platform); - if (mac) { - baseMap["Ctrl-P"] = function () { - handle.moveFocus(-1); - }; - baseMap["Ctrl-N"] = function () { - handle.moveFocus(1); - }; - } - var custom = completion.options.customKeys; - var ourMap = custom ? {} : baseMap; - function addBinding(key2, val) { - var bound; - if (typeof val != "string") bound = function (cm) { - return val(cm, handle); - };else if (baseMap.hasOwnProperty(val)) bound = baseMap[val];else bound = val; - ourMap[key2] = bound; - } - if (custom) { - for (var key in custom) if (custom.hasOwnProperty(key)) addBinding(key, custom[key]); - } - var extra = completion.options.extraKeys; - if (extra) { - for (var key in extra) if (extra.hasOwnProperty(key)) addBinding(key, extra[key]); - } - return ourMap; - } - function getHintElement(hintsElement, el) { - while (el && el != hintsElement) { - if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el; - el = el.parentNode; - } - } - function Widget(completion, data) { - this.id = "cm-complete-" + Math.floor(Math.random(1e6)); - this.completion = completion; - this.data = data; - this.picked = false; - var widget = this, - cm = completion.cm; - var ownerDocument = cm.getInputField().ownerDocument; - var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow; - var hints = this.hints = ownerDocument.createElement("ul"); - hints.setAttribute("role", "listbox"); - hints.setAttribute("aria-expanded", "true"); - hints.id = this.id; - var theme = completion.cm.options.theme; - hints.className = "CodeMirror-hints " + theme; - this.selectedHint = data.selectedHint || 0; - var completions = data.list; - for (var i = 0; i < completions.length; ++i) { - var elt = hints.appendChild(ownerDocument.createElement("li")), - cur = completions[i]; - var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS); - if (cur.className != null) className = cur.className + " " + className; - elt.className = className; - if (i == this.selectedHint) elt.setAttribute("aria-selected", "true"); - elt.id = this.id + "-" + i; - elt.setAttribute("role", "option"); - if (cur.render) cur.render(elt, data, cur);else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur))); - elt.hintId = i; - } - var container = completion.options.container || ownerDocument.body; - var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null); - var left = pos.left, - top = pos.bottom, - below = true; - var offsetLeft = 0, - offsetTop = 0; - if (container !== ownerDocument.body) { - var isContainerPositioned = ["absolute", "relative", "fixed"].indexOf(parentWindow.getComputedStyle(container).position) !== -1; - var offsetParent = isContainerPositioned ? container : container.offsetParent; - var offsetParentPosition = offsetParent.getBoundingClientRect(); - var bodyPosition = ownerDocument.body.getBoundingClientRect(); - offsetLeft = offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft; - offsetTop = offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop; - } - hints.style.left = left - offsetLeft + "px"; - hints.style.top = top - offsetTop + "px"; - var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth); - var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight); - container.appendChild(hints); - cm.getInputField().setAttribute("aria-autocomplete", "list"); - cm.getInputField().setAttribute("aria-owns", this.id); - cm.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint); - var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect(); - var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false; - var startScroll; - setTimeout(function () { - startScroll = cm.getScrollInfo(); - }); - var overlapY = box.bottom - winH; - if (overlapY > 0) { - var height = box.bottom - box.top, - curTop = pos.top - (pos.bottom - box.top); - if (curTop - height > 0) { - hints.style.top = (top = pos.top - height - offsetTop) + "px"; - below = false; - } else if (height > winH) { - hints.style.height = winH - 5 + "px"; - hints.style.top = (top = pos.bottom - box.top - offsetTop) + "px"; - var cursor = cm.getCursor(); - if (data.from.ch != cursor.ch) { - pos = cm.cursorCoords(cursor); - hints.style.left = (left = pos.left - offsetLeft) + "px"; - box = hints.getBoundingClientRect(); - } - } - } - var overlapX = box.right - winW; - if (scrolls) overlapX += cm.display.nativeBarWidth; - if (overlapX > 0) { - if (box.right - box.left > winW) { - hints.style.width = winW - 5 + "px"; - overlapX -= box.right - box.left - winW; - } - hints.style.left = (left = pos.left - overlapX - offsetLeft) + "px"; - } - if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling) node.style.paddingRight = cm.display.nativeBarWidth + "px"; - cm.addKeyMap(this.keyMap = buildKeyMap(completion, { - moveFocus: function (n, avoidWrap) { - widget.changeActive(widget.selectedHint + n, avoidWrap); - }, - setFocus: function (n) { - widget.changeActive(n); - }, - menuSize: function () { - return widget.screenAmount(); - }, - length: completions.length, - close: function () { - completion.close(); - }, - pick: function () { - widget.pick(); - }, - data - })); - if (completion.options.closeOnUnfocus) { - var closingOnBlur; - cm.on("blur", this.onBlur = function () { - closingOnBlur = setTimeout(function () { - completion.close(); - }, 100); - }); - cm.on("focus", this.onFocus = function () { - clearTimeout(closingOnBlur); - }); - } - cm.on("scroll", this.onScroll = function () { - var curScroll = cm.getScrollInfo(), - editor = cm.getWrapperElement().getBoundingClientRect(); - if (!startScroll) startScroll = cm.getScrollInfo(); - var newTop = top + startScroll.top - curScroll.top; - var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop); - if (!below) point += hints.offsetHeight; - if (point <= editor.top || point >= editor.bottom) return completion.close(); - hints.style.top = newTop + "px"; - hints.style.left = left + startScroll.left - curScroll.left + "px"; - }); - CodeMirror.on(hints, "dblclick", function (e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) { - widget.changeActive(t.hintId); - widget.pick(); - } - }); - CodeMirror.on(hints, "click", function (e) { - var t = getHintElement(hints, e.target || e.srcElement); - if (t && t.hintId != null) { - widget.changeActive(t.hintId); - if (completion.options.completeOnSingleClick) widget.pick(); - } - }); - CodeMirror.on(hints, "mousedown", function () { - setTimeout(function () { - cm.focus(); - }, 20); - }); - var selectedHintRange = this.getSelectedHintRange(); - if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) { - this.scrollToActive(); - } - CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]); - return true; - } - Widget.prototype = { - close: function () { - if (this.completion.widget != this) return; - this.completion.widget = null; - if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints); - this.completion.cm.removeKeyMap(this.keyMap); - var input = this.completion.cm.getInputField(); - input.removeAttribute("aria-activedescendant"); - input.removeAttribute("aria-owns"); - var cm = this.completion.cm; - if (this.completion.options.closeOnUnfocus) { - cm.off("blur", this.onBlur); - cm.off("focus", this.onFocus); - } - cm.off("scroll", this.onScroll); - }, - disable: function () { - this.completion.cm.removeKeyMap(this.keyMap); - var widget = this; - this.keyMap = { - Enter: function () { - widget.picked = true; - } - }; - this.completion.cm.addKeyMap(this.keyMap); - }, - pick: function () { - this.completion.pick(this.data, this.selectedHint); - }, - changeActive: function (i, avoidWrap) { - if (i >= this.data.list.length) i = avoidWrap ? this.data.list.length - 1 : 0;else if (i < 0) i = avoidWrap ? 0 : this.data.list.length - 1; - if (this.selectedHint == i) return; - var node = this.hints.childNodes[this.selectedHint]; - if (node) { - node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, ""); - node.removeAttribute("aria-selected"); - } - node = this.hints.childNodes[this.selectedHint = i]; - node.className += " " + ACTIVE_HINT_ELEMENT_CLASS; - node.setAttribute("aria-selected", "true"); - this.completion.cm.getInputField().setAttribute("aria-activedescendant", node.id); - this.scrollToActive(); - CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node); - }, - scrollToActive: function () { - var selectedHintRange = this.getSelectedHintRange(); - var node1 = this.hints.childNodes[selectedHintRange.from]; - var node2 = this.hints.childNodes[selectedHintRange.to]; - var firstNode = this.hints.firstChild; - if (node1.offsetTop < this.hints.scrollTop) this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight) this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop; - }, - screenAmount: function () { - return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1; - }, - getSelectedHintRange: function () { - var margin = this.completion.options.scrollMargin || 0; - return { - from: Math.max(0, this.selectedHint - margin), - to: Math.min(this.data.list.length - 1, this.selectedHint + margin) - }; - } - }; - function applicableHelpers(cm, helpers) { - if (!cm.somethingSelected()) return helpers; - var result = []; - for (var i = 0; i < helpers.length; i++) if (helpers[i].supportsSelection) result.push(helpers[i]); - return result; - } - function fetchHints(hint, cm, options, callback) { - if (hint.async) { - hint(cm, callback, options); - } else { - var result = hint(cm, options); - if (result && result.then) result.then(callback);else callback(result); - } - } - function resolveAutoHints(cm, pos) { - var helpers = cm.getHelpers(pos, "hint"), - words; - if (helpers.length) { - var resolved = function (cm2, callback, options) { - var app = applicableHelpers(cm2, helpers); - function run(i) { - if (i == app.length) return callback(null); - fetchHints(app[i], cm2, options, function (result) { - if (result && result.list.length > 0) callback(result);else run(i + 1); - }); - } - run(0); - }; - resolved.async = true; - resolved.supportsSelection = true; - return resolved; - } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) { - return function (cm2) { - return CodeMirror.hint.fromList(cm2, { - words - }); - }; - } else if (CodeMirror.hint.anyword) { - return function (cm2, options) { - return CodeMirror.hint.anyword(cm2, options); - }; - } else { - return function () {}; - } - } - CodeMirror.registerHelper("hint", "auto", { - resolve: resolveAutoHints - }); - CodeMirror.registerHelper("hint", "fromList", function (cm, options) { - var cur = cm.getCursor(), - token = cm.getTokenAt(cur); - var term, - from = CodeMirror.Pos(cur.line, token.start), - to = cur; - if (token.start < cur.ch && /\w/.test(token.string.charAt(cur.ch - token.start - 1))) { - term = token.string.substr(0, cur.ch - token.start); - } else { - term = ""; - from = cur; - } - var found = []; - for (var i = 0; i < options.words.length; i++) { - var word = options.words[i]; - if (word.slice(0, term.length) == term) found.push(word); - } - if (found.length) return { - list: found, - from, - to - }; - }); - CodeMirror.commands.autocomplete = CodeMirror.showHint; - var defaultOptions = { - hint: CodeMirror.hint.auto, - completeSingle: true, - alignWithWord: true, - closeCharacters: /[\s()\[\]{};:>,]/, - closeOnPick: true, - closeOnUnfocus: true, - updateOnCursorActivity: true, - completeOnSingleClick: true, - container: null, - customKeys: null, - extraKeys: null, - paddingForScrollbar: true, - moveOnOverlap: true - }; - CodeMirror.defineOption("hintOptions", null); - }); -})(); -var showHintExports = showHint$2.exports; -const showHint = /* @__PURE__ */codemirror.getDefaultExportFromCjs(showHintExports); -const showHint$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: showHint -}, [showHintExports]); -exports.showHint = showHint$1; - -/***/ }), - -/***/ "../../graphiql-react/dist/sublime.cjs.js": -/*!************************************************!*\ - !*** ../../graphiql-react/dist/sublime.cjs.js ***! - \************************************************/ -/***/ (function(__unused_webpack_module, exports, __webpack_require__) { - - - -const codemirror = __webpack_require__(/*! ./codemirror.cjs2.js */ "../../graphiql-react/dist/codemirror.cjs2.js"); -const searchcursor = __webpack_require__(/*! ./searchcursor.cjs2.js */ "../../graphiql-react/dist/searchcursor.cjs2.js"); -const matchbrackets = __webpack_require__(/*! ./matchbrackets.cjs2.js */ "../../graphiql-react/dist/matchbrackets.cjs2.js"); -function _mergeNamespaces(n, m) { - for (var i = 0; i < m.length; i++) { - const e = m[i]; - if (typeof e !== "string" && !Array.isArray(e)) { - for (const k in e) { - if (k !== "default" && !(k in n)) { - const d = Object.getOwnPropertyDescriptor(e, k); - if (d) { - Object.defineProperty(n, k, d.get ? d : { - enumerable: true, - get: () => e[k] - }); - } - } - } - } - } - return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { - value: "Module" - })); -} -var sublime$2 = { - exports: {} -}; -(function (module2, exports2) { - (function (mod) { - mod(codemirror.requireCodemirror(), searchcursor.requireSearchcursor(), matchbrackets.requireMatchbrackets()); - })(function (CodeMirror) { - var cmds = CodeMirror.commands; - var Pos = CodeMirror.Pos; - function findPosSubword(doc, start, dir) { - if (dir < 0 && start.ch == 0) return doc.clipPos(Pos(start.line - 1)); - var line = doc.getLine(start.line); - if (dir > 0 && start.ch >= line.length) return doc.clipPos(Pos(start.line + 1, 0)); - var state = "start", - type, - startPos = start.ch; - for (var pos = startPos, e = dir < 0 ? 0 : line.length, i = 0; pos != e; pos += dir, i++) { - var next = line.charAt(dir < 0 ? pos - 1 : pos); - var cat = next != "_" && CodeMirror.isWordChar(next) ? "w" : "o"; - if (cat == "w" && next.toUpperCase() == next) cat = "W"; - if (state == "start") { - if (cat != "o") { - state = "in"; - type = cat; - } else startPos = pos + dir; - } else if (state == "in") { - if (type != cat) { - if (type == "w" && cat == "W" && dir < 0) pos--; - if (type == "W" && cat == "w" && dir > 0) { - if (pos == startPos + 1) { - type = "w"; - continue; - } else pos--; - } - break; - } - } - } - return Pos(start.line, pos); - } - function moveSubword(cm, dir) { - cm.extendSelectionsBy(function (range) { - if (cm.display.shift || cm.doc.extend || range.empty()) return findPosSubword(cm.doc, range.head, dir);else return dir < 0 ? range.from() : range.to(); - }); - } - cmds.goSubwordLeft = function (cm) { - moveSubword(cm, -1); - }; - cmds.goSubwordRight = function (cm) { - moveSubword(cm, 1); - }; - cmds.scrollLineUp = function (cm) { - var info = cm.getScrollInfo(); - if (!cm.somethingSelected()) { - var visibleBottomLine = cm.lineAtHeight(info.top + info.clientHeight, "local"); - if (cm.getCursor().line >= visibleBottomLine) cm.execCommand("goLineUp"); - } - cm.scrollTo(null, info.top - cm.defaultTextHeight()); - }; - cmds.scrollLineDown = function (cm) { - var info = cm.getScrollInfo(); - if (!cm.somethingSelected()) { - var visibleTopLine = cm.lineAtHeight(info.top, "local") + 1; - if (cm.getCursor().line <= visibleTopLine) cm.execCommand("goLineDown"); - } - cm.scrollTo(null, info.top + cm.defaultTextHeight()); - }; - cmds.splitSelectionByLine = function (cm) { - var ranges = cm.listSelections(), - lineRanges = []; - for (var i = 0; i < ranges.length; i++) { - var from = ranges[i].from(), - to = ranges[i].to(); - for (var line = from.line; line <= to.line; ++line) if (!(to.line > from.line && line == to.line && to.ch == 0)) lineRanges.push({ - anchor: line == from.line ? from : Pos(line, 0), - head: line == to.line ? to : Pos(line) - }); - } - cm.setSelections(lineRanges, 0); - }; - cmds.singleSelectionTop = function (cm) { - var range = cm.listSelections()[0]; - cm.setSelection(range.anchor, range.head, { - scroll: false - }); - }; - cmds.selectLine = function (cm) { - var ranges = cm.listSelections(), - extended = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - extended.push({ - anchor: Pos(range.from().line, 0), - head: Pos(range.to().line + 1, 0) - }); - } - cm.setSelections(extended); - }; - function insertLine(cm, above) { - if (cm.isReadOnly()) return CodeMirror.Pass; - cm.operation(function () { - var len = cm.listSelections().length, - newSelection = [], - last = -1; - for (var i = 0; i < len; i++) { - var head = cm.listSelections()[i].head; - if (head.line <= last) continue; - var at = Pos(head.line + (above ? 0 : 1), 0); - cm.replaceRange("\n", at, null, "+insertLine"); - cm.indentLine(at.line, null, true); - newSelection.push({ - head: at, - anchor: at - }); - last = head.line + 1; - } - cm.setSelections(newSelection); - }); - cm.execCommand("indentAuto"); - } - cmds.insertLineAfter = function (cm) { - return insertLine(cm, false); - }; - cmds.insertLineBefore = function (cm) { - return insertLine(cm, true); - }; - function wordAt(cm, pos) { - var start = pos.ch, - end = start, - line = cm.getLine(pos.line); - while (start && CodeMirror.isWordChar(line.charAt(start - 1))) --start; - while (end < line.length && CodeMirror.isWordChar(line.charAt(end))) ++end; - return { - from: Pos(pos.line, start), - to: Pos(pos.line, end), - word: line.slice(start, end) - }; - } - cmds.selectNextOccurrence = function (cm) { - var from = cm.getCursor("from"), - to = cm.getCursor("to"); - var fullWord = cm.state.sublimeFindFullWord == cm.doc.sel; - if (CodeMirror.cmpPos(from, to) == 0) { - var word = wordAt(cm, from); - if (!word.word) return; - cm.setSelection(word.from, word.to); - fullWord = true; - } else { - var text = cm.getRange(from, to); - var query = fullWord ? new RegExp("\\b" + text + "\\b") : text; - var cur = cm.getSearchCursor(query, to); - var found = cur.findNext(); - if (!found) { - cur = cm.getSearchCursor(query, Pos(cm.firstLine(), 0)); - found = cur.findNext(); - } - if (!found || isSelectedRange(cm.listSelections(), cur.from(), cur.to())) return; - cm.addSelection(cur.from(), cur.to()); - } - if (fullWord) cm.state.sublimeFindFullWord = cm.doc.sel; - }; - cmds.skipAndSelectNextOccurrence = function (cm) { - var prevAnchor = cm.getCursor("anchor"), - prevHead = cm.getCursor("head"); - cmds.selectNextOccurrence(cm); - if (CodeMirror.cmpPos(prevAnchor, prevHead) != 0) { - cm.doc.setSelections(cm.doc.listSelections().filter(function (sel) { - return sel.anchor != prevAnchor || sel.head != prevHead; - })); - } - }; - function addCursorToSelection(cm, dir) { - var ranges = cm.listSelections(), - newRanges = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - var newAnchor = cm.findPosV(range.anchor, dir, "line", range.anchor.goalColumn); - var newHead = cm.findPosV(range.head, dir, "line", range.head.goalColumn); - newAnchor.goalColumn = range.anchor.goalColumn != null ? range.anchor.goalColumn : cm.cursorCoords(range.anchor, "div").left; - newHead.goalColumn = range.head.goalColumn != null ? range.head.goalColumn : cm.cursorCoords(range.head, "div").left; - var newRange = { - anchor: newAnchor, - head: newHead - }; - newRanges.push(range); - newRanges.push(newRange); - } - cm.setSelections(newRanges); - } - cmds.addCursorToPrevLine = function (cm) { - addCursorToSelection(cm, -1); - }; - cmds.addCursorToNextLine = function (cm) { - addCursorToSelection(cm, 1); - }; - function isSelectedRange(ranges, from, to) { - for (var i = 0; i < ranges.length; i++) if (CodeMirror.cmpPos(ranges[i].from(), from) == 0 && CodeMirror.cmpPos(ranges[i].to(), to) == 0) return true; - return false; - } - var mirror = "(){}[]"; - function selectBetweenBrackets(cm) { - var ranges = cm.listSelections(), - newRanges = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i], - pos = range.head, - opening = cm.scanForBracket(pos, -1); - if (!opening) return false; - for (;;) { - var closing = cm.scanForBracket(pos, 1); - if (!closing) return false; - if (closing.ch == mirror.charAt(mirror.indexOf(opening.ch) + 1)) { - var startPos = Pos(opening.pos.line, opening.pos.ch + 1); - if (CodeMirror.cmpPos(startPos, range.from()) == 0 && CodeMirror.cmpPos(closing.pos, range.to()) == 0) { - opening = cm.scanForBracket(opening.pos, -1); - if (!opening) return false; - } else { - newRanges.push({ - anchor: startPos, - head: closing.pos - }); - break; - } - } - pos = Pos(closing.pos.line, closing.pos.ch + 1); - } - } - cm.setSelections(newRanges); - return true; - } - cmds.selectScope = function (cm) { - selectBetweenBrackets(cm) || cm.execCommand("selectAll"); - }; - cmds.selectBetweenBrackets = function (cm) { - if (!selectBetweenBrackets(cm)) return CodeMirror.Pass; - }; - function puncType(type) { - return !type ? null : /\bpunctuation\b/.test(type) ? type : void 0; - } - cmds.goToBracket = function (cm) { - cm.extendSelectionsBy(function (range) { - var next = cm.scanForBracket(range.head, 1, puncType(cm.getTokenTypeAt(range.head))); - if (next && CodeMirror.cmpPos(next.pos, range.head) != 0) return next.pos; - var prev = cm.scanForBracket(range.head, -1, puncType(cm.getTokenTypeAt(Pos(range.head.line, range.head.ch + 1)))); - return prev && Pos(prev.pos.line, prev.pos.ch + 1) || range.head; - }); - }; - cmds.swapLineUp = function (cm) { - if (cm.isReadOnly()) return CodeMirror.Pass; - var ranges = cm.listSelections(), - linesToMove = [], - at = cm.firstLine() - 1, - newSels = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i], - from = range.from().line - 1, - to = range.to().line; - newSels.push({ - anchor: Pos(range.anchor.line - 1, range.anchor.ch), - head: Pos(range.head.line - 1, range.head.ch) - }); - if (range.to().ch == 0 && !range.empty()) --to; - if (from > at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; - at = to; - } - cm.operation(function () { - for (var i2 = 0; i2 < linesToMove.length; i2 += 2) { - var from2 = linesToMove[i2], - to2 = linesToMove[i2 + 1]; - var line = cm.getLine(from2); - cm.replaceRange("", Pos(from2, 0), Pos(from2 + 1, 0), "+swapLine"); - if (to2 > cm.lastLine()) cm.replaceRange("\n" + line, Pos(cm.lastLine()), null, "+swapLine");else cm.replaceRange(line + "\n", Pos(to2, 0), null, "+swapLine"); - } - cm.setSelections(newSels); - cm.scrollIntoView(); - }); - }; - cmds.swapLineDown = function (cm) { - if (cm.isReadOnly()) return CodeMirror.Pass; - var ranges = cm.listSelections(), - linesToMove = [], - at = cm.lastLine() + 1; - for (var i = ranges.length - 1; i >= 0; i--) { - var range = ranges[i], - from = range.to().line + 1, - to = range.from().line; - if (range.to().ch == 0 && !range.empty()) from--; - if (from < at) linesToMove.push(from, to);else if (linesToMove.length) linesToMove[linesToMove.length - 1] = to; - at = to; - } - cm.operation(function () { - for (var i2 = linesToMove.length - 2; i2 >= 0; i2 -= 2) { - var from2 = linesToMove[i2], - to2 = linesToMove[i2 + 1]; - var line = cm.getLine(from2); - if (from2 == cm.lastLine()) cm.replaceRange("", Pos(from2 - 1), Pos(from2), "+swapLine");else cm.replaceRange("", Pos(from2, 0), Pos(from2 + 1, 0), "+swapLine"); - cm.replaceRange(line + "\n", Pos(to2, 0), null, "+swapLine"); - } - cm.scrollIntoView(); - }); - }; - cmds.toggleCommentIndented = function (cm) { - cm.toggleComment({ - indent: true - }); - }; - cmds.joinLines = function (cm) { - var ranges = cm.listSelections(), - joined = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i], - from = range.from(); - var start = from.line, - end = range.to().line; - while (i < ranges.length - 1 && ranges[i + 1].from().line == end) end = ranges[++i].to().line; - joined.push({ - start, - end, - anchor: !range.empty() && from - }); - } - cm.operation(function () { - var offset = 0, - ranges2 = []; - for (var i2 = 0; i2 < joined.length; i2++) { - var obj = joined[i2]; - var anchor = obj.anchor && Pos(obj.anchor.line - offset, obj.anchor.ch), - head; - for (var line = obj.start; line <= obj.end; line++) { - var actual = line - offset; - if (line == obj.end) head = Pos(actual, cm.getLine(actual).length + 1); - if (actual < cm.lastLine()) { - cm.replaceRange(" ", Pos(actual), Pos(actual + 1, /^\s*/.exec(cm.getLine(actual + 1))[0].length)); - ++offset; - } - } - ranges2.push({ - anchor: anchor || head, - head - }); - } - cm.setSelections(ranges2, 0); - }); - }; - cmds.duplicateLine = function (cm) { - cm.operation(function () { - var rangeCount = cm.listSelections().length; - for (var i = 0; i < rangeCount; i++) { - var range = cm.listSelections()[i]; - if (range.empty()) cm.replaceRange(cm.getLine(range.head.line) + "\n", Pos(range.head.line, 0));else cm.replaceRange(cm.getRange(range.from(), range.to()), range.from()); - } - cm.scrollIntoView(); - }); - }; - function sortLines(cm, caseSensitive, direction) { - if (cm.isReadOnly()) return CodeMirror.Pass; - var ranges = cm.listSelections(), - toSort = [], - selected; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (range.empty()) continue; - var from = range.from().line, - to = range.to().line; - while (i < ranges.length - 1 && ranges[i + 1].from().line == to) to = ranges[++i].to().line; - if (!ranges[i].to().ch) to--; - toSort.push(from, to); - } - if (toSort.length) selected = true;else toSort.push(cm.firstLine(), cm.lastLine()); - cm.operation(function () { - var ranges2 = []; - for (var i2 = 0; i2 < toSort.length; i2 += 2) { - var from2 = toSort[i2], - to2 = toSort[i2 + 1]; - var start = Pos(from2, 0), - end = Pos(to2); - var lines = cm.getRange(start, end, false); - if (caseSensitive) lines.sort(function (a, b) { - return a < b ? -direction : a == b ? 0 : direction; - });else lines.sort(function (a, b) { - var au = a.toUpperCase(), - bu = b.toUpperCase(); - if (au != bu) { - a = au; - b = bu; - } - return a < b ? -direction : a == b ? 0 : direction; - }); - cm.replaceRange(lines, start, end); - if (selected) ranges2.push({ - anchor: start, - head: Pos(to2 + 1, 0) - }); - } - if (selected) cm.setSelections(ranges2, 0); - }); - } - cmds.sortLines = function (cm) { - sortLines(cm, true, 1); - }; - cmds.reverseSortLines = function (cm) { - sortLines(cm, true, -1); - }; - cmds.sortLinesInsensitive = function (cm) { - sortLines(cm, false, 1); - }; - cmds.reverseSortLinesInsensitive = function (cm) { - sortLines(cm, false, -1); - }; - cmds.nextBookmark = function (cm) { - var marks = cm.state.sublimeBookmarks; - if (marks) while (marks.length) { - var current = marks.shift(); - var found = current.find(); - if (found) { - marks.push(current); - return cm.setSelection(found.from, found.to); - } - } - }; - cmds.prevBookmark = function (cm) { - var marks = cm.state.sublimeBookmarks; - if (marks) while (marks.length) { - marks.unshift(marks.pop()); - var found = marks[marks.length - 1].find(); - if (!found) marks.pop();else return cm.setSelection(found.from, found.to); - } - }; - cmds.toggleBookmark = function (cm) { - var ranges = cm.listSelections(); - var marks = cm.state.sublimeBookmarks || (cm.state.sublimeBookmarks = []); - for (var i = 0; i < ranges.length; i++) { - var from = ranges[i].from(), - to = ranges[i].to(); - var found = ranges[i].empty() ? cm.findMarksAt(from) : cm.findMarks(from, to); - for (var j = 0; j < found.length; j++) { - if (found[j].sublimeBookmark) { - found[j].clear(); - for (var k = 0; k < marks.length; k++) if (marks[k] == found[j]) marks.splice(k--, 1); - break; - } - } - if (j == found.length) marks.push(cm.markText(from, to, { - sublimeBookmark: true, - clearWhenEmpty: false - })); - } - }; - cmds.clearBookmarks = function (cm) { - var marks = cm.state.sublimeBookmarks; - if (marks) for (var i = 0; i < marks.length; i++) marks[i].clear(); - marks.length = 0; - }; - cmds.selectBookmarks = function (cm) { - var marks = cm.state.sublimeBookmarks, - ranges = []; - if (marks) for (var i = 0; i < marks.length; i++) { - var found = marks[i].find(); - if (!found) marks.splice(i--, 0);else ranges.push({ - anchor: found.from, - head: found.to - }); - } - if (ranges.length) cm.setSelections(ranges, 0); - }; - function modifyWordOrSelection(cm, mod) { - cm.operation(function () { - var ranges = cm.listSelections(), - indices = [], - replacements = []; - for (var i = 0; i < ranges.length; i++) { - var range = ranges[i]; - if (range.empty()) { - indices.push(i); - replacements.push(""); - } else replacements.push(mod(cm.getRange(range.from(), range.to()))); - } - cm.replaceSelections(replacements, "around", "case"); - for (var i = indices.length - 1, at; i >= 0; i--) { - var range = ranges[indices[i]]; - if (at && CodeMirror.cmpPos(range.head, at) > 0) continue; - var word = wordAt(cm, range.head); - at = word.from; - cm.replaceRange(mod(word.word), word.from, word.to); - } - }); - } - cmds.smartBackspace = function (cm) { - if (cm.somethingSelected()) return CodeMirror.Pass; - cm.operation(function () { - var cursors = cm.listSelections(); - var indentUnit = cm.getOption("indentUnit"); - for (var i = cursors.length - 1; i >= 0; i--) { - var cursor = cursors[i].head; - var toStartOfLine = cm.getRange({ - line: cursor.line, - ch: 0 - }, cursor); - var column = CodeMirror.countColumn(toStartOfLine, null, cm.getOption("tabSize")); - var deletePos = cm.findPosH(cursor, -1, "char", false); - if (toStartOfLine && !/\S/.test(toStartOfLine) && column % indentUnit == 0) { - var prevIndent = new Pos(cursor.line, CodeMirror.findColumn(toStartOfLine, column - indentUnit, indentUnit)); - if (prevIndent.ch != cursor.ch) deletePos = prevIndent; - } - cm.replaceRange("", deletePos, cursor, "+delete"); - } - }); - }; - cmds.delLineRight = function (cm) { - cm.operation(function () { - var ranges = cm.listSelections(); - for (var i = ranges.length - 1; i >= 0; i--) cm.replaceRange("", ranges[i].anchor, Pos(ranges[i].to().line), "+delete"); - cm.scrollIntoView(); - }); - }; - cmds.upcaseAtCursor = function (cm) { - modifyWordOrSelection(cm, function (str) { - return str.toUpperCase(); - }); - }; - cmds.downcaseAtCursor = function (cm) { - modifyWordOrSelection(cm, function (str) { - return str.toLowerCase(); - }); - }; - cmds.setSublimeMark = function (cm) { - if (cm.state.sublimeMark) cm.state.sublimeMark.clear(); - cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); - }; - cmds.selectToSublimeMark = function (cm) { - var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); - if (found) cm.setSelection(cm.getCursor(), found); - }; - cmds.deleteToSublimeMark = function (cm) { - var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); - if (found) { - var from = cm.getCursor(), - to = found; - if (CodeMirror.cmpPos(from, to) > 0) { - var tmp = to; - to = from; - from = tmp; - } - cm.state.sublimeKilled = cm.getRange(from, to); - cm.replaceRange("", from, to); - } - }; - cmds.swapWithSublimeMark = function (cm) { - var found = cm.state.sublimeMark && cm.state.sublimeMark.find(); - if (found) { - cm.state.sublimeMark.clear(); - cm.state.sublimeMark = cm.setBookmark(cm.getCursor()); - cm.setCursor(found); - } - }; - cmds.sublimeYank = function (cm) { - if (cm.state.sublimeKilled != null) cm.replaceSelection(cm.state.sublimeKilled, null, "paste"); - }; - cmds.showInCenter = function (cm) { - var pos = cm.cursorCoords(null, "local"); - cm.scrollTo(null, (pos.top + pos.bottom) / 2 - cm.getScrollInfo().clientHeight / 2); - }; - function getTarget(cm) { - var from = cm.getCursor("from"), - to = cm.getCursor("to"); - if (CodeMirror.cmpPos(from, to) == 0) { - var word = wordAt(cm, from); - if (!word.word) return; - from = word.from; - to = word.to; - } - return { - from, - to, - query: cm.getRange(from, to), - word - }; - } - function findAndGoTo(cm, forward) { - var target = getTarget(cm); - if (!target) return; - var query = target.query; - var cur = cm.getSearchCursor(query, forward ? target.to : target.from); - if (forward ? cur.findNext() : cur.findPrevious()) { - cm.setSelection(cur.from(), cur.to()); - } else { - cur = cm.getSearchCursor(query, forward ? Pos(cm.firstLine(), 0) : cm.clipPos(Pos(cm.lastLine()))); - if (forward ? cur.findNext() : cur.findPrevious()) cm.setSelection(cur.from(), cur.to());else if (target.word) cm.setSelection(target.from, target.to); - } - } - cmds.findUnder = function (cm) { - findAndGoTo(cm, true); - }; - cmds.findUnderPrevious = function (cm) { - findAndGoTo(cm, false); - }; - cmds.findAllUnder = function (cm) { - var target = getTarget(cm); - if (!target) return; - var cur = cm.getSearchCursor(target.query); - var matches = []; - var primaryIndex = -1; - while (cur.findNext()) { - matches.push({ - anchor: cur.from(), - head: cur.to() - }); - if (cur.from().line <= target.from.line && cur.from().ch <= target.from.ch) primaryIndex++; - } - cm.setSelections(matches, primaryIndex); - }; - var keyMap = CodeMirror.keyMap; - keyMap.macSublime = { - "Cmd-Left": "goLineStartSmart", - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-Left": "goSubwordLeft", - "Ctrl-Right": "goSubwordRight", - "Ctrl-Alt-Up": "scrollLineUp", - "Ctrl-Alt-Down": "scrollLineDown", - "Cmd-L": "selectLine", - "Shift-Cmd-L": "splitSelectionByLine", - "Esc": "singleSelectionTop", - "Cmd-Enter": "insertLineAfter", - "Shift-Cmd-Enter": "insertLineBefore", - "Cmd-D": "selectNextOccurrence", - "Shift-Cmd-Space": "selectScope", - "Shift-Cmd-M": "selectBetweenBrackets", - "Cmd-M": "goToBracket", - "Cmd-Ctrl-Up": "swapLineUp", - "Cmd-Ctrl-Down": "swapLineDown", - "Cmd-/": "toggleCommentIndented", - "Cmd-J": "joinLines", - "Shift-Cmd-D": "duplicateLine", - "F5": "sortLines", - "Shift-F5": "reverseSortLines", - "Cmd-F5": "sortLinesInsensitive", - "Shift-Cmd-F5": "reverseSortLinesInsensitive", - "F2": "nextBookmark", - "Shift-F2": "prevBookmark", - "Cmd-F2": "toggleBookmark", - "Shift-Cmd-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - "Backspace": "smartBackspace", - "Cmd-K Cmd-D": "skipAndSelectNextOccurrence", - "Cmd-K Cmd-K": "delLineRight", - "Cmd-K Cmd-U": "upcaseAtCursor", - "Cmd-K Cmd-L": "downcaseAtCursor", - "Cmd-K Cmd-Space": "setSublimeMark", - "Cmd-K Cmd-A": "selectToSublimeMark", - "Cmd-K Cmd-W": "deleteToSublimeMark", - "Cmd-K Cmd-X": "swapWithSublimeMark", - "Cmd-K Cmd-Y": "sublimeYank", - "Cmd-K Cmd-C": "showInCenter", - "Cmd-K Cmd-G": "clearBookmarks", - "Cmd-K Cmd-Backspace": "delLineLeft", - "Cmd-K Cmd-1": "foldAll", - "Cmd-K Cmd-0": "unfoldAll", - "Cmd-K Cmd-J": "unfoldAll", - "Ctrl-Shift-Up": "addCursorToPrevLine", - "Ctrl-Shift-Down": "addCursorToNextLine", - "Cmd-F3": "findUnder", - "Shift-Cmd-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Cmd-[": "fold", - "Shift-Cmd-]": "unfold", - "Cmd-I": "findIncremental", - "Shift-Cmd-I": "findIncrementalReverse", - "Cmd-H": "replace", - "F3": "findNext", - "Shift-F3": "findPrev", - "fallthrough": "macDefault" - }; - CodeMirror.normalizeKeyMap(keyMap.macSublime); - keyMap.pcSublime = { - "Shift-Tab": "indentLess", - "Shift-Ctrl-K": "deleteLine", - "Alt-Q": "wrapLines", - "Ctrl-T": "transposeChars", - "Alt-Left": "goSubwordLeft", - "Alt-Right": "goSubwordRight", - "Ctrl-Up": "scrollLineUp", - "Ctrl-Down": "scrollLineDown", - "Ctrl-L": "selectLine", - "Shift-Ctrl-L": "splitSelectionByLine", - "Esc": "singleSelectionTop", - "Ctrl-Enter": "insertLineAfter", - "Shift-Ctrl-Enter": "insertLineBefore", - "Ctrl-D": "selectNextOccurrence", - "Shift-Ctrl-Space": "selectScope", - "Shift-Ctrl-M": "selectBetweenBrackets", - "Ctrl-M": "goToBracket", - "Shift-Ctrl-Up": "swapLineUp", - "Shift-Ctrl-Down": "swapLineDown", - "Ctrl-/": "toggleCommentIndented", - "Ctrl-J": "joinLines", - "Shift-Ctrl-D": "duplicateLine", - "F9": "sortLines", - "Shift-F9": "reverseSortLines", - "Ctrl-F9": "sortLinesInsensitive", - "Shift-Ctrl-F9": "reverseSortLinesInsensitive", - "F2": "nextBookmark", - "Shift-F2": "prevBookmark", - "Ctrl-F2": "toggleBookmark", - "Shift-Ctrl-F2": "clearBookmarks", - "Alt-F2": "selectBookmarks", - "Backspace": "smartBackspace", - "Ctrl-K Ctrl-D": "skipAndSelectNextOccurrence", - "Ctrl-K Ctrl-K": "delLineRight", - "Ctrl-K Ctrl-U": "upcaseAtCursor", - "Ctrl-K Ctrl-L": "downcaseAtCursor", - "Ctrl-K Ctrl-Space": "setSublimeMark", - "Ctrl-K Ctrl-A": "selectToSublimeMark", - "Ctrl-K Ctrl-W": "deleteToSublimeMark", - "Ctrl-K Ctrl-X": "swapWithSublimeMark", - "Ctrl-K Ctrl-Y": "sublimeYank", - "Ctrl-K Ctrl-C": "showInCenter", - "Ctrl-K Ctrl-G": "clearBookmarks", - "Ctrl-K Ctrl-Backspace": "delLineLeft", - "Ctrl-K Ctrl-1": "foldAll", - "Ctrl-K Ctrl-0": "unfoldAll", - "Ctrl-K Ctrl-J": "unfoldAll", - "Ctrl-Alt-Up": "addCursorToPrevLine", - "Ctrl-Alt-Down": "addCursorToNextLine", - "Ctrl-F3": "findUnder", - "Shift-Ctrl-F3": "findUnderPrevious", - "Alt-F3": "findAllUnder", - "Shift-Ctrl-[": "fold", - "Shift-Ctrl-]": "unfold", - "Ctrl-I": "findIncremental", - "Shift-Ctrl-I": "findIncrementalReverse", - "Ctrl-H": "replace", - "F3": "findNext", - "Shift-F3": "findPrev", - "fallthrough": "pcDefault" - }; - CodeMirror.normalizeKeyMap(keyMap.pcSublime); - var mac = keyMap.default == keyMap.macDefault; - keyMap.sublime = mac ? keyMap.macSublime : keyMap.pcSublime; - }); -})(); -var sublimeExports = sublime$2.exports; -const sublime = /* @__PURE__ */codemirror.getDefaultExportFromCjs(sublimeExports); -const sublime$1 = /* @__PURE__ */_mergeNamespaces({ - __proto__: null, - default: sublime -}, [sublimeExports]); -exports.sublime = sublime$1; - -/***/ }), - /***/ "../../graphiql-toolkit/dist/esm/async-helpers/index.js": /*!**************************************************************!*\ !*** ../../graphiql-toolkit/dist/esm/async-helpers/index.js ***! \**************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78192,6 +83470,7 @@ async function fetcherReturnToPromise(fetcherResult) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78259,6 +83538,7 @@ exports.__forAwait = __forAwait; \***********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78292,6 +83572,7 @@ function createGraphiQLFetcher(options) { \***************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78329,6 +83610,7 @@ var _createFetcher = __webpack_require__(/*! ./createFetcher */ "../../graphiql- \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78445,6 +83727,7 @@ async function getWsFetcher(options, fetcherOpts) { \***************************************************************/ /***/ (function() { +"use strict"; /***/ }), @@ -78455,6 +83738,7 @@ async function getWsFetcher(options, fetcherOpts) { \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78495,6 +83779,7 @@ function formatResult(result) { \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78608,6 +83893,7 @@ function isFieldType(fieldType) { \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78655,6 +83941,7 @@ Object.keys(_operationName).forEach(function (key) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78762,6 +84049,7 @@ function mergeAst(documentAST, schema) { \*************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78794,6 +84082,7 @@ function getSelectedOperationName(prevOperations, prevSelectedOperationName, ope \************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78863,6 +84152,7 @@ Object.keys(_storage).forEach(function (key) { \*******************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78937,6 +84227,7 @@ const STORAGE_NAMESPACE = "graphiql"; \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -78972,6 +84263,7 @@ function createLocalStorage({ \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -79074,6 +84366,7 @@ exports.HistoryStore = HistoryStore; \********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -79132,6 +84425,7 @@ Object.keys(_custom).forEach(function (key) { \********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -79194,12 +84488,13 @@ exports.QueryStore = QueryStore; /***/ }), -/***/ "./components/GraphiQL.tsx": -/*!*********************************!*\ - !*** ./components/GraphiQL.tsx ***! - \*********************************/ +/***/ "./GraphiQL.tsx": +/*!**********************!*\ + !*** ./GraphiQL.tsx ***! + \**********************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -79817,6 +85112,7 @@ function isChildComponentType(child, component) { \***************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -80117,6 +85413,7 @@ var _utils = __webpack_require__(/*! ./utils */ "../../graphql-language-service/ \*************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -80223,6 +85520,7 @@ exports.getFieldInsertText = getFieldInsertText; \**********************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -80863,6 +86161,7 @@ function unwrapType(state) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81085,6 +86384,7 @@ function getDefinitionForArgumentDefinition(path, text, definition) { \**********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81207,6 +86507,7 @@ function getLocation(node) { \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81400,6 +86701,7 @@ function text(into, content) { \******************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81535,6 +86837,7 @@ function concatMap(arr, fn) { \*************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81615,6 +86918,7 @@ var _getHoverInformation = __webpack_require__(/*! ./getHoverInformation */ "../ \********************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81734,6 +87038,7 @@ exports["default"] = CharacterStream; \****************************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81788,6 +87093,7 @@ function p(value, style) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -81992,6 +87298,7 @@ function type(style) { \********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82116,6 +87423,7 @@ function getContextAtPosition(queryText, cursor, schema, contextToken, options) \****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82333,6 +87641,7 @@ function getTypeInfo(schema, tokenState) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82494,6 +87803,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de \*****************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82715,6 +88025,7 @@ function lex(lexRules, stream) { \**********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82763,6 +88074,7 @@ const RuleKinds = exports.RuleKinds = Object.assign(Object.assign({}, _graphql.K \***************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82825,6 +88137,7 @@ var CompletionItemKind; \*********************************************************/ /***/ (function(__unused_webpack_module, exports) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82890,6 +88203,7 @@ function locToRange(text, loc) { \********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -82930,6 +88244,7 @@ function collectVariables(schema, documentAST) { \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83000,6 +88315,7 @@ exports.getFragmentDependenciesForAST = getFragmentDependenciesForAST; \************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83040,6 +88356,7 @@ function pointToOffset(text, point) { \*********************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83086,6 +88403,7 @@ const getQueryFacts = exports.getQueryFacts = getOperationFacts; \**************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83325,6 +88643,7 @@ function getVariablesJSONSchema(variableToType, options) { \*********************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83432,6 +88751,7 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; \***************************************************************************/ /***/ (function(__unused_webpack_module, exports, __webpack_require__) { +"use strict"; Object.defineProperty(exports, "__esModule", ({ @@ -83479,6 +88799,7 @@ function validateWithCustomRules(schema, ast, customRules, isRelayCompatMode, is \*******************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin @@ -83491,6 +88812,7 @@ __webpack_require__.r(__webpack_exports__); \*******************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin @@ -83503,6 +88825,7 @@ __webpack_require__.r(__webpack_exports__); \***********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin @@ -83515,6 +88838,7 @@ __webpack_require__.r(__webpack_exports__); \********************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { +"use strict"; __webpack_require__.r(__webpack_exports__); // extracted by mini-css-extract-plugin @@ -83527,6 +88851,7 @@ __webpack_require__.r(__webpack_exports__); \************************/ /***/ (function(module) { +"use strict"; module.exports = window["React"]; /***/ }), @@ -83537,6 +88862,7 @@ module.exports = window["React"]; \***************************/ /***/ (function(module) { +"use strict"; module.exports = window["ReactDOM"]; /***/ }), @@ -83547,6 +88873,7 @@ module.exports = window["ReactDOM"]; \***********************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; var __create = Object.create; var __defProp = Object.defineProperty; @@ -90708,6 +96035,7 @@ var Transition = Object.assign(TransitionRoot, { Child, Root: TransitionRoot }); \**************************************************************/ /***/ (function(module, __unused_webpack_exports, __webpack_require__) { +"use strict"; if (false) {} else { @@ -90723,6 +96051,7 @@ if (false) {} else { \***************************************************************/ /***/ (function(module) { +"use strict"; function _extends() { @@ -90800,8 +96129,9 @@ module.exports = _extends, module.exports.__esModule = true, module.exports["def /******/ /************************************************************************/ var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. +// This entry need to be wrapped in an IIFE because it need to be in strict mode. !function() { +"use strict"; var exports = __webpack_exports__; /*!****************!*\ !*** ./cdn.ts ***! @@ -90815,7 +96145,7 @@ exports["default"] = void 0; var GraphiQLReact = _interopRequireWildcard(__webpack_require__(/*! @graphiql/react */ "../../graphiql-react/dist/index.js")); var _toolkit = __webpack_require__(/*! @graphiql/toolkit */ "../../graphiql-toolkit/dist/esm/index.js"); var GraphQL = _interopRequireWildcard(__webpack_require__(/*! graphql */ "../../../node_modules/graphql/index.mjs")); -var _GraphiQL = __webpack_require__(/*! ./components/GraphiQL */ "./components/GraphiQL.tsx"); +var _GraphiQL = __webpack_require__(/*! ./GraphiQL */ "./GraphiQL.tsx"); __webpack_require__(/*! @graphiql/react/font/roboto.css */ "../../graphiql-react/font/roboto.css"); __webpack_require__(/*! @graphiql/react/font/fira-code.css */ "../../graphiql-react/font/fira-code.css"); __webpack_require__(/*! @graphiql/react/dist/style.css */ "../../graphiql-react/dist/style.css"); diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 1492913d94d3a12bd2e178c2c6d77d7e9b1dce51..4661582a3ffd9468ca9a0efe8fdc95c5c3855d0d 100644 GIT binary patch delta 782 zcmZXS&r20i6vt8D!5_VdM@|lU7- ztXQmEtlCKQFY_zQi4_%z!Elyc419(@J8g}%78sdV3QB9i7w5b(7TtK3K;ux0P-X*4 za>Ziwrj*zouFKn0p(Gs;ldm;EV|Cgmmc|I*Y67WFFBUZ|5CzJYBxp7%G0@X3%b)SQ z?tDO8rL!v_Mvf9UWVSP@o8-18o|wcr%d*tI(6Ogb)fs7T=SdkdQrTK8`owT--$AdJ z+ByF2SE4Otq8Fkf{IS}P9ZzIvjMij$t|@GSghqDCvmKlWJQt}oE)po(40}mlyTzNQ z;W!`2Kucy+H$7wul6?|&kGsPulTt_12afgge(+lxt z7}*_0VA&tb-!_4I3I>ZY3Z(1oG&V?O!iJL>FiZ8(jN}#mGt9FQ9 zV05lv6YJ8otAoarO+$>U^N!7&3C-n4N^k+efZr4#U7As`5m?kCe#tpZ6rI!nsLhK z5SXT*=wVDfTkdYcl>AkNiab_>s}ldvTNhd+;G~`_@}nzc;N;K8#@gDX>l*514W3zY z_DjK%OR8}6v=If^C4LxqB);T^Ob{lFraa$l diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index bfe749fd7191bffdf1f69f1e0d1ba1bd34466a24..d94269b5df242edad06ee43c5e12a766b88bf50c 100644 GIT binary patch delta 3889 zcmaJ^Yit}>71lWRv7@9LC$XJpTj$X~5U(`Vl*Tx=9@GuI=@D zy^szj=hsumFxR2?GtQ9-E?X$7>XLlLMINbmzHf)E8Ih2}w;NAsvdlh9O9&N+9} zShV8L%-nPD{m$z<=iYhmtMxBDS$}BOm@S)KFkAl9idT=6+sf+3UmdA9{P47Cc^##O z^(*1ElvA{WEQ)#)N)7UtV|i_*V%{hT`BO4-4gSpE}pjj<2|M>D)og~)Uj z<}b&)Pgw)QCQo*b$V++q$qg~r@y5yAQ7z8NR+ZpwJ+w{r%EG-oo-`S;V6vo5TcfsG z-acg)ZBf|GPn&}mBTTESmlcLfF(DJW(c^_JH5@=*q}6lqt(}-Chgy8h3l*)}z%ZFh z+TvaFFlpRbLK7V{j#AjIV!(ac3r80k1$>|#x{U^RrX9Y%b}P+?30)2DVvwk}hkfES z>Bz`*%4AB!@WnW+j>{Y|#^*>Jg)gI~xHW(GIPIZi5K|nDL;>liq19l|LmoCM=y8n1 zVb#M9@rFpzd1tw`pX_KgB@2yaFPqnD_VH`lWD6C8+w|p+VSP8ODC>x!zZ=#qPX-#q zdgUEdD#bZ#bVs|PP`)C@Tlxti!29g9D2#RCwVy#9R`-KvS)B0`WQUa#ipHYY*biIh z$(w>~<)_N~2)qkV^%L0Z^T7I)Rj`>SgEBd81hH!X)-M)9gozs}5yV3S@EN1qJvIQX z#`2^vEFq-hn2iKe?%W=@$M8rkCcKmpE9=y%!?r&d$w^kkO+YpHQAjs2r7MPf zirnp3w1Rvpn)Igb94NJfgtB*(J~>`ANr9x)OPNdY5gYsVNNI7rtOKRhRH*iD>a^ss zw7h-8@~wLsS5=rEPOj871c~g~$K<7m&@s{@ou$EakNqA#OCcGy{Xuaow}U`a!|ug5 z;G@ce^2ja<5&bi@$pwSpOqrd^C` zc(OOd^f*xB1g+aoV->^BH(~Ln06P?-hwTfLtSA{!dXdV4E+8pVL`{<0797p50?Ib9p1;26`C~~ zeKUMUIe~G0SwX!|;>(+J_=~sTm6cOr4rLD?7@ZU~Dh(b-XYi@N!I7$IKA_cL-re|j zIA$2_c>HZx>nXB>;$762WP+9e16AI>U!Ur{GXkqeL*?gx5~N#ycY) zt~m|UMh8A~8bX`05+;Y~*FP3vV6kH)aA$&#l`$+o1I=a0AU=Ku)?xn{Sh~DJG{%`6 zeUvU`>DhEut5({E*UrG2s&*Om`Ec1;XsDq%c2@{Wl%r^beAsgqzUCR?Hp5I|s0>~^ z3xByMC9**gW${n{fbObcEy`iTIe2i1j%g_uRuOldgFW>rrlsmI^QGGlod`|B7O}*d zz~9lGPz$#YNWxS2>kF{XXuxw9V6(9mJr`lk z!UnM^G!((+i?FdQ8NuBbpa0vfw=-%FJsf@3MTczsXbv{E`vo>SF42#X2k;9qm)LN(T2iIZSDmv!HX-C;~h)I9n$CWXKA6^Hw zUn`Qf!P*E`-$tYxQ!{6EcjSUIs2rb3cONl;DlX2K6F#Eiaw>F%8fDIAt;{gHw}8+7 z6E+{zsVm7pK4-Gh%u828%2aGZT2`EHE(9P!%LeG4Cx!{+r*CCTD9~hXtVKNLs9Na& z9WJz${Ma(j5te+KgOtMtGl$vtVNKf|r{}NbGx3uV=~NEgWjRo3eEoe`v5;J#-rHp6 z@e~iqEE@XF9r(vNsQEvvsQ+J9(8Y90h{CsBXKx`i$Y{pUO<1?JNmFn)W2v;P zmODT=6=Bc__t6+vs+z%PZo-C@WCLlJtF>fV7|S(r{3f&$YUM51P*V`pFzvItCU!7T ze;yyb1));Qi|6t1EvT!awn=)a9lm%AA}jAUQHNq=sc4V+{sC-* zywA=#1+2aec>m}`AZhBdmmetl%d)a<0dj=@;HKQ)+=eB$7Y*f7`vZdq5|blj=KGba f%Ez+#3H-w8$~t%XjmqbsJdw}m+?PMBe5CTf=j4Os delta 3650 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, 2025 # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-12-12 05:02+0000\n" +"POT-Creation-Date: 2025-01-04 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" -"Last-Translator: Jeremy Stretch, 2024\n" +"Last-Translator: marcpaulchand , 2025\n" "Language-Team: French (https://app.transifex.com/netbox-community/teams/178115/fr/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -158,7 +159,7 @@ msgstr "Inactif" #: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 #: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 #: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 -#: netbox/ipam/filtersets.py:339 netbox/ipam/filtersets.py:959 +#: netbox/ipam/filtersets.py:341 netbox/ipam/filtersets.py:961 #: netbox/virtualization/filtersets.py:45 #: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 msgid "Region (ID)" @@ -170,8 +171,8 @@ msgstr "Région (ID)" #: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 #: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 #: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 -#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:346 -#: netbox/ipam/filtersets.py:966 netbox/virtualization/filtersets.py:52 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:348 +#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52 #: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "Région (slug)" @@ -181,8 +182,8 @@ msgstr "Région (slug)" #: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 #: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 #: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 -#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:352 -#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:58 +#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:354 +#: netbox/ipam/filtersets.py:974 netbox/virtualization/filtersets.py:58 #: netbox/virtualization/filtersets.py:186 msgid "Site group (ID)" msgstr "Groupe de sites (ID)" @@ -193,7 +194,7 @@ msgstr "Groupe de sites (ID)" #: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 #: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 #: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 -#: netbox/ipam/filtersets.py:359 netbox/ipam/filtersets.py:979 +#: netbox/ipam/filtersets.py:361 netbox/ipam/filtersets.py:981 #: netbox/virtualization/filtersets.py:65 #: netbox/virtualization/filtersets.py:193 msgid "Site group (slug)" @@ -263,8 +264,8 @@ msgstr "Site" #: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 #: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 #: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 -#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:238 -#: netbox/ipam/filtersets.py:369 netbox/ipam/filtersets.py:989 +#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:240 +#: netbox/ipam/filtersets.py:371 netbox/ipam/filtersets.py:991 #: netbox/virtualization/filtersets.py:75 #: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 msgid "Site (slug)" @@ -283,13 +284,13 @@ msgstr "Numéro d'AS" #: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 #: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 -#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:243 +#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:245 msgid "Provider (ID)" msgstr "Fournisseur (ID)" #: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 #: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 -#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:249 +#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:251 msgid "Provider (slug)" msgstr "Fournisseur (slug)" @@ -318,8 +319,8 @@ msgstr "Type de circuit (slug)" #: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 #: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 #: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 -#: netbox/ipam/filtersets.py:232 netbox/ipam/filtersets.py:363 -#: netbox/ipam/filtersets.py:983 netbox/virtualization/filtersets.py:69 +#: netbox/ipam/filtersets.py:234 netbox/ipam/filtersets.py:365 +#: netbox/ipam/filtersets.py:985 netbox/virtualization/filtersets.py:69 #: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "Site (ID)" @@ -673,7 +674,7 @@ msgstr "Identifiant de compte du prestataire" #: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 #: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 #: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 -#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:69 +#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:70 #: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 #: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 #: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 @@ -1108,7 +1109,7 @@ msgstr "Affectation" #: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 #: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 #: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 -#: netbox/ipam/filtersets.py:999 netbox/ipam/forms/bulk_edit.py:493 +#: netbox/ipam/filtersets.py:1001 netbox/ipam/forms/bulk_edit.py:493 #: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 #: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 #: netbox/ipam/tables/vlans.py:226 @@ -1548,7 +1549,7 @@ msgstr "Bande passante garantie" #: netbox/circuits/tables/providers.py:82 #: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 #: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 -#: netbox/dcim/tables/modules.py:72 netbox/dcim/tables/power.py:39 +#: netbox/dcim/tables/modules.py:73 netbox/dcim/tables/power.py:39 #: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 #: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 #: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 @@ -2954,7 +2955,7 @@ msgid "Parent site group (slug)" msgstr "Groupe de sites parents (slug)" #: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 -#: netbox/ipam/filtersets.py:841 netbox/ipam/filtersets.py:993 +#: netbox/ipam/filtersets.py:843 netbox/ipam/filtersets.py:995 msgid "Group (ID)" msgstr "Groupe (ID)" @@ -3004,23 +3005,23 @@ msgstr "Fabricant (slug)" #: netbox/dcim/filtersets.py:393 msgid "Rack type (slug)" -msgstr "Type de rack (limace)" +msgstr "Type de baie (slug)" #: netbox/dcim/filtersets.py:397 msgid "Rack type (ID)" -msgstr "Type de rack (ID)" +msgstr "Type de baie (ID)" #: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 #: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 -#: netbox/ipam/filtersets.py:381 netbox/ipam/filtersets.py:493 -#: netbox/ipam/filtersets.py:1003 netbox/virtualization/filtersets.py:210 +#: netbox/ipam/filtersets.py:383 netbox/ipam/filtersets.py:495 +#: netbox/ipam/filtersets.py:1005 netbox/virtualization/filtersets.py:210 msgid "Role (ID)" msgstr "Rôle (ID)" #: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 #: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 -#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:387 -#: netbox/ipam/filtersets.py:499 netbox/ipam/filtersets.py:1009 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:389 +#: netbox/ipam/filtersets.py:501 netbox/ipam/filtersets.py:1011 #: netbox/virtualization/filtersets.py:216 msgid "Role (slug)" msgstr "Rôle (slug)" @@ -3218,7 +3219,7 @@ msgstr "VDC (IDENTIFIANT)" msgid "Device model" msgstr "Modèle d'appareil" -#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:632 +#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:634 #: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 msgid "Interface (ID)" msgstr "Interface (ID)" @@ -3232,8 +3233,8 @@ msgid "Module bay (ID)" msgstr "Baie modulaire (ID)" #: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 -#: netbox/ipam/filtersets.py:611 netbox/ipam/filtersets.py:851 -#: netbox/ipam/filtersets.py:1115 netbox/virtualization/filtersets.py:161 +#: netbox/ipam/filtersets.py:613 netbox/ipam/filtersets.py:853 +#: netbox/ipam/filtersets.py:1117 netbox/virtualization/filtersets.py:161 #: netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "Appareil (ID)" @@ -3242,8 +3243,8 @@ msgstr "Appareil (ID)" msgid "Rack (name)" msgstr "Baie (nom)" -#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:606 -#: netbox/ipam/filtersets.py:846 netbox/ipam/filtersets.py:1121 +#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:608 +#: netbox/ipam/filtersets.py:848 netbox/ipam/filtersets.py:1123 #: netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "Appareil (nom)" @@ -3295,9 +3296,9 @@ msgstr "VID attribué" #: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 #: netbox/dcim/forms/model_forms.py:1385 #: netbox/dcim/models/device_components.py:711 -#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:316 -#: netbox/ipam/filtersets.py:327 netbox/ipam/filtersets.py:483 -#: netbox/ipam/filtersets.py:584 netbox/ipam/filtersets.py:595 +#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:318 +#: netbox/ipam/filtersets.py:329 netbox/ipam/filtersets.py:485 +#: netbox/ipam/filtersets.py:586 netbox/ipam/filtersets.py:597 #: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 #: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 #: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 @@ -3324,19 +3325,19 @@ msgstr "VID attribué" msgid "VRF" msgstr "VRF" -#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:322 -#: netbox/ipam/filtersets.py:333 netbox/ipam/filtersets.py:489 -#: netbox/ipam/filtersets.py:590 netbox/ipam/filtersets.py:601 +#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:324 +#: netbox/ipam/filtersets.py:335 netbox/ipam/filtersets.py:491 +#: netbox/ipam/filtersets.py:592 netbox/ipam/filtersets.py:603 msgid "VRF (RD)" msgstr "VRF (RD)" -#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1030 +#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1032 #: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "L2VPN (IDENTIFIANT)" #: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 -#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1036 +#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1038 #: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 #: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 #: netbox/templates/vpn/l2vpntermination.html:12 @@ -3441,7 +3442,7 @@ msgstr "Panneau d'alimentation (ID)" #: netbox/templates/inc/panels/tags.html:5 #: netbox/utilities/forms/fields/fields.py:81 msgid "Tags" -msgstr "Balises" +msgstr "Étiquettes" #: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 #: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 @@ -3498,7 +3499,7 @@ msgstr "Fuseau horaire" #: netbox/dcim/forms/object_import.py:187 netbox/dcim/tables/devices.py:96 #: netbox/dcim/tables/devices.py:172 netbox/dcim/tables/devices.py:940 #: netbox/dcim/tables/devicetypes.py:80 netbox/dcim/tables/devicetypes.py:308 -#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:60 +#: netbox/dcim/tables/modules.py:20 netbox/dcim/tables/modules.py:61 #: netbox/dcim/tables/racks.py:58 netbox/dcim/tables/racks.py:132 #: netbox/templates/dcim/devicetype.html:14 #: netbox/templates/dcim/inventoryitem.html:44 @@ -3597,7 +3598,7 @@ msgstr "Unité de poids" #: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 #: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" -msgstr "Type de rack" +msgstr "Type de baie" #: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 #: netbox/dcim/forms/model_forms.py:297 @@ -3749,7 +3750,7 @@ msgid "Device Type" msgstr "Type d'appareil" #: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 -#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:65 +#: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:66 #: netbox/templates/dcim/module.html:65 #: netbox/templates/dcim/modulebay.html:66 #: netbox/templates/dcim/moduletype.html:22 @@ -3857,7 +3858,7 @@ msgstr "Cluster" #: netbox/dcim/tables/devices.py:697 netbox/dcim/tables/devices.py:754 #: netbox/dcim/tables/devices.py:801 netbox/dcim/tables/devices.py:861 #: netbox/dcim/tables/devices.py:930 netbox/dcim/tables/devices.py:1057 -#: netbox/dcim/tables/modules.py:52 netbox/extras/forms/filtersets.py:321 +#: netbox/dcim/tables/modules.py:53 netbox/extras/forms/filtersets.py:321 #: netbox/ipam/forms/bulk_import.py:304 netbox/ipam/forms/bulk_import.py:505 #: netbox/ipam/forms/filtersets.py:551 netbox/ipam/forms/model_forms.py:323 #: netbox/ipam/forms/model_forms.py:712 netbox/ipam/forms/model_forms.py:745 @@ -4098,22 +4099,22 @@ msgstr "groupe VLAN" #: netbox/virtualization/forms/bulk_edit.py:248 #: netbox/virtualization/forms/model_forms.py:326 msgid "Untagged VLAN" -msgstr "VLAN non balisé" +msgstr "VLAN non étiqueté" #: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 #: netbox/dcim/tables/devices.py:585 #: netbox/virtualization/forms/bulk_edit.py:256 #: netbox/virtualization/forms/model_forms.py:335 msgid "Tagged VLANs" -msgstr "VLAN balisés" +msgstr "VLAN étiqueté" #: netbox/dcim/forms/bulk_edit.py:1511 msgid "Add tagged VLANs" -msgstr "" +msgstr "Ajouter des VLANs étiquetés" #: netbox/dcim/forms/bulk_edit.py:1520 msgid "Remove tagged VLANs" -msgstr "" +msgstr "Retirer des VLANs étiquetés" #: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 msgid "Wireless LAN group" @@ -4161,7 +4162,7 @@ msgstr "Commutation 802.1Q" #: netbox/dcim/forms/bulk_edit.py:1558 msgid "Add/Remove" -msgstr "" +msgstr "Ajouter/Supprimer" #: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 msgid "Interface mode must be specified to assign VLANs" @@ -4170,7 +4171,7 @@ msgstr "Le mode d'interface doit être spécifié pour attribuer des VLAN" #: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" -"Des tags de VLAN ne peuvent pas être associés à une interface d'accès." +"Des étiquettes de VLAN ne peuvent pas être associés à une interface d'accès." #: netbox/dcim/forms/bulk_import.py:64 msgid "Name of parent region" @@ -4212,11 +4213,11 @@ msgstr "Emplacement introuvable." #: netbox/dcim/forms/bulk_import.py:185 msgid "The manufacturer of this rack type" -msgstr "Le fabricant de ce type de rack" +msgstr "Le fabricant de ce type de baie" #: netbox/dcim/forms/bulk_import.py:196 msgid "The lowest-numbered position in the rack" -msgstr "La position la plus basse du rack" +msgstr "La position la plus basse de la baie" #: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 msgid "Rail-to-rail width (in inches)" @@ -4228,7 +4229,7 @@ msgstr "Unité pour les dimensions extérieures" #: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 msgid "Unit for rack weights" -msgstr "Unité poids de la baie" +msgstr "Unité de poids de la baie" #: netbox/dcim/forms/bulk_import.py:245 msgid "Name of assigned tenant" @@ -4240,7 +4241,7 @@ msgstr "Nom du rôle attribué" #: netbox/dcim/forms/bulk_import.py:264 msgid "Rack type model" -msgstr "" +msgstr "Modèle de baie" #: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 #: netbox/dcim/forms/bulk_import.py:605 @@ -4656,8 +4657,9 @@ msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" msgstr "" -"Les VLAN balisés ({vlans}) doivent appartenir au même site que l'appareil/la" -" machine virtuelle parent de l'interface, ou ils doivent être globaux" +"Les VLAN étiquetés ({vlans}) doivent appartenir au même site que " +"l'appareil/la machine virtuelle parente de l'interface, ou ils doivent être " +"globaux" #: netbox/dcim/forms/common.py:126 msgid "" @@ -4863,7 +4865,7 @@ msgstr "Identifiant" #: netbox/dcim/forms/model_forms.py:259 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" -"Sélectionnez un type de rack prédéfini ou définissez les caractéristiques " +"Sélectionnez un type de baie prédéfini ou définissez les caractéristiques " "physiques ci-dessous." #: netbox/dcim/forms/model_forms.py:265 @@ -5637,7 +5639,7 @@ msgstr "réseaux locaux sans fil" #: netbox/dcim/models/device_components.py:697 #: netbox/virtualization/models/virtualmachines.py:335 msgid "untagged VLAN" -msgstr "VLAN non balisé" +msgstr "VLAN non étiqueté" #: netbox/dcim/models/device_components.py:703 #: netbox/virtualization/models/virtualmachines.py:341 @@ -5786,7 +5788,7 @@ msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent device, or it must be global." msgstr "" -"Le VLAN non balisé ({untagged_vlan}) doit appartenir au même site que " +"Le VLAN non étiqueté ({untagged_vlan}) doit appartenir au même site que " "l'appareil parent de l'interface, ou il doit être global." #: netbox/dcim/models/device_components.py:990 @@ -6494,11 +6496,11 @@ msgstr "facteur de forme" #: netbox/dcim/models/racks.py:162 msgid "rack type" -msgstr "type de rack" +msgstr "type de baie" #: netbox/dcim/models/racks.py:163 msgid "rack types" -msgstr "types de rayonnages" +msgstr "types de baies" #: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 msgid "Must specify a unit when setting an outer width/depth" @@ -6852,7 +6854,7 @@ msgstr "Baies pour modules" msgid "Inventory items" msgstr "Articles d'inventaire" -#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:56 +#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:57 #: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "Module Bay" @@ -7135,7 +7137,7 @@ msgstr "Réservations" #: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" -msgstr "Appareils non rackés" +msgstr "Appareils non mis en baie" #: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 @@ -7584,12 +7586,12 @@ msgstr "Signets" msgid "Show your personal bookmarks" msgstr "Afficher vos favoris personnels" -#: netbox/extras/events.py:147 +#: netbox/extras/events.py:151 #, python-brace-format msgid "Unknown action type for an event rule: {action_type}" msgstr "Type d'action inconnu pour une règle d'événement : {action_type}" -#: netbox/extras/events.py:192 +#: netbox/extras/events.py:196 #, python-brace-format msgid "Cannot import events pipeline {name} error: {error}" msgstr "" @@ -7632,11 +7634,11 @@ msgstr "Groupe de locataires (slug)" #: netbox/extras/filtersets.py:623 netbox/extras/forms/model_forms.py:495 #: netbox/templates/extras/tag.html:11 msgid "Tag" -msgstr "Balise" +msgstr "Étiquette" #: netbox/extras/filtersets.py:629 msgid "Tag (slug)" -msgstr "Tag (slug)" +msgstr "Étiquette (slug)" #: netbox/extras/filtersets.py:689 netbox/extras/forms/filtersets.py:429 msgid "Has local config context data" @@ -7932,7 +7934,7 @@ msgstr "Type d'action" #: netbox/extras/forms/filtersets.py:307 msgid "Tagged object type" -msgstr "Type d'objet balisé" +msgstr "Type d'objet étiqueté" #: netbox/extras/forms/filtersets.py:312 msgid "Allowed object type" @@ -9066,7 +9068,7 @@ msgstr "étiquette" #: netbox/extras/models/tags.py:50 msgid "tags" -msgstr "balises" +msgstr "étiquettes" #: netbox/extras/models/tags.py:78 msgid "tagged item" @@ -9395,129 +9397,129 @@ msgstr "Exportation de L2VPN" msgid "Exporting L2VPN (identifier)" msgstr "Exportation de L2VPN (identifiant)" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 #: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "Préfixe" #: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:223 msgid "RIR (ID)" msgstr "RIRE (ID)" #: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:229 msgid "RIR (slug)" msgstr "RIR (slug)" -#: netbox/ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:287 msgid "Within prefix" msgstr "Dans le préfixe" -#: netbox/ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:291 msgid "Within and including prefix" msgstr "Dans le préfixe et y compris" -#: netbox/ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:295 msgid "Prefixes which contain this prefix or IP" msgstr "Préfixes contenant ce préfixe ou cette adresse IP" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 #: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 #: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "Longueur du masque" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (IDENTIFIANT)" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "Numéro de VLAN (1-4094)" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 +#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "Adresse" -#: netbox/ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:481 msgid "Ranges which contain this prefix or IP" msgstr "Plages contenant ce préfixe ou cette adresse IP" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 msgid "Parent prefix" msgstr "Préfixe parent" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 +#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "Machine virtuelle (nom)" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 +#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 #: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "Machine virtuelle (ID)" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 #: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "Interface (nom)" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 #: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "Interface de machine virtuelle (nom)" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "Interface de machine virtuelle (ID)" -#: netbox/ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:650 msgid "FHRP group (ID)" msgstr "Groupe FHRP (ID)" -#: netbox/ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:654 msgid "Is assigned to an interface" msgstr "Est affecté à une interface" -#: netbox/ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:658 msgid "Is assigned" msgstr "Est attribué" -#: netbox/ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:670 msgid "Service (ID)" msgstr "Service (ID)" -#: netbox/ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:675 msgid "NAT inside IP address (ID)" msgstr "Adresse IP intérieure NAT (ID)" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "Interface attribuée" -#: netbox/ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1048 msgid "Assigned VM interface" msgstr "Interface de machine virtuelle attribuée" -#: netbox/ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1138 msgid "IP address (ID)" msgstr "Adresse IP (ID)" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "Adresse IP" -#: netbox/ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1169 msgid "Primary IPv4 (ID)" msgstr "IPv4 principal (ID)" -#: netbox/ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1174 msgid "Primary IPv6 (ID)" msgstr "IPv6 principal (ID)" @@ -9606,7 +9608,7 @@ msgstr "Longueur du préfixe" #: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 #: netbox/templates/ipam/prefix.html:85 msgid "Is a pool" -msgstr "C'est une piscine" +msgstr "C'est une plage d'adresses" #: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 #: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 @@ -10175,7 +10177,7 @@ msgstr "La fonction principale de ce préfixe" #: netbox/ipam/models/ip.py:265 msgid "is a pool" -msgstr "est une piscine" +msgstr "est une plage d'adresses" #: netbox/ipam/models/ip.py:267 msgid "All IP addresses within this prefix are considered usable" @@ -10523,7 +10525,7 @@ msgstr "Profondeur" #: netbox/ipam/tables/ip.py:262 msgid "Pool" -msgstr "Piscine" +msgstr "Plage d'adresses" #: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 msgid "Marked Utilized" @@ -10989,11 +10991,11 @@ msgstr "" #: netbox/netbox/forms/base.py:120 msgid "Add tags" -msgstr "Ajouter des tags" +msgstr "Ajouter des étiquettes" #: netbox/netbox/forms/base.py:125 msgid "Remove tags" -msgstr "Supprimer les tags" +msgstr "Supprimer les étiquettes" #: netbox/netbox/forms/mixins.py:38 #, python-brace-format @@ -11081,7 +11083,7 @@ msgstr "Associer des contacts" #: netbox/netbox/navigation/menu.py:50 msgid "Rack Roles" -msgstr "Rôles des baies" +msgstr "Rôles de la baie" #: netbox/netbox/navigation/menu.py:54 msgid "Elevations" @@ -11089,7 +11091,7 @@ msgstr "Élévations" #: netbox/netbox/navigation/menu.py:60 netbox/netbox/navigation/menu.py:62 msgid "Rack Types" -msgstr "Types de rayonnages" +msgstr "Types de baie" #: netbox/netbox/navigation/menu.py:76 msgid "Modules" @@ -12197,7 +12199,7 @@ msgstr "Dossiers" #: netbox/templates/core/inc/config_data.html:7 msgid "Rack elevations" -msgstr "Élévations des rayonnages" +msgstr "Positions en baie" #: netbox/templates/core/inc/config_data.html:10 msgid "Default unit height" @@ -12613,7 +12615,7 @@ msgstr "Non connecté" #: netbox/templates/dcim/device.html:34 msgid "Highlight device in rack" -msgstr "Surligner l'appareil dans le rack" +msgstr "Surligner l'appareil dans la baie" #: netbox/templates/dcim/device.html:55 msgid "Not racked" @@ -12939,7 +12941,7 @@ msgstr "Non connecté" #: netbox/templates/dcim/inc/interface_vlans_table.html:6 msgid "Untagged" -msgstr "Non taggé" +msgstr "Non étiqueté" #: netbox/templates/dcim/inc/interface_vlans_table.html:37 msgid "No VLANs Assigned" @@ -12969,7 +12971,7 @@ msgstr "Unités décroissantes" #: netbox/templates/dcim/inc/rack_elevation.html:3 msgid "Rack elevation" -msgstr "Élévation du rack" +msgstr "Position en baie" #: netbox/templates/dcim/interface.html:17 msgid "Add Child Interface" @@ -13165,7 +13167,7 @@ msgstr "Afficher la liste" #: netbox/templates/dcim/rack_elevation_list.html:14 msgid "Select rack view" -msgstr "Sélectionnez la vue du rack" +msgstr "Sélectionnez la vue de la baie" #: netbox/templates/dcim/rack_elevation_list.html:25 msgid "Sort By" @@ -13275,7 +13277,7 @@ msgstr "Édition d'un châssis virtuel %(name)s" #: netbox/templates/dcim/virtualchassis_edit.html:53 msgid "Rack/Unit" -msgstr "Baie/U" +msgstr "Baie/Unité" #: netbox/templates/dcim/virtualchassis_remove_member.html:5 msgid "Remove Virtual Chassis Member" @@ -13690,7 +13692,7 @@ msgstr "Tous" #: netbox/templates/extras/tag.html:32 msgid "Tagged Items" -msgstr "Articles taggés" +msgstr "Articles étiquetés" #: netbox/templates/extras/tag.html:43 msgid "Allowed Object Types" @@ -13702,11 +13704,11 @@ msgstr "N'importe lequel" #: netbox/templates/extras/tag.html:57 msgid "Tagged Item Types" -msgstr "Types d'articles taggés" +msgstr "Types d'articles étiquetés" #: netbox/templates/extras/tag.html:81 msgid "Tagged Objects" -msgstr "Objets taggés" +msgstr "Objets étiquetés" #: netbox/templates/extras/webhook.html:26 msgid "HTTP Method" @@ -15559,12 +15561,12 @@ msgstr "Mémoire (Mo)" #: netbox/virtualization/forms/bulk_edit.py:174 msgid "Disk (MB)" -msgstr "" +msgstr "Disque (Mo)" #: netbox/virtualization/forms/bulk_edit.py:334 #: netbox/virtualization/forms/filtersets.py:251 msgid "Size (MB)" -msgstr "" +msgstr "Taille (Mo)" #: netbox/virtualization/forms/bulk_import.py:44 msgid "Type of cluster" @@ -15737,7 +15739,7 @@ msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent virtual machine, or it must be global." msgstr "" -"Le VLAN non taggé ({untagged_vlan}) doit appartenir au même site que la " +"Le VLAN non étiqueté ({untagged_vlan}) doit appartenir au même site que la " "machine virtuelle parente de l'interface, ou il doit être global." #: netbox/virtualization/models/virtualmachines.py:434 @@ -15780,19 +15782,19 @@ msgstr "GRE" #: netbox/vpn/choices.py:39 msgid "WireGuard" -msgstr "" +msgstr "Wireguard" #: netbox/vpn/choices.py:40 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: netbox/vpn/choices.py:41 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: netbox/vpn/choices.py:42 msgid "PPTP" -msgstr "" +msgstr "PPTP" #: netbox/vpn/choices.py:64 msgid "Hub" diff --git a/requirements.txt b/requirements.txt index bd16b5d10..e5ffe8386 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -Django==5.1.3 +Django==5.1.4 django-cors-headers==4.6.0 django-debug-toolbar==4.4.6 django-filter==24.3 From 14cec518f5fd9e2ac75d6342a476b9250ad8861a Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 6 Jan 2025 16:56:58 -0500 Subject: [PATCH 124/169] Closes #18311: Update minimum required version of PostgreSQL --- docs/configuration/required-parameters.md | 2 +- docs/installation/1-postgresql.md | 6 +++--- docs/introduction.md | 2 +- docs/release-notes/version-4.2.md | 1 + 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/configuration/required-parameters.md b/docs/configuration/required-parameters.md index 90eb8c0cf..f9a5a6f87 100644 --- a/docs/configuration/required-parameters.md +++ b/docs/configuration/required-parameters.md @@ -25,7 +25,7 @@ ALLOWED_HOSTS = ['*'] ## DATABASE -NetBox requires access to a PostgreSQL 12 or later database service to store data. This service can run locally on the NetBox server or on a remote system. The following parameters must be defined within the `DATABASE` dictionary: +NetBox requires access to a PostgreSQL 13 or later database service to store data. This service can run locally on the NetBox server or on a remote system. The following parameters must be defined within the `DATABASE` dictionary: * `NAME` - Database name * `USER` - PostgreSQL username diff --git a/docs/installation/1-postgresql.md b/docs/installation/1-postgresql.md index 9d30f4514..3f826fa8a 100644 --- a/docs/installation/1-postgresql.md +++ b/docs/installation/1-postgresql.md @@ -2,8 +2,8 @@ This section entails the installation and configuration of a local PostgreSQL database. If you already have a PostgreSQL database service in place, skip to [the next section](2-redis.md). -!!! warning "PostgreSQL 12 or later required" - NetBox requires PostgreSQL 12 or later. Please note that MySQL and other relational databases are **not** supported. +!!! warning "PostgreSQL 13 or later required" + NetBox requires PostgreSQL 13 or later. Please note that MySQL and other relational databases are **not** supported. ## Installation @@ -34,7 +34,7 @@ This section entails the installation and configuration of a local PostgreSQL da sudo systemctl enable --now postgresql ``` -Before continuing, verify that you have installed PostgreSQL 12 or later: +Before continuing, verify that you have installed PostgreSQL 13 or later: ```no-highlight psql -V diff --git a/docs/introduction.md b/docs/introduction.md index b8442dad7..75701c119 100644 --- a/docs/introduction.md +++ b/docs/introduction.md @@ -79,5 +79,5 @@ NetBox is built on the [Django](https://djangoproject.com/) Python framework and | HTTP service | nginx or Apache | | WSGI service | gunicorn or uWSGI | | Application | Django/Python | -| Database | PostgreSQL 12+ | +| Database | PostgreSQL 13+ | | Task queuing | Redis/django-rq | diff --git a/docs/release-notes/version-4.2.md b/docs/release-notes/version-4.2.md index 75a776573..fdbc09114 100644 --- a/docs/release-notes/version-4.2.md +++ b/docs/release-notes/version-4.2.md @@ -5,6 +5,7 @@ ### Breaking Changes * Support for the Django admin UI has been completely removed. (The Django admin UI was disabled by default in NetBox v4.0.) +* This release drops support for PostgreSQL 12. PostgreSQL 13 or later is required to run this release. * NetBox has adopted collation-based natural ordering for many models. This may alter the order in which some objects are listed by default. * Automatic redirects from pre-v4.1 UI views for virtual disks have been removed. * The `site` and `provider_network` foreign key fields on `circuits.CircuitTermination` have been replaced by the `termination` generic foreign key. From ed541220e85ccb1093947d216f3b0e2acd040c20 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 05:02:25 +0000 Subject: [PATCH 125/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 6779 ++++++++++-------- 1 file changed, 3667 insertions(+), 3112 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 5d1188333..8a7614860 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-04 05:02+0000\n" +"POT-Creation-Date: 2025-01-07 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -28,7 +28,7 @@ msgstr "" msgid "Write Enabled" msgstr "" -#: netbox/account/tables.py:35 netbox/core/choices.py:86 +#: netbox/account/tables.py:35 netbox/core/choices.py:100 #: netbox/core/tables/jobs.py:29 netbox/core/tables/tasks.py:79 #: netbox/extras/tables/tables.py:335 netbox/extras/tables/tables.py:566 #: netbox/templates/account/token.html:43 @@ -39,7 +39,9 @@ msgstr "" #: netbox/templates/core/rq_worker.html:14 #: netbox/templates/extras/htmx/script_result.html:12 #: netbox/templates/extras/journalentry.html:22 -#: netbox/templates/generic/object.html:58 netbox/templates/users/token.html:35 +#: netbox/templates/generic/object.html:58 +#: netbox/templates/htmx/quick_add_created.html:7 +#: netbox/templates/users/token.html:35 msgid "Created" msgstr "" @@ -82,24 +84,25 @@ msgstr "" #: netbox/circuits/choices.py:21 netbox/dcim/choices.py:20 #: netbox/dcim/choices.py:102 netbox/dcim/choices.py:185 -#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1532 -#: netbox/dcim/choices.py:1608 netbox/dcim/choices.py:1658 -#: netbox/virtualization/choices.py:20 netbox/virtualization/choices.py:45 -#: netbox/vpn/choices.py:18 +#: netbox/dcim/choices.py:237 netbox/dcim/choices.py:1534 +#: netbox/dcim/choices.py:1592 netbox/dcim/choices.py:1642 +#: netbox/dcim/choices.py:1664 netbox/virtualization/choices.py:20 +#: netbox/virtualization/choices.py:45 netbox/vpn/choices.py:18 msgid "Planned" msgstr "" -#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:305 +#: netbox/circuits/choices.py:22 netbox/netbox/navigation/menu.py:326 msgid "Provisioning" msgstr "" #: netbox/circuits/choices.py:23 netbox/core/tables/tasks.py:22 #: netbox/dcim/choices.py:22 netbox/dcim/choices.py:103 #: netbox/dcim/choices.py:184 netbox/dcim/choices.py:236 -#: netbox/dcim/choices.py:1607 netbox/dcim/choices.py:1657 -#: netbox/extras/tables/tables.py:495 netbox/ipam/choices.py:31 -#: netbox/ipam/choices.py:49 netbox/ipam/choices.py:69 -#: netbox/ipam/choices.py:154 netbox/templates/extras/configcontext.html:25 +#: netbox/dcim/choices.py:1591 netbox/dcim/choices.py:1641 +#: netbox/dcim/choices.py:1663 netbox/extras/tables/tables.py:495 +#: netbox/ipam/choices.py:31 netbox/ipam/choices.py:49 +#: netbox/ipam/choices.py:69 netbox/ipam/choices.py:154 +#: netbox/templates/extras/configcontext.html:25 #: netbox/templates/users/user.html:37 netbox/users/forms/bulk_edit.py:38 #: netbox/virtualization/choices.py:22 netbox/virtualization/choices.py:44 #: netbox/vpn/choices.py:19 netbox/wireless/choices.py:25 @@ -107,9 +110,9 @@ msgid "Active" msgstr "" #: netbox/circuits/choices.py:24 netbox/dcim/choices.py:183 -#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1606 -#: netbox/dcim/choices.py:1659 netbox/virtualization/choices.py:24 -#: netbox/virtualization/choices.py:43 +#: netbox/dcim/choices.py:235 netbox/dcim/choices.py:1590 +#: netbox/dcim/choices.py:1643 netbox/dcim/choices.py:1662 +#: netbox/virtualization/choices.py:24 netbox/virtualization/choices.py:43 msgid "Offline" msgstr "" @@ -121,7 +124,9 @@ msgstr "" msgid "Decommissioned" msgstr "" -#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1619 +#: netbox/circuits/choices.py:90 netbox/dcim/choices.py:1603 +#: netbox/templates/dcim/interface.html:135 +#: netbox/templates/virtualization/vminterface.html:77 #: netbox/tenancy/choices.py:17 msgid "Primary" msgstr "" @@ -139,195 +144,199 @@ msgstr "" msgid "Inactive" msgstr "" -#: netbox/circuits/filtersets.py:31 netbox/circuits/filtersets.py:198 -#: netbox/dcim/filtersets.py:98 netbox/dcim/filtersets.py:152 -#: netbox/dcim/filtersets.py:212 netbox/dcim/filtersets.py:333 -#: netbox/dcim/filtersets.py:464 netbox/dcim/filtersets.py:1021 -#: netbox/dcim/filtersets.py:1368 netbox/dcim/filtersets.py:1903 -#: netbox/dcim/filtersets.py:2146 netbox/dcim/filtersets.py:2204 -#: netbox/ipam/filtersets.py:341 netbox/ipam/filtersets.py:961 -#: netbox/virtualization/filtersets.py:45 -#: netbox/virtualization/filtersets.py:173 netbox/vpn/filtersets.py:358 +#: netbox/circuits/choices.py:107 netbox/templates/dcim/interface.html:275 +#: netbox/vpn/choices.py:63 +msgid "Peer" +msgstr "" + +#: netbox/circuits/choices.py:108 netbox/vpn/choices.py:64 +msgid "Hub" +msgstr "" + +#: netbox/circuits/choices.py:109 netbox/vpn/choices.py:65 +msgid "Spoke" +msgstr "" + +#: netbox/circuits/filtersets.py:37 netbox/circuits/filtersets.py:204 +#: netbox/circuits/filtersets.py:279 netbox/dcim/base_filtersets.py:22 +#: netbox/dcim/filtersets.py:99 netbox/dcim/filtersets.py:153 +#: netbox/dcim/filtersets.py:213 netbox/dcim/filtersets.py:334 +#: netbox/dcim/filtersets.py:465 netbox/dcim/filtersets.py:1022 +#: netbox/dcim/filtersets.py:1369 netbox/dcim/filtersets.py:2026 +#: netbox/dcim/filtersets.py:2269 netbox/dcim/filtersets.py:2327 +#: netbox/ipam/filtersets.py:928 netbox/virtualization/filtersets.py:139 +#: netbox/vpn/filtersets.py:358 msgid "Region (ID)" msgstr "" -#: netbox/circuits/filtersets.py:38 netbox/circuits/filtersets.py:205 -#: netbox/dcim/filtersets.py:105 netbox/dcim/filtersets.py:158 -#: netbox/dcim/filtersets.py:219 netbox/dcim/filtersets.py:340 -#: netbox/dcim/filtersets.py:471 netbox/dcim/filtersets.py:1028 -#: netbox/dcim/filtersets.py:1375 netbox/dcim/filtersets.py:1910 -#: netbox/dcim/filtersets.py:2153 netbox/dcim/filtersets.py:2211 -#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:348 -#: netbox/ipam/filtersets.py:968 netbox/virtualization/filtersets.py:52 -#: netbox/virtualization/filtersets.py:180 netbox/vpn/filtersets.py:353 +#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 +#: netbox/circuits/filtersets.py:286 netbox/dcim/base_filtersets.py:29 +#: netbox/dcim/filtersets.py:106 netbox/dcim/filtersets.py:159 +#: netbox/dcim/filtersets.py:220 netbox/dcim/filtersets.py:341 +#: netbox/dcim/filtersets.py:472 netbox/dcim/filtersets.py:1029 +#: netbox/dcim/filtersets.py:1376 netbox/dcim/filtersets.py:2033 +#: netbox/dcim/filtersets.py:2276 netbox/dcim/filtersets.py:2334 +#: netbox/extras/filtersets.py:509 netbox/ipam/filtersets.py:935 +#: netbox/virtualization/filtersets.py:146 netbox/vpn/filtersets.py:353 msgid "Region (slug)" msgstr "" -#: netbox/circuits/filtersets.py:44 netbox/circuits/filtersets.py:211 -#: netbox/dcim/filtersets.py:128 netbox/dcim/filtersets.py:225 -#: netbox/dcim/filtersets.py:346 netbox/dcim/filtersets.py:477 -#: netbox/dcim/filtersets.py:1034 netbox/dcim/filtersets.py:1381 -#: netbox/dcim/filtersets.py:1916 netbox/dcim/filtersets.py:2159 -#: netbox/dcim/filtersets.py:2217 netbox/ipam/filtersets.py:354 -#: netbox/ipam/filtersets.py:974 netbox/virtualization/filtersets.py:58 -#: netbox/virtualization/filtersets.py:186 +#: netbox/circuits/filtersets.py:50 netbox/circuits/filtersets.py:217 +#: netbox/circuits/filtersets.py:292 netbox/dcim/base_filtersets.py:35 +#: netbox/dcim/filtersets.py:129 netbox/dcim/filtersets.py:226 +#: netbox/dcim/filtersets.py:347 netbox/dcim/filtersets.py:478 +#: netbox/dcim/filtersets.py:1035 netbox/dcim/filtersets.py:1382 +#: netbox/dcim/filtersets.py:2039 netbox/dcim/filtersets.py:2282 +#: netbox/dcim/filtersets.py:2340 netbox/ipam/filtersets.py:941 +#: netbox/virtualization/filtersets.py:152 msgid "Site group (ID)" msgstr "" -#: netbox/circuits/filtersets.py:51 netbox/circuits/filtersets.py:218 -#: netbox/dcim/filtersets.py:135 netbox/dcim/filtersets.py:232 -#: netbox/dcim/filtersets.py:353 netbox/dcim/filtersets.py:484 -#: netbox/dcim/filtersets.py:1041 netbox/dcim/filtersets.py:1388 -#: netbox/dcim/filtersets.py:1923 netbox/dcim/filtersets.py:2166 -#: netbox/dcim/filtersets.py:2224 netbox/extras/filtersets.py:515 -#: netbox/ipam/filtersets.py:361 netbox/ipam/filtersets.py:981 -#: netbox/virtualization/filtersets.py:65 -#: netbox/virtualization/filtersets.py:193 +#: netbox/circuits/filtersets.py:57 netbox/circuits/filtersets.py:224 +#: netbox/circuits/filtersets.py:299 netbox/dcim/base_filtersets.py:42 +#: netbox/dcim/filtersets.py:136 netbox/dcim/filtersets.py:233 +#: netbox/dcim/filtersets.py:354 netbox/dcim/filtersets.py:485 +#: netbox/dcim/filtersets.py:1042 netbox/dcim/filtersets.py:1389 +#: netbox/dcim/filtersets.py:2046 netbox/dcim/filtersets.py:2289 +#: netbox/dcim/filtersets.py:2347 netbox/extras/filtersets.py:515 +#: netbox/ipam/filtersets.py:948 netbox/virtualization/filtersets.py:159 msgid "Site group (slug)" msgstr "" -#: netbox/circuits/filtersets.py:56 netbox/circuits/forms/bulk_edit.py:188 -#: netbox/circuits/forms/bulk_edit.py:216 -#: netbox/circuits/forms/bulk_import.py:124 -#: netbox/circuits/forms/filtersets.py:51 -#: netbox/circuits/forms/filtersets.py:171 -#: netbox/circuits/forms/filtersets.py:209 -#: netbox/circuits/forms/model_forms.py:138 -#: netbox/circuits/forms/model_forms.py:154 -#: netbox/circuits/tables/circuits.py:113 netbox/dcim/forms/bulk_edit.py:169 -#: netbox/dcim/forms/bulk_edit.py:330 netbox/dcim/forms/bulk_edit.py:683 -#: netbox/dcim/forms/bulk_edit.py:888 netbox/dcim/forms/bulk_import.py:131 -#: netbox/dcim/forms/bulk_import.py:230 netbox/dcim/forms/bulk_import.py:331 -#: netbox/dcim/forms/bulk_import.py:562 netbox/dcim/forms/bulk_import.py:1333 -#: netbox/dcim/forms/bulk_import.py:1361 netbox/dcim/forms/filtersets.py:87 -#: netbox/dcim/forms/filtersets.py:225 netbox/dcim/forms/filtersets.py:342 -#: netbox/dcim/forms/filtersets.py:439 netbox/dcim/forms/filtersets.py:753 -#: netbox/dcim/forms/filtersets.py:997 netbox/dcim/forms/filtersets.py:1021 -#: netbox/dcim/forms/filtersets.py:1111 netbox/dcim/forms/filtersets.py:1149 -#: netbox/dcim/forms/filtersets.py:1584 netbox/dcim/forms/filtersets.py:1608 -#: netbox/dcim/forms/filtersets.py:1632 netbox/dcim/forms/model_forms.py:137 -#: netbox/dcim/forms/model_forms.py:165 netbox/dcim/forms/model_forms.py:238 -#: netbox/dcim/forms/model_forms.py:463 netbox/dcim/forms/model_forms.py:723 -#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:153 +#: netbox/circuits/filtersets.py:62 netbox/circuits/forms/filtersets.py:59 +#: netbox/circuits/forms/filtersets.py:182 +#: netbox/circuits/forms/filtersets.py:235 +#: netbox/circuits/tables/circuits.py:129 netbox/dcim/forms/bulk_edit.py:172 +#: netbox/dcim/forms/bulk_edit.py:333 netbox/dcim/forms/bulk_edit.py:686 +#: netbox/dcim/forms/bulk_edit.py:891 netbox/dcim/forms/bulk_import.py:133 +#: netbox/dcim/forms/bulk_import.py:232 netbox/dcim/forms/bulk_import.py:333 +#: netbox/dcim/forms/bulk_import.py:567 netbox/dcim/forms/bulk_import.py:1430 +#: netbox/dcim/forms/bulk_import.py:1458 netbox/dcim/forms/filtersets.py:88 +#: netbox/dcim/forms/filtersets.py:226 netbox/dcim/forms/filtersets.py:343 +#: netbox/dcim/forms/filtersets.py:440 netbox/dcim/forms/filtersets.py:754 +#: netbox/dcim/forms/filtersets.py:998 netbox/dcim/forms/filtersets.py:1022 +#: netbox/dcim/forms/filtersets.py:1112 netbox/dcim/forms/filtersets.py:1150 +#: netbox/dcim/forms/filtersets.py:1622 netbox/dcim/forms/filtersets.py:1646 +#: netbox/dcim/forms/filtersets.py:1670 netbox/dcim/forms/model_forms.py:141 +#: netbox/dcim/forms/model_forms.py:169 netbox/dcim/forms/model_forms.py:243 +#: netbox/dcim/forms/model_forms.py:473 netbox/dcim/forms/model_forms.py:734 +#: netbox/dcim/forms/object_create.py:383 netbox/dcim/tables/devices.py:163 #: netbox/dcim/tables/power.py:26 netbox/dcim/tables/power.py:93 -#: netbox/dcim/tables/racks.py:122 netbox/dcim/tables/racks.py:207 +#: netbox/dcim/tables/racks.py:121 netbox/dcim/tables/racks.py:206 #: netbox/dcim/tables/sites.py:134 netbox/extras/filtersets.py:525 -#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_edit.py:285 -#: netbox/ipam/forms/bulk_edit.py:484 netbox/ipam/forms/bulk_import.py:171 -#: netbox/ipam/forms/bulk_import.py:453 netbox/ipam/forms/filtersets.py:153 -#: netbox/ipam/forms/filtersets.py:231 netbox/ipam/forms/filtersets.py:432 -#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:205 -#: netbox/ipam/forms/model_forms.py:669 netbox/ipam/tables/ip.py:245 -#: netbox/ipam/tables/vlans.py:118 netbox/ipam/tables/vlans.py:221 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:6 -#: netbox/templates/dcim/device.html:22 +#: netbox/ipam/forms/bulk_edit.py:468 netbox/ipam/forms/bulk_import.py:452 +#: netbox/ipam/forms/filtersets.py:155 netbox/ipam/forms/filtersets.py:229 +#: netbox/ipam/forms/filtersets.py:435 netbox/ipam/forms/filtersets.py:530 +#: netbox/ipam/forms/model_forms.py:671 netbox/ipam/tables/vlans.py:87 +#: netbox/ipam/tables/vlans.py:197 netbox/templates/dcim/device.html:22 #: netbox/templates/dcim/inc/cable_termination.html:8 #: netbox/templates/dcim/inc/cable_termination.html:33 #: netbox/templates/dcim/location.html:37 #: netbox/templates/dcim/powerpanel.html:22 netbox/templates/dcim/rack.html:20 #: netbox/templates/dcim/rackreservation.html:28 -#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/prefix.html:56 -#: netbox/templates/ipam/vlan.html:23 netbox/templates/ipam/vlan_edit.html:40 -#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/dcim/site.html:28 netbox/templates/ipam/vlan.html:23 +#: netbox/templates/ipam/vlan_edit.html:48 #: netbox/templates/virtualization/virtualmachine.html:95 -#: netbox/virtualization/forms/bulk_edit.py:91 -#: netbox/virtualization/forms/bulk_edit.py:109 -#: netbox/virtualization/forms/bulk_edit.py:124 -#: netbox/virtualization/forms/bulk_import.py:59 -#: netbox/virtualization/forms/bulk_import.py:85 -#: netbox/virtualization/forms/filtersets.py:79 -#: netbox/virtualization/forms/filtersets.py:148 -#: netbox/virtualization/forms/model_forms.py:71 -#: netbox/virtualization/forms/model_forms.py:104 -#: netbox/virtualization/forms/model_forms.py:171 -#: netbox/virtualization/tables/clusters.py:77 -#: netbox/virtualization/tables/virtualmachines.py:63 -#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/model_forms.py:76 -#: netbox/wireless/forms/model_forms.py:118 +#: netbox/virtualization/forms/bulk_edit.py:106 +#: netbox/virtualization/forms/bulk_import.py:60 +#: netbox/virtualization/forms/bulk_import.py:91 +#: netbox/virtualization/forms/filtersets.py:74 +#: netbox/virtualization/forms/filtersets.py:153 +#: netbox/virtualization/forms/model_forms.py:103 +#: netbox/virtualization/forms/model_forms.py:170 +#: netbox/virtualization/tables/virtualmachines.py:33 +#: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/filtersets.py:88 +#: netbox/wireless/forms/model_forms.py:79 +#: netbox/wireless/forms/model_forms.py:121 msgid "Site" msgstr "" -#: netbox/circuits/filtersets.py:62 netbox/circuits/filtersets.py:229 -#: netbox/circuits/filtersets.py:274 netbox/dcim/filtersets.py:242 -#: netbox/dcim/filtersets.py:363 netbox/dcim/filtersets.py:458 -#: netbox/extras/filtersets.py:531 netbox/ipam/filtersets.py:240 -#: netbox/ipam/filtersets.py:371 netbox/ipam/filtersets.py:991 -#: netbox/virtualization/filtersets.py:75 -#: netbox/virtualization/filtersets.py:203 netbox/vpn/filtersets.py:363 +#: netbox/circuits/filtersets.py:68 netbox/circuits/filtersets.py:235 +#: netbox/circuits/filtersets.py:310 netbox/dcim/base_filtersets.py:53 +#: netbox/dcim/filtersets.py:243 netbox/dcim/filtersets.py:364 +#: netbox/dcim/filtersets.py:459 netbox/extras/filtersets.py:531 +#: netbox/ipam/filtersets.py:243 netbox/ipam/filtersets.py:958 +#: netbox/virtualization/filtersets.py:169 netbox/vpn/filtersets.py:363 msgid "Site (slug)" msgstr "" -#: netbox/circuits/filtersets.py:67 +#: netbox/circuits/filtersets.py:73 msgid "ASN (ID)" msgstr "" -#: netbox/circuits/filtersets.py:73 netbox/circuits/forms/filtersets.py:31 -#: netbox/ipam/forms/model_forms.py:159 netbox/ipam/models/asns.py:108 -#: netbox/ipam/models/asns.py:125 netbox/ipam/tables/asn.py:41 +#: netbox/circuits/filtersets.py:79 netbox/circuits/forms/filtersets.py:39 +#: netbox/ipam/forms/model_forms.py:165 netbox/ipam/models/asns.py:105 +#: netbox/ipam/models/asns.py:122 netbox/ipam/tables/asn.py:41 #: netbox/templates/ipam/asn.html:20 msgid "ASN" msgstr "" -#: netbox/circuits/filtersets.py:95 netbox/circuits/filtersets.py:122 -#: netbox/circuits/filtersets.py:156 netbox/circuits/filtersets.py:283 -#: netbox/circuits/filtersets.py:325 netbox/ipam/filtersets.py:245 +#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 +#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:333 +#: netbox/circuits/filtersets.py:401 netbox/circuits/filtersets.py:477 +#: netbox/circuits/filtersets.py:545 netbox/ipam/filtersets.py:248 msgid "Provider (ID)" msgstr "" -#: netbox/circuits/filtersets.py:101 netbox/circuits/filtersets.py:128 -#: netbox/circuits/filtersets.py:162 netbox/circuits/filtersets.py:289 -#: netbox/circuits/filtersets.py:331 netbox/ipam/filtersets.py:251 +#: netbox/circuits/filtersets.py:107 netbox/circuits/filtersets.py:134 +#: netbox/circuits/filtersets.py:168 netbox/circuits/filtersets.py:339 +#: netbox/circuits/filtersets.py:483 netbox/circuits/filtersets.py:551 +#: netbox/ipam/filtersets.py:254 msgid "Provider (slug)" msgstr "" -#: netbox/circuits/filtersets.py:167 +#: netbox/circuits/filtersets.py:173 netbox/circuits/filtersets.py:488 +#: netbox/circuits/filtersets.py:556 msgid "Provider account (ID)" msgstr "" -#: netbox/circuits/filtersets.py:173 +#: netbox/circuits/filtersets.py:179 netbox/circuits/filtersets.py:494 +#: netbox/circuits/filtersets.py:562 msgid "Provider account (account)" msgstr "" -#: netbox/circuits/filtersets.py:178 +#: netbox/circuits/filtersets.py:184 netbox/circuits/filtersets.py:498 +#: netbox/circuits/filtersets.py:567 msgid "Provider network (ID)" msgstr "" -#: netbox/circuits/filtersets.py:182 +#: netbox/circuits/filtersets.py:188 msgid "Circuit type (ID)" msgstr "" -#: netbox/circuits/filtersets.py:188 +#: netbox/circuits/filtersets.py:194 msgid "Circuit type (slug)" msgstr "" -#: netbox/circuits/filtersets.py:223 netbox/circuits/filtersets.py:268 -#: netbox/dcim/filtersets.py:236 netbox/dcim/filtersets.py:357 -#: netbox/dcim/filtersets.py:452 netbox/dcim/filtersets.py:1045 -#: netbox/dcim/filtersets.py:1393 netbox/dcim/filtersets.py:1928 -#: netbox/dcim/filtersets.py:2170 netbox/dcim/filtersets.py:2229 -#: netbox/ipam/filtersets.py:234 netbox/ipam/filtersets.py:365 -#: netbox/ipam/filtersets.py:985 netbox/virtualization/filtersets.py:69 -#: netbox/virtualization/filtersets.py:197 netbox/vpn/filtersets.py:368 +#: netbox/circuits/filtersets.py:229 netbox/circuits/filtersets.py:304 +#: netbox/dcim/base_filtersets.py:47 netbox/dcim/filtersets.py:237 +#: netbox/dcim/filtersets.py:358 netbox/dcim/filtersets.py:453 +#: netbox/dcim/filtersets.py:1046 netbox/dcim/filtersets.py:1394 +#: netbox/dcim/filtersets.py:2051 netbox/dcim/filtersets.py:2293 +#: netbox/dcim/filtersets.py:2352 netbox/ipam/filtersets.py:237 +#: netbox/ipam/filtersets.py:952 netbox/virtualization/filtersets.py:163 +#: netbox/vpn/filtersets.py:368 msgid "Site (ID)" msgstr "" -#: netbox/circuits/filtersets.py:233 netbox/circuits/filtersets.py:237 +#: netbox/circuits/filtersets.py:239 netbox/circuits/filtersets.py:243 msgid "Termination A (ID)" msgstr "" -#: netbox/circuits/filtersets.py:260 netbox/circuits/filtersets.py:320 -#: netbox/core/filtersets.py:77 netbox/core/filtersets.py:136 -#: netbox/core/filtersets.py:173 netbox/dcim/filtersets.py:751 -#: netbox/dcim/filtersets.py:1362 netbox/dcim/filtersets.py:2277 -#: netbox/extras/filtersets.py:41 netbox/extras/filtersets.py:63 -#: netbox/extras/filtersets.py:92 netbox/extras/filtersets.py:132 -#: netbox/extras/filtersets.py:181 netbox/extras/filtersets.py:209 -#: netbox/extras/filtersets.py:239 netbox/extras/filtersets.py:276 -#: netbox/extras/filtersets.py:348 netbox/extras/filtersets.py:391 -#: netbox/extras/filtersets.py:438 netbox/extras/filtersets.py:498 -#: netbox/extras/filtersets.py:657 netbox/extras/filtersets.py:703 -#: netbox/ipam/forms/model_forms.py:482 netbox/netbox/filtersets.py:282 -#: netbox/netbox/forms/__init__.py:22 netbox/netbox/forms/base.py:167 +#: netbox/circuits/filtersets.py:268 netbox/circuits/filtersets.py:370 +#: netbox/circuits/filtersets.py:532 netbox/core/filtersets.py:77 +#: netbox/core/filtersets.py:136 netbox/core/filtersets.py:173 +#: netbox/dcim/filtersets.py:752 netbox/dcim/filtersets.py:1363 +#: netbox/dcim/filtersets.py:2400 netbox/extras/filtersets.py:41 +#: netbox/extras/filtersets.py:63 netbox/extras/filtersets.py:92 +#: netbox/extras/filtersets.py:132 netbox/extras/filtersets.py:181 +#: netbox/extras/filtersets.py:209 netbox/extras/filtersets.py:239 +#: netbox/extras/filtersets.py:276 netbox/extras/filtersets.py:348 +#: netbox/extras/filtersets.py:391 netbox/extras/filtersets.py:438 +#: netbox/extras/filtersets.py:498 netbox/extras/filtersets.py:657 +#: netbox/extras/filtersets.py:703 netbox/ipam/forms/model_forms.py:484 +#: netbox/netbox/filtersets.py:286 netbox/netbox/forms/__init__.py:22 +#: netbox/netbox/forms/base.py:167 #: netbox/templates/htmx/object_selector.html:28 #: netbox/templates/inc/filter_list.html:46 #: netbox/templates/ipam/ipaddress_assign.html:29 @@ -339,95 +348,155 @@ msgstr "" msgid "Search" msgstr "" -#: netbox/circuits/filtersets.py:264 netbox/circuits/forms/bulk_edit.py:172 -#: netbox/circuits/forms/bulk_edit.py:246 -#: netbox/circuits/forms/bulk_import.py:115 -#: netbox/circuits/forms/filtersets.py:198 -#: netbox/circuits/forms/filtersets.py:214 -#: netbox/circuits/forms/filtersets.py:260 -#: netbox/circuits/forms/model_forms.py:111 -#: netbox/circuits/forms/model_forms.py:133 -#: netbox/circuits/forms/model_forms.py:199 -#: netbox/circuits/tables/circuits.py:104 -#: netbox/circuits/tables/circuits.py:164 netbox/dcim/forms/connections.py:73 +#: netbox/circuits/filtersets.py:272 netbox/circuits/forms/bulk_edit.py:195 +#: netbox/circuits/forms/bulk_edit.py:284 +#: netbox/circuits/forms/bulk_import.py:128 +#: netbox/circuits/forms/filtersets.py:218 +#: netbox/circuits/forms/filtersets.py:245 +#: netbox/circuits/forms/filtersets.py:291 +#: netbox/circuits/forms/model_forms.py:139 +#: netbox/circuits/forms/model_forms.py:162 +#: netbox/circuits/forms/model_forms.py:262 +#: netbox/circuits/tables/circuits.py:108 +#: netbox/circuits/tables/circuits.py:203 netbox/dcim/forms/connections.py:73 #: netbox/templates/circuits/circuit.html:15 -#: netbox/templates/circuits/circuitgroupassignment.html:26 +#: netbox/templates/circuits/circuitgroupassignment.html:30 #: netbox/templates/circuits/circuittermination.html:19 #: netbox/templates/dcim/inc/cable_termination.html:55 #: netbox/templates/dcim/trace/circuit.html:4 msgid "Circuit" msgstr "" -#: netbox/circuits/filtersets.py:278 +#: netbox/circuits/filtersets.py:316 netbox/dcim/base_filtersets.py:59 +#: netbox/dcim/filtersets.py:259 netbox/dcim/filtersets.py:370 +#: netbox/dcim/filtersets.py:491 netbox/dcim/filtersets.py:1058 +#: netbox/dcim/filtersets.py:1405 netbox/dcim/filtersets.py:2305 +msgid "Location (ID)" +msgstr "" + +#: netbox/circuits/filtersets.py:323 netbox/dcim/base_filtersets.py:66 +#: netbox/dcim/filtersets.py:266 netbox/dcim/filtersets.py:377 +#: netbox/dcim/filtersets.py:498 netbox/dcim/filtersets.py:1411 +#: netbox/extras/filtersets.py:542 +msgid "Location (slug)" +msgstr "" + +#: netbox/circuits/filtersets.py:328 msgid "ProviderNetwork (ID)" msgstr "" -#: netbox/circuits/filtersets.py:335 -msgid "Circuit (ID)" -msgstr "" - -#: netbox/circuits/filtersets.py:341 +#: netbox/circuits/filtersets.py:376 msgid "Circuit (CID)" msgstr "" -#: netbox/circuits/filtersets.py:345 +#: netbox/circuits/filtersets.py:381 +msgid "Circuit (ID)" +msgstr "" + +#: netbox/circuits/filtersets.py:386 +msgid "Virtual circuit (CID)" +msgstr "" + +#: netbox/circuits/filtersets.py:391 netbox/dcim/filtersets.py:1848 +msgid "Virtual circuit (ID)" +msgstr "" + +#: netbox/circuits/filtersets.py:396 +msgid "Provider (name)" +msgstr "" + +#: netbox/circuits/filtersets.py:405 msgid "Circuit group (ID)" msgstr "" -#: netbox/circuits/filtersets.py:351 +#: netbox/circuits/filtersets.py:411 msgid "Circuit group (slug)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:30 netbox/circuits/forms/filtersets.py:56 -#: netbox/circuits/forms/model_forms.py:29 -#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:129 -#: netbox/dcim/forms/filtersets.py:195 netbox/dcim/forms/model_forms.py:123 -#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:126 -#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:213 -#: netbox/netbox/navigation/menu.py:172 netbox/netbox/navigation/menu.py:175 +#: netbox/circuits/filtersets.py:502 +msgid "Virtual circuit type (ID)" +msgstr "" + +#: netbox/circuits/filtersets.py:508 +msgid "Virtual circuit type (slug)" +msgstr "" + +#: netbox/circuits/filtersets.py:536 netbox/circuits/forms/bulk_edit.py:355 +#: netbox/circuits/forms/bulk_import.py:249 +#: netbox/circuits/forms/filtersets.py:367 +#: netbox/circuits/forms/filtersets.py:373 +#: netbox/circuits/forms/model_forms.py:343 +#: netbox/circuits/forms/model_forms.py:358 +#: netbox/circuits/tables/virtual_circuits.py:88 +#: netbox/templates/circuits/virtualcircuit.html:20 +#: netbox/templates/circuits/virtualcircuittermination.html:38 +msgid "Virtual circuit" +msgstr "" + +#: netbox/circuits/filtersets.py:572 netbox/dcim/filtersets.py:1268 +#: netbox/dcim/filtersets.py:1633 netbox/ipam/filtersets.py:601 +#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 +msgid "Interface (ID)" +msgstr "" + +#: netbox/circuits/forms/bulk_edit.py:42 netbox/circuits/forms/filtersets.py:64 +#: netbox/circuits/forms/model_forms.py:42 +#: netbox/circuits/tables/providers.py:33 netbox/dcim/forms/bulk_edit.py:132 +#: netbox/dcim/forms/filtersets.py:196 netbox/dcim/forms/model_forms.py:127 +#: netbox/dcim/tables/sites.py:94 netbox/ipam/models/asns.py:123 +#: netbox/ipam/tables/asn.py:27 netbox/ipam/views.py:230 +#: netbox/netbox/navigation/menu.py:178 netbox/netbox/navigation/menu.py:181 #: netbox/templates/circuits/provider.html:23 msgid "ASNs" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:34 netbox/circuits/forms/bulk_edit.py:56 -#: netbox/circuits/forms/bulk_edit.py:83 netbox/circuits/forms/bulk_edit.py:104 -#: netbox/circuits/forms/bulk_edit.py:164 -#: netbox/circuits/forms/bulk_edit.py:183 -#: netbox/circuits/forms/bulk_edit.py:228 netbox/core/forms/bulk_edit.py:28 -#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:74 -#: netbox/dcim/forms/bulk_edit.py:93 netbox/dcim/forms/bulk_edit.py:152 -#: netbox/dcim/forms/bulk_edit.py:193 netbox/dcim/forms/bulk_edit.py:211 -#: netbox/dcim/forms/bulk_edit.py:289 netbox/dcim/forms/bulk_edit.py:438 -#: netbox/dcim/forms/bulk_edit.py:472 netbox/dcim/forms/bulk_edit.py:487 -#: netbox/dcim/forms/bulk_edit.py:546 netbox/dcim/forms/bulk_edit.py:590 -#: netbox/dcim/forms/bulk_edit.py:624 netbox/dcim/forms/bulk_edit.py:648 -#: netbox/dcim/forms/bulk_edit.py:721 netbox/dcim/forms/bulk_edit.py:782 -#: netbox/dcim/forms/bulk_edit.py:834 netbox/dcim/forms/bulk_edit.py:857 -#: netbox/dcim/forms/bulk_edit.py:905 netbox/dcim/forms/bulk_edit.py:975 -#: netbox/dcim/forms/bulk_edit.py:1028 netbox/dcim/forms/bulk_edit.py:1063 -#: netbox/dcim/forms/bulk_edit.py:1103 netbox/dcim/forms/bulk_edit.py:1147 -#: netbox/dcim/forms/bulk_edit.py:1192 netbox/dcim/forms/bulk_edit.py:1219 -#: netbox/dcim/forms/bulk_edit.py:1237 netbox/dcim/forms/bulk_edit.py:1255 -#: netbox/dcim/forms/bulk_edit.py:1273 netbox/dcim/forms/bulk_edit.py:1725 -#: netbox/extras/forms/bulk_edit.py:39 netbox/extras/forms/bulk_edit.py:149 -#: netbox/extras/forms/bulk_edit.py:178 netbox/extras/forms/bulk_edit.py:208 -#: netbox/extras/forms/bulk_edit.py:256 netbox/extras/forms/bulk_edit.py:274 -#: netbox/extras/forms/bulk_edit.py:298 netbox/extras/forms/bulk_edit.py:312 -#: netbox/extras/forms/bulk_edit.py:339 netbox/extras/tables/tables.py:79 -#: netbox/ipam/forms/bulk_edit.py:53 netbox/ipam/forms/bulk_edit.py:73 -#: netbox/ipam/forms/bulk_edit.py:93 netbox/ipam/forms/bulk_edit.py:117 -#: netbox/ipam/forms/bulk_edit.py:146 netbox/ipam/forms/bulk_edit.py:175 -#: netbox/ipam/forms/bulk_edit.py:194 netbox/ipam/forms/bulk_edit.py:276 -#: netbox/ipam/forms/bulk_edit.py:321 netbox/ipam/forms/bulk_edit.py:369 -#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:428 -#: netbox/ipam/forms/bulk_edit.py:516 netbox/ipam/forms/bulk_edit.py:547 +#: netbox/circuits/forms/bulk_edit.py:46 netbox/circuits/forms/bulk_edit.py:68 +#: netbox/circuits/forms/bulk_edit.py:95 netbox/circuits/forms/bulk_edit.py:116 +#: netbox/circuits/forms/bulk_edit.py:187 +#: netbox/circuits/forms/bulk_edit.py:207 +#: netbox/circuits/forms/bulk_edit.py:266 +#: netbox/circuits/forms/bulk_edit.py:307 +#: netbox/circuits/forms/bulk_edit.py:347 +#: netbox/circuits/forms/bulk_edit.py:371 netbox/core/forms/bulk_edit.py:28 +#: netbox/dcim/forms/bulk_create.py:35 netbox/dcim/forms/bulk_edit.py:77 +#: netbox/dcim/forms/bulk_edit.py:96 netbox/dcim/forms/bulk_edit.py:155 +#: netbox/dcim/forms/bulk_edit.py:196 netbox/dcim/forms/bulk_edit.py:214 +#: netbox/dcim/forms/bulk_edit.py:292 netbox/dcim/forms/bulk_edit.py:441 +#: netbox/dcim/forms/bulk_edit.py:475 netbox/dcim/forms/bulk_edit.py:490 +#: netbox/dcim/forms/bulk_edit.py:549 netbox/dcim/forms/bulk_edit.py:593 +#: netbox/dcim/forms/bulk_edit.py:627 netbox/dcim/forms/bulk_edit.py:651 +#: netbox/dcim/forms/bulk_edit.py:724 netbox/dcim/forms/bulk_edit.py:785 +#: netbox/dcim/forms/bulk_edit.py:837 netbox/dcim/forms/bulk_edit.py:860 +#: netbox/dcim/forms/bulk_edit.py:908 netbox/dcim/forms/bulk_edit.py:978 +#: netbox/dcim/forms/bulk_edit.py:1031 netbox/dcim/forms/bulk_edit.py:1066 +#: netbox/dcim/forms/bulk_edit.py:1106 netbox/dcim/forms/bulk_edit.py:1150 +#: netbox/dcim/forms/bulk_edit.py:1195 netbox/dcim/forms/bulk_edit.py:1222 +#: netbox/dcim/forms/bulk_edit.py:1240 netbox/dcim/forms/bulk_edit.py:1258 +#: netbox/dcim/forms/bulk_edit.py:1276 netbox/dcim/forms/bulk_edit.py:1744 +#: netbox/dcim/forms/bulk_edit.py:1785 netbox/extras/forms/bulk_edit.py:39 +#: netbox/extras/forms/bulk_edit.py:149 netbox/extras/forms/bulk_edit.py:178 +#: netbox/extras/forms/bulk_edit.py:208 netbox/extras/forms/bulk_edit.py:256 +#: netbox/extras/forms/bulk_edit.py:274 netbox/extras/forms/bulk_edit.py:298 +#: netbox/extras/forms/bulk_edit.py:312 netbox/extras/forms/bulk_edit.py:339 +#: netbox/extras/tables/tables.py:79 netbox/ipam/forms/bulk_edit.py:56 +#: netbox/ipam/forms/bulk_edit.py:76 netbox/ipam/forms/bulk_edit.py:96 +#: netbox/ipam/forms/bulk_edit.py:120 netbox/ipam/forms/bulk_edit.py:149 +#: netbox/ipam/forms/bulk_edit.py:178 netbox/ipam/forms/bulk_edit.py:197 +#: netbox/ipam/forms/bulk_edit.py:260 netbox/ipam/forms/bulk_edit.py:305 +#: netbox/ipam/forms/bulk_edit.py:353 netbox/ipam/forms/bulk_edit.py:396 +#: netbox/ipam/forms/bulk_edit.py:412 netbox/ipam/forms/bulk_edit.py:500 +#: netbox/ipam/forms/bulk_edit.py:532 netbox/ipam/forms/bulk_edit.py:575 +#: netbox/ipam/tables/vlans.py:240 netbox/ipam/tables/vlans.py:267 #: netbox/templates/account/token.html:35 -#: netbox/templates/circuits/circuit.html:59 +#: netbox/templates/circuits/circuit.html:69 #: netbox/templates/circuits/circuitgroup.html:32 #: netbox/templates/circuits/circuittype.html:26 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:88 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:83 #: netbox/templates/circuits/provider.html:33 #: netbox/templates/circuits/providernetwork.html:32 +#: netbox/templates/circuits/virtualcircuit.html:56 +#: netbox/templates/circuits/virtualcircuittermination.html:68 +#: netbox/templates/circuits/virtualcircuittype.html:26 #: netbox/templates/core/datasource.html:54 #: netbox/templates/core/plugin.html:80 netbox/templates/dcim/cable.html:36 #: netbox/templates/dcim/consoleport.html:44 @@ -437,9 +506,10 @@ msgstr "" #: netbox/templates/dcim/devicetype.html:33 #: netbox/templates/dcim/frontport.html:58 #: netbox/templates/dcim/interface.html:69 -#: netbox/templates/dcim/inventoryitem.html:60 +#: netbox/templates/dcim/inventoryitem.html:64 #: netbox/templates/dcim/inventoryitemrole.html:22 #: netbox/templates/dcim/location.html:33 +#: netbox/templates/dcim/macaddress.html:21 #: netbox/templates/dcim/manufacturer.html:40 #: netbox/templates/dcim/module.html:73 netbox/templates/dcim/modulebay.html:42 #: netbox/templates/dcim/moduletype.html:37 @@ -469,12 +539,14 @@ msgstr "" #: netbox/templates/ipam/asnrange.html:38 #: netbox/templates/ipam/fhrpgroup.html:34 #: netbox/templates/ipam/ipaddress.html:55 -#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:81 +#: netbox/templates/ipam/iprange.html:67 netbox/templates/ipam/prefix.html:77 #: netbox/templates/ipam/rir.html:26 netbox/templates/ipam/role.html:26 #: netbox/templates/ipam/routetarget.html:21 #: netbox/templates/ipam/service.html:50 #: netbox/templates/ipam/servicetemplate.html:27 #: netbox/templates/ipam/vlan.html:62 netbox/templates/ipam/vlangroup.html:34 +#: netbox/templates/ipam/vlantranslationpolicy.html:18 +#: netbox/templates/ipam/vlantranslationrule.html:26 #: netbox/templates/ipam/vrf.html:33 netbox/templates/tenancy/contact.html:67 #: netbox/templates/tenancy/contactgroup.html:25 #: netbox/templates/tenancy/contactrole.html:22 @@ -488,7 +560,7 @@ msgstr "" #: netbox/templates/virtualization/clustertype.html:26 #: netbox/templates/virtualization/virtualdisk.html:39 #: netbox/templates/virtualization/virtualmachine.html:31 -#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/templates/virtualization/vminterface.html:47 #: netbox/templates/vpn/ikepolicy.html:17 #: netbox/templates/vpn/ikeproposal.html:17 #: netbox/templates/vpn/ipsecpolicy.html:17 @@ -498,113 +570,136 @@ msgstr "" #: netbox/templates/vpn/ipsecproposal.html:17 #: netbox/templates/vpn/l2vpn.html:26 netbox/templates/vpn/tunnel.html:33 #: netbox/templates/vpn/tunnelgroup.html:30 -#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/templates/wireless/wirelesslan.html:34 #: netbox/templates/wireless/wirelesslangroup.html:33 #: netbox/templates/wireless/wirelesslink.html:34 #: netbox/tenancy/forms/bulk_edit.py:32 netbox/tenancy/forms/bulk_edit.py:80 #: netbox/tenancy/forms/bulk_edit.py:122 netbox/users/forms/bulk_edit.py:64 #: netbox/users/forms/bulk_edit.py:82 netbox/users/forms/bulk_edit.py:112 -#: netbox/virtualization/forms/bulk_edit.py:32 -#: netbox/virtualization/forms/bulk_edit.py:46 -#: netbox/virtualization/forms/bulk_edit.py:100 -#: netbox/virtualization/forms/bulk_edit.py:177 -#: netbox/virtualization/forms/bulk_edit.py:228 -#: netbox/virtualization/forms/bulk_edit.py:337 +#: netbox/virtualization/forms/bulk_edit.py:33 +#: netbox/virtualization/forms/bulk_edit.py:47 +#: netbox/virtualization/forms/bulk_edit.py:82 +#: netbox/virtualization/forms/bulk_edit.py:159 +#: netbox/virtualization/forms/bulk_edit.py:210 +#: netbox/virtualization/forms/bulk_edit.py:319 #: netbox/vpn/forms/bulk_edit.py:28 netbox/vpn/forms/bulk_edit.py:64 #: netbox/vpn/forms/bulk_edit.py:121 netbox/vpn/forms/bulk_edit.py:155 #: netbox/vpn/forms/bulk_edit.py:190 netbox/vpn/forms/bulk_edit.py:215 #: netbox/vpn/forms/bulk_edit.py:247 netbox/vpn/forms/bulk_edit.py:274 -#: netbox/wireless/forms/bulk_edit.py:29 netbox/wireless/forms/bulk_edit.py:82 -#: netbox/wireless/forms/bulk_edit.py:140 +#: netbox/wireless/forms/bulk_edit.py:31 netbox/wireless/forms/bulk_edit.py:84 +#: netbox/wireless/forms/bulk_edit.py:143 msgid "Description" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:51 netbox/circuits/forms/bulk_edit.py:73 -#: netbox/circuits/forms/bulk_edit.py:123 -#: netbox/circuits/forms/bulk_import.py:36 -#: netbox/circuits/forms/bulk_import.py:51 -#: netbox/circuits/forms/bulk_import.py:74 -#: netbox/circuits/forms/filtersets.py:70 -#: netbox/circuits/forms/filtersets.py:88 -#: netbox/circuits/forms/filtersets.py:116 -#: netbox/circuits/forms/filtersets.py:131 -#: netbox/circuits/forms/filtersets.py:199 -#: netbox/circuits/forms/filtersets.py:232 -#: netbox/circuits/forms/filtersets.py:255 -#: netbox/circuits/forms/model_forms.py:47 -#: netbox/circuits/forms/model_forms.py:61 -#: netbox/circuits/forms/model_forms.py:93 -#: netbox/circuits/tables/circuits.py:58 netbox/circuits/tables/circuits.py:108 -#: netbox/circuits/tables/circuits.py:160 +#: netbox/circuits/forms/bulk_edit.py:63 netbox/circuits/forms/bulk_edit.py:85 +#: netbox/circuits/forms/bulk_edit.py:135 +#: netbox/circuits/forms/bulk_import.py:43 +#: netbox/circuits/forms/bulk_import.py:58 +#: netbox/circuits/forms/bulk_import.py:81 +#: netbox/circuits/forms/filtersets.py:78 +#: netbox/circuits/forms/filtersets.py:96 +#: netbox/circuits/forms/filtersets.py:124 +#: netbox/circuits/forms/filtersets.py:142 +#: netbox/circuits/forms/filtersets.py:219 +#: netbox/circuits/forms/filtersets.py:263 +#: netbox/circuits/forms/filtersets.py:286 +#: netbox/circuits/forms/filtersets.py:324 +#: netbox/circuits/forms/filtersets.py:332 +#: netbox/circuits/forms/filtersets.py:368 +#: netbox/circuits/forms/filtersets.py:391 +#: netbox/circuits/forms/model_forms.py:60 +#: netbox/circuits/forms/model_forms.py:76 +#: netbox/circuits/forms/model_forms.py:110 +#: netbox/circuits/tables/circuits.py:57 netbox/circuits/tables/circuits.py:112 +#: netbox/circuits/tables/circuits.py:196 #: netbox/circuits/tables/providers.py:72 #: netbox/circuits/tables/providers.py:103 +#: netbox/circuits/tables/virtual_circuits.py:46 +#: netbox/circuits/tables/virtual_circuits.py:93 #: netbox/templates/circuits/circuit.html:18 +#: netbox/templates/circuits/circuitgroupassignment.html:26 #: netbox/templates/circuits/circuittermination.html:25 #: netbox/templates/circuits/provider.html:20 #: netbox/templates/circuits/provideraccount.html:20 #: netbox/templates/circuits/providernetwork.html:20 +#: netbox/templates/circuits/virtualcircuit.html:23 +#: netbox/templates/circuits/virtualcircuittermination.html:26 #: netbox/templates/dcim/inc/cable_termination.html:51 +#: netbox/templates/dcim/interface.html:166 msgid "Provider" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:80 netbox/circuits/forms/filtersets.py:91 +#: netbox/circuits/forms/bulk_edit.py:92 netbox/circuits/forms/filtersets.py:99 #: netbox/templates/circuits/providernetwork.html:28 msgid "Service ID" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:100 -#: netbox/circuits/forms/filtersets.py:107 netbox/dcim/forms/bulk_edit.py:207 -#: netbox/dcim/forms/bulk_edit.py:610 netbox/dcim/forms/bulk_edit.py:819 -#: netbox/dcim/forms/bulk_edit.py:1188 netbox/dcim/forms/bulk_edit.py:1215 -#: netbox/dcim/forms/bulk_edit.py:1721 netbox/dcim/forms/filtersets.py:1064 -#: netbox/dcim/forms/filtersets.py:1455 netbox/dcim/forms/filtersets.py:1479 -#: netbox/dcim/tables/devices.py:704 netbox/dcim/tables/devices.py:761 -#: netbox/dcim/tables/devices.py:1003 netbox/dcim/tables/devicetypes.py:249 -#: netbox/dcim/tables/devicetypes.py:264 netbox/dcim/tables/racks.py:33 -#: netbox/extras/forms/bulk_edit.py:270 netbox/extras/tables/tables.py:443 +#: netbox/circuits/forms/bulk_edit.py:112 +#: netbox/circuits/forms/bulk_edit.py:303 +#: netbox/circuits/forms/filtersets.py:115 +#: netbox/circuits/forms/filtersets.py:315 netbox/dcim/forms/bulk_edit.py:210 +#: netbox/dcim/forms/bulk_edit.py:613 netbox/dcim/forms/bulk_edit.py:822 +#: netbox/dcim/forms/bulk_edit.py:1191 netbox/dcim/forms/bulk_edit.py:1218 +#: netbox/dcim/forms/bulk_edit.py:1740 netbox/dcim/forms/filtersets.py:1065 +#: netbox/dcim/forms/filtersets.py:1323 netbox/dcim/forms/filtersets.py:1460 +#: netbox/dcim/forms/filtersets.py:1484 netbox/dcim/tables/devices.py:737 +#: netbox/dcim/tables/devices.py:793 netbox/dcim/tables/devices.py:1034 +#: netbox/dcim/tables/devicetypes.py:251 netbox/dcim/tables/devicetypes.py:266 +#: netbox/dcim/tables/racks.py:33 netbox/extras/forms/bulk_edit.py:270 +#: netbox/extras/tables/tables.py:443 #: netbox/templates/circuits/circuittype.html:30 +#: netbox/templates/circuits/virtualcircuittype.html:30 #: netbox/templates/dcim/cable.html:40 netbox/templates/dcim/devicerole.html:34 #: netbox/templates/dcim/frontport.html:40 #: netbox/templates/dcim/inventoryitemrole.html:26 +#: netbox/templates/dcim/poweroutlet.html:44 #: netbox/templates/dcim/rackrole.html:30 #: netbox/templates/dcim/rearport.html:40 netbox/templates/extras/tag.html:26 msgid "Color" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:118 -#: netbox/circuits/forms/bulk_import.py:87 -#: netbox/circuits/forms/filtersets.py:126 netbox/core/forms/bulk_edit.py:18 -#: netbox/core/forms/filtersets.py:33 netbox/core/tables/change_logging.py:32 -#: netbox/core/tables/data.py:20 netbox/core/tables/jobs.py:18 -#: netbox/dcim/forms/bulk_edit.py:797 netbox/dcim/forms/bulk_edit.py:936 -#: netbox/dcim/forms/bulk_edit.py:1004 netbox/dcim/forms/bulk_edit.py:1023 -#: netbox/dcim/forms/bulk_edit.py:1046 netbox/dcim/forms/bulk_edit.py:1088 -#: netbox/dcim/forms/bulk_edit.py:1132 netbox/dcim/forms/bulk_edit.py:1183 -#: netbox/dcim/forms/bulk_edit.py:1210 netbox/dcim/forms/bulk_import.py:188 -#: netbox/dcim/forms/bulk_import.py:267 netbox/dcim/forms/bulk_import.py:730 -#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 -#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:885 -#: netbox/dcim/forms/bulk_import.py:979 netbox/dcim/forms/bulk_import.py:1021 -#: netbox/dcim/forms/bulk_import.py:1235 netbox/dcim/forms/bulk_import.py:1398 -#: netbox/dcim/forms/filtersets.py:955 netbox/dcim/forms/filtersets.py:1054 -#: netbox/dcim/forms/filtersets.py:1175 netbox/dcim/forms/filtersets.py:1247 -#: netbox/dcim/forms/filtersets.py:1272 netbox/dcim/forms/filtersets.py:1296 -#: netbox/dcim/forms/filtersets.py:1316 netbox/dcim/forms/filtersets.py:1353 -#: netbox/dcim/forms/filtersets.py:1450 netbox/dcim/forms/filtersets.py:1474 -#: netbox/dcim/forms/model_forms.py:703 netbox/dcim/forms/model_forms.py:709 -#: netbox/dcim/forms/object_import.py:84 netbox/dcim/forms/object_import.py:113 -#: netbox/dcim/forms/object_import.py:145 netbox/dcim/tables/devices.py:178 -#: netbox/dcim/tables/devices.py:814 netbox/dcim/tables/power.py:77 -#: netbox/dcim/tables/racks.py:138 netbox/extras/forms/bulk_import.py:42 +#: netbox/circuits/forms/bulk_edit.py:130 +#: netbox/circuits/forms/bulk_edit.py:331 +#: netbox/circuits/forms/bulk_import.py:94 +#: netbox/circuits/forms/bulk_import.py:221 +#: netbox/circuits/forms/filtersets.py:137 +#: netbox/circuits/forms/filtersets.py:353 +#: netbox/circuits/tables/circuits.py:65 netbox/circuits/tables/circuits.py:200 +#: netbox/circuits/tables/virtual_circuits.py:58 +#: netbox/core/forms/bulk_edit.py:18 netbox/core/forms/filtersets.py:33 +#: netbox/core/tables/change_logging.py:32 netbox/core/tables/data.py:20 +#: netbox/core/tables/jobs.py:18 netbox/dcim/forms/bulk_edit.py:800 +#: netbox/dcim/forms/bulk_edit.py:939 netbox/dcim/forms/bulk_edit.py:1007 +#: netbox/dcim/forms/bulk_edit.py:1026 netbox/dcim/forms/bulk_edit.py:1049 +#: netbox/dcim/forms/bulk_edit.py:1091 netbox/dcim/forms/bulk_edit.py:1135 +#: netbox/dcim/forms/bulk_edit.py:1186 netbox/dcim/forms/bulk_edit.py:1213 +#: netbox/dcim/forms/bulk_import.py:190 netbox/dcim/forms/bulk_import.py:269 +#: netbox/dcim/forms/bulk_import.py:735 netbox/dcim/forms/bulk_import.py:761 +#: netbox/dcim/forms/bulk_import.py:787 netbox/dcim/forms/bulk_import.py:807 +#: netbox/dcim/forms/bulk_import.py:893 netbox/dcim/forms/bulk_import.py:987 +#: netbox/dcim/forms/bulk_import.py:1029 netbox/dcim/forms/bulk_import.py:1332 +#: netbox/dcim/forms/bulk_import.py:1495 netbox/dcim/forms/filtersets.py:956 +#: netbox/dcim/forms/filtersets.py:1055 netbox/dcim/forms/filtersets.py:1176 +#: netbox/dcim/forms/filtersets.py:1248 netbox/dcim/forms/filtersets.py:1273 +#: netbox/dcim/forms/filtersets.py:1297 netbox/dcim/forms/filtersets.py:1317 +#: netbox/dcim/forms/filtersets.py:1358 netbox/dcim/forms/filtersets.py:1455 +#: netbox/dcim/forms/filtersets.py:1479 netbox/dcim/forms/model_forms.py:714 +#: netbox/dcim/forms/model_forms.py:720 netbox/dcim/forms/object_import.py:84 +#: netbox/dcim/forms/object_import.py:113 +#: netbox/dcim/forms/object_import.py:146 netbox/dcim/tables/devices.py:188 +#: netbox/dcim/tables/devices.py:845 netbox/dcim/tables/power.py:77 +#: netbox/dcim/tables/racks.py:137 netbox/extras/forms/bulk_import.py:42 #: netbox/extras/tables/tables.py:405 netbox/extras/tables/tables.py:465 #: netbox/netbox/tables/tables.py:240 netbox/templates/circuits/circuit.html:30 +#: netbox/templates/circuits/virtualcircuit.html:39 +#: netbox/templates/circuits/virtualcircuittermination.html:64 #: netbox/templates/core/datasource.html:38 netbox/templates/dcim/cable.html:15 #: netbox/templates/dcim/consoleport.html:36 #: netbox/templates/dcim/consoleserverport.html:36 #: netbox/templates/dcim/frontport.html:36 #: netbox/templates/dcim/interface.html:46 -#: netbox/templates/dcim/interface.html:169 -#: netbox/templates/dcim/interface.html:311 +#: netbox/templates/dcim/interface.html:226 +#: netbox/templates/dcim/interface.html:368 #: netbox/templates/dcim/powerfeed.html:32 #: netbox/templates/dcim/poweroutlet.html:36 #: netbox/templates/dcim/powerport.html:36 @@ -614,65 +709,78 @@ msgstr "" #: netbox/templates/vpn/l2vpn.html:22 #: netbox/templates/wireless/inc/authentication_attrs.html:8 #: netbox/templates/wireless/inc/wirelesslink_interface.html:14 -#: netbox/virtualization/forms/bulk_edit.py:60 -#: netbox/virtualization/forms/bulk_import.py:41 +#: netbox/virtualization/forms/bulk_edit.py:61 +#: netbox/virtualization/forms/bulk_import.py:42 #: netbox/virtualization/forms/filtersets.py:54 -#: netbox/virtualization/forms/model_forms.py:62 +#: netbox/virtualization/forms/model_forms.py:64 #: netbox/virtualization/tables/clusters.py:66 #: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 -#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:84 -#: netbox/vpn/forms/model_forms.py:119 netbox/vpn/forms/model_forms.py:231 +#: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:85 +#: netbox/vpn/forms/model_forms.py:120 netbox/vpn/forms/model_forms.py:232 msgid "Type" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:128 -#: netbox/circuits/forms/bulk_import.py:80 -#: netbox/circuits/forms/filtersets.py:139 -#: netbox/circuits/forms/model_forms.py:98 +#: netbox/circuits/forms/bulk_edit.py:140 +#: netbox/circuits/forms/bulk_edit.py:326 +#: netbox/circuits/forms/bulk_import.py:87 +#: netbox/circuits/forms/bulk_import.py:214 +#: netbox/circuits/forms/filtersets.py:150 +#: netbox/circuits/forms/filtersets.py:340 +#: netbox/circuits/forms/model_forms.py:116 +#: netbox/circuits/forms/model_forms.py:330 +#: netbox/templates/circuits/virtualcircuit.html:31 +#: netbox/templates/circuits/virtualcircuittermination.html:34 msgid "Provider account" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:136 -#: netbox/circuits/forms/bulk_import.py:93 -#: netbox/circuits/forms/filtersets.py:150 netbox/core/forms/filtersets.py:38 +#: netbox/circuits/forms/bulk_edit.py:148 +#: netbox/circuits/forms/bulk_edit.py:336 +#: netbox/circuits/forms/bulk_import.py:100 +#: netbox/circuits/forms/bulk_import.py:227 +#: netbox/circuits/forms/filtersets.py:161 +#: netbox/circuits/forms/filtersets.py:356 netbox/core/forms/filtersets.py:38 #: netbox/core/forms/filtersets.py:79 netbox/core/tables/data.py:23 #: netbox/core/tables/jobs.py:26 netbox/core/tables/tasks.py:88 -#: netbox/dcim/forms/bulk_edit.py:107 netbox/dcim/forms/bulk_edit.py:182 -#: netbox/dcim/forms/bulk_edit.py:352 netbox/dcim/forms/bulk_edit.py:706 -#: netbox/dcim/forms/bulk_edit.py:771 netbox/dcim/forms/bulk_edit.py:803 -#: netbox/dcim/forms/bulk_edit.py:930 netbox/dcim/forms/bulk_edit.py:1744 -#: netbox/dcim/forms/bulk_import.py:88 netbox/dcim/forms/bulk_import.py:147 -#: netbox/dcim/forms/bulk_import.py:248 netbox/dcim/forms/bulk_import.py:527 -#: netbox/dcim/forms/bulk_import.py:681 netbox/dcim/forms/bulk_import.py:1229 -#: netbox/dcim/forms/bulk_import.py:1393 netbox/dcim/forms/bulk_import.py:1457 -#: netbox/dcim/forms/filtersets.py:178 netbox/dcim/forms/filtersets.py:237 -#: netbox/dcim/forms/filtersets.py:359 netbox/dcim/forms/filtersets.py:799 -#: netbox/dcim/forms/filtersets.py:924 netbox/dcim/forms/filtersets.py:958 -#: netbox/dcim/forms/filtersets.py:1059 netbox/dcim/forms/filtersets.py:1170 -#: netbox/dcim/tables/devices.py:140 netbox/dcim/tables/devices.py:817 -#: netbox/dcim/tables/devices.py:1063 netbox/dcim/tables/modules.py:70 -#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:126 +#: netbox/dcim/forms/bulk_edit.py:110 netbox/dcim/forms/bulk_edit.py:185 +#: netbox/dcim/forms/bulk_edit.py:355 netbox/dcim/forms/bulk_edit.py:709 +#: netbox/dcim/forms/bulk_edit.py:774 netbox/dcim/forms/bulk_edit.py:806 +#: netbox/dcim/forms/bulk_edit.py:933 netbox/dcim/forms/bulk_edit.py:1721 +#: netbox/dcim/forms/bulk_edit.py:1763 netbox/dcim/forms/bulk_import.py:90 +#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 +#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:686 +#: netbox/dcim/forms/bulk_import.py:1137 netbox/dcim/forms/bulk_import.py:1326 +#: netbox/dcim/forms/bulk_import.py:1490 netbox/dcim/forms/bulk_import.py:1554 +#: netbox/dcim/forms/filtersets.py:179 netbox/dcim/forms/filtersets.py:238 +#: netbox/dcim/forms/filtersets.py:360 netbox/dcim/forms/filtersets.py:800 +#: netbox/dcim/forms/filtersets.py:925 netbox/dcim/forms/filtersets.py:959 +#: netbox/dcim/forms/filtersets.py:1060 netbox/dcim/forms/filtersets.py:1171 +#: netbox/dcim/forms/filtersets.py:1562 netbox/dcim/tables/devices.py:150 +#: netbox/dcim/tables/devices.py:848 netbox/dcim/tables/devices.py:982 +#: netbox/dcim/tables/devices.py:1094 netbox/dcim/tables/modules.py:70 +#: netbox/dcim/tables/power.py:74 netbox/dcim/tables/racks.py:125 #: netbox/dcim/tables/sites.py:82 netbox/dcim/tables/sites.py:138 -#: netbox/ipam/forms/bulk_edit.py:256 netbox/ipam/forms/bulk_edit.py:306 -#: netbox/ipam/forms/bulk_edit.py:354 netbox/ipam/forms/bulk_edit.py:506 -#: netbox/ipam/forms/bulk_import.py:192 netbox/ipam/forms/bulk_import.py:257 -#: netbox/ipam/forms/bulk_import.py:293 netbox/ipam/forms/bulk_import.py:474 -#: netbox/ipam/forms/filtersets.py:210 netbox/ipam/forms/filtersets.py:281 -#: netbox/ipam/forms/filtersets.py:355 netbox/ipam/forms/filtersets.py:501 -#: netbox/ipam/forms/model_forms.py:501 netbox/ipam/tables/ip.py:237 -#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:363 -#: netbox/ipam/tables/ip.py:426 netbox/ipam/tables/ip.py:453 -#: netbox/ipam/tables/vlans.py:126 netbox/ipam/tables/vlans.py:232 +#: netbox/ipam/forms/bulk_edit.py:240 netbox/ipam/forms/bulk_edit.py:290 +#: netbox/ipam/forms/bulk_edit.py:338 netbox/ipam/forms/bulk_edit.py:490 +#: netbox/ipam/forms/bulk_import.py:188 netbox/ipam/forms/bulk_import.py:256 +#: netbox/ipam/forms/bulk_import.py:292 netbox/ipam/forms/bulk_import.py:473 +#: netbox/ipam/forms/filtersets.py:212 netbox/ipam/forms/filtersets.py:284 +#: netbox/ipam/forms/filtersets.py:358 netbox/ipam/forms/filtersets.py:542 +#: netbox/ipam/forms/model_forms.py:503 netbox/ipam/tables/ip.py:183 +#: netbox/ipam/tables/ip.py:262 netbox/ipam/tables/ip.py:313 +#: netbox/ipam/tables/ip.py:376 netbox/ipam/tables/ip.py:403 +#: netbox/ipam/tables/vlans.py:95 netbox/ipam/tables/vlans.py:208 #: netbox/templates/circuits/circuit.html:34 +#: netbox/templates/circuits/virtualcircuit.html:43 #: netbox/templates/core/datasource.html:46 netbox/templates/core/job.html:48 #: netbox/templates/core/rq_task.html:81 netbox/templates/core/system.html:18 #: netbox/templates/dcim/cable.html:19 netbox/templates/dcim/device.html:178 +#: netbox/templates/dcim/inventoryitem.html:36 #: netbox/templates/dcim/location.html:45 netbox/templates/dcim/module.html:69 #: netbox/templates/dcim/powerfeed.html:36 netbox/templates/dcim/rack.html:41 #: netbox/templates/dcim/site.html:43 #: netbox/templates/extras/script_list.html:48 #: netbox/templates/ipam/ipaddress.html:37 -#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/iprange.html:54 netbox/templates/ipam/prefix.html:69 #: netbox/templates/ipam/vlan.html:48 #: netbox/templates/virtualization/cluster.html:21 #: netbox/templates/virtualization/virtualmachine.html:19 @@ -680,62 +788,66 @@ msgstr "" #: netbox/templates/wireless/wirelesslan.html:22 #: netbox/templates/wireless/wirelesslink.html:17 #: netbox/users/forms/filtersets.py:32 netbox/users/forms/model_forms.py:194 -#: netbox/virtualization/forms/bulk_edit.py:70 -#: netbox/virtualization/forms/bulk_edit.py:118 -#: netbox/virtualization/forms/bulk_import.py:54 -#: netbox/virtualization/forms/bulk_import.py:80 -#: netbox/virtualization/forms/filtersets.py:62 -#: netbox/virtualization/forms/filtersets.py:160 +#: netbox/virtualization/forms/bulk_edit.py:71 +#: netbox/virtualization/forms/bulk_edit.py:100 +#: netbox/virtualization/forms/bulk_import.py:55 +#: netbox/virtualization/forms/bulk_import.py:86 +#: netbox/virtualization/forms/filtersets.py:82 +#: netbox/virtualization/forms/filtersets.py:165 #: netbox/virtualization/tables/clusters.py:74 -#: netbox/virtualization/tables/virtualmachines.py:60 +#: netbox/virtualization/tables/virtualmachines.py:30 #: netbox/vpn/forms/bulk_edit.py:39 netbox/vpn/forms/bulk_import.py:37 #: netbox/vpn/forms/filtersets.py:47 netbox/vpn/tables/tunnels.py:48 -#: netbox/wireless/forms/bulk_edit.py:43 netbox/wireless/forms/bulk_edit.py:105 -#: netbox/wireless/forms/bulk_import.py:43 -#: netbox/wireless/forms/bulk_import.py:84 -#: netbox/wireless/forms/filtersets.py:49 -#: netbox/wireless/forms/filtersets.py:83 +#: netbox/wireless/forms/bulk_edit.py:45 netbox/wireless/forms/bulk_edit.py:108 +#: netbox/wireless/forms/bulk_import.py:45 +#: netbox/wireless/forms/bulk_import.py:89 +#: netbox/wireless/forms/filtersets.py:52 +#: netbox/wireless/forms/filtersets.py:111 #: netbox/wireless/tables/wirelesslan.py:52 -#: netbox/wireless/tables/wirelesslink.py:20 +#: netbox/wireless/tables/wirelesslink.py:19 msgid "Status" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:142 -#: netbox/circuits/forms/bulk_edit.py:233 -#: netbox/circuits/forms/bulk_import.py:98 -#: netbox/circuits/forms/bulk_import.py:158 -#: netbox/circuits/forms/filtersets.py:119 -#: netbox/circuits/forms/filtersets.py:241 netbox/dcim/forms/bulk_edit.py:123 -#: netbox/dcim/forms/bulk_edit.py:188 netbox/dcim/forms/bulk_edit.py:347 -#: netbox/dcim/forms/bulk_edit.py:467 netbox/dcim/forms/bulk_edit.py:696 -#: netbox/dcim/forms/bulk_edit.py:809 netbox/dcim/forms/bulk_edit.py:1749 -#: netbox/dcim/forms/bulk_import.py:107 netbox/dcim/forms/bulk_import.py:152 -#: netbox/dcim/forms/bulk_import.py:241 netbox/dcim/forms/bulk_import.py:356 -#: netbox/dcim/forms/bulk_import.py:501 netbox/dcim/forms/bulk_import.py:1241 -#: netbox/dcim/forms/bulk_import.py:1450 netbox/dcim/forms/filtersets.py:173 -#: netbox/dcim/forms/filtersets.py:205 netbox/dcim/forms/filtersets.py:323 -#: netbox/dcim/forms/filtersets.py:399 netbox/dcim/forms/filtersets.py:420 -#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:916 -#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1008 -#: netbox/dcim/forms/filtersets.py:1130 netbox/dcim/tables/power.py:88 +#: netbox/circuits/forms/bulk_edit.py:154 +#: netbox/circuits/forms/bulk_edit.py:271 +#: netbox/circuits/forms/bulk_edit.py:342 +#: netbox/circuits/forms/bulk_import.py:111 +#: netbox/circuits/forms/bulk_import.py:170 +#: netbox/circuits/forms/bulk_import.py:232 +#: netbox/circuits/forms/filtersets.py:130 +#: netbox/circuits/forms/filtersets.py:272 +#: netbox/circuits/forms/filtersets.py:326 netbox/dcim/forms/bulk_edit.py:126 +#: netbox/dcim/forms/bulk_edit.py:191 netbox/dcim/forms/bulk_edit.py:350 +#: netbox/dcim/forms/bulk_edit.py:470 netbox/dcim/forms/bulk_edit.py:699 +#: netbox/dcim/forms/bulk_edit.py:812 netbox/dcim/forms/bulk_edit.py:1768 +#: netbox/dcim/forms/bulk_import.py:109 netbox/dcim/forms/bulk_import.py:154 +#: netbox/dcim/forms/bulk_import.py:243 netbox/dcim/forms/bulk_import.py:358 +#: netbox/dcim/forms/bulk_import.py:506 netbox/dcim/forms/bulk_import.py:1338 +#: netbox/dcim/forms/bulk_import.py:1547 netbox/dcim/forms/filtersets.py:174 +#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:324 +#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:421 +#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:917 +#: netbox/dcim/forms/filtersets.py:979 netbox/dcim/forms/filtersets.py:1009 +#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/tables/power.py:88 #: netbox/extras/filtersets.py:612 netbox/extras/forms/filtersets.py:323 -#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:43 -#: netbox/ipam/forms/bulk_edit.py:68 netbox/ipam/forms/bulk_edit.py:112 -#: netbox/ipam/forms/bulk_edit.py:141 netbox/ipam/forms/bulk_edit.py:166 -#: netbox/ipam/forms/bulk_edit.py:251 netbox/ipam/forms/bulk_edit.py:301 -#: netbox/ipam/forms/bulk_edit.py:349 netbox/ipam/forms/bulk_edit.py:501 -#: netbox/ipam/forms/bulk_import.py:38 netbox/ipam/forms/bulk_import.py:67 -#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 -#: netbox/ipam/forms/bulk_import.py:135 netbox/ipam/forms/bulk_import.py:164 -#: netbox/ipam/forms/bulk_import.py:250 netbox/ipam/forms/bulk_import.py:286 -#: netbox/ipam/forms/bulk_import.py:467 netbox/ipam/forms/filtersets.py:48 -#: netbox/ipam/forms/filtersets.py:68 netbox/ipam/forms/filtersets.py:100 -#: netbox/ipam/forms/filtersets.py:120 netbox/ipam/forms/filtersets.py:143 -#: netbox/ipam/forms/filtersets.py:174 netbox/ipam/forms/filtersets.py:267 -#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:469 -#: netbox/ipam/tables/ip.py:456 netbox/ipam/tables/vlans.py:229 -#: netbox/templates/circuits/circuit.html:38 +#: netbox/extras/forms/filtersets.py:396 netbox/ipam/forms/bulk_edit.py:46 +#: netbox/ipam/forms/bulk_edit.py:71 netbox/ipam/forms/bulk_edit.py:115 +#: netbox/ipam/forms/bulk_edit.py:144 netbox/ipam/forms/bulk_edit.py:169 +#: netbox/ipam/forms/bulk_edit.py:235 netbox/ipam/forms/bulk_edit.py:285 +#: netbox/ipam/forms/bulk_edit.py:333 netbox/ipam/forms/bulk_edit.py:485 +#: netbox/ipam/forms/bulk_import.py:41 netbox/ipam/forms/bulk_import.py:70 +#: netbox/ipam/forms/bulk_import.py:98 netbox/ipam/forms/bulk_import.py:118 +#: netbox/ipam/forms/bulk_import.py:138 netbox/ipam/forms/bulk_import.py:167 +#: netbox/ipam/forms/bulk_import.py:249 netbox/ipam/forms/bulk_import.py:285 +#: netbox/ipam/forms/bulk_import.py:466 netbox/ipam/forms/filtersets.py:50 +#: netbox/ipam/forms/filtersets.py:70 netbox/ipam/forms/filtersets.py:102 +#: netbox/ipam/forms/filtersets.py:122 netbox/ipam/forms/filtersets.py:145 +#: netbox/ipam/forms/filtersets.py:176 netbox/ipam/forms/filtersets.py:270 +#: netbox/ipam/forms/filtersets.py:313 netbox/ipam/forms/filtersets.py:510 +#: netbox/ipam/tables/ip.py:406 netbox/ipam/tables/vlans.py:205 +#: netbox/templates/circuits/circuit.html:48 #: netbox/templates/circuits/circuitgroup.html:36 +#: netbox/templates/circuits/virtualcircuit.html:47 #: netbox/templates/dcim/cable.html:23 netbox/templates/dcim/device.html:79 #: netbox/templates/dcim/location.html:49 #: netbox/templates/dcim/powerfeed.html:44 netbox/templates/dcim/rack.html:32 @@ -751,114 +863,181 @@ msgstr "" #: netbox/templates/virtualization/cluster.html:33 #: netbox/templates/virtualization/virtualmachine.html:39 #: netbox/templates/vpn/l2vpn.html:30 netbox/templates/vpn/tunnel.html:49 -#: netbox/templates/wireless/wirelesslan.html:34 +#: netbox/templates/wireless/wirelesslan.html:42 #: netbox/templates/wireless/wirelesslink.html:25 -#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:48 -#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:64 -#: netbox/virtualization/forms/bulk_edit.py:76 -#: netbox/virtualization/forms/bulk_edit.py:155 -#: netbox/virtualization/forms/bulk_import.py:66 -#: netbox/virtualization/forms/bulk_import.py:115 +#: netbox/tenancy/forms/forms.py:25 netbox/tenancy/forms/forms.py:49 +#: netbox/tenancy/forms/model_forms.py:52 netbox/tenancy/tables/columns.py:49 +#: netbox/virtualization/forms/bulk_edit.py:77 +#: netbox/virtualization/forms/bulk_edit.py:137 +#: netbox/virtualization/forms/bulk_import.py:67 +#: netbox/virtualization/forms/bulk_import.py:121 #: netbox/virtualization/forms/filtersets.py:47 -#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/virtualization/forms/filtersets.py:110 #: netbox/vpn/forms/bulk_edit.py:59 netbox/vpn/forms/bulk_edit.py:269 #: netbox/vpn/forms/bulk_import.py:59 netbox/vpn/forms/bulk_import.py:258 -#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:63 -#: netbox/wireless/forms/bulk_edit.py:110 -#: netbox/wireless/forms/bulk_import.py:55 -#: netbox/wireless/forms/bulk_import.py:97 -#: netbox/wireless/forms/filtersets.py:35 -#: netbox/wireless/forms/filtersets.py:75 +#: netbox/vpn/forms/filtersets.py:214 netbox/wireless/forms/bulk_edit.py:65 +#: netbox/wireless/forms/bulk_edit.py:113 +#: netbox/wireless/forms/bulk_import.py:57 +#: netbox/wireless/forms/bulk_import.py:102 +#: netbox/wireless/forms/filtersets.py:38 +#: netbox/wireless/forms/filtersets.py:103 msgid "Tenant" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:147 -#: netbox/circuits/forms/filtersets.py:174 +#: netbox/circuits/forms/bulk_edit.py:159 +#: netbox/circuits/forms/filtersets.py:185 msgid "Install date" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:152 -#: netbox/circuits/forms/filtersets.py:179 +#: netbox/circuits/forms/bulk_edit.py:164 +#: netbox/circuits/forms/filtersets.py:190 msgid "Termination date" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:158 -#: netbox/circuits/forms/filtersets.py:186 +#: netbox/circuits/forms/bulk_edit.py:170 +#: netbox/circuits/forms/filtersets.py:197 msgid "Commit rate (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:173 -#: netbox/circuits/forms/model_forms.py:112 +#: netbox/circuits/forms/bulk_edit.py:176 +#: netbox/circuits/forms/filtersets.py:203 +#: netbox/circuits/forms/model_forms.py:136 +#: netbox/templates/circuits/circuit.html:38 +#: netbox/templates/wireless/wirelesslink.html:38 +#: netbox/wireless/forms/bulk_edit.py:132 +#: netbox/wireless/forms/filtersets.py:130 +#: netbox/wireless/forms/model_forms.py:168 +msgid "Distance" +msgstr "" + +#: netbox/circuits/forms/bulk_edit.py:181 +#: netbox/circuits/forms/bulk_import.py:105 +#: netbox/circuits/forms/bulk_import.py:108 +#: netbox/circuits/forms/filtersets.py:207 +#: netbox/wireless/forms/bulk_edit.py:137 +#: netbox/wireless/forms/bulk_import.py:121 +#: netbox/wireless/forms/bulk_import.py:124 +#: netbox/wireless/forms/filtersets.py:134 +msgid "Distance unit" +msgstr "" + +#: netbox/circuits/forms/bulk_edit.py:196 +#: netbox/circuits/forms/model_forms.py:141 msgid "Service Parameters" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:174 -#: netbox/circuits/forms/model_forms.py:113 -#: netbox/circuits/forms/model_forms.py:183 -#: netbox/dcim/forms/model_forms.py:139 netbox/dcim/forms/model_forms.py:181 -#: netbox/dcim/forms/model_forms.py:266 netbox/dcim/forms/model_forms.py:323 -#: netbox/dcim/forms/model_forms.py:768 netbox/dcim/forms/model_forms.py:1699 -#: netbox/ipam/forms/model_forms.py:64 netbox/ipam/forms/model_forms.py:81 -#: netbox/ipam/forms/model_forms.py:115 netbox/ipam/forms/model_forms.py:136 -#: netbox/ipam/forms/model_forms.py:160 netbox/ipam/forms/model_forms.py:232 -#: netbox/ipam/forms/model_forms.py:261 netbox/ipam/forms/model_forms.py:320 +#: netbox/circuits/forms/bulk_edit.py:197 +#: netbox/circuits/forms/filtersets.py:73 +#: netbox/circuits/forms/filtersets.py:91 +#: netbox/circuits/forms/filtersets.py:110 +#: netbox/circuits/forms/filtersets.py:127 +#: netbox/circuits/forms/filtersets.py:310 +#: netbox/circuits/forms/filtersets.py:325 netbox/core/forms/filtersets.py:67 +#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:846 +#: netbox/dcim/forms/filtersets.py:173 netbox/dcim/forms/filtersets.py:205 +#: netbox/dcim/forms/filtersets.py:916 netbox/dcim/forms/filtersets.py:1008 +#: netbox/dcim/forms/filtersets.py:1132 netbox/dcim/forms/filtersets.py:1240 +#: netbox/dcim/forms/filtersets.py:1264 netbox/dcim/forms/filtersets.py:1289 +#: netbox/dcim/forms/filtersets.py:1308 netbox/dcim/forms/filtersets.py:1332 +#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1470 +#: netbox/dcim/forms/filtersets.py:1494 netbox/dcim/forms/filtersets.py:1512 +#: netbox/dcim/forms/filtersets.py:1528 netbox/extras/forms/bulk_edit.py:90 +#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 +#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 +#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 +#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 +#: netbox/ipam/forms/filtersets.py:101 netbox/ipam/forms/filtersets.py:269 +#: netbox/ipam/forms/filtersets.py:310 netbox/ipam/forms/filtersets.py:385 +#: netbox/ipam/forms/filtersets.py:470 netbox/ipam/forms/filtersets.py:483 +#: netbox/ipam/forms/filtersets.py:508 netbox/ipam/forms/filtersets.py:579 +#: netbox/ipam/forms/filtersets.py:597 netbox/netbox/tables/tables.py:256 +#: netbox/virtualization/forms/filtersets.py:45 +#: netbox/virtualization/forms/filtersets.py:108 +#: netbox/virtualization/forms/filtersets.py:203 +#: netbox/virtualization/forms/filtersets.py:248 +#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:153 +#: netbox/wireless/forms/filtersets.py:36 +#: netbox/wireless/forms/filtersets.py:102 +msgid "Attributes" +msgstr "" + +#: netbox/circuits/forms/bulk_edit.py:198 +#: netbox/circuits/forms/bulk_edit.py:356 +#: netbox/circuits/forms/model_forms.py:142 +#: netbox/circuits/forms/model_forms.py:240 +#: netbox/circuits/forms/model_forms.py:345 +#: netbox/dcim/forms/model_forms.py:143 netbox/dcim/forms/model_forms.py:185 +#: netbox/dcim/forms/model_forms.py:274 netbox/dcim/forms/model_forms.py:331 +#: netbox/dcim/forms/model_forms.py:780 netbox/dcim/forms/model_forms.py:1744 +#: netbox/ipam/forms/model_forms.py:67 netbox/ipam/forms/model_forms.py:84 +#: netbox/ipam/forms/model_forms.py:119 netbox/ipam/forms/model_forms.py:141 +#: netbox/ipam/forms/model_forms.py:166 netbox/ipam/forms/model_forms.py:233 +#: netbox/ipam/forms/model_forms.py:263 netbox/ipam/forms/model_forms.py:322 #: netbox/netbox/navigation/menu.py:24 #: netbox/templates/dcim/device_edit.html:85 #: netbox/templates/dcim/htmx/cable_edit.html:72 #: netbox/templates/ipam/ipaddress_bulk_add.html:27 -#: netbox/templates/ipam/vlan_edit.html:22 -#: netbox/virtualization/forms/model_forms.py:80 -#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/virtualization/forms/model_forms.py:79 +#: netbox/virtualization/forms/model_forms.py:221 #: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 -#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 -#: netbox/vpn/forms/model_forms.py:411 netbox/wireless/forms/model_forms.py:54 -#: netbox/wireless/forms/model_forms.py:170 +#: netbox/vpn/forms/model_forms.py:63 netbox/vpn/forms/model_forms.py:148 +#: netbox/vpn/forms/model_forms.py:414 netbox/wireless/forms/model_forms.py:57 +#: netbox/wireless/forms/model_forms.py:173 msgid "Tenancy" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:193 -#: netbox/circuits/forms/bulk_edit.py:217 -#: netbox/circuits/forms/model_forms.py:155 -#: netbox/circuits/tables/circuits.py:117 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 -#: netbox/templates/circuits/providernetwork.html:17 -msgid "Provider Network" +#: netbox/circuits/forms/bulk_edit.py:215 +#: netbox/circuits/forms/model_forms.py:170 +#: netbox/dcim/forms/bulk_import.py:1299 netbox/dcim/forms/bulk_import.py:1317 +msgid "Termination type" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:199 +#: netbox/circuits/forms/bulk_edit.py:218 +#: netbox/circuits/forms/bulk_import.py:133 +#: netbox/circuits/forms/filtersets.py:220 +#: netbox/circuits/forms/model_forms.py:173 +#: netbox/templates/circuits/inc/circuit_termination.html:6 +#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 +#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 +msgid "Termination" +msgstr "" + +#: netbox/circuits/forms/bulk_edit.py:226 msgid "Port speed (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:203 +#: netbox/circuits/forms/bulk_edit.py:230 msgid "Upstream speed (Kbps)" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:206 netbox/dcim/forms/bulk_edit.py:966 -#: netbox/dcim/forms/bulk_edit.py:1330 netbox/dcim/forms/bulk_edit.py:1347 -#: netbox/dcim/forms/bulk_edit.py:1364 netbox/dcim/forms/bulk_edit.py:1382 -#: netbox/dcim/forms/bulk_edit.py:1477 netbox/dcim/forms/bulk_edit.py:1637 -#: netbox/dcim/forms/bulk_edit.py:1654 +#: netbox/circuits/forms/bulk_edit.py:233 netbox/dcim/forms/bulk_edit.py:969 +#: netbox/dcim/forms/bulk_edit.py:1333 netbox/dcim/forms/bulk_edit.py:1350 +#: netbox/dcim/forms/bulk_edit.py:1367 netbox/dcim/forms/bulk_edit.py:1385 +#: netbox/dcim/forms/bulk_edit.py:1480 netbox/dcim/forms/bulk_edit.py:1650 +#: netbox/dcim/forms/bulk_edit.py:1667 msgid "Mark connected" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:219 -#: netbox/circuits/forms/model_forms.py:157 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 +#: netbox/circuits/forms/bulk_edit.py:243 +#: netbox/circuits/forms/model_forms.py:184 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:55 #: netbox/templates/dcim/frontport.html:121 -#: netbox/templates/dcim/interface.html:193 +#: netbox/templates/dcim/interface.html:250 #: netbox/templates/dcim/rearport.html:111 msgid "Circuit Termination" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:221 -#: netbox/circuits/forms/model_forms.py:159 +#: netbox/circuits/forms/bulk_edit.py:245 +#: netbox/circuits/forms/model_forms.py:186 msgid "Termination Details" msgstr "" -#: netbox/circuits/forms/bulk_edit.py:251 -#: netbox/circuits/forms/filtersets.py:268 -#: netbox/circuits/tables/circuits.py:168 netbox/dcim/forms/model_forms.py:551 -#: netbox/templates/circuits/circuitgroupassignment.html:30 +#: netbox/circuits/forms/bulk_edit.py:289 +#: netbox/circuits/forms/bulk_import.py:188 +#: netbox/circuits/forms/filtersets.py:299 +#: netbox/circuits/tables/circuits.py:207 netbox/dcim/forms/model_forms.py:562 +#: netbox/templates/circuits/circuitgroupassignment.html:34 #: netbox/templates/dcim/device.html:133 #: netbox/templates/dcim/virtualchassis.html:68 #: netbox/templates/dcim/virtualchassis_edit.html:56 @@ -867,226 +1046,309 @@ msgstr "" msgid "Priority" msgstr "" -#: netbox/circuits/forms/bulk_import.py:39 -#: netbox/circuits/forms/bulk_import.py:54 -#: netbox/circuits/forms/bulk_import.py:77 -msgid "Assigned provider" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:83 -msgid "Assigned provider account" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:90 -msgid "Type of circuit" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:95 netbox/dcim/forms/bulk_import.py:90 -#: netbox/dcim/forms/bulk_import.py:149 netbox/dcim/forms/bulk_import.py:250 -#: netbox/dcim/forms/bulk_import.py:529 netbox/dcim/forms/bulk_import.py:683 -#: netbox/dcim/forms/bulk_import.py:1395 netbox/ipam/forms/bulk_import.py:194 -#: netbox/ipam/forms/bulk_import.py:259 netbox/ipam/forms/bulk_import.py:295 -#: netbox/ipam/forms/bulk_import.py:476 -#: netbox/virtualization/forms/bulk_import.py:56 -#: netbox/virtualization/forms/bulk_import.py:82 -#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:45 -msgid "Operational status" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:102 -#: netbox/circuits/forms/bulk_import.py:162 -#: netbox/dcim/forms/bulk_import.py:111 netbox/dcim/forms/bulk_import.py:156 -#: netbox/dcim/forms/bulk_import.py:360 netbox/dcim/forms/bulk_import.py:505 -#: netbox/dcim/forms/bulk_import.py:1245 netbox/dcim/forms/bulk_import.py:1390 -#: netbox/dcim/forms/bulk_import.py:1454 netbox/ipam/forms/bulk_import.py:42 -#: netbox/ipam/forms/bulk_import.py:71 netbox/ipam/forms/bulk_import.py:99 -#: netbox/ipam/forms/bulk_import.py:119 netbox/ipam/forms/bulk_import.py:139 -#: netbox/ipam/forms/bulk_import.py:168 netbox/ipam/forms/bulk_import.py:254 -#: netbox/ipam/forms/bulk_import.py:290 netbox/ipam/forms/bulk_import.py:471 -#: netbox/virtualization/forms/bulk_import.py:70 -#: netbox/virtualization/forms/bulk_import.py:119 -#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:59 -#: netbox/wireless/forms/bulk_import.py:101 -msgid "Assigned tenant" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:120 -#: netbox/templates/circuits/inc/circuit_termination.html:6 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:15 -#: netbox/templates/dcim/cable.html:68 netbox/templates/dcim/cable.html:72 -#: netbox/vpn/forms/bulk_import.py:100 netbox/vpn/forms/filtersets.py:77 -msgid "Termination" -msgstr "" - -#: netbox/circuits/forms/bulk_import.py:130 -#: netbox/circuits/forms/filtersets.py:147 -#: netbox/circuits/forms/filtersets.py:227 -#: netbox/circuits/forms/model_forms.py:144 +#: netbox/circuits/forms/bulk_edit.py:321 +#: netbox/circuits/forms/bulk_import.py:208 +#: netbox/circuits/forms/filtersets.py:158 +#: netbox/circuits/forms/filtersets.py:258 +#: netbox/circuits/forms/filtersets.py:348 +#: netbox/circuits/forms/filtersets.py:386 +#: netbox/circuits/forms/model_forms.py:325 +#: netbox/circuits/tables/virtual_circuits.py:51 +#: netbox/circuits/tables/virtual_circuits.py:99 msgid "Provider network" msgstr "" -#: netbox/circuits/forms/filtersets.py:30 -#: netbox/circuits/forms/filtersets.py:118 -#: netbox/circuits/forms/filtersets.py:200 netbox/dcim/forms/bulk_edit.py:339 -#: netbox/dcim/forms/bulk_edit.py:447 netbox/dcim/forms/bulk_edit.py:688 -#: netbox/dcim/forms/bulk_edit.py:743 netbox/dcim/forms/bulk_edit.py:897 -#: netbox/dcim/forms/bulk_import.py:235 netbox/dcim/forms/bulk_import.py:337 -#: netbox/dcim/forms/bulk_import.py:568 netbox/dcim/forms/bulk_import.py:1339 -#: netbox/dcim/forms/bulk_import.py:1373 netbox/dcim/forms/filtersets.py:95 -#: netbox/dcim/forms/filtersets.py:322 netbox/dcim/forms/filtersets.py:356 -#: netbox/dcim/forms/filtersets.py:396 netbox/dcim/forms/filtersets.py:447 -#: netbox/dcim/forms/filtersets.py:719 netbox/dcim/forms/filtersets.py:762 -#: netbox/dcim/forms/filtersets.py:977 netbox/dcim/forms/filtersets.py:1006 -#: netbox/dcim/forms/filtersets.py:1026 netbox/dcim/forms/filtersets.py:1090 -#: netbox/dcim/forms/filtersets.py:1120 netbox/dcim/forms/filtersets.py:1129 -#: netbox/dcim/forms/filtersets.py:1240 netbox/dcim/forms/filtersets.py:1264 -#: netbox/dcim/forms/filtersets.py:1289 netbox/dcim/forms/filtersets.py:1308 -#: netbox/dcim/forms/filtersets.py:1331 netbox/dcim/forms/filtersets.py:1442 -#: netbox/dcim/forms/filtersets.py:1466 netbox/dcim/forms/filtersets.py:1490 -#: netbox/dcim/forms/filtersets.py:1508 netbox/dcim/forms/filtersets.py:1525 -#: netbox/dcim/forms/model_forms.py:180 netbox/dcim/forms/model_forms.py:243 -#: netbox/dcim/forms/model_forms.py:468 netbox/dcim/forms/model_forms.py:728 -#: netbox/dcim/tables/devices.py:157 netbox/dcim/tables/power.py:30 -#: netbox/dcim/tables/racks.py:118 netbox/dcim/tables/racks.py:212 +#: netbox/circuits/forms/bulk_edit.py:365 +#: netbox/circuits/forms/bulk_import.py:254 +#: netbox/circuits/forms/filtersets.py:376 +#: netbox/circuits/forms/model_forms.py:365 netbox/dcim/forms/bulk_edit.py:361 +#: netbox/dcim/forms/bulk_edit.py:1280 netbox/dcim/forms/bulk_edit.py:1711 +#: netbox/dcim/forms/bulk_import.py:255 netbox/dcim/forms/bulk_import.py:1106 +#: netbox/dcim/forms/filtersets.py:368 netbox/dcim/forms/filtersets.py:778 +#: netbox/dcim/forms/filtersets.py:1539 netbox/dcim/forms/model_forms.py:256 +#: netbox/dcim/forms/model_forms.py:1090 netbox/dcim/forms/model_forms.py:1559 +#: netbox/dcim/forms/object_import.py:182 netbox/dcim/tables/devices.py:179 +#: netbox/dcim/tables/devices.py:840 netbox/dcim/tables/devices.py:966 +#: netbox/dcim/tables/devicetypes.py:306 netbox/dcim/tables/racks.py:128 +#: netbox/extras/filtersets.py:552 netbox/ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:295 netbox/ipam/forms/bulk_edit.py:343 +#: netbox/ipam/forms/bulk_edit.py:495 netbox/ipam/forms/bulk_import.py:193 +#: netbox/ipam/forms/bulk_import.py:261 netbox/ipam/forms/bulk_import.py:297 +#: netbox/ipam/forms/bulk_import.py:478 netbox/ipam/forms/filtersets.py:240 +#: netbox/ipam/forms/filtersets.py:292 netbox/ipam/forms/filtersets.py:363 +#: netbox/ipam/forms/filtersets.py:550 netbox/ipam/forms/model_forms.py:194 +#: netbox/ipam/forms/model_forms.py:220 netbox/ipam/forms/model_forms.py:251 +#: netbox/ipam/forms/model_forms.py:678 netbox/ipam/tables/ip.py:207 +#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:317 +#: netbox/ipam/tables/vlans.py:99 netbox/ipam/tables/vlans.py:211 +#: netbox/templates/circuits/virtualcircuittermination.html:42 +#: netbox/templates/dcim/device.html:182 +#: netbox/templates/dcim/inc/panels/inventory_items.html:20 +#: netbox/templates/dcim/interface.html:178 +#: netbox/templates/dcim/interface.html:280 +#: netbox/templates/dcim/inventoryitem.html:40 +#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 +#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:73 +#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 +#: netbox/templates/virtualization/virtualmachine.html:23 +#: netbox/templates/vpn/tunneltermination.html:17 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 +#: netbox/tenancy/forms/bulk_edit.py:142 netbox/tenancy/forms/filtersets.py:107 +#: netbox/tenancy/forms/model_forms.py:137 +#: netbox/tenancy/tables/contacts.py:102 +#: netbox/virtualization/forms/bulk_edit.py:127 +#: netbox/virtualization/forms/bulk_import.py:112 +#: netbox/virtualization/forms/filtersets.py:162 +#: netbox/virtualization/forms/model_forms.py:194 +#: netbox/virtualization/tables/virtualmachines.py:45 +#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 +#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:79 +#: netbox/vpn/forms/model_forms.py:114 netbox/vpn/tables/tunnels.py:82 +msgid "Role" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:46 +#: netbox/circuits/forms/bulk_import.py:61 +#: netbox/circuits/forms/bulk_import.py:84 +msgid "Assigned provider" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:90 +msgid "Assigned provider account" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:97 +msgid "Type of circuit" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:102 +#: netbox/circuits/forms/bulk_import.py:229 netbox/dcim/forms/bulk_import.py:92 +#: netbox/dcim/forms/bulk_import.py:151 netbox/dcim/forms/bulk_import.py:252 +#: netbox/dcim/forms/bulk_import.py:534 netbox/dcim/forms/bulk_import.py:688 +#: netbox/dcim/forms/bulk_import.py:1139 netbox/dcim/forms/bulk_import.py:1492 +#: netbox/ipam/forms/bulk_import.py:190 netbox/ipam/forms/bulk_import.py:258 +#: netbox/ipam/forms/bulk_import.py:294 netbox/ipam/forms/bulk_import.py:475 +#: netbox/ipam/forms/bulk_import.py:488 +#: netbox/virtualization/forms/bulk_import.py:57 +#: netbox/virtualization/forms/bulk_import.py:88 +#: netbox/vpn/forms/bulk_import.py:39 netbox/wireless/forms/bulk_import.py:47 +msgid "Operational status" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:115 +#: netbox/circuits/forms/bulk_import.py:174 +#: netbox/circuits/forms/bulk_import.py:236 +#: netbox/dcim/forms/bulk_import.py:113 netbox/dcim/forms/bulk_import.py:158 +#: netbox/dcim/forms/bulk_import.py:362 netbox/dcim/forms/bulk_import.py:510 +#: netbox/dcim/forms/bulk_import.py:1342 netbox/dcim/forms/bulk_import.py:1487 +#: netbox/dcim/forms/bulk_import.py:1551 netbox/ipam/forms/bulk_import.py:45 +#: netbox/ipam/forms/bulk_import.py:74 netbox/ipam/forms/bulk_import.py:102 +#: netbox/ipam/forms/bulk_import.py:122 netbox/ipam/forms/bulk_import.py:142 +#: netbox/ipam/forms/bulk_import.py:171 netbox/ipam/forms/bulk_import.py:253 +#: netbox/ipam/forms/bulk_import.py:289 netbox/ipam/forms/bulk_import.py:470 +#: netbox/virtualization/forms/bulk_import.py:71 +#: netbox/virtualization/forms/bulk_import.py:125 +#: netbox/vpn/forms/bulk_import.py:63 netbox/wireless/forms/bulk_import.py:61 +#: netbox/wireless/forms/bulk_import.py:106 +msgid "Assigned tenant" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:139 +msgid "Termination type (app & model)" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:151 +#: netbox/circuits/forms/bulk_import.py:164 +msgid "Termination ID" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:185 +msgid "Circuit type (app & model)" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:211 +msgid "The network to which this virtual circuit belongs" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:217 +msgid "Assigned provider account (if any)" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:224 +msgid "Type of virtual circuit" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:256 netbox/vpn/forms/bulk_import.py:83 +msgid "Operational role" +msgstr "" + +#: netbox/circuits/forms/bulk_import.py:259 +#: netbox/circuits/forms/model_forms.py:368 +#: netbox/circuits/tables/virtual_circuits.py:112 +#: netbox/dcim/forms/bulk_import.py:1219 netbox/dcim/forms/model_forms.py:1164 +#: netbox/dcim/forms/model_forms.py:1433 netbox/dcim/forms/model_forms.py:1600 +#: netbox/dcim/forms/model_forms.py:1635 netbox/dcim/forms/model_forms.py:1765 +#: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1140 +#: netbox/ipam/forms/bulk_import.py:317 netbox/ipam/forms/model_forms.py:282 +#: netbox/ipam/forms/model_forms.py:291 netbox/ipam/tables/fhrp.py:64 +#: netbox/ipam/tables/ip.py:322 netbox/ipam/tables/vlans.py:145 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/templates/circuits/virtualcircuittermination.html:53 +#: netbox/templates/circuits/virtualcircuittermination.html:60 +#: netbox/templates/dcim/frontport.html:106 +#: netbox/templates/dcim/interface.html:27 +#: netbox/templates/dcim/interface.html:241 +#: netbox/templates/dcim/interface.html:367 +#: netbox/templates/dcim/rearport.html:102 +#: netbox/templates/virtualization/vminterface.html:18 +#: netbox/templates/vpn/tunneltermination.html:31 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 +#: netbox/templates/wireless/wirelesslink.html:10 +#: netbox/templates/wireless/wirelesslink.html:55 +#: netbox/virtualization/forms/model_forms.py:369 +#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:439 +#: netbox/vpn/forms/model_forms.py:448 netbox/wireless/forms/model_forms.py:116 +#: netbox/wireless/forms/model_forms.py:158 +msgid "Interface" +msgstr "" + +#: netbox/circuits/forms/filtersets.py:38 +#: netbox/circuits/forms/filtersets.py:129 +#: netbox/circuits/forms/filtersets.py:240 +#: netbox/circuits/tables/circuits.py:144 netbox/dcim/forms/bulk_edit.py:342 +#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:691 +#: netbox/dcim/forms/bulk_edit.py:746 netbox/dcim/forms/bulk_edit.py:900 +#: netbox/dcim/forms/bulk_import.py:237 netbox/dcim/forms/bulk_import.py:339 +#: netbox/dcim/forms/bulk_import.py:573 netbox/dcim/forms/bulk_import.py:1436 +#: netbox/dcim/forms/bulk_import.py:1470 netbox/dcim/forms/filtersets.py:96 +#: netbox/dcim/forms/filtersets.py:323 netbox/dcim/forms/filtersets.py:357 +#: netbox/dcim/forms/filtersets.py:397 netbox/dcim/forms/filtersets.py:448 +#: netbox/dcim/forms/filtersets.py:720 netbox/dcim/forms/filtersets.py:763 +#: netbox/dcim/forms/filtersets.py:978 netbox/dcim/forms/filtersets.py:1007 +#: netbox/dcim/forms/filtersets.py:1027 netbox/dcim/forms/filtersets.py:1091 +#: netbox/dcim/forms/filtersets.py:1121 netbox/dcim/forms/filtersets.py:1130 +#: netbox/dcim/forms/filtersets.py:1241 netbox/dcim/forms/filtersets.py:1265 +#: netbox/dcim/forms/filtersets.py:1290 netbox/dcim/forms/filtersets.py:1309 +#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/forms/filtersets.py:1447 +#: netbox/dcim/forms/filtersets.py:1471 netbox/dcim/forms/filtersets.py:1495 +#: netbox/dcim/forms/filtersets.py:1513 netbox/dcim/forms/filtersets.py:1530 +#: netbox/dcim/forms/model_forms.py:184 netbox/dcim/forms/model_forms.py:248 +#: netbox/dcim/forms/model_forms.py:478 netbox/dcim/forms/model_forms.py:739 +#: netbox/dcim/tables/devices.py:167 netbox/dcim/tables/power.py:30 +#: netbox/dcim/tables/racks.py:117 netbox/dcim/tables/racks.py:211 #: netbox/extras/filtersets.py:536 netbox/extras/forms/filtersets.py:320 -#: netbox/ipam/forms/filtersets.py:173 netbox/ipam/forms/filtersets.py:414 -#: netbox/ipam/forms/filtersets.py:437 netbox/ipam/forms/filtersets.py:467 +#: netbox/ipam/forms/filtersets.py:234 netbox/ipam/forms/filtersets.py:417 +#: netbox/ipam/forms/filtersets.py:440 netbox/ipam/forms/filtersets.py:507 #: netbox/templates/dcim/device.html:26 #: netbox/templates/dcim/device_edit.html:30 #: netbox/templates/dcim/inc/cable_termination.html:12 #: netbox/templates/dcim/location.html:26 #: netbox/templates/dcim/powerpanel.html:26 netbox/templates/dcim/rack.html:24 #: netbox/templates/dcim/rackreservation.html:32 -#: netbox/virtualization/forms/filtersets.py:46 -#: netbox/virtualization/forms/filtersets.py:100 -#: netbox/wireless/forms/model_forms.py:87 -#: netbox/wireless/forms/model_forms.py:129 +#: netbox/virtualization/forms/filtersets.py:79 +#: netbox/virtualization/forms/filtersets.py:105 +#: netbox/wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/model_forms.py:90 +#: netbox/wireless/forms/model_forms.py:132 msgid "Location" msgstr "" -#: netbox/circuits/forms/filtersets.py:32 -#: netbox/circuits/forms/filtersets.py:120 netbox/dcim/forms/filtersets.py:144 -#: netbox/dcim/forms/filtersets.py:158 netbox/dcim/forms/filtersets.py:174 -#: netbox/dcim/forms/filtersets.py:206 netbox/dcim/forms/filtersets.py:328 -#: netbox/dcim/forms/filtersets.py:400 netbox/dcim/forms/filtersets.py:471 -#: netbox/dcim/forms/filtersets.py:723 netbox/dcim/forms/filtersets.py:1091 +#: netbox/circuits/forms/filtersets.py:40 +#: netbox/circuits/forms/filtersets.py:131 netbox/dcim/forms/filtersets.py:145 +#: netbox/dcim/forms/filtersets.py:159 netbox/dcim/forms/filtersets.py:175 +#: netbox/dcim/forms/filtersets.py:207 netbox/dcim/forms/filtersets.py:329 +#: netbox/dcim/forms/filtersets.py:401 netbox/dcim/forms/filtersets.py:472 +#: netbox/dcim/forms/filtersets.py:724 netbox/dcim/forms/filtersets.py:1092 #: netbox/netbox/navigation/menu.py:31 netbox/netbox/navigation/menu.py:33 -#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:70 +#: netbox/tenancy/forms/filtersets.py:42 netbox/tenancy/tables/columns.py:55 #: netbox/tenancy/tables/contacts.py:25 netbox/tenancy/views.py:19 #: netbox/virtualization/forms/filtersets.py:37 #: netbox/virtualization/forms/filtersets.py:48 -#: netbox/virtualization/forms/filtersets.py:106 +#: netbox/virtualization/forms/filtersets.py:111 msgid "Contacts" msgstr "" -#: netbox/circuits/forms/filtersets.py:37 -#: netbox/circuits/forms/filtersets.py:157 netbox/dcim/forms/bulk_edit.py:113 -#: netbox/dcim/forms/bulk_edit.py:314 netbox/dcim/forms/bulk_edit.py:872 -#: netbox/dcim/forms/bulk_import.py:93 netbox/dcim/forms/filtersets.py:73 -#: netbox/dcim/forms/filtersets.py:185 netbox/dcim/forms/filtersets.py:211 -#: netbox/dcim/forms/filtersets.py:334 netbox/dcim/forms/filtersets.py:425 -#: netbox/dcim/forms/filtersets.py:739 netbox/dcim/forms/filtersets.py:983 -#: netbox/dcim/forms/filtersets.py:1013 netbox/dcim/forms/filtersets.py:1097 -#: netbox/dcim/forms/filtersets.py:1136 netbox/dcim/forms/filtersets.py:1576 -#: netbox/dcim/forms/filtersets.py:1600 netbox/dcim/forms/filtersets.py:1624 -#: netbox/dcim/forms/model_forms.py:112 netbox/dcim/forms/object_create.py:367 -#: netbox/dcim/tables/devices.py:143 netbox/dcim/tables/sites.py:85 -#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:208 -#: netbox/ipam/forms/bulk_edit.py:474 netbox/ipam/forms/filtersets.py:217 -#: netbox/ipam/forms/filtersets.py:422 netbox/ipam/forms/filtersets.py:475 -#: netbox/templates/dcim/device.html:18 netbox/templates/dcim/rack.html:16 +#: netbox/circuits/forms/filtersets.py:45 +#: netbox/circuits/forms/filtersets.py:168 +#: netbox/circuits/forms/filtersets.py:225 +#: netbox/circuits/tables/circuits.py:139 netbox/dcim/forms/bulk_edit.py:116 +#: netbox/dcim/forms/bulk_edit.py:317 netbox/dcim/forms/bulk_edit.py:875 +#: netbox/dcim/forms/bulk_import.py:95 netbox/dcim/forms/filtersets.py:74 +#: netbox/dcim/forms/filtersets.py:186 netbox/dcim/forms/filtersets.py:212 +#: netbox/dcim/forms/filtersets.py:335 netbox/dcim/forms/filtersets.py:426 +#: netbox/dcim/forms/filtersets.py:740 netbox/dcim/forms/filtersets.py:984 +#: netbox/dcim/forms/filtersets.py:1014 netbox/dcim/forms/filtersets.py:1098 +#: netbox/dcim/forms/filtersets.py:1137 netbox/dcim/forms/filtersets.py:1614 +#: netbox/dcim/forms/filtersets.py:1638 netbox/dcim/forms/filtersets.py:1662 +#: netbox/dcim/forms/model_forms.py:114 netbox/dcim/forms/object_create.py:367 +#: netbox/dcim/tables/devices.py:153 netbox/dcim/tables/sites.py:85 +#: netbox/extras/filtersets.py:503 netbox/ipam/forms/bulk_edit.py:458 +#: netbox/ipam/forms/filtersets.py:219 netbox/ipam/forms/filtersets.py:425 +#: netbox/ipam/forms/filtersets.py:516 netbox/templates/dcim/device.html:18 +#: netbox/templates/dcim/rack.html:16 #: netbox/templates/dcim/rackreservation.html:22 #: netbox/templates/dcim/region.html:26 netbox/templates/dcim/site.html:31 -#: netbox/templates/ipam/prefix.html:49 netbox/templates/ipam/vlan.html:16 -#: netbox/virtualization/forms/bulk_edit.py:81 +#: netbox/templates/ipam/vlan.html:16 #: netbox/virtualization/forms/filtersets.py:59 -#: netbox/virtualization/forms/filtersets.py:133 -#: netbox/virtualization/forms/model_forms.py:92 -#: netbox/vpn/forms/filtersets.py:257 +#: netbox/virtualization/forms/filtersets.py:138 +#: netbox/virtualization/forms/model_forms.py:91 +#: netbox/vpn/forms/filtersets.py:257 netbox/wireless/forms/filtersets.py:73 msgid "Region" msgstr "" -#: netbox/circuits/forms/filtersets.py:42 -#: netbox/circuits/forms/filtersets.py:162 netbox/dcim/forms/bulk_edit.py:322 -#: netbox/dcim/forms/bulk_edit.py:880 netbox/dcim/forms/filtersets.py:78 -#: netbox/dcim/forms/filtersets.py:190 netbox/dcim/forms/filtersets.py:216 -#: netbox/dcim/forms/filtersets.py:347 netbox/dcim/forms/filtersets.py:430 -#: netbox/dcim/forms/filtersets.py:744 netbox/dcim/forms/filtersets.py:988 -#: netbox/dcim/forms/filtersets.py:1102 netbox/dcim/forms/filtersets.py:1141 +#: netbox/circuits/forms/filtersets.py:50 +#: netbox/circuits/forms/filtersets.py:173 +#: netbox/circuits/forms/filtersets.py:230 netbox/dcim/forms/bulk_edit.py:325 +#: netbox/dcim/forms/bulk_edit.py:883 netbox/dcim/forms/filtersets.py:79 +#: netbox/dcim/forms/filtersets.py:191 netbox/dcim/forms/filtersets.py:217 +#: netbox/dcim/forms/filtersets.py:348 netbox/dcim/forms/filtersets.py:431 +#: netbox/dcim/forms/filtersets.py:745 netbox/dcim/forms/filtersets.py:989 +#: netbox/dcim/forms/filtersets.py:1103 netbox/dcim/forms/filtersets.py:1142 #: netbox/dcim/forms/object_create.py:375 netbox/extras/filtersets.py:520 -#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/bulk_edit.py:479 -#: netbox/ipam/forms/filtersets.py:222 netbox/ipam/forms/filtersets.py:427 -#: netbox/ipam/forms/filtersets.py:480 -#: netbox/virtualization/forms/bulk_edit.py:86 -#: netbox/virtualization/forms/filtersets.py:69 -#: netbox/virtualization/forms/filtersets.py:138 -#: netbox/virtualization/forms/model_forms.py:98 +#: netbox/ipam/forms/bulk_edit.py:463 netbox/ipam/forms/filtersets.py:224 +#: netbox/ipam/forms/filtersets.py:430 netbox/ipam/forms/filtersets.py:521 +#: netbox/virtualization/forms/filtersets.py:64 +#: netbox/virtualization/forms/filtersets.py:143 +#: netbox/virtualization/forms/model_forms.py:97 +#: netbox/wireless/forms/filtersets.py:78 msgid "Site group" msgstr "" -#: netbox/circuits/forms/filtersets.py:65 -#: netbox/circuits/forms/filtersets.py:83 -#: netbox/circuits/forms/filtersets.py:102 -#: netbox/circuits/forms/filtersets.py:117 netbox/core/forms/filtersets.py:67 -#: netbox/core/forms/filtersets.py:135 netbox/dcim/forms/bulk_edit.py:843 -#: netbox/dcim/forms/filtersets.py:172 netbox/dcim/forms/filtersets.py:204 -#: netbox/dcim/forms/filtersets.py:915 netbox/dcim/forms/filtersets.py:1007 -#: netbox/dcim/forms/filtersets.py:1131 netbox/dcim/forms/filtersets.py:1239 -#: netbox/dcim/forms/filtersets.py:1263 netbox/dcim/forms/filtersets.py:1288 -#: netbox/dcim/forms/filtersets.py:1307 netbox/dcim/forms/filtersets.py:1327 -#: netbox/dcim/forms/filtersets.py:1441 netbox/dcim/forms/filtersets.py:1465 -#: netbox/dcim/forms/filtersets.py:1489 netbox/dcim/forms/filtersets.py:1507 -#: netbox/dcim/forms/filtersets.py:1523 netbox/extras/forms/bulk_edit.py:90 -#: netbox/extras/forms/filtersets.py:44 netbox/extras/forms/filtersets.py:134 -#: netbox/extras/forms/filtersets.py:165 netbox/extras/forms/filtersets.py:205 -#: netbox/extras/forms/filtersets.py:221 netbox/extras/forms/filtersets.py:252 -#: netbox/extras/forms/filtersets.py:276 netbox/extras/forms/filtersets.py:441 -#: netbox/ipam/forms/filtersets.py:99 netbox/ipam/forms/filtersets.py:266 -#: netbox/ipam/forms/filtersets.py:307 netbox/ipam/forms/filtersets.py:382 -#: netbox/ipam/forms/filtersets.py:468 netbox/ipam/forms/filtersets.py:527 -#: netbox/ipam/forms/filtersets.py:545 netbox/netbox/tables/tables.py:256 -#: netbox/virtualization/forms/filtersets.py:45 -#: netbox/virtualization/forms/filtersets.py:103 -#: netbox/virtualization/forms/filtersets.py:198 -#: netbox/virtualization/forms/filtersets.py:243 -#: netbox/vpn/forms/filtersets.py:213 netbox/wireless/forms/bulk_edit.py:150 -#: netbox/wireless/forms/filtersets.py:34 -#: netbox/wireless/forms/filtersets.py:74 -msgid "Attributes" -msgstr "" - -#: netbox/circuits/forms/filtersets.py:73 netbox/circuits/tables/circuits.py:63 +#: netbox/circuits/forms/filtersets.py:81 netbox/circuits/tables/circuits.py:62 #: netbox/circuits/tables/providers.py:66 +#: netbox/circuits/tables/virtual_circuits.py:55 +#: netbox/circuits/tables/virtual_circuits.py:103 #: netbox/templates/circuits/circuit.html:22 #: netbox/templates/circuits/provideraccount.html:24 msgid "Account" msgstr "" -#: netbox/circuits/forms/filtersets.py:217 +#: netbox/circuits/forms/filtersets.py:248 msgid "Term Side" msgstr "" -#: netbox/circuits/forms/filtersets.py:250 netbox/dcim/forms/bulk_edit.py:1557 -#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:142 -#: netbox/ipam/forms/filtersets.py:546 netbox/ipam/forms/model_forms.py:327 +#: netbox/circuits/forms/filtersets.py:281 netbox/dcim/forms/bulk_edit.py:1570 +#: netbox/extras/forms/model_forms.py:582 netbox/ipam/forms/filtersets.py:144 +#: netbox/ipam/forms/filtersets.py:598 netbox/ipam/forms/model_forms.py:329 +#: netbox/templates/dcim/macaddress.html:25 #: netbox/templates/extras/configcontext.html:60 #: netbox/templates/ipam/ipaddress.html:59 -#: netbox/templates/ipam/vlan_edit.html:30 +#: netbox/templates/ipam/vlan_edit.html:38 #: netbox/tenancy/forms/filtersets.py:87 netbox/users/forms/model_forms.py:314 msgid "Assignment" msgstr "" -#: netbox/circuits/forms/filtersets.py:265 -#: netbox/circuits/forms/model_forms.py:195 -#: netbox/circuits/tables/circuits.py:155 netbox/dcim/forms/bulk_edit.py:118 -#: netbox/dcim/forms/bulk_import.py:100 netbox/dcim/forms/model_forms.py:117 +#: netbox/circuits/forms/filtersets.py:296 +#: netbox/circuits/forms/model_forms.py:252 +#: netbox/circuits/tables/circuits.py:191 netbox/dcim/forms/bulk_edit.py:121 +#: netbox/dcim/forms/bulk_import.py:102 netbox/dcim/forms/model_forms.py:120 #: netbox/dcim/tables/sites.py:89 netbox/extras/forms/filtersets.py:480 -#: netbox/ipam/filtersets.py:1001 netbox/ipam/forms/bulk_edit.py:493 -#: netbox/ipam/forms/bulk_import.py:460 netbox/ipam/forms/model_forms.py:561 -#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:122 -#: netbox/ipam/tables/vlans.py:226 +#: netbox/ipam/filtersets.py:968 netbox/ipam/forms/bulk_edit.py:477 +#: netbox/ipam/forms/bulk_import.py:459 netbox/ipam/forms/model_forms.py:563 +#: netbox/ipam/tables/fhrp.py:67 netbox/ipam/tables/vlans.py:91 +#: netbox/ipam/tables/vlans.py:202 #: netbox/templates/circuits/circuitgroupassignment.html:22 -#: netbox/templates/dcim/interface.html:284 netbox/templates/dcim/site.html:37 +#: netbox/templates/dcim/interface.html:341 netbox/templates/dcim/site.html:37 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:23 #: netbox/templates/ipam/vlan.html:27 netbox/templates/tenancy/contact.html:21 #: netbox/templates/tenancy/tenant.html:20 netbox/templates/users/group.html:6 @@ -1105,224 +1367,239 @@ msgstr "" #: netbox/users/filtersets.py:62 netbox/users/filtersets.py:185 #: netbox/users/forms/filtersets.py:31 netbox/users/forms/filtersets.py:37 #: netbox/users/forms/filtersets.py:79 -#: netbox/virtualization/forms/bulk_edit.py:65 -#: netbox/virtualization/forms/bulk_import.py:47 -#: netbox/virtualization/forms/filtersets.py:85 -#: netbox/virtualization/forms/model_forms.py:66 +#: netbox/virtualization/forms/bulk_edit.py:66 +#: netbox/virtualization/forms/bulk_import.py:48 +#: netbox/virtualization/forms/filtersets.py:90 +#: netbox/virtualization/forms/model_forms.py:69 #: netbox/virtualization/tables/clusters.py:70 #: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 #: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 -#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:48 -#: netbox/wireless/forms/bulk_import.py:36 -#: netbox/wireless/forms/filtersets.py:46 -#: netbox/wireless/forms/model_forms.py:40 +#: netbox/vpn/tables/tunnels.py:44 netbox/wireless/forms/bulk_edit.py:50 +#: netbox/wireless/forms/bulk_import.py:38 +#: netbox/wireless/forms/filtersets.py:49 +#: netbox/wireless/forms/model_forms.py:41 #: netbox/wireless/tables/wirelesslan.py:48 msgid "Group" msgstr "" -#: netbox/circuits/forms/model_forms.py:182 +#: netbox/circuits/forms/model_forms.py:239 #: netbox/templates/circuits/circuitgroup.html:25 msgid "Circuit Group" msgstr "" -#: netbox/circuits/models/circuits.py:27 netbox/dcim/models/cables.py:67 -#: netbox/dcim/models/device_component_templates.py:517 -#: netbox/dcim/models/device_component_templates.py:617 -#: netbox/dcim/models/device_components.py:975 -#: netbox/dcim/models/device_components.py:1049 -#: netbox/dcim/models/device_components.py:1204 -#: netbox/dcim/models/devices.py:479 netbox/dcim/models/racks.py:224 +#: netbox/circuits/forms/model_forms.py:259 +msgid "Circuit type" +msgstr "" + +#: netbox/circuits/forms/model_forms.py:270 +msgid "Group Assignment" +msgstr "" + +#: netbox/circuits/models/base.py:18 netbox/dcim/models/cables.py:67 +#: netbox/dcim/models/device_component_templates.py:531 +#: netbox/dcim/models/device_component_templates.py:631 +#: netbox/dcim/models/device_components.py:476 +#: netbox/dcim/models/device_components.py:1024 +#: netbox/dcim/models/device_components.py:1095 +#: netbox/dcim/models/device_components.py:1241 +#: netbox/dcim/models/devices.py:477 netbox/dcim/models/racks.py:221 #: netbox/extras/models/tags.py:28 msgid "color" msgstr "" -#: netbox/circuits/models/circuits.py:36 +#: netbox/circuits/models/circuits.py:34 msgid "circuit type" msgstr "" -#: netbox/circuits/models/circuits.py:37 +#: netbox/circuits/models/circuits.py:35 msgid "circuit types" msgstr "" -#: netbox/circuits/models/circuits.py:48 +#: netbox/circuits/models/circuits.py:46 +#: netbox/circuits/models/virtual_circuits.py:38 msgid "circuit ID" msgstr "" -#: netbox/circuits/models/circuits.py:49 +#: netbox/circuits/models/circuits.py:47 +#: netbox/circuits/models/virtual_circuits.py:39 msgid "Unique circuit ID" msgstr "" -#: netbox/circuits/models/circuits.py:69 netbox/core/models/data.py:52 +#: netbox/circuits/models/circuits.py:67 +#: netbox/circuits/models/virtual_circuits.py:59 netbox/core/models/data.py:52 #: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 -#: netbox/dcim/models/devices.py:653 netbox/dcim/models/devices.py:1173 -#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:96 -#: netbox/dcim/models/racks.py:297 netbox/dcim/models/sites.py:154 -#: netbox/dcim/models/sites.py:266 netbox/ipam/models/ip.py:253 -#: netbox/ipam/models/ip.py:522 netbox/ipam/models/ip.py:730 -#: netbox/ipam/models/vlans.py:211 netbox/virtualization/models/clusters.py:74 -#: netbox/virtualization/models/virtualmachines.py:84 -#: netbox/vpn/models/tunnels.py:40 netbox/wireless/models.py:95 -#: netbox/wireless/models.py:159 +#: netbox/dcim/models/device_components.py:1281 +#: netbox/dcim/models/devices.py:644 netbox/dcim/models/devices.py:1176 +#: netbox/dcim/models/devices.py:1403 netbox/dcim/models/power.py:94 +#: netbox/dcim/models/racks.py:288 netbox/dcim/models/sites.py:154 +#: netbox/dcim/models/sites.py:270 netbox/ipam/models/ip.py:237 +#: netbox/ipam/models/ip.py:508 netbox/ipam/models/ip.py:729 +#: netbox/ipam/models/vlans.py:210 netbox/virtualization/models/clusters.py:70 +#: netbox/virtualization/models/virtualmachines.py:79 +#: netbox/vpn/models/tunnels.py:38 netbox/wireless/models.py:95 +#: netbox/wireless/models.py:156 msgid "status" msgstr "" -#: netbox/circuits/models/circuits.py:84 netbox/templates/core/plugin.html:20 +#: netbox/circuits/models/circuits.py:82 netbox/templates/core/plugin.html:20 msgid "installed" msgstr "" -#: netbox/circuits/models/circuits.py:89 +#: netbox/circuits/models/circuits.py:87 msgid "terminates" msgstr "" -#: netbox/circuits/models/circuits.py:94 +#: netbox/circuits/models/circuits.py:92 msgid "commit rate (Kbps)" msgstr "" -#: netbox/circuits/models/circuits.py:95 +#: netbox/circuits/models/circuits.py:93 msgid "Committed rate" msgstr "" -#: netbox/circuits/models/circuits.py:137 +#: netbox/circuits/models/circuits.py:142 msgid "circuit" msgstr "" -#: netbox/circuits/models/circuits.py:138 +#: netbox/circuits/models/circuits.py:143 msgid "circuits" msgstr "" -#: netbox/circuits/models/circuits.py:170 +#: netbox/circuits/models/circuits.py:172 msgid "circuit group" msgstr "" -#: netbox/circuits/models/circuits.py:171 +#: netbox/circuits/models/circuits.py:173 msgid "circuit groups" msgstr "" -#: netbox/circuits/models/circuits.py:195 netbox/ipam/models/fhrp.py:93 -#: netbox/tenancy/models/contacts.py:134 +#: netbox/circuits/models/circuits.py:190 +msgid "member ID" +msgstr "" + +#: netbox/circuits/models/circuits.py:202 netbox/ipam/models/fhrp.py:90 +#: netbox/tenancy/models/contacts.py:126 msgid "priority" msgstr "" -#: netbox/circuits/models/circuits.py:213 +#: netbox/circuits/models/circuits.py:220 msgid "Circuit group assignment" msgstr "" -#: netbox/circuits/models/circuits.py:214 +#: netbox/circuits/models/circuits.py:221 msgid "Circuit group assignments" msgstr "" -#: netbox/circuits/models/circuits.py:240 -msgid "termination" -msgstr "" - -#: netbox/circuits/models/circuits.py:257 -msgid "port speed (Kbps)" -msgstr "" - -#: netbox/circuits/models/circuits.py:260 -msgid "Physical circuit speed" -msgstr "" - -#: netbox/circuits/models/circuits.py:265 -msgid "upstream speed (Kbps)" +#: netbox/circuits/models/circuits.py:247 +msgid "termination side" msgstr "" #: netbox/circuits/models/circuits.py:266 +msgid "port speed (Kbps)" +msgstr "" + +#: netbox/circuits/models/circuits.py:269 +msgid "Physical circuit speed" +msgstr "" + +#: netbox/circuits/models/circuits.py:274 +msgid "upstream speed (Kbps)" +msgstr "" + +#: netbox/circuits/models/circuits.py:275 msgid "Upstream speed, if different from port speed" msgstr "" -#: netbox/circuits/models/circuits.py:271 +#: netbox/circuits/models/circuits.py:280 msgid "cross-connect ID" msgstr "" -#: netbox/circuits/models/circuits.py:272 +#: netbox/circuits/models/circuits.py:281 msgid "ID of the local cross-connect" msgstr "" -#: netbox/circuits/models/circuits.py:277 +#: netbox/circuits/models/circuits.py:286 msgid "patch panel/port(s)" msgstr "" -#: netbox/circuits/models/circuits.py:278 +#: netbox/circuits/models/circuits.py:287 msgid "Patch panel ID and port number(s)" msgstr "" -#: netbox/circuits/models/circuits.py:281 -#: netbox/dcim/models/device_component_templates.py:61 -#: netbox/dcim/models/device_components.py:68 netbox/dcim/models/racks.py:685 +#: netbox/circuits/models/circuits.py:290 +#: netbox/circuits/models/virtual_circuits.py:144 +#: netbox/dcim/models/device_component_templates.py:57 +#: netbox/dcim/models/device_components.py:63 netbox/dcim/models/racks.py:676 #: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 #: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 #: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 #: netbox/extras/models/models.py:511 netbox/extras/models/notifications.py:131 -#: netbox/extras/models/staging.py:31 netbox/extras/models/tags.py:32 -#: netbox/netbox/models/__init__.py:110 netbox/netbox/models/__init__.py:145 -#: netbox/netbox/models/__init__.py:191 netbox/users/models/permissions.py:24 -#: netbox/users/models/tokens.py:57 netbox/users/models/users.py:33 -#: netbox/virtualization/models/virtualmachines.py:289 +#: netbox/extras/models/staging.py:32 netbox/extras/models/tags.py:32 +#: netbox/ipam/models/vlans.py:358 netbox/netbox/models/__init__.py:114 +#: netbox/netbox/models/__init__.py:149 netbox/netbox/models/__init__.py:195 +#: netbox/users/models/permissions.py:24 netbox/users/models/tokens.py:57 +#: netbox/users/models/users.py:33 +#: netbox/virtualization/models/virtualmachines.py:276 msgid "description" msgstr "" -#: netbox/circuits/models/circuits.py:294 +#: netbox/circuits/models/circuits.py:340 msgid "circuit termination" msgstr "" -#: netbox/circuits/models/circuits.py:295 +#: netbox/circuits/models/circuits.py:341 msgid "circuit terminations" msgstr "" -#: netbox/circuits/models/circuits.py:308 -msgid "" -"A circuit termination must attach to either a site or a provider network." +#: netbox/circuits/models/circuits.py:354 +msgid "A circuit termination must attach to termination." msgstr "" -#: netbox/circuits/models/circuits.py:310 -msgid "" -"A circuit termination cannot attach to both a site and a provider network." -msgstr "" - -#: netbox/circuits/models/providers.py:22 -#: netbox/circuits/models/providers.py:66 -#: netbox/circuits/models/providers.py:104 netbox/core/models/data.py:39 +#: netbox/circuits/models/providers.py:21 +#: netbox/circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:98 netbox/core/models/data.py:39 #: netbox/core/models/jobs.py:46 #: netbox/dcim/models/device_component_templates.py:43 -#: netbox/dcim/models/device_components.py:53 netbox/dcim/models/devices.py:593 -#: netbox/dcim/models/devices.py:1335 netbox/dcim/models/devices.py:1400 -#: netbox/dcim/models/power.py:39 netbox/dcim/models/power.py:92 -#: netbox/dcim/models/racks.py:262 netbox/dcim/models/sites.py:138 +#: netbox/dcim/models/device_components.py:52 netbox/dcim/models/devices.py:588 +#: netbox/dcim/models/devices.py:1335 netbox/dcim/models/devices.py:1398 +#: netbox/dcim/models/power.py:38 netbox/dcim/models/power.py:89 +#: netbox/dcim/models/racks.py:257 netbox/dcim/models/sites.py:142 #: netbox/extras/models/configs.py:36 netbox/extras/models/configs.py:215 #: netbox/extras/models/customfields.py:92 netbox/extras/models/models.py:56 #: netbox/extras/models/models.py:153 netbox/extras/models/models.py:296 #: netbox/extras/models/models.py:392 netbox/extras/models/models.py:501 #: netbox/extras/models/models.py:596 netbox/extras/models/notifications.py:126 -#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:26 -#: netbox/ipam/models/asns.py:18 netbox/ipam/models/fhrp.py:25 -#: netbox/ipam/models/services.py:52 netbox/ipam/models/services.py:88 -#: netbox/ipam/models/vlans.py:36 netbox/ipam/models/vlans.py:200 -#: netbox/ipam/models/vrfs.py:22 netbox/ipam/models/vrfs.py:79 -#: netbox/netbox/models/__init__.py:137 netbox/netbox/models/__init__.py:181 -#: netbox/tenancy/models/contacts.py:64 netbox/tenancy/models/tenants.py:20 -#: netbox/tenancy/models/tenants.py:45 netbox/users/models/permissions.py:20 -#: netbox/users/models/users.py:28 netbox/virtualization/models/clusters.py:57 -#: netbox/virtualization/models/virtualmachines.py:72 -#: netbox/virtualization/models/virtualmachines.py:279 -#: netbox/vpn/models/crypto.py:24 netbox/vpn/models/crypto.py:71 -#: netbox/vpn/models/crypto.py:131 netbox/vpn/models/crypto.py:183 -#: netbox/vpn/models/crypto.py:221 netbox/vpn/models/l2vpn.py:22 -#: netbox/vpn/models/tunnels.py:35 netbox/wireless/models.py:51 +#: netbox/extras/models/scripts.py:30 netbox/extras/models/staging.py:27 +#: netbox/ipam/models/asns.py:17 netbox/ipam/models/fhrp.py:24 +#: netbox/ipam/models/services.py:51 netbox/ipam/models/services.py:84 +#: netbox/ipam/models/vlans.py:37 netbox/ipam/models/vlans.py:199 +#: netbox/ipam/models/vlans.py:337 netbox/ipam/models/vrfs.py:20 +#: netbox/ipam/models/vrfs.py:75 netbox/netbox/models/__init__.py:141 +#: netbox/netbox/models/__init__.py:185 netbox/tenancy/models/contacts.py:58 +#: netbox/tenancy/models/tenants.py:19 netbox/tenancy/models/tenants.py:42 +#: netbox/users/models/permissions.py:20 netbox/users/models/users.py:28 +#: netbox/virtualization/models/clusters.py:52 +#: netbox/virtualization/models/virtualmachines.py:71 +#: netbox/virtualization/models/virtualmachines.py:271 +#: netbox/virtualization/models/virtualmachines.py:305 +#: netbox/vpn/models/crypto.py:23 netbox/vpn/models/crypto.py:69 +#: netbox/vpn/models/crypto.py:128 netbox/vpn/models/crypto.py:180 +#: netbox/vpn/models/crypto.py:216 netbox/vpn/models/l2vpn.py:21 +#: netbox/vpn/models/tunnels.py:32 netbox/wireless/models.py:53 msgid "name" msgstr "" -#: netbox/circuits/models/providers.py:25 +#: netbox/circuits/models/providers.py:24 msgid "Full name of the provider" msgstr "" -#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:86 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:87 #: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 #: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 -#: netbox/ipam/models/vlans.py:40 netbox/netbox/models/__init__.py:141 -#: netbox/netbox/models/__init__.py:186 netbox/tenancy/models/tenants.py:25 -#: netbox/tenancy/models/tenants.py:49 netbox/vpn/models/l2vpn.py:27 -#: netbox/wireless/models.py:56 +#: netbox/ipam/models/vlans.py:42 netbox/netbox/models/__init__.py:145 +#: netbox/netbox/models/__init__.py:190 netbox/tenancy/models/tenants.py:25 +#: netbox/tenancy/models/tenants.py:47 netbox/vpn/models/l2vpn.py:27 +#: netbox/wireless/models.py:59 msgid "slug" msgstr "" @@ -1334,46 +1611,77 @@ msgstr "" msgid "providers" msgstr "" -#: netbox/circuits/models/providers.py:63 +#: netbox/circuits/models/providers.py:60 msgid "account ID" msgstr "" -#: netbox/circuits/models/providers.py:86 +#: netbox/circuits/models/providers.py:83 msgid "provider account" msgstr "" -#: netbox/circuits/models/providers.py:87 +#: netbox/circuits/models/providers.py:84 msgid "provider accounts" msgstr "" -#: netbox/circuits/models/providers.py:115 +#: netbox/circuits/models/providers.py:110 msgid "service ID" msgstr "" -#: netbox/circuits/models/providers.py:126 +#: netbox/circuits/models/providers.py:121 msgid "provider network" msgstr "" -#: netbox/circuits/models/providers.py:127 +#: netbox/circuits/models/providers.py:122 msgid "provider networks" msgstr "" -#: netbox/circuits/tables/circuits.py:32 netbox/circuits/tables/circuits.py:132 +#: netbox/circuits/models/virtual_circuits.py:28 +msgid "virtual circuit type" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:29 +msgid "virtual circuit types" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:99 +msgid "virtual circuit" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:100 +msgid "virtual circuits" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:133 netbox/ipam/models/ip.py:194 +#: netbox/ipam/models/ip.py:736 netbox/vpn/models/tunnels.py:109 +msgid "role" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:151 +msgid "virtual circuit termination" +msgstr "" + +#: netbox/circuits/models/virtual_circuits.py:152 +msgid "virtual circuit terminations" +msgstr "" + +#: netbox/circuits/tables/circuits.py:30 netbox/circuits/tables/circuits.py:168 #: netbox/circuits/tables/providers.py:18 #: netbox/circuits/tables/providers.py:69 -#: netbox/circuits/tables/providers.py:99 netbox/core/tables/data.py:16 +#: netbox/circuits/tables/providers.py:99 +#: netbox/circuits/tables/virtual_circuits.py:18 netbox/core/tables/data.py:16 #: netbox/core/tables/jobs.py:14 netbox/core/tables/plugins.py:44 #: netbox/core/tables/tasks.py:11 netbox/core/tables/tasks.py:115 -#: netbox/dcim/forms/filtersets.py:63 netbox/dcim/forms/object_create.py:43 -#: netbox/dcim/tables/devices.py:52 netbox/dcim/tables/devices.py:92 -#: netbox/dcim/tables/devices.py:134 netbox/dcim/tables/devices.py:289 -#: netbox/dcim/tables/devices.py:392 netbox/dcim/tables/devices.py:433 -#: netbox/dcim/tables/devices.py:482 netbox/dcim/tables/devices.py:531 -#: netbox/dcim/tables/devices.py:648 netbox/dcim/tables/devices.py:731 -#: netbox/dcim/tables/devices.py:778 netbox/dcim/tables/devices.py:841 -#: netbox/dcim/tables/devices.py:911 netbox/dcim/tables/devices.py:974 -#: netbox/dcim/tables/devices.py:994 netbox/dcim/tables/devices.py:1023 -#: netbox/dcim/tables/devices.py:1053 netbox/dcim/tables/devicetypes.py:31 +#: netbox/dcim/forms/filtersets.py:64 netbox/dcim/forms/object_create.py:43 +#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:103 +#: netbox/dcim/tables/devices.py:145 netbox/dcim/tables/devices.py:299 +#: netbox/dcim/tables/devices.py:402 netbox/dcim/tables/devices.py:443 +#: netbox/dcim/tables/devices.py:491 netbox/dcim/tables/devices.py:540 +#: netbox/dcim/tables/devices.py:561 netbox/dcim/tables/devices.py:681 +#: netbox/dcim/tables/devices.py:764 netbox/dcim/tables/devices.py:810 +#: netbox/dcim/tables/devices.py:872 netbox/dcim/tables/devices.py:941 +#: netbox/dcim/tables/devices.py:1006 netbox/dcim/tables/devices.py:1025 +#: netbox/dcim/tables/devices.py:1054 netbox/dcim/tables/devices.py:1084 +#: netbox/dcim/tables/devicetypes.py:31 netbox/dcim/tables/devicetypes.py:222 #: netbox/dcim/tables/power.py:22 netbox/dcim/tables/power.py:62 #: netbox/dcim/tables/racks.py:24 netbox/dcim/tables/racks.py:113 #: netbox/dcim/tables/sites.py:24 netbox/dcim/tables/sites.py:51 @@ -1384,15 +1692,17 @@ msgstr "" #: netbox/extras/tables/tables.py:361 netbox/extras/tables/tables.py:378 #: netbox/extras/tables/tables.py:401 netbox/extras/tables/tables.py:439 #: netbox/extras/tables/tables.py:491 netbox/extras/tables/tables.py:514 -#: netbox/ipam/forms/bulk_edit.py:407 netbox/ipam/forms/filtersets.py:386 -#: netbox/ipam/tables/asn.py:16 netbox/ipam/tables/ip.py:85 -#: netbox/ipam/tables/ip.py:160 netbox/ipam/tables/services.py:15 -#: netbox/ipam/tables/services.py:40 netbox/ipam/tables/vlans.py:64 -#: netbox/ipam/tables/vlans.py:114 netbox/ipam/tables/vrfs.py:26 +#: netbox/ipam/forms/bulk_edit.py:391 netbox/ipam/forms/filtersets.py:389 +#: netbox/ipam/forms/filtersets.py:474 netbox/ipam/tables/asn.py:16 +#: netbox/ipam/tables/ip.py:31 netbox/ipam/tables/ip.py:106 +#: netbox/ipam/tables/services.py:15 netbox/ipam/tables/services.py:40 +#: netbox/ipam/tables/vlans.py:33 netbox/ipam/tables/vlans.py:83 +#: netbox/ipam/tables/vlans.py:231 netbox/ipam/tables/vrfs.py:26 #: netbox/ipam/tables/vrfs.py:68 netbox/templates/circuits/circuitgroup.html:28 #: netbox/templates/circuits/circuittype.html:22 #: netbox/templates/circuits/provideraccount.html:28 #: netbox/templates/circuits/providernetwork.html:24 +#: netbox/templates/circuits/virtualcircuittype.html:22 #: netbox/templates/core/datasource.html:34 netbox/templates/core/job.html:44 #: netbox/templates/core/plugin.html:54 netbox/templates/core/rq_worker.html:43 #: netbox/templates/dcim/consoleport.html:28 @@ -1403,7 +1713,7 @@ msgstr "" #: netbox/templates/dcim/inc/interface_vlans_table.html:5 #: netbox/templates/dcim/inc/panels/inventory_items.html:18 #: netbox/templates/dcim/interface.html:38 -#: netbox/templates/dcim/interface.html:165 +#: netbox/templates/dcim/interface.html:222 #: netbox/templates/dcim/inventoryitem.html:28 #: netbox/templates/dcim/inventoryitemrole.html:18 #: netbox/templates/dcim/location.html:29 @@ -1432,6 +1742,7 @@ msgstr "" #: netbox/templates/ipam/service.html:24 #: netbox/templates/ipam/servicetemplate.html:15 #: netbox/templates/ipam/vlan.html:35 netbox/templates/ipam/vlangroup.html:30 +#: netbox/templates/ipam/vlantranslationpolicy.html:14 #: netbox/templates/tenancy/contact.html:25 #: netbox/templates/tenancy/contactgroup.html:21 #: netbox/templates/tenancy/contactrole.html:18 @@ -1463,81 +1774,113 @@ msgstr "" #: netbox/virtualization/tables/clusters.py:17 #: netbox/virtualization/tables/clusters.py:39 #: netbox/virtualization/tables/clusters.py:62 -#: netbox/virtualization/tables/virtualmachines.py:55 -#: netbox/virtualization/tables/virtualmachines.py:139 -#: netbox/virtualization/tables/virtualmachines.py:194 +#: netbox/virtualization/tables/virtualmachines.py:26 +#: netbox/virtualization/tables/virtualmachines.py:109 +#: netbox/virtualization/tables/virtualmachines.py:165 #: netbox/vpn/tables/crypto.py:18 netbox/vpn/tables/crypto.py:57 #: netbox/vpn/tables/crypto.py:93 netbox/vpn/tables/crypto.py:129 #: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 #: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 #: netbox/wireless/tables/wirelesslan.py:18 -#: netbox/wireless/tables/wirelesslan.py:79 +#: netbox/wireless/tables/wirelesslan.py:87 msgid "Name" msgstr "" -#: netbox/circuits/tables/circuits.py:41 netbox/circuits/tables/circuits.py:138 +#: netbox/circuits/tables/circuits.py:39 netbox/circuits/tables/circuits.py:174 #: netbox/circuits/tables/providers.py:45 -#: netbox/circuits/tables/providers.py:79 netbox/netbox/navigation/menu.py:266 -#: netbox/netbox/navigation/menu.py:270 netbox/netbox/navigation/menu.py:272 +#: netbox/circuits/tables/providers.py:79 +#: netbox/circuits/tables/virtual_circuits.py:27 +#: netbox/netbox/navigation/menu.py:274 netbox/netbox/navigation/menu.py:278 +#: netbox/netbox/navigation/menu.py:280 #: netbox/templates/circuits/provider.html:57 #: netbox/templates/circuits/provideraccount.html:44 #: netbox/templates/circuits/providernetwork.html:50 msgid "Circuits" msgstr "" -#: netbox/circuits/tables/circuits.py:55 +#: netbox/circuits/tables/circuits.py:54 +#: netbox/circuits/tables/virtual_circuits.py:42 #: netbox/templates/circuits/circuit.html:26 +#: netbox/templates/circuits/virtualcircuit.html:35 +#: netbox/templates/dcim/interface.html:174 msgid "Circuit ID" msgstr "" -#: netbox/circuits/tables/circuits.py:69 -#: netbox/wireless/forms/model_forms.py:160 +#: netbox/circuits/tables/circuits.py:72 +#: netbox/wireless/forms/model_forms.py:163 msgid "Side A" msgstr "" -#: netbox/circuits/tables/circuits.py:74 +#: netbox/circuits/tables/circuits.py:77 msgid "Side Z" msgstr "" -#: netbox/circuits/tables/circuits.py:77 -#: netbox/templates/circuits/circuit.html:55 +#: netbox/circuits/tables/circuits.py:80 +#: netbox/templates/circuits/circuit.html:65 msgid "Commit Rate" msgstr "" -#: netbox/circuits/tables/circuits.py:80 netbox/circuits/tables/providers.py:48 +#: netbox/circuits/tables/circuits.py:84 netbox/circuits/tables/providers.py:48 #: netbox/circuits/tables/providers.py:82 -#: netbox/circuits/tables/providers.py:107 netbox/dcim/tables/devices.py:1036 -#: netbox/dcim/tables/devicetypes.py:92 netbox/dcim/tables/modules.py:29 -#: netbox/dcim/tables/modules.py:73 netbox/dcim/tables/power.py:39 -#: netbox/dcim/tables/power.py:96 netbox/dcim/tables/racks.py:84 -#: netbox/dcim/tables/racks.py:145 netbox/dcim/tables/racks.py:225 -#: netbox/dcim/tables/sites.py:108 netbox/extras/tables/tables.py:582 -#: netbox/ipam/tables/asn.py:69 netbox/ipam/tables/fhrp.py:34 -#: netbox/ipam/tables/ip.py:136 netbox/ipam/tables/ip.py:275 -#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/ip.py:397 -#: netbox/ipam/tables/services.py:24 netbox/ipam/tables/services.py:54 -#: netbox/ipam/tables/vlans.py:145 netbox/ipam/tables/vrfs.py:47 -#: netbox/ipam/tables/vrfs.py:72 netbox/templates/dcim/htmx/cable_edit.html:89 +#: netbox/circuits/tables/providers.py:107 +#: netbox/circuits/tables/virtual_circuits.py:68 +#: netbox/dcim/tables/devices.py:1067 netbox/dcim/tables/devicetypes.py:92 +#: netbox/dcim/tables/modules.py:29 netbox/dcim/tables/modules.py:73 +#: netbox/dcim/tables/power.py:39 netbox/dcim/tables/power.py:96 +#: netbox/dcim/tables/racks.py:84 netbox/dcim/tables/racks.py:144 +#: netbox/dcim/tables/racks.py:224 netbox/dcim/tables/sites.py:108 +#: netbox/extras/tables/tables.py:582 netbox/ipam/tables/asn.py:69 +#: netbox/ipam/tables/fhrp.py:34 netbox/ipam/tables/ip.py:82 +#: netbox/ipam/tables/ip.py:224 netbox/ipam/tables/ip.py:279 +#: netbox/ipam/tables/ip.py:347 netbox/ipam/tables/services.py:24 +#: netbox/ipam/tables/services.py:54 netbox/ipam/tables/vlans.py:121 +#: netbox/ipam/tables/vrfs.py:47 netbox/ipam/tables/vrfs.py:72 +#: netbox/templates/dcim/htmx/cable_edit.html:89 #: netbox/templates/generic/bulk_edit.html:86 #: netbox/templates/inc/panels/comments.html:5 #: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 #: netbox/utilities/forms/fields/fields.py:29 -#: netbox/virtualization/tables/clusters.py:91 -#: netbox/virtualization/tables/virtualmachines.py:82 +#: netbox/virtualization/tables/clusters.py:94 +#: netbox/virtualization/tables/virtualmachines.py:52 #: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 #: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 #: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 #: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 -#: netbox/wireless/tables/wirelesslan.py:58 +#: netbox/wireless/tables/wirelesslan.py:65 msgid "Comments" msgstr "" -#: netbox/circuits/tables/circuits.py:86 +#: netbox/circuits/tables/circuits.py:90 #: netbox/templates/tenancy/contact.html:84 #: netbox/tenancy/tables/contacts.py:73 msgid "Assignments" msgstr "" +#: netbox/circuits/tables/circuits.py:117 netbox/dcim/forms/connections.py:81 +msgid "Side" +msgstr "" + +#: netbox/circuits/tables/circuits.py:120 +msgid "Termination Type" +msgstr "" + +#: netbox/circuits/tables/circuits.py:123 +msgid "Termination Point" +msgstr "" + +#: netbox/circuits/tables/circuits.py:134 netbox/dcim/tables/devices.py:160 +#: netbox/templates/dcim/sitegroup.html:26 +msgid "Site Group" +msgstr "" + +#: netbox/circuits/tables/circuits.py:149 +#: netbox/templates/circuits/providernetwork.html:17 +#: netbox/templates/circuits/virtualcircuit.html:27 +#: netbox/templates/circuits/virtualcircuittermination.html:30 +#: netbox/templates/dcim/interface.html:170 +msgid "Provider Network" +msgstr "" + #: netbox/circuits/tables/providers.py:23 msgid "Accounts" msgstr "" @@ -1550,17 +1893,95 @@ msgstr "" msgid "ASN Count" msgstr "" -#: netbox/circuits/views.py:331 +#: netbox/circuits/tables/virtual_circuits.py:65 +#: netbox/netbox/navigation/menu.py:234 +#: netbox/templates/circuits/virtualcircuit.html:87 +#: netbox/templates/vpn/l2vpn.html:56 netbox/templates/vpn/tunnel.html:72 +#: netbox/vpn/tables/tunnels.py:58 +msgid "Terminations" +msgstr "" + +#: netbox/circuits/tables/virtual_circuits.py:109 +#: netbox/dcim/forms/bulk_edit.py:745 netbox/dcim/forms/bulk_edit.py:1299 +#: netbox/dcim/forms/bulk_edit.py:1706 netbox/dcim/forms/bulk_edit.py:1758 +#: netbox/dcim/forms/bulk_import.py:668 netbox/dcim/forms/bulk_import.py:730 +#: netbox/dcim/forms/bulk_import.py:756 netbox/dcim/forms/bulk_import.py:782 +#: netbox/dcim/forms/bulk_import.py:802 netbox/dcim/forms/bulk_import.py:858 +#: netbox/dcim/forms/bulk_import.py:976 netbox/dcim/forms/bulk_import.py:1024 +#: netbox/dcim/forms/bulk_import.py:1041 netbox/dcim/forms/bulk_import.py:1053 +#: netbox/dcim/forms/bulk_import.py:1101 netbox/dcim/forms/bulk_import.py:1205 +#: netbox/dcim/forms/bulk_import.py:1541 netbox/dcim/forms/connections.py:24 +#: netbox/dcim/forms/filtersets.py:132 netbox/dcim/forms/filtersets.py:922 +#: netbox/dcim/forms/filtersets.py:1052 netbox/dcim/forms/filtersets.py:1243 +#: netbox/dcim/forms/filtersets.py:1268 netbox/dcim/forms/filtersets.py:1292 +#: netbox/dcim/forms/filtersets.py:1312 netbox/dcim/forms/filtersets.py:1339 +#: netbox/dcim/forms/filtersets.py:1449 netbox/dcim/forms/filtersets.py:1474 +#: netbox/dcim/forms/filtersets.py:1498 netbox/dcim/forms/filtersets.py:1516 +#: netbox/dcim/forms/filtersets.py:1533 netbox/dcim/forms/filtersets.py:1630 +#: netbox/dcim/forms/filtersets.py:1654 netbox/dcim/forms/filtersets.py:1678 +#: netbox/dcim/forms/model_forms.py:644 netbox/dcim/forms/model_forms.py:861 +#: netbox/dcim/forms/model_forms.py:1231 netbox/dcim/forms/model_forms.py:1716 +#: netbox/dcim/forms/model_forms.py:1787 netbox/dcim/forms/object_create.py:249 +#: netbox/dcim/tables/connections.py:22 netbox/dcim/tables/connections.py:41 +#: netbox/dcim/tables/connections.py:60 netbox/dcim/tables/devices.py:295 +#: netbox/dcim/tables/devices.py:380 netbox/dcim/tables/devices.py:421 +#: netbox/dcim/tables/devices.py:463 netbox/dcim/tables/devices.py:513 +#: netbox/dcim/tables/devices.py:618 netbox/dcim/tables/devices.py:730 +#: netbox/dcim/tables/devices.py:786 netbox/dcim/tables/devices.py:832 +#: netbox/dcim/tables/devices.py:891 netbox/dcim/tables/devices.py:959 +#: netbox/dcim/tables/devices.py:1088 netbox/dcim/tables/modules.py:53 +#: netbox/extras/forms/filtersets.py:321 netbox/ipam/forms/bulk_import.py:303 +#: netbox/ipam/forms/bulk_import.py:540 netbox/ipam/forms/filtersets.py:603 +#: netbox/ipam/forms/model_forms.py:325 netbox/ipam/forms/model_forms.py:754 +#: netbox/ipam/forms/model_forms.py:787 netbox/ipam/forms/model_forms.py:813 +#: netbox/ipam/tables/vlans.py:156 +#: netbox/templates/circuits/virtualcircuittermination.html:56 +#: netbox/templates/dcim/consoleport.html:20 +#: netbox/templates/dcim/consoleserverport.html:20 +#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 +#: netbox/templates/dcim/device_edit.html:10 +#: netbox/templates/dcim/devicebay.html:20 +#: netbox/templates/dcim/devicebay.html:48 +#: netbox/templates/dcim/frontport.html:20 +#: netbox/templates/dcim/interface.html:30 +#: netbox/templates/dcim/interface.html:218 +#: netbox/templates/dcim/inventoryitem.html:20 +#: netbox/templates/dcim/module.html:57 netbox/templates/dcim/modulebay.html:20 +#: netbox/templates/dcim/poweroutlet.html:20 +#: netbox/templates/dcim/powerport.html:20 +#: netbox/templates/dcim/rearport.html:20 +#: netbox/templates/dcim/virtualchassis.html:65 +#: netbox/templates/dcim/virtualchassis_edit.html:51 +#: netbox/templates/dcim/virtualdevicecontext.html:22 +#: netbox/templates/virtualization/virtualmachine.html:114 +#: netbox/templates/vpn/tunneltermination.html:23 +#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 +#: netbox/virtualization/filtersets.py:133 +#: netbox/virtualization/forms/bulk_edit.py:119 +#: netbox/virtualization/forms/bulk_import.py:105 +#: netbox/virtualization/forms/filtersets.py:133 +#: netbox/virtualization/forms/model_forms.py:184 +#: netbox/virtualization/tables/virtualmachines.py:41 netbox/vpn/choices.py:52 +#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 +#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:91 +#: netbox/vpn/forms/model_forms.py:126 netbox/vpn/forms/model_forms.py:237 +#: netbox/vpn/forms/model_forms.py:456 netbox/wireless/forms/model_forms.py:102 +#: netbox/wireless/forms/model_forms.py:144 +#: netbox/wireless/tables/wirelesslan.py:83 +msgid "Device" +msgstr "" + +#: netbox/circuits/views.py:353 #, python-brace-format msgid "No terminations have been defined for circuit {circuit}." msgstr "" -#: netbox/circuits/views.py:380 +#: netbox/circuits/views.py:402 #, python-brace-format msgid "Swapped terminations for circuit {circuit}." msgstr "" -#: netbox/core/api/views.py:39 +#: netbox/core/api/views.py:51 msgid "This user does not have permission to synchronize this data source." msgstr "" @@ -1585,12 +2006,13 @@ msgstr "" #: netbox/core/choices.py:22 netbox/core/choices.py:59 #: netbox/core/constants.py:20 netbox/core/tables/tasks.py:34 #: netbox/dcim/choices.py:187 netbox/dcim/choices.py:239 -#: netbox/dcim/choices.py:1609 netbox/virtualization/choices.py:47 +#: netbox/dcim/choices.py:1593 netbox/dcim/choices.py:1666 +#: netbox/virtualization/choices.py:47 msgid "Failed" msgstr "" -#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:335 -#: netbox/netbox/navigation/menu.py:339 +#: netbox/core/choices.py:35 netbox/netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:360 #: netbox/templates/extras/script/base.html:14 #: netbox/templates/extras/script_list.html:7 #: netbox/templates/extras/script_list.html:12 @@ -1620,12 +2042,28 @@ msgstr "" msgid "Errored" msgstr "" -#: netbox/core/choices.py:87 netbox/core/tables/plugins.py:63 +#: netbox/core/choices.py:82 +msgid "Minutely" +msgstr "" + +#: netbox/core/choices.py:83 netbox/extras/choices.py:186 +msgid "Hourly" +msgstr "" + +#: netbox/core/choices.py:84 netbox/extras/choices.py:188 +msgid "Daily" +msgstr "" + +#: netbox/core/choices.py:85 netbox/extras/choices.py:189 +msgid "Weekly" +msgstr "" + +#: netbox/core/choices.py:101 netbox/core/tables/plugins.py:63 #: netbox/templates/generic/object.html:61 msgid "Updated" msgstr "" -#: netbox/core/choices.py:88 +#: netbox/core/choices.py:102 msgid "Deleted" msgstr "" @@ -1653,7 +2091,7 @@ msgstr "" #: netbox/core/data_backends.py:32 netbox/core/tables/plugins.py:51 #: netbox/templates/core/plugin.html:88 -#: netbox/templates/dcim/interface.html:216 +#: netbox/templates/dcim/interface.html:273 msgid "Local" msgstr "" @@ -1727,7 +2165,7 @@ msgstr "" msgid "Data source (name)" msgstr "" -#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:501 +#: netbox/core/filtersets.py:145 netbox/dcim/filtersets.py:502 #: netbox/extras/filtersets.py:287 netbox/extras/filtersets.py:331 #: netbox/extras/filtersets.py:353 netbox/extras/filtersets.py:413 #: netbox/users/filtersets.py:28 @@ -1739,9 +2177,9 @@ msgid "User name" msgstr "" #: netbox/core/forms/bulk_edit.py:25 netbox/core/forms/filtersets.py:43 -#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1137 -#: netbox/dcim/forms/bulk_edit.py:1415 netbox/dcim/forms/filtersets.py:1370 -#: netbox/dcim/tables/devices.py:553 netbox/dcim/tables/devicetypes.py:224 +#: netbox/core/tables/data.py:26 netbox/dcim/forms/bulk_edit.py:1140 +#: netbox/dcim/forms/bulk_edit.py:1418 netbox/dcim/forms/filtersets.py:1375 +#: netbox/dcim/tables/devices.py:566 netbox/dcim/tables/devicetypes.py:226 #: netbox/extras/forms/bulk_edit.py:123 netbox/extras/forms/bulk_edit.py:187 #: netbox/extras/forms/bulk_edit.py:246 netbox/extras/forms/filtersets.py:142 #: netbox/extras/forms/filtersets.py:229 netbox/extras/forms/filtersets.py:294 @@ -1755,8 +2193,8 @@ msgstr "" #: netbox/templates/users/objectpermission.html:25 #: netbox/templates/virtualization/vminterface.html:29 #: netbox/users/forms/bulk_edit.py:89 netbox/users/forms/filtersets.py:70 -#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:217 -#: netbox/virtualization/forms/filtersets.py:215 +#: netbox/users/tables.py:83 netbox/virtualization/forms/bulk_edit.py:199 +#: netbox/virtualization/forms/filtersets.py:220 msgid "Enabled" msgstr "" @@ -1764,9 +2202,9 @@ msgstr "" #: netbox/templates/extras/savedfilter.html:52 #: netbox/vpn/forms/filtersets.py:97 netbox/vpn/forms/filtersets.py:127 #: netbox/vpn/forms/filtersets.py:151 netbox/vpn/forms/filtersets.py:170 -#: netbox/vpn/forms/model_forms.py:301 netbox/vpn/forms/model_forms.py:321 -#: netbox/vpn/forms/model_forms.py:337 netbox/vpn/forms/model_forms.py:357 -#: netbox/vpn/forms/model_forms.py:380 +#: netbox/vpn/forms/model_forms.py:302 netbox/vpn/forms/model_forms.py:323 +#: netbox/vpn/forms/model_forms.py:339 netbox/vpn/forms/model_forms.py:360 +#: netbox/vpn/forms/model_forms.py:383 msgid "Parameters" msgstr "" @@ -1844,8 +2282,8 @@ msgid "Completed before" msgstr "" #: netbox/core/forms/filtersets.py:126 netbox/core/forms/filtersets.py:155 -#: netbox/dcim/forms/bulk_edit.py:462 netbox/dcim/forms/filtersets.py:418 -#: netbox/dcim/forms/filtersets.py:462 netbox/dcim/forms/model_forms.py:316 +#: netbox/dcim/forms/bulk_edit.py:465 netbox/dcim/forms/filtersets.py:419 +#: netbox/dcim/forms/filtersets.py:463 netbox/dcim/forms/model_forms.py:324 #: netbox/extras/forms/filtersets.py:456 netbox/extras/forms/filtersets.py:475 #: netbox/extras/tables/tables.py:302 netbox/extras/tables/tables.py:342 #: netbox/templates/core/objectchange.html:36 @@ -1909,22 +2347,22 @@ msgstr "" msgid "Rack Elevations" msgstr "" -#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1520 -#: netbox/dcim/forms/bulk_edit.py:984 netbox/dcim/forms/bulk_edit.py:1372 -#: netbox/dcim/forms/bulk_edit.py:1390 netbox/dcim/tables/racks.py:158 -#: netbox/netbox/navigation/menu.py:291 netbox/netbox/navigation/menu.py:295 +#: netbox/core/forms/model_forms.py:157 netbox/dcim/choices.py:1522 +#: netbox/dcim/forms/bulk_edit.py:987 netbox/dcim/forms/bulk_edit.py:1375 +#: netbox/dcim/forms/bulk_edit.py:1393 netbox/dcim/tables/racks.py:157 +#: netbox/netbox/navigation/menu.py:312 netbox/netbox/navigation/menu.py:316 msgid "Power" msgstr "" -#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:154 +#: netbox/core/forms/model_forms.py:159 netbox/netbox/navigation/menu.py:160 #: netbox/templates/core/inc/config_data.html:37 msgid "IPAM" msgstr "" -#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:230 +#: netbox/core/forms/model_forms.py:160 netbox/netbox/navigation/menu.py:238 #: netbox/templates/core/inc/config_data.html:50 #: netbox/vpn/forms/bulk_edit.py:77 netbox/vpn/forms/filtersets.py:43 -#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 +#: netbox/vpn/forms/model_forms.py:62 netbox/vpn/forms/model_forms.py:147 msgid "Security" msgstr "" @@ -1950,7 +2388,7 @@ msgstr "" msgid "User Preferences" msgstr "" -#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:732 +#: netbox/core/forms/model_forms.py:167 netbox/dcim/forms/filtersets.py:733 #: netbox/templates/core/inc/config_data.html:127 #: netbox/users/forms/model_forms.py:64 msgid "Miscellaneous" @@ -1985,7 +2423,7 @@ msgstr "" msgid "request ID" msgstr "" -#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:69 +#: netbox/core/models/change_logging.py:52 netbox/extras/models/staging.py:77 msgid "action" msgstr "" @@ -2010,9 +2448,9 @@ msgstr "" msgid "Change logging is not supported for this object type ({type})." msgstr "" -#: netbox/core/models/config.py:18 netbox/core/models/data.py:266 +#: netbox/core/models/config.py:18 netbox/core/models/data.py:263 #: netbox/core/models/files.py:27 netbox/core/models/jobs.py:50 -#: netbox/extras/models/models.py:730 netbox/extras/models/notifications.py:39 +#: netbox/extras/models/models.py:733 netbox/extras/models/notifications.py:39 #: netbox/extras/models/notifications.py:186 #: netbox/netbox/models/features.py:53 netbox/users/models/tokens.py:32 msgid "created" @@ -2047,23 +2485,23 @@ msgstr "" msgid "Config revision #{id}" msgstr "" -#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:43 -#: netbox/dcim/models/device_component_templates.py:203 -#: netbox/dcim/models/device_component_templates.py:237 -#: netbox/dcim/models/device_component_templates.py:272 -#: netbox/dcim/models/device_component_templates.py:334 -#: netbox/dcim/models/device_component_templates.py:413 -#: netbox/dcim/models/device_component_templates.py:512 -#: netbox/dcim/models/device_component_templates.py:612 -#: netbox/dcim/models/device_components.py:283 -#: netbox/dcim/models/device_components.py:312 -#: netbox/dcim/models/device_components.py:345 -#: netbox/dcim/models/device_components.py:463 -#: netbox/dcim/models/device_components.py:605 -#: netbox/dcim/models/device_components.py:970 -#: netbox/dcim/models/device_components.py:1044 netbox/dcim/models/power.py:102 +#: netbox/core/models/data.py:44 netbox/dcim/models/cables.py:42 +#: netbox/dcim/models/device_component_templates.py:199 +#: netbox/dcim/models/device_component_templates.py:234 +#: netbox/dcim/models/device_component_templates.py:270 +#: netbox/dcim/models/device_component_templates.py:335 +#: netbox/dcim/models/device_component_templates.py:420 +#: netbox/dcim/models/device_component_templates.py:526 +#: netbox/dcim/models/device_component_templates.py:626 +#: netbox/dcim/models/device_components.py:279 +#: netbox/dcim/models/device_components.py:306 +#: netbox/dcim/models/device_components.py:337 +#: netbox/dcim/models/device_components.py:453 +#: netbox/dcim/models/device_components.py:653 +#: netbox/dcim/models/device_components.py:1019 +#: netbox/dcim/models/device_components.py:1090 netbox/dcim/models/power.py:100 #: netbox/extras/models/customfields.py:78 netbox/extras/models/search.py:41 -#: netbox/virtualization/models/clusters.py:61 netbox/vpn/models/l2vpn.py:32 +#: netbox/virtualization/models/clusters.py:57 netbox/vpn/models/l2vpn.py:32 msgid "type" msgstr "" @@ -2075,8 +2513,8 @@ msgid "URL" msgstr "" #: netbox/core/models/data.py:59 -#: netbox/dcim/models/device_component_templates.py:418 -#: netbox/dcim/models/device_components.py:512 +#: netbox/dcim/models/device_component_templates.py:425 +#: netbox/dcim/models/device_components.py:505 #: netbox/extras/models/models.py:70 netbox/extras/models/models.py:301 #: netbox/extras/models/models.py:526 netbox/users/models/permissions.py:29 msgid "enabled" @@ -2106,63 +2544,63 @@ msgstr "" msgid "data sources" msgstr "" -#: netbox/core/models/data.py:122 +#: netbox/core/models/data.py:119 #, python-brace-format msgid "Unknown backend type: {type}" msgstr "" -#: netbox/core/models/data.py:164 +#: netbox/core/models/data.py:161 msgid "Cannot initiate sync; syncing already in progress." msgstr "" -#: netbox/core/models/data.py:177 +#: netbox/core/models/data.py:174 msgid "" "There was an error initializing the backend. A dependency needs to be " "installed: " msgstr "" -#: netbox/core/models/data.py:270 netbox/core/models/files.py:31 +#: netbox/core/models/data.py:267 netbox/core/models/files.py:31 #: netbox/netbox/models/features.py:59 msgid "last updated" msgstr "" -#: netbox/core/models/data.py:280 netbox/dcim/models/cables.py:444 +#: netbox/core/models/data.py:277 netbox/dcim/models/cables.py:442 msgid "path" msgstr "" -#: netbox/core/models/data.py:283 +#: netbox/core/models/data.py:280 msgid "File path relative to the data source's root" msgstr "" -#: netbox/core/models/data.py:287 netbox/ipam/models/ip.py:503 +#: netbox/core/models/data.py:284 netbox/ipam/models/ip.py:489 msgid "size" msgstr "" -#: netbox/core/models/data.py:290 +#: netbox/core/models/data.py:287 msgid "hash" msgstr "" -#: netbox/core/models/data.py:294 +#: netbox/core/models/data.py:291 msgid "Length must be 64 hexadecimal characters." msgstr "" -#: netbox/core/models/data.py:296 +#: netbox/core/models/data.py:293 msgid "SHA256 hash of the file data" msgstr "" -#: netbox/core/models/data.py:313 +#: netbox/core/models/data.py:310 msgid "data file" msgstr "" -#: netbox/core/models/data.py:314 +#: netbox/core/models/data.py:311 msgid "data files" msgstr "" -#: netbox/core/models/data.py:401 +#: netbox/core/models/data.py:398 msgid "auto sync record" msgstr "" -#: netbox/core/models/data.py:402 +#: netbox/core/models/data.py:399 msgid "auto sync records" msgstr "" @@ -2186,6 +2624,11 @@ msgstr "" msgid "managed files" msgstr "" +#: netbox/core/models/files.py:100 +#, python-brace-format +msgid "A {model} with this file path already exists ({path})." +msgstr "" + #: netbox/core/models/jobs.py:54 msgid "scheduled" msgstr "" @@ -2207,7 +2650,7 @@ msgid "completed" msgstr "" #: netbox/core/models/jobs.py:91 netbox/extras/models/models.py:101 -#: netbox/extras/models/staging.py:87 +#: netbox/extras/models/staging.py:95 msgid "data" msgstr "" @@ -2237,7 +2680,7 @@ msgstr "" msgid "Invalid status for job termination. Choices are: {choices}" msgstr "" -#: netbox/core/models/jobs.py:221 +#: netbox/core/models/jobs.py:231 msgid "" "enqueue() cannot be called with values for both schedule_at and immediate." msgstr "" @@ -2288,7 +2731,7 @@ msgstr "" #: netbox/dcim/tables/devicetypes.py:164 netbox/extras/tables/tables.py:216 #: netbox/extras/tables/tables.py:460 netbox/netbox/tables/tables.py:189 #: netbox/templates/dcim/virtualchassis_edit.html:52 -#: netbox/utilities/forms/forms.py:73 netbox/wireless/tables/wirelesslink.py:17 +#: netbox/utilities/forms/forms.py:73 netbox/wireless/tables/wirelesslink.py:16 msgid "ID" msgstr "" @@ -2354,7 +2797,7 @@ msgstr "" msgid "Host" msgstr "" -#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:535 +#: netbox/core/tables/tasks.py:50 netbox/ipam/forms/filtersets.py:587 msgid "Port" msgstr "" @@ -2402,71 +2845,71 @@ msgstr "" msgid "No workers found" msgstr "" -#: netbox/core/views.py:90 -#, python-brace-format -msgid "Queued job #{id} to sync {datasource}" -msgstr "" - -#: netbox/core/views.py:319 -#, python-brace-format -msgid "Restored configuration revision #{id}" -msgstr "" - -#: netbox/core/views.py:412 netbox/core/views.py:455 netbox/core/views.py:531 +#: netbox/core/utils.py:84 netbox/core/utils.py:150 netbox/core/views.py:396 #, python-brace-format msgid "Job {job_id} not found" msgstr "" -#: netbox/core/views.py:463 -#, python-brace-format -msgid "Job {id} has been deleted." -msgstr "" - -#: netbox/core/views.py:465 -#, python-brace-format -msgid "Error deleting job {id}: {error}" -msgstr "" - -#: netbox/core/views.py:478 netbox/core/views.py:496 +#: netbox/core/utils.py:102 netbox/core/utils.py:118 #, python-brace-format msgid "Job {id} not found." msgstr "" -#: netbox/core/views.py:484 +#: netbox/core/views.py:88 +#, python-brace-format +msgid "Queued job #{id} to sync {datasource}" +msgstr "" + +#: netbox/core/views.py:332 +#, python-brace-format +msgid "Restored configuration revision #{id}" +msgstr "" + +#: netbox/core/views.py:435 +#, python-brace-format +msgid "Job {id} has been deleted." +msgstr "" + +#: netbox/core/views.py:437 +#, python-brace-format +msgid "Error deleting job {id}: {error}" +msgstr "" + +#: netbox/core/views.py:446 #, python-brace-format msgid "Job {id} has been re-enqueued." msgstr "" -#: netbox/core/views.py:519 +#: netbox/core/views.py:455 #, python-brace-format msgid "Job {id} has been enqueued." msgstr "" -#: netbox/core/views.py:538 +#: netbox/core/views.py:464 #, python-brace-format msgid "Job {id} has been stopped." msgstr "" -#: netbox/core/views.py:540 +#: netbox/core/views.py:466 #, python-brace-format msgid "Failed to stop job {id}" msgstr "" -#: netbox/core/views.py:674 +#: netbox/core/views.py:600 msgid "Plugins catalog could not be loaded" msgstr "" -#: netbox/core/views.py:708 +#: netbox/core/views.py:634 #, python-brace-format msgid "Plugin {name} not found" msgstr "" -#: netbox/dcim/api/serializers_/devices.py:49 -#: netbox/dcim/api/serializers_/devicetypes.py:25 +#: netbox/dcim/api/serializers_/devices.py:53 +#: netbox/dcim/api/serializers_/devicetypes.py:26 msgid "Position (U)" msgstr "" -#: netbox/dcim/api/serializers_/racks.py:112 netbox/templates/dcim/rack.html:28 +#: netbox/dcim/api/serializers_/racks.py:113 netbox/templates/dcim/rack.html:28 msgid "Facility ID" msgstr "" @@ -2475,8 +2918,9 @@ msgid "Staging" msgstr "" #: netbox/dcim/choices.py:23 netbox/dcim/choices.py:189 -#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1533 -#: netbox/virtualization/choices.py:23 netbox/virtualization/choices.py:48 +#: netbox/dcim/choices.py:240 netbox/dcim/choices.py:1535 +#: netbox/dcim/choices.py:1667 netbox/virtualization/choices.py:23 +#: netbox/virtualization/choices.py:48 msgid "Decommissioning" msgstr "" @@ -2539,7 +2983,7 @@ msgstr "" msgid "Millimeters" msgstr "" -#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1555 +#: netbox/dcim/choices.py:115 netbox/dcim/choices.py:1557 msgid "Inches" msgstr "" @@ -2553,20 +2997,21 @@ msgstr "" msgid "Rear to front" msgstr "" -#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:69 -#: netbox/dcim/forms/bulk_edit.py:88 netbox/dcim/forms/bulk_edit.py:174 -#: netbox/dcim/forms/bulk_edit.py:1420 netbox/dcim/forms/bulk_import.py:60 -#: netbox/dcim/forms/bulk_import.py:74 netbox/dcim/forms/bulk_import.py:137 -#: netbox/dcim/forms/bulk_import.py:588 netbox/dcim/forms/bulk_import.py:855 -#: netbox/dcim/forms/bulk_import.py:1110 netbox/dcim/forms/filtersets.py:234 -#: netbox/dcim/forms/model_forms.py:74 netbox/dcim/forms/model_forms.py:93 -#: netbox/dcim/forms/model_forms.py:170 netbox/dcim/forms/model_forms.py:1069 -#: netbox/dcim/forms/model_forms.py:1509 netbox/dcim/forms/object_import.py:176 -#: netbox/dcim/tables/devices.py:656 netbox/dcim/tables/devices.py:869 -#: netbox/dcim/tables/devices.py:954 netbox/extras/tables/tables.py:223 -#: netbox/ipam/tables/fhrp.py:59 netbox/ipam/tables/ip.py:378 -#: netbox/ipam/tables/services.py:44 netbox/templates/dcim/interface.html:102 -#: netbox/templates/dcim/interface.html:309 +#: netbox/dcim/choices.py:151 netbox/dcim/forms/bulk_edit.py:72 +#: netbox/dcim/forms/bulk_edit.py:91 netbox/dcim/forms/bulk_edit.py:177 +#: netbox/dcim/forms/bulk_edit.py:1423 netbox/dcim/forms/bulk_import.py:62 +#: netbox/dcim/forms/bulk_import.py:76 netbox/dcim/forms/bulk_import.py:139 +#: netbox/dcim/forms/bulk_import.py:593 netbox/dcim/forms/bulk_import.py:863 +#: netbox/dcim/forms/bulk_import.py:1118 netbox/dcim/forms/filtersets.py:235 +#: netbox/dcim/forms/model_forms.py:76 netbox/dcim/forms/model_forms.py:95 +#: netbox/dcim/forms/model_forms.py:174 netbox/dcim/forms/model_forms.py:1082 +#: netbox/dcim/forms/model_forms.py:1551 netbox/dcim/forms/object_import.py:177 +#: netbox/dcim/tables/devices.py:689 netbox/dcim/tables/devices.py:899 +#: netbox/dcim/tables/devices.py:986 netbox/dcim/tables/devices.py:1146 +#: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 +#: netbox/ipam/tables/ip.py:328 netbox/ipam/tables/services.py:44 +#: netbox/templates/dcim/interface.html:108 +#: netbox/templates/dcim/interface.html:366 #: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 #: netbox/templates/dcim/sitegroup.html:37 #: netbox/templates/ipam/service.html:28 @@ -2579,12 +3024,12 @@ msgstr "" #: netbox/tenancy/forms/bulk_import.py:58 #: netbox/tenancy/forms/model_forms.py:25 #: netbox/tenancy/forms/model_forms.py:68 -#: netbox/virtualization/forms/bulk_edit.py:207 -#: netbox/virtualization/forms/bulk_import.py:151 -#: netbox/virtualization/tables/virtualmachines.py:162 -#: netbox/wireless/forms/bulk_edit.py:24 -#: netbox/wireless/forms/bulk_import.py:21 -#: netbox/wireless/forms/model_forms.py:21 +#: netbox/virtualization/forms/bulk_edit.py:189 +#: netbox/virtualization/forms/bulk_import.py:157 +#: netbox/virtualization/tables/virtualmachines.py:132 +#: netbox/wireless/forms/bulk_edit.py:26 +#: netbox/wireless/forms/bulk_import.py:23 +#: netbox/wireless/forms/model_forms.py:22 msgid "Parent" msgstr "" @@ -2607,7 +3052,7 @@ msgid "Rear" msgstr "" #: netbox/dcim/choices.py:186 netbox/dcim/choices.py:238 -#: netbox/virtualization/choices.py:46 +#: netbox/dcim/choices.py:1665 netbox/virtualization/choices.py:46 msgid "Staged" msgstr "" @@ -2640,7 +3085,7 @@ msgid "Top to bottom" msgstr "" #: netbox/dcim/choices.py:215 netbox/dcim/choices.py:259 -#: netbox/dcim/choices.py:1305 +#: netbox/dcim/choices.py:1307 msgid "Passive" msgstr "" @@ -2670,8 +3115,8 @@ msgstr "" #: netbox/dcim/choices.py:581 netbox/dcim/choices.py:824 #: netbox/dcim/choices.py:1221 netbox/dcim/choices.py:1223 -#: netbox/dcim/choices.py:1449 netbox/dcim/choices.py:1451 -#: netbox/netbox/navigation/menu.py:200 +#: netbox/dcim/choices.py:1451 netbox/dcim/choices.py:1453 +#: netbox/netbox/navigation/menu.py:208 msgid "Other" msgstr "" @@ -2688,10 +3133,10 @@ msgid "Virtual" msgstr "" #: netbox/dcim/choices.py:856 netbox/dcim/choices.py:1099 -#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1330 -#: netbox/dcim/forms/model_forms.py:995 netbox/dcim/forms/model_forms.py:1404 -#: netbox/netbox/navigation/menu.py:140 netbox/netbox/navigation/menu.py:144 -#: netbox/templates/dcim/interface.html:210 +#: netbox/dcim/forms/bulk_edit.py:1576 netbox/dcim/forms/filtersets.py:1335 +#: netbox/dcim/forms/model_forms.py:1007 netbox/dcim/forms/model_forms.py:1445 +#: netbox/netbox/navigation/menu.py:146 netbox/netbox/navigation/menu.py:150 +#: netbox/templates/dcim/interface.html:267 msgid "Wireless" msgstr "" @@ -2699,13 +3144,13 @@ msgstr "" msgid "Virtual interfaces" msgstr "" -#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1428 -#: netbox/dcim/forms/bulk_import.py:862 netbox/dcim/forms/model_forms.py:981 -#: netbox/dcim/tables/devices.py:660 netbox/templates/dcim/interface.html:106 +#: netbox/dcim/choices.py:1025 netbox/dcim/forms/bulk_edit.py:1431 +#: netbox/dcim/forms/bulk_import.py:870 netbox/dcim/forms/model_forms.py:993 +#: netbox/dcim/tables/devices.py:693 netbox/templates/dcim/interface.html:112 #: netbox/templates/virtualization/vminterface.html:43 -#: netbox/virtualization/forms/bulk_edit.py:212 -#: netbox/virtualization/forms/bulk_import.py:158 -#: netbox/virtualization/tables/virtualmachines.py:166 +#: netbox/virtualization/forms/bulk_edit.py:194 +#: netbox/virtualization/forms/bulk_import.py:164 +#: netbox/virtualization/tables/virtualmachines.py:136 msgid "Bridge" msgstr "" @@ -2729,10 +3174,10 @@ msgstr "" msgid "Cellular" msgstr "" -#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:383 -#: netbox/dcim/forms/filtersets.py:809 netbox/dcim/forms/filtersets.py:963 -#: netbox/dcim/forms/filtersets.py:1542 -#: netbox/templates/dcim/inventoryitem.html:52 +#: netbox/dcim/choices.py:1167 netbox/dcim/forms/filtersets.py:384 +#: netbox/dcim/forms/filtersets.py:810 netbox/dcim/forms/filtersets.py:964 +#: netbox/dcim/forms/filtersets.py:1547 +#: netbox/templates/dcim/inventoryitem.html:56 #: netbox/templates/dcim/virtualchassis_edit.html:54 msgid "Serial" msgstr "" @@ -2758,109 +3203,95 @@ msgstr "" msgid "Auto" msgstr "" -#: netbox/dcim/choices.py:1265 +#: netbox/dcim/choices.py:1266 msgid "Access" msgstr "" -#: netbox/dcim/choices.py:1266 netbox/ipam/tables/vlans.py:172 -#: netbox/ipam/tables/vlans.py:217 +#: netbox/dcim/choices.py:1267 netbox/ipam/tables/vlans.py:148 +#: netbox/ipam/tables/vlans.py:193 #: netbox/templates/dcim/inc/interface_vlans_table.html:7 msgid "Tagged" msgstr "" -#: netbox/dcim/choices.py:1267 +#: netbox/dcim/choices.py:1268 msgid "Tagged (All)" msgstr "" -#: netbox/dcim/choices.py:1296 +#: netbox/dcim/choices.py:1269 netbox/templates/ipam/vlan_edit.html:22 +msgid "Q-in-Q (802.1ad)" +msgstr "" + +#: netbox/dcim/choices.py:1298 msgid "IEEE Standard" msgstr "" -#: netbox/dcim/choices.py:1307 +#: netbox/dcim/choices.py:1309 msgid "Passive 24V (2-pair)" msgstr "" -#: netbox/dcim/choices.py:1308 +#: netbox/dcim/choices.py:1310 msgid "Passive 24V (4-pair)" msgstr "" -#: netbox/dcim/choices.py:1309 +#: netbox/dcim/choices.py:1311 msgid "Passive 48V (2-pair)" msgstr "" -#: netbox/dcim/choices.py:1310 +#: netbox/dcim/choices.py:1312 msgid "Passive 48V (4-pair)" msgstr "" -#: netbox/dcim/choices.py:1380 netbox/dcim/choices.py:1490 +#: netbox/dcim/choices.py:1382 netbox/dcim/choices.py:1492 msgid "Copper" msgstr "" -#: netbox/dcim/choices.py:1403 +#: netbox/dcim/choices.py:1405 msgid "Fiber Optic" msgstr "" -#: netbox/dcim/choices.py:1436 netbox/dcim/choices.py:1519 +#: netbox/dcim/choices.py:1438 netbox/dcim/choices.py:1521 msgid "USB" msgstr "" -#: netbox/dcim/choices.py:1506 +#: netbox/dcim/choices.py:1508 msgid "Fiber" msgstr "" -#: netbox/dcim/choices.py:1531 netbox/dcim/forms/filtersets.py:1227 +#: netbox/dcim/choices.py:1533 netbox/dcim/forms/filtersets.py:1228 msgid "Connected" msgstr "" -#: netbox/dcim/choices.py:1550 netbox/wireless/choices.py:497 +#: netbox/dcim/choices.py:1552 netbox/netbox/choices.py:175 msgid "Kilometers" msgstr "" -#: netbox/dcim/choices.py:1551 netbox/templates/dcim/cable_trace.html:65 -#: netbox/wireless/choices.py:498 +#: netbox/dcim/choices.py:1553 netbox/netbox/choices.py:176 +#: netbox/templates/dcim/cable_trace.html:65 msgid "Meters" msgstr "" -#: netbox/dcim/choices.py:1552 +#: netbox/dcim/choices.py:1554 msgid "Centimeters" msgstr "" -#: netbox/dcim/choices.py:1553 netbox/wireless/choices.py:499 +#: netbox/dcim/choices.py:1555 netbox/netbox/choices.py:177 msgid "Miles" msgstr "" -#: netbox/dcim/choices.py:1554 netbox/templates/dcim/cable_trace.html:66 -#: netbox/wireless/choices.py:500 +#: netbox/dcim/choices.py:1556 netbox/netbox/choices.py:178 +#: netbox/templates/dcim/cable_trace.html:66 msgid "Feet" msgstr "" -#: netbox/dcim/choices.py:1570 netbox/templates/dcim/device.html:327 -#: netbox/templates/dcim/rack.html:107 -msgid "Kilograms" -msgstr "" - -#: netbox/dcim/choices.py:1571 -msgid "Grams" -msgstr "" - -#: netbox/dcim/choices.py:1572 netbox/templates/dcim/device.html:328 -#: netbox/templates/dcim/rack.html:108 -msgid "Pounds" -msgstr "" - -#: netbox/dcim/choices.py:1573 -msgid "Ounces" -msgstr "" - -#: netbox/dcim/choices.py:1620 +#: netbox/dcim/choices.py:1604 msgid "Redundant" msgstr "" -#: netbox/dcim/choices.py:1641 +#: netbox/dcim/choices.py:1625 msgid "Single phase" msgstr "" -#: netbox/dcim/choices.py:1642 +#: netbox/dcim/choices.py:1626 msgid "Three-phase" msgstr "" @@ -2874,335 +3305,319 @@ msgstr "" msgid "Invalid WWN format: {value}" msgstr "" -#: netbox/dcim/filtersets.py:86 +#: netbox/dcim/filtersets.py:87 msgid "Parent region (ID)" msgstr "" -#: netbox/dcim/filtersets.py:92 +#: netbox/dcim/filtersets.py:93 msgid "Parent region (slug)" msgstr "" -#: netbox/dcim/filtersets.py:116 +#: netbox/dcim/filtersets.py:117 msgid "Parent site group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:122 +#: netbox/dcim/filtersets.py:123 msgid "Parent site group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:164 netbox/extras/filtersets.py:364 -#: netbox/ipam/filtersets.py:843 netbox/ipam/filtersets.py:995 +#: netbox/dcim/filtersets.py:165 netbox/extras/filtersets.py:364 +#: netbox/ipam/filtersets.py:810 netbox/ipam/filtersets.py:962 msgid "Group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:170 +#: netbox/dcim/filtersets.py:171 msgid "Group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:176 netbox/dcim/filtersets.py:181 +#: netbox/dcim/filtersets.py:177 netbox/dcim/filtersets.py:182 msgid "AS (ID)" msgstr "" -#: netbox/dcim/filtersets.py:246 +#: netbox/dcim/filtersets.py:247 msgid "Parent location (ID)" msgstr "" -#: netbox/dcim/filtersets.py:252 +#: netbox/dcim/filtersets.py:253 msgid "Parent location (slug)" msgstr "" -#: netbox/dcim/filtersets.py:258 netbox/dcim/filtersets.py:369 -#: netbox/dcim/filtersets.py:490 netbox/dcim/filtersets.py:1057 -#: netbox/dcim/filtersets.py:1404 netbox/dcim/filtersets.py:2182 -msgid "Location (ID)" -msgstr "" - -#: netbox/dcim/filtersets.py:265 netbox/dcim/filtersets.py:376 -#: netbox/dcim/filtersets.py:497 netbox/dcim/filtersets.py:1410 -#: netbox/extras/filtersets.py:542 -msgid "Location (slug)" -msgstr "" - -#: netbox/dcim/filtersets.py:296 netbox/dcim/filtersets.py:381 -#: netbox/dcim/filtersets.py:539 netbox/dcim/filtersets.py:678 -#: netbox/dcim/filtersets.py:882 netbox/dcim/filtersets.py:933 -#: netbox/dcim/filtersets.py:973 netbox/dcim/filtersets.py:1306 -#: netbox/dcim/filtersets.py:1840 +#: netbox/dcim/filtersets.py:297 netbox/dcim/filtersets.py:382 +#: netbox/dcim/filtersets.py:540 netbox/dcim/filtersets.py:679 +#: netbox/dcim/filtersets.py:883 netbox/dcim/filtersets.py:934 +#: netbox/dcim/filtersets.py:974 netbox/dcim/filtersets.py:1307 +#: netbox/dcim/filtersets.py:1959 msgid "Manufacturer (ID)" msgstr "" -#: netbox/dcim/filtersets.py:302 netbox/dcim/filtersets.py:387 -#: netbox/dcim/filtersets.py:545 netbox/dcim/filtersets.py:684 -#: netbox/dcim/filtersets.py:888 netbox/dcim/filtersets.py:939 -#: netbox/dcim/filtersets.py:979 netbox/dcim/filtersets.py:1312 -#: netbox/dcim/filtersets.py:1846 +#: netbox/dcim/filtersets.py:303 netbox/dcim/filtersets.py:388 +#: netbox/dcim/filtersets.py:546 netbox/dcim/filtersets.py:685 +#: netbox/dcim/filtersets.py:889 netbox/dcim/filtersets.py:940 +#: netbox/dcim/filtersets.py:980 netbox/dcim/filtersets.py:1313 +#: netbox/dcim/filtersets.py:1965 msgid "Manufacturer (slug)" msgstr "" -#: netbox/dcim/filtersets.py:393 +#: netbox/dcim/filtersets.py:394 msgid "Rack type (slug)" msgstr "" -#: netbox/dcim/filtersets.py:397 +#: netbox/dcim/filtersets.py:398 msgid "Rack type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:411 netbox/dcim/filtersets.py:892 -#: netbox/dcim/filtersets.py:994 netbox/dcim/filtersets.py:1850 -#: netbox/ipam/filtersets.py:383 netbox/ipam/filtersets.py:495 -#: netbox/ipam/filtersets.py:1005 netbox/virtualization/filtersets.py:210 +#: netbox/dcim/filtersets.py:412 netbox/dcim/filtersets.py:893 +#: netbox/dcim/filtersets.py:995 netbox/dcim/filtersets.py:1969 +#: netbox/ipam/filtersets.py:350 netbox/ipam/filtersets.py:462 +#: netbox/ipam/filtersets.py:972 netbox/virtualization/filtersets.py:176 msgid "Role (ID)" msgstr "" -#: netbox/dcim/filtersets.py:417 netbox/dcim/filtersets.py:898 -#: netbox/dcim/filtersets.py:1000 netbox/dcim/filtersets.py:1856 -#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:389 -#: netbox/ipam/filtersets.py:501 netbox/ipam/filtersets.py:1011 -#: netbox/virtualization/filtersets.py:216 +#: netbox/dcim/filtersets.py:418 netbox/dcim/filtersets.py:899 +#: netbox/dcim/filtersets.py:1001 netbox/dcim/filtersets.py:1975 +#: netbox/extras/filtersets.py:558 netbox/ipam/filtersets.py:356 +#: netbox/ipam/filtersets.py:468 netbox/ipam/filtersets.py:978 +#: netbox/virtualization/filtersets.py:182 msgid "Role (slug)" msgstr "" -#: netbox/dcim/filtersets.py:447 netbox/dcim/filtersets.py:1062 -#: netbox/dcim/filtersets.py:1415 netbox/dcim/filtersets.py:2244 +#: netbox/dcim/filtersets.py:448 netbox/dcim/filtersets.py:1063 +#: netbox/dcim/filtersets.py:1416 netbox/dcim/filtersets.py:2367 msgid "Rack (ID)" msgstr "" -#: netbox/dcim/filtersets.py:507 netbox/extras/filtersets.py:293 +#: netbox/dcim/filtersets.py:508 netbox/extras/filtersets.py:293 #: netbox/extras/filtersets.py:337 netbox/extras/filtersets.py:359 #: netbox/extras/filtersets.py:419 netbox/users/filtersets.py:113 #: netbox/users/filtersets.py:180 msgid "User (name)" msgstr "" -#: netbox/dcim/filtersets.py:549 +#: netbox/dcim/filtersets.py:550 msgid "Default platform (ID)" msgstr "" -#: netbox/dcim/filtersets.py:555 +#: netbox/dcim/filtersets.py:556 msgid "Default platform (slug)" msgstr "" -#: netbox/dcim/filtersets.py:558 netbox/dcim/forms/filtersets.py:517 +#: netbox/dcim/filtersets.py:559 netbox/dcim/forms/filtersets.py:518 msgid "Has a front image" msgstr "" -#: netbox/dcim/filtersets.py:562 netbox/dcim/forms/filtersets.py:524 +#: netbox/dcim/filtersets.py:563 netbox/dcim/forms/filtersets.py:525 msgid "Has a rear image" msgstr "" -#: netbox/dcim/filtersets.py:567 netbox/dcim/filtersets.py:688 -#: netbox/dcim/filtersets.py:1131 netbox/dcim/forms/filtersets.py:531 -#: netbox/dcim/forms/filtersets.py:627 netbox/dcim/forms/filtersets.py:848 +#: netbox/dcim/filtersets.py:568 netbox/dcim/filtersets.py:689 +#: netbox/dcim/filtersets.py:1132 netbox/dcim/forms/filtersets.py:532 +#: netbox/dcim/forms/filtersets.py:628 netbox/dcim/forms/filtersets.py:849 msgid "Has console ports" msgstr "" -#: netbox/dcim/filtersets.py:571 netbox/dcim/filtersets.py:692 -#: netbox/dcim/filtersets.py:1135 netbox/dcim/forms/filtersets.py:538 -#: netbox/dcim/forms/filtersets.py:634 netbox/dcim/forms/filtersets.py:855 +#: netbox/dcim/filtersets.py:572 netbox/dcim/filtersets.py:693 +#: netbox/dcim/filtersets.py:1136 netbox/dcim/forms/filtersets.py:539 +#: netbox/dcim/forms/filtersets.py:635 netbox/dcim/forms/filtersets.py:856 msgid "Has console server ports" msgstr "" -#: netbox/dcim/filtersets.py:575 netbox/dcim/filtersets.py:696 -#: netbox/dcim/filtersets.py:1139 netbox/dcim/forms/filtersets.py:545 -#: netbox/dcim/forms/filtersets.py:641 netbox/dcim/forms/filtersets.py:862 +#: netbox/dcim/filtersets.py:576 netbox/dcim/filtersets.py:697 +#: netbox/dcim/filtersets.py:1140 netbox/dcim/forms/filtersets.py:546 +#: netbox/dcim/forms/filtersets.py:642 netbox/dcim/forms/filtersets.py:863 msgid "Has power ports" msgstr "" -#: netbox/dcim/filtersets.py:579 netbox/dcim/filtersets.py:700 -#: netbox/dcim/filtersets.py:1143 netbox/dcim/forms/filtersets.py:552 -#: netbox/dcim/forms/filtersets.py:648 netbox/dcim/forms/filtersets.py:869 +#: netbox/dcim/filtersets.py:580 netbox/dcim/filtersets.py:701 +#: netbox/dcim/filtersets.py:1144 netbox/dcim/forms/filtersets.py:553 +#: netbox/dcim/forms/filtersets.py:649 netbox/dcim/forms/filtersets.py:870 msgid "Has power outlets" msgstr "" -#: netbox/dcim/filtersets.py:583 netbox/dcim/filtersets.py:704 -#: netbox/dcim/filtersets.py:1147 netbox/dcim/forms/filtersets.py:559 -#: netbox/dcim/forms/filtersets.py:655 netbox/dcim/forms/filtersets.py:876 +#: netbox/dcim/filtersets.py:584 netbox/dcim/filtersets.py:705 +#: netbox/dcim/filtersets.py:1148 netbox/dcim/forms/filtersets.py:560 +#: netbox/dcim/forms/filtersets.py:656 netbox/dcim/forms/filtersets.py:877 msgid "Has interfaces" msgstr "" -#: netbox/dcim/filtersets.py:587 netbox/dcim/filtersets.py:708 -#: netbox/dcim/filtersets.py:1151 netbox/dcim/forms/filtersets.py:566 -#: netbox/dcim/forms/filtersets.py:662 netbox/dcim/forms/filtersets.py:883 +#: netbox/dcim/filtersets.py:588 netbox/dcim/filtersets.py:709 +#: netbox/dcim/filtersets.py:1152 netbox/dcim/forms/filtersets.py:567 +#: netbox/dcim/forms/filtersets.py:663 netbox/dcim/forms/filtersets.py:884 msgid "Has pass-through ports" msgstr "" -#: netbox/dcim/filtersets.py:591 netbox/dcim/filtersets.py:1155 -#: netbox/dcim/forms/filtersets.py:580 +#: netbox/dcim/filtersets.py:592 netbox/dcim/filtersets.py:1156 +#: netbox/dcim/forms/filtersets.py:581 msgid "Has module bays" msgstr "" -#: netbox/dcim/filtersets.py:595 netbox/dcim/filtersets.py:1159 -#: netbox/dcim/forms/filtersets.py:573 +#: netbox/dcim/filtersets.py:596 netbox/dcim/filtersets.py:1160 +#: netbox/dcim/forms/filtersets.py:574 msgid "Has device bays" msgstr "" -#: netbox/dcim/filtersets.py:599 netbox/dcim/forms/filtersets.py:587 +#: netbox/dcim/filtersets.py:600 netbox/dcim/forms/filtersets.py:588 msgid "Has inventory items" msgstr "" -#: netbox/dcim/filtersets.py:756 netbox/dcim/filtersets.py:989 -#: netbox/dcim/filtersets.py:1436 +#: netbox/dcim/filtersets.py:757 netbox/dcim/filtersets.py:990 +#: netbox/dcim/filtersets.py:1437 msgid "Device type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:772 netbox/dcim/filtersets.py:1317 +#: netbox/dcim/filtersets.py:773 netbox/dcim/filtersets.py:1318 msgid "Module type (ID)" msgstr "" -#: netbox/dcim/filtersets.py:804 netbox/dcim/filtersets.py:1591 +#: netbox/dcim/filtersets.py:805 netbox/dcim/filtersets.py:1592 msgid "Power port (ID)" msgstr "" -#: netbox/dcim/filtersets.py:878 netbox/dcim/filtersets.py:1836 +#: netbox/dcim/filtersets.py:879 netbox/dcim/filtersets.py:1955 msgid "Parent inventory item (ID)" msgstr "" -#: netbox/dcim/filtersets.py:921 netbox/dcim/filtersets.py:947 -#: netbox/dcim/filtersets.py:1127 netbox/virtualization/filtersets.py:238 +#: netbox/dcim/filtersets.py:922 netbox/dcim/filtersets.py:948 +#: netbox/dcim/filtersets.py:1128 netbox/virtualization/filtersets.py:204 msgid "Config template (ID)" msgstr "" -#: netbox/dcim/filtersets.py:985 +#: netbox/dcim/filtersets.py:986 msgid "Device type (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1005 +#: netbox/dcim/filtersets.py:1006 msgid "Parent Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1009 netbox/virtualization/filtersets.py:220 +#: netbox/dcim/filtersets.py:1010 netbox/virtualization/filtersets.py:186 msgid "Platform (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1015 netbox/extras/filtersets.py:569 -#: netbox/virtualization/filtersets.py:226 +#: netbox/dcim/filtersets.py:1016 netbox/extras/filtersets.py:569 +#: netbox/virtualization/filtersets.py:192 msgid "Platform (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1051 netbox/dcim/filtersets.py:1399 -#: netbox/dcim/filtersets.py:1934 netbox/dcim/filtersets.py:2176 -#: netbox/dcim/filtersets.py:2235 +#: netbox/dcim/filtersets.py:1052 netbox/dcim/filtersets.py:1400 +#: netbox/dcim/filtersets.py:2057 netbox/dcim/filtersets.py:2299 +#: netbox/dcim/filtersets.py:2358 msgid "Site name (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1067 +#: netbox/dcim/filtersets.py:1068 msgid "Parent bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1071 +#: netbox/dcim/filtersets.py:1072 msgid "VM cluster (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1077 netbox/extras/filtersets.py:591 -#: netbox/virtualization/filtersets.py:136 +#: netbox/dcim/filtersets.py:1078 netbox/extras/filtersets.py:591 +#: netbox/virtualization/filtersets.py:102 msgid "Cluster group (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1082 netbox/virtualization/filtersets.py:130 +#: netbox/dcim/filtersets.py:1083 netbox/virtualization/filtersets.py:96 msgid "Cluster group (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1088 +#: netbox/dcim/filtersets.py:1089 msgid "Device model (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1099 netbox/dcim/forms/bulk_edit.py:522 +#: netbox/dcim/filtersets.py:1100 netbox/dcim/forms/bulk_edit.py:525 msgid "Is full depth" msgstr "" -#: netbox/dcim/filtersets.py:1103 netbox/dcim/forms/common.py:18 -#: netbox/dcim/forms/filtersets.py:818 netbox/dcim/forms/filtersets.py:1385 -#: netbox/dcim/models/device_components.py:518 -#: netbox/virtualization/filtersets.py:230 -#: netbox/virtualization/filtersets.py:301 -#: netbox/virtualization/forms/filtersets.py:172 -#: netbox/virtualization/forms/filtersets.py:223 +#: netbox/dcim/filtersets.py:1104 netbox/dcim/forms/filtersets.py:819 +#: netbox/dcim/forms/filtersets.py:1390 netbox/dcim/forms/filtersets.py:1586 +#: netbox/dcim/forms/filtersets.py:1591 netbox/dcim/forms/model_forms.py:1762 +#: netbox/dcim/models/devices.py:1499 netbox/dcim/models/devices.py:1520 +#: netbox/virtualization/filtersets.py:196 +#: netbox/virtualization/filtersets.py:268 +#: netbox/virtualization/forms/filtersets.py:177 +#: netbox/virtualization/forms/filtersets.py:228 msgid "MAC address" msgstr "" -#: netbox/dcim/filtersets.py:1110 netbox/dcim/filtersets.py:1274 -#: netbox/dcim/forms/filtersets.py:827 netbox/dcim/forms/filtersets.py:930 -#: netbox/virtualization/filtersets.py:234 -#: netbox/virtualization/forms/filtersets.py:176 +#: netbox/dcim/filtersets.py:1111 netbox/dcim/filtersets.py:1275 +#: netbox/dcim/forms/filtersets.py:828 netbox/dcim/forms/filtersets.py:931 +#: netbox/virtualization/filtersets.py:200 +#: netbox/virtualization/forms/filtersets.py:181 msgid "Has a primary IP" msgstr "" -#: netbox/dcim/filtersets.py:1114 +#: netbox/dcim/filtersets.py:1115 msgid "Has an out-of-band IP" msgstr "" -#: netbox/dcim/filtersets.py:1119 +#: netbox/dcim/filtersets.py:1120 msgid "Virtual chassis (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1123 +#: netbox/dcim/filtersets.py:1124 msgid "Is a virtual chassis member" msgstr "" -#: netbox/dcim/filtersets.py:1164 +#: netbox/dcim/filtersets.py:1165 msgid "OOB IP (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1168 +#: netbox/dcim/filtersets.py:1169 msgid "Has virtual device context" msgstr "" -#: netbox/dcim/filtersets.py:1257 +#: netbox/dcim/filtersets.py:1258 msgid "VDC (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1262 +#: netbox/dcim/filtersets.py:1263 msgid "Device model" msgstr "" -#: netbox/dcim/filtersets.py:1267 netbox/ipam/filtersets.py:634 -#: netbox/vpn/filtersets.py:102 netbox/vpn/filtersets.py:401 -msgid "Interface (ID)" -msgstr "" - -#: netbox/dcim/filtersets.py:1323 +#: netbox/dcim/filtersets.py:1324 msgid "Module type (model)" msgstr "" -#: netbox/dcim/filtersets.py:1329 +#: netbox/dcim/filtersets.py:1330 msgid "Module bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1333 netbox/dcim/filtersets.py:1425 -#: netbox/ipam/filtersets.py:613 netbox/ipam/filtersets.py:853 -#: netbox/ipam/filtersets.py:1117 netbox/virtualization/filtersets.py:161 -#: netbox/vpn/filtersets.py:379 +#: netbox/dcim/filtersets.py:1334 netbox/dcim/filtersets.py:1426 +#: netbox/dcim/filtersets.py:1612 netbox/ipam/filtersets.py:580 +#: netbox/ipam/filtersets.py:820 netbox/ipam/filtersets.py:1142 +#: netbox/virtualization/filtersets.py:127 netbox/vpn/filtersets.py:379 msgid "Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1421 +#: netbox/dcim/filtersets.py:1422 msgid "Rack (name)" msgstr "" -#: netbox/dcim/filtersets.py:1431 netbox/ipam/filtersets.py:608 -#: netbox/ipam/filtersets.py:848 netbox/ipam/filtersets.py:1123 -#: netbox/vpn/filtersets.py:374 +#: netbox/dcim/filtersets.py:1432 netbox/dcim/filtersets.py:1607 +#: netbox/ipam/filtersets.py:575 netbox/ipam/filtersets.py:815 +#: netbox/ipam/filtersets.py:1148 netbox/vpn/filtersets.py:374 msgid "Device (name)" msgstr "" -#: netbox/dcim/filtersets.py:1442 +#: netbox/dcim/filtersets.py:1443 msgid "Device type (model)" msgstr "" -#: netbox/dcim/filtersets.py:1447 +#: netbox/dcim/filtersets.py:1448 msgid "Device role (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1453 +#: netbox/dcim/filtersets.py:1454 msgid "Device role (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1458 +#: netbox/dcim/filtersets.py:1459 msgid "Virtual Chassis (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1464 netbox/dcim/forms/filtersets.py:109 -#: netbox/dcim/tables/devices.py:206 netbox/netbox/navigation/menu.py:79 +#: netbox/dcim/filtersets.py:1465 netbox/dcim/forms/filtersets.py:110 +#: netbox/dcim/tables/devices.py:216 netbox/netbox/navigation/menu.py:79 #: netbox/templates/dcim/device.html:120 #: netbox/templates/dcim/device_edit.html:93 #: netbox/templates/dcim/virtualchassis.html:20 @@ -3211,167 +3626,229 @@ msgstr "" msgid "Virtual Chassis" msgstr "" -#: netbox/dcim/filtersets.py:1488 +#: netbox/dcim/filtersets.py:1489 msgid "Module (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1495 +#: netbox/dcim/filtersets.py:1496 msgid "Cable (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1604 netbox/ipam/forms/bulk_import.py:189 +#: netbox/dcim/filtersets.py:1617 netbox/ipam/filtersets.py:585 +#: netbox/ipam/filtersets.py:825 netbox/ipam/filtersets.py:1158 +#: netbox/vpn/filtersets.py:385 +msgid "Virtual machine (name)" +msgstr "" + +#: netbox/dcim/filtersets.py:1622 netbox/ipam/filtersets.py:590 +#: netbox/ipam/filtersets.py:830 netbox/ipam/filtersets.py:1152 +#: netbox/virtualization/filtersets.py:248 +#: netbox/virtualization/filtersets.py:299 netbox/vpn/filtersets.py:390 +msgid "Virtual machine (ID)" +msgstr "" + +#: netbox/dcim/filtersets.py:1628 netbox/ipam/filtersets.py:596 +#: netbox/vpn/filtersets.py:97 netbox/vpn/filtersets.py:396 +msgid "Interface (name)" +msgstr "" + +#: netbox/dcim/filtersets.py:1639 netbox/ipam/filtersets.py:607 +#: netbox/vpn/filtersets.py:108 netbox/vpn/filtersets.py:407 +msgid "VM interface (name)" +msgstr "" + +#: netbox/dcim/filtersets.py:1644 netbox/ipam/filtersets.py:612 +#: netbox/vpn/filtersets.py:113 +msgid "VM interface (ID)" +msgstr "" + +#: netbox/dcim/filtersets.py:1686 netbox/ipam/forms/bulk_import.py:185 #: netbox/vpn/forms/bulk_import.py:308 msgid "Assigned VLAN" msgstr "" -#: netbox/dcim/filtersets.py:1608 +#: netbox/dcim/filtersets.py:1690 msgid "Assigned VID" msgstr "" -#: netbox/dcim/filtersets.py:1613 netbox/dcim/forms/bulk_edit.py:1531 -#: netbox/dcim/forms/bulk_import.py:913 netbox/dcim/forms/filtersets.py:1428 -#: netbox/dcim/forms/model_forms.py:1385 -#: netbox/dcim/models/device_components.py:711 -#: netbox/dcim/tables/devices.py:626 netbox/ipam/filtersets.py:318 -#: netbox/ipam/filtersets.py:329 netbox/ipam/filtersets.py:485 -#: netbox/ipam/filtersets.py:586 netbox/ipam/filtersets.py:597 -#: netbox/ipam/forms/bulk_edit.py:242 netbox/ipam/forms/bulk_edit.py:298 -#: netbox/ipam/forms/bulk_edit.py:340 netbox/ipam/forms/bulk_import.py:157 -#: netbox/ipam/forms/bulk_import.py:243 netbox/ipam/forms/bulk_import.py:279 -#: netbox/ipam/forms/filtersets.py:67 netbox/ipam/forms/filtersets.py:172 -#: netbox/ipam/forms/filtersets.py:309 netbox/ipam/forms/model_forms.py:62 -#: netbox/ipam/forms/model_forms.py:202 netbox/ipam/forms/model_forms.py:247 -#: netbox/ipam/forms/model_forms.py:300 netbox/ipam/forms/model_forms.py:464 -#: netbox/ipam/forms/model_forms.py:478 netbox/ipam/forms/model_forms.py:492 -#: netbox/ipam/models/ip.py:233 netbox/ipam/models/ip.py:512 -#: netbox/ipam/models/ip.py:720 netbox/ipam/models/vrfs.py:62 -#: netbox/ipam/tables/ip.py:242 netbox/ipam/tables/ip.py:309 -#: netbox/ipam/tables/ip.py:360 netbox/ipam/tables/ip.py:450 -#: netbox/templates/dcim/interface.html:133 +#: netbox/dcim/filtersets.py:1695 netbox/dcim/forms/bulk_edit.py:1544 +#: netbox/dcim/forms/bulk_import.py:921 netbox/dcim/forms/filtersets.py:1433 +#: netbox/dcim/forms/model_forms.py:1411 +#: netbox/dcim/models/device_components.py:749 +#: netbox/dcim/tables/devices.py:647 netbox/ipam/filtersets.py:321 +#: netbox/ipam/filtersets.py:332 netbox/ipam/filtersets.py:452 +#: netbox/ipam/filtersets.py:553 netbox/ipam/filtersets.py:564 +#: netbox/ipam/forms/bulk_edit.py:226 netbox/ipam/forms/bulk_edit.py:282 +#: netbox/ipam/forms/bulk_edit.py:324 netbox/ipam/forms/bulk_import.py:160 +#: netbox/ipam/forms/bulk_import.py:242 netbox/ipam/forms/bulk_import.py:278 +#: netbox/ipam/forms/filtersets.py:69 netbox/ipam/forms/filtersets.py:174 +#: netbox/ipam/forms/filtersets.py:312 netbox/ipam/forms/model_forms.py:65 +#: netbox/ipam/forms/model_forms.py:208 netbox/ipam/forms/model_forms.py:248 +#: netbox/ipam/forms/model_forms.py:302 netbox/ipam/forms/model_forms.py:466 +#: netbox/ipam/forms/model_forms.py:480 netbox/ipam/forms/model_forms.py:494 +#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:498 +#: netbox/ipam/models/ip.py:719 netbox/ipam/models/vrfs.py:61 +#: netbox/ipam/tables/ip.py:188 netbox/ipam/tables/ip.py:259 +#: netbox/ipam/tables/ip.py:310 netbox/ipam/tables/ip.py:400 +#: netbox/templates/dcim/interface.html:152 #: netbox/templates/ipam/ipaddress.html:18 #: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 #: netbox/templates/ipam/vrf.html:7 netbox/templates/ipam/vrf.html:13 -#: netbox/templates/virtualization/vminterface.html:47 -#: netbox/virtualization/forms/bulk_edit.py:261 -#: netbox/virtualization/forms/bulk_import.py:171 -#: netbox/virtualization/forms/filtersets.py:228 -#: netbox/virtualization/forms/model_forms.py:344 -#: netbox/virtualization/models/virtualmachines.py:355 -#: netbox/virtualization/tables/virtualmachines.py:143 +#: netbox/templates/virtualization/vminterface.html:84 +#: netbox/virtualization/forms/bulk_edit.py:243 +#: netbox/virtualization/forms/bulk_import.py:177 +#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/virtualization/forms/model_forms.py:360 +#: netbox/virtualization/models/virtualmachines.py:331 +#: netbox/virtualization/tables/virtualmachines.py:113 msgid "VRF" msgstr "" -#: netbox/dcim/filtersets.py:1619 netbox/ipam/filtersets.py:324 -#: netbox/ipam/filtersets.py:335 netbox/ipam/filtersets.py:491 -#: netbox/ipam/filtersets.py:592 netbox/ipam/filtersets.py:603 +#: netbox/dcim/filtersets.py:1701 netbox/ipam/filtersets.py:327 +#: netbox/ipam/filtersets.py:338 netbox/ipam/filtersets.py:458 +#: netbox/ipam/filtersets.py:559 netbox/ipam/filtersets.py:570 msgid "VRF (RD)" msgstr "" -#: netbox/dcim/filtersets.py:1624 netbox/ipam/filtersets.py:1032 +#: netbox/dcim/filtersets.py:1706 netbox/ipam/filtersets.py:1010 #: netbox/vpn/filtersets.py:342 msgid "L2VPN (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1630 netbox/dcim/forms/filtersets.py:1433 -#: netbox/dcim/tables/devices.py:570 netbox/ipam/filtersets.py:1038 -#: netbox/ipam/forms/filtersets.py:518 netbox/ipam/tables/vlans.py:137 -#: netbox/templates/dcim/interface.html:93 netbox/templates/ipam/vlan.html:66 +#: netbox/dcim/filtersets.py:1712 netbox/dcim/forms/filtersets.py:1438 +#: netbox/dcim/tables/devices.py:583 netbox/ipam/filtersets.py:1016 +#: netbox/ipam/forms/filtersets.py:570 netbox/ipam/tables/vlans.py:113 +#: netbox/templates/dcim/interface.html:99 netbox/templates/ipam/vlan.html:82 #: netbox/templates/vpn/l2vpntermination.html:12 -#: netbox/virtualization/forms/filtersets.py:233 +#: netbox/virtualization/forms/filtersets.py:238 #: netbox/vpn/forms/bulk_import.py:280 netbox/vpn/forms/filtersets.py:246 -#: netbox/vpn/forms/model_forms.py:409 netbox/vpn/forms/model_forms.py:427 +#: netbox/vpn/forms/model_forms.py:412 netbox/vpn/forms/model_forms.py:430 #: netbox/vpn/models/l2vpn.py:63 netbox/vpn/tables/l2vpn.py:55 msgid "L2VPN" msgstr "" -#: netbox/dcim/filtersets.py:1662 +#: netbox/dcim/filtersets.py:1717 netbox/ipam/filtersets.py:1091 +msgid "VLAN Translation Policy (ID)" +msgstr "" + +#: netbox/dcim/filtersets.py:1723 netbox/dcim/forms/model_forms.py:1428 +#: netbox/dcim/models/device_components.py:568 +#: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:704 +#: netbox/templates/ipam/vlantranslationpolicy.html:11 +#: netbox/virtualization/forms/model_forms.py:365 +msgid "VLAN Translation Policy" +msgstr "" + +#: netbox/dcim/filtersets.py:1757 msgid "Virtual Chassis Interfaces for Device" msgstr "" -#: netbox/dcim/filtersets.py:1667 +#: netbox/dcim/filtersets.py:1762 msgid "Virtual Chassis Interfaces for Device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1671 +#: netbox/dcim/filtersets.py:1766 msgid "Kind of interface" msgstr "" -#: netbox/dcim/filtersets.py:1676 netbox/virtualization/filtersets.py:293 +#: netbox/dcim/filtersets.py:1771 netbox/virtualization/filtersets.py:259 msgid "Parent interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1681 netbox/virtualization/filtersets.py:298 +#: netbox/dcim/filtersets.py:1776 netbox/virtualization/filtersets.py:264 msgid "Bridged interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1686 +#: netbox/dcim/filtersets.py:1781 msgid "LAG interface (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1713 netbox/dcim/filtersets.py:1725 -#: netbox/dcim/forms/filtersets.py:1345 netbox/dcim/forms/model_forms.py:1697 +#: netbox/dcim/filtersets.py:1789 netbox/dcim/tables/devices.py:605 +#: netbox/dcim/tables/devices.py:1135 netbox/templates/dcim/interface.html:131 +#: netbox/templates/dcim/macaddress.html:11 +#: netbox/templates/dcim/macaddress.html:14 +#: netbox/templates/virtualization/vminterface.html:73 +msgid "MAC Address" +msgstr "" + +#: netbox/dcim/filtersets.py:1794 netbox/virtualization/filtersets.py:273 +msgid "Primary MAC address (ID)" +msgstr "" + +#: netbox/dcim/filtersets.py:1800 netbox/dcim/forms/model_forms.py:1415 +#: netbox/virtualization/filtersets.py:279 +#: netbox/virtualization/forms/model_forms.py:303 +msgid "Primary MAC address" +msgstr "" + +#: netbox/dcim/filtersets.py:1822 netbox/dcim/filtersets.py:1834 +#: netbox/dcim/forms/filtersets.py:1350 netbox/dcim/forms/model_forms.py:1742 #: netbox/templates/dcim/virtualdevicecontext.html:15 msgid "Virtual Device Context" msgstr "" -#: netbox/dcim/filtersets.py:1719 +#: netbox/dcim/filtersets.py:1828 msgid "Virtual Device Context (Identifier)" msgstr "" -#: netbox/dcim/filtersets.py:1730 netbox/templates/wireless/wirelesslan.html:11 -#: netbox/wireless/forms/model_forms.py:53 +#: netbox/dcim/filtersets.py:1839 netbox/templates/wireless/wirelesslan.html:11 +#: netbox/wireless/forms/model_forms.py:55 msgid "Wireless LAN" msgstr "" -#: netbox/dcim/filtersets.py:1734 netbox/dcim/tables/devices.py:613 +#: netbox/dcim/filtersets.py:1843 netbox/dcim/tables/devices.py:634 msgid "Wireless link" msgstr "" -#: netbox/dcim/filtersets.py:1803 +#: netbox/dcim/filtersets.py:1853 +msgid "Virtual circuit termination (ID)" +msgstr "" + +#: netbox/dcim/filtersets.py:1922 msgid "Parent module bay (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1808 +#: netbox/dcim/filtersets.py:1927 msgid "Installed module (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1819 +#: netbox/dcim/filtersets.py:1938 msgid "Installed device (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1825 +#: netbox/dcim/filtersets.py:1944 msgid "Installed device (name)" msgstr "" -#: netbox/dcim/filtersets.py:1891 +#: netbox/dcim/filtersets.py:2014 msgid "Master (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1897 +#: netbox/dcim/filtersets.py:2020 msgid "Master (name)" msgstr "" -#: netbox/dcim/filtersets.py:1939 netbox/tenancy/filtersets.py:245 +#: netbox/dcim/filtersets.py:2062 netbox/tenancy/filtersets.py:245 msgid "Tenant (ID)" msgstr "" -#: netbox/dcim/filtersets.py:1945 netbox/extras/filtersets.py:618 +#: netbox/dcim/filtersets.py:2068 netbox/extras/filtersets.py:618 #: netbox/tenancy/filtersets.py:251 msgid "Tenant (slug)" msgstr "" -#: netbox/dcim/filtersets.py:1981 netbox/dcim/forms/filtersets.py:1077 +#: netbox/dcim/filtersets.py:2104 netbox/dcim/forms/filtersets.py:1078 msgid "Unterminated" msgstr "" -#: netbox/dcim/filtersets.py:2239 +#: netbox/dcim/filtersets.py:2362 msgid "Power panel (ID)" msgstr "" #: netbox/dcim/forms/bulk_create.py:40 netbox/extras/forms/filtersets.py:401 #: netbox/extras/forms/model_forms.py:567 #: netbox/extras/forms/model_forms.py:619 netbox/netbox/forms/base.py:86 -#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:478 +#: netbox/netbox/forms/mixins.py:81 netbox/netbox/tables/columns.py:481 #: netbox/templates/circuits/inc/circuit_termination.html:32 #: netbox/templates/generic/bulk_edit.html:65 #: netbox/templates/inc/panels/tags.html:5 @@ -3379,11 +3856,11 @@ msgstr "" msgid "Tags" msgstr "" -#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1498 -#: netbox/dcim/forms/model_forms.py:488 netbox/dcim/forms/model_forms.py:546 +#: netbox/dcim/forms/bulk_create.py:112 netbox/dcim/forms/filtersets.py:1503 +#: netbox/dcim/forms/model_forms.py:498 netbox/dcim/forms/model_forms.py:557 #: netbox/dcim/forms/object_create.py:197 -#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:165 -#: netbox/dcim/tables/devices.py:707 netbox/dcim/tables/devicetypes.py:246 +#: netbox/dcim/forms/object_create.py:345 netbox/dcim/tables/devices.py:175 +#: netbox/dcim/tables/devices.py:740 netbox/dcim/tables/devicetypes.py:248 #: netbox/templates/dcim/device.html:43 netbox/templates/dcim/device.html:131 #: netbox/templates/dcim/modulebay.html:38 #: netbox/templates/dcim/virtualchassis.html:66 @@ -3397,44 +3874,44 @@ msgid "" "created.)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:133 +#: netbox/dcim/forms/bulk_edit.py:136 msgid "Contact name" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:138 +#: netbox/dcim/forms/bulk_edit.py:141 msgid "Contact phone" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:144 +#: netbox/dcim/forms/bulk_edit.py:147 msgid "Contact E-mail" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:147 netbox/dcim/forms/bulk_import.py:123 -#: netbox/dcim/forms/model_forms.py:128 +#: netbox/dcim/forms/bulk_edit.py:150 netbox/dcim/forms/bulk_import.py:125 +#: netbox/dcim/forms/model_forms.py:132 msgid "Time zone" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:225 netbox/dcim/forms/bulk_edit.py:501 -#: netbox/dcim/forms/bulk_edit.py:565 netbox/dcim/forms/bulk_edit.py:638 -#: netbox/dcim/forms/bulk_edit.py:662 netbox/dcim/forms/bulk_edit.py:755 -#: netbox/dcim/forms/bulk_edit.py:1282 netbox/dcim/forms/bulk_edit.py:1703 -#: netbox/dcim/forms/bulk_import.py:182 netbox/dcim/forms/bulk_import.py:393 -#: netbox/dcim/forms/bulk_import.py:427 netbox/dcim/forms/bulk_import.py:472 -#: netbox/dcim/forms/bulk_import.py:508 netbox/dcim/forms/bulk_import.py:1104 -#: netbox/dcim/forms/filtersets.py:313 netbox/dcim/forms/filtersets.py:372 -#: netbox/dcim/forms/filtersets.py:494 netbox/dcim/forms/filtersets.py:619 -#: netbox/dcim/forms/filtersets.py:700 netbox/dcim/forms/filtersets.py:782 -#: netbox/dcim/forms/filtersets.py:947 netbox/dcim/forms/filtersets.py:1539 -#: netbox/dcim/forms/model_forms.py:207 netbox/dcim/forms/model_forms.py:337 -#: netbox/dcim/forms/model_forms.py:349 netbox/dcim/forms/model_forms.py:395 -#: netbox/dcim/forms/model_forms.py:436 netbox/dcim/forms/model_forms.py:1082 -#: netbox/dcim/forms/model_forms.py:1522 netbox/dcim/forms/object_import.py:187 -#: netbox/dcim/tables/devices.py:96 netbox/dcim/tables/devices.py:172 -#: netbox/dcim/tables/devices.py:940 netbox/dcim/tables/devicetypes.py:80 -#: netbox/dcim/tables/devicetypes.py:308 netbox/dcim/tables/modules.py:20 +#: netbox/dcim/forms/bulk_edit.py:228 netbox/dcim/forms/bulk_edit.py:504 +#: netbox/dcim/forms/bulk_edit.py:568 netbox/dcim/forms/bulk_edit.py:641 +#: netbox/dcim/forms/bulk_edit.py:665 netbox/dcim/forms/bulk_edit.py:758 +#: netbox/dcim/forms/bulk_edit.py:1285 netbox/dcim/forms/bulk_edit.py:1716 +#: netbox/dcim/forms/bulk_import.py:184 netbox/dcim/forms/bulk_import.py:395 +#: netbox/dcim/forms/bulk_import.py:429 netbox/dcim/forms/bulk_import.py:477 +#: netbox/dcim/forms/bulk_import.py:513 netbox/dcim/forms/bulk_import.py:1112 +#: netbox/dcim/forms/filtersets.py:314 netbox/dcim/forms/filtersets.py:373 +#: netbox/dcim/forms/filtersets.py:495 netbox/dcim/forms/filtersets.py:620 +#: netbox/dcim/forms/filtersets.py:701 netbox/dcim/forms/filtersets.py:783 +#: netbox/dcim/forms/filtersets.py:948 netbox/dcim/forms/filtersets.py:1544 +#: netbox/dcim/forms/model_forms.py:211 netbox/dcim/forms/model_forms.py:345 +#: netbox/dcim/forms/model_forms.py:357 netbox/dcim/forms/model_forms.py:404 +#: netbox/dcim/forms/model_forms.py:445 netbox/dcim/forms/model_forms.py:1095 +#: netbox/dcim/forms/model_forms.py:1564 netbox/dcim/forms/object_import.py:188 +#: netbox/dcim/tables/devices.py:107 netbox/dcim/tables/devices.py:182 +#: netbox/dcim/tables/devices.py:969 netbox/dcim/tables/devicetypes.py:80 +#: netbox/dcim/tables/devicetypes.py:310 netbox/dcim/tables/modules.py:20 #: netbox/dcim/tables/modules.py:61 netbox/dcim/tables/racks.py:58 -#: netbox/dcim/tables/racks.py:132 netbox/templates/dcim/devicetype.html:14 -#: netbox/templates/dcim/inventoryitem.html:44 +#: netbox/dcim/tables/racks.py:131 netbox/templates/dcim/devicetype.html:14 +#: netbox/templates/dcim/inventoryitem.html:48 #: netbox/templates/dcim/manufacturer.html:33 #: netbox/templates/dcim/modulebay.html:62 #: netbox/templates/dcim/moduletype.html:25 @@ -3443,64 +3920,64 @@ msgstr "" msgid "Manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:230 netbox/dcim/forms/bulk_edit.py:378 -#: netbox/dcim/forms/bulk_import.py:191 netbox/dcim/forms/bulk_import.py:270 -#: netbox/dcim/forms/filtersets.py:255 +#: netbox/dcim/forms/bulk_edit.py:233 netbox/dcim/forms/bulk_edit.py:381 +#: netbox/dcim/forms/bulk_import.py:193 netbox/dcim/forms/bulk_import.py:272 +#: netbox/dcim/forms/filtersets.py:256 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:6 msgid "Form factor" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:235 netbox/dcim/forms/bulk_edit.py:383 -#: netbox/dcim/forms/bulk_import.py:199 netbox/dcim/forms/bulk_import.py:273 -#: netbox/dcim/forms/filtersets.py:260 +#: netbox/dcim/forms/bulk_edit.py:238 netbox/dcim/forms/bulk_edit.py:386 +#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:275 +#: netbox/dcim/forms/filtersets.py:261 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:10 msgid "Width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:241 netbox/dcim/forms/bulk_edit.py:389 -#: netbox/dcim/forms/bulk_import.py:280 +#: netbox/dcim/forms/bulk_edit.py:244 netbox/dcim/forms/bulk_edit.py:392 +#: netbox/dcim/forms/bulk_import.py:282 #: netbox/templates/dcim/devicetype.html:37 msgid "Height (U)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:250 netbox/dcim/forms/bulk_edit.py:394 -#: netbox/dcim/forms/filtersets.py:274 +#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/filtersets.py:275 msgid "Descending units" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:253 netbox/dcim/forms/bulk_edit.py:397 +#: netbox/dcim/forms/bulk_edit.py:256 netbox/dcim/forms/bulk_edit.py:400 msgid "Outer width" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:258 netbox/dcim/forms/bulk_edit.py:402 +#: netbox/dcim/forms/bulk_edit.py:261 netbox/dcim/forms/bulk_edit.py:405 msgid "Outer depth" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:263 netbox/dcim/forms/bulk_edit.py:407 -#: netbox/dcim/forms/bulk_import.py:204 netbox/dcim/forms/bulk_import.py:283 +#: netbox/dcim/forms/bulk_edit.py:266 netbox/dcim/forms/bulk_edit.py:410 +#: netbox/dcim/forms/bulk_import.py:206 netbox/dcim/forms/bulk_import.py:285 msgid "Outer unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:268 netbox/dcim/forms/bulk_edit.py:412 +#: netbox/dcim/forms/bulk_edit.py:271 netbox/dcim/forms/bulk_edit.py:415 msgid "Mounting depth" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:273 netbox/dcim/forms/bulk_edit.py:300 -#: netbox/dcim/forms/bulk_edit.py:422 netbox/dcim/forms/bulk_edit.py:452 -#: netbox/dcim/forms/bulk_edit.py:535 netbox/dcim/forms/bulk_edit.py:558 -#: netbox/dcim/forms/bulk_edit.py:579 netbox/dcim/forms/bulk_edit.py:601 -#: netbox/dcim/forms/bulk_import.py:406 netbox/dcim/forms/bulk_import.py:438 -#: netbox/dcim/forms/filtersets.py:285 netbox/dcim/forms/filtersets.py:307 -#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/filtersets.py:401 -#: netbox/dcim/forms/filtersets.py:488 netbox/dcim/forms/filtersets.py:594 -#: netbox/dcim/forms/filtersets.py:613 netbox/dcim/forms/filtersets.py:674 -#: netbox/dcim/forms/model_forms.py:221 netbox/dcim/forms/model_forms.py:298 +#: netbox/dcim/forms/bulk_edit.py:276 netbox/dcim/forms/bulk_edit.py:303 +#: netbox/dcim/forms/bulk_edit.py:425 netbox/dcim/forms/bulk_edit.py:455 +#: netbox/dcim/forms/bulk_edit.py:538 netbox/dcim/forms/bulk_edit.py:561 +#: netbox/dcim/forms/bulk_edit.py:582 netbox/dcim/forms/bulk_edit.py:604 +#: netbox/dcim/forms/bulk_import.py:408 netbox/dcim/forms/bulk_import.py:440 +#: netbox/dcim/forms/filtersets.py:286 netbox/dcim/forms/filtersets.py:308 +#: netbox/dcim/forms/filtersets.py:328 netbox/dcim/forms/filtersets.py:402 +#: netbox/dcim/forms/filtersets.py:489 netbox/dcim/forms/filtersets.py:595 +#: netbox/dcim/forms/filtersets.py:614 netbox/dcim/forms/filtersets.py:675 +#: netbox/dcim/forms/model_forms.py:226 netbox/dcim/forms/model_forms.py:306 #: netbox/dcim/tables/devicetypes.py:106 netbox/dcim/tables/modules.py:35 -#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:172 +#: netbox/dcim/tables/racks.py:74 netbox/dcim/tables/racks.py:171 #: netbox/extras/forms/bulk_edit.py:53 netbox/extras/forms/bulk_edit.py:133 #: netbox/extras/forms/bulk_edit.py:183 netbox/extras/forms/bulk_edit.py:288 #: netbox/extras/forms/filtersets.py:64 netbox/extras/forms/filtersets.py:156 -#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:190 +#: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:193 #: netbox/templates/dcim/device.html:324 #: netbox/templates/dcim/devicetype.html:49 #: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 @@ -3512,341 +3989,232 @@ msgstr "" msgid "Weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:278 netbox/dcim/forms/bulk_edit.py:427 -#: netbox/dcim/forms/filtersets.py:290 +#: netbox/dcim/forms/bulk_edit.py:281 netbox/dcim/forms/bulk_edit.py:430 +#: netbox/dcim/forms/filtersets.py:291 msgid "Max weight" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:283 netbox/dcim/forms/bulk_edit.py:432 -#: netbox/dcim/forms/bulk_edit.py:540 netbox/dcim/forms/bulk_edit.py:584 -#: netbox/dcim/forms/bulk_import.py:210 netbox/dcim/forms/bulk_import.py:295 -#: netbox/dcim/forms/bulk_import.py:411 netbox/dcim/forms/bulk_import.py:443 -#: netbox/dcim/forms/filtersets.py:295 netbox/dcim/forms/filtersets.py:598 -#: netbox/dcim/forms/filtersets.py:678 +#: netbox/dcim/forms/bulk_edit.py:286 netbox/dcim/forms/bulk_edit.py:435 +#: netbox/dcim/forms/bulk_edit.py:543 netbox/dcim/forms/bulk_edit.py:587 +#: netbox/dcim/forms/bulk_import.py:212 netbox/dcim/forms/bulk_import.py:297 +#: netbox/dcim/forms/bulk_import.py:413 netbox/dcim/forms/bulk_import.py:445 +#: netbox/dcim/forms/filtersets.py:296 netbox/dcim/forms/filtersets.py:599 +#: netbox/dcim/forms/filtersets.py:679 msgid "Weight unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:297 netbox/dcim/forms/filtersets.py:305 -#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:256 +#: netbox/dcim/forms/bulk_edit.py:300 netbox/dcim/forms/filtersets.py:306 +#: netbox/dcim/forms/model_forms.py:222 netbox/dcim/forms/model_forms.py:261 #: netbox/templates/dcim/rack.html:45 netbox/templates/dcim/racktype.html:13 msgid "Rack Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:299 netbox/dcim/forms/model_forms.py:220 -#: netbox/dcim/forms/model_forms.py:297 +#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:225 +#: netbox/dcim/forms/model_forms.py:305 msgid "Outer Dimensions" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:302 netbox/dcim/forms/model_forms.py:222 -#: netbox/dcim/forms/model_forms.py:299 netbox/templates/dcim/device.html:315 +#: netbox/dcim/forms/bulk_edit.py:305 netbox/dcim/forms/model_forms.py:227 +#: netbox/dcim/forms/model_forms.py:307 netbox/templates/dcim/device.html:315 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:3 msgid "Dimensions" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:304 netbox/dcim/forms/filtersets.py:306 -#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/model_forms.py:224 +#: netbox/dcim/forms/bulk_edit.py:307 netbox/dcim/forms/filtersets.py:307 +#: netbox/dcim/forms/filtersets.py:327 netbox/dcim/forms/model_forms.py:229 #: netbox/templates/dcim/inc/panels/racktype_numbering.html:3 msgid "Numbering" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:358 netbox/dcim/forms/bulk_edit.py:1277 -#: netbox/dcim/forms/bulk_edit.py:1698 netbox/dcim/forms/bulk_import.py:253 -#: netbox/dcim/forms/bulk_import.py:1098 netbox/dcim/forms/filtersets.py:367 -#: netbox/dcim/forms/filtersets.py:777 netbox/dcim/forms/filtersets.py:1534 -#: netbox/dcim/forms/model_forms.py:251 netbox/dcim/forms/model_forms.py:1077 -#: netbox/dcim/forms/model_forms.py:1517 netbox/dcim/forms/object_import.py:181 -#: netbox/dcim/tables/devices.py:169 netbox/dcim/tables/devices.py:809 -#: netbox/dcim/tables/devices.py:937 netbox/dcim/tables/devicetypes.py:304 -#: netbox/dcim/tables/racks.py:129 netbox/extras/filtersets.py:552 -#: netbox/ipam/forms/bulk_edit.py:261 netbox/ipam/forms/bulk_edit.py:311 -#: netbox/ipam/forms/bulk_edit.py:359 netbox/ipam/forms/bulk_edit.py:511 -#: netbox/ipam/forms/bulk_import.py:197 netbox/ipam/forms/bulk_import.py:262 -#: netbox/ipam/forms/bulk_import.py:298 netbox/ipam/forms/bulk_import.py:479 -#: netbox/ipam/forms/filtersets.py:237 netbox/ipam/forms/filtersets.py:289 -#: netbox/ipam/forms/filtersets.py:360 netbox/ipam/forms/filtersets.py:509 -#: netbox/ipam/forms/model_forms.py:188 netbox/ipam/forms/model_forms.py:221 -#: netbox/ipam/forms/model_forms.py:250 netbox/ipam/forms/model_forms.py:676 -#: netbox/ipam/tables/ip.py:258 netbox/ipam/tables/ip.py:316 -#: netbox/ipam/tables/ip.py:367 netbox/ipam/tables/vlans.py:130 -#: netbox/ipam/tables/vlans.py:235 netbox/templates/dcim/device.html:182 -#: netbox/templates/dcim/inc/panels/inventory_items.html:20 -#: netbox/templates/dcim/interface.html:223 -#: netbox/templates/dcim/inventoryitem.html:36 -#: netbox/templates/dcim/rack.html:49 netbox/templates/ipam/ipaddress.html:41 -#: netbox/templates/ipam/iprange.html:50 netbox/templates/ipam/prefix.html:77 -#: netbox/templates/ipam/role.html:19 netbox/templates/ipam/vlan.html:52 -#: netbox/templates/virtualization/virtualmachine.html:23 -#: netbox/templates/vpn/tunneltermination.html:17 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:20 -#: netbox/tenancy/forms/bulk_edit.py:142 netbox/tenancy/forms/filtersets.py:107 -#: netbox/tenancy/forms/model_forms.py:137 -#: netbox/tenancy/tables/contacts.py:102 -#: netbox/virtualization/forms/bulk_edit.py:145 -#: netbox/virtualization/forms/bulk_import.py:106 -#: netbox/virtualization/forms/filtersets.py:157 -#: netbox/virtualization/forms/model_forms.py:195 -#: netbox/virtualization/tables/virtualmachines.py:75 -#: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 -#: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:78 -#: netbox/vpn/forms/model_forms.py:113 netbox/vpn/tables/tunnels.py:82 -msgid "Role" -msgstr "" - -#: netbox/dcim/forms/bulk_edit.py:363 netbox/dcim/forms/bulk_import.py:260 -#: netbox/dcim/forms/filtersets.py:380 +#: netbox/dcim/forms/bulk_edit.py:366 netbox/dcim/forms/bulk_import.py:262 +#: netbox/dcim/forms/filtersets.py:381 msgid "Rack type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:370 netbox/dcim/forms/bulk_edit.py:718 -#: netbox/dcim/forms/bulk_edit.py:779 netbox/templates/dcim/device.html:104 +#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/bulk_edit.py:721 +#: netbox/dcim/forms/bulk_edit.py:782 netbox/templates/dcim/device.html:104 #: netbox/templates/dcim/module.html:77 netbox/templates/dcim/modulebay.html:70 #: netbox/templates/dcim/rack.html:57 #: netbox/templates/virtualization/virtualmachine.html:35 msgid "Serial Number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:373 netbox/dcim/forms/filtersets.py:387 -#: netbox/dcim/forms/filtersets.py:813 netbox/dcim/forms/filtersets.py:967 -#: netbox/dcim/forms/filtersets.py:1546 +#: netbox/dcim/forms/bulk_edit.py:376 netbox/dcim/forms/filtersets.py:388 +#: netbox/dcim/forms/filtersets.py:814 netbox/dcim/forms/filtersets.py:968 +#: netbox/dcim/forms/filtersets.py:1551 msgid "Asset tag" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:417 netbox/dcim/forms/bulk_edit.py:530 -#: netbox/dcim/forms/bulk_edit.py:574 netbox/dcim/forms/bulk_edit.py:711 -#: netbox/dcim/forms/bulk_import.py:289 netbox/dcim/forms/bulk_import.py:432 -#: netbox/dcim/forms/bulk_import.py:602 netbox/dcim/forms/filtersets.py:280 -#: netbox/dcim/forms/filtersets.py:511 netbox/dcim/forms/filtersets.py:669 -#: netbox/dcim/forms/filtersets.py:804 netbox/templates/dcim/device.html:98 +#: netbox/dcim/forms/bulk_edit.py:420 netbox/dcim/forms/bulk_edit.py:533 +#: netbox/dcim/forms/bulk_edit.py:577 netbox/dcim/forms/bulk_edit.py:714 +#: netbox/dcim/forms/bulk_import.py:291 netbox/dcim/forms/bulk_import.py:434 +#: netbox/dcim/forms/bulk_import.py:607 netbox/dcim/forms/filtersets.py:281 +#: netbox/dcim/forms/filtersets.py:512 netbox/dcim/forms/filtersets.py:670 +#: netbox/dcim/forms/filtersets.py:805 netbox/templates/dcim/device.html:98 #: netbox/templates/dcim/devicetype.html:65 #: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 #: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:446 netbox/dcim/forms/bulk_edit.py:925 -#: netbox/dcim/forms/bulk_import.py:344 netbox/dcim/forms/bulk_import.py:347 -#: netbox/dcim/forms/bulk_import.py:575 netbox/dcim/forms/bulk_import.py:1380 -#: netbox/dcim/forms/bulk_import.py:1384 netbox/dcim/forms/filtersets.py:104 -#: netbox/dcim/forms/filtersets.py:324 netbox/dcim/forms/filtersets.py:405 -#: netbox/dcim/forms/filtersets.py:419 netbox/dcim/forms/filtersets.py:457 -#: netbox/dcim/forms/filtersets.py:772 netbox/dcim/forms/filtersets.py:1035 -#: netbox/dcim/forms/filtersets.py:1167 netbox/dcim/forms/model_forms.py:264 -#: netbox/dcim/forms/model_forms.py:306 netbox/dcim/forms/model_forms.py:479 -#: netbox/dcim/forms/model_forms.py:755 netbox/dcim/forms/object_create.py:392 -#: netbox/dcim/tables/devices.py:161 netbox/dcim/tables/power.py:70 -#: netbox/dcim/tables/racks.py:217 netbox/ipam/forms/filtersets.py:442 +#: netbox/dcim/forms/bulk_edit.py:449 netbox/dcim/forms/bulk_edit.py:928 +#: netbox/dcim/forms/bulk_import.py:346 netbox/dcim/forms/bulk_import.py:349 +#: netbox/dcim/forms/bulk_import.py:580 netbox/dcim/forms/bulk_import.py:1477 +#: netbox/dcim/forms/bulk_import.py:1481 netbox/dcim/forms/filtersets.py:105 +#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:406 +#: netbox/dcim/forms/filtersets.py:420 netbox/dcim/forms/filtersets.py:458 +#: netbox/dcim/forms/filtersets.py:773 netbox/dcim/forms/filtersets.py:1036 +#: netbox/dcim/forms/filtersets.py:1168 netbox/dcim/forms/model_forms.py:271 +#: netbox/dcim/forms/model_forms.py:314 netbox/dcim/forms/model_forms.py:489 +#: netbox/dcim/forms/model_forms.py:767 netbox/dcim/forms/object_create.py:392 +#: netbox/dcim/tables/devices.py:171 netbox/dcim/tables/power.py:70 +#: netbox/dcim/tables/racks.py:216 netbox/ipam/forms/filtersets.py:445 #: netbox/templates/dcim/device.html:30 #: netbox/templates/dcim/inc/cable_termination.html:16 #: netbox/templates/dcim/powerfeed.html:28 netbox/templates/dcim/rack.html:13 #: netbox/templates/dcim/rack/base.html:4 #: netbox/templates/dcim/rackreservation.html:19 #: netbox/templates/dcim/rackreservation.html:36 -#: netbox/virtualization/forms/model_forms.py:113 +#: netbox/virtualization/forms/model_forms.py:112 msgid "Rack" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:450 netbox/dcim/forms/bulk_edit.py:744 -#: netbox/dcim/forms/filtersets.py:325 netbox/dcim/forms/filtersets.py:398 -#: netbox/dcim/forms/filtersets.py:481 netbox/dcim/forms/filtersets.py:608 -#: netbox/dcim/forms/filtersets.py:721 netbox/dcim/forms/filtersets.py:942 -#: netbox/dcim/forms/model_forms.py:670 netbox/dcim/forms/model_forms.py:1587 +#: netbox/dcim/forms/bulk_edit.py:453 netbox/dcim/forms/bulk_edit.py:747 +#: netbox/dcim/forms/filtersets.py:326 netbox/dcim/forms/filtersets.py:399 +#: netbox/dcim/forms/filtersets.py:482 netbox/dcim/forms/filtersets.py:609 +#: netbox/dcim/forms/filtersets.py:722 netbox/dcim/forms/filtersets.py:943 +#: netbox/dcim/forms/model_forms.py:681 netbox/dcim/forms/model_forms.py:1632 #: netbox/templates/dcim/device_edit.html:20 msgid "Hardware" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:506 netbox/dcim/forms/bulk_import.py:399 -#: netbox/dcim/forms/filtersets.py:499 netbox/dcim/forms/model_forms.py:353 +#: netbox/dcim/forms/bulk_edit.py:509 netbox/dcim/forms/bulk_import.py:401 +#: netbox/dcim/forms/filtersets.py:500 netbox/dcim/forms/model_forms.py:362 msgid "Default platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:511 netbox/dcim/forms/bulk_edit.py:570 -#: netbox/dcim/forms/filtersets.py:502 netbox/dcim/forms/filtersets.py:622 +#: netbox/dcim/forms/bulk_edit.py:514 netbox/dcim/forms/bulk_edit.py:573 +#: netbox/dcim/forms/filtersets.py:503 netbox/dcim/forms/filtersets.py:623 msgid "Part number" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:515 +#: netbox/dcim/forms/bulk_edit.py:518 msgid "U height" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:527 netbox/dcim/tables/devicetypes.py:102 +#: netbox/dcim/forms/bulk_edit.py:530 netbox/dcim/tables/devicetypes.py:102 msgid "Exclude from utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:556 netbox/dcim/forms/model_forms.py:368 +#: netbox/dcim/forms/bulk_edit.py:559 netbox/dcim/forms/model_forms.py:377 #: netbox/dcim/tables/devicetypes.py:77 netbox/templates/dcim/device.html:88 #: netbox/templates/dcim/devicebay.html:52 netbox/templates/dcim/module.html:61 msgid "Device Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:598 netbox/dcim/forms/model_forms.py:401 +#: netbox/dcim/forms/bulk_edit.py:601 netbox/dcim/forms/model_forms.py:410 #: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:66 #: netbox/templates/dcim/module.html:65 netbox/templates/dcim/modulebay.html:66 #: netbox/templates/dcim/moduletype.html:22 msgid "Module Type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:602 netbox/dcim/forms/model_forms.py:371 -#: netbox/dcim/forms/model_forms.py:402 +#: netbox/dcim/forms/bulk_edit.py:605 netbox/dcim/forms/model_forms.py:380 +#: netbox/dcim/forms/model_forms.py:411 #: netbox/templates/dcim/devicetype.html:11 msgid "Chassis" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:616 netbox/dcim/models/devices.py:484 -#: netbox/dcim/tables/devices.py:67 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/models/devices.py:482 +#: netbox/dcim/tables/devices.py:78 msgid "VM role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/forms/bulk_edit.py:643 -#: netbox/dcim/forms/bulk_edit.py:726 netbox/dcim/forms/bulk_import.py:456 -#: netbox/dcim/forms/bulk_import.py:460 netbox/dcim/forms/bulk_import.py:479 -#: netbox/dcim/forms/bulk_import.py:483 netbox/dcim/forms/bulk_import.py:608 -#: netbox/dcim/forms/bulk_import.py:612 netbox/dcim/forms/filtersets.py:689 -#: netbox/dcim/forms/filtersets.py:705 netbox/dcim/forms/filtersets.py:823 -#: netbox/dcim/forms/model_forms.py:415 netbox/dcim/forms/model_forms.py:441 -#: netbox/dcim/forms/model_forms.py:555 -#: netbox/virtualization/forms/bulk_import.py:132 -#: netbox/virtualization/forms/bulk_import.py:133 -#: netbox/virtualization/forms/filtersets.py:188 -#: netbox/virtualization/forms/model_forms.py:215 +#: netbox/dcim/forms/bulk_edit.py:622 netbox/dcim/forms/bulk_edit.py:646 +#: netbox/dcim/forms/bulk_edit.py:729 netbox/dcim/forms/bulk_import.py:461 +#: netbox/dcim/forms/bulk_import.py:465 netbox/dcim/forms/bulk_import.py:484 +#: netbox/dcim/forms/bulk_import.py:488 netbox/dcim/forms/bulk_import.py:613 +#: netbox/dcim/forms/bulk_import.py:617 netbox/dcim/forms/filtersets.py:690 +#: netbox/dcim/forms/filtersets.py:706 netbox/dcim/forms/filtersets.py:824 +#: netbox/dcim/forms/model_forms.py:424 netbox/dcim/forms/model_forms.py:451 +#: netbox/dcim/forms/model_forms.py:566 +#: netbox/virtualization/forms/bulk_import.py:138 +#: netbox/virtualization/forms/bulk_import.py:139 +#: netbox/virtualization/forms/filtersets.py:193 +#: netbox/virtualization/forms/model_forms.py:214 msgid "Config template" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:667 netbox/dcim/forms/bulk_edit.py:1076 -#: netbox/dcim/forms/bulk_import.py:514 netbox/dcim/forms/filtersets.py:114 -#: netbox/dcim/forms/model_forms.py:501 netbox/dcim/forms/model_forms.py:872 -#: netbox/dcim/forms/model_forms.py:889 netbox/extras/filtersets.py:547 +#: netbox/dcim/forms/bulk_edit.py:670 netbox/dcim/forms/bulk_edit.py:1079 +#: netbox/dcim/forms/bulk_import.py:519 netbox/dcim/forms/filtersets.py:115 +#: netbox/dcim/forms/model_forms.py:511 netbox/dcim/forms/model_forms.py:884 +#: netbox/dcim/forms/model_forms.py:901 netbox/extras/filtersets.py:547 msgid "Device type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:678 netbox/dcim/forms/bulk_import.py:495 -#: netbox/dcim/forms/filtersets.py:119 netbox/dcim/forms/model_forms.py:509 +#: netbox/dcim/forms/bulk_edit.py:681 netbox/dcim/forms/bulk_import.py:500 +#: netbox/dcim/forms/filtersets.py:120 netbox/dcim/forms/model_forms.py:519 msgid "Device role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:701 netbox/dcim/forms/bulk_import.py:520 -#: netbox/dcim/forms/filtersets.py:796 netbox/dcim/forms/model_forms.py:451 -#: netbox/dcim/forms/model_forms.py:513 netbox/dcim/tables/devices.py:182 +#: netbox/dcim/forms/bulk_edit.py:704 netbox/dcim/forms/bulk_import.py:525 +#: netbox/dcim/forms/filtersets.py:797 netbox/dcim/forms/model_forms.py:461 +#: netbox/dcim/forms/model_forms.py:524 netbox/dcim/tables/devices.py:192 #: netbox/extras/filtersets.py:563 netbox/templates/dcim/device.html:186 #: netbox/templates/dcim/platform.html:26 #: netbox/templates/virtualization/virtualmachine.html:27 -#: netbox/virtualization/forms/bulk_edit.py:160 -#: netbox/virtualization/forms/bulk_import.py:122 -#: netbox/virtualization/forms/filtersets.py:168 -#: netbox/virtualization/forms/model_forms.py:203 -#: netbox/virtualization/tables/virtualmachines.py:79 +#: netbox/virtualization/forms/bulk_edit.py:142 +#: netbox/virtualization/forms/bulk_import.py:128 +#: netbox/virtualization/forms/filtersets.py:173 +#: netbox/virtualization/forms/model_forms.py:202 +#: netbox/virtualization/tables/virtualmachines.py:49 msgid "Platform" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:731 netbox/dcim/forms/bulk_import.py:539 -#: netbox/dcim/forms/filtersets.py:728 netbox/dcim/forms/filtersets.py:898 -#: netbox/dcim/forms/model_forms.py:522 netbox/dcim/tables/devices.py:202 +#: netbox/dcim/forms/bulk_edit.py:734 netbox/dcim/forms/bulk_import.py:544 +#: netbox/dcim/forms/filtersets.py:729 netbox/dcim/forms/filtersets.py:899 +#: netbox/dcim/forms/model_forms.py:533 netbox/dcim/tables/devices.py:212 #: netbox/extras/filtersets.py:596 netbox/extras/forms/filtersets.py:322 -#: netbox/ipam/forms/filtersets.py:415 netbox/ipam/forms/filtersets.py:447 +#: netbox/ipam/forms/filtersets.py:418 netbox/ipam/forms/filtersets.py:450 #: netbox/templates/dcim/device.html:239 #: netbox/templates/virtualization/cluster.html:10 #: netbox/templates/virtualization/virtualmachine.html:92 #: netbox/templates/virtualization/virtualmachine.html:101 -#: netbox/virtualization/filtersets.py:157 -#: netbox/virtualization/filtersets.py:277 -#: netbox/virtualization/forms/bulk_edit.py:129 -#: netbox/virtualization/forms/bulk_import.py:92 -#: netbox/virtualization/forms/filtersets.py:99 -#: netbox/virtualization/forms/filtersets.py:123 -#: netbox/virtualization/forms/filtersets.py:204 -#: netbox/virtualization/forms/model_forms.py:79 -#: netbox/virtualization/forms/model_forms.py:176 -#: netbox/virtualization/tables/virtualmachines.py:67 +#: netbox/virtualization/filtersets.py:123 +#: netbox/virtualization/filtersets.py:243 +#: netbox/virtualization/forms/bulk_edit.py:111 +#: netbox/virtualization/forms/bulk_import.py:98 +#: netbox/virtualization/forms/filtersets.py:104 +#: netbox/virtualization/forms/filtersets.py:128 +#: netbox/virtualization/forms/filtersets.py:209 +#: netbox/virtualization/forms/model_forms.py:77 +#: netbox/virtualization/forms/model_forms.py:175 +#: netbox/virtualization/tables/virtualmachines.py:37 msgid "Cluster" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:742 netbox/dcim/forms/bulk_edit.py:1296 -#: netbox/dcim/forms/bulk_edit.py:1693 netbox/dcim/forms/bulk_edit.py:1739 -#: netbox/dcim/forms/bulk_import.py:663 netbox/dcim/forms/bulk_import.py:725 -#: netbox/dcim/forms/bulk_import.py:751 netbox/dcim/forms/bulk_import.py:777 -#: netbox/dcim/forms/bulk_import.py:797 netbox/dcim/forms/bulk_import.py:850 -#: netbox/dcim/forms/bulk_import.py:968 netbox/dcim/forms/bulk_import.py:1016 -#: netbox/dcim/forms/bulk_import.py:1033 netbox/dcim/forms/bulk_import.py:1045 -#: netbox/dcim/forms/bulk_import.py:1093 netbox/dcim/forms/bulk_import.py:1444 -#: netbox/dcim/forms/connections.py:24 netbox/dcim/forms/filtersets.py:131 -#: netbox/dcim/forms/filtersets.py:921 netbox/dcim/forms/filtersets.py:1051 -#: netbox/dcim/forms/filtersets.py:1242 netbox/dcim/forms/filtersets.py:1267 -#: netbox/dcim/forms/filtersets.py:1291 netbox/dcim/forms/filtersets.py:1311 -#: netbox/dcim/forms/filtersets.py:1334 netbox/dcim/forms/filtersets.py:1444 -#: netbox/dcim/forms/filtersets.py:1469 netbox/dcim/forms/filtersets.py:1493 -#: netbox/dcim/forms/filtersets.py:1511 netbox/dcim/forms/filtersets.py:1528 -#: netbox/dcim/forms/filtersets.py:1592 netbox/dcim/forms/filtersets.py:1616 -#: netbox/dcim/forms/filtersets.py:1640 netbox/dcim/forms/model_forms.py:633 -#: netbox/dcim/forms/model_forms.py:849 netbox/dcim/forms/model_forms.py:1215 -#: netbox/dcim/forms/model_forms.py:1671 netbox/dcim/forms/object_create.py:249 -#: netbox/dcim/tables/connections.py:22 netbox/dcim/tables/connections.py:41 -#: netbox/dcim/tables/connections.py:60 netbox/dcim/tables/devices.py:285 -#: netbox/dcim/tables/devices.py:371 netbox/dcim/tables/devices.py:412 -#: netbox/dcim/tables/devices.py:454 netbox/dcim/tables/devices.py:505 -#: netbox/dcim/tables/devices.py:597 netbox/dcim/tables/devices.py:697 -#: netbox/dcim/tables/devices.py:754 netbox/dcim/tables/devices.py:801 -#: netbox/dcim/tables/devices.py:861 netbox/dcim/tables/devices.py:930 -#: netbox/dcim/tables/devices.py:1057 netbox/dcim/tables/modules.py:53 -#: netbox/extras/forms/filtersets.py:321 netbox/ipam/forms/bulk_import.py:304 -#: netbox/ipam/forms/bulk_import.py:505 netbox/ipam/forms/filtersets.py:551 -#: netbox/ipam/forms/model_forms.py:323 netbox/ipam/forms/model_forms.py:712 -#: netbox/ipam/forms/model_forms.py:745 netbox/ipam/forms/model_forms.py:771 -#: netbox/ipam/tables/vlans.py:180 netbox/templates/dcim/consoleport.html:20 -#: netbox/templates/dcim/consoleserverport.html:20 -#: netbox/templates/dcim/device.html:15 netbox/templates/dcim/device.html:130 -#: netbox/templates/dcim/device_edit.html:10 -#: netbox/templates/dcim/devicebay.html:20 -#: netbox/templates/dcim/devicebay.html:48 -#: netbox/templates/dcim/frontport.html:20 -#: netbox/templates/dcim/interface.html:30 -#: netbox/templates/dcim/interface.html:161 -#: netbox/templates/dcim/inventoryitem.html:20 -#: netbox/templates/dcim/module.html:57 netbox/templates/dcim/modulebay.html:20 -#: netbox/templates/dcim/poweroutlet.html:20 -#: netbox/templates/dcim/powerport.html:20 -#: netbox/templates/dcim/rearport.html:20 -#: netbox/templates/dcim/virtualchassis.html:65 -#: netbox/templates/dcim/virtualchassis_edit.html:51 -#: netbox/templates/dcim/virtualdevicecontext.html:22 -#: netbox/templates/virtualization/virtualmachine.html:114 -#: netbox/templates/vpn/tunneltermination.html:23 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:6 -#: netbox/virtualization/filtersets.py:167 -#: netbox/virtualization/forms/bulk_edit.py:137 -#: netbox/virtualization/forms/bulk_import.py:99 -#: netbox/virtualization/forms/filtersets.py:128 -#: netbox/virtualization/forms/model_forms.py:185 -#: netbox/virtualization/tables/virtualmachines.py:71 netbox/vpn/choices.py:52 -#: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 -#: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:90 -#: netbox/vpn/forms/model_forms.py:125 netbox/vpn/forms/model_forms.py:236 -#: netbox/vpn/forms/model_forms.py:453 netbox/wireless/forms/model_forms.py:99 -#: netbox/wireless/forms/model_forms.py:141 -#: netbox/wireless/tables/wirelesslan.py:75 -msgid "Device" -msgstr "" - -#: netbox/dcim/forms/bulk_edit.py:745 +#: netbox/dcim/forms/bulk_edit.py:748 #: netbox/templates/extras/dashboard/widget_config.html:7 -#: netbox/virtualization/forms/bulk_edit.py:191 +#: netbox/virtualization/forms/bulk_edit.py:173 msgid "Configuration" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:746 netbox/netbox/navigation/menu.py:243 +#: netbox/dcim/forms/bulk_edit.py:749 netbox/netbox/navigation/menu.py:251 #: netbox/templates/dcim/device_edit.html:78 msgid "Virtualization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:760 netbox/dcim/forms/bulk_import.py:675 -#: netbox/dcim/forms/model_forms.py:647 netbox/dcim/forms/model_forms.py:897 +#: netbox/dcim/forms/bulk_edit.py:763 netbox/dcim/forms/bulk_import.py:680 +#: netbox/dcim/forms/model_forms.py:658 netbox/dcim/forms/model_forms.py:909 msgid "Module type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:814 netbox/dcim/forms/bulk_edit.py:999 -#: netbox/dcim/forms/bulk_edit.py:1018 netbox/dcim/forms/bulk_edit.py:1041 -#: netbox/dcim/forms/bulk_edit.py:1083 netbox/dcim/forms/bulk_edit.py:1127 -#: netbox/dcim/forms/bulk_edit.py:1178 netbox/dcim/forms/bulk_edit.py:1205 -#: netbox/dcim/forms/bulk_edit.py:1232 netbox/dcim/forms/bulk_edit.py:1250 -#: netbox/dcim/forms/bulk_edit.py:1268 netbox/dcim/forms/filtersets.py:67 +#: netbox/dcim/forms/bulk_edit.py:817 netbox/dcim/forms/bulk_edit.py:1002 +#: netbox/dcim/forms/bulk_edit.py:1021 netbox/dcim/forms/bulk_edit.py:1044 +#: netbox/dcim/forms/bulk_edit.py:1086 netbox/dcim/forms/bulk_edit.py:1130 +#: netbox/dcim/forms/bulk_edit.py:1181 netbox/dcim/forms/bulk_edit.py:1208 +#: netbox/dcim/forms/bulk_edit.py:1235 netbox/dcim/forms/bulk_edit.py:1253 +#: netbox/dcim/forms/bulk_edit.py:1271 netbox/dcim/forms/filtersets.py:68 #: netbox/dcim/forms/object_create.py:46 netbox/templates/dcim/cable.html:32 #: netbox/templates/dcim/consoleport.html:32 #: netbox/templates/dcim/consoleserverport.html:32 @@ -3864,107 +4232,107 @@ msgstr "" msgid "Label" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:823 netbox/dcim/forms/filtersets.py:1068 +#: netbox/dcim/forms/bulk_edit.py:826 netbox/dcim/forms/filtersets.py:1069 #: netbox/templates/dcim/cable.html:50 msgid "Length" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:828 netbox/dcim/forms/bulk_import.py:1248 -#: netbox/dcim/forms/bulk_import.py:1251 netbox/dcim/forms/filtersets.py:1072 +#: netbox/dcim/forms/bulk_edit.py:831 netbox/dcim/forms/bulk_import.py:1345 +#: netbox/dcim/forms/bulk_import.py:1348 netbox/dcim/forms/filtersets.py:1073 msgid "Length unit" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:852 +#: netbox/dcim/forms/bulk_edit.py:855 #: netbox/templates/dcim/virtualchassis.html:23 msgid "Domain" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:920 netbox/dcim/forms/bulk_import.py:1367 -#: netbox/dcim/forms/filtersets.py:1158 netbox/dcim/forms/model_forms.py:750 +#: netbox/dcim/forms/bulk_edit.py:923 netbox/dcim/forms/bulk_import.py:1464 +#: netbox/dcim/forms/filtersets.py:1159 netbox/dcim/forms/model_forms.py:761 msgid "Power panel" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:942 netbox/dcim/forms/bulk_import.py:1403 -#: netbox/dcim/forms/filtersets.py:1180 netbox/templates/dcim/powerfeed.html:83 +#: netbox/dcim/forms/bulk_edit.py:945 netbox/dcim/forms/bulk_import.py:1500 +#: netbox/dcim/forms/filtersets.py:1181 netbox/templates/dcim/powerfeed.html:83 msgid "Supply" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:948 netbox/dcim/forms/bulk_import.py:1408 -#: netbox/dcim/forms/filtersets.py:1185 netbox/templates/dcim/powerfeed.html:95 +#: netbox/dcim/forms/bulk_edit.py:951 netbox/dcim/forms/bulk_import.py:1505 +#: netbox/dcim/forms/filtersets.py:1186 netbox/templates/dcim/powerfeed.html:95 msgid "Phase" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:954 netbox/dcim/forms/filtersets.py:1190 +#: netbox/dcim/forms/bulk_edit.py:957 netbox/dcim/forms/filtersets.py:1191 #: netbox/templates/dcim/powerfeed.html:87 msgid "Voltage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:958 netbox/dcim/forms/filtersets.py:1194 +#: netbox/dcim/forms/bulk_edit.py:961 netbox/dcim/forms/filtersets.py:1195 #: netbox/templates/dcim/powerfeed.html:91 msgid "Amperage" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:962 netbox/dcim/forms/filtersets.py:1198 +#: netbox/dcim/forms/bulk_edit.py:965 netbox/dcim/forms/filtersets.py:1199 msgid "Max utilization" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1051 +#: netbox/dcim/forms/bulk_edit.py:1054 msgid "Maximum draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1054 -#: netbox/dcim/models/device_component_templates.py:282 -#: netbox/dcim/models/device_components.py:356 +#: netbox/dcim/forms/bulk_edit.py:1057 +#: netbox/dcim/models/device_component_templates.py:281 +#: netbox/dcim/models/device_components.py:349 msgid "Maximum power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1057 +#: netbox/dcim/forms/bulk_edit.py:1060 msgid "Allocated draw" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1060 -#: netbox/dcim/models/device_component_templates.py:289 -#: netbox/dcim/models/device_components.py:363 +#: netbox/dcim/forms/bulk_edit.py:1063 +#: netbox/dcim/models/device_component_templates.py:288 +#: netbox/dcim/models/device_components.py:356 msgid "Allocated power draw (watts)" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1093 netbox/dcim/forms/bulk_import.py:808 -#: netbox/dcim/forms/model_forms.py:960 netbox/dcim/forms/model_forms.py:1285 -#: netbox/dcim/forms/model_forms.py:1574 netbox/dcim/forms/object_import.py:55 +#: netbox/dcim/forms/bulk_edit.py:1096 netbox/dcim/forms/bulk_import.py:813 +#: netbox/dcim/forms/model_forms.py:972 netbox/dcim/forms/model_forms.py:1301 +#: netbox/dcim/forms/model_forms.py:1616 netbox/dcim/forms/object_import.py:55 msgid "Power port" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1098 netbox/dcim/forms/bulk_import.py:815 +#: netbox/dcim/forms/bulk_edit.py:1101 netbox/dcim/forms/bulk_import.py:820 msgid "Feed leg" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1144 netbox/dcim/forms/bulk_edit.py:1462 +#: netbox/dcim/forms/bulk_edit.py:1147 netbox/dcim/forms/bulk_edit.py:1465 msgid "Management only" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1154 netbox/dcim/forms/bulk_edit.py:1468 -#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1394 +#: netbox/dcim/forms/bulk_edit.py:1157 netbox/dcim/forms/bulk_edit.py:1471 +#: netbox/dcim/forms/bulk_import.py:906 netbox/dcim/forms/filtersets.py:1399 #: netbox/dcim/forms/object_import.py:90 -#: netbox/dcim/models/device_component_templates.py:437 -#: netbox/dcim/models/device_components.py:670 +#: netbox/dcim/models/device_component_templates.py:445 +#: netbox/dcim/models/device_components.py:721 msgid "PoE mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1160 netbox/dcim/forms/bulk_edit.py:1474 -#: netbox/dcim/forms/bulk_import.py:904 netbox/dcim/forms/filtersets.py:1399 +#: netbox/dcim/forms/bulk_edit.py:1163 netbox/dcim/forms/bulk_edit.py:1477 +#: netbox/dcim/forms/bulk_import.py:912 netbox/dcim/forms/filtersets.py:1404 #: netbox/dcim/forms/object_import.py:95 -#: netbox/dcim/models/device_component_templates.py:443 -#: netbox/dcim/models/device_components.py:676 +#: netbox/dcim/models/device_component_templates.py:452 +#: netbox/dcim/models/device_components.py:728 msgid "PoE type" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1166 netbox/dcim/forms/filtersets.py:1404 +#: netbox/dcim/forms/bulk_edit.py:1169 netbox/dcim/forms/filtersets.py:1409 #: netbox/dcim/forms/object_import.py:100 msgid "Wireless role" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1303 netbox/dcim/forms/model_forms.py:669 -#: netbox/dcim/forms/model_forms.py:1230 netbox/dcim/tables/devices.py:313 +#: netbox/dcim/forms/bulk_edit.py:1306 netbox/dcim/forms/model_forms.py:680 +#: netbox/dcim/forms/model_forms.py:1246 netbox/dcim/tables/devices.py:322 #: netbox/templates/dcim/consoleport.html:24 #: netbox/templates/dcim/consoleserverport.html:24 #: netbox/templates/dcim/frontport.html:24 @@ -3977,31 +4345,31 @@ msgstr "" msgid "Module" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1442 netbox/dcim/tables/devices.py:665 -#: netbox/templates/dcim/interface.html:110 +#: netbox/dcim/forms/bulk_edit.py:1445 netbox/dcim/tables/devices.py:698 +#: netbox/templates/dcim/interface.html:116 msgid "LAG" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1447 netbox/dcim/forms/model_forms.py:1312 +#: netbox/dcim/forms/bulk_edit.py:1450 netbox/dcim/forms/model_forms.py:1328 msgid "Virtual device contexts" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1453 netbox/dcim/forms/bulk_import.py:736 -#: netbox/dcim/forms/bulk_import.py:762 netbox/dcim/forms/filtersets.py:1252 -#: netbox/dcim/forms/filtersets.py:1277 netbox/dcim/forms/filtersets.py:1358 -#: netbox/dcim/tables/devices.py:610 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:67 +#: netbox/dcim/forms/bulk_edit.py:1456 netbox/dcim/forms/bulk_import.py:741 +#: netbox/dcim/forms/bulk_import.py:767 netbox/dcim/forms/filtersets.py:1253 +#: netbox/dcim/forms/filtersets.py:1278 netbox/dcim/forms/filtersets.py:1363 +#: netbox/dcim/tables/devices.py:631 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:62 #: netbox/templates/dcim/consoleport.html:40 #: netbox/templates/dcim/consoleserverport.html:40 msgid "Speed" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1482 netbox/dcim/forms/bulk_import.py:907 +#: netbox/dcim/forms/bulk_edit.py:1485 netbox/dcim/forms/bulk_import.py:915 #: netbox/templates/vpn/ikepolicy.html:25 #: netbox/templates/vpn/ipsecprofile.html:21 #: netbox/templates/vpn/ipsecprofile.html:48 -#: netbox/virtualization/forms/bulk_edit.py:233 -#: netbox/virtualization/forms/bulk_import.py:165 +#: netbox/virtualization/forms/bulk_edit.py:215 +#: netbox/virtualization/forms/bulk_import.py:171 #: netbox/vpn/forms/bulk_edit.py:146 netbox/vpn/forms/bulk_edit.py:232 #: netbox/vpn/forms/bulk_import.py:176 netbox/vpn/forms/bulk_import.py:234 #: netbox/vpn/forms/filtersets.py:135 netbox/vpn/forms/filtersets.py:178 @@ -4010,594 +4378,636 @@ msgstr "" msgid "Mode" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1490 netbox/dcim/forms/model_forms.py:1361 -#: netbox/ipam/forms/bulk_import.py:178 netbox/ipam/forms/filtersets.py:498 -#: netbox/ipam/models/vlans.py:84 netbox/virtualization/forms/bulk_edit.py:240 -#: netbox/virtualization/forms/model_forms.py:321 +#: netbox/dcim/forms/bulk_edit.py:1493 netbox/dcim/forms/model_forms.py:1377 +#: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/filtersets.py:539 +#: netbox/ipam/models/vlans.py:86 netbox/virtualization/forms/bulk_edit.py:222 +#: netbox/virtualization/forms/model_forms.py:327 msgid "VLAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1499 netbox/dcim/forms/model_forms.py:1367 -#: netbox/dcim/tables/devices.py:579 -#: netbox/virtualization/forms/bulk_edit.py:248 -#: netbox/virtualization/forms/model_forms.py:326 +#: netbox/dcim/forms/bulk_edit.py:1502 netbox/dcim/forms/model_forms.py:1383 +#: netbox/dcim/tables/devices.py:592 +#: netbox/virtualization/forms/bulk_edit.py:230 +#: netbox/virtualization/forms/model_forms.py:332 msgid "Untagged VLAN" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1508 netbox/dcim/forms/model_forms.py:1376 -#: netbox/dcim/tables/devices.py:585 -#: netbox/virtualization/forms/bulk_edit.py:256 -#: netbox/virtualization/forms/model_forms.py:335 +#: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1392 +#: netbox/dcim/tables/devices.py:598 +#: netbox/virtualization/forms/bulk_edit.py:238 +#: netbox/virtualization/forms/model_forms.py:341 msgid "Tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1511 +#: netbox/dcim/forms/bulk_edit.py:1514 msgid "Add tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1520 +#: netbox/dcim/forms/bulk_edit.py:1523 msgid "Remove tagged VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1536 netbox/dcim/forms/model_forms.py:1348 +#: netbox/dcim/forms/bulk_edit.py:1534 netbox/dcim/forms/model_forms.py:1401 +#: netbox/virtualization/forms/model_forms.py:350 +msgid "Q-in-Q Service VLAN" +msgstr "" + +#: netbox/dcim/forms/bulk_edit.py:1549 netbox/dcim/forms/model_forms.py:1364 msgid "Wireless LAN group" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1541 netbox/dcim/forms/model_forms.py:1353 -#: netbox/dcim/tables/devices.py:619 netbox/netbox/navigation/menu.py:146 -#: netbox/templates/dcim/interface.html:280 +#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1369 +#: netbox/dcim/tables/devices.py:640 netbox/netbox/navigation/menu.py:152 +#: netbox/templates/dcim/interface.html:337 #: netbox/wireless/tables/wirelesslan.py:24 msgid "Wireless LANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1550 netbox/dcim/forms/filtersets.py:1328 -#: netbox/dcim/forms/model_forms.py:1397 netbox/ipam/forms/bulk_edit.py:286 -#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:169 -#: netbox/templates/dcim/interface.html:122 -#: netbox/templates/ipam/prefix.html:95 -#: netbox/virtualization/forms/model_forms.py:349 +#: netbox/dcim/forms/bulk_edit.py:1563 netbox/dcim/forms/filtersets.py:1333 +#: netbox/dcim/forms/model_forms.py:1435 netbox/ipam/forms/bulk_edit.py:269 +#: netbox/ipam/forms/bulk_edit.py:362 netbox/ipam/forms/filtersets.py:171 +#: netbox/netbox/navigation/menu.py:108 +#: netbox/templates/dcim/interface.html:128 +#: netbox/templates/ipam/prefix.html:91 +#: netbox/templates/virtualization/vminterface.html:70 +#: netbox/virtualization/forms/model_forms.py:370 msgid "Addressing" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1551 netbox/dcim/forms/filtersets.py:720 -#: netbox/dcim/forms/model_forms.py:1398 -#: netbox/virtualization/forms/model_forms.py:350 +#: netbox/dcim/forms/bulk_edit.py:1564 netbox/dcim/forms/filtersets.py:721 +#: netbox/dcim/forms/model_forms.py:1436 +#: netbox/virtualization/forms/model_forms.py:371 msgid "Operation" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1552 netbox/dcim/forms/filtersets.py:1329 -#: netbox/dcim/forms/model_forms.py:994 netbox/dcim/forms/model_forms.py:1400 +#: netbox/dcim/forms/bulk_edit.py:1565 netbox/dcim/forms/filtersets.py:1334 +#: netbox/dcim/forms/model_forms.py:1006 netbox/dcim/forms/model_forms.py:1438 msgid "PoE" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1553 netbox/dcim/forms/model_forms.py:1399 -#: netbox/templates/dcim/interface.html:99 -#: netbox/virtualization/forms/bulk_edit.py:267 -#: netbox/virtualization/forms/model_forms.py:351 +#: netbox/dcim/forms/bulk_edit.py:1566 netbox/dcim/forms/model_forms.py:1437 +#: netbox/templates/dcim/interface.html:105 +#: netbox/virtualization/forms/bulk_edit.py:249 +#: netbox/virtualization/forms/model_forms.py:372 msgid "Related Interfaces" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1554 netbox/dcim/forms/model_forms.py:1401 -#: netbox/virtualization/forms/bulk_edit.py:268 -#: netbox/virtualization/forms/model_forms.py:352 +#: netbox/dcim/forms/bulk_edit.py:1567 netbox/dcim/forms/model_forms.py:1441 +#: netbox/virtualization/forms/bulk_edit.py:250 +#: netbox/virtualization/forms/model_forms.py:375 msgid "802.1Q Switching" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1558 +#: netbox/dcim/forms/bulk_edit.py:1571 msgid "Add/Remove" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1617 netbox/dcim/forms/bulk_edit.py:1619 +#: netbox/dcim/forms/bulk_edit.py:1630 netbox/dcim/forms/bulk_edit.py:1632 msgid "Interface mode must be specified to assign VLANs" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:1624 netbox/dcim/forms/common.py:50 +#: netbox/dcim/forms/bulk_edit.py:1637 netbox/dcim/forms/common.py:51 msgid "An access interface cannot have tagged VLANs assigned." msgstr "" -#: netbox/dcim/forms/bulk_import.py:64 +#: netbox/dcim/forms/bulk_import.py:66 msgid "Name of parent region" msgstr "" -#: netbox/dcim/forms/bulk_import.py:78 +#: netbox/dcim/forms/bulk_import.py:80 msgid "Name of parent site group" msgstr "" -#: netbox/dcim/forms/bulk_import.py:97 +#: netbox/dcim/forms/bulk_import.py:99 msgid "Assigned region" msgstr "" -#: netbox/dcim/forms/bulk_import.py:104 netbox/tenancy/forms/bulk_import.py:44 +#: netbox/dcim/forms/bulk_import.py:106 netbox/tenancy/forms/bulk_import.py:44 #: netbox/tenancy/forms/bulk_import.py:85 -#: netbox/wireless/forms/bulk_import.py:40 +#: netbox/wireless/forms/bulk_import.py:42 msgid "Assigned group" msgstr "" -#: netbox/dcim/forms/bulk_import.py:123 +#: netbox/dcim/forms/bulk_import.py:125 msgid "available options" msgstr "" -#: netbox/dcim/forms/bulk_import.py:134 netbox/dcim/forms/bulk_import.py:565 -#: netbox/dcim/forms/bulk_import.py:1364 netbox/ipam/forms/bulk_import.py:175 -#: netbox/ipam/forms/bulk_import.py:457 -#: netbox/virtualization/forms/bulk_import.py:63 -#: netbox/virtualization/forms/bulk_import.py:89 +#: netbox/dcim/forms/bulk_import.py:136 netbox/dcim/forms/bulk_import.py:570 +#: netbox/dcim/forms/bulk_import.py:1461 netbox/ipam/forms/bulk_import.py:456 +#: netbox/virtualization/forms/bulk_import.py:64 +#: netbox/virtualization/forms/bulk_import.py:95 msgid "Assigned site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:141 +#: netbox/dcim/forms/bulk_import.py:143 msgid "Parent location" msgstr "" -#: netbox/dcim/forms/bulk_import.py:143 +#: netbox/dcim/forms/bulk_import.py:145 msgid "Location not found." msgstr "" -#: netbox/dcim/forms/bulk_import.py:185 +#: netbox/dcim/forms/bulk_import.py:187 msgid "The manufacturer of this rack type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:196 +#: netbox/dcim/forms/bulk_import.py:198 msgid "The lowest-numbered position in the rack" msgstr "" -#: netbox/dcim/forms/bulk_import.py:201 netbox/dcim/forms/bulk_import.py:276 +#: netbox/dcim/forms/bulk_import.py:203 netbox/dcim/forms/bulk_import.py:278 msgid "Rail-to-rail width (in inches)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:207 netbox/dcim/forms/bulk_import.py:286 +#: netbox/dcim/forms/bulk_import.py:209 netbox/dcim/forms/bulk_import.py:288 msgid "Unit for outer dimensions" msgstr "" -#: netbox/dcim/forms/bulk_import.py:213 netbox/dcim/forms/bulk_import.py:298 +#: netbox/dcim/forms/bulk_import.py:215 netbox/dcim/forms/bulk_import.py:300 msgid "Unit for rack weights" msgstr "" -#: netbox/dcim/forms/bulk_import.py:245 +#: netbox/dcim/forms/bulk_import.py:247 msgid "Name of assigned tenant" msgstr "" -#: netbox/dcim/forms/bulk_import.py:257 +#: netbox/dcim/forms/bulk_import.py:259 msgid "Name of assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:264 +#: netbox/dcim/forms/bulk_import.py:266 msgid "Rack type model" msgstr "" -#: netbox/dcim/forms/bulk_import.py:292 netbox/dcim/forms/bulk_import.py:435 -#: netbox/dcim/forms/bulk_import.py:605 +#: netbox/dcim/forms/bulk_import.py:294 netbox/dcim/forms/bulk_import.py:437 +#: netbox/dcim/forms/bulk_import.py:610 msgid "Airflow direction" msgstr "" -#: netbox/dcim/forms/bulk_import.py:324 +#: netbox/dcim/forms/bulk_import.py:326 msgid "Width must be set if not specifying a rack type." msgstr "" -#: netbox/dcim/forms/bulk_import.py:326 +#: netbox/dcim/forms/bulk_import.py:328 msgid "U height must be set if not specifying a rack type." msgstr "" -#: netbox/dcim/forms/bulk_import.py:334 +#: netbox/dcim/forms/bulk_import.py:336 msgid "Parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:341 netbox/dcim/forms/bulk_import.py:1377 +#: netbox/dcim/forms/bulk_import.py:343 netbox/dcim/forms/bulk_import.py:1474 msgid "Rack's location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:350 netbox/dcim/forms/model_forms.py:311 -#: netbox/dcim/tables/racks.py:222 +#: netbox/dcim/forms/bulk_import.py:352 netbox/dcim/forms/model_forms.py:319 +#: netbox/dcim/tables/racks.py:221 #: netbox/templates/dcim/rackreservation.html:12 #: netbox/templates/dcim/rackreservation.html:45 msgid "Units" msgstr "" -#: netbox/dcim/forms/bulk_import.py:353 +#: netbox/dcim/forms/bulk_import.py:355 msgid "Comma-separated list of individual unit numbers" msgstr "" -#: netbox/dcim/forms/bulk_import.py:396 +#: netbox/dcim/forms/bulk_import.py:398 msgid "The manufacturer which produces this device type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:403 +#: netbox/dcim/forms/bulk_import.py:405 msgid "The default platform for devices of this type (optional)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:408 +#: netbox/dcim/forms/bulk_import.py:410 msgid "Device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:414 +#: netbox/dcim/forms/bulk_import.py:416 msgid "Unit for device weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:440 +#: netbox/dcim/forms/bulk_import.py:442 msgid "Module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:446 +#: netbox/dcim/forms/bulk_import.py:448 msgid "Unit for module weight" msgstr "" -#: netbox/dcim/forms/bulk_import.py:476 +#: netbox/dcim/forms/bulk_import.py:481 msgid "Limit platform assignments to this manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:498 netbox/dcim/forms/bulk_import.py:1447 +#: netbox/dcim/forms/bulk_import.py:503 netbox/dcim/forms/bulk_import.py:1544 #: netbox/tenancy/forms/bulk_import.py:106 msgid "Assigned role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:511 +#: netbox/dcim/forms/bulk_import.py:516 msgid "Device type manufacturer" msgstr "" -#: netbox/dcim/forms/bulk_import.py:517 +#: netbox/dcim/forms/bulk_import.py:522 msgid "Device type model" msgstr "" -#: netbox/dcim/forms/bulk_import.py:524 -#: netbox/virtualization/forms/bulk_import.py:126 +#: netbox/dcim/forms/bulk_import.py:529 +#: netbox/virtualization/forms/bulk_import.py:132 msgid "Assigned platform" msgstr "" -#: netbox/dcim/forms/bulk_import.py:532 netbox/dcim/forms/bulk_import.py:536 -#: netbox/dcim/forms/model_forms.py:536 +#: netbox/dcim/forms/bulk_import.py:537 netbox/dcim/forms/bulk_import.py:541 +#: netbox/dcim/forms/model_forms.py:547 msgid "Virtual chassis" msgstr "" -#: netbox/dcim/forms/bulk_import.py:543 +#: netbox/dcim/forms/bulk_import.py:548 msgid "Virtualization cluster" msgstr "" -#: netbox/dcim/forms/bulk_import.py:572 +#: netbox/dcim/forms/bulk_import.py:577 msgid "Assigned location (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:579 +#: netbox/dcim/forms/bulk_import.py:584 msgid "Assigned rack (if any)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:582 +#: netbox/dcim/forms/bulk_import.py:587 msgid "Face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:585 +#: netbox/dcim/forms/bulk_import.py:590 msgid "Mounted rack face" msgstr "" -#: netbox/dcim/forms/bulk_import.py:592 +#: netbox/dcim/forms/bulk_import.py:597 msgid "Parent device (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:595 +#: netbox/dcim/forms/bulk_import.py:600 msgid "Device bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:599 +#: netbox/dcim/forms/bulk_import.py:604 msgid "Device bay in which this device is installed (for child devices)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:666 +#: netbox/dcim/forms/bulk_import.py:671 msgid "The device in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:669 netbox/dcim/forms/model_forms.py:640 +#: netbox/dcim/forms/bulk_import.py:674 netbox/dcim/forms/model_forms.py:651 msgid "Module bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:672 +#: netbox/dcim/forms/bulk_import.py:677 msgid "The module bay in which this module is installed" msgstr "" -#: netbox/dcim/forms/bulk_import.py:678 +#: netbox/dcim/forms/bulk_import.py:683 msgid "The type of module" msgstr "" -#: netbox/dcim/forms/bulk_import.py:686 netbox/dcim/forms/model_forms.py:656 +#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:667 msgid "Replicate components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:688 +#: netbox/dcim/forms/bulk_import.py:693 msgid "" "Automatically populate components associated with this module type (enabled " "by default)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:691 netbox/dcim/forms/model_forms.py:662 +#: netbox/dcim/forms/bulk_import.py:696 netbox/dcim/forms/model_forms.py:673 msgid "Adopt components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:693 netbox/dcim/forms/model_forms.py:665 +#: netbox/dcim/forms/bulk_import.py:698 netbox/dcim/forms/model_forms.py:676 msgid "Adopt already existing components" msgstr "" -#: netbox/dcim/forms/bulk_import.py:733 netbox/dcim/forms/bulk_import.py:759 -#: netbox/dcim/forms/bulk_import.py:785 +#: netbox/dcim/forms/bulk_import.py:738 netbox/dcim/forms/bulk_import.py:764 +#: netbox/dcim/forms/bulk_import.py:790 msgid "Port type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:741 netbox/dcim/forms/bulk_import.py:767 +#: netbox/dcim/forms/bulk_import.py:746 netbox/dcim/forms/bulk_import.py:772 msgid "Port speed in bps" msgstr "" -#: netbox/dcim/forms/bulk_import.py:805 +#: netbox/dcim/forms/bulk_import.py:810 msgid "Outlet type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:812 +#: netbox/dcim/forms/bulk_import.py:817 msgid "Local power port which feeds this outlet" msgstr "" -#: netbox/dcim/forms/bulk_import.py:818 +#: netbox/dcim/forms/bulk_import.py:823 msgid "Electrical phase (for three-phase circuits)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:859 netbox/dcim/forms/model_forms.py:1323 -#: netbox/virtualization/forms/bulk_import.py:155 -#: netbox/virtualization/forms/model_forms.py:305 +#: netbox/dcim/forms/bulk_import.py:867 netbox/dcim/forms/model_forms.py:1339 +#: netbox/virtualization/forms/bulk_import.py:161 +#: netbox/virtualization/forms/model_forms.py:311 msgid "Parent interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:866 netbox/dcim/forms/model_forms.py:1331 -#: netbox/virtualization/forms/bulk_import.py:162 -#: netbox/virtualization/forms/model_forms.py:313 +#: netbox/dcim/forms/bulk_import.py:874 netbox/dcim/forms/model_forms.py:1347 +#: netbox/virtualization/forms/bulk_import.py:168 +#: netbox/virtualization/forms/model_forms.py:319 msgid "Bridged interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:869 +#: netbox/dcim/forms/bulk_import.py:877 msgid "Lag" msgstr "" -#: netbox/dcim/forms/bulk_import.py:873 +#: netbox/dcim/forms/bulk_import.py:881 msgid "Parent LAG interface" msgstr "" -#: netbox/dcim/forms/bulk_import.py:876 +#: netbox/dcim/forms/bulk_import.py:884 msgid "Vdcs" msgstr "" -#: netbox/dcim/forms/bulk_import.py:881 +#: netbox/dcim/forms/bulk_import.py:889 msgid "VDC names separated by commas, encased with double quotes. Example:" msgstr "" -#: netbox/dcim/forms/bulk_import.py:887 +#: netbox/dcim/forms/bulk_import.py:895 msgid "Physical medium" msgstr "" -#: netbox/dcim/forms/bulk_import.py:890 netbox/dcim/forms/filtersets.py:1365 +#: netbox/dcim/forms/bulk_import.py:898 netbox/dcim/forms/filtersets.py:1370 msgid "Duplex" msgstr "" -#: netbox/dcim/forms/bulk_import.py:895 +#: netbox/dcim/forms/bulk_import.py:903 msgid "Poe mode" msgstr "" -#: netbox/dcim/forms/bulk_import.py:901 +#: netbox/dcim/forms/bulk_import.py:909 msgid "Poe type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:910 -#: netbox/virtualization/forms/bulk_import.py:168 +#: netbox/dcim/forms/bulk_import.py:918 +#: netbox/virtualization/forms/bulk_import.py:174 msgid "IEEE 802.1Q operational mode (for L2 interfaces)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:917 netbox/ipam/forms/bulk_import.py:161 -#: netbox/ipam/forms/bulk_import.py:247 netbox/ipam/forms/bulk_import.py:283 -#: netbox/ipam/forms/filtersets.py:201 netbox/ipam/forms/filtersets.py:277 -#: netbox/ipam/forms/filtersets.py:336 -#: netbox/virtualization/forms/bulk_import.py:175 +#: netbox/dcim/forms/bulk_import.py:925 netbox/ipam/forms/bulk_import.py:164 +#: netbox/ipam/forms/bulk_import.py:246 netbox/ipam/forms/bulk_import.py:282 +#: netbox/ipam/forms/filtersets.py:203 netbox/ipam/forms/filtersets.py:280 +#: netbox/ipam/forms/filtersets.py:339 +#: netbox/virtualization/forms/bulk_import.py:181 msgid "Assigned VRF" msgstr "" -#: netbox/dcim/forms/bulk_import.py:920 +#: netbox/dcim/forms/bulk_import.py:928 msgid "Rf role" msgstr "" -#: netbox/dcim/forms/bulk_import.py:923 +#: netbox/dcim/forms/bulk_import.py:931 msgid "Wireless role (AP/station)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:959 +#: netbox/dcim/forms/bulk_import.py:967 #, python-brace-format msgid "VDC {vdc} is not assigned to device {device}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:973 netbox/dcim/forms/model_forms.py:1007 -#: netbox/dcim/forms/model_forms.py:1582 netbox/dcim/forms/object_import.py:117 +#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/model_forms.py:1020 +#: netbox/dcim/forms/model_forms.py:1624 netbox/dcim/forms/object_import.py:117 msgid "Rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:976 +#: netbox/dcim/forms/bulk_import.py:984 msgid "Corresponding rear port" msgstr "" -#: netbox/dcim/forms/bulk_import.py:981 netbox/dcim/forms/bulk_import.py:1022 -#: netbox/dcim/forms/bulk_import.py:1238 +#: netbox/dcim/forms/bulk_import.py:989 netbox/dcim/forms/bulk_import.py:1030 +#: netbox/dcim/forms/bulk_import.py:1335 msgid "Physical medium classification" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1050 netbox/dcim/tables/devices.py:822 +#: netbox/dcim/forms/bulk_import.py:1058 netbox/dcim/tables/devices.py:853 msgid "Installed device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1054 +#: netbox/dcim/forms/bulk_import.py:1062 msgid "Child device installed within this bay" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1056 +#: netbox/dcim/forms/bulk_import.py:1064 msgid "Child device not found." msgstr "" -#: netbox/dcim/forms/bulk_import.py:1114 +#: netbox/dcim/forms/bulk_import.py:1122 msgid "Parent inventory item" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1117 +#: netbox/dcim/forms/bulk_import.py:1125 msgid "Component type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1121 +#: netbox/dcim/forms/bulk_import.py:1129 msgid "Component Type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1124 +#: netbox/dcim/forms/bulk_import.py:1132 msgid "Compnent name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1126 +#: netbox/dcim/forms/bulk_import.py:1134 msgid "Component Name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1168 +#: netbox/dcim/forms/bulk_import.py:1181 #, python-brace-format msgid "Component not found: {device} - {component_name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1193 +#: netbox/dcim/forms/bulk_import.py:1209 netbox/ipam/forms/bulk_import.py:307 +msgid "Parent device of assigned interface (if any)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1212 netbox/ipam/forms/bulk_import.py:310 +#: netbox/ipam/forms/bulk_import.py:547 netbox/ipam/forms/model_forms.py:760 +#: netbox/virtualization/filtersets.py:254 +#: netbox/virtualization/filtersets.py:305 +#: netbox/virtualization/forms/bulk_edit.py:182 +#: netbox/virtualization/forms/bulk_edit.py:308 +#: netbox/virtualization/forms/bulk_import.py:152 +#: netbox/virtualization/forms/bulk_import.py:213 +#: netbox/virtualization/forms/filtersets.py:217 +#: netbox/virtualization/forms/filtersets.py:253 +#: netbox/virtualization/forms/model_forms.py:287 +#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 +msgid "Virtual machine" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1216 netbox/ipam/forms/bulk_import.py:314 +msgid "Parent VM of assigned interface (if any)" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1223 netbox/ipam/filtersets.py:1021 +#: netbox/ipam/forms/bulk_import.py:321 +msgid "Assigned interface" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1226 netbox/ipam/forms/bulk_import.py:324 +msgid "Is primary" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1227 +msgid "Make this the primary MAC address for the assigned interface" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1264 +msgid "Must specify the parent device or VM when assigning an interface" +msgstr "" + +#: netbox/dcim/forms/bulk_import.py:1290 msgid "Side A device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1196 netbox/dcim/forms/bulk_import.py:1214 +#: netbox/dcim/forms/bulk_import.py:1293 netbox/dcim/forms/bulk_import.py:1311 msgid "Device name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1199 +#: netbox/dcim/forms/bulk_import.py:1296 msgid "Side A type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1202 netbox/dcim/forms/bulk_import.py:1220 -msgid "Termination type" -msgstr "" - -#: netbox/dcim/forms/bulk_import.py:1205 +#: netbox/dcim/forms/bulk_import.py:1302 msgid "Side A name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1206 netbox/dcim/forms/bulk_import.py:1224 +#: netbox/dcim/forms/bulk_import.py:1303 netbox/dcim/forms/bulk_import.py:1321 msgid "Termination name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1211 +#: netbox/dcim/forms/bulk_import.py:1308 msgid "Side B device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1217 +#: netbox/dcim/forms/bulk_import.py:1314 msgid "Side B type" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1223 +#: netbox/dcim/forms/bulk_import.py:1320 msgid "Side B name" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1232 -#: netbox/wireless/forms/bulk_import.py:86 +#: netbox/dcim/forms/bulk_import.py:1329 +#: netbox/wireless/forms/bulk_import.py:91 msgid "Connection status" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1284 +#: netbox/dcim/forms/bulk_import.py:1381 #, python-brace-format msgid "Side {side_upper}: {device} {termination_object} is already connected" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1290 +#: netbox/dcim/forms/bulk_import.py:1387 #, python-brace-format msgid "{side_upper} side termination not found: {device} {name}" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1315 netbox/dcim/forms/model_forms.py:785 -#: netbox/dcim/tables/devices.py:1027 netbox/templates/dcim/device.html:132 +#: netbox/dcim/forms/bulk_import.py:1412 netbox/dcim/forms/model_forms.py:797 +#: netbox/dcim/tables/devices.py:1058 netbox/templates/dcim/device.html:132 #: netbox/templates/dcim/virtualchassis.html:27 #: netbox/templates/dcim/virtualchassis.html:67 msgid "Master" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1319 +#: netbox/dcim/forms/bulk_import.py:1416 msgid "Master device" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1336 +#: netbox/dcim/forms/bulk_import.py:1433 msgid "Name of parent site" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1370 +#: netbox/dcim/forms/bulk_import.py:1467 msgid "Upstream power panel" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1400 +#: netbox/dcim/forms/bulk_import.py:1497 msgid "Primary or redundant" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1405 +#: netbox/dcim/forms/bulk_import.py:1502 msgid "Supply type (AC/DC)" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1410 +#: netbox/dcim/forms/bulk_import.py:1507 msgid "Single or three-phase" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1461 netbox/dcim/forms/model_forms.py:1677 +#: netbox/dcim/forms/bulk_import.py:1558 netbox/dcim/forms/model_forms.py:1722 #: netbox/templates/dcim/device.html:190 #: netbox/templates/dcim/virtualdevicecontext.html:30 #: netbox/templates/virtualization/virtualmachine.html:52 msgid "Primary IPv4" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1465 +#: netbox/dcim/forms/bulk_import.py:1562 msgid "IPv4 address with mask, e.g. 1.2.3.4/24" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1468 netbox/dcim/forms/model_forms.py:1686 +#: netbox/dcim/forms/bulk_import.py:1565 netbox/dcim/forms/model_forms.py:1731 #: netbox/templates/dcim/device.html:206 #: netbox/templates/dcim/virtualdevicecontext.html:41 #: netbox/templates/virtualization/virtualmachine.html:68 msgid "Primary IPv6" msgstr "" -#: netbox/dcim/forms/bulk_import.py:1472 +#: netbox/dcim/forms/bulk_import.py:1569 msgid "IPv6 address with prefix length, e.g. 2001:db8::1/64" msgstr "" -#: netbox/dcim/forms/common.py:24 netbox/dcim/models/device_components.py:527 +#: netbox/dcim/forms/common.py:19 netbox/dcim/models/device_components.py:515 #: netbox/templates/dcim/interface.html:57 -#: netbox/templates/virtualization/vminterface.html:55 -#: netbox/virtualization/forms/bulk_edit.py:225 +#: netbox/templates/virtualization/vminterface.html:51 +#: netbox/virtualization/forms/bulk_edit.py:207 msgid "MTU" msgstr "" -#: netbox/dcim/forms/common.py:65 +#: netbox/dcim/forms/common.py:66 #, python-brace-format msgid "" "The tagged VLANs ({vlans}) must belong to the same site as the interface's " "parent device/VM, or they must be global" msgstr "" -#: netbox/dcim/forms/common.py:126 +#: netbox/dcim/forms/common.py:127 msgid "" "Cannot install module with placeholder values in a module bay with no " "position defined." msgstr "" -#: netbox/dcim/forms/common.py:131 +#: netbox/dcim/forms/common.py:133 #, python-brace-format msgid "" "Cannot install module with placeholder values in a module bay tree {level} " "in tree but {tokens} placeholders given." msgstr "" -#: netbox/dcim/forms/common.py:144 +#: netbox/dcim/forms/common.py:148 #, python-brace-format msgid "Cannot adopt {model} {name} as it already belongs to a module" msgstr "" -#: netbox/dcim/forms/common.py:153 +#: netbox/dcim/forms/common.py:157 #, python-brace-format msgid "A {model} named {name} already exists" msgstr "" -#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:738 +#: netbox/dcim/forms/connections.py:49 netbox/dcim/forms/model_forms.py:749 #: netbox/dcim/tables/power.py:66 #: netbox/templates/dcim/inc/cable_termination.html:37 #: netbox/templates/dcim/powerfeed.html:24 @@ -4606,135 +5016,133 @@ msgstr "" msgid "Power Panel" msgstr "" -#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:765 +#: netbox/dcim/forms/connections.py:58 netbox/dcim/forms/model_forms.py:777 #: netbox/templates/dcim/powerfeed.html:21 #: netbox/templates/dcim/powerport.html:80 msgid "Power Feed" msgstr "" -#: netbox/dcim/forms/connections.py:81 -msgid "Side" -msgstr "" - -#: netbox/dcim/forms/filtersets.py:136 netbox/dcim/tables/devices.py:295 +#: netbox/dcim/forms/filtersets.py:137 netbox/dcim/tables/devices.py:304 msgid "Device Status" msgstr "" -#: netbox/dcim/forms/filtersets.py:149 +#: netbox/dcim/forms/filtersets.py:150 msgid "Parent region" msgstr "" -#: netbox/dcim/forms/filtersets.py:163 netbox/tenancy/forms/bulk_import.py:28 +#: netbox/dcim/forms/filtersets.py:164 netbox/tenancy/forms/bulk_import.py:28 #: netbox/tenancy/forms/bulk_import.py:62 netbox/tenancy/forms/filtersets.py:33 #: netbox/tenancy/forms/filtersets.py:62 -#: netbox/wireless/forms/bulk_import.py:25 -#: netbox/wireless/forms/filtersets.py:25 +#: netbox/wireless/forms/bulk_import.py:27 +#: netbox/wireless/forms/filtersets.py:27 msgid "Parent group" msgstr "" -#: netbox/dcim/forms/filtersets.py:242 netbox/templates/dcim/location.html:58 +#: netbox/dcim/forms/filtersets.py:243 netbox/templates/dcim/location.html:58 #: netbox/templates/dcim/site.html:56 msgid "Facility" msgstr "" -#: netbox/dcim/forms/filtersets.py:397 +#: netbox/dcim/forms/filtersets.py:398 msgid "Function" msgstr "" -#: netbox/dcim/forms/filtersets.py:483 netbox/dcim/forms/model_forms.py:373 +#: netbox/dcim/forms/filtersets.py:484 netbox/dcim/forms/model_forms.py:382 #: netbox/templates/inc/panels/image_attachments.html:6 msgid "Images" msgstr "" -#: netbox/dcim/forms/filtersets.py:486 netbox/dcim/forms/filtersets.py:611 -#: netbox/dcim/forms/filtersets.py:726 +#: netbox/dcim/forms/filtersets.py:487 netbox/dcim/forms/filtersets.py:612 +#: netbox/dcim/forms/filtersets.py:727 msgid "Components" msgstr "" -#: netbox/dcim/forms/filtersets.py:506 +#: netbox/dcim/forms/filtersets.py:507 msgid "Subdevice role" msgstr "" -#: netbox/dcim/forms/filtersets.py:790 netbox/dcim/tables/racks.py:54 +#: netbox/dcim/forms/filtersets.py:791 netbox/dcim/tables/racks.py:54 #: netbox/templates/dcim/racktype.html:20 msgid "Model" msgstr "" -#: netbox/dcim/forms/filtersets.py:834 +#: netbox/dcim/forms/filtersets.py:835 msgid "Has an OOB IP" msgstr "" -#: netbox/dcim/forms/filtersets.py:841 +#: netbox/dcim/forms/filtersets.py:842 msgid "Virtual chassis member" msgstr "" -#: netbox/dcim/forms/filtersets.py:890 +#: netbox/dcim/forms/filtersets.py:891 msgid "Has virtual device contexts" msgstr "" -#: netbox/dcim/forms/filtersets.py:903 netbox/extras/filtersets.py:585 -#: netbox/ipam/forms/filtersets.py:452 -#: netbox/virtualization/forms/filtersets.py:112 +#: netbox/dcim/forms/filtersets.py:904 netbox/extras/filtersets.py:585 +#: netbox/ipam/forms/filtersets.py:455 +#: netbox/virtualization/forms/filtersets.py:117 msgid "Cluster group" msgstr "" -#: netbox/dcim/forms/filtersets.py:1210 +#: netbox/dcim/forms/filtersets.py:1211 msgid "Cabled" msgstr "" -#: netbox/dcim/forms/filtersets.py:1217 +#: netbox/dcim/forms/filtersets.py:1218 msgid "Occupied" msgstr "" -#: netbox/dcim/forms/filtersets.py:1244 netbox/dcim/forms/filtersets.py:1269 -#: netbox/dcim/forms/filtersets.py:1293 netbox/dcim/forms/filtersets.py:1313 -#: netbox/dcim/forms/filtersets.py:1336 netbox/dcim/tables/devices.py:364 +#: netbox/dcim/forms/filtersets.py:1245 netbox/dcim/forms/filtersets.py:1270 +#: netbox/dcim/forms/filtersets.py:1294 netbox/dcim/forms/filtersets.py:1314 +#: netbox/dcim/forms/filtersets.py:1341 netbox/dcim/tables/devices.py:373 +#: netbox/dcim/tables/devices.py:662 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:16 #: netbox/templates/dcim/consoleport.html:55 #: netbox/templates/dcim/consoleserverport.html:55 #: netbox/templates/dcim/frontport.html:69 -#: netbox/templates/dcim/interface.html:140 +#: netbox/templates/dcim/interface.html:197 #: netbox/templates/dcim/powerfeed.html:110 -#: netbox/templates/dcim/poweroutlet.html:59 +#: netbox/templates/dcim/poweroutlet.html:69 #: netbox/templates/dcim/powerport.html:59 #: netbox/templates/dcim/rearport.html:65 msgid "Connection" msgstr "" -#: netbox/dcim/forms/filtersets.py:1348 netbox/extras/forms/bulk_edit.py:326 +#: netbox/dcim/forms/filtersets.py:1353 netbox/extras/forms/bulk_edit.py:326 #: netbox/extras/forms/bulk_import.py:247 netbox/extras/forms/filtersets.py:464 #: netbox/extras/forms/model_forms.py:675 netbox/extras/tables/tables.py:579 #: netbox/templates/extras/journalentry.html:30 msgid "Kind" msgstr "" -#: netbox/dcim/forms/filtersets.py:1377 +#: netbox/dcim/forms/filtersets.py:1382 msgid "Mgmt only" msgstr "" -#: netbox/dcim/forms/filtersets.py:1389 netbox/dcim/forms/model_forms.py:1390 -#: netbox/dcim/models/device_components.py:629 -#: netbox/templates/dcim/interface.html:129 +#: netbox/dcim/forms/filtersets.py:1394 netbox/dcim/forms/model_forms.py:1423 +#: netbox/dcim/models/device_components.py:677 +#: netbox/templates/dcim/interface.html:142 msgid "WWN" msgstr "" -#: netbox/dcim/forms/filtersets.py:1409 +#: netbox/dcim/forms/filtersets.py:1414 msgid "Wireless channel" msgstr "" -#: netbox/dcim/forms/filtersets.py:1413 +#: netbox/dcim/forms/filtersets.py:1418 msgid "Channel frequency (MHz)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1417 +#: netbox/dcim/forms/filtersets.py:1422 msgid "Channel width (MHz)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1421 netbox/templates/dcim/interface.html:85 +#: netbox/dcim/forms/filtersets.py:1426 netbox/templates/dcim/interface.html:91 msgid "Transmit power (dBm)" msgstr "" -#: netbox/dcim/forms/filtersets.py:1446 netbox/dcim/forms/filtersets.py:1471 -#: netbox/dcim/tables/devices.py:327 netbox/templates/dcim/cable.html:12 +#: netbox/dcim/forms/filtersets.py:1451 netbox/dcim/forms/filtersets.py:1476 +#: netbox/dcim/tables/devices.py:336 netbox/templates/dcim/cable.html:12 #: netbox/templates/dcim/cable_trace.html:46 #: netbox/templates/dcim/frontport.html:77 #: netbox/templates/dcim/htmx/cable_edit.html:50 @@ -4744,73 +5152,109 @@ msgstr "" msgid "Cable" msgstr "" -#: netbox/dcim/forms/filtersets.py:1550 netbox/dcim/tables/devices.py:949 +#: netbox/dcim/forms/filtersets.py:1555 netbox/dcim/tables/devices.py:978 msgid "Discovered" msgstr "" +#: netbox/dcim/forms/filtersets.py:1596 netbox/ipam/forms/filtersets.py:350 +msgid "Assigned Device" +msgstr "" + +#: netbox/dcim/forms/filtersets.py:1601 netbox/ipam/forms/filtersets.py:355 +msgid "Assigned VM" +msgstr "" + #: netbox/dcim/forms/formsets.py:20 #, python-brace-format msgid "A virtual chassis member already exists in position {vc_position}." msgstr "" -#: netbox/dcim/forms/model_forms.py:140 +#: netbox/dcim/forms/mixins.py:27 netbox/dcim/forms/mixins.py:75 +#: netbox/ipam/forms/bulk_edit.py:420 netbox/ipam/forms/model_forms.py:610 +msgid "Scope type" +msgstr "" + +#: netbox/dcim/forms/mixins.py:30 netbox/dcim/forms/mixins.py:78 +#: netbox/ipam/forms/bulk_edit.py:270 netbox/ipam/forms/bulk_edit.py:423 +#: netbox/ipam/forms/bulk_edit.py:437 netbox/ipam/forms/filtersets.py:175 +#: netbox/ipam/forms/model_forms.py:231 netbox/ipam/forms/model_forms.py:613 +#: netbox/ipam/forms/model_forms.py:623 netbox/ipam/tables/ip.py:194 +#: netbox/ipam/tables/vlans.py:40 netbox/templates/ipam/prefix.html:48 +#: netbox/templates/ipam/vlangroup.html:38 +#: netbox/templates/virtualization/cluster.html:42 +#: netbox/templates/wireless/wirelesslan.html:26 +#: netbox/virtualization/forms/bulk_edit.py:91 +#: netbox/virtualization/forms/filtersets.py:46 +#: netbox/virtualization/forms/model_forms.py:78 +#: netbox/virtualization/tables/clusters.py:80 +#: netbox/wireless/forms/bulk_edit.py:93 netbox/wireless/forms/filtersets.py:37 +#: netbox/wireless/forms/model_forms.py:56 +#: netbox/wireless/tables/wirelesslan.py:58 +msgid "Scope" +msgstr "" + +#: netbox/dcim/forms/mixins.py:104 netbox/ipam/forms/bulk_import.py:436 +msgid "Scope type (app & model)" +msgstr "" + +#: netbox/dcim/forms/model_forms.py:144 msgid "Contact Info" msgstr "" -#: netbox/dcim/forms/model_forms.py:195 netbox/templates/dcim/rackrole.html:19 +#: netbox/dcim/forms/model_forms.py:199 netbox/templates/dcim/rackrole.html:19 msgid "Rack Role" msgstr "" -#: netbox/dcim/forms/model_forms.py:212 netbox/dcim/forms/model_forms.py:362 -#: netbox/dcim/forms/model_forms.py:446 +#: netbox/dcim/forms/model_forms.py:217 netbox/dcim/forms/model_forms.py:371 +#: netbox/dcim/forms/model_forms.py:456 #: netbox/utilities/forms/fields/fields.py:47 msgid "Slug" msgstr "" -#: netbox/dcim/forms/model_forms.py:259 +#: netbox/dcim/forms/model_forms.py:264 msgid "Select a pre-defined rack type, or set physical characteristics below." msgstr "" -#: netbox/dcim/forms/model_forms.py:265 +#: netbox/dcim/forms/model_forms.py:273 msgid "Inventory Control" msgstr "" -#: netbox/dcim/forms/model_forms.py:313 +#: netbox/dcim/forms/model_forms.py:321 msgid "" "Comma-separated list of numeric unit IDs. A range may be specified using a " "hyphen." msgstr "" -#: netbox/dcim/forms/model_forms.py:322 netbox/dcim/tables/racks.py:202 +#: netbox/dcim/forms/model_forms.py:330 netbox/dcim/tables/racks.py:201 msgid "Reservation" msgstr "" -#: netbox/dcim/forms/model_forms.py:423 +#: netbox/dcim/forms/model_forms.py:432 #: netbox/templates/dcim/devicerole.html:23 msgid "Device Role" msgstr "" -#: netbox/dcim/forms/model_forms.py:490 netbox/dcim/models/devices.py:644 +#: netbox/dcim/forms/model_forms.py:500 netbox/dcim/models/devices.py:634 msgid "The lowest-numbered unit occupied by the device" msgstr "" -#: netbox/dcim/forms/model_forms.py:547 +#: netbox/dcim/forms/model_forms.py:558 msgid "The position in the virtual chassis this device is identified by" msgstr "" -#: netbox/dcim/forms/model_forms.py:552 +#: netbox/dcim/forms/model_forms.py:563 msgid "The priority of the device in the virtual chassis" msgstr "" -#: netbox/dcim/forms/model_forms.py:659 +#: netbox/dcim/forms/model_forms.py:670 msgid "Automatically populate components associated with this module type" msgstr "" -#: netbox/dcim/forms/model_forms.py:767 +#: netbox/dcim/forms/model_forms.py:779 msgid "Characteristics" msgstr "" -#: netbox/dcim/forms/model_forms.py:914 +#: netbox/dcim/forms/model_forms.py:926 #, python-brace-format msgid "" "Alphanumeric ranges are supported for bulk creation. Mixed cases and types " @@ -4819,59 +5263,35 @@ msgid "" "replaced with the position value when creating a new module." msgstr "" -#: netbox/dcim/forms/model_forms.py:1094 +#: netbox/dcim/forms/model_forms.py:1107 msgid "Console port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1102 +#: netbox/dcim/forms/model_forms.py:1115 msgid "Console server port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1110 +#: netbox/dcim/forms/model_forms.py:1123 msgid "Front port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1118 +#: netbox/dcim/forms/model_forms.py:1131 msgid "Interface template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1126 +#: netbox/dcim/forms/model_forms.py:1139 msgid "Power outlet template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1134 +#: netbox/dcim/forms/model_forms.py:1147 msgid "Power port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1142 +#: netbox/dcim/forms/model_forms.py:1155 msgid "Rear port template" msgstr "" -#: netbox/dcim/forms/model_forms.py:1151 netbox/dcim/forms/model_forms.py:1395 -#: netbox/dcim/forms/model_forms.py:1558 netbox/dcim/forms/model_forms.py:1590 -#: netbox/dcim/tables/connections.py:65 netbox/ipam/forms/bulk_import.py:318 -#: netbox/ipam/forms/model_forms.py:280 netbox/ipam/forms/model_forms.py:289 -#: netbox/ipam/tables/fhrp.py:64 netbox/ipam/tables/ip.py:372 -#: netbox/ipam/tables/vlans.py:169 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:51 -#: netbox/templates/dcim/frontport.html:106 -#: netbox/templates/dcim/interface.html:27 -#: netbox/templates/dcim/interface.html:184 -#: netbox/templates/dcim/interface.html:310 -#: netbox/templates/dcim/rearport.html:102 -#: netbox/templates/virtualization/vminterface.html:18 -#: netbox/templates/vpn/tunneltermination.html:31 -#: netbox/templates/wireless/inc/wirelesslink_interface.html:10 -#: netbox/templates/wireless/wirelesslink.html:10 -#: netbox/templates/wireless/wirelesslink.html:55 -#: netbox/virtualization/forms/model_forms.py:348 -#: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:436 -#: netbox/vpn/forms/model_forms.py:445 netbox/wireless/forms/model_forms.py:113 -#: netbox/wireless/forms/model_forms.py:155 -msgid "Interface" -msgstr "" - -#: netbox/dcim/forms/model_forms.py:1152 netbox/dcim/forms/model_forms.py:1591 +#: netbox/dcim/forms/model_forms.py:1165 netbox/dcim/forms/model_forms.py:1636 #: netbox/dcim/tables/connections.py:27 #: netbox/templates/dcim/consoleport.html:17 #: netbox/templates/dcim/consoleserverport.html:74 @@ -4879,102 +5299,128 @@ msgstr "" msgid "Console Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1153 netbox/dcim/forms/model_forms.py:1592 +#: netbox/dcim/forms/model_forms.py:1166 netbox/dcim/forms/model_forms.py:1637 #: netbox/templates/dcim/consoleport.html:73 #: netbox/templates/dcim/consoleserverport.html:17 #: netbox/templates/dcim/frontport.html:109 msgid "Console Server Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1154 netbox/dcim/forms/model_forms.py:1593 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:52 +#: netbox/dcim/forms/model_forms.py:1167 netbox/dcim/forms/model_forms.py:1638 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 #: netbox/templates/dcim/consoleport.html:76 #: netbox/templates/dcim/consoleserverport.html:77 #: netbox/templates/dcim/frontport.html:17 #: netbox/templates/dcim/frontport.html:115 -#: netbox/templates/dcim/interface.html:187 +#: netbox/templates/dcim/interface.html:244 #: netbox/templates/dcim/rearport.html:105 msgid "Front Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1155 netbox/dcim/forms/model_forms.py:1594 -#: netbox/dcim/tables/devices.py:710 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:53 +#: netbox/dcim/forms/model_forms.py:1168 netbox/dcim/forms/model_forms.py:1639 +#: netbox/dcim/tables/devices.py:743 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:54 #: netbox/templates/dcim/consoleport.html:79 #: netbox/templates/dcim/consoleserverport.html:80 #: netbox/templates/dcim/frontport.html:50 #: netbox/templates/dcim/frontport.html:118 -#: netbox/templates/dcim/interface.html:190 +#: netbox/templates/dcim/interface.html:247 #: netbox/templates/dcim/rearport.html:17 #: netbox/templates/dcim/rearport.html:108 msgid "Rear Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1156 netbox/dcim/forms/model_forms.py:1595 -#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:512 -#: netbox/templates/dcim/poweroutlet.html:44 +#: netbox/dcim/forms/model_forms.py:1169 netbox/dcim/forms/model_forms.py:1640 +#: netbox/dcim/tables/connections.py:46 netbox/dcim/tables/devices.py:520 +#: netbox/templates/dcim/poweroutlet.html:54 #: netbox/templates/dcim/powerport.html:17 msgid "Power Port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1157 netbox/dcim/forms/model_forms.py:1596 +#: netbox/dcim/forms/model_forms.py:1170 netbox/dcim/forms/model_forms.py:1641 #: netbox/templates/dcim/poweroutlet.html:17 #: netbox/templates/dcim/powerport.html:77 msgid "Power Outlet" msgstr "" -#: netbox/dcim/forms/model_forms.py:1159 netbox/dcim/forms/model_forms.py:1598 +#: netbox/dcim/forms/model_forms.py:1172 netbox/dcim/forms/model_forms.py:1643 msgid "Component Assignment" msgstr "" -#: netbox/dcim/forms/model_forms.py:1202 netbox/dcim/forms/model_forms.py:1645 +#: netbox/dcim/forms/model_forms.py:1218 netbox/dcim/forms/model_forms.py:1690 msgid "An InventoryItem can only be assigned to a single component." msgstr "" -#: netbox/dcim/forms/model_forms.py:1339 +#: netbox/dcim/forms/model_forms.py:1355 msgid "LAG interface" msgstr "" -#: netbox/dcim/forms/model_forms.py:1362 +#: netbox/dcim/forms/model_forms.py:1378 msgid "Filter VLANs available for assignment by group." msgstr "" -#: netbox/dcim/forms/model_forms.py:1491 +#: netbox/dcim/forms/model_forms.py:1533 msgid "Child Device" msgstr "" -#: netbox/dcim/forms/model_forms.py:1492 +#: netbox/dcim/forms/model_forms.py:1534 msgid "" "Child devices must first be created and assigned to the site and rack of the " "parent device." msgstr "" -#: netbox/dcim/forms/model_forms.py:1534 +#: netbox/dcim/forms/model_forms.py:1576 msgid "Console port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1542 +#: netbox/dcim/forms/model_forms.py:1584 msgid "Console server port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1550 +#: netbox/dcim/forms/model_forms.py:1592 msgid "Front port" msgstr "" -#: netbox/dcim/forms/model_forms.py:1566 +#: netbox/dcim/forms/model_forms.py:1608 msgid "Power outlet" msgstr "" -#: netbox/dcim/forms/model_forms.py:1586 +#: netbox/dcim/forms/model_forms.py:1630 #: netbox/templates/dcim/inventoryitem.html:17 msgid "Inventory Item" msgstr "" -#: netbox/dcim/forms/model_forms.py:1659 +#: netbox/dcim/forms/model_forms.py:1704 #: netbox/templates/dcim/inventoryitemrole.html:15 msgid "Inventory Item Role" msgstr "" +#: netbox/dcim/forms/model_forms.py:1773 +msgid "VM Interface" +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1788 netbox/ipam/forms/filtersets.py:608 +#: netbox/ipam/forms/model_forms.py:326 netbox/ipam/forms/model_forms.py:788 +#: netbox/ipam/forms/model_forms.py:814 netbox/ipam/tables/vlans.py:171 +#: netbox/templates/virtualization/virtualdisk.html:21 +#: netbox/templates/virtualization/virtualmachine.html:12 +#: netbox/templates/virtualization/vminterface.html:21 +#: netbox/templates/vpn/tunneltermination.html:25 +#: netbox/virtualization/forms/filtersets.py:202 +#: netbox/virtualization/forms/filtersets.py:247 +#: netbox/virtualization/forms/model_forms.py:219 +#: netbox/virtualization/tables/virtualmachines.py:105 +#: netbox/virtualization/tables/virtualmachines.py:161 netbox/vpn/choices.py:53 +#: netbox/vpn/forms/filtersets.py:293 netbox/vpn/forms/model_forms.py:161 +#: netbox/vpn/forms/model_forms.py:172 netbox/vpn/forms/model_forms.py:274 +#: netbox/vpn/forms/model_forms.py:457 +msgid "Virtual Machine" +msgstr "" + +#: netbox/dcim/forms/model_forms.py:1822 +msgid "A MAC address can only be assigned to a single object." +msgstr "" + #: netbox/dcim/forms/object_create.py:48 netbox/dcim/forms/object_create.py:199 #: netbox/dcim/forms/object_create.py:347 msgid "" @@ -4990,7 +5436,7 @@ msgid "" msgstr "" #: netbox/dcim/forms/object_create.py:110 -#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:252 +#: netbox/dcim/forms/object_create.py:263 netbox/dcim/tables/devices.py:262 msgid "Rear ports" msgstr "" @@ -5013,7 +5459,7 @@ msgid "" "selected number of rear port positions ({rearport_count})." msgstr "" -#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1033 +#: netbox/dcim/forms/object_create.py:401 netbox/dcim/tables/devices.py:1064 #: netbox/ipam/tables/fhrp.py:31 netbox/templates/dcim/virtualchassis.html:53 #: netbox/templates/dcim/virtualchassis_edit.html:47 #: netbox/templates/ipam/fhrpgroup.html:38 @@ -5030,13 +5476,13 @@ msgid "" "member." msgstr "" -#: netbox/dcim/forms/object_create.py:427 +#: netbox/dcim/forms/object_create.py:428 msgid "A position must be specified for the first VC member." msgstr "" #: netbox/dcim/models/cables.py:62 -#: netbox/dcim/models/device_component_templates.py:55 -#: netbox/dcim/models/device_components.py:62 +#: netbox/dcim/models/device_component_templates.py:51 +#: netbox/dcim/models/device_components.py:57 #: netbox/extras/models/customfields.py:111 msgid "label" msgstr "" @@ -5049,80 +5495,80 @@ msgstr "" msgid "length unit" msgstr "" -#: netbox/dcim/models/cables.py:95 +#: netbox/dcim/models/cables.py:96 msgid "cable" msgstr "" -#: netbox/dcim/models/cables.py:96 +#: netbox/dcim/models/cables.py:97 msgid "cables" msgstr "" -#: netbox/dcim/models/cables.py:165 +#: netbox/dcim/models/cables.py:163 msgid "Must specify a unit when setting a cable length" msgstr "" -#: netbox/dcim/models/cables.py:168 +#: netbox/dcim/models/cables.py:166 msgid "Must define A and B terminations when creating a new cable." msgstr "" -#: netbox/dcim/models/cables.py:175 +#: netbox/dcim/models/cables.py:173 msgid "Cannot connect different termination types to same end of cable." msgstr "" -#: netbox/dcim/models/cables.py:183 +#: netbox/dcim/models/cables.py:181 #, python-brace-format msgid "Incompatible termination types: {type_a} and {type_b}" msgstr "" -#: netbox/dcim/models/cables.py:193 +#: netbox/dcim/models/cables.py:191 msgid "A and B terminations cannot connect to the same object." msgstr "" -#: netbox/dcim/models/cables.py:260 netbox/ipam/models/asns.py:37 +#: netbox/dcim/models/cables.py:258 netbox/ipam/models/asns.py:37 msgid "end" msgstr "" -#: netbox/dcim/models/cables.py:313 +#: netbox/dcim/models/cables.py:311 msgid "cable termination" msgstr "" -#: netbox/dcim/models/cables.py:314 +#: netbox/dcim/models/cables.py:312 msgid "cable terminations" msgstr "" -#: netbox/dcim/models/cables.py:333 +#: netbox/dcim/models/cables.py:331 #, python-brace-format msgid "" "Duplicate termination found for {app_label}.{model} {termination_id}: cable " "{cable_pk}" msgstr "" -#: netbox/dcim/models/cables.py:343 +#: netbox/dcim/models/cables.py:341 #, python-brace-format msgid "Cables cannot be terminated to {type_display} interfaces" msgstr "" -#: netbox/dcim/models/cables.py:350 +#: netbox/dcim/models/cables.py:348 msgid "Circuit terminations attached to a provider network may not be cabled." msgstr "" -#: netbox/dcim/models/cables.py:448 netbox/extras/models/configs.py:50 +#: netbox/dcim/models/cables.py:446 netbox/extras/models/configs.py:50 msgid "is active" msgstr "" -#: netbox/dcim/models/cables.py:452 +#: netbox/dcim/models/cables.py:450 msgid "is complete" msgstr "" -#: netbox/dcim/models/cables.py:456 +#: netbox/dcim/models/cables.py:454 msgid "is split" msgstr "" -#: netbox/dcim/models/cables.py:464 +#: netbox/dcim/models/cables.py:462 msgid "cable path" msgstr "" -#: netbox/dcim/models/cables.py:465 +#: netbox/dcim/models/cables.py:463 msgid "cable paths" msgstr "" @@ -5133,696 +5579,715 @@ msgid "" "attached to a module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:58 -#: netbox/dcim/models/device_components.py:65 +#: netbox/dcim/models/device_component_templates.py:54 +#: netbox/dcim/models/device_components.py:60 msgid "Physical label" msgstr "" -#: netbox/dcim/models/device_component_templates.py:103 +#: netbox/dcim/models/device_component_templates.py:99 msgid "Component templates cannot be moved to a different device type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:154 +#: netbox/dcim/models/device_component_templates.py:150 msgid "" "A component template cannot be associated with both a device type and a " "module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:158 +#: netbox/dcim/models/device_component_templates.py:154 msgid "" "A component template must be associated with either a device type or a " "module type." msgstr "" -#: netbox/dcim/models/device_component_templates.py:212 +#: netbox/dcim/models/device_component_templates.py:209 msgid "console port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:213 +#: netbox/dcim/models/device_component_templates.py:210 msgid "console port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:246 +#: netbox/dcim/models/device_component_templates.py:244 msgid "console server port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:247 +#: netbox/dcim/models/device_component_templates.py:245 msgid "console server port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:278 -#: netbox/dcim/models/device_components.py:352 +#: netbox/dcim/models/device_component_templates.py:277 +#: netbox/dcim/models/device_components.py:345 msgid "maximum draw" msgstr "" -#: netbox/dcim/models/device_component_templates.py:285 -#: netbox/dcim/models/device_components.py:359 +#: netbox/dcim/models/device_component_templates.py:284 +#: netbox/dcim/models/device_components.py:352 msgid "allocated draw" msgstr "" -#: netbox/dcim/models/device_component_templates.py:295 +#: netbox/dcim/models/device_component_templates.py:294 msgid "power port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:296 +#: netbox/dcim/models/device_component_templates.py:295 msgid "power port templates" msgstr "" #: netbox/dcim/models/device_component_templates.py:315 -#: netbox/dcim/models/device_components.py:382 +#: netbox/dcim/models/device_components.py:372 #, python-brace-format msgid "Allocated draw cannot exceed the maximum draw ({maximum_draw}W)." msgstr "" -#: netbox/dcim/models/device_component_templates.py:347 -#: netbox/dcim/models/device_components.py:477 +#: netbox/dcim/models/device_component_templates.py:349 +#: netbox/dcim/models/device_components.py:468 msgid "feed leg" msgstr "" -#: netbox/dcim/models/device_component_templates.py:351 -#: netbox/dcim/models/device_components.py:481 +#: netbox/dcim/models/device_component_templates.py:354 +#: netbox/dcim/models/device_components.py:473 msgid "Phase (for three-phase feeds)" msgstr "" -#: netbox/dcim/models/device_component_templates.py:357 +#: netbox/dcim/models/device_component_templates.py:360 msgid "power outlet template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:358 +#: netbox/dcim/models/device_component_templates.py:361 msgid "power outlet templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:367 +#: netbox/dcim/models/device_component_templates.py:370 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:371 +#: netbox/dcim/models/device_component_templates.py:376 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same module type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:423 -#: netbox/dcim/models/device_components.py:611 +#: netbox/dcim/models/device_component_templates.py:430 +#: netbox/dcim/models/device_components.py:659 msgid "management only" msgstr "" -#: netbox/dcim/models/device_component_templates.py:431 -#: netbox/dcim/models/device_components.py:550 +#: netbox/dcim/models/device_component_templates.py:438 +#: netbox/dcim/models/device_components.py:539 msgid "bridge interface" msgstr "" -#: netbox/dcim/models/device_component_templates.py:449 -#: netbox/dcim/models/device_components.py:636 +#: netbox/dcim/models/device_component_templates.py:459 +#: netbox/dcim/models/device_components.py:685 msgid "wireless role" msgstr "" -#: netbox/dcim/models/device_component_templates.py:455 +#: netbox/dcim/models/device_component_templates.py:465 msgid "interface template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:456 +#: netbox/dcim/models/device_component_templates.py:466 msgid "interface templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:463 -#: netbox/dcim/models/device_components.py:804 -#: netbox/virtualization/models/virtualmachines.py:405 +#: netbox/dcim/models/device_component_templates.py:473 +#: netbox/dcim/models/device_components.py:845 +#: netbox/virtualization/models/virtualmachines.py:385 msgid "An interface cannot be bridged to itself." msgstr "" -#: netbox/dcim/models/device_component_templates.py:466 +#: netbox/dcim/models/device_component_templates.py:477 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:470 +#: netbox/dcim/models/device_component_templates.py:483 #, python-brace-format msgid "Bridge interface ({bridge}) must belong to the same module type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:526 -#: netbox/dcim/models/device_components.py:984 +#: netbox/dcim/models/device_component_templates.py:540 +#: netbox/dcim/models/device_components.py:1033 msgid "rear port position" msgstr "" -#: netbox/dcim/models/device_component_templates.py:551 +#: netbox/dcim/models/device_component_templates.py:565 msgid "front port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:552 +#: netbox/dcim/models/device_component_templates.py:566 msgid "front port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:562 +#: netbox/dcim/models/device_component_templates.py:576 #, python-brace-format msgid "Rear port ({name}) must belong to the same device type" msgstr "" -#: netbox/dcim/models/device_component_templates.py:568 +#: netbox/dcim/models/device_component_templates.py:582 #, python-brace-format msgid "" "Invalid rear port position ({position}); rear port {name} has only {count} " "positions" msgstr "" -#: netbox/dcim/models/device_component_templates.py:621 -#: netbox/dcim/models/device_components.py:1053 +#: netbox/dcim/models/device_component_templates.py:635 +#: netbox/dcim/models/device_components.py:1099 msgid "positions" msgstr "" -#: netbox/dcim/models/device_component_templates.py:632 +#: netbox/dcim/models/device_component_templates.py:646 msgid "rear port template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:633 +#: netbox/dcim/models/device_component_templates.py:647 msgid "rear port templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:662 -#: netbox/dcim/models/device_components.py:1103 +#: netbox/dcim/models/device_component_templates.py:676 +#: netbox/dcim/models/device_components.py:1146 msgid "position" msgstr "" -#: netbox/dcim/models/device_component_templates.py:665 -#: netbox/dcim/models/device_components.py:1106 +#: netbox/dcim/models/device_component_templates.py:679 +#: netbox/dcim/models/device_components.py:1149 msgid "Identifier to reference when renaming installed components" msgstr "" -#: netbox/dcim/models/device_component_templates.py:671 +#: netbox/dcim/models/device_component_templates.py:685 msgid "module bay template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:672 +#: netbox/dcim/models/device_component_templates.py:686 msgid "module bay templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:699 +#: netbox/dcim/models/device_component_templates.py:713 msgid "device bay template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:700 +#: netbox/dcim/models/device_component_templates.py:714 msgid "device bay templates" msgstr "" -#: netbox/dcim/models/device_component_templates.py:713 +#: netbox/dcim/models/device_component_templates.py:728 #, python-brace-format msgid "" "Subdevice role of device type ({device_type}) must be set to \"parent\" to " "allow device bays." msgstr "" -#: netbox/dcim/models/device_component_templates.py:768 -#: netbox/dcim/models/device_components.py:1262 +#: netbox/dcim/models/device_component_templates.py:784 +#: netbox/dcim/models/device_components.py:1302 msgid "part ID" msgstr "" -#: netbox/dcim/models/device_component_templates.py:770 -#: netbox/dcim/models/device_components.py:1264 +#: netbox/dcim/models/device_component_templates.py:786 +#: netbox/dcim/models/device_components.py:1304 msgid "Manufacturer-assigned part identifier" msgstr "" -#: netbox/dcim/models/device_component_templates.py:787 +#: netbox/dcim/models/device_component_templates.py:803 msgid "inventory item template" msgstr "" -#: netbox/dcim/models/device_component_templates.py:788 +#: netbox/dcim/models/device_component_templates.py:804 msgid "inventory item templates" msgstr "" -#: netbox/dcim/models/device_components.py:105 +#: netbox/dcim/models/device_components.py:100 msgid "Components cannot be moved to a different device." msgstr "" -#: netbox/dcim/models/device_components.py:144 +#: netbox/dcim/models/device_components.py:139 msgid "cable end" msgstr "" -#: netbox/dcim/models/device_components.py:150 +#: netbox/dcim/models/device_components.py:146 msgid "mark connected" msgstr "" -#: netbox/dcim/models/device_components.py:152 +#: netbox/dcim/models/device_components.py:148 msgid "Treat as if a cable is connected" msgstr "" -#: netbox/dcim/models/device_components.py:170 +#: netbox/dcim/models/device_components.py:166 msgid "Must specify cable end (A or B) when attaching a cable." msgstr "" -#: netbox/dcim/models/device_components.py:174 +#: netbox/dcim/models/device_components.py:170 msgid "Cable end must not be set without a cable." msgstr "" -#: netbox/dcim/models/device_components.py:178 +#: netbox/dcim/models/device_components.py:174 msgid "Cannot mark as connected with a cable attached." msgstr "" -#: netbox/dcim/models/device_components.py:202 +#: netbox/dcim/models/device_components.py:198 #, python-brace-format msgid "{class_name} models must declare a parent_object property" msgstr "" -#: netbox/dcim/models/device_components.py:287 -#: netbox/dcim/models/device_components.py:316 -#: netbox/dcim/models/device_components.py:349 -#: netbox/dcim/models/device_components.py:467 +#: netbox/dcim/models/device_components.py:284 +#: netbox/dcim/models/device_components.py:311 +#: netbox/dcim/models/device_components.py:342 +#: netbox/dcim/models/device_components.py:458 msgid "Physical port type" msgstr "" -#: netbox/dcim/models/device_components.py:290 -#: netbox/dcim/models/device_components.py:319 +#: netbox/dcim/models/device_components.py:287 +#: netbox/dcim/models/device_components.py:314 msgid "speed" msgstr "" -#: netbox/dcim/models/device_components.py:294 -#: netbox/dcim/models/device_components.py:323 +#: netbox/dcim/models/device_components.py:291 +#: netbox/dcim/models/device_components.py:318 msgid "Port speed in bits per second" msgstr "" -#: netbox/dcim/models/device_components.py:300 +#: netbox/dcim/models/device_components.py:297 msgid "console port" msgstr "" -#: netbox/dcim/models/device_components.py:301 +#: netbox/dcim/models/device_components.py:298 msgid "console ports" msgstr "" -#: netbox/dcim/models/device_components.py:329 +#: netbox/dcim/models/device_components.py:324 msgid "console server port" msgstr "" -#: netbox/dcim/models/device_components.py:330 +#: netbox/dcim/models/device_components.py:325 msgid "console server ports" msgstr "" -#: netbox/dcim/models/device_components.py:369 +#: netbox/dcim/models/device_components.py:362 msgid "power port" msgstr "" -#: netbox/dcim/models/device_components.py:370 +#: netbox/dcim/models/device_components.py:363 msgid "power ports" msgstr "" -#: netbox/dcim/models/device_components.py:487 +#: netbox/dcim/models/device_components.py:483 msgid "power outlet" msgstr "" -#: netbox/dcim/models/device_components.py:488 +#: netbox/dcim/models/device_components.py:484 msgid "power outlets" msgstr "" -#: netbox/dcim/models/device_components.py:499 +#: netbox/dcim/models/device_components.py:492 #, python-brace-format msgid "Parent power port ({power_port}) must belong to the same device" msgstr "" -#: netbox/dcim/models/device_components.py:530 netbox/vpn/models/crypto.py:81 -#: netbox/vpn/models/crypto.py:226 +#: netbox/dcim/models/device_components.py:518 netbox/vpn/models/crypto.py:80 +#: netbox/vpn/models/crypto.py:222 msgid "mode" msgstr "" -#: netbox/dcim/models/device_components.py:534 +#: netbox/dcim/models/device_components.py:523 msgid "IEEE 802.1Q tagging strategy" msgstr "" -#: netbox/dcim/models/device_components.py:542 +#: netbox/dcim/models/device_components.py:531 msgid "parent interface" msgstr "" -#: netbox/dcim/models/device_components.py:602 -msgid "parent LAG" -msgstr "" - -#: netbox/dcim/models/device_components.py:612 -msgid "This interface is used only for out-of-band management" -msgstr "" - -#: netbox/dcim/models/device_components.py:617 -msgid "speed (Kbps)" -msgstr "" - -#: netbox/dcim/models/device_components.py:620 -msgid "duplex" -msgstr "" - -#: netbox/dcim/models/device_components.py:630 -msgid "64-bit World Wide Name" -msgstr "" - -#: netbox/dcim/models/device_components.py:642 -msgid "wireless channel" -msgstr "" - -#: netbox/dcim/models/device_components.py:649 -msgid "channel frequency (MHz)" -msgstr "" - -#: netbox/dcim/models/device_components.py:650 -#: netbox/dcim/models/device_components.py:658 -msgid "Populated by selected channel (if set)" -msgstr "" - -#: netbox/dcim/models/device_components.py:664 -msgid "transmit power (dBm)" -msgstr "" - -#: netbox/dcim/models/device_components.py:689 netbox/wireless/models.py:117 -msgid "wireless LANs" -msgstr "" - -#: netbox/dcim/models/device_components.py:697 -#: netbox/virtualization/models/virtualmachines.py:335 +#: netbox/dcim/models/device_components.py:547 msgid "untagged VLAN" msgstr "" -#: netbox/dcim/models/device_components.py:703 -#: netbox/virtualization/models/virtualmachines.py:341 +#: netbox/dcim/models/device_components.py:553 msgid "tagged VLANs" msgstr "" -#: netbox/dcim/models/device_components.py:745 -#: netbox/virtualization/models/virtualmachines.py:377 +#: netbox/dcim/models/device_components.py:561 +#: netbox/dcim/tables/devices.py:601 netbox/ipam/forms/bulk_edit.py:510 +#: netbox/ipam/forms/bulk_import.py:491 netbox/ipam/forms/filtersets.py:565 +#: netbox/ipam/forms/model_forms.py:684 netbox/ipam/tables/vlans.py:106 +#: netbox/templates/dcim/interface.html:86 netbox/templates/ipam/vlan.html:77 +msgid "Q-in-Q SVLAN" +msgstr "" + +#: netbox/dcim/models/device_components.py:576 +msgid "primary MAC address" +msgstr "" + +#: netbox/dcim/models/device_components.py:588 +msgid "Only Q-in-Q interfaces may specify a service VLAN." +msgstr "" + +#: netbox/dcim/models/device_components.py:594 +#, python-brace-format +msgid "MAC address {mac_address} is not assigned to this interface." +msgstr "" + +#: netbox/dcim/models/device_components.py:650 +msgid "parent LAG" +msgstr "" + +#: netbox/dcim/models/device_components.py:660 +msgid "This interface is used only for out-of-band management" +msgstr "" + +#: netbox/dcim/models/device_components.py:665 +msgid "speed (Kbps)" +msgstr "" + +#: netbox/dcim/models/device_components.py:668 +msgid "duplex" +msgstr "" + +#: netbox/dcim/models/device_components.py:678 +msgid "64-bit World Wide Name" +msgstr "" + +#: netbox/dcim/models/device_components.py:692 +msgid "wireless channel" +msgstr "" + +#: netbox/dcim/models/device_components.py:699 +msgid "channel frequency (MHz)" +msgstr "" + +#: netbox/dcim/models/device_components.py:700 +#: netbox/dcim/models/device_components.py:708 +msgid "Populated by selected channel (if set)" +msgstr "" + +#: netbox/dcim/models/device_components.py:714 +msgid "transmit power (dBm)" +msgstr "" + +#: netbox/dcim/models/device_components.py:741 netbox/wireless/models.py:117 +msgid "wireless LANs" +msgstr "" + +#: netbox/dcim/models/device_components.py:789 +#: netbox/virtualization/models/virtualmachines.py:359 msgid "interface" msgstr "" -#: netbox/dcim/models/device_components.py:746 -#: netbox/virtualization/models/virtualmachines.py:378 +#: netbox/dcim/models/device_components.py:790 +#: netbox/virtualization/models/virtualmachines.py:360 msgid "interfaces" msgstr "" -#: netbox/dcim/models/device_components.py:757 +#: netbox/dcim/models/device_components.py:798 #, python-brace-format msgid "{display_type} interfaces cannot have a cable attached." msgstr "" -#: netbox/dcim/models/device_components.py:765 +#: netbox/dcim/models/device_components.py:806 #, python-brace-format msgid "{display_type} interfaces cannot be marked as connected." msgstr "" -#: netbox/dcim/models/device_components.py:774 -#: netbox/virtualization/models/virtualmachines.py:390 +#: netbox/dcim/models/device_components.py:815 +#: netbox/virtualization/models/virtualmachines.py:370 msgid "An interface cannot be its own parent." msgstr "" -#: netbox/dcim/models/device_components.py:778 +#: netbox/dcim/models/device_components.py:819 msgid "Only virtual interfaces may be assigned to a parent interface." msgstr "" -#: netbox/dcim/models/device_components.py:785 +#: netbox/dcim/models/device_components.py:826 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to a different device " "({device})" msgstr "" -#: netbox/dcim/models/device_components.py:791 +#: netbox/dcim/models/device_components.py:832 #, python-brace-format msgid "" "The selected parent interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:811 +#: netbox/dcim/models/device_components.py:852 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different device " "({device})." msgstr "" -#: netbox/dcim/models/device_components.py:817 +#: netbox/dcim/models/device_components.py:858 #, python-brace-format msgid "" "The selected bridge interface ({interface}) belongs to {device}, which is " "not part of virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:828 +#: netbox/dcim/models/device_components.py:869 msgid "Virtual interfaces cannot have a parent LAG interface." msgstr "" -#: netbox/dcim/models/device_components.py:832 +#: netbox/dcim/models/device_components.py:873 msgid "A LAG interface cannot be its own parent." msgstr "" -#: netbox/dcim/models/device_components.py:839 +#: netbox/dcim/models/device_components.py:880 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to a different device ({device})." msgstr "" -#: netbox/dcim/models/device_components.py:845 +#: netbox/dcim/models/device_components.py:886 #, python-brace-format msgid "" "The selected LAG interface ({lag}) belongs to {device}, which is not part of " "virtual chassis {virtual_chassis}." msgstr "" -#: netbox/dcim/models/device_components.py:856 +#: netbox/dcim/models/device_components.py:897 msgid "Virtual interfaces cannot have a PoE mode." msgstr "" -#: netbox/dcim/models/device_components.py:860 +#: netbox/dcim/models/device_components.py:901 msgid "Virtual interfaces cannot have a PoE type." msgstr "" -#: netbox/dcim/models/device_components.py:866 +#: netbox/dcim/models/device_components.py:907 msgid "Must specify PoE mode when designating a PoE type." msgstr "" -#: netbox/dcim/models/device_components.py:873 +#: netbox/dcim/models/device_components.py:914 msgid "Wireless role may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:875 +#: netbox/dcim/models/device_components.py:916 msgid "Channel may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:881 +#: netbox/dcim/models/device_components.py:922 msgid "Channel frequency may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:885 +#: netbox/dcim/models/device_components.py:926 msgid "Cannot specify custom frequency with channel selected." msgstr "" -#: netbox/dcim/models/device_components.py:891 +#: netbox/dcim/models/device_components.py:932 msgid "Channel width may be set only on wireless interfaces." msgstr "" -#: netbox/dcim/models/device_components.py:893 +#: netbox/dcim/models/device_components.py:934 msgid "Cannot specify custom width with channel selected." msgstr "" -#: netbox/dcim/models/device_components.py:901 +#: netbox/dcim/models/device_components.py:942 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent device, or it must be global." msgstr "" -#: netbox/dcim/models/device_components.py:990 +#: netbox/dcim/models/device_components.py:1039 msgid "Mapped position on corresponding rear port" msgstr "" -#: netbox/dcim/models/device_components.py:1006 +#: netbox/dcim/models/device_components.py:1055 msgid "front port" msgstr "" -#: netbox/dcim/models/device_components.py:1007 +#: netbox/dcim/models/device_components.py:1056 msgid "front ports" msgstr "" -#: netbox/dcim/models/device_components.py:1021 +#: netbox/dcim/models/device_components.py:1067 #, python-brace-format msgid "Rear port ({rear_port}) must belong to the same device" msgstr "" -#: netbox/dcim/models/device_components.py:1029 +#: netbox/dcim/models/device_components.py:1075 #, python-brace-format msgid "" "Invalid rear port position ({rear_port_position}): Rear port {name} has only " "{positions} positions." msgstr "" -#: netbox/dcim/models/device_components.py:1059 +#: netbox/dcim/models/device_components.py:1105 msgid "Number of front ports which may be mapped" msgstr "" -#: netbox/dcim/models/device_components.py:1064 +#: netbox/dcim/models/device_components.py:1110 msgid "rear port" msgstr "" -#: netbox/dcim/models/device_components.py:1065 +#: netbox/dcim/models/device_components.py:1111 msgid "rear ports" msgstr "" -#: netbox/dcim/models/device_components.py:1079 +#: netbox/dcim/models/device_components.py:1122 #, python-brace-format msgid "" "The number of positions cannot be less than the number of mapped front ports " "({frontport_count})" msgstr "" -#: netbox/dcim/models/device_components.py:1120 +#: netbox/dcim/models/device_components.py:1163 msgid "module bay" msgstr "" -#: netbox/dcim/models/device_components.py:1121 +#: netbox/dcim/models/device_components.py:1164 msgid "module bays" msgstr "" -#: netbox/dcim/models/device_components.py:1138 +#: netbox/dcim/models/device_components.py:1178 #: netbox/dcim/models/devices.py:1224 msgid "A module bay cannot belong to a module installed within it." msgstr "" -#: netbox/dcim/models/device_components.py:1164 +#: netbox/dcim/models/device_components.py:1204 msgid "device bay" msgstr "" -#: netbox/dcim/models/device_components.py:1165 +#: netbox/dcim/models/device_components.py:1205 msgid "device bays" msgstr "" -#: netbox/dcim/models/device_components.py:1175 +#: netbox/dcim/models/device_components.py:1212 #, python-brace-format msgid "This type of device ({device_type}) does not support device bays." msgstr "" -#: netbox/dcim/models/device_components.py:1181 +#: netbox/dcim/models/device_components.py:1218 msgid "Cannot install a device into itself." msgstr "" -#: netbox/dcim/models/device_components.py:1189 +#: netbox/dcim/models/device_components.py:1226 #, python-brace-format msgid "" "Cannot install the specified device; device is already installed in {bay}." msgstr "" -#: netbox/dcim/models/device_components.py:1210 +#: netbox/dcim/models/device_components.py:1247 msgid "inventory item role" msgstr "" -#: netbox/dcim/models/device_components.py:1211 +#: netbox/dcim/models/device_components.py:1248 msgid "inventory item roles" msgstr "" -#: netbox/dcim/models/device_components.py:1268 -#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1181 -#: netbox/dcim/models/racks.py:313 -#: netbox/virtualization/models/virtualmachines.py:131 +#: netbox/dcim/models/device_components.py:1308 +#: netbox/dcim/models/devices.py:597 netbox/dcim/models/devices.py:1184 +#: netbox/dcim/models/racks.py:304 +#: netbox/virtualization/models/virtualmachines.py:126 msgid "serial number" msgstr "" -#: netbox/dcim/models/device_components.py:1276 -#: netbox/dcim/models/devices.py:615 netbox/dcim/models/devices.py:1188 -#: netbox/dcim/models/racks.py:320 +#: netbox/dcim/models/device_components.py:1316 +#: netbox/dcim/models/devices.py:605 netbox/dcim/models/devices.py:1191 +#: netbox/dcim/models/racks.py:311 msgid "asset tag" msgstr "" -#: netbox/dcim/models/device_components.py:1277 +#: netbox/dcim/models/device_components.py:1317 msgid "A unique tag used to identify this item" msgstr "" -#: netbox/dcim/models/device_components.py:1280 +#: netbox/dcim/models/device_components.py:1320 msgid "discovered" msgstr "" -#: netbox/dcim/models/device_components.py:1282 +#: netbox/dcim/models/device_components.py:1322 msgid "This item was automatically discovered" msgstr "" -#: netbox/dcim/models/device_components.py:1300 +#: netbox/dcim/models/device_components.py:1340 msgid "inventory item" msgstr "" -#: netbox/dcim/models/device_components.py:1301 +#: netbox/dcim/models/device_components.py:1341 msgid "inventory items" msgstr "" -#: netbox/dcim/models/device_components.py:1312 +#: netbox/dcim/models/device_components.py:1349 msgid "Cannot assign self as parent." msgstr "" -#: netbox/dcim/models/device_components.py:1320 +#: netbox/dcim/models/device_components.py:1357 msgid "Parent inventory item does not belong to the same device." msgstr "" -#: netbox/dcim/models/device_components.py:1326 +#: netbox/dcim/models/device_components.py:1363 msgid "Cannot move an inventory item with dependent children" msgstr "" -#: netbox/dcim/models/device_components.py:1334 +#: netbox/dcim/models/device_components.py:1371 msgid "Cannot assign inventory item to component on another device" msgstr "" -#: netbox/dcim/models/devices.py:54 +#: netbox/dcim/models/devices.py:58 msgid "manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:55 +#: netbox/dcim/models/devices.py:59 msgid "manufacturers" msgstr "" -#: netbox/dcim/models/devices.py:82 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/devices.py:83 netbox/dcim/models/devices.py:382 #: netbox/dcim/models/racks.py:133 msgid "model" msgstr "" -#: netbox/dcim/models/devices.py:95 +#: netbox/dcim/models/devices.py:96 msgid "default platform" msgstr "" -#: netbox/dcim/models/devices.py:98 netbox/dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:99 netbox/dcim/models/devices.py:386 msgid "part number" msgstr "" -#: netbox/dcim/models/devices.py:101 netbox/dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:102 netbox/dcim/models/devices.py:389 msgid "Discrete part number (optional)" msgstr "" -#: netbox/dcim/models/devices.py:107 netbox/dcim/models/racks.py:54 +#: netbox/dcim/models/devices.py:108 netbox/dcim/models/racks.py:53 msgid "height (U)" msgstr "" -#: netbox/dcim/models/devices.py:111 +#: netbox/dcim/models/devices.py:112 msgid "exclude from utilization" msgstr "" -#: netbox/dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:113 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" -#: netbox/dcim/models/devices.py:116 +#: netbox/dcim/models/devices.py:117 msgid "is full depth" msgstr "" -#: netbox/dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:118 msgid "Device consumes both front and rear rack faces." msgstr "" -#: netbox/dcim/models/devices.py:123 +#: netbox/dcim/models/devices.py:125 msgid "parent/child status" msgstr "" -#: netbox/dcim/models/devices.py:124 +#: netbox/dcim/models/devices.py:126 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." msgstr "" -#: netbox/dcim/models/devices.py:128 netbox/dcim/models/devices.py:392 -#: netbox/dcim/models/devices.py:659 netbox/dcim/models/racks.py:324 +#: netbox/dcim/models/devices.py:130 netbox/dcim/models/devices.py:392 +#: netbox/dcim/models/devices.py:650 netbox/dcim/models/racks.py:315 msgid "airflow" msgstr "" -#: netbox/dcim/models/devices.py:204 +#: netbox/dcim/models/devices.py:207 msgid "device type" msgstr "" -#: netbox/dcim/models/devices.py:205 +#: netbox/dcim/models/devices.py:208 msgid "device types" msgstr "" @@ -5854,211 +6319,216 @@ msgstr "" msgid "Child device types must be 0U." msgstr "" -#: netbox/dcim/models/devices.py:411 +#: netbox/dcim/models/devices.py:412 msgid "module type" msgstr "" -#: netbox/dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:413 msgid "module types" msgstr "" -#: netbox/dcim/models/devices.py:485 +#: netbox/dcim/models/devices.py:483 msgid "Virtual machines may be assigned to this role" msgstr "" -#: netbox/dcim/models/devices.py:497 +#: netbox/dcim/models/devices.py:495 msgid "device role" msgstr "" -#: netbox/dcim/models/devices.py:498 +#: netbox/dcim/models/devices.py:496 msgid "device roles" msgstr "" -#: netbox/dcim/models/devices.py:515 +#: netbox/dcim/models/devices.py:510 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:527 +#: netbox/dcim/models/devices.py:522 msgid "platform" msgstr "" -#: netbox/dcim/models/devices.py:528 +#: netbox/dcim/models/devices.py:523 msgid "platforms" msgstr "" -#: netbox/dcim/models/devices.py:576 +#: netbox/dcim/models/devices.py:571 msgid "The function this device serves" msgstr "" -#: netbox/dcim/models/devices.py:608 +#: netbox/dcim/models/devices.py:598 msgid "Chassis serial number, assigned by the manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:616 netbox/dcim/models/devices.py:1189 +#: netbox/dcim/models/devices.py:606 netbox/dcim/models/devices.py:1192 msgid "A unique tag used to identify this device" msgstr "" -#: netbox/dcim/models/devices.py:643 +#: netbox/dcim/models/devices.py:633 msgid "position (U)" msgstr "" -#: netbox/dcim/models/devices.py:650 +#: netbox/dcim/models/devices.py:641 msgid "rack face" msgstr "" -#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1420 -#: netbox/virtualization/models/virtualmachines.py:100 +#: netbox/dcim/models/devices.py:662 netbox/dcim/models/devices.py:1419 +#: netbox/virtualization/models/virtualmachines.py:95 msgid "primary IPv4" msgstr "" -#: netbox/dcim/models/devices.py:678 netbox/dcim/models/devices.py:1428 -#: netbox/virtualization/models/virtualmachines.py:108 +#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1427 +#: netbox/virtualization/models/virtualmachines.py:103 msgid "primary IPv6" msgstr "" -#: netbox/dcim/models/devices.py:686 +#: netbox/dcim/models/devices.py:678 msgid "out-of-band IP" msgstr "" -#: netbox/dcim/models/devices.py:703 +#: netbox/dcim/models/devices.py:695 msgid "VC position" msgstr "" -#: netbox/dcim/models/devices.py:706 +#: netbox/dcim/models/devices.py:698 msgid "Virtual chassis position" msgstr "" -#: netbox/dcim/models/devices.py:709 +#: netbox/dcim/models/devices.py:701 msgid "VC priority" msgstr "" -#: netbox/dcim/models/devices.py:713 +#: netbox/dcim/models/devices.py:705 msgid "Virtual chassis master election priority" msgstr "" -#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:207 +#: netbox/dcim/models/devices.py:708 netbox/dcim/models/sites.py:208 msgid "latitude" msgstr "" -#: netbox/dcim/models/devices.py:721 netbox/dcim/models/devices.py:729 -#: netbox/dcim/models/sites.py:212 netbox/dcim/models/sites.py:220 +#: netbox/dcim/models/devices.py:713 netbox/dcim/models/devices.py:721 +#: netbox/dcim/models/sites.py:213 netbox/dcim/models/sites.py:221 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "" -#: netbox/dcim/models/devices.py:724 netbox/dcim/models/sites.py:215 +#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:216 msgid "longitude" msgstr "" -#: netbox/dcim/models/devices.py:797 +#: netbox/dcim/models/devices.py:789 msgid "Device name must be unique per site." msgstr "" -#: netbox/dcim/models/devices.py:808 netbox/ipam/models/services.py:75 +#: netbox/dcim/models/devices.py:800 netbox/ipam/models/services.py:71 msgid "device" msgstr "" -#: netbox/dcim/models/devices.py:809 +#: netbox/dcim/models/devices.py:801 msgid "devices" msgstr "" -#: netbox/dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:824 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:840 +#: netbox/dcim/models/devices.py:829 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:835 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "" -#: netbox/dcim/models/devices.py:853 +#: netbox/dcim/models/devices.py:842 msgid "Cannot select a rack face without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:857 +#: netbox/dcim/models/devices.py:846 msgid "Cannot select a rack position without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:863 +#: netbox/dcim/models/devices.py:852 msgid "Position must be in increments of 0.5 rack units." msgstr "" -#: netbox/dcim/models/devices.py:867 +#: netbox/dcim/models/devices.py:856 msgid "Must specify rack face when defining rack position." msgstr "" -#: netbox/dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:864 #, python-brace-format msgid "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "" -#: netbox/dcim/models/devices.py:886 +#: netbox/dcim/models/devices.py:875 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:893 +#: netbox/dcim/models/devices.py:882 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:907 +#: netbox/dcim/models/devices.py:896 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " "accommodate this device type: {device_type} ({u_height}U)" msgstr "" -#: netbox/dcim/models/devices.py:922 +#: netbox/dcim/models/devices.py:911 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "" -#: netbox/dcim/models/devices.py:931 netbox/dcim/models/devices.py:946 +#: netbox/dcim/models/devices.py:923 netbox/dcim/models/devices.py:941 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" -#: netbox/dcim/models/devices.py:937 +#: netbox/dcim/models/devices.py:929 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "" -#: netbox/dcim/models/devices.py:964 +#: netbox/dcim/models/devices.py:959 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " "but this device's type belongs to {devicetype_manufacturer}." msgstr "" -#: netbox/dcim/models/devices.py:975 +#: netbox/dcim/models/devices.py:970 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "" -#: netbox/dcim/models/devices.py:983 +#: netbox/dcim/models/devices.py:977 +#, python-brace-format +msgid "The assigned cluster belongs to a different location ({location})" +msgstr "" + +#: netbox/dcim/models/devices.py:985 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" -#: netbox/dcim/models/devices.py:988 +#: netbox/dcim/models/devices.py:991 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " "is currently designated as its master." msgstr "" -#: netbox/dcim/models/devices.py:1196 +#: netbox/dcim/models/devices.py:1199 msgid "module" msgstr "" -#: netbox/dcim/models/devices.py:1197 +#: netbox/dcim/models/devices.py:1200 msgid "modules" msgstr "" @@ -6069,69 +6539,64 @@ msgid "" "device ({device})." msgstr "" -#: netbox/dcim/models/devices.py:1339 +#: netbox/dcim/models/devices.py:1340 msgid "domain" msgstr "" -#: netbox/dcim/models/devices.py:1352 netbox/dcim/models/devices.py:1353 +#: netbox/dcim/models/devices.py:1353 netbox/dcim/models/devices.py:1354 msgid "virtual chassis" msgstr "" -#: netbox/dcim/models/devices.py:1368 +#: netbox/dcim/models/devices.py:1366 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: netbox/dcim/models/devices.py:1384 +#: netbox/dcim/models/devices.py:1382 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1408 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: netbox/dcim/models/devices.py:1410 +#: netbox/dcim/models/devices.py:1409 msgid "Numeric identifier unique to the parent device" msgstr "" -#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 +#: netbox/dcim/models/devices.py:1437 netbox/extras/models/customfields.py:225 #: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 -#: netbox/netbox/models/__init__.py:115 +#: netbox/netbox/models/__init__.py:119 msgid "comments" msgstr "" -#: netbox/dcim/models/devices.py:1454 +#: netbox/dcim/models/devices.py:1453 msgid "virtual device context" msgstr "" -#: netbox/dcim/models/devices.py:1455 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device contexts" msgstr "" -#: netbox/dcim/models/devices.py:1487 +#: netbox/dcim/models/devices.py:1483 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: netbox/dcim/models/devices.py:1493 +#: netbox/dcim/models/devices.py:1489 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" -#: netbox/dcim/models/mixins.py:15 netbox/extras/models/configs.py:41 -#: netbox/extras/models/models.py:313 netbox/extras/models/models.py:522 -#: netbox/extras/models/search.py:48 netbox/ipam/models/ip.py:194 -msgid "weight" +#: netbox/dcim/models/devices.py:1521 +msgid "MAC addresses" msgstr "" -#: netbox/dcim/models/mixins.py:22 -msgid "weight unit" -msgstr "" - -#: netbox/dcim/models/mixins.py:51 -msgid "Must specify a unit when setting a weight" +#: netbox/dcim/models/mixins.py:94 +#, python-brace-format +msgid "Please select a {scope_type}." msgstr "" #: netbox/dcim/models/power.py:55 @@ -6142,104 +6607,104 @@ msgstr "" msgid "power panels" msgstr "" -#: netbox/dcim/models/power.py:70 +#: netbox/dcim/models/power.py:67 #, python-brace-format msgid "" "Location {location} ({location_site}) is in a different site than {site}" msgstr "" -#: netbox/dcim/models/power.py:108 +#: netbox/dcim/models/power.py:106 msgid "supply" msgstr "" -#: netbox/dcim/models/power.py:114 +#: netbox/dcim/models/power.py:112 msgid "phase" msgstr "" -#: netbox/dcim/models/power.py:120 +#: netbox/dcim/models/power.py:118 msgid "voltage" msgstr "" -#: netbox/dcim/models/power.py:125 +#: netbox/dcim/models/power.py:123 msgid "amperage" msgstr "" -#: netbox/dcim/models/power.py:130 +#: netbox/dcim/models/power.py:128 msgid "max utilization" msgstr "" -#: netbox/dcim/models/power.py:133 +#: netbox/dcim/models/power.py:131 msgid "Maximum permissible draw (percentage)" msgstr "" -#: netbox/dcim/models/power.py:136 +#: netbox/dcim/models/power.py:134 msgid "available power" msgstr "" -#: netbox/dcim/models/power.py:164 +#: netbox/dcim/models/power.py:162 msgid "power feed" msgstr "" -#: netbox/dcim/models/power.py:165 +#: netbox/dcim/models/power.py:163 msgid "power feeds" msgstr "" -#: netbox/dcim/models/power.py:179 +#: netbox/dcim/models/power.py:174 #, python-brace-format msgid "" "Rack {rack} ({rack_site}) and power panel {powerpanel} ({powerpanel_site}) " "are in different sites." msgstr "" -#: netbox/dcim/models/power.py:190 +#: netbox/dcim/models/power.py:185 msgid "Voltage cannot be negative for AC supply" msgstr "" -#: netbox/dcim/models/racks.py:47 +#: netbox/dcim/models/racks.py:46 msgid "width" msgstr "" -#: netbox/dcim/models/racks.py:48 +#: netbox/dcim/models/racks.py:47 msgid "Rail-to-rail width" msgstr "" -#: netbox/dcim/models/racks.py:56 +#: netbox/dcim/models/racks.py:55 msgid "Height in rack units" msgstr "" -#: netbox/dcim/models/racks.py:60 +#: netbox/dcim/models/racks.py:59 msgid "starting unit" msgstr "" -#: netbox/dcim/models/racks.py:62 +#: netbox/dcim/models/racks.py:61 msgid "Starting unit for rack" msgstr "" -#: netbox/dcim/models/racks.py:66 +#: netbox/dcim/models/racks.py:65 msgid "descending units" msgstr "" -#: netbox/dcim/models/racks.py:67 +#: netbox/dcim/models/racks.py:66 msgid "Units are numbered top-to-bottom" msgstr "" -#: netbox/dcim/models/racks.py:72 +#: netbox/dcim/models/racks.py:71 msgid "outer width" msgstr "" -#: netbox/dcim/models/racks.py:75 +#: netbox/dcim/models/racks.py:74 msgid "Outer dimension of rack (width)" msgstr "" -#: netbox/dcim/models/racks.py:78 +#: netbox/dcim/models/racks.py:77 msgid "outer depth" msgstr "" -#: netbox/dcim/models/racks.py:81 +#: netbox/dcim/models/racks.py:80 msgid "Outer dimension of rack (depth)" msgstr "" -#: netbox/dcim/models/racks.py:84 +#: netbox/dcim/models/racks.py:83 msgid "outer unit" msgstr "" @@ -6261,7 +6726,7 @@ msgstr "" msgid "Maximum load capacity for the rack" msgstr "" -#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:252 +#: netbox/dcim/models/racks.py:125 netbox/dcim/models/racks.py:247 msgid "form factor" msgstr "" @@ -6273,180 +6738,180 @@ msgstr "" msgid "rack types" msgstr "" -#: netbox/dcim/models/racks.py:180 netbox/dcim/models/racks.py:379 +#: netbox/dcim/models/racks.py:177 netbox/dcim/models/racks.py:368 msgid "Must specify a unit when setting an outer width/depth" msgstr "" -#: netbox/dcim/models/racks.py:184 netbox/dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:181 netbox/dcim/models/racks.py:372 msgid "Must specify a unit when setting a maximum weight" msgstr "" -#: netbox/dcim/models/racks.py:230 +#: netbox/dcim/models/racks.py:227 msgid "rack role" msgstr "" -#: netbox/dcim/models/racks.py:231 +#: netbox/dcim/models/racks.py:228 msgid "rack roles" msgstr "" -#: netbox/dcim/models/racks.py:274 +#: netbox/dcim/models/racks.py:265 msgid "facility ID" msgstr "" -#: netbox/dcim/models/racks.py:275 +#: netbox/dcim/models/racks.py:266 msgid "Locally-assigned identifier" msgstr "" -#: netbox/dcim/models/racks.py:308 netbox/ipam/forms/bulk_import.py:201 -#: netbox/ipam/forms/bulk_import.py:266 netbox/ipam/forms/bulk_import.py:301 -#: netbox/ipam/forms/bulk_import.py:483 -#: netbox/virtualization/forms/bulk_import.py:112 +#: netbox/dcim/models/racks.py:299 netbox/ipam/forms/bulk_import.py:197 +#: netbox/ipam/forms/bulk_import.py:265 netbox/ipam/forms/bulk_import.py:300 +#: netbox/ipam/forms/bulk_import.py:482 +#: netbox/virtualization/forms/bulk_import.py:118 msgid "Functional role" msgstr "" -#: netbox/dcim/models/racks.py:321 +#: netbox/dcim/models/racks.py:312 msgid "A unique tag used to identify this rack" msgstr "" -#: netbox/dcim/models/racks.py:359 +#: netbox/dcim/models/racks.py:351 msgid "rack" msgstr "" -#: netbox/dcim/models/racks.py:360 +#: netbox/dcim/models/racks.py:352 msgid "racks" msgstr "" -#: netbox/dcim/models/racks.py:375 +#: netbox/dcim/models/racks.py:364 #, python-brace-format msgid "Assigned location must belong to parent site ({site})." msgstr "" -#: netbox/dcim/models/racks.py:393 +#: netbox/dcim/models/racks.py:383 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "" -#: netbox/dcim/models/racks.py:400 +#: netbox/dcim/models/racks.py:391 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "" -#: netbox/dcim/models/racks.py:408 +#: netbox/dcim/models/racks.py:399 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "" -#: netbox/dcim/models/racks.py:670 +#: netbox/dcim/models/racks.py:661 msgid "units" msgstr "" -#: netbox/dcim/models/racks.py:696 +#: netbox/dcim/models/racks.py:687 msgid "rack reservation" msgstr "" -#: netbox/dcim/models/racks.py:697 +#: netbox/dcim/models/racks.py:688 msgid "rack reservations" msgstr "" -#: netbox/dcim/models/racks.py:714 +#: netbox/dcim/models/racks.py:702 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" -#: netbox/dcim/models/racks.py:727 +#: netbox/dcim/models/racks.py:715 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "" -#: netbox/dcim/models/sites.py:49 +#: netbox/dcim/models/sites.py:53 msgid "A top-level region with this name already exists." msgstr "" -#: netbox/dcim/models/sites.py:59 +#: netbox/dcim/models/sites.py:63 msgid "A top-level region with this slug already exists." msgstr "" -#: netbox/dcim/models/sites.py:62 +#: netbox/dcim/models/sites.py:66 msgid "region" msgstr "" -#: netbox/dcim/models/sites.py:63 +#: netbox/dcim/models/sites.py:67 msgid "regions" msgstr "" -#: netbox/dcim/models/sites.py:102 +#: netbox/dcim/models/sites.py:109 msgid "A top-level site group with this name already exists." msgstr "" -#: netbox/dcim/models/sites.py:112 +#: netbox/dcim/models/sites.py:119 msgid "A top-level site group with this slug already exists." msgstr "" -#: netbox/dcim/models/sites.py:115 +#: netbox/dcim/models/sites.py:122 msgid "site group" msgstr "" -#: netbox/dcim/models/sites.py:116 +#: netbox/dcim/models/sites.py:123 msgid "site groups" msgstr "" -#: netbox/dcim/models/sites.py:141 +#: netbox/dcim/models/sites.py:145 msgid "Full name of the site" msgstr "" -#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:279 +#: netbox/dcim/models/sites.py:181 netbox/dcim/models/sites.py:283 msgid "facility" msgstr "" -#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:282 +#: netbox/dcim/models/sites.py:184 netbox/dcim/models/sites.py:286 msgid "Local facility ID or description" msgstr "" -#: netbox/dcim/models/sites.py:195 +#: netbox/dcim/models/sites.py:196 msgid "physical address" msgstr "" -#: netbox/dcim/models/sites.py:198 +#: netbox/dcim/models/sites.py:199 msgid "Physical location of the building" msgstr "" -#: netbox/dcim/models/sites.py:201 +#: netbox/dcim/models/sites.py:202 msgid "shipping address" msgstr "" -#: netbox/dcim/models/sites.py:204 +#: netbox/dcim/models/sites.py:205 msgid "If different from the physical address" msgstr "" -#: netbox/dcim/models/sites.py:238 +#: netbox/dcim/models/sites.py:245 msgid "site" msgstr "" -#: netbox/dcim/models/sites.py:239 +#: netbox/dcim/models/sites.py:246 msgid "sites" msgstr "" -#: netbox/dcim/models/sites.py:309 +#: netbox/dcim/models/sites.py:319 msgid "A location with this name already exists within the specified site." msgstr "" -#: netbox/dcim/models/sites.py:319 +#: netbox/dcim/models/sites.py:329 msgid "A location with this slug already exists within the specified site." msgstr "" -#: netbox/dcim/models/sites.py:322 +#: netbox/dcim/models/sites.py:332 msgid "location" msgstr "" -#: netbox/dcim/models/sites.py:323 +#: netbox/dcim/models/sites.py:333 msgid "locations" msgstr "" -#: netbox/dcim/models/sites.py:337 +#: netbox/dcim/models/sites.py:344 #, python-brace-format msgid "Parent location ({parent}) must belong to the same site ({site})." msgstr "" @@ -6459,11 +6924,11 @@ msgstr "" msgid "Termination B" msgstr "" -#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:23 +#: netbox/dcim/tables/cables.py:66 netbox/wireless/tables/wirelesslink.py:22 msgid "Device A" msgstr "" -#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:32 +#: netbox/dcim/tables/cables.py:72 netbox/wireless/tables/wirelesslink.py:31 msgid "Device B" msgstr "" @@ -6497,23 +6962,23 @@ msgstr "" msgid "Reachable" msgstr "" -#: netbox/dcim/tables/devices.py:58 netbox/dcim/tables/devices.py:106 -#: netbox/dcim/tables/racks.py:150 netbox/dcim/tables/sites.py:105 +#: netbox/dcim/tables/devices.py:69 netbox/dcim/tables/devices.py:117 +#: netbox/dcim/tables/racks.py:149 netbox/dcim/tables/sites.py:105 #: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 #: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 #: netbox/netbox/navigation/menu.py:75 -#: netbox/virtualization/forms/model_forms.py:122 -#: netbox/virtualization/tables/clusters.py:83 -#: netbox/virtualization/views.py:204 +#: netbox/virtualization/forms/model_forms.py:121 +#: netbox/virtualization/tables/clusters.py:86 +#: netbox/virtualization/views.py:218 msgid "Devices" msgstr "" -#: netbox/dcim/tables/devices.py:63 netbox/dcim/tables/devices.py:111 -#: netbox/virtualization/tables/clusters.py:88 +#: netbox/dcim/tables/devices.py:74 netbox/dcim/tables/devices.py:122 +#: netbox/virtualization/tables/clusters.py:91 msgid "VMs" msgstr "" -#: netbox/dcim/tables/devices.py:100 netbox/dcim/tables/devices.py:216 +#: netbox/dcim/tables/devices.py:111 netbox/dcim/tables/devices.py:226 #: netbox/extras/forms/model_forms.py:630 netbox/templates/dcim/device.html:112 #: netbox/templates/dcim/device/render_config.html:11 #: netbox/templates/dcim/device/render_config.html:14 @@ -6523,70 +6988,66 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine.html:48 #: netbox/templates/virtualization/virtualmachine/render_config.html:11 #: netbox/templates/virtualization/virtualmachine/render_config.html:14 -#: netbox/virtualization/tables/virtualmachines.py:107 +#: netbox/virtualization/tables/virtualmachines.py:77 msgid "Config Template" msgstr "" -#: netbox/dcim/tables/devices.py:150 netbox/templates/dcim/sitegroup.html:26 -msgid "Site Group" -msgstr "" - -#: netbox/dcim/tables/devices.py:187 netbox/dcim/tables/devices.py:1068 -#: netbox/ipam/forms/bulk_import.py:527 netbox/ipam/forms/model_forms.py:306 -#: netbox/ipam/forms/model_forms.py:319 netbox/ipam/tables/ip.py:356 -#: netbox/ipam/tables/ip.py:423 netbox/ipam/tables/ip.py:446 +#: netbox/dcim/tables/devices.py:197 netbox/dcim/tables/devices.py:1099 +#: netbox/ipam/forms/bulk_import.py:562 netbox/ipam/forms/model_forms.py:308 +#: netbox/ipam/forms/model_forms.py:321 netbox/ipam/tables/ip.py:306 +#: netbox/ipam/tables/ip.py:373 netbox/ipam/tables/ip.py:396 #: netbox/templates/ipam/ipaddress.html:11 -#: netbox/virtualization/tables/virtualmachines.py:95 +#: netbox/virtualization/tables/virtualmachines.py:65 msgid "IP Address" msgstr "" -#: netbox/dcim/tables/devices.py:191 netbox/dcim/tables/devices.py:1072 -#: netbox/virtualization/tables/virtualmachines.py:86 +#: netbox/dcim/tables/devices.py:201 netbox/dcim/tables/devices.py:1103 +#: netbox/virtualization/tables/virtualmachines.py:56 msgid "IPv4 Address" msgstr "" -#: netbox/dcim/tables/devices.py:195 netbox/dcim/tables/devices.py:1076 -#: netbox/virtualization/tables/virtualmachines.py:90 +#: netbox/dcim/tables/devices.py:205 netbox/dcim/tables/devices.py:1107 +#: netbox/virtualization/tables/virtualmachines.py:60 msgid "IPv6 Address" msgstr "" -#: netbox/dcim/tables/devices.py:210 +#: netbox/dcim/tables/devices.py:220 msgid "VC Position" msgstr "" -#: netbox/dcim/tables/devices.py:213 +#: netbox/dcim/tables/devices.py:223 msgid "VC Priority" msgstr "" -#: netbox/dcim/tables/devices.py:220 netbox/templates/dcim/device_edit.html:38 +#: netbox/dcim/tables/devices.py:230 netbox/templates/dcim/device_edit.html:38 #: netbox/templates/dcim/devicebay_populate.html:16 msgid "Parent Device" msgstr "" -#: netbox/dcim/tables/devices.py:225 +#: netbox/dcim/tables/devices.py:235 msgid "Position (Device Bay)" msgstr "" -#: netbox/dcim/tables/devices.py:234 +#: netbox/dcim/tables/devices.py:244 msgid "Console ports" msgstr "" -#: netbox/dcim/tables/devices.py:237 +#: netbox/dcim/tables/devices.py:247 msgid "Console server ports" msgstr "" -#: netbox/dcim/tables/devices.py:240 +#: netbox/dcim/tables/devices.py:250 msgid "Power ports" msgstr "" -#: netbox/dcim/tables/devices.py:243 +#: netbox/dcim/tables/devices.py:253 msgid "Power outlets" msgstr "" -#: netbox/dcim/tables/devices.py:246 netbox/dcim/tables/devices.py:1081 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1040 -#: netbox/dcim/views.py:1279 netbox/dcim/views.py:1975 -#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:250 +#: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1112 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1112 +#: netbox/dcim/views.py:1356 netbox/dcim/views.py:2107 +#: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:258 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 #: netbox/templates/dcim/devicetype/base.html:34 @@ -6596,35 +7057,35 @@ msgstr "" #: netbox/templates/dcim/virtualdevicecontext.html:81 #: netbox/templates/virtualization/virtualmachine/base.html:27 #: netbox/templates/virtualization/virtualmachine_list.html:14 -#: netbox/virtualization/tables/virtualmachines.py:101 -#: netbox/virtualization/views.py:364 netbox/wireless/tables/wirelesslan.py:55 +#: netbox/virtualization/tables/virtualmachines.py:71 +#: netbox/virtualization/views.py:383 netbox/wireless/tables/wirelesslan.py:62 msgid "Interfaces" msgstr "" -#: netbox/dcim/tables/devices.py:249 +#: netbox/dcim/tables/devices.py:259 msgid "Front ports" msgstr "" -#: netbox/dcim/tables/devices.py:255 +#: netbox/dcim/tables/devices.py:265 msgid "Device bays" msgstr "" -#: netbox/dcim/tables/devices.py:258 +#: netbox/dcim/tables/devices.py:268 msgid "Module bays" msgstr "" -#: netbox/dcim/tables/devices.py:261 +#: netbox/dcim/tables/devices.py:271 msgid "Inventory items" msgstr "" -#: netbox/dcim/tables/devices.py:305 netbox/dcim/tables/modules.py:57 +#: netbox/dcim/tables/devices.py:314 netbox/dcim/tables/modules.py:57 #: netbox/templates/dcim/modulebay.html:17 msgid "Module Bay" msgstr "" -#: netbox/dcim/tables/devices.py:318 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1115 -#: netbox/dcim/views.py:2073 netbox/netbox/navigation/menu.py:103 +#: netbox/dcim/tables/devices.py:327 netbox/dcim/tables/devicetypes.py:47 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1187 +#: netbox/dcim/views.py:2205 netbox/netbox/navigation/menu.py:103 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -6633,85 +7094,89 @@ msgstr "" msgid "Inventory Items" msgstr "" -#: netbox/dcim/tables/devices.py:333 +#: netbox/dcim/tables/devices.py:342 msgid "Cable Color" msgstr "" -#: netbox/dcim/tables/devices.py:339 +#: netbox/dcim/tables/devices.py:348 msgid "Link Peers" msgstr "" -#: netbox/dcim/tables/devices.py:342 +#: netbox/dcim/tables/devices.py:351 msgid "Mark Connected" msgstr "" -#: netbox/dcim/tables/devices.py:461 +#: netbox/dcim/tables/devices.py:470 msgid "Maximum draw (W)" msgstr "" -#: netbox/dcim/tables/devices.py:464 +#: netbox/dcim/tables/devices.py:473 msgid "Allocated draw (W)" msgstr "" -#: netbox/dcim/tables/devices.py:558 netbox/ipam/forms/model_forms.py:734 -#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:596 -#: netbox/ipam/views.py:696 netbox/netbox/navigation/menu.py:158 -#: netbox/netbox/navigation/menu.py:160 -#: netbox/templates/dcim/interface.html:339 +#: netbox/dcim/tables/devices.py:571 netbox/ipam/forms/model_forms.py:776 +#: netbox/ipam/tables/fhrp.py:28 netbox/ipam/views.py:633 +#: netbox/ipam/views.py:738 netbox/netbox/navigation/menu.py:164 +#: netbox/netbox/navigation/menu.py:166 +#: netbox/templates/dcim/interface.html:396 #: netbox/templates/ipam/ipaddress_bulk_add.html:15 #: netbox/templates/ipam/service.html:40 -#: netbox/templates/virtualization/vminterface.html:85 +#: netbox/templates/virtualization/vminterface.html:101 #: netbox/vpn/tables/tunnels.py:98 msgid "IP Addresses" msgstr "" -#: netbox/dcim/tables/devices.py:564 netbox/netbox/navigation/menu.py:202 +#: netbox/dcim/tables/devices.py:577 netbox/netbox/navigation/menu.py:210 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:6 msgid "FHRP Groups" msgstr "" -#: netbox/dcim/tables/devices.py:576 netbox/templates/dcim/interface.html:89 -#: netbox/templates/virtualization/vminterface.html:67 +#: netbox/dcim/tables/devices.py:589 netbox/templates/dcim/interface.html:95 +#: netbox/templates/virtualization/vminterface.html:59 #: netbox/templates/vpn/tunnel.html:18 #: netbox/templates/vpn/tunneltermination.html:13 #: netbox/vpn/forms/bulk_edit.py:76 netbox/vpn/forms/bulk_import.py:76 #: netbox/vpn/forms/filtersets.py:42 netbox/vpn/forms/filtersets.py:82 -#: netbox/vpn/forms/model_forms.py:60 netbox/vpn/forms/model_forms.py:145 +#: netbox/vpn/forms/model_forms.py:61 netbox/vpn/forms/model_forms.py:146 #: netbox/vpn/tables/tunnels.py:78 msgid "Tunnel" msgstr "" -#: netbox/dcim/tables/devices.py:604 netbox/dcim/tables/devicetypes.py:227 +#: netbox/dcim/tables/devices.py:625 netbox/dcim/tables/devicetypes.py:229 #: netbox/templates/dcim/interface.html:65 msgid "Management Only" msgstr "" -#: netbox/dcim/tables/devices.py:623 +#: netbox/dcim/tables/devices.py:644 msgid "VDCs" msgstr "" -#: netbox/dcim/tables/devices.py:873 netbox/templates/dcim/modulebay.html:53 +#: netbox/dcim/tables/devices.py:651 netbox/templates/dcim/interface.html:163 +msgid "Virtual Circuit" +msgstr "" + +#: netbox/dcim/tables/devices.py:903 netbox/templates/dcim/modulebay.html:53 msgid "Installed Module" msgstr "" -#: netbox/dcim/tables/devices.py:876 +#: netbox/dcim/tables/devices.py:906 msgid "Module Serial" msgstr "" -#: netbox/dcim/tables/devices.py:880 +#: netbox/dcim/tables/devices.py:910 msgid "Module Asset Tag" msgstr "" -#: netbox/dcim/tables/devices.py:889 +#: netbox/dcim/tables/devices.py:919 msgid "Module Status" msgstr "" -#: netbox/dcim/tables/devices.py:944 netbox/dcim/tables/devicetypes.py:312 -#: netbox/templates/dcim/inventoryitem.html:40 +#: netbox/dcim/tables/devices.py:973 netbox/dcim/tables/devicetypes.py:314 +#: netbox/templates/dcim/inventoryitem.html:44 msgid "Component" msgstr "" -#: netbox/dcim/tables/devices.py:1000 +#: netbox/dcim/tables/devices.py:1031 msgid "Items" msgstr "" @@ -6749,8 +7214,8 @@ msgstr "" msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:980 -#: netbox/dcim/views.py:1219 netbox/dcim/views.py:1911 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1052 +#: netbox/dcim/views.py:1296 netbox/dcim/views.py:2043 #: netbox/netbox/navigation/menu.py:97 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -6760,8 +7225,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:995 -#: netbox/dcim/views.py:1234 netbox/dcim/views.py:1927 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1067 +#: netbox/dcim/views.py:1311 netbox/dcim/views.py:2059 #: netbox/netbox/navigation/menu.py:98 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -6771,8 +7236,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1010 -#: netbox/dcim/views.py:1249 netbox/dcim/views.py:1943 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1082 +#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2075 #: netbox/netbox/navigation/menu.py:99 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -6782,8 +7247,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1025 -#: netbox/dcim/views.py:1264 netbox/dcim/views.py:1959 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1097 +#: netbox/dcim/views.py:1341 netbox/dcim/views.py:2091 #: netbox/netbox/navigation/menu.py:100 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -6793,8 +7258,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1055 -#: netbox/dcim/views.py:1294 netbox/dcim/views.py:1997 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1127 +#: netbox/dcim/views.py:1371 netbox/dcim/views.py:2129 #: netbox/netbox/navigation/menu.py:95 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -6803,8 +7268,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1070 -#: netbox/dcim/views.py:1309 netbox/dcim/views.py:2013 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1142 +#: netbox/dcim/views.py:1386 netbox/dcim/views.py:2145 #: netbox/netbox/navigation/menu.py:96 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -6814,16 +7279,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1100 -#: netbox/dcim/views.py:2053 netbox/netbox/navigation/menu.py:102 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1172 +#: netbox/dcim/views.py:2185 netbox/netbox/navigation/menu.py:102 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1085 -#: netbox/dcim/views.py:1324 netbox/dcim/views.py:2033 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1157 +#: netbox/dcim/views.py:1401 netbox/dcim/views.py:2165 #: netbox/netbox/navigation/menu.py:101 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 @@ -6833,7 +7298,7 @@ msgstr "" msgid "Module Bays" msgstr "" -#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:297 +#: netbox/dcim/tables/power.py:36 netbox/netbox/navigation/menu.py:318 #: netbox/templates/dcim/powerpanel.html:51 msgid "Power Feeds" msgstr "" @@ -6852,39 +7317,39 @@ msgstr "" msgid "Racks" msgstr "" -#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:142 +#: netbox/dcim/tables/racks.py:63 netbox/dcim/tables/racks.py:141 #: netbox/templates/dcim/device.html:318 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:14 msgid "Height" msgstr "" -#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:165 +#: netbox/dcim/tables/racks.py:67 netbox/dcim/tables/racks.py:164 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:18 msgid "Outer Width" msgstr "" -#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:169 +#: netbox/dcim/tables/racks.py:71 netbox/dcim/tables/racks.py:168 #: netbox/templates/dcim/inc/panels/racktype_dimensions.html:28 msgid "Outer Depth" msgstr "" -#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:177 +#: netbox/dcim/tables/racks.py:79 netbox/dcim/tables/racks.py:176 msgid "Max Weight" msgstr "" -#: netbox/dcim/tables/racks.py:154 +#: netbox/dcim/tables/racks.py:153 msgid "Space" msgstr "" #: netbox/dcim/tables/sites.py:30 netbox/dcim/tables/sites.py:57 #: netbox/extras/forms/filtersets.py:351 netbox/extras/forms/model_forms.py:517 -#: netbox/ipam/forms/bulk_edit.py:131 netbox/ipam/forms/model_forms.py:153 +#: netbox/ipam/forms/bulk_edit.py:134 netbox/ipam/forms/model_forms.py:159 #: netbox/ipam/tables/asn.py:66 netbox/netbox/navigation/menu.py:15 #: netbox/netbox/navigation/menu.py:17 msgid "Sites" msgstr "" -#: netbox/dcim/tests/test_api.py:47 +#: netbox/dcim/tests/test_api.py:48 msgid "Test case must set peer_termination_type" msgstr "" @@ -6893,62 +7358,62 @@ msgstr "" msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:738 netbox/netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:794 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:757 netbox/templates/dcim/location.html:90 +#: netbox/dcim/views.py:813 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2086 netbox/extras/forms/model_forms.py:577 +#: netbox/dcim/views.py:2218 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 -#: netbox/virtualization/forms/model_forms.py:225 -#: netbox/virtualization/views.py:405 +#: netbox/virtualization/forms/model_forms.py:224 +#: netbox/virtualization/views.py:424 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2096 netbox/virtualization/views.py:415 +#: netbox/dcim/views.py:2228 netbox/virtualization/views.py:434 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2131 netbox/virtualization/views.py:450 +#: netbox/dcim/views.py:2263 netbox/virtualization/views.py:469 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "" -#: netbox/dcim/views.py:2149 netbox/extras/tables/tables.py:550 -#: netbox/netbox/navigation/menu.py:247 netbox/netbox/navigation/menu.py:249 -#: netbox/virtualization/views.py:178 +#: netbox/dcim/views.py:2281 netbox/extras/tables/tables.py:550 +#: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 +#: netbox/virtualization/views.py:192 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:2907 +#: netbox/dcim/views.py:3114 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:2948 +#: netbox/dcim/views.py:3155 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3054 netbox/ipam/tables/ip.py:234 +#: netbox/dcim/views.py:3271 netbox/ipam/tables/ip.py:180 msgid "Children" msgstr "" -#: netbox/dcim/views.py:3520 +#: netbox/dcim/views.py:3738 #, python-brace-format msgid "Added member {device}" msgstr "" -#: netbox/dcim/views.py:3567 +#: netbox/dcim/views.py:3787 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" -#: netbox/dcim/views.py:3580 +#: netbox/dcim/views.py:3800 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "" @@ -7047,7 +7512,7 @@ msgstr "" #: netbox/extras/choices.py:108 netbox/templates/tenancy/contact.html:57 #: netbox/tenancy/forms/bulk_edit.py:118 -#: netbox/wireless/forms/model_forms.py:168 +#: netbox/wireless/forms/model_forms.py:171 msgid "Link" msgstr "" @@ -7087,7 +7552,7 @@ msgstr "" msgid "Debug" msgstr "" -#: netbox/extras/choices.py:166 netbox/netbox/choices.py:101 +#: netbox/extras/choices.py:166 netbox/netbox/choices.py:103 msgid "Default" msgstr "" @@ -7095,22 +7560,10 @@ msgstr "" msgid "Failure" msgstr "" -#: netbox/extras/choices.py:186 -msgid "Hourly" -msgstr "" - #: netbox/extras/choices.py:187 msgid "12 hours" msgstr "" -#: netbox/extras/choices.py:188 -msgid "Daily" -msgstr "" - -#: netbox/extras/choices.py:189 -msgid "Weekly" -msgstr "" - #: netbox/extras/choices.py:190 msgid "30 days" msgstr "" @@ -7120,6 +7573,7 @@ msgstr "" #: netbox/templates/generic/bulk_add_component.html:68 #: netbox/templates/generic/object_edit.html:47 #: netbox/templates/generic/object_edit.html:80 +#: netbox/templates/htmx/quick_add.html:24 #: netbox/templates/ipam/inc/ipaddress_edit_header.html:7 msgid "Create" msgstr "" @@ -7143,67 +7597,67 @@ msgstr "" msgid "Delete" msgstr "" -#: netbox/extras/choices.py:252 netbox/netbox/choices.py:57 -#: netbox/netbox/choices.py:102 +#: netbox/extras/choices.py:252 netbox/netbox/choices.py:59 +#: netbox/netbox/choices.py:104 msgid "Blue" msgstr "" -#: netbox/extras/choices.py:253 netbox/netbox/choices.py:56 -#: netbox/netbox/choices.py:103 +#: netbox/extras/choices.py:253 netbox/netbox/choices.py:58 +#: netbox/netbox/choices.py:105 msgid "Indigo" msgstr "" -#: netbox/extras/choices.py:254 netbox/netbox/choices.py:54 -#: netbox/netbox/choices.py:104 +#: netbox/extras/choices.py:254 netbox/netbox/choices.py:56 +#: netbox/netbox/choices.py:106 msgid "Purple" msgstr "" -#: netbox/extras/choices.py:255 netbox/netbox/choices.py:51 -#: netbox/netbox/choices.py:105 +#: netbox/extras/choices.py:255 netbox/netbox/choices.py:53 +#: netbox/netbox/choices.py:107 msgid "Pink" msgstr "" -#: netbox/extras/choices.py:256 netbox/netbox/choices.py:50 -#: netbox/netbox/choices.py:106 +#: netbox/extras/choices.py:256 netbox/netbox/choices.py:52 +#: netbox/netbox/choices.py:108 msgid "Red" msgstr "" -#: netbox/extras/choices.py:257 netbox/netbox/choices.py:68 -#: netbox/netbox/choices.py:107 +#: netbox/extras/choices.py:257 netbox/netbox/choices.py:70 +#: netbox/netbox/choices.py:109 msgid "Orange" msgstr "" -#: netbox/extras/choices.py:258 netbox/netbox/choices.py:66 -#: netbox/netbox/choices.py:108 +#: netbox/extras/choices.py:258 netbox/netbox/choices.py:68 +#: netbox/netbox/choices.py:110 msgid "Yellow" msgstr "" -#: netbox/extras/choices.py:259 netbox/netbox/choices.py:63 -#: netbox/netbox/choices.py:109 +#: netbox/extras/choices.py:259 netbox/netbox/choices.py:65 +#: netbox/netbox/choices.py:111 msgid "Green" msgstr "" -#: netbox/extras/choices.py:260 netbox/netbox/choices.py:60 -#: netbox/netbox/choices.py:110 +#: netbox/extras/choices.py:260 netbox/netbox/choices.py:62 +#: netbox/netbox/choices.py:112 msgid "Teal" msgstr "" -#: netbox/extras/choices.py:261 netbox/netbox/choices.py:59 -#: netbox/netbox/choices.py:111 +#: netbox/extras/choices.py:261 netbox/netbox/choices.py:61 +#: netbox/netbox/choices.py:113 msgid "Cyan" msgstr "" -#: netbox/extras/choices.py:262 netbox/netbox/choices.py:112 +#: netbox/extras/choices.py:262 netbox/netbox/choices.py:114 msgid "Gray" msgstr "" -#: netbox/extras/choices.py:263 netbox/netbox/choices.py:74 -#: netbox/netbox/choices.py:113 +#: netbox/extras/choices.py:263 netbox/netbox/choices.py:76 +#: netbox/netbox/choices.py:115 msgid "Black" msgstr "" -#: netbox/extras/choices.py:264 netbox/netbox/choices.py:75 -#: netbox/netbox/choices.py:114 +#: netbox/extras/choices.py:264 netbox/netbox/choices.py:77 +#: netbox/netbox/choices.py:116 msgid "White" msgstr "" @@ -7310,29 +7764,33 @@ msgstr "" msgid "RSS Feed" msgstr "" -#: netbox/extras/dashboard/widgets.py:279 +#: netbox/extras/dashboard/widgets.py:280 msgid "Embed an RSS feed from an external website." msgstr "" -#: netbox/extras/dashboard/widgets.py:286 +#: netbox/extras/dashboard/widgets.py:287 msgid "Feed URL" msgstr "" -#: netbox/extras/dashboard/widgets.py:291 -msgid "The maximum number of objects to display" +#: netbox/extras/dashboard/widgets.py:290 +msgid "Requires external connection" msgstr "" #: netbox/extras/dashboard/widgets.py:296 +msgid "The maximum number of objects to display" +msgstr "" + +#: netbox/extras/dashboard/widgets.py:301 msgid "How long to stored the cached content (in seconds)" msgstr "" -#: netbox/extras/dashboard/widgets.py:348 netbox/templates/account/base.html:10 +#: netbox/extras/dashboard/widgets.py:358 netbox/templates/account/base.html:10 #: netbox/templates/account/bookmarks.html:7 -#: netbox/templates/inc/user_menu.html:48 +#: netbox/templates/inc/user_menu.html:43 msgid "Bookmarks" msgstr "" -#: netbox/extras/dashboard/widgets.py:352 +#: netbox/extras/dashboard/widgets.py:362 msgid "Show your personal bookmarks" msgstr "" @@ -7361,17 +7819,17 @@ msgid "Group (name)" msgstr "" #: netbox/extras/filtersets.py:574 -#: netbox/virtualization/forms/filtersets.py:118 +#: netbox/virtualization/forms/filtersets.py:123 msgid "Cluster type" msgstr "" -#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:95 -#: netbox/virtualization/filtersets.py:147 +#: netbox/extras/filtersets.py:580 netbox/virtualization/filtersets.py:61 +#: netbox/virtualization/filtersets.py:113 msgid "Cluster type (slug)" msgstr "" #: netbox/extras/filtersets.py:601 netbox/tenancy/forms/forms.py:16 -#: netbox/tenancy/forms/forms.py:39 +#: netbox/tenancy/forms/forms.py:40 msgid "Tenant group" msgstr "" @@ -7601,7 +8059,7 @@ msgid "The classification of entry" msgstr "" #: netbox/extras/forms/bulk_import.py:261 -#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:390 +#: netbox/extras/forms/model_forms.py:320 netbox/netbox/navigation/menu.py:411 #: netbox/templates/extras/notificationgroup.html:41 #: netbox/templates/users/group.html:29 netbox/users/forms/model_forms.py:236 #: netbox/users/forms/model_forms.py:248 netbox/users/forms/model_forms.py:300 @@ -7614,7 +8072,8 @@ msgid "User names separated by commas, encased with double quotes" msgstr "" #: netbox/extras/forms/bulk_import.py:268 -#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:410 +#: netbox/extras/forms/model_forms.py:315 netbox/netbox/navigation/menu.py:294 +#: netbox/netbox/navigation/menu.py:431 #: netbox/templates/extras/notificationgroup.html:31 #: netbox/users/forms/model_forms.py:181 netbox/users/forms/model_forms.py:193 #: netbox/users/forms/model_forms.py:305 netbox/users/tables.py:35 @@ -7647,7 +8106,7 @@ msgid "Data" msgstr "" #: netbox/extras/forms/filtersets.py:175 netbox/extras/forms/filtersets.py:333 -#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:130 +#: netbox/extras/forms/filtersets.py:418 netbox/netbox/choices.py:132 #: netbox/utilities/forms/bulk_import.py:26 msgid "Data file" msgstr "" @@ -7707,7 +8166,7 @@ msgid "Cluster groups" msgstr "" #: netbox/extras/forms/filtersets.py:386 netbox/extras/forms/model_forms.py:552 -#: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 +#: netbox/netbox/navigation/menu.py:263 netbox/netbox/navigation/menu.py:265 #: netbox/templates/virtualization/clustertype.html:30 #: netbox/virtualization/tables/clusters.py:23 #: netbox/virtualization/tables/clusters.py:45 @@ -7933,10 +8392,16 @@ msgstr "" msgid "Database changes have been reverted due to error." msgstr "" -#: netbox/extras/management/commands/reindex.py:66 +#: netbox/extras/management/commands/reindex.py:67 msgid "No indexers found!" msgstr "" +#: netbox/extras/models/configs.py:41 netbox/extras/models/models.py:313 +#: netbox/extras/models/models.py:522 netbox/extras/models/search.py:48 +#: netbox/ipam/models/ip.py:188 netbox/netbox/models/mixins.py:15 +msgid "weight" +msgstr "" + #: netbox/extras/models/configs.py:130 msgid "config context" msgstr "" @@ -8266,27 +8731,27 @@ msgstr "" msgid "Required field cannot be empty." msgstr "" -#: netbox/extras/models/customfields.py:763 +#: netbox/extras/models/customfields.py:764 msgid "Base set of predefined choices (optional)" msgstr "" -#: netbox/extras/models/customfields.py:775 +#: netbox/extras/models/customfields.py:776 msgid "Choices are automatically ordered alphabetically" msgstr "" -#: netbox/extras/models/customfields.py:782 +#: netbox/extras/models/customfields.py:783 msgid "custom field choice set" msgstr "" -#: netbox/extras/models/customfields.py:783 +#: netbox/extras/models/customfields.py:784 msgid "custom field choice sets" msgstr "" -#: netbox/extras/models/customfields.py:825 +#: netbox/extras/models/customfields.py:826 msgid "Must define base or extra choices." msgstr "" -#: netbox/extras/models/customfields.py:849 +#: netbox/extras/models/customfields.py:850 #, python-brace-format msgid "" "Cannot remove choice {choice} as there are {model} objects which reference " @@ -8556,20 +9021,20 @@ msgstr "" msgid "journal entries" msgstr "" -#: netbox/extras/models/models.py:718 +#: netbox/extras/models/models.py:721 #, python-brace-format msgid "Journaling is not supported for this object type ({type})." msgstr "" -#: netbox/extras/models/models.py:760 +#: netbox/extras/models/models.py:763 msgid "bookmark" msgstr "" -#: netbox/extras/models/models.py:761 +#: netbox/extras/models/models.py:764 msgid "bookmarks" msgstr "" -#: netbox/extras/models/models.py:774 +#: netbox/extras/models/models.py:777 #, python-brace-format msgid "Bookmarks cannot be assigned to this object type ({type})." msgstr "" @@ -8661,19 +9126,19 @@ msgstr "" msgid "cached values" msgstr "" -#: netbox/extras/models/staging.py:44 +#: netbox/extras/models/staging.py:45 msgid "branch" msgstr "" -#: netbox/extras/models/staging.py:45 +#: netbox/extras/models/staging.py:46 msgid "branches" msgstr "" -#: netbox/extras/models/staging.py:97 +#: netbox/extras/models/staging.py:105 msgid "staged change" msgstr "" -#: netbox/extras/models/staging.py:98 +#: netbox/extras/models/staging.py:106 msgid "staged changes" msgstr "" @@ -8874,27 +9339,27 @@ msgstr "" msgid "Invalid attribute \"{name}\" for {model}" msgstr "" -#: netbox/extras/views.py:960 +#: netbox/extras/views.py:1029 msgid "Your dashboard has been reset." msgstr "" -#: netbox/extras/views.py:1006 +#: netbox/extras/views.py:1075 msgid "Added widget: " msgstr "" -#: netbox/extras/views.py:1047 +#: netbox/extras/views.py:1116 msgid "Updated widget: " msgstr "" -#: netbox/extras/views.py:1083 +#: netbox/extras/views.py:1152 msgid "Deleted widget: " msgstr "" -#: netbox/extras/views.py:1085 +#: netbox/extras/views.py:1154 msgid "Error deleting widget: " msgstr "" -#: netbox/extras/views.py:1175 +#: netbox/extras/views.py:1244 msgid "Unable to run script: RQ worker process not running." msgstr "" @@ -8916,7 +9381,7 @@ msgstr "" msgid "Invalid IP prefix format: {data}" msgstr "" -#: netbox/ipam/api/views.py:358 +#: netbox/ipam/api/views.py:370 msgid "" "Insufficient space is available to accommodate the requested prefix size(s)" msgstr "" @@ -8957,182 +9422,174 @@ msgstr "" msgid "Plaintext" msgstr "" +#: netbox/ipam/choices.py:166 netbox/ipam/forms/model_forms.py:792 +#: netbox/ipam/forms/model_forms.py:820 netbox/templates/ipam/service.html:21 +msgid "Service" +msgstr "" + +#: netbox/ipam/choices.py:167 +msgid "Customer" +msgstr "" + #: netbox/ipam/fields.py:36 #, python-brace-format msgid "Invalid IP address format: {address}" msgstr "" -#: netbox/ipam/filtersets.py:48 netbox/vpn/filtersets.py:304 +#: netbox/ipam/filtersets.py:51 netbox/vpn/filtersets.py:304 msgid "Import target" msgstr "" -#: netbox/ipam/filtersets.py:54 netbox/vpn/filtersets.py:310 +#: netbox/ipam/filtersets.py:57 netbox/vpn/filtersets.py:310 msgid "Import target (name)" msgstr "" -#: netbox/ipam/filtersets.py:59 netbox/vpn/filtersets.py:315 +#: netbox/ipam/filtersets.py:62 netbox/vpn/filtersets.py:315 msgid "Export target" msgstr "" -#: netbox/ipam/filtersets.py:65 netbox/vpn/filtersets.py:321 +#: netbox/ipam/filtersets.py:68 netbox/vpn/filtersets.py:321 msgid "Export target (name)" msgstr "" -#: netbox/ipam/filtersets.py:86 +#: netbox/ipam/filtersets.py:89 msgid "Importing VRF" msgstr "" -#: netbox/ipam/filtersets.py:92 +#: netbox/ipam/filtersets.py:95 msgid "Import VRF (RD)" msgstr "" -#: netbox/ipam/filtersets.py:97 +#: netbox/ipam/filtersets.py:100 msgid "Exporting VRF" msgstr "" -#: netbox/ipam/filtersets.py:103 +#: netbox/ipam/filtersets.py:106 msgid "Export VRF (RD)" msgstr "" -#: netbox/ipam/filtersets.py:108 +#: netbox/ipam/filtersets.py:111 msgid "Importing L2VPN" msgstr "" -#: netbox/ipam/filtersets.py:114 +#: netbox/ipam/filtersets.py:117 msgid "Importing L2VPN (identifier)" msgstr "" -#: netbox/ipam/filtersets.py:119 +#: netbox/ipam/filtersets.py:122 msgid "Exporting L2VPN" msgstr "" -#: netbox/ipam/filtersets.py:125 +#: netbox/ipam/filtersets.py:128 msgid "Exporting L2VPN (identifier)" msgstr "" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 -#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 +#: netbox/ipam/filtersets.py:158 netbox/ipam/filtersets.py:286 +#: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:158 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "" -#: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:223 +#: netbox/ipam/filtersets.py:162 netbox/ipam/filtersets.py:201 +#: netbox/ipam/filtersets.py:226 msgid "RIR (ID)" msgstr "" -#: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:229 +#: netbox/ipam/filtersets.py:168 netbox/ipam/filtersets.py:207 +#: netbox/ipam/filtersets.py:232 msgid "RIR (slug)" msgstr "" -#: netbox/ipam/filtersets.py:287 +#: netbox/ipam/filtersets.py:290 msgid "Within prefix" msgstr "" -#: netbox/ipam/filtersets.py:291 +#: netbox/ipam/filtersets.py:294 msgid "Within and including prefix" msgstr "" -#: netbox/ipam/filtersets.py:295 +#: netbox/ipam/filtersets.py:298 msgid "Prefixes which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 -#: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 -#: netbox/ipam/forms/filtersets.py:331 +#: netbox/ipam/filtersets.py:309 netbox/ipam/filtersets.py:541 +#: netbox/ipam/forms/bulk_edit.py:327 netbox/ipam/forms/filtersets.py:198 +#: netbox/ipam/forms/filtersets.py:334 msgid "Mask length" msgstr "" -#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:342 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "" -#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:346 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "" -#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 -#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:440 netbox/ipam/filtersets.py:444 +#: netbox/ipam/filtersets.py:536 netbox/ipam/forms/model_forms.py:498 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "" -#: netbox/ipam/filtersets.py:481 +#: netbox/ipam/filtersets.py:448 msgid "Ranges which contain this prefix or IP" msgstr "" -#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 +#: netbox/ipam/filtersets.py:476 netbox/ipam/filtersets.py:532 msgid "Parent prefix" msgstr "" -#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 -#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 -msgid "Virtual machine (name)" -msgstr "" - -#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 -#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 -#: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 -msgid "Virtual machine (ID)" -msgstr "" - -#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 -#: netbox/vpn/filtersets.py:396 -msgid "Interface (name)" -msgstr "" - -#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 -#: netbox/vpn/filtersets.py:407 -msgid "VM interface (name)" -msgstr "" - -#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 -msgid "VM interface (ID)" -msgstr "" - -#: netbox/ipam/filtersets.py:650 +#: netbox/ipam/filtersets.py:617 msgid "FHRP group (ID)" msgstr "" -#: netbox/ipam/filtersets.py:654 +#: netbox/ipam/filtersets.py:621 msgid "Is assigned to an interface" msgstr "" -#: netbox/ipam/filtersets.py:658 +#: netbox/ipam/filtersets.py:625 msgid "Is assigned" msgstr "" -#: netbox/ipam/filtersets.py:670 +#: netbox/ipam/filtersets.py:637 msgid "Service (ID)" msgstr "" -#: netbox/ipam/filtersets.py:675 +#: netbox/ipam/filtersets.py:642 msgid "NAT inside IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 -msgid "Assigned interface" +#: netbox/ipam/filtersets.py:1001 +msgid "Q-in-Q SVLAN (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1048 +#: netbox/ipam/filtersets.py:1005 +msgid "Q-in-Q SVLAN number (1-4094)" +msgstr "" + +#: netbox/ipam/filtersets.py:1026 msgid "Assigned VM interface" msgstr "" -#: netbox/ipam/filtersets.py:1138 +#: netbox/ipam/filtersets.py:1097 +msgid "VLAN Translation Policy (name)" +msgstr "" + +#: netbox/ipam/filtersets.py:1163 msgid "IP address (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1169 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "" -#: netbox/ipam/filtersets.py:1169 +#: netbox/ipam/filtersets.py:1194 msgid "Primary IPv4 (ID)" msgstr "" -#: netbox/ipam/filtersets.py:1174 +#: netbox/ipam/filtersets.py:1199 msgid "Primary IPv6 (ID)" msgstr "" @@ -9165,471 +9622,445 @@ msgstr "" msgid "Address pattern" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:50 +#: netbox/ipam/forms/bulk_edit.py:53 msgid "Enforce unique space" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:88 +#: netbox/ipam/forms/bulk_edit.py:91 msgid "Is private" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:109 netbox/ipam/forms/bulk_edit.py:138 -#: netbox/ipam/forms/bulk_edit.py:163 netbox/ipam/forms/bulk_import.py:89 -#: netbox/ipam/forms/bulk_import.py:109 netbox/ipam/forms/bulk_import.py:129 -#: netbox/ipam/forms/filtersets.py:110 netbox/ipam/forms/filtersets.py:125 -#: netbox/ipam/forms/filtersets.py:148 netbox/ipam/forms/model_forms.py:96 -#: netbox/ipam/forms/model_forms.py:109 netbox/ipam/forms/model_forms.py:131 -#: netbox/ipam/forms/model_forms.py:149 netbox/ipam/models/asns.py:31 -#: netbox/ipam/models/asns.py:103 netbox/ipam/models/ip.py:71 -#: netbox/ipam/models/ip.py:90 netbox/ipam/tables/asn.py:20 +#: netbox/ipam/forms/bulk_edit.py:112 netbox/ipam/forms/bulk_edit.py:141 +#: netbox/ipam/forms/bulk_edit.py:166 netbox/ipam/forms/bulk_import.py:92 +#: netbox/ipam/forms/bulk_import.py:112 netbox/ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/filtersets.py:112 netbox/ipam/forms/filtersets.py:127 +#: netbox/ipam/forms/filtersets.py:150 netbox/ipam/forms/model_forms.py:99 +#: netbox/ipam/forms/model_forms.py:112 netbox/ipam/forms/model_forms.py:135 +#: netbox/ipam/forms/model_forms.py:154 netbox/ipam/models/asns.py:31 +#: netbox/ipam/models/asns.py:100 netbox/ipam/models/ip.py:71 +#: netbox/ipam/models/ip.py:87 netbox/ipam/tables/asn.py:20 #: netbox/ipam/tables/asn.py:45 netbox/templates/ipam/aggregate.html:18 #: netbox/templates/ipam/asn.html:27 netbox/templates/ipam/asnrange.html:19 #: netbox/templates/ipam/rir.html:19 msgid "RIR" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:171 +#: netbox/ipam/forms/bulk_edit.py:174 msgid "Date added" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:229 netbox/ipam/forms/model_forms.py:619 -#: netbox/ipam/forms/model_forms.py:666 netbox/ipam/tables/ip.py:251 -#: netbox/templates/ipam/vlan_edit.html:37 +#: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/model_forms.py:621 +#: netbox/ipam/forms/model_forms.py:668 netbox/ipam/tables/ip.py:200 +#: netbox/templates/ipam/vlan_edit.html:45 #: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:234 netbox/ipam/forms/bulk_import.py:185 -#: netbox/ipam/forms/filtersets.py:256 netbox/ipam/forms/model_forms.py:218 -#: netbox/ipam/models/vlans.py:250 netbox/ipam/tables/ip.py:255 -#: netbox/templates/ipam/prefix.html:60 netbox/templates/ipam/vlan.html:12 +#: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_import.py:181 +#: netbox/ipam/forms/filtersets.py:259 netbox/ipam/forms/model_forms.py:217 +#: netbox/ipam/models/vlans.py:272 netbox/ipam/tables/ip.py:204 +#: netbox/templates/ipam/prefix.html:56 netbox/templates/ipam/vlan.html:12 #: netbox/templates/ipam/vlan/base.html:6 #: netbox/templates/ipam/vlan_edit.html:10 -#: netbox/templates/wireless/wirelesslan.html:30 +#: netbox/templates/wireless/wirelesslan.html:38 #: netbox/vpn/forms/bulk_import.py:304 netbox/vpn/forms/filtersets.py:284 -#: netbox/vpn/forms/model_forms.py:433 netbox/vpn/forms/model_forms.py:452 -#: netbox/wireless/forms/bulk_edit.py:55 -#: netbox/wireless/forms/bulk_import.py:48 -#: netbox/wireless/forms/model_forms.py:48 netbox/wireless/models.py:102 +#: netbox/vpn/forms/model_forms.py:436 netbox/vpn/forms/model_forms.py:455 +#: netbox/wireless/forms/bulk_edit.py:57 +#: netbox/wireless/forms/bulk_import.py:50 +#: netbox/wireless/forms/model_forms.py:50 netbox/wireless/models.py:102 msgid "VLAN" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:245 +#: netbox/ipam/forms/bulk_edit.py:229 msgid "Prefix length" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:268 netbox/ipam/forms/filtersets.py:241 -#: netbox/templates/ipam/prefix.html:85 +#: netbox/ipam/forms/bulk_edit.py:252 netbox/ipam/forms/filtersets.py:244 +#: netbox/templates/ipam/prefix.html:81 msgid "Is a pool" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:273 netbox/ipam/forms/bulk_edit.py:318 -#: netbox/ipam/forms/filtersets.py:248 netbox/ipam/forms/filtersets.py:293 -#: netbox/ipam/models/ip.py:272 netbox/ipam/models/ip.py:539 +#: netbox/ipam/forms/bulk_edit.py:257 netbox/ipam/forms/bulk_edit.py:302 +#: netbox/ipam/forms/filtersets.py:251 netbox/ipam/forms/filtersets.py:296 +#: netbox/ipam/models/ip.py:256 netbox/ipam/models/ip.py:525 msgid "Treat as fully utilized" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:287 netbox/ipam/forms/filtersets.py:171 +#: netbox/ipam/forms/bulk_edit.py:271 netbox/ipam/forms/filtersets.py:173 +#: netbox/ipam/forms/model_forms.py:232 msgid "VLAN Assignment" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:366 netbox/ipam/models/ip.py:772 +#: netbox/ipam/forms/bulk_edit.py:350 netbox/ipam/models/ip.py:772 msgid "DNS name" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:387 netbox/ipam/forms/bulk_edit.py:534 -#: netbox/ipam/forms/bulk_import.py:418 netbox/ipam/forms/bulk_import.py:493 -#: netbox/ipam/forms/bulk_import.py:519 netbox/ipam/forms/filtersets.py:390 -#: netbox/ipam/forms/filtersets.py:530 netbox/templates/ipam/fhrpgroup.html:22 +#: netbox/ipam/forms/bulk_edit.py:371 netbox/ipam/forms/bulk_edit.py:562 +#: netbox/ipam/forms/bulk_import.py:417 netbox/ipam/forms/bulk_import.py:528 +#: netbox/ipam/forms/bulk_import.py:554 netbox/ipam/forms/filtersets.py:393 +#: netbox/ipam/forms/filtersets.py:582 netbox/templates/ipam/fhrpgroup.html:22 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:24 #: netbox/templates/ipam/service.html:32 #: netbox/templates/ipam/servicetemplate.html:19 msgid "Protocol" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:394 netbox/ipam/forms/filtersets.py:397 +#: netbox/ipam/forms/bulk_edit.py:378 netbox/ipam/forms/filtersets.py:400 #: netbox/ipam/tables/fhrp.py:22 netbox/templates/ipam/fhrpgroup.html:26 msgid "Group ID" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:399 netbox/ipam/forms/filtersets.py:402 -#: netbox/wireless/forms/bulk_edit.py:68 netbox/wireless/forms/bulk_edit.py:115 -#: netbox/wireless/forms/bulk_import.py:62 -#: netbox/wireless/forms/bulk_import.py:65 -#: netbox/wireless/forms/bulk_import.py:104 -#: netbox/wireless/forms/bulk_import.py:107 -#: netbox/wireless/forms/filtersets.py:54 -#: netbox/wireless/forms/filtersets.py:88 +#: netbox/ipam/forms/bulk_edit.py:383 netbox/ipam/forms/filtersets.py:405 +#: netbox/wireless/forms/bulk_edit.py:70 netbox/wireless/forms/bulk_edit.py:118 +#: netbox/wireless/forms/bulk_import.py:64 +#: netbox/wireless/forms/bulk_import.py:67 +#: netbox/wireless/forms/bulk_import.py:109 +#: netbox/wireless/forms/bulk_import.py:112 +#: netbox/wireless/forms/filtersets.py:57 +#: netbox/wireless/forms/filtersets.py:116 msgid "Authentication type" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:404 netbox/ipam/forms/filtersets.py:406 +#: netbox/ipam/forms/bulk_edit.py:388 netbox/ipam/forms/filtersets.py:409 msgid "Authentication key" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:421 netbox/ipam/forms/filtersets.py:383 -#: netbox/ipam/forms/model_forms.py:507 netbox/netbox/navigation/menu.py:386 +#: netbox/ipam/forms/bulk_edit.py:405 netbox/ipam/forms/filtersets.py:386 +#: netbox/ipam/forms/model_forms.py:509 netbox/netbox/navigation/menu.py:407 #: netbox/templates/ipam/fhrpgroup.html:49 #: netbox/templates/wireless/inc/authentication_attrs.html:5 -#: netbox/wireless/forms/bulk_edit.py:91 netbox/wireless/forms/bulk_edit.py:149 -#: netbox/wireless/forms/filtersets.py:36 -#: netbox/wireless/forms/filtersets.py:76 -#: netbox/wireless/forms/model_forms.py:55 -#: netbox/wireless/forms/model_forms.py:171 +#: netbox/wireless/forms/bulk_edit.py:94 netbox/wireless/forms/bulk_edit.py:152 +#: netbox/wireless/forms/filtersets.py:39 +#: netbox/wireless/forms/filtersets.py:104 +#: netbox/wireless/forms/model_forms.py:58 +#: netbox/wireless/forms/model_forms.py:174 msgid "Authentication" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:436 netbox/ipam/forms/model_forms.py:608 -msgid "Scope type" -msgstr "" - -#: netbox/ipam/forms/bulk_edit.py:439 netbox/ipam/forms/bulk_edit.py:453 -#: netbox/ipam/forms/model_forms.py:611 netbox/ipam/forms/model_forms.py:621 -#: netbox/ipam/tables/vlans.py:71 netbox/templates/ipam/vlangroup.html:38 -msgid "Scope" -msgstr "" - -#: netbox/ipam/forms/bulk_edit.py:446 netbox/ipam/models/vlans.py:60 +#: netbox/ipam/forms/bulk_edit.py:430 netbox/ipam/models/vlans.py:62 msgid "VLAN ID ranges" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:525 +#: netbox/ipam/forms/bulk_edit.py:505 netbox/ipam/forms/bulk_import.py:485 +#: netbox/ipam/forms/filtersets.py:557 netbox/ipam/models/vlans.py:232 +#: netbox/ipam/tables/vlans.py:103 +msgid "Q-in-Q role" +msgstr "" + +#: netbox/ipam/forms/bulk_edit.py:522 +msgid "Q-in-Q" +msgstr "" + +#: netbox/ipam/forms/bulk_edit.py:523 msgid "Site & Group" msgstr "" -#: netbox/ipam/forms/bulk_edit.py:539 netbox/ipam/forms/model_forms.py:692 -#: netbox/ipam/forms/model_forms.py:724 netbox/ipam/tables/services.py:19 +#: netbox/ipam/forms/bulk_edit.py:546 netbox/ipam/forms/bulk_import.py:515 +#: netbox/ipam/forms/model_forms.py:716 netbox/ipam/tables/vlans.py:256 +#: netbox/templates/ipam/vlantranslationrule.html:14 +#: netbox/vpn/forms/model_forms.py:322 netbox/vpn/forms/model_forms.py:359 +msgid "Policy" +msgstr "" + +#: netbox/ipam/forms/bulk_edit.py:567 netbox/ipam/forms/model_forms.py:734 +#: netbox/ipam/forms/model_forms.py:766 netbox/ipam/tables/services.py:19 #: netbox/ipam/tables/services.py:49 netbox/templates/ipam/service.html:36 #: netbox/templates/ipam/servicetemplate.html:23 msgid "Ports" msgstr "" -#: netbox/ipam/forms/bulk_import.py:48 +#: netbox/ipam/forms/bulk_import.py:51 msgid "Import route targets" msgstr "" -#: netbox/ipam/forms/bulk_import.py:54 +#: netbox/ipam/forms/bulk_import.py:57 msgid "Export route targets" msgstr "" -#: netbox/ipam/forms/bulk_import.py:92 netbox/ipam/forms/bulk_import.py:112 -#: netbox/ipam/forms/bulk_import.py:132 +#: netbox/ipam/forms/bulk_import.py:95 netbox/ipam/forms/bulk_import.py:115 +#: netbox/ipam/forms/bulk_import.py:135 msgid "Assigned RIR" msgstr "" -#: netbox/ipam/forms/bulk_import.py:182 +#: netbox/ipam/forms/bulk_import.py:178 msgid "VLAN's group (if any)" msgstr "" -#: netbox/ipam/forms/bulk_import.py:308 -msgid "Parent device of assigned interface (if any)" -msgstr "" - -#: netbox/ipam/forms/bulk_import.py:311 netbox/ipam/forms/bulk_import.py:512 -#: netbox/ipam/forms/model_forms.py:718 netbox/virtualization/filtersets.py:288 -#: netbox/virtualization/filtersets.py:327 -#: netbox/virtualization/forms/bulk_edit.py:200 -#: netbox/virtualization/forms/bulk_edit.py:326 -#: netbox/virtualization/forms/bulk_import.py:146 -#: netbox/virtualization/forms/bulk_import.py:207 -#: netbox/virtualization/forms/filtersets.py:212 -#: netbox/virtualization/forms/filtersets.py:248 -#: netbox/virtualization/forms/model_forms.py:288 -#: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 -msgid "Virtual machine" -msgstr "" - -#: netbox/ipam/forms/bulk_import.py:315 -msgid "Parent VM of assigned interface (if any)" +#: netbox/ipam/forms/bulk_import.py:207 +#: netbox/virtualization/forms/bulk_import.py:80 +#: netbox/wireless/forms/bulk_import.py:83 +msgid "Scope ID" msgstr "" #: netbox/ipam/forms/bulk_import.py:325 -msgid "Is primary" -msgstr "" - -#: netbox/ipam/forms/bulk_import.py:326 msgid "Make this the primary IP for the assigned device" msgstr "" -#: netbox/ipam/forms/bulk_import.py:330 +#: netbox/ipam/forms/bulk_import.py:329 msgid "Is out-of-band" msgstr "" -#: netbox/ipam/forms/bulk_import.py:331 +#: netbox/ipam/forms/bulk_import.py:330 msgid "Designate this as the out-of-band IP address for the assigned device" msgstr "" -#: netbox/ipam/forms/bulk_import.py:371 +#: netbox/ipam/forms/bulk_import.py:370 msgid "No device or virtual machine specified; cannot set as primary IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:375 +#: netbox/ipam/forms/bulk_import.py:374 msgid "No device specified; cannot set as out-of-band IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:379 +#: netbox/ipam/forms/bulk_import.py:378 msgid "Cannot set out-of-band IP for virtual machines" msgstr "" -#: netbox/ipam/forms/bulk_import.py:383 +#: netbox/ipam/forms/bulk_import.py:382 msgid "No interface specified; cannot set as primary IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:387 +#: netbox/ipam/forms/bulk_import.py:386 msgid "No interface specified; cannot set as out-of-band IP" msgstr "" -#: netbox/ipam/forms/bulk_import.py:422 +#: netbox/ipam/forms/bulk_import.py:421 msgid "Auth type" msgstr "" -#: netbox/ipam/forms/bulk_import.py:437 -msgid "Scope type (app & model)" -msgstr "" - -#: netbox/ipam/forms/bulk_import.py:464 +#: netbox/ipam/forms/bulk_import.py:463 msgid "Assigned VLAN group" msgstr "" -#: netbox/ipam/forms/bulk_import.py:495 netbox/ipam/forms/bulk_import.py:521 +#: netbox/ipam/forms/bulk_import.py:495 +msgid "Service VLAN (for Q-in-Q/802.1ad customer VLANs)" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:518 netbox/ipam/models/vlans.py:343 +msgid "VLAN translation policy" +msgstr "" + +#: netbox/ipam/forms/bulk_import.py:530 netbox/ipam/forms/bulk_import.py:556 msgid "IP protocol" msgstr "" -#: netbox/ipam/forms/bulk_import.py:509 +#: netbox/ipam/forms/bulk_import.py:544 msgid "Required if not assigned to a VM" msgstr "" -#: netbox/ipam/forms/bulk_import.py:516 +#: netbox/ipam/forms/bulk_import.py:551 msgid "Required if not assigned to a device" msgstr "" -#: netbox/ipam/forms/bulk_import.py:541 +#: netbox/ipam/forms/bulk_import.py:576 #, python-brace-format msgid "{ip} is not assigned to this device/VM." msgstr "" -#: netbox/ipam/forms/filtersets.py:47 netbox/ipam/forms/model_forms.py:63 -#: netbox/netbox/navigation/menu.py:189 netbox/vpn/forms/model_forms.py:410 +#: netbox/ipam/forms/filtersets.py:49 netbox/ipam/forms/model_forms.py:66 +#: netbox/netbox/navigation/menu.py:195 netbox/vpn/forms/model_forms.py:413 msgid "Route Targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:53 netbox/ipam/forms/model_forms.py:50 -#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:397 +#: netbox/ipam/forms/filtersets.py:55 netbox/ipam/forms/model_forms.py:53 +#: netbox/vpn/forms/filtersets.py:224 netbox/vpn/forms/model_forms.py:400 msgid "Import targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:58 netbox/ipam/forms/model_forms.py:55 -#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:402 +#: netbox/ipam/forms/filtersets.py:60 netbox/ipam/forms/model_forms.py:58 +#: netbox/vpn/forms/filtersets.py:229 netbox/vpn/forms/model_forms.py:405 msgid "Export targets" msgstr "" -#: netbox/ipam/forms/filtersets.py:73 +#: netbox/ipam/forms/filtersets.py:75 msgid "Imported by VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:78 +#: netbox/ipam/forms/filtersets.py:80 msgid "Exported by VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:87 netbox/ipam/tables/ip.py:89 +#: netbox/ipam/forms/filtersets.py:89 netbox/ipam/tables/ip.py:35 #: netbox/templates/ipam/rir.html:30 msgid "Private" msgstr "" -#: netbox/ipam/forms/filtersets.py:105 netbox/ipam/forms/filtersets.py:191 -#: netbox/ipam/forms/filtersets.py:272 netbox/ipam/forms/filtersets.py:326 +#: netbox/ipam/forms/filtersets.py:107 netbox/ipam/forms/filtersets.py:193 +#: netbox/ipam/forms/filtersets.py:275 netbox/ipam/forms/filtersets.py:329 msgid "Address family" msgstr "" -#: netbox/ipam/forms/filtersets.py:119 netbox/templates/ipam/asnrange.html:25 +#: netbox/ipam/forms/filtersets.py:121 netbox/templates/ipam/asnrange.html:25 msgid "Range" msgstr "" -#: netbox/ipam/forms/filtersets.py:128 +#: netbox/ipam/forms/filtersets.py:130 msgid "Start" msgstr "" -#: netbox/ipam/forms/filtersets.py:132 +#: netbox/ipam/forms/filtersets.py:134 msgid "End" msgstr "" -#: netbox/ipam/forms/filtersets.py:186 +#: netbox/ipam/forms/filtersets.py:188 msgid "Search within" msgstr "" -#: netbox/ipam/forms/filtersets.py:207 netbox/ipam/forms/filtersets.py:342 +#: netbox/ipam/forms/filtersets.py:209 netbox/ipam/forms/filtersets.py:345 msgid "Present in VRF" msgstr "" -#: netbox/ipam/forms/filtersets.py:311 +#: netbox/ipam/forms/filtersets.py:314 msgid "Device/VM" msgstr "" -#: netbox/ipam/forms/filtersets.py:321 +#: netbox/ipam/forms/filtersets.py:324 msgid "Parent Prefix" msgstr "" -#: netbox/ipam/forms/filtersets.py:347 -msgid "Assigned Device" -msgstr "" - -#: netbox/ipam/forms/filtersets.py:352 -msgid "Assigned VM" -msgstr "" - -#: netbox/ipam/forms/filtersets.py:366 +#: netbox/ipam/forms/filtersets.py:369 msgid "Assigned to an interface" msgstr "" -#: netbox/ipam/forms/filtersets.py:373 netbox/templates/ipam/ipaddress.html:51 +#: netbox/ipam/forms/filtersets.py:376 netbox/templates/ipam/ipaddress.html:51 msgid "DNS Name" msgstr "" -#: netbox/ipam/forms/filtersets.py:416 netbox/ipam/models/vlans.py:251 -#: netbox/ipam/tables/ip.py:176 netbox/ipam/tables/vlans.py:82 -#: netbox/ipam/views.py:971 netbox/netbox/navigation/menu.py:193 -#: netbox/netbox/navigation/menu.py:195 +#: netbox/ipam/forms/filtersets.py:419 netbox/ipam/models/vlans.py:273 +#: netbox/ipam/tables/ip.py:122 netbox/ipam/tables/vlans.py:51 +#: netbox/ipam/views.py:1029 netbox/netbox/navigation/menu.py:199 +#: netbox/netbox/navigation/menu.py:201 msgid "VLANs" msgstr "" -#: netbox/ipam/forms/filtersets.py:457 +#: netbox/ipam/forms/filtersets.py:460 msgid "Contains VLAN ID" msgstr "" -#: netbox/ipam/forms/filtersets.py:513 netbox/ipam/models/vlans.py:192 +#: netbox/ipam/forms/filtersets.py:494 netbox/ipam/models/vlans.py:363 +msgid "Local VLAN ID" +msgstr "" + +#: netbox/ipam/forms/filtersets.py:499 netbox/ipam/models/vlans.py:371 +msgid "Remote VLAN ID" +msgstr "" + +#: netbox/ipam/forms/filtersets.py:509 +msgid "Q-in-Q/802.1ad" +msgstr "" + +#: netbox/ipam/forms/filtersets.py:554 netbox/ipam/models/vlans.py:191 #: netbox/templates/ipam/vlan.html:31 msgid "VLAN ID" msgstr "" -#: netbox/ipam/forms/filtersets.py:556 netbox/ipam/forms/model_forms.py:324 -#: netbox/ipam/forms/model_forms.py:746 netbox/ipam/forms/model_forms.py:772 -#: netbox/ipam/tables/vlans.py:195 -#: netbox/templates/virtualization/virtualdisk.html:21 -#: netbox/templates/virtualization/virtualmachine.html:12 -#: netbox/templates/virtualization/vminterface.html:21 -#: netbox/templates/vpn/tunneltermination.html:25 -#: netbox/virtualization/forms/filtersets.py:197 -#: netbox/virtualization/forms/filtersets.py:242 -#: netbox/virtualization/forms/model_forms.py:220 -#: netbox/virtualization/tables/virtualmachines.py:135 -#: netbox/virtualization/tables/virtualmachines.py:190 netbox/vpn/choices.py:53 -#: netbox/vpn/forms/filtersets.py:293 netbox/vpn/forms/model_forms.py:160 -#: netbox/vpn/forms/model_forms.py:171 netbox/vpn/forms/model_forms.py:273 -#: netbox/vpn/forms/model_forms.py:454 -msgid "Virtual Machine" -msgstr "" - -#: netbox/ipam/forms/model_forms.py:80 +#: netbox/ipam/forms/model_forms.py:83 #: netbox/templates/ipam/routetarget.html:10 msgid "Route Target" msgstr "" -#: netbox/ipam/forms/model_forms.py:114 netbox/ipam/tables/ip.py:117 +#: netbox/ipam/forms/model_forms.py:118 netbox/ipam/tables/ip.py:63 #: netbox/templates/ipam/aggregate.html:11 netbox/templates/ipam/prefix.html:38 msgid "Aggregate" msgstr "" -#: netbox/ipam/forms/model_forms.py:135 netbox/templates/ipam/asnrange.html:12 +#: netbox/ipam/forms/model_forms.py:140 netbox/templates/ipam/asnrange.html:12 msgid "ASN Range" msgstr "" -#: netbox/ipam/forms/model_forms.py:231 -msgid "Site/VLAN Assignment" -msgstr "" - -#: netbox/ipam/forms/model_forms.py:259 netbox/templates/ipam/iprange.html:10 +#: netbox/ipam/forms/model_forms.py:261 netbox/templates/ipam/iprange.html:10 msgid "IP Range" msgstr "" -#: netbox/ipam/forms/model_forms.py:295 netbox/ipam/forms/model_forms.py:325 -#: netbox/ipam/forms/model_forms.py:506 netbox/templates/ipam/fhrpgroup.html:19 +#: netbox/ipam/forms/model_forms.py:297 netbox/ipam/forms/model_forms.py:327 +#: netbox/ipam/forms/model_forms.py:508 netbox/templates/ipam/fhrpgroup.html:19 msgid "FHRP Group" msgstr "" -#: netbox/ipam/forms/model_forms.py:310 +#: netbox/ipam/forms/model_forms.py:312 msgid "Make this the primary IP for the device/VM" msgstr "" -#: netbox/ipam/forms/model_forms.py:314 +#: netbox/ipam/forms/model_forms.py:316 msgid "Make this the out-of-band IP for the device" msgstr "" -#: netbox/ipam/forms/model_forms.py:329 +#: netbox/ipam/forms/model_forms.py:331 msgid "NAT IP (Inside)" msgstr "" -#: netbox/ipam/forms/model_forms.py:391 +#: netbox/ipam/forms/model_forms.py:393 msgid "An IP address can only be assigned to a single object." msgstr "" -#: netbox/ipam/forms/model_forms.py:398 +#: netbox/ipam/forms/model_forms.py:400 msgid "Cannot reassign primary IP address for the parent device/VM" msgstr "" -#: netbox/ipam/forms/model_forms.py:402 +#: netbox/ipam/forms/model_forms.py:404 msgid "Cannot reassign out-of-Band IP address for the parent device" msgstr "" -#: netbox/ipam/forms/model_forms.py:412 +#: netbox/ipam/forms/model_forms.py:414 msgid "" "Only IP addresses assigned to an interface can be designated as primary IPs." msgstr "" -#: netbox/ipam/forms/model_forms.py:420 +#: netbox/ipam/forms/model_forms.py:422 msgid "" "Only IP addresses assigned to a device interface can be designated as the " "out-of-band IP for a device." msgstr "" -#: netbox/ipam/forms/model_forms.py:508 +#: netbox/ipam/forms/model_forms.py:510 msgid "Virtual IP Address" msgstr "" -#: netbox/ipam/forms/model_forms.py:593 +#: netbox/ipam/forms/model_forms.py:595 msgid "Assignment already exists" msgstr "" -#: netbox/ipam/forms/model_forms.py:602 netbox/templates/ipam/vlangroup.html:42 +#: netbox/ipam/forms/model_forms.py:604 netbox/templates/ipam/vlangroup.html:42 msgid "VLAN IDs" msgstr "" -#: netbox/ipam/forms/model_forms.py:620 +#: netbox/ipam/forms/model_forms.py:622 msgid "Child VLANs" msgstr "" -#: netbox/ipam/forms/model_forms.py:697 netbox/ipam/forms/model_forms.py:729 +#: netbox/ipam/forms/model_forms.py:722 +#: netbox/templates/ipam/vlantranslationrule.html:11 +msgid "VLAN Translation Rule" +msgstr "" + +#: netbox/ipam/forms/model_forms.py:739 netbox/ipam/forms/model_forms.py:771 msgid "" "Comma-separated list of one or more port numbers. A range may be specified " "using a hyphen." msgstr "" -#: netbox/ipam/forms/model_forms.py:702 +#: netbox/ipam/forms/model_forms.py:744 #: netbox/templates/ipam/servicetemplate.html:12 msgid "Service Template" msgstr "" -#: netbox/ipam/forms/model_forms.py:749 +#: netbox/ipam/forms/model_forms.py:791 msgid "Port(s)" msgstr "" -#: netbox/ipam/forms/model_forms.py:750 netbox/ipam/forms/model_forms.py:778 -#: netbox/templates/ipam/service.html:21 -msgid "Service" -msgstr "" - -#: netbox/ipam/forms/model_forms.py:763 +#: netbox/ipam/forms/model_forms.py:805 msgid "Service template" msgstr "" -#: netbox/ipam/forms/model_forms.py:775 +#: netbox/ipam/forms/model_forms.py:817 msgid "From Template" msgstr "" -#: netbox/ipam/forms/model_forms.py:776 +#: netbox/ipam/forms/model_forms.py:818 msgid "Custom" msgstr "" -#: netbox/ipam/forms/model_forms.py:806 +#: netbox/ipam/forms/model_forms.py:848 msgid "" "Must specify name, protocol, and port(s) if not using a service template." msgstr "" @@ -9646,28 +10077,28 @@ msgstr "" msgid "ASN ranges" msgstr "" -#: netbox/ipam/models/asns.py:72 +#: netbox/ipam/models/asns.py:69 #, python-brace-format msgid "Starting ASN ({start}) must be lower than ending ASN ({end})." msgstr "" -#: netbox/ipam/models/asns.py:104 +#: netbox/ipam/models/asns.py:101 msgid "Regional Internet Registry responsible for this AS number space" msgstr "" -#: netbox/ipam/models/asns.py:109 +#: netbox/ipam/models/asns.py:106 msgid "16- or 32-bit autonomous system number" msgstr "" -#: netbox/ipam/models/fhrp.py:22 +#: netbox/ipam/models/fhrp.py:21 msgid "group ID" msgstr "" -#: netbox/ipam/models/fhrp.py:30 netbox/ipam/models/services.py:22 +#: netbox/ipam/models/fhrp.py:29 netbox/ipam/models/services.py:21 msgid "protocol" msgstr "" -#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:28 +#: netbox/ipam/models/fhrp.py:38 netbox/wireless/models.py:29 msgid "authentication type" msgstr "" @@ -9683,11 +10114,11 @@ msgstr "" msgid "FHRP groups" msgstr "" -#: netbox/ipam/models/fhrp.py:113 +#: netbox/ipam/models/fhrp.py:110 msgid "FHRP group assignment" msgstr "" -#: netbox/ipam/models/fhrp.py:114 +#: netbox/ipam/models/fhrp.py:111 msgid "FHRP group assignments" msgstr "" @@ -9699,165 +10130,160 @@ msgstr "" msgid "IP space managed by this RIR is considered private" msgstr "" -#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:182 +#: netbox/ipam/models/ip.py:72 netbox/netbox/navigation/menu.py:188 msgid "RIRs" msgstr "" -#: netbox/ipam/models/ip.py:84 +#: netbox/ipam/models/ip.py:81 msgid "IPv4 or IPv6 network" msgstr "" -#: netbox/ipam/models/ip.py:91 +#: netbox/ipam/models/ip.py:88 msgid "Regional Internet Registry responsible for this IP space" msgstr "" -#: netbox/ipam/models/ip.py:101 +#: netbox/ipam/models/ip.py:98 msgid "date added" msgstr "" -#: netbox/ipam/models/ip.py:115 +#: netbox/ipam/models/ip.py:112 msgid "aggregate" msgstr "" -#: netbox/ipam/models/ip.py:116 +#: netbox/ipam/models/ip.py:113 msgid "aggregates" msgstr "" -#: netbox/ipam/models/ip.py:132 +#: netbox/ipam/models/ip.py:126 msgid "Cannot create aggregate with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:144 +#: netbox/ipam/models/ip.py:138 #, python-brace-format msgid "" "Aggregates cannot overlap. {prefix} is already covered by an existing " "aggregate ({aggregate})." msgstr "" -#: netbox/ipam/models/ip.py:158 +#: netbox/ipam/models/ip.py:152 #, python-brace-format msgid "" "Prefixes cannot overlap aggregates. {prefix} covers an existing aggregate " "({aggregate})." msgstr "" -#: netbox/ipam/models/ip.py:200 netbox/ipam/models/ip.py:737 -#: netbox/vpn/models/tunnels.py:114 -msgid "role" -msgstr "" - -#: netbox/ipam/models/ip.py:201 +#: netbox/ipam/models/ip.py:195 msgid "roles" msgstr "" -#: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:293 +#: netbox/ipam/models/ip.py:208 netbox/ipam/models/ip.py:277 msgid "prefix" msgstr "" -#: netbox/ipam/models/ip.py:218 +#: netbox/ipam/models/ip.py:209 msgid "IPv4 or IPv6 network with mask" msgstr "" -#: netbox/ipam/models/ip.py:254 +#: netbox/ipam/models/ip.py:238 msgid "Operational status of this prefix" msgstr "" -#: netbox/ipam/models/ip.py:262 +#: netbox/ipam/models/ip.py:246 msgid "The primary function of this prefix" msgstr "" -#: netbox/ipam/models/ip.py:265 +#: netbox/ipam/models/ip.py:249 msgid "is a pool" msgstr "" -#: netbox/ipam/models/ip.py:267 +#: netbox/ipam/models/ip.py:251 msgid "All IP addresses within this prefix are considered usable" msgstr "" -#: netbox/ipam/models/ip.py:270 netbox/ipam/models/ip.py:537 +#: netbox/ipam/models/ip.py:254 netbox/ipam/models/ip.py:523 msgid "mark utilized" msgstr "" -#: netbox/ipam/models/ip.py:294 +#: netbox/ipam/models/ip.py:278 msgid "prefixes" msgstr "" -#: netbox/ipam/models/ip.py:317 +#: netbox/ipam/models/ip.py:298 msgid "Cannot create prefix with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:305 netbox/ipam/models/ip.py:871 #, python-brace-format msgid "VRF {vrf}" msgstr "" -#: netbox/ipam/models/ip.py:324 netbox/ipam/models/ip.py:874 +#: netbox/ipam/models/ip.py:305 netbox/ipam/models/ip.py:871 msgid "global table" msgstr "" -#: netbox/ipam/models/ip.py:326 +#: netbox/ipam/models/ip.py:307 #, python-brace-format msgid "Duplicate prefix found in {table}: {prefix}" msgstr "" -#: netbox/ipam/models/ip.py:495 +#: netbox/ipam/models/ip.py:481 msgid "start address" msgstr "" -#: netbox/ipam/models/ip.py:496 netbox/ipam/models/ip.py:500 -#: netbox/ipam/models/ip.py:712 +#: netbox/ipam/models/ip.py:482 netbox/ipam/models/ip.py:486 +#: netbox/ipam/models/ip.py:711 msgid "IPv4 or IPv6 address (with mask)" msgstr "" -#: netbox/ipam/models/ip.py:499 +#: netbox/ipam/models/ip.py:485 msgid "end address" msgstr "" -#: netbox/ipam/models/ip.py:526 +#: netbox/ipam/models/ip.py:512 msgid "Operational status of this range" msgstr "" -#: netbox/ipam/models/ip.py:534 +#: netbox/ipam/models/ip.py:520 msgid "The primary function of this range" msgstr "" -#: netbox/ipam/models/ip.py:548 +#: netbox/ipam/models/ip.py:534 msgid "IP range" msgstr "" -#: netbox/ipam/models/ip.py:549 +#: netbox/ipam/models/ip.py:535 msgid "IP ranges" msgstr "" -#: netbox/ipam/models/ip.py:565 +#: netbox/ipam/models/ip.py:548 msgid "Starting and ending IP address versions must match" msgstr "" -#: netbox/ipam/models/ip.py:571 +#: netbox/ipam/models/ip.py:554 msgid "Starting and ending IP address masks must match" msgstr "" -#: netbox/ipam/models/ip.py:578 +#: netbox/ipam/models/ip.py:561 #, python-brace-format msgid "" "Ending address must be greater than the starting address ({start_address})" msgstr "" -#: netbox/ipam/models/ip.py:590 +#: netbox/ipam/models/ip.py:589 #, python-brace-format msgid "Defined addresses overlap with range {overlapping_range} in VRF {vrf}" msgstr "" -#: netbox/ipam/models/ip.py:599 +#: netbox/ipam/models/ip.py:598 #, python-brace-format msgid "Defined range exceeds maximum supported size ({max_size})" msgstr "" -#: netbox/ipam/models/ip.py:711 netbox/tenancy/models/contacts.py:82 +#: netbox/ipam/models/ip.py:710 netbox/tenancy/models/contacts.py:77 msgid "address" msgstr "" -#: netbox/ipam/models/ip.py:734 +#: netbox/ipam/models/ip.py:733 msgid "The operational status of this IP" msgstr "" @@ -9877,167 +10303,188 @@ msgstr "" msgid "Hostname or FQDN (not case-sensitive)" msgstr "" -#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:94 +#: netbox/ipam/models/ip.py:789 netbox/ipam/models/services.py:90 msgid "IP addresses" msgstr "" -#: netbox/ipam/models/ip.py:845 +#: netbox/ipam/models/ip.py:842 msgid "Cannot create IP address with /0 mask." msgstr "" -#: netbox/ipam/models/ip.py:851 +#: netbox/ipam/models/ip.py:848 #, python-brace-format msgid "{ip} is a network ID, which may not be assigned to an interface." msgstr "" -#: netbox/ipam/models/ip.py:862 +#: netbox/ipam/models/ip.py:859 #, python-brace-format msgid "{ip} is a broadcast address, which may not be assigned to an interface." msgstr "" -#: netbox/ipam/models/ip.py:876 +#: netbox/ipam/models/ip.py:873 #, python-brace-format msgid "Duplicate IP address found in {table}: {ipaddress}" msgstr "" -#: netbox/ipam/models/ip.py:897 +#: netbox/ipam/models/ip.py:896 msgid "" "Cannot reassign IP address while it is designated as the primary IP for the " "parent object" msgstr "" -#: netbox/ipam/models/ip.py:903 +#: netbox/ipam/models/ip.py:902 msgid "Only IPv6 addresses can be assigned SLAAC status" msgstr "" -#: netbox/ipam/models/services.py:33 +#: netbox/ipam/models/services.py:32 msgid "port numbers" msgstr "" -#: netbox/ipam/models/services.py:59 +#: netbox/ipam/models/services.py:58 msgid "service template" msgstr "" -#: netbox/ipam/models/services.py:60 +#: netbox/ipam/models/services.py:59 msgid "service templates" msgstr "" -#: netbox/ipam/models/services.py:95 +#: netbox/ipam/models/services.py:91 msgid "The specific IP addresses (if any) to which this service is bound" msgstr "" -#: netbox/ipam/models/services.py:102 +#: netbox/ipam/models/services.py:98 msgid "service" msgstr "" -#: netbox/ipam/models/services.py:103 +#: netbox/ipam/models/services.py:99 msgid "services" msgstr "" -#: netbox/ipam/models/services.py:117 +#: netbox/ipam/models/services.py:110 msgid "" "A service cannot be associated with both a device and a virtual machine." msgstr "" -#: netbox/ipam/models/services.py:119 +#: netbox/ipam/models/services.py:112 msgid "A service must be associated with either a device or a virtual machine." msgstr "" -#: netbox/ipam/models/vlans.py:85 +#: netbox/ipam/models/vlans.py:87 msgid "VLAN groups" msgstr "" -#: netbox/ipam/models/vlans.py:95 +#: netbox/ipam/models/vlans.py:94 msgid "Cannot set scope_type without scope_id." msgstr "" -#: netbox/ipam/models/vlans.py:97 +#: netbox/ipam/models/vlans.py:96 msgid "Cannot set scope_id without scope_type." msgstr "" -#: netbox/ipam/models/vlans.py:105 +#: netbox/ipam/models/vlans.py:104 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" msgstr "" -#: netbox/ipam/models/vlans.py:111 +#: netbox/ipam/models/vlans.py:110 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" msgstr "" -#: netbox/ipam/models/vlans.py:118 +#: netbox/ipam/models/vlans.py:117 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" msgstr "" -#: netbox/ipam/models/vlans.py:124 +#: netbox/ipam/models/vlans.py:123 msgid "Ranges cannot overlap." msgstr "" -#: netbox/ipam/models/vlans.py:181 +#: netbox/ipam/models/vlans.py:180 msgid "The specific site to which this VLAN is assigned (if any)" msgstr "" -#: netbox/ipam/models/vlans.py:189 +#: netbox/ipam/models/vlans.py:188 msgid "VLAN group (optional)" msgstr "" -#: netbox/ipam/models/vlans.py:197 +#: netbox/ipam/models/vlans.py:196 netbox/ipam/models/vlans.py:368 +#: netbox/ipam/models/vlans.py:376 msgid "Numeric VLAN ID (1-4094)" msgstr "" -#: netbox/ipam/models/vlans.py:215 +#: netbox/ipam/models/vlans.py:214 msgid "Operational status of this VLAN" msgstr "" -#: netbox/ipam/models/vlans.py:223 +#: netbox/ipam/models/vlans.py:222 msgid "The primary function of this VLAN" msgstr "" -#: netbox/ipam/models/vlans.py:266 +#: netbox/ipam/models/vlans.py:237 +msgid "Customer/service VLAN designation (for Q-in-Q/IEEE 802.1ad)" +msgstr "" + +#: netbox/ipam/models/vlans.py:285 #, python-brace-format msgid "" "VLAN is assigned to group {group} (scope: {scope}); cannot also assign to " "site {site}." msgstr "" -#: netbox/ipam/models/vlans.py:275 +#: netbox/ipam/models/vlans.py:294 #, python-brace-format msgid "VID must be in ranges {ranges} for VLANs in group {group}" msgstr "" -#: netbox/ipam/models/vrfs.py:30 +#: netbox/ipam/models/vlans.py:301 +msgid "Only Q-in-Q customer VLANs maybe assigned to a service VLAN." +msgstr "" + +#: netbox/ipam/models/vlans.py:307 +msgid "A Q-in-Q customer VLAN must be assigned to a service VLAN." +msgstr "" + +#: netbox/ipam/models/vlans.py:344 +msgid "VLAN translation policies" +msgstr "" + +#: netbox/ipam/models/vlans.py:385 +msgid "VLAN translation rule" +msgstr "" + +#: netbox/ipam/models/vrfs.py:29 msgid "route distinguisher" msgstr "" -#: netbox/ipam/models/vrfs.py:31 +#: netbox/ipam/models/vrfs.py:30 msgid "Unique route distinguisher (as defined in RFC 4364)" msgstr "" -#: netbox/ipam/models/vrfs.py:42 +#: netbox/ipam/models/vrfs.py:41 msgid "enforce unique space" msgstr "" -#: netbox/ipam/models/vrfs.py:43 +#: netbox/ipam/models/vrfs.py:42 msgid "Prevent duplicate prefixes/IP addresses within this VRF" msgstr "" -#: netbox/ipam/models/vrfs.py:63 netbox/netbox/navigation/menu.py:186 -#: netbox/netbox/navigation/menu.py:188 +#: netbox/ipam/models/vrfs.py:62 netbox/netbox/navigation/menu.py:192 +#: netbox/netbox/navigation/menu.py:194 msgid "VRFs" msgstr "" -#: netbox/ipam/models/vrfs.py:82 +#: netbox/ipam/models/vrfs.py:78 msgid "Route target value (formatted in accordance with RFC 4360)" msgstr "" -#: netbox/ipam/models/vrfs.py:94 +#: netbox/ipam/models/vrfs.py:91 msgid "route target" msgstr "" -#: netbox/ipam/models/vrfs.py:95 +#: netbox/ipam/models/vrfs.py:92 msgid "route targets" msgstr "" @@ -10053,84 +10500,101 @@ msgstr "" msgid "Provider Count" msgstr "" -#: netbox/ipam/tables/ip.py:95 netbox/netbox/navigation/menu.py:179 -#: netbox/netbox/navigation/menu.py:181 +#: netbox/ipam/tables/ip.py:41 netbox/netbox/navigation/menu.py:185 +#: netbox/netbox/navigation/menu.py:187 msgid "Aggregates" msgstr "" -#: netbox/ipam/tables/ip.py:125 +#: netbox/ipam/tables/ip.py:71 msgid "Added" msgstr "" -#: netbox/ipam/tables/ip.py:128 netbox/ipam/tables/ip.py:166 -#: netbox/ipam/tables/vlans.py:142 netbox/ipam/views.py:346 -#: netbox/netbox/navigation/menu.py:165 netbox/netbox/navigation/menu.py:167 -#: netbox/templates/ipam/vlan.html:84 +#: netbox/ipam/tables/ip.py:74 netbox/ipam/tables/ip.py:112 +#: netbox/ipam/tables/vlans.py:118 netbox/ipam/views.py:373 +#: netbox/netbox/navigation/menu.py:171 netbox/netbox/navigation/menu.py:173 +#: netbox/templates/ipam/vlan.html:100 msgid "Prefixes" msgstr "" -#: netbox/ipam/tables/ip.py:131 netbox/ipam/tables/ip.py:270 -#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:86 +#: netbox/ipam/tables/ip.py:77 netbox/ipam/tables/ip.py:219 +#: netbox/ipam/tables/ip.py:274 netbox/ipam/tables/vlans.py:55 #: netbox/templates/dcim/device.html:260 #: netbox/templates/ipam/aggregate.html:24 -#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:106 +#: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:102 msgid "Utilization" msgstr "" -#: netbox/ipam/tables/ip.py:171 netbox/netbox/navigation/menu.py:161 +#: netbox/ipam/tables/ip.py:117 netbox/netbox/navigation/menu.py:167 msgid "IP Ranges" msgstr "" -#: netbox/ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:167 msgid "Prefix (Flat)" msgstr "" -#: netbox/ipam/tables/ip.py:225 +#: netbox/ipam/tables/ip.py:171 msgid "Depth" msgstr "" -#: netbox/ipam/tables/ip.py:262 +#: netbox/ipam/tables/ip.py:191 netbox/ipam/tables/vlans.py:37 +#: netbox/virtualization/tables/clusters.py:77 +#: netbox/wireless/tables/wirelesslan.py:55 +msgid "Scope Type" +msgstr "" + +#: netbox/ipam/tables/ip.py:211 msgid "Pool" msgstr "" -#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:320 +#: netbox/ipam/tables/ip.py:215 netbox/ipam/tables/ip.py:270 msgid "Marked Utilized" msgstr "" -#: netbox/ipam/tables/ip.py:304 +#: netbox/ipam/tables/ip.py:254 msgid "Start address" msgstr "" -#: netbox/ipam/tables/ip.py:383 +#: netbox/ipam/tables/ip.py:333 msgid "NAT (Inside)" msgstr "" -#: netbox/ipam/tables/ip.py:388 +#: netbox/ipam/tables/ip.py:338 msgid "NAT (Outside)" msgstr "" -#: netbox/ipam/tables/ip.py:393 +#: netbox/ipam/tables/ip.py:343 msgid "Assigned" msgstr "" -#: netbox/ipam/tables/ip.py:429 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/ipam/tables/ip.py:379 netbox/templates/vpn/l2vpntermination.html:16 #: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "" -#: netbox/ipam/tables/vlans.py:68 -msgid "Scope Type" -msgstr "" - -#: netbox/ipam/tables/vlans.py:76 +#: netbox/ipam/tables/vlans.py:45 msgid "VID Ranges" msgstr "" -#: netbox/ipam/tables/vlans.py:111 netbox/ipam/tables/vlans.py:214 +#: netbox/ipam/tables/vlans.py:80 netbox/ipam/tables/vlans.py:190 #: netbox/templates/dcim/inc/interface_vlans_table.html:4 msgid "VID" msgstr "" +#: netbox/ipam/tables/vlans.py:237 +#: netbox/templates/ipam/vlantranslationpolicy.html:22 +msgid "Rules" +msgstr "" + +#: netbox/ipam/tables/vlans.py:260 +#: netbox/templates/ipam/vlantranslationrule.html:18 +msgid "Local VID" +msgstr "" + +#: netbox/ipam/tables/vlans.py:264 +#: netbox/templates/ipam/vlantranslationrule.html:22 +msgid "Remote VID" +msgstr "" + #: netbox/ipam/tables/vrfs.py:30 msgid "RD" msgstr "" @@ -10168,23 +10632,23 @@ msgid "" "are allowed in DNS names" msgstr "" -#: netbox/ipam/views.py:533 +#: netbox/ipam/views.py:570 msgid "Child Prefixes" msgstr "" -#: netbox/ipam/views.py:569 +#: netbox/ipam/views.py:606 msgid "Child Ranges" msgstr "" -#: netbox/ipam/views.py:898 +#: netbox/ipam/views.py:951 msgid "Related IPs" msgstr "" -#: netbox/ipam/views.py:1127 +#: netbox/ipam/views.py:1308 msgid "Device Interfaces" msgstr "" -#: netbox/ipam/views.py:1145 +#: netbox/ipam/views.py:1326 msgid "VM Interfaces" msgstr "" @@ -10230,90 +10694,108 @@ msgstr "" msgid "Invalid permission {permission} for model {model}" msgstr "" -#: netbox/netbox/choices.py:49 +#: netbox/netbox/choices.py:51 msgid "Dark Red" msgstr "" -#: netbox/netbox/choices.py:52 +#: netbox/netbox/choices.py:54 msgid "Rose" msgstr "" -#: netbox/netbox/choices.py:53 +#: netbox/netbox/choices.py:55 msgid "Fuchsia" msgstr "" -#: netbox/netbox/choices.py:55 +#: netbox/netbox/choices.py:57 msgid "Dark Purple" msgstr "" -#: netbox/netbox/choices.py:58 +#: netbox/netbox/choices.py:60 msgid "Light Blue" msgstr "" -#: netbox/netbox/choices.py:61 +#: netbox/netbox/choices.py:63 msgid "Aqua" msgstr "" -#: netbox/netbox/choices.py:62 +#: netbox/netbox/choices.py:64 msgid "Dark Green" msgstr "" -#: netbox/netbox/choices.py:64 +#: netbox/netbox/choices.py:66 msgid "Light Green" msgstr "" -#: netbox/netbox/choices.py:65 +#: netbox/netbox/choices.py:67 msgid "Lime" msgstr "" -#: netbox/netbox/choices.py:67 +#: netbox/netbox/choices.py:69 msgid "Amber" msgstr "" -#: netbox/netbox/choices.py:69 +#: netbox/netbox/choices.py:71 msgid "Dark Orange" msgstr "" -#: netbox/netbox/choices.py:70 +#: netbox/netbox/choices.py:72 msgid "Brown" msgstr "" -#: netbox/netbox/choices.py:71 +#: netbox/netbox/choices.py:73 msgid "Light Grey" msgstr "" -#: netbox/netbox/choices.py:72 +#: netbox/netbox/choices.py:74 msgid "Grey" msgstr "" -#: netbox/netbox/choices.py:73 +#: netbox/netbox/choices.py:75 msgid "Dark Grey" msgstr "" -#: netbox/netbox/choices.py:128 +#: netbox/netbox/choices.py:130 msgid "Direct" msgstr "" -#: netbox/netbox/choices.py:129 +#: netbox/netbox/choices.py:131 msgid "Upload" msgstr "" -#: netbox/netbox/choices.py:141 netbox/netbox/choices.py:155 +#: netbox/netbox/choices.py:143 netbox/netbox/choices.py:157 msgid "Auto-detect" msgstr "" -#: netbox/netbox/choices.py:156 +#: netbox/netbox/choices.py:158 msgid "Comma" msgstr "" -#: netbox/netbox/choices.py:157 +#: netbox/netbox/choices.py:159 msgid "Semicolon" msgstr "" -#: netbox/netbox/choices.py:158 +#: netbox/netbox/choices.py:160 msgid "Tab" msgstr "" +#: netbox/netbox/choices.py:193 netbox/templates/dcim/device.html:327 +#: netbox/templates/dcim/rack.html:107 +msgid "Kilograms" +msgstr "" + +#: netbox/netbox/choices.py:194 +msgid "Grams" +msgstr "" + +#: netbox/netbox/choices.py:195 netbox/templates/dcim/device.html:328 +#: netbox/templates/dcim/rack.html:108 +msgid "Pounds" +msgstr "" + +#: netbox/netbox/choices.py:196 +msgid "Ounces" +msgstr "" + #: netbox/netbox/config/__init__.py:67 #, python-brace-format msgid "Invalid configuration parameter: {item}" @@ -10596,6 +11078,26 @@ msgstr "" msgid "{class_name} must implement a sync_data() method." msgstr "" +#: netbox/netbox/models/mixins.py:22 +msgid "weight unit" +msgstr "" + +#: netbox/netbox/models/mixins.py:52 +msgid "Must specify a unit when setting a weight" +msgstr "" + +#: netbox/netbox/models/mixins.py:57 +msgid "distance" +msgstr "" + +#: netbox/netbox/models/mixins.py:64 +msgid "distance unit" +msgstr "" + +#: netbox/netbox/models/mixins.py:99 +msgid "Must specify a unit when setting a distance" +msgstr "" + #: netbox/netbox/navigation/menu.py:11 msgid "Organization" msgstr "" @@ -10655,174 +11157,199 @@ msgstr "" msgid "Inventory Item Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:111 netbox/netbox/navigation/menu.py:115 +#: netbox/netbox/navigation/menu.py:110 +#: netbox/templates/dcim/interface.html:413 +#: netbox/templates/virtualization/vminterface.html:118 +msgid "MAC Addresses" +msgstr "" + +#: netbox/netbox/navigation/menu.py:117 netbox/netbox/navigation/menu.py:121 +#: netbox/templates/dcim/interface.html:182 msgid "Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:117 +#: netbox/netbox/navigation/menu.py:123 msgid "Cables" msgstr "" -#: netbox/netbox/navigation/menu.py:118 +#: netbox/netbox/navigation/menu.py:124 msgid "Wireless Links" msgstr "" -#: netbox/netbox/navigation/menu.py:121 +#: netbox/netbox/navigation/menu.py:127 msgid "Interface Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:126 +#: netbox/netbox/navigation/menu.py:132 msgid "Console Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:131 +#: netbox/netbox/navigation/menu.py:137 msgid "Power Connections" msgstr "" -#: netbox/netbox/navigation/menu.py:147 +#: netbox/netbox/navigation/menu.py:153 msgid "Wireless LAN Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:168 +#: netbox/netbox/navigation/menu.py:174 msgid "Prefix & VLAN Roles" msgstr "" -#: netbox/netbox/navigation/menu.py:174 +#: netbox/netbox/navigation/menu.py:180 msgid "ASN Ranges" msgstr "" -#: netbox/netbox/navigation/menu.py:196 +#: netbox/netbox/navigation/menu.py:202 msgid "VLAN Groups" msgstr "" #: netbox/netbox/navigation/menu.py:203 +msgid "VLAN Translation Policies" +msgstr "" + +#: netbox/netbox/navigation/menu.py:204 +#: netbox/templates/ipam/vlantranslationpolicy.html:46 +msgid "VLAN Translation Rules" +msgstr "" + +#: netbox/netbox/navigation/menu.py:211 msgid "Service Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:204 netbox/templates/dcim/device.html:302 +#: netbox/netbox/navigation/menu.py:212 netbox/templates/dcim/device.html:302 #: netbox/templates/ipam/ipaddress.html:118 #: netbox/templates/virtualization/virtualmachine.html:154 msgid "Services" msgstr "" -#: netbox/netbox/navigation/menu.py:211 +#: netbox/netbox/navigation/menu.py:219 msgid "VPN" msgstr "" -#: netbox/netbox/navigation/menu.py:215 netbox/netbox/navigation/menu.py:217 +#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 #: netbox/vpn/tables/tunnels.py:24 msgid "Tunnels" msgstr "" -#: netbox/netbox/navigation/menu.py:218 netbox/templates/vpn/tunnelgroup.html:8 +#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/tunnelgroup.html:8 msgid "Tunnel Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:219 +#: netbox/netbox/navigation/menu.py:227 msgid "Tunnel Terminations" msgstr "" -#: netbox/netbox/navigation/menu.py:223 netbox/netbox/navigation/menu.py:225 +#: netbox/netbox/navigation/menu.py:231 netbox/netbox/navigation/menu.py:233 #: netbox/vpn/models/l2vpn.py:64 msgid "L2VPNs" msgstr "" -#: netbox/netbox/navigation/menu.py:226 netbox/templates/vpn/l2vpn.html:56 -#: netbox/templates/vpn/tunnel.html:72 netbox/vpn/tables/tunnels.py:58 -msgid "Terminations" -msgstr "" - -#: netbox/netbox/navigation/menu.py:232 +#: netbox/netbox/navigation/menu.py:240 msgid "IKE Proposals" msgstr "" -#: netbox/netbox/navigation/menu.py:233 +#: netbox/netbox/navigation/menu.py:241 #: netbox/templates/vpn/ikeproposal.html:41 msgid "IKE Policies" msgstr "" -#: netbox/netbox/navigation/menu.py:234 +#: netbox/netbox/navigation/menu.py:242 msgid "IPSec Proposals" msgstr "" -#: netbox/netbox/navigation/menu.py:235 +#: netbox/netbox/navigation/menu.py:243 #: netbox/templates/vpn/ipsecproposal.html:37 msgid "IPSec Policies" msgstr "" -#: netbox/netbox/navigation/menu.py:236 netbox/templates/vpn/ikepolicy.html:38 +#: netbox/netbox/navigation/menu.py:244 netbox/templates/vpn/ikepolicy.html:38 #: netbox/templates/vpn/ipsecpolicy.html:25 msgid "IPSec Profiles" msgstr "" -#: netbox/netbox/navigation/menu.py:251 +#: netbox/netbox/navigation/menu.py:259 #: netbox/templates/virtualization/virtualmachine.html:174 #: netbox/templates/virtualization/virtualmachine/base.html:32 #: netbox/templates/virtualization/virtualmachine_list.html:21 -#: netbox/virtualization/tables/virtualmachines.py:104 -#: netbox/virtualization/views.py:386 +#: netbox/virtualization/tables/virtualmachines.py:74 +#: netbox/virtualization/views.py:405 msgid "Virtual Disks" msgstr "" -#: netbox/netbox/navigation/menu.py:258 +#: netbox/netbox/navigation/menu.py:266 msgid "Cluster Types" msgstr "" -#: netbox/netbox/navigation/menu.py:259 +#: netbox/netbox/navigation/menu.py:267 msgid "Cluster Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:273 +#: netbox/netbox/navigation/menu.py:281 msgid "Circuit Types" msgstr "" -#: netbox/netbox/navigation/menu.py:274 -msgid "Circuit Groups" -msgstr "" - -#: netbox/netbox/navigation/menu.py:275 -#: netbox/templates/circuits/circuit.html:66 -msgid "Group Assignments" -msgstr "" - -#: netbox/netbox/navigation/menu.py:276 +#: netbox/netbox/navigation/menu.py:282 msgid "Circuit Terminations" msgstr "" -#: netbox/netbox/navigation/menu.py:280 netbox/netbox/navigation/menu.py:282 +#: netbox/netbox/navigation/menu.py:286 netbox/netbox/navigation/menu.py:288 +#: netbox/templates/circuits/providernetwork.html:55 +msgid "Virtual Circuits" +msgstr "" + +#: netbox/netbox/navigation/menu.py:289 +msgid "Virtual Circuit Types" +msgstr "" + +#: netbox/netbox/navigation/menu.py:290 +msgid "Virtual Circuit Terminations" +msgstr "" + +#: netbox/netbox/navigation/menu.py:296 +msgid "Circuit Groups" +msgstr "" + +#: netbox/netbox/navigation/menu.py:297 +#: netbox/templates/circuits/circuit.html:76 +#: netbox/templates/circuits/virtualcircuit.html:69 +msgid "Group Assignments" +msgstr "" + +#: netbox/netbox/navigation/menu.py:301 netbox/netbox/navigation/menu.py:303 msgid "Providers" msgstr "" -#: netbox/netbox/navigation/menu.py:283 +#: netbox/netbox/navigation/menu.py:304 #: netbox/templates/circuits/provider.html:51 msgid "Provider Accounts" msgstr "" -#: netbox/netbox/navigation/menu.py:284 +#: netbox/netbox/navigation/menu.py:305 msgid "Provider Networks" msgstr "" -#: netbox/netbox/navigation/menu.py:298 +#: netbox/netbox/navigation/menu.py:319 msgid "Power Panels" msgstr "" -#: netbox/netbox/navigation/menu.py:309 +#: netbox/netbox/navigation/menu.py:330 msgid "Configurations" msgstr "" -#: netbox/netbox/navigation/menu.py:311 +#: netbox/netbox/navigation/menu.py:332 msgid "Config Contexts" msgstr "" -#: netbox/netbox/navigation/menu.py:312 +#: netbox/netbox/navigation/menu.py:333 msgid "Config Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:319 netbox/netbox/navigation/menu.py:323 +#: netbox/netbox/navigation/menu.py:340 netbox/netbox/navigation/menu.py:344 msgid "Customization" msgstr "" -#: netbox/netbox/navigation/menu.py:325 +#: netbox/netbox/navigation/menu.py:346 #: netbox/templates/dcim/device_edit.html:103 #: netbox/templates/dcim/htmx/cable_edit.html:81 #: netbox/templates/dcim/virtualchassis_add.html:31 @@ -10831,96 +11358,96 @@ msgstr "" #: netbox/templates/htmx/form.html:19 netbox/templates/inc/filter_list.html:30 #: netbox/templates/inc/panels/custom_fields.html:7 #: netbox/templates/ipam/ipaddress_bulk_add.html:35 -#: netbox/templates/ipam/vlan_edit.html:59 +#: netbox/templates/ipam/vlan_edit.html:67 msgid "Custom Fields" msgstr "" -#: netbox/netbox/navigation/menu.py:326 +#: netbox/netbox/navigation/menu.py:347 msgid "Custom Field Choices" msgstr "" -#: netbox/netbox/navigation/menu.py:327 +#: netbox/netbox/navigation/menu.py:348 msgid "Custom Links" msgstr "" -#: netbox/netbox/navigation/menu.py:328 +#: netbox/netbox/navigation/menu.py:349 msgid "Export Templates" msgstr "" -#: netbox/netbox/navigation/menu.py:329 +#: netbox/netbox/navigation/menu.py:350 msgid "Saved Filters" msgstr "" -#: netbox/netbox/navigation/menu.py:331 +#: netbox/netbox/navigation/menu.py:352 msgid "Image Attachments" msgstr "" -#: netbox/netbox/navigation/menu.py:349 +#: netbox/netbox/navigation/menu.py:370 msgid "Operations" msgstr "" -#: netbox/netbox/navigation/menu.py:353 +#: netbox/netbox/navigation/menu.py:374 msgid "Integrations" msgstr "" -#: netbox/netbox/navigation/menu.py:355 +#: netbox/netbox/navigation/menu.py:376 msgid "Data Sources" msgstr "" -#: netbox/netbox/navigation/menu.py:356 +#: netbox/netbox/navigation/menu.py:377 msgid "Event Rules" msgstr "" -#: netbox/netbox/navigation/menu.py:357 +#: netbox/netbox/navigation/menu.py:378 msgid "Webhooks" msgstr "" -#: netbox/netbox/navigation/menu.py:361 netbox/netbox/navigation/menu.py:365 -#: netbox/netbox/views/generic/feature_views.py:153 +#: netbox/netbox/navigation/menu.py:382 netbox/netbox/navigation/menu.py:386 +#: netbox/netbox/views/generic/feature_views.py:158 #: netbox/templates/extras/report/base.html:37 #: netbox/templates/extras/script/base.html:36 msgid "Jobs" msgstr "" -#: netbox/netbox/navigation/menu.py:371 +#: netbox/netbox/navigation/menu.py:392 msgid "Logging" msgstr "" -#: netbox/netbox/navigation/menu.py:373 +#: netbox/netbox/navigation/menu.py:394 msgid "Notification Groups" msgstr "" -#: netbox/netbox/navigation/menu.py:374 +#: netbox/netbox/navigation/menu.py:395 msgid "Journal Entries" msgstr "" -#: netbox/netbox/navigation/menu.py:375 +#: netbox/netbox/navigation/menu.py:396 #: netbox/templates/core/objectchange.html:9 #: netbox/templates/core/objectchange_list.html:4 msgid "Change Log" msgstr "" -#: netbox/netbox/navigation/menu.py:382 netbox/templates/inc/user_menu.html:29 +#: netbox/netbox/navigation/menu.py:403 netbox/templates/inc/user_menu.html:29 msgid "Admin" msgstr "" -#: netbox/netbox/navigation/menu.py:430 netbox/templates/account/base.html:27 -#: netbox/templates/inc/user_menu.html:57 +#: netbox/netbox/navigation/menu.py:451 netbox/templates/account/base.html:27 +#: netbox/templates/inc/user_menu.html:52 msgid "API Tokens" msgstr "" -#: netbox/netbox/navigation/menu.py:437 netbox/users/forms/model_forms.py:187 +#: netbox/netbox/navigation/menu.py:458 netbox/users/forms/model_forms.py:187 #: netbox/users/forms/model_forms.py:195 netbox/users/forms/model_forms.py:242 #: netbox/users/forms/model_forms.py:249 msgid "Permissions" msgstr "" -#: netbox/netbox/navigation/menu.py:445 netbox/netbox/navigation/menu.py:449 +#: netbox/netbox/navigation/menu.py:466 netbox/netbox/navigation/menu.py:470 #: netbox/templates/core/system.html:7 msgid "System" msgstr "" -#: netbox/netbox/navigation/menu.py:454 netbox/netbox/navigation/menu.py:502 +#: netbox/netbox/navigation/menu.py:475 netbox/netbox/navigation/menu.py:523 #: netbox/templates/500.html:35 netbox/templates/account/preferences.html:22 #: netbox/templates/core/plugin.html:13 #: netbox/templates/core/plugin_list.html:7 @@ -10928,11 +11455,11 @@ msgstr "" msgid "Plugins" msgstr "" -#: netbox/netbox/navigation/menu.py:459 +#: netbox/netbox/navigation/menu.py:480 msgid "Configuration History" msgstr "" -#: netbox/netbox/navigation/menu.py:465 netbox/templates/core/rq_task.html:8 +#: netbox/netbox/navigation/menu.py:486 netbox/templates/core/rq_task.html:8 #: netbox/templates/core/rq_task_list.html:22 msgid "Background Tasks" msgstr "" @@ -10950,30 +11477,30 @@ msgstr "" msgid "Button color must be a choice within ButtonColorChoices." msgstr "" -#: netbox/netbox/plugins/registration.py:25 +#: netbox/netbox/plugins/registration.py:26 #, python-brace-format msgid "" "PluginTemplateExtension class {template_extension} was passed as an instance!" msgstr "" -#: netbox/netbox/plugins/registration.py:31 +#: netbox/netbox/plugins/registration.py:32 #, python-brace-format msgid "" "{template_extension} is not a subclass of netbox.plugins." "PluginTemplateExtension!" msgstr "" -#: netbox/netbox/plugins/registration.py:51 +#: netbox/netbox/plugins/registration.py:57 #, python-brace-format msgid "{item} must be an instance of netbox.plugins.PluginMenuItem" msgstr "" -#: netbox/netbox/plugins/registration.py:62 +#: netbox/netbox/plugins/registration.py:68 #, python-brace-format msgid "{menu_link} must be an instance of netbox.plugins.PluginMenuItem" msgstr "" -#: netbox/netbox/plugins/registration.py:67 +#: netbox/netbox/plugins/registration.py:73 #, python-brace-format msgid "{button} must be an instance of netbox.plugins.PluginMenuButton" msgstr "" @@ -11055,79 +11582,79 @@ msgstr "" msgid "Cannot delete stores from registry" msgstr "" -#: netbox/netbox/settings.py:760 +#: netbox/netbox/settings.py:755 msgid "Czech" msgstr "" -#: netbox/netbox/settings.py:761 +#: netbox/netbox/settings.py:756 msgid "Danish" msgstr "" -#: netbox/netbox/settings.py:762 +#: netbox/netbox/settings.py:757 msgid "German" msgstr "" -#: netbox/netbox/settings.py:763 +#: netbox/netbox/settings.py:758 msgid "English" msgstr "" -#: netbox/netbox/settings.py:764 +#: netbox/netbox/settings.py:759 msgid "Spanish" msgstr "" -#: netbox/netbox/settings.py:765 +#: netbox/netbox/settings.py:760 msgid "French" msgstr "" -#: netbox/netbox/settings.py:766 +#: netbox/netbox/settings.py:761 msgid "Italian" msgstr "" -#: netbox/netbox/settings.py:767 +#: netbox/netbox/settings.py:762 msgid "Japanese" msgstr "" -#: netbox/netbox/settings.py:768 +#: netbox/netbox/settings.py:763 msgid "Dutch" msgstr "" -#: netbox/netbox/settings.py:769 +#: netbox/netbox/settings.py:764 msgid "Polish" msgstr "" -#: netbox/netbox/settings.py:770 +#: netbox/netbox/settings.py:765 msgid "Portuguese" msgstr "" -#: netbox/netbox/settings.py:771 +#: netbox/netbox/settings.py:766 msgid "Russian" msgstr "" -#: netbox/netbox/settings.py:772 +#: netbox/netbox/settings.py:767 msgid "Turkish" msgstr "" -#: netbox/netbox/settings.py:773 +#: netbox/netbox/settings.py:768 msgid "Ukrainian" msgstr "" -#: netbox/netbox/settings.py:774 +#: netbox/netbox/settings.py:769 msgid "Chinese" msgstr "" -#: netbox/netbox/tables/columns.py:176 +#: netbox/netbox/tables/columns.py:177 msgid "Select all" msgstr "" -#: netbox/netbox/tables/columns.py:189 +#: netbox/netbox/tables/columns.py:190 msgid "Toggle all" msgstr "" -#: netbox/netbox/tables/columns.py:300 +#: netbox/netbox/tables/columns.py:302 msgid "Toggle Dropdown" msgstr "" -#: netbox/netbox/tables/columns.py:572 netbox/templates/core/job.html:53 +#: netbox/netbox/tables/columns.py:575 netbox/templates/core/job.html:53 msgid "Error" msgstr "" @@ -11161,19 +11688,19 @@ msgstr "" msgid "Row {i}: Object with ID {id} does not exist" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:709 -#: netbox/netbox/views/generic/bulk_views.py:910 -#: netbox/netbox/views/generic/bulk_views.py:958 +#: netbox/netbox/views/generic/bulk_views.py:703 +#: netbox/netbox/views/generic/bulk_views.py:904 +#: netbox/netbox/views/generic/bulk_views.py:952 #, python-brace-format msgid "No {object_type} were selected." msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:788 +#: netbox/netbox/views/generic/bulk_views.py:782 #, python-brace-format msgid "Renamed {count} {object_type}" msgstr "" -#: netbox/netbox/views/generic/bulk_views.py:888 +#: netbox/netbox/views/generic/bulk_views.py:882 #, python-brace-format msgid "Deleted {count} {object_type}" msgstr "" @@ -11186,16 +11713,16 @@ msgstr "" msgid "Journal" msgstr "" -#: netbox/netbox/views/generic/feature_views.py:207 +#: netbox/netbox/views/generic/feature_views.py:212 msgid "Unable to synchronize data: No data file set." msgstr "" -#: netbox/netbox/views/generic/feature_views.py:211 +#: netbox/netbox/views/generic/feature_views.py:216 #, python-brace-format msgid "Synchronized data for {object_type} {object}." msgstr "" -#: netbox/netbox/views/generic/feature_views.py:236 +#: netbox/netbox/views/generic/feature_views.py:241 #, python-brace-format msgid "Synced {count} {object_type}" msgstr "" @@ -11267,9 +11794,9 @@ msgstr "" msgid "Home Page" msgstr "" -#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:45 +#: netbox/templates/account/base.html:7 netbox/templates/inc/user_menu.html:40 #: netbox/vpn/forms/bulk_edit.py:255 netbox/vpn/forms/filtersets.py:189 -#: netbox/vpn/forms/model_forms.py:379 +#: netbox/vpn/forms/model_forms.py:382 msgid "Profile" msgstr "" @@ -11281,11 +11808,11 @@ msgstr "" #: netbox/templates/account/base.html:16 #: netbox/templates/account/subscriptions.html:7 -#: netbox/templates/inc/user_menu.html:51 +#: netbox/templates/inc/user_menu.html:46 msgid "Subscriptions" msgstr "" -#: netbox/templates/account/base.html:19 netbox/templates/inc/user_menu.html:54 +#: netbox/templates/account/base.html:19 netbox/templates/inc/user_menu.html:49 msgid "Preferences" msgstr "" @@ -11313,6 +11840,7 @@ msgstr "" #: netbox/templates/generic/object_edit.html:72 #: netbox/templates/htmx/delete_form.html:53 #: netbox/templates/htmx/delete_form.html:55 +#: netbox/templates/htmx/quick_add.html:21 #: netbox/templates/ipam/ipaddress_assign.html:28 #: netbox/templates/virtualization/cluster_add_devices.html:30 msgid "Cancel" @@ -11408,7 +11936,7 @@ msgstr "" #: netbox/templates/core/objectchange.html:142 #: netbox/templates/dcim/devicebay.html:59 #: netbox/templates/dcim/inc/panels/inventory_items.html:45 -#: netbox/templates/dcim/interface.html:296 +#: netbox/templates/dcim/interface.html:353 #: netbox/templates/dcim/modulebay.html:80 #: netbox/templates/extras/configcontext.html:70 #: netbox/templates/extras/eventrule.html:66 @@ -11495,15 +12023,16 @@ msgstr "" msgid "Community" msgstr "" -#: netbox/templates/circuits/circuit.html:47 +#: netbox/templates/circuits/circuit.html:57 msgid "Install Date" msgstr "" -#: netbox/templates/circuits/circuit.html:51 +#: netbox/templates/circuits/circuit.html:61 msgid "Termination Date" msgstr "" -#: netbox/templates/circuits/circuit.html:70 +#: netbox/templates/circuits/circuit.html:80 +#: netbox/templates/circuits/virtualcircuit.html:73 #: netbox/templates/ipam/inc/panels/fhrp_groups.html:15 msgid "Assign Group" msgstr "" @@ -11551,7 +12080,7 @@ msgid "Add" msgstr "" #: netbox/templates/circuits/inc/circuit_termination.html:15 -#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:37 #: netbox/templates/dcim/inc/panels/inventory_items.html:32 #: netbox/templates/dcim/powerpanel.html:56 #: netbox/templates/extras/script_list.html:30 @@ -11566,35 +12095,39 @@ msgstr "" msgid "Swap" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:19 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:5 +msgid "Termination point" +msgstr "" + +#: netbox/templates/circuits/inc/circuit_termination_fields.html:20 #: netbox/templates/dcim/consoleport.html:59 #: netbox/templates/dcim/consoleserverport.html:60 #: netbox/templates/dcim/powerfeed.html:114 msgid "Marked as connected" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:21 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:22 msgid "to" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:31 #: netbox/templates/circuits/inc/circuit_termination_fields.html:32 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:33 #: netbox/templates/dcim/frontport.html:80 #: netbox/templates/dcim/inc/connection_endpoints.html:7 -#: netbox/templates/dcim/interface.html:154 +#: netbox/templates/dcim/interface.html:211 #: netbox/templates/dcim/rearport.html:76 msgid "Trace" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:35 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:36 msgid "Edit cable" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:40 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 msgid "Remove cable" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:41 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:42 #: netbox/templates/dcim/bulk_disconnect.html:5 #: netbox/templates/dcim/device/consoleports.html:12 #: netbox/templates/dcim/device/consoleserverports.html:12 @@ -11607,33 +12140,33 @@ msgstr "" msgid "Disconnect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:48 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:49 #: netbox/templates/dcim/consoleport.html:69 #: netbox/templates/dcim/consoleserverport.html:70 #: netbox/templates/dcim/frontport.html:102 -#: netbox/templates/dcim/interface.html:180 -#: netbox/templates/dcim/interface.html:200 +#: netbox/templates/dcim/interface.html:237 +#: netbox/templates/dcim/interface.html:257 #: netbox/templates/dcim/powerfeed.html:127 -#: netbox/templates/dcim/poweroutlet.html:71 -#: netbox/templates/dcim/poweroutlet.html:72 +#: netbox/templates/dcim/poweroutlet.html:81 +#: netbox/templates/dcim/poweroutlet.html:82 #: netbox/templates/dcim/powerport.html:73 #: netbox/templates/dcim/rearport.html:98 msgid "Connect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:70 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:65 msgid "Downstream" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:71 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:66 msgid "Upstream" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:80 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:75 msgid "Cross-Connect" msgstr "" -#: netbox/templates/circuits/inc/circuit_termination_fields.html:84 +#: netbox/templates/circuits/inc/circuit_termination_fields.html:79 msgid "Patch Panel/Port" msgstr "" @@ -11645,6 +12178,27 @@ msgstr "" msgid "Provider Account" msgstr "" +#: netbox/templates/circuits/providernetwork.html:59 +msgid "Add a Virtual Circuit" +msgstr "" + +#: netbox/templates/circuits/virtualcircuit.html:91 +#: netbox/templates/vpn/tunnel.html:9 +msgid "Add Termination" +msgstr "" + +#: netbox/templates/circuits/virtualcircuittermination.html:23 +msgid "Virtual Circuit Termination" +msgstr "" + +#: netbox/templates/circuits/virtualcircuittype.html:10 +msgid "Add Virtual Circuit" +msgstr "" + +#: netbox/templates/circuits/virtualcircuittype.html:19 +msgid "Virtual Circuit Type" +msgstr "" + #: netbox/templates/core/configrevision.html:35 msgid "Configuration Data" msgstr "" @@ -11677,7 +12231,7 @@ msgstr "" #: netbox/templates/core/datafile.html:42 netbox/templates/ipam/iprange.html:25 #: netbox/templates/virtualization/virtualdisk.html:29 -#: netbox/virtualization/tables/virtualmachines.py:198 +#: netbox/virtualization/tables/virtualmachines.py:169 msgid "Size" msgstr "" @@ -12115,8 +12669,8 @@ msgstr "" #: netbox/templates/dcim/consoleport.html:65 #: netbox/templates/dcim/consoleserverport.html:66 #: netbox/templates/dcim/frontport.html:98 -#: netbox/templates/dcim/interface.html:176 -#: netbox/templates/dcim/poweroutlet.html:69 +#: netbox/templates/dcim/interface.html:233 +#: netbox/templates/dcim/poweroutlet.html:79 #: netbox/templates/dcim/powerport.html:69 msgid "Not Connected" msgstr "" @@ -12139,7 +12693,7 @@ msgid "Map" msgstr "" #: netbox/templates/dcim/device.html:108 -#: netbox/templates/dcim/inventoryitem.html:56 +#: netbox/templates/dcim/inventoryitem.html:60 #: netbox/templates/dcim/module.html:81 netbox/templates/dcim/modulebay.html:74 #: netbox/templates/dcim/rack.html:61 msgid "Asset Tag" @@ -12155,7 +12709,7 @@ msgstr "" #: netbox/templates/dcim/device.html:175 #: netbox/templates/dcim/device_edit.html:64 -#: netbox/virtualization/forms/model_forms.py:223 +#: netbox/virtualization/forms/model_forms.py:222 msgid "Management" msgstr "" @@ -12395,8 +12949,8 @@ msgid "Rear Port Position" msgstr "" #: netbox/templates/dcim/frontport.html:72 -#: netbox/templates/dcim/interface.html:144 -#: netbox/templates/dcim/poweroutlet.html:63 +#: netbox/templates/dcim/interface.html:201 +#: netbox/templates/dcim/poweroutlet.html:73 #: netbox/templates/dcim/powerport.html:63 #: netbox/templates/dcim/rearport.html:68 msgid "Marked as Connected" @@ -12496,76 +13050,78 @@ msgid "PoE Type" msgstr "" #: netbox/templates/dcim/interface.html:81 -#: netbox/templates/virtualization/vminterface.html:63 +#: netbox/templates/virtualization/vminterface.html:55 +#: netbox/virtualization/forms/model_forms.py:387 msgid "802.1Q Mode" msgstr "" -#: netbox/templates/dcim/interface.html:125 -#: netbox/templates/virtualization/vminterface.html:59 -msgid "MAC Address" +#: netbox/templates/dcim/interface.html:156 +#: netbox/templates/virtualization/vminterface.html:88 +msgid "VLAN Translation" msgstr "" -#: netbox/templates/dcim/interface.html:151 +#: netbox/templates/dcim/interface.html:208 msgid "Wireless Link" msgstr "" -#: netbox/templates/dcim/interface.html:218 netbox/vpn/choices.py:63 -msgid "Peer" -msgstr "" - -#: netbox/templates/dcim/interface.html:230 +#: netbox/templates/dcim/interface.html:287 #: netbox/templates/wireless/inc/wirelesslink_interface.html:26 msgid "Channel" msgstr "" -#: netbox/templates/dcim/interface.html:239 +#: netbox/templates/dcim/interface.html:296 #: netbox/templates/wireless/inc/wirelesslink_interface.html:32 msgid "Channel Frequency" msgstr "" -#: netbox/templates/dcim/interface.html:242 -#: netbox/templates/dcim/interface.html:250 -#: netbox/templates/dcim/interface.html:261 -#: netbox/templates/dcim/interface.html:269 +#: netbox/templates/dcim/interface.html:299 +#: netbox/templates/dcim/interface.html:307 +#: netbox/templates/dcim/interface.html:318 +#: netbox/templates/dcim/interface.html:326 msgid "MHz" msgstr "" -#: netbox/templates/dcim/interface.html:258 +#: netbox/templates/dcim/interface.html:315 #: netbox/templates/wireless/inc/wirelesslink_interface.html:42 msgid "Channel Width" msgstr "" -#: netbox/templates/dcim/interface.html:285 +#: netbox/templates/dcim/interface.html:342 #: netbox/templates/wireless/wirelesslan.html:14 #: netbox/templates/wireless/wirelesslink.html:21 -#: netbox/wireless/forms/bulk_edit.py:60 netbox/wireless/forms/bulk_edit.py:102 -#: netbox/wireless/forms/filtersets.py:40 -#: netbox/wireless/forms/filtersets.py:80 netbox/wireless/models.py:82 -#: netbox/wireless/models.py:156 netbox/wireless/tables/wirelesslan.py:44 +#: netbox/wireless/forms/bulk_edit.py:62 netbox/wireless/forms/bulk_edit.py:105 +#: netbox/wireless/forms/filtersets.py:43 +#: netbox/wireless/forms/filtersets.py:108 netbox/wireless/models.py:82 +#: netbox/wireless/models.py:153 netbox/wireless/tables/wirelesslan.py:44 msgid "SSID" msgstr "" -#: netbox/templates/dcim/interface.html:305 +#: netbox/templates/dcim/interface.html:362 msgid "LAG Members" msgstr "" -#: netbox/templates/dcim/interface.html:323 +#: netbox/templates/dcim/interface.html:380 msgid "No member interfaces" msgstr "" -#: netbox/templates/dcim/interface.html:343 +#: netbox/templates/dcim/interface.html:400 #: netbox/templates/ipam/fhrpgroup.html:73 #: netbox/templates/ipam/iprange/ip_addresses.html:7 #: netbox/templates/ipam/prefix/ip_addresses.html:7 -#: netbox/templates/virtualization/vminterface.html:89 +#: netbox/templates/virtualization/vminterface.html:105 msgid "Add IP Address" msgstr "" +#: netbox/templates/dcim/interface.html:417 +#: netbox/templates/virtualization/vminterface.html:123 +msgid "Add MAC Address" +msgstr "" + #: netbox/templates/dcim/inventoryitem.html:24 msgid "Parent Item" msgstr "" -#: netbox/templates/dcim/inventoryitem.html:48 +#: netbox/templates/dcim/inventoryitem.html:52 msgid "Part ID" msgstr "" @@ -12585,6 +13141,10 @@ msgstr "" msgid "Add a Device" msgstr "" +#: netbox/templates/dcim/macaddress.html:36 +msgid "Primary for interface" +msgstr "" + #: netbox/templates/dcim/manufacturer.html:16 msgid "Add Device Type" msgstr "" @@ -12615,7 +13175,7 @@ msgctxt "Abbreviation for amperes" msgid "A" msgstr "" -#: netbox/templates/dcim/poweroutlet.html:48 +#: netbox/templates/dcim/poweroutlet.html:58 msgid "Feed Leg" msgstr "" @@ -13014,11 +13574,17 @@ msgstr "" msgid "No content found" msgstr "" -#: netbox/templates/extras/dashboard/widgets/rssfeed.html:18 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:17 +msgid "" +"This RSS feed requires an external connection. Check the ISOLATED_DEPLOYMENT " +"setting." +msgstr "" + +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:22 msgid "There was a problem fetching the RSS feed" msgstr "" -#: netbox/templates/extras/dashboard/widgets/rssfeed.html:21 +#: netbox/templates/extras/dashboard/widgets/rssfeed.html:25 msgid "HTTP" msgstr "" @@ -13441,6 +14007,18 @@ msgstr "" msgid "Select" msgstr "" +#: netbox/templates/htmx/quick_add.html:7 +msgid "Quick Add" +msgstr "" + +#: netbox/templates/htmx/quick_add_created.html:18 +#, python-format +msgid "" +"\n" +" Created %(object_type)s %(object)s\n" +" " +msgstr "" + #: netbox/templates/inc/filter_list.html:43 #: netbox/utilities/templates/helpers/table_config_form.html:39 msgid "Reset" @@ -13510,15 +14088,11 @@ msgstr "" msgid "Help center" msgstr "" -#: netbox/templates/inc/user_menu.html:41 -msgid "Django Admin" -msgstr "" - -#: netbox/templates/inc/user_menu.html:61 +#: netbox/templates/inc/user_menu.html:56 msgid "Log Out" msgstr "" -#: netbox/templates/inc/user_menu.html:68 netbox/templates/login.html:38 +#: netbox/templates/inc/user_menu.html:63 netbox/templates/login.html:38 msgid "Log In" msgstr "" @@ -13615,43 +14189,43 @@ msgstr "" msgid "Ending Address" msgstr "" -#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:110 +#: netbox/templates/ipam/iprange.html:33 netbox/templates/ipam/prefix.html:106 msgid "Marked fully utilized" msgstr "" -#: netbox/templates/ipam/prefix.html:99 +#: netbox/templates/ipam/prefix.html:95 msgid "Addressing Details" msgstr "" -#: netbox/templates/ipam/prefix.html:118 +#: netbox/templates/ipam/prefix.html:114 msgid "Child IPs" msgstr "" -#: netbox/templates/ipam/prefix.html:126 +#: netbox/templates/ipam/prefix.html:122 msgid "Available IPs" msgstr "" -#: netbox/templates/ipam/prefix.html:138 +#: netbox/templates/ipam/prefix.html:134 msgid "First available IP" msgstr "" -#: netbox/templates/ipam/prefix.html:179 +#: netbox/templates/ipam/prefix.html:175 msgid "Prefix Details" msgstr "" -#: netbox/templates/ipam/prefix.html:185 +#: netbox/templates/ipam/prefix.html:181 msgid "Network Address" msgstr "" -#: netbox/templates/ipam/prefix.html:189 +#: netbox/templates/ipam/prefix.html:185 msgid "Network Mask" msgstr "" -#: netbox/templates/ipam/prefix.html:193 +#: netbox/templates/ipam/prefix.html:189 msgid "Wildcard Mask" msgstr "" -#: netbox/templates/ipam/prefix.html:197 +#: netbox/templates/ipam/prefix.html:193 msgid "Broadcast Address" msgstr "" @@ -13691,14 +14265,30 @@ msgstr "" msgid "Exporting L2VPNs" msgstr "" -#: netbox/templates/ipam/vlan.html:88 +#: netbox/templates/ipam/vlan.html:66 +msgid "Q-in-Q Role" +msgstr "" + +#: netbox/templates/ipam/vlan.html:104 msgid "Add a Prefix" msgstr "" +#: netbox/templates/ipam/vlan.html:114 +msgid "Customer VLANs" +msgstr "" + +#: netbox/templates/ipam/vlan.html:118 +msgid "Add a VLAN" +msgstr "" + #: netbox/templates/ipam/vlangroup.html:18 msgid "Add VLAN" msgstr "" +#: netbox/templates/ipam/vlantranslationpolicy.html:51 +msgid "Add Rule" +msgstr "" + #: netbox/templates/ipam/vrf.html:16 msgid "Route Distinguisher" msgstr "" @@ -13767,7 +14357,7 @@ msgstr "" #: netbox/templates/tenancy/contact.html:18 netbox/tenancy/filtersets.py:147 #: netbox/tenancy/forms/bulk_edit.py:137 netbox/tenancy/forms/filtersets.py:102 -#: netbox/tenancy/forms/forms.py:56 netbox/tenancy/forms/model_forms.py:106 +#: netbox/tenancy/forms/forms.py:57 netbox/tenancy/forms/model_forms.py:106 #: netbox/tenancy/forms/model_forms.py:130 netbox/tenancy/tables/contacts.py:98 msgid "Contact" msgstr "" @@ -13783,7 +14373,7 @@ msgid "Phone" msgstr "" #: netbox/templates/tenancy/contactgroup.html:18 -#: netbox/tenancy/forms/forms.py:66 netbox/tenancy/forms/model_forms.py:75 +#: netbox/tenancy/forms/forms.py:67 netbox/tenancy/forms/model_forms.py:75 msgid "Contact Group" msgstr "" @@ -13792,7 +14382,7 @@ msgid "Add Contact Group" msgstr "" #: netbox/templates/tenancy/contactrole.html:15 -#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:61 +#: netbox/tenancy/filtersets.py:152 netbox/tenancy/forms/forms.py:62 #: netbox/tenancy/forms/model_forms.py:87 msgid "Contact Role" msgstr "" @@ -13806,8 +14396,8 @@ msgid "Add Tenant" msgstr "" #: netbox/templates/tenancy/tenantgroup.html:26 -#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:51 -#: netbox/tenancy/tables/columns.py:61 +#: netbox/tenancy/forms/model_forms.py:32 netbox/tenancy/tables/columns.py:36 +#: netbox/tenancy/tables/columns.py:46 msgid "Tenant Group" msgstr "" @@ -13838,21 +14428,21 @@ msgstr "" msgid "Assigned Users" msgstr "" -#: netbox/templates/virtualization/cluster.html:52 +#: netbox/templates/virtualization/cluster.html:56 msgid "Allocated Resources" msgstr "" -#: netbox/templates/virtualization/cluster.html:55 +#: netbox/templates/virtualization/cluster.html:59 #: netbox/templates/virtualization/virtualmachine.html:125 msgid "Virtual CPUs" msgstr "" -#: netbox/templates/virtualization/cluster.html:59 +#: netbox/templates/virtualization/cluster.html:63 #: netbox/templates/virtualization/virtualmachine.html:129 msgid "Memory" msgstr "" -#: netbox/templates/virtualization/cluster.html:69 +#: netbox/templates/virtualization/cluster.html:73 #: netbox/templates/virtualization/virtualmachine.html:140 msgid "Disk Space" msgstr "" @@ -13888,13 +14478,13 @@ msgid "Add Cluster" msgstr "" #: netbox/templates/virtualization/clustergroup.html:19 -#: netbox/virtualization/forms/model_forms.py:50 +#: netbox/virtualization/forms/model_forms.py:52 msgid "Cluster Group" msgstr "" #: netbox/templates/virtualization/clustertype.html:19 #: netbox/templates/virtualization/virtualmachine.html:110 -#: netbox/virtualization/forms/model_forms.py:36 +#: netbox/virtualization/forms/model_forms.py:38 msgid "Cluster Type" msgstr "" @@ -13903,8 +14493,8 @@ msgid "Virtual Disk" msgstr "" #: netbox/templates/virtualization/virtualmachine.html:122 -#: netbox/virtualization/forms/bulk_edit.py:190 -#: netbox/virtualization/forms/model_forms.py:224 +#: netbox/virtualization/forms/bulk_edit.py:172 +#: netbox/virtualization/forms/model_forms.py:223 msgid "Resources" msgstr "" @@ -13938,7 +14528,7 @@ msgstr "" #: netbox/templates/vpn/ipsecpolicy.html:45 #: netbox/templates/vpn/ipsecprofile.html:52 #: netbox/templates/vpn/ipsecprofile.html:77 -#: netbox/vpn/forms/model_forms.py:316 netbox/vpn/forms/model_forms.py:352 +#: netbox/vpn/forms/model_forms.py:317 netbox/vpn/forms/model_forms.py:354 #: netbox/vpn/tables/crypto.py:68 netbox/vpn/tables/crypto.py:134 msgid "Proposals" msgstr "" @@ -13984,11 +14574,11 @@ msgid "IPSec Policy" msgstr "" #: netbox/templates/vpn/ipsecpolicy.html:21 netbox/vpn/forms/bulk_edit.py:210 -#: netbox/vpn/models/crypto.py:193 +#: netbox/vpn/models/crypto.py:191 msgid "PFS group" msgstr "" -#: netbox/templates/vpn/ipsecprofile.html:10 netbox/vpn/forms/model_forms.py:54 +#: netbox/templates/vpn/ipsecprofile.html:10 netbox/vpn/forms/model_forms.py:55 msgid "IPSec Profile" msgstr "" @@ -14014,10 +14604,6 @@ msgstr "" msgid "Add a Termination" msgstr "" -#: netbox/templates/vpn/tunnel.html:9 -msgid "Add Termination" -msgstr "" - #: netbox/templates/vpn/tunnel.html:37 netbox/vpn/forms/bulk_edit.py:49 #: netbox/vpn/forms/bulk_import.py:48 netbox/vpn/forms/filtersets.py:57 msgid "Encapsulation" @@ -14025,7 +14611,7 @@ msgstr "" #: netbox/templates/vpn/tunnel.html:41 netbox/vpn/forms/bulk_edit.py:55 #: netbox/vpn/forms/bulk_import.py:53 netbox/vpn/forms/filtersets.py:64 -#: netbox/vpn/models/crypto.py:250 netbox/vpn/tables/tunnels.py:51 +#: netbox/vpn/models/crypto.py:246 netbox/vpn/tables/tunnels.py:51 msgid "IPSec profile" msgstr "" @@ -14048,8 +14634,8 @@ msgid "Tunnel Termination" msgstr "" #: netbox/templates/vpn/tunneltermination.html:35 -#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:102 -#: netbox/vpn/forms/model_forms.py:138 netbox/vpn/forms/model_forms.py:247 +#: netbox/vpn/forms/bulk_import.py:107 netbox/vpn/forms/model_forms.py:103 +#: netbox/vpn/forms/model_forms.py:139 netbox/vpn/forms/model_forms.py:248 #: netbox/vpn/tables/tunnels.py:101 msgid "Outside IP" msgstr "" @@ -14072,7 +14658,7 @@ msgctxt "Abbreviation for megahertz" msgid "MHz" msgstr "" -#: netbox/templates/wireless/wirelesslan.html:57 +#: netbox/templates/wireless/wirelesslan.html:65 msgid "Attached Interfaces" msgstr "" @@ -14081,7 +14667,7 @@ msgid "Add Wireless LAN" msgstr "" #: netbox/templates/wireless/wirelesslangroup.html:26 -#: netbox/wireless/forms/model_forms.py:28 +#: netbox/wireless/forms/model_forms.py:29 msgid "Wireless LAN Group" msgstr "" @@ -14093,13 +14679,6 @@ msgstr "" msgid "Link Properties" msgstr "" -#: netbox/templates/wireless/wirelesslink.html:38 -#: netbox/wireless/forms/bulk_edit.py:129 -#: netbox/wireless/forms/filtersets.py:102 -#: netbox/wireless/forms/model_forms.py:165 -msgid "Distance" -msgstr "" - #: netbox/tenancy/filtersets.py:28 msgid "Parent contact group (ID)" msgstr "" @@ -14170,47 +14749,47 @@ msgstr "" msgid "contact groups" msgstr "" -#: netbox/tenancy/models/contacts.py:48 +#: netbox/tenancy/models/contacts.py:42 msgid "contact role" msgstr "" -#: netbox/tenancy/models/contacts.py:49 +#: netbox/tenancy/models/contacts.py:43 msgid "contact roles" msgstr "" -#: netbox/tenancy/models/contacts.py:68 +#: netbox/tenancy/models/contacts.py:63 msgid "title" msgstr "" -#: netbox/tenancy/models/contacts.py:73 +#: netbox/tenancy/models/contacts.py:68 msgid "phone" msgstr "" -#: netbox/tenancy/models/contacts.py:78 +#: netbox/tenancy/models/contacts.py:73 msgid "email" msgstr "" -#: netbox/tenancy/models/contacts.py:87 +#: netbox/tenancy/models/contacts.py:82 msgid "link" msgstr "" -#: netbox/tenancy/models/contacts.py:103 +#: netbox/tenancy/models/contacts.py:98 msgid "contact" msgstr "" -#: netbox/tenancy/models/contacts.py:104 +#: netbox/tenancy/models/contacts.py:99 msgid "contacts" msgstr "" -#: netbox/tenancy/models/contacts.py:153 +#: netbox/tenancy/models/contacts.py:146 msgid "contact assignment" msgstr "" -#: netbox/tenancy/models/contacts.py:154 +#: netbox/tenancy/models/contacts.py:147 msgid "contact assignments" msgstr "" -#: netbox/tenancy/models/contacts.py:170 +#: netbox/tenancy/models/contacts.py:163 #, python-brace-format msgid "Contacts cannot be assigned to this object type ({type})." msgstr "" @@ -14223,19 +14802,19 @@ msgstr "" msgid "tenant groups" msgstr "" -#: netbox/tenancy/models/tenants.py:70 +#: netbox/tenancy/models/tenants.py:68 msgid "Tenant name must be unique per group." msgstr "" -#: netbox/tenancy/models/tenants.py:80 +#: netbox/tenancy/models/tenants.py:78 msgid "Tenant slug must be unique per group." msgstr "" -#: netbox/tenancy/models/tenants.py:88 +#: netbox/tenancy/models/tenants.py:86 msgid "tenant" msgstr "" -#: netbox/tenancy/models/tenants.py:89 +#: netbox/tenancy/models/tenants.py:87 msgid "tenants" msgstr "" @@ -14445,7 +15024,7 @@ msgstr "" msgid "tokens" msgstr "" -#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:42 +#: netbox/users/models/users.py:57 netbox/vpn/models/crypto.py:43 msgid "group" msgstr "" @@ -14488,25 +15067,25 @@ msgstr "" msgid "{name} has a key defined but CHOICES is not a list" msgstr "" -#: netbox/utilities/conversion.py:19 +#: netbox/utilities/conversion.py:20 msgid "Weight must be a positive number" msgstr "" -#: netbox/utilities/conversion.py:21 +#: netbox/utilities/conversion.py:22 #, python-brace-format msgid "Invalid value '{weight}' for weight (must be a number)" msgstr "" -#: netbox/utilities/conversion.py:32 netbox/utilities/conversion.py:62 +#: netbox/utilities/conversion.py:33 netbox/utilities/conversion.py:63 #, python-brace-format msgid "Unknown unit {unit}. Must be one of the following: {valid_units}" msgstr "" -#: netbox/utilities/conversion.py:45 +#: netbox/utilities/conversion.py:46 msgid "Length must be a positive number" msgstr "" -#: netbox/utilities/conversion.py:47 +#: netbox/utilities/conversion.py:48 #, python-brace-format msgid "Invalid value '{length}' for length (must be a number)" msgstr "" @@ -14522,18 +15101,18 @@ msgstr "" msgid "More than 50" msgstr "" -#: netbox/utilities/fields.py:30 +#: netbox/utilities/fields.py:29 msgid "RGB color in hexadecimal. Example: " msgstr "" -#: netbox/utilities/fields.py:159 +#: netbox/utilities/fields.py:158 #, python-format msgid "" "%s(%r) is invalid. to_model parameter to CounterCacheField must be a string " "in the format 'app.model'" msgstr "" -#: netbox/utilities/fields.py:169 +#: netbox/utilities/fields.py:168 #, python-format msgid "" "%s(%r) is invalid. to_field parameter to CounterCacheField must be a string " @@ -14732,12 +15311,12 @@ msgstr "" msgid "Required column header \"{header}\" not found." msgstr "" -#: netbox/utilities/forms/widgets/apiselect.py:124 +#: netbox/utilities/forms/widgets/apiselect.py:133 #, python-brace-format msgid "Missing required value for dynamic query param: '{dynamic_params}'" msgstr "" -#: netbox/utilities/forms/widgets/apiselect.py:141 +#: netbox/utilities/forms/widgets/apiselect.py:150 #, python-brace-format msgid "Missing required value for static query param: '{static_params}'" msgstr "" @@ -14858,10 +15437,14 @@ msgstr "" msgid "Search NetBox" msgstr "" -#: netbox/utilities/templates/widgets/apiselect.html:7 +#: netbox/utilities/templates/widgets/apiselect.html:8 msgid "Open selector" msgstr "" +#: netbox/utilities/templates/widgets/apiselect.html:22 +msgid "Quick add" +msgstr "" + #: netbox/utilities/templates/widgets/markdown_input.html:6 msgid "Write" msgstr "" @@ -14892,212 +15475,219 @@ msgid "" "be used on views which define a base queryset" msgstr "" -#: netbox/virtualization/filtersets.py:79 +#: netbox/virtualization/filtersets.py:45 msgid "Parent group (ID)" msgstr "" -#: netbox/virtualization/filtersets.py:85 +#: netbox/virtualization/filtersets.py:51 msgid "Parent group (slug)" msgstr "" -#: netbox/virtualization/filtersets.py:89 -#: netbox/virtualization/filtersets.py:141 +#: netbox/virtualization/filtersets.py:55 +#: netbox/virtualization/filtersets.py:107 msgid "Cluster type (ID)" msgstr "" -#: netbox/virtualization/filtersets.py:151 -#: netbox/virtualization/filtersets.py:271 +#: netbox/virtualization/filtersets.py:117 +#: netbox/virtualization/filtersets.py:237 msgid "Cluster (ID)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:166 -#: netbox/virtualization/models/virtualmachines.py:115 +#: netbox/virtualization/forms/bulk_edit.py:148 +#: netbox/virtualization/models/virtualmachines.py:110 msgid "vCPUs" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:170 +#: netbox/virtualization/forms/bulk_edit.py:152 msgid "Memory (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:174 +#: netbox/virtualization/forms/bulk_edit.py:156 msgid "Disk (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_edit.py:334 -#: netbox/virtualization/forms/filtersets.py:251 +#: netbox/virtualization/forms/bulk_edit.py:316 +#: netbox/virtualization/forms/filtersets.py:256 msgid "Size (MB)" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:44 +#: netbox/virtualization/forms/bulk_import.py:45 msgid "Type of cluster" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:51 +#: netbox/virtualization/forms/bulk_import.py:52 msgid "Assigned cluster group" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:96 +#: netbox/virtualization/forms/bulk_import.py:102 msgid "Assigned cluster" msgstr "" -#: netbox/virtualization/forms/bulk_import.py:103 +#: netbox/virtualization/forms/bulk_import.py:109 msgid "Assigned device within cluster" msgstr "" -#: netbox/virtualization/forms/filtersets.py:183 +#: netbox/virtualization/forms/filtersets.py:188 msgid "Serial number" msgstr "" -#: netbox/virtualization/forms/model_forms.py:153 +#: netbox/virtualization/forms/model_forms.py:152 #, python-brace-format msgid "" "{device} belongs to a different site ({device_site}) than the cluster " "({cluster_site})" msgstr "" -#: netbox/virtualization/forms/model_forms.py:192 +#: netbox/virtualization/forms/model_forms.py:191 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:220 msgid "Site/Cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:244 +#: netbox/virtualization/forms/model_forms.py:243 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" -#: netbox/virtualization/forms/model_forms.py:372 -#: netbox/virtualization/tables/virtualmachines.py:111 +#: netbox/virtualization/forms/model_forms.py:397 +#: netbox/virtualization/tables/virtualmachines.py:81 msgid "Disk" msgstr "" -#: netbox/virtualization/models/clusters.py:25 +#: netbox/virtualization/models/clusters.py:26 msgid "cluster type" msgstr "" -#: netbox/virtualization/models/clusters.py:26 +#: netbox/virtualization/models/clusters.py:27 msgid "cluster types" msgstr "" -#: netbox/virtualization/models/clusters.py:45 +#: netbox/virtualization/models/clusters.py:43 msgid "cluster group" msgstr "" -#: netbox/virtualization/models/clusters.py:46 +#: netbox/virtualization/models/clusters.py:44 msgid "cluster groups" msgstr "" -#: netbox/virtualization/models/clusters.py:121 +#: netbox/virtualization/models/clusters.py:110 msgid "cluster" msgstr "" -#: netbox/virtualization/models/clusters.py:122 +#: netbox/virtualization/models/clusters.py:111 msgid "clusters" msgstr "" -#: netbox/virtualization/models/clusters.py:141 +#: netbox/virtualization/models/clusters.py:137 #, python-brace-format msgid "" "{count} devices are assigned as hosts for this cluster but are not in site " "{site}" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:123 +#: netbox/virtualization/models/clusters.py:144 +#, python-brace-format +msgid "" +"{count} devices are assigned as hosts for this cluster but are not in " +"location {location}" +msgstr "" + +#: netbox/virtualization/models/virtualmachines.py:118 msgid "memory (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:128 +#: netbox/virtualization/models/virtualmachines.py:123 msgid "disk (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:166 +#: netbox/virtualization/models/virtualmachines.py:161 msgid "Virtual machine name must be unique per cluster." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:169 +#: netbox/virtualization/models/virtualmachines.py:164 msgid "virtual machine" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:170 +#: netbox/virtualization/models/virtualmachines.py:165 msgid "virtual machines" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:184 +#: netbox/virtualization/models/virtualmachines.py:176 msgid "A virtual machine must be assigned to a site and/or cluster." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:191 +#: netbox/virtualization/models/virtualmachines.py:183 #, python-brace-format msgid "The selected cluster ({cluster}) is not assigned to this site ({site})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:198 +#: netbox/virtualization/models/virtualmachines.py:190 msgid "Must specify a cluster when assigning a host device." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:203 +#: netbox/virtualization/models/virtualmachines.py:195 #, python-brace-format msgid "" "The selected device ({device}) is not assigned to this cluster ({cluster})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:215 +#: netbox/virtualization/models/virtualmachines.py:207 #, python-brace-format msgid "" "The specified disk size ({size}) must match the aggregate size of assigned " "virtual disks ({total_size})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:229 +#: netbox/virtualization/models/virtualmachines.py:221 #, python-brace-format msgid "Must be an IPv{family} address. ({ip} is an IPv{version} address.)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:238 +#: netbox/virtualization/models/virtualmachines.py:230 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this VM." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:396 +#: netbox/virtualization/models/virtualmachines.py:376 #, python-brace-format msgid "" "The selected parent interface ({parent}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:411 +#: netbox/virtualization/models/virtualmachines.py:391 #, python-brace-format msgid "" "The selected bridge interface ({bridge}) belongs to a different virtual " "machine ({virtual_machine})." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:422 +#: netbox/virtualization/models/virtualmachines.py:402 #, python-brace-format msgid "" "The untagged VLAN ({untagged_vlan}) must belong to the same site as the " "interface's parent virtual machine, or it must be global." msgstr "" -#: netbox/virtualization/models/virtualmachines.py:434 +#: netbox/virtualization/models/virtualmachines.py:414 msgid "size (MB)" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:438 +#: netbox/virtualization/models/virtualmachines.py:418 msgid "virtual disk" msgstr "" -#: netbox/virtualization/models/virtualmachines.py:439 +#: netbox/virtualization/models/virtualmachines.py:419 msgid "virtual disks" msgstr "" -#: netbox/virtualization/views.py:273 +#: netbox/virtualization/views.py:291 #, python-brace-format msgid "Added {count} devices to cluster {cluster}" msgstr "" -#: netbox/virtualization/views.py:308 +#: netbox/virtualization/views.py:326 #, python-brace-format msgid "Removed {count} devices from cluster {cluster}" msgstr "" @@ -15134,14 +15724,6 @@ msgstr "" msgid "PPTP" msgstr "" -#: netbox/vpn/choices.py:64 -msgid "Hub" -msgstr "" - -#: netbox/vpn/choices.py:65 -msgid "Spoke" -msgstr "" - #: netbox/vpn/choices.py:88 msgid "Aggressive" msgstr "" @@ -15259,26 +15841,26 @@ msgstr "" msgid "Tunnel group" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:47 +#: netbox/vpn/forms/bulk_edit.py:117 netbox/vpn/models/crypto.py:48 msgid "SA lifetime" msgstr "" -#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:79 -#: netbox/wireless/forms/bulk_edit.py:126 -#: netbox/wireless/forms/filtersets.py:64 -#: netbox/wireless/forms/filtersets.py:98 +#: netbox/vpn/forms/bulk_edit.py:151 netbox/wireless/forms/bulk_edit.py:81 +#: netbox/wireless/forms/bulk_edit.py:129 +#: netbox/wireless/forms/filtersets.py:67 +#: netbox/wireless/forms/filtersets.py:126 msgid "Pre-shared key" msgstr "" #: netbox/vpn/forms/bulk_edit.py:237 netbox/vpn/forms/bulk_import.py:239 -#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:370 +#: netbox/vpn/forms/filtersets.py:199 netbox/vpn/forms/model_forms.py:373 #: netbox/vpn/models/crypto.py:104 msgid "IKE policy" msgstr "" #: netbox/vpn/forms/bulk_edit.py:242 netbox/vpn/forms/bulk_import.py:244 -#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:374 -#: netbox/vpn/models/crypto.py:209 +#: netbox/vpn/forms/filtersets.py:204 netbox/vpn/forms/model_forms.py:377 +#: netbox/vpn/models/crypto.py:207 msgid "IPSec policy" msgstr "" @@ -15286,10 +15868,6 @@ msgstr "" msgid "Tunnel encapsulation" msgstr "" -#: netbox/vpn/forms/bulk_import.py:83 -msgid "Operational role" -msgstr "" - #: netbox/vpn/forms/bulk_import.py:90 msgid "Parent device of assigned interface" msgstr "" @@ -15306,7 +15884,7 @@ msgstr "" msgid "IKE proposal(s)" msgstr "" -#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:197 +#: netbox/vpn/forms/bulk_import.py:215 netbox/vpn/models/crypto.py:195 msgid "Diffie-Hellman group for Perfect Forward Secrecy" msgstr "" @@ -15351,7 +15929,7 @@ msgid "IKE version" msgstr "" #: netbox/vpn/forms/filtersets.py:142 netbox/vpn/forms/filtersets.py:175 -#: netbox/vpn/forms/model_forms.py:298 netbox/vpn/forms/model_forms.py:334 +#: netbox/vpn/forms/model_forms.py:299 netbox/vpn/forms/model_forms.py:336 msgid "Proposal" msgstr "" @@ -15359,32 +15937,28 @@ msgstr "" msgid "Assigned Object Type" msgstr "" -#: netbox/vpn/forms/model_forms.py:95 netbox/vpn/forms/model_forms.py:130 -#: netbox/vpn/forms/model_forms.py:240 netbox/vpn/tables/tunnels.py:91 +#: netbox/vpn/forms/model_forms.py:96 netbox/vpn/forms/model_forms.py:131 +#: netbox/vpn/forms/model_forms.py:241 netbox/vpn/tables/tunnels.py:91 msgid "Tunnel interface" msgstr "" -#: netbox/vpn/forms/model_forms.py:150 +#: netbox/vpn/forms/model_forms.py:151 msgid "First Termination" msgstr "" -#: netbox/vpn/forms/model_forms.py:153 +#: netbox/vpn/forms/model_forms.py:154 msgid "Second Termination" msgstr "" -#: netbox/vpn/forms/model_forms.py:197 +#: netbox/vpn/forms/model_forms.py:198 msgid "This parameter is required when defining a termination." msgstr "" -#: netbox/vpn/forms/model_forms.py:320 netbox/vpn/forms/model_forms.py:356 -msgid "Policy" -msgstr "" - -#: netbox/vpn/forms/model_forms.py:487 +#: netbox/vpn/forms/model_forms.py:490 msgid "A termination must specify an interface or VLAN." msgstr "" -#: netbox/vpn/forms/model_forms.py:489 +#: netbox/vpn/forms/model_forms.py:492 msgid "" "A termination can only have one terminating object (an interface or VLAN)." msgstr "" @@ -15397,31 +15971,31 @@ msgstr "" msgid "authentication algorithm" msgstr "" -#: netbox/vpn/models/crypto.py:44 +#: netbox/vpn/models/crypto.py:45 msgid "Diffie-Hellman group ID" msgstr "" -#: netbox/vpn/models/crypto.py:50 +#: netbox/vpn/models/crypto.py:51 msgid "Security association lifetime (in seconds)" msgstr "" -#: netbox/vpn/models/crypto.py:59 +#: netbox/vpn/models/crypto.py:60 msgid "IKE proposal" msgstr "" -#: netbox/vpn/models/crypto.py:60 +#: netbox/vpn/models/crypto.py:61 msgid "IKE proposals" msgstr "" -#: netbox/vpn/models/crypto.py:76 +#: netbox/vpn/models/crypto.py:75 msgid "version" msgstr "" -#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:190 +#: netbox/vpn/models/crypto.py:88 netbox/vpn/models/crypto.py:188 msgid "proposals" msgstr "" -#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:39 +#: netbox/vpn/models/crypto.py:91 netbox/wireless/models.py:41 msgid "pre-shared key" msgstr "" @@ -15429,19 +16003,19 @@ msgstr "" msgid "IKE policies" msgstr "" -#: netbox/vpn/models/crypto.py:118 +#: netbox/vpn/models/crypto.py:115 msgid "Mode is required for selected IKE version" msgstr "" -#: netbox/vpn/models/crypto.py:122 +#: netbox/vpn/models/crypto.py:119 msgid "Mode cannot be used for selected IKE version" msgstr "" -#: netbox/vpn/models/crypto.py:136 +#: netbox/vpn/models/crypto.py:134 msgid "encryption" msgstr "" -#: netbox/vpn/models/crypto.py:141 +#: netbox/vpn/models/crypto.py:140 msgid "authentication" msgstr "" @@ -15461,32 +16035,32 @@ msgstr "" msgid "IPSec proposals" msgstr "" -#: netbox/vpn/models/crypto.py:178 +#: netbox/vpn/models/crypto.py:175 msgid "Encryption and/or authentication algorithm must be defined" msgstr "" -#: netbox/vpn/models/crypto.py:210 +#: netbox/vpn/models/crypto.py:208 msgid "IPSec policies" msgstr "" -#: netbox/vpn/models/crypto.py:251 +#: netbox/vpn/models/crypto.py:247 msgid "IPSec profiles" msgstr "" -#: netbox/vpn/models/l2vpn.py:116 +#: netbox/vpn/models/l2vpn.py:113 msgid "L2VPN termination" msgstr "" -#: netbox/vpn/models/l2vpn.py:117 +#: netbox/vpn/models/l2vpn.py:114 msgid "L2VPN terminations" msgstr "" -#: netbox/vpn/models/l2vpn.py:135 +#: netbox/vpn/models/l2vpn.py:129 #, python-brace-format msgid "L2VPN Termination already assigned ({assigned_object})" msgstr "" -#: netbox/vpn/models/l2vpn.py:147 +#: netbox/vpn/models/l2vpn.py:141 #, python-brace-format msgid "" "{l2vpn_type} L2VPNs cannot have more than two terminations; found " @@ -15501,35 +16075,35 @@ msgstr "" msgid "tunnel groups" msgstr "" -#: netbox/vpn/models/tunnels.py:53 +#: netbox/vpn/models/tunnels.py:51 msgid "encapsulation" msgstr "" -#: netbox/vpn/models/tunnels.py:72 +#: netbox/vpn/models/tunnels.py:70 msgid "tunnel ID" msgstr "" -#: netbox/vpn/models/tunnels.py:94 +#: netbox/vpn/models/tunnels.py:92 msgid "tunnel" msgstr "" -#: netbox/vpn/models/tunnels.py:95 +#: netbox/vpn/models/tunnels.py:93 msgid "tunnels" msgstr "" -#: netbox/vpn/models/tunnels.py:153 +#: netbox/vpn/models/tunnels.py:148 msgid "An object may be terminated to only one tunnel at a time." msgstr "" -#: netbox/vpn/models/tunnels.py:156 +#: netbox/vpn/models/tunnels.py:151 msgid "tunnel termination" msgstr "" -#: netbox/vpn/models/tunnels.py:157 +#: netbox/vpn/models/tunnels.py:152 msgid "tunnel terminations" msgstr "" -#: netbox/vpn/models/tunnels.py:174 +#: netbox/vpn/models/tunnels.py:169 #, python-brace-format msgid "{name} is already attached to a tunnel ({tunnel})." msgstr "" @@ -15590,50 +16164,43 @@ msgstr "" msgid "WPA Enterprise" msgstr "" -#: netbox/wireless/forms/bulk_edit.py:73 netbox/wireless/forms/bulk_edit.py:120 -#: netbox/wireless/forms/bulk_import.py:68 -#: netbox/wireless/forms/bulk_import.py:71 -#: netbox/wireless/forms/bulk_import.py:110 -#: netbox/wireless/forms/bulk_import.py:113 -#: netbox/wireless/forms/filtersets.py:59 -#: netbox/wireless/forms/filtersets.py:93 +#: netbox/wireless/forms/bulk_edit.py:75 netbox/wireless/forms/bulk_edit.py:123 +#: netbox/wireless/forms/bulk_import.py:70 +#: netbox/wireless/forms/bulk_import.py:73 +#: netbox/wireless/forms/bulk_import.py:115 +#: netbox/wireless/forms/bulk_import.py:118 +#: netbox/wireless/forms/filtersets.py:62 +#: netbox/wireless/forms/filtersets.py:121 msgid "Authentication cipher" msgstr "" -#: netbox/wireless/forms/bulk_edit.py:134 -#: netbox/wireless/forms/bulk_import.py:116 -#: netbox/wireless/forms/bulk_import.py:119 -#: netbox/wireless/forms/filtersets.py:106 -msgid "Distance unit" -msgstr "" - -#: netbox/wireless/forms/bulk_import.py:52 +#: netbox/wireless/forms/bulk_import.py:54 msgid "Bridged VLAN" msgstr "" -#: netbox/wireless/forms/bulk_import.py:89 -#: netbox/wireless/tables/wirelesslink.py:28 +#: netbox/wireless/forms/bulk_import.py:94 +#: netbox/wireless/tables/wirelesslink.py:27 msgid "Interface A" msgstr "" -#: netbox/wireless/forms/bulk_import.py:93 -#: netbox/wireless/tables/wirelesslink.py:37 +#: netbox/wireless/forms/bulk_import.py:98 +#: netbox/wireless/tables/wirelesslink.py:36 msgid "Interface B" msgstr "" -#: netbox/wireless/forms/model_forms.py:161 +#: netbox/wireless/forms/model_forms.py:164 msgid "Side B" msgstr "" -#: netbox/wireless/models.py:31 +#: netbox/wireless/models.py:32 msgid "authentication cipher" msgstr "" -#: netbox/wireless/models.py:69 +#: netbox/wireless/models.py:72 msgid "wireless LAN group" msgstr "" -#: netbox/wireless/models.py:70 +#: netbox/wireless/models.py:73 msgid "wireless LAN groups" msgstr "" @@ -15641,35 +16208,23 @@ msgstr "" msgid "wireless LAN" msgstr "" -#: netbox/wireless/models.py:144 +#: netbox/wireless/models.py:141 msgid "interface A" msgstr "" -#: netbox/wireless/models.py:151 +#: netbox/wireless/models.py:148 msgid "interface B" msgstr "" -#: netbox/wireless/models.py:165 -msgid "distance" -msgstr "" - -#: netbox/wireless/models.py:172 -msgid "distance unit" -msgstr "" - -#: netbox/wireless/models.py:219 +#: netbox/wireless/models.py:196 msgid "wireless link" msgstr "" -#: netbox/wireless/models.py:220 +#: netbox/wireless/models.py:197 msgid "wireless links" msgstr "" -#: netbox/wireless/models.py:236 -msgid "Must specify a unit when setting a wireless distance" -msgstr "" - -#: netbox/wireless/models.py:242 netbox/wireless/models.py:248 +#: netbox/wireless/models.py:212 netbox/wireless/models.py:218 #, python-brace-format msgid "{type} is not a wireless interface." msgstr "" From 9c960c2387fcc50004f4694b199a588098f82df0 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Jan 2025 09:15:37 -0500 Subject: [PATCH 126/169] Fixes #18318: Correct navigation breadcrumbs for module type UI view --- netbox/templates/dcim/inc/devicetype_breadcrumbs.html | 2 -- netbox/templates/dcim/moduletype.html | 4 +++- netbox/templates/dcim/moduletype/component_templates.html | 7 ------- 3 files changed, 3 insertions(+), 10 deletions(-) delete mode 100644 netbox/templates/dcim/inc/devicetype_breadcrumbs.html diff --git a/netbox/templates/dcim/inc/devicetype_breadcrumbs.html b/netbox/templates/dcim/inc/devicetype_breadcrumbs.html deleted file mode 100644 index 02f326ddc..000000000 --- a/netbox/templates/dcim/inc/devicetype_breadcrumbs.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/netbox/templates/dcim/moduletype.html b/netbox/templates/dcim/moduletype.html index f57c501cf..b3d53e09b 100644 --- a/netbox/templates/dcim/moduletype.html +++ b/netbox/templates/dcim/moduletype.html @@ -8,7 +8,9 @@ {% block breadcrumbs %} {{ block.super }} - {% include 'dcim/inc/devicetype_breadcrumbs.html' %} + {% endblock %} {% block extra_controls %} diff --git a/netbox/templates/dcim/moduletype/component_templates.html b/netbox/templates/dcim/moduletype/component_templates.html index 8f4c24478..3cee0bbd9 100644 --- a/netbox/templates/dcim/moduletype/component_templates.html +++ b/netbox/templates/dcim/moduletype/component_templates.html @@ -3,13 +3,6 @@ {% load helpers %} {% load i18n %} -{% block title %}{{ object.manufacturer }} {{ object.model }}{% endblock %} - -{% block breadcrumbs %} - {{ block.super }} - {% include 'dcim/inc/devicetype_breadcrumbs.html' %} -{% endblock %} - {% block extra_controls %} {% include 'dcim/inc/moduletype_buttons.html' %} {% endblock %} From ef6c89ee5de815e2304e59b6042b7dcc9aea383c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 7 Jan 2025 10:01:05 -0500 Subject: [PATCH 127/169] Fixes #18324: Correct filter names for certain related object listings --- netbox/dcim/views.py | 44 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 9a96b0c7f..0978747d1 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -15,7 +15,7 @@ from jinja2.exceptions import TemplateError from circuits.models import Circuit, CircuitTermination from extras.views import ObjectConfigContextView -from ipam.models import ASN, IPAddress, VLANGroup +from ipam.models import ASN, IPAddress, Prefix, VLANGroup from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable from netbox.constants import DEFAULT_ACTION_PERMISSIONS from netbox.views import generic @@ -30,8 +30,9 @@ from utilities.views import ( ) from virtualization.filtersets import VirtualMachineFilterSet from virtualization.forms import VirtualMachineFilterForm -from virtualization.models import VirtualMachine +from virtualization.models import Cluster, VirtualMachine from virtualization.tables import VirtualMachineTable +from wireless.models import WirelessLAN from . import filtersets, forms, tables from .choices import DeviceFaceChoices, InterfaceModeChoices from .models import * @@ -238,6 +239,7 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView): 'related_models': self.get_related_models( request, regions, + omit=(Cluster, Prefix, WirelessLAN), extra=( (Location.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), (Rack.objects.restrict(request.user, 'view').filter(site__region__in=regions), 'region_id'), @@ -247,6 +249,11 @@ class RegionView(GetRelatedModelsMixin, generic.ObjectView): ).distinct(), 'region_id' ), + + # Handle these relations manually to avoid erroneous filter name resolution + (Cluster.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), + (Prefix.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), + (WirelessLAN.objects.restrict(request.user, 'view').filter(_region__in=regions), 'region_id'), ), ), } @@ -331,6 +338,7 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView): 'related_models': self.get_related_models( request, groups, + omit=(Cluster, Prefix, WirelessLAN), extra=( (Location.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), (Rack.objects.restrict(request.user, 'view').filter(site__group__in=groups), 'site_group_id'), @@ -340,6 +348,20 @@ class SiteGroupView(GetRelatedModelsMixin, generic.ObjectView): ).distinct(), 'site_group_id' ), + + # Handle these relations manually to avoid erroneous filter name resolution + ( + Cluster.objects.restrict(request.user, 'view').filter(_site_group__in=groups), + 'site_group_id' + ), + ( + Prefix.objects.restrict(request.user, 'view').filter(_site_group__in=groups), + 'site_group_id' + ), + ( + WirelessLAN.objects.restrict(request.user, 'view').filter(_site_group__in=groups), + 'site_group_id' + ), ), ), } @@ -418,8 +440,8 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): 'related_models': self.get_related_models( request, instance, - [CableTermination, CircuitTermination], - ( + omit=(CableTermination, CircuitTermination, Cluster, Prefix, WirelessLAN), + extra=( (VLANGroup.objects.restrict(request.user, 'view').filter( scope_type=ContentType.objects.get_for_model(Site), scope_id=instance.pk @@ -429,6 +451,11 @@ class SiteView(GetRelatedModelsMixin, generic.ObjectView): Circuit.objects.restrict(request.user, 'view').filter(terminations___site=instance).distinct(), 'site_id' ), + + # Handle these relations manually to avoid erroneous filter name resolution + (Cluster.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), + (Prefix.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), + (WirelessLAN.objects.restrict(request.user, 'view').filter(_site=instance), 'site_id'), ), ), } @@ -506,14 +533,19 @@ class LocationView(GetRelatedModelsMixin, generic.ObjectView): 'related_models': self.get_related_models( request, locations, - [CableTermination], - ( + omit=[CableTermination, Cluster, Prefix, WirelessLAN], + extra=( ( Circuit.objects.restrict(request.user, 'view').filter( terminations___location=instance ).distinct(), 'location_id' ), + + # Handle these relations manually to avoid erroneous filter name resolution + (Cluster.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), + (Prefix.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), + (WirelessLAN.objects.restrict(request.user, 'view').filter(_location=instance), 'location_id'), ), ), } From 4ae552936256f536abe2701a9cec1c9bf565f77c Mon Sep 17 00:00:00 2001 From: Tobias Genannt Date: Tue, 7 Jan 2025 09:47:11 +0100 Subject: [PATCH 128/169] Fix #18314: Use get to avoid KeyError --- netbox/extras/dashboard/widgets.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/extras/dashboard/widgets.py b/netbox/extras/dashboard/widgets.py index 6bb7f59fb..eeed5414f 100644 --- a/netbox/extras/dashboard/widgets.py +++ b/netbox/extras/dashboard/widgets.py @@ -314,7 +314,7 @@ class RSSFeedWidget(DashboardWidget): return f'dashboard_rss_{url_checksum}' def get_feed(self): - if self.config['requires_internet'] and settings.ISOLATED_DEPLOYMENT: + if self.config.get('requires_internet') and settings.ISOLATED_DEPLOYMENT: return { 'isolated_deployment': True, } From e518f086040e3b5bfc14f70cc63064cd3893c750 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Tue, 7 Jan 2025 10:47:05 -0500 Subject: [PATCH 129/169] Fixes: #18316 - Fix PrefixIndex reference to 'site' (#18322) * Fix PrefixIndex reference to 'site' * Fix ClusterIndex reference to 'site' and add 'scope' to WirelessLANIndex --- netbox/ipam/search.py | 2 +- netbox/virtualization/search.py | 2 +- netbox/wireless/search.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/search.py b/netbox/ipam/search.py index d200abacf..6e71d44a5 100644 --- a/netbox/ipam/search.py +++ b/netbox/ipam/search.py @@ -79,7 +79,7 @@ class PrefixIndex(SearchIndex): ('description', 500), ('comments', 5000), ) - display_attrs = ('site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'description') + display_attrs = ('scope', 'vrf', 'tenant', 'vlan', 'status', 'role', 'description') @register_search diff --git a/netbox/virtualization/search.py b/netbox/virtualization/search.py index 18cc06519..8614bf6ea 100644 --- a/netbox/virtualization/search.py +++ b/netbox/virtualization/search.py @@ -10,7 +10,7 @@ class ClusterIndex(SearchIndex): ('description', 500), ('comments', 5000), ) - display_attrs = ('type', 'group', 'status', 'tenant', 'site', 'description') + display_attrs = ('type', 'group', 'status', 'tenant', 'scope', 'description') @register_search diff --git a/netbox/wireless/search.py b/netbox/wireless/search.py index c8ac023cc..e1be53c09 100644 --- a/netbox/wireless/search.py +++ b/netbox/wireless/search.py @@ -11,7 +11,7 @@ class WirelessLANIndex(SearchIndex): ('auth_psk', 2000), ('comments', 5000), ) - display_attrs = ('group', 'status', 'vlan', 'tenant', 'description') + display_attrs = ('group', 'status', 'vlan', 'tenant', 'scope', 'description') @register_search From ffac0974dd31c5824f665aa8077f010581a6cfdf Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 8 Jan 2025 05:02:12 +0000 Subject: [PATCH 130/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 82 ++++++++++---------- 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 8a7614860..300b70000 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-07 05:02+0000\n" +"POT-Creation-Date: 2025-01-08 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -512,7 +512,7 @@ msgstr "" #: netbox/templates/dcim/macaddress.html:21 #: netbox/templates/dcim/manufacturer.html:40 #: netbox/templates/dcim/module.html:73 netbox/templates/dcim/modulebay.html:42 -#: netbox/templates/dcim/moduletype.html:37 +#: netbox/templates/dcim/moduletype.html:39 #: netbox/templates/dcim/platform.html:33 #: netbox/templates/dcim/powerfeed.html:40 #: netbox/templates/dcim/poweroutlet.html:40 @@ -3914,7 +3914,7 @@ msgstr "" #: netbox/templates/dcim/inventoryitem.html:48 #: netbox/templates/dcim/manufacturer.html:33 #: netbox/templates/dcim/modulebay.html:62 -#: netbox/templates/dcim/moduletype.html:25 +#: netbox/templates/dcim/moduletype.html:27 #: netbox/templates/dcim/platform.html:37 #: netbox/templates/dcim/racktype.html:16 msgid "Manufacturer" @@ -3980,7 +3980,7 @@ msgstr "" #: netbox/extras/forms/filtersets.py:243 netbox/ipam/forms/bulk_edit.py:193 #: netbox/templates/dcim/device.html:324 #: netbox/templates/dcim/devicetype.html:49 -#: netbox/templates/dcim/moduletype.html:45 netbox/templates/dcim/rack.html:81 +#: netbox/templates/dcim/moduletype.html:47 netbox/templates/dcim/rack.html:81 #: netbox/templates/dcim/racktype.html:41 #: netbox/templates/extras/configcontext.html:17 #: netbox/templates/extras/customlink.html:25 @@ -4052,7 +4052,7 @@ msgstr "" #: netbox/dcim/forms/filtersets.py:512 netbox/dcim/forms/filtersets.py:670 #: netbox/dcim/forms/filtersets.py:805 netbox/templates/dcim/device.html:98 #: netbox/templates/dcim/devicetype.html:65 -#: netbox/templates/dcim/moduletype.html:41 netbox/templates/dcim/rack.html:65 +#: netbox/templates/dcim/moduletype.html:43 netbox/templates/dcim/rack.html:65 #: netbox/templates/dcim/racktype.html:28 msgid "Airflow" msgstr "" @@ -4115,7 +4115,7 @@ msgstr "" #: netbox/dcim/forms/bulk_edit.py:601 netbox/dcim/forms/model_forms.py:410 #: netbox/dcim/tables/modules.py:17 netbox/dcim/tables/modules.py:66 #: netbox/templates/dcim/module.html:65 netbox/templates/dcim/modulebay.html:66 -#: netbox/templates/dcim/moduletype.html:22 +#: netbox/templates/dcim/moduletype.html:24 msgid "Module Type" msgstr "" @@ -7045,8 +7045,8 @@ msgid "Power outlets" msgstr "" #: netbox/dcim/tables/devices.py:256 netbox/dcim/tables/devices.py:1112 -#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1112 -#: netbox/dcim/views.py:1356 netbox/dcim/views.py:2107 +#: netbox/dcim/tables/devicetypes.py:128 netbox/dcim/views.py:1144 +#: netbox/dcim/views.py:1388 netbox/dcim/views.py:2139 #: netbox/netbox/navigation/menu.py:94 netbox/netbox/navigation/menu.py:258 #: netbox/templates/dcim/device/base.html:37 #: netbox/templates/dcim/device_list.html:43 @@ -7084,8 +7084,8 @@ msgid "Module Bay" msgstr "" #: netbox/dcim/tables/devices.py:327 netbox/dcim/tables/devicetypes.py:47 -#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1187 -#: netbox/dcim/views.py:2205 netbox/netbox/navigation/menu.py:103 +#: netbox/dcim/tables/devicetypes.py:143 netbox/dcim/views.py:1219 +#: netbox/dcim/views.py:2237 netbox/netbox/navigation/menu.py:103 #: netbox/templates/dcim/device/base.html:52 #: netbox/templates/dcim/device_list.html:71 #: netbox/templates/dcim/devicetype/base.html:49 @@ -7214,8 +7214,8 @@ msgstr "" msgid "Instances" msgstr "" -#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1052 -#: netbox/dcim/views.py:1296 netbox/dcim/views.py:2043 +#: netbox/dcim/tables/devicetypes.py:116 netbox/dcim/views.py:1084 +#: netbox/dcim/views.py:1328 netbox/dcim/views.py:2075 #: netbox/netbox/navigation/menu.py:97 #: netbox/templates/dcim/device/base.html:25 #: netbox/templates/dcim/device_list.html:15 @@ -7225,8 +7225,8 @@ msgstr "" msgid "Console Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1067 -#: netbox/dcim/views.py:1311 netbox/dcim/views.py:2059 +#: netbox/dcim/tables/devicetypes.py:119 netbox/dcim/views.py:1099 +#: netbox/dcim/views.py:1343 netbox/dcim/views.py:2091 #: netbox/netbox/navigation/menu.py:98 #: netbox/templates/dcim/device/base.html:28 #: netbox/templates/dcim/device_list.html:22 @@ -7236,8 +7236,8 @@ msgstr "" msgid "Console Server Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1082 -#: netbox/dcim/views.py:1326 netbox/dcim/views.py:2075 +#: netbox/dcim/tables/devicetypes.py:122 netbox/dcim/views.py:1114 +#: netbox/dcim/views.py:1358 netbox/dcim/views.py:2107 #: netbox/netbox/navigation/menu.py:99 #: netbox/templates/dcim/device/base.html:31 #: netbox/templates/dcim/device_list.html:29 @@ -7247,8 +7247,8 @@ msgstr "" msgid "Power Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1097 -#: netbox/dcim/views.py:1341 netbox/dcim/views.py:2091 +#: netbox/dcim/tables/devicetypes.py:125 netbox/dcim/views.py:1129 +#: netbox/dcim/views.py:1373 netbox/dcim/views.py:2123 #: netbox/netbox/navigation/menu.py:100 #: netbox/templates/dcim/device/base.html:34 #: netbox/templates/dcim/device_list.html:36 @@ -7258,8 +7258,8 @@ msgstr "" msgid "Power Outlets" msgstr "" -#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1127 -#: netbox/dcim/views.py:1371 netbox/dcim/views.py:2129 +#: netbox/dcim/tables/devicetypes.py:131 netbox/dcim/views.py:1159 +#: netbox/dcim/views.py:1403 netbox/dcim/views.py:2161 #: netbox/netbox/navigation/menu.py:95 #: netbox/templates/dcim/device/base.html:40 #: netbox/templates/dcim/devicetype/base.html:37 @@ -7268,8 +7268,8 @@ msgstr "" msgid "Front Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1142 -#: netbox/dcim/views.py:1386 netbox/dcim/views.py:2145 +#: netbox/dcim/tables/devicetypes.py:134 netbox/dcim/views.py:1174 +#: netbox/dcim/views.py:1418 netbox/dcim/views.py:2177 #: netbox/netbox/navigation/menu.py:96 #: netbox/templates/dcim/device/base.html:43 #: netbox/templates/dcim/device_list.html:50 @@ -7279,16 +7279,16 @@ msgstr "" msgid "Rear Ports" msgstr "" -#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1172 -#: netbox/dcim/views.py:2185 netbox/netbox/navigation/menu.py:102 +#: netbox/dcim/tables/devicetypes.py:137 netbox/dcim/views.py:1204 +#: netbox/dcim/views.py:2217 netbox/netbox/navigation/menu.py:102 #: netbox/templates/dcim/device/base.html:49 #: netbox/templates/dcim/device_list.html:57 #: netbox/templates/dcim/devicetype/base.html:46 msgid "Device Bays" msgstr "" -#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1157 -#: netbox/dcim/views.py:1401 netbox/dcim/views.py:2165 +#: netbox/dcim/tables/devicetypes.py:140 netbox/dcim/views.py:1189 +#: netbox/dcim/views.py:1433 netbox/dcim/views.py:2197 #: netbox/netbox/navigation/menu.py:101 #: netbox/templates/dcim/device/base.html:46 #: netbox/templates/dcim/device_list.html:64 @@ -7353,67 +7353,67 @@ msgstr "" msgid "Test case must set peer_termination_type" msgstr "" -#: netbox/dcim/views.py:138 +#: netbox/dcim/views.py:139 #, python-brace-format msgid "Disconnected {count} {type}" msgstr "" -#: netbox/dcim/views.py:794 netbox/netbox/navigation/menu.py:51 +#: netbox/dcim/views.py:826 netbox/netbox/navigation/menu.py:51 msgid "Reservations" msgstr "" -#: netbox/dcim/views.py:813 netbox/templates/dcim/location.html:90 +#: netbox/dcim/views.py:845 netbox/templates/dcim/location.html:90 #: netbox/templates/dcim/site.html:140 msgid "Non-Racked Devices" msgstr "" -#: netbox/dcim/views.py:2218 netbox/extras/forms/model_forms.py:577 +#: netbox/dcim/views.py:2250 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 #: netbox/virtualization/forms/model_forms.py:224 #: netbox/virtualization/views.py:424 msgid "Config Context" msgstr "" -#: netbox/dcim/views.py:2228 netbox/virtualization/views.py:434 +#: netbox/dcim/views.py:2260 netbox/virtualization/views.py:434 msgid "Render Config" msgstr "" -#: netbox/dcim/views.py:2263 netbox/virtualization/views.py:469 +#: netbox/dcim/views.py:2295 netbox/virtualization/views.py:469 #, python-brace-format msgid "An error occurred while rendering the template: {error}" msgstr "" -#: netbox/dcim/views.py:2281 netbox/extras/tables/tables.py:550 +#: netbox/dcim/views.py:2313 netbox/extras/tables/tables.py:550 #: netbox/netbox/navigation/menu.py:255 netbox/netbox/navigation/menu.py:257 #: netbox/virtualization/views.py:192 msgid "Virtual Machines" msgstr "" -#: netbox/dcim/views.py:3114 +#: netbox/dcim/views.py:3146 #, python-brace-format msgid "Installed device {device} in bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3155 +#: netbox/dcim/views.py:3187 #, python-brace-format msgid "Removed device {device} from bay {device_bay}." msgstr "" -#: netbox/dcim/views.py:3271 netbox/ipam/tables/ip.py:180 +#: netbox/dcim/views.py:3303 netbox/ipam/tables/ip.py:180 msgid "Children" msgstr "" -#: netbox/dcim/views.py:3738 +#: netbox/dcim/views.py:3770 #, python-brace-format msgid "Added member {device}" msgstr "" -#: netbox/dcim/views.py:3787 +#: netbox/dcim/views.py:3819 #, python-brace-format msgid "Unable to remove master device {device} from the virtual chassis." msgstr "" -#: netbox/dcim/views.py:3800 +#: netbox/dcim/views.py:3832 #, python-brace-format msgid "Removed {device} from virtual chassis {chassis}" msgstr "" @@ -12919,12 +12919,12 @@ msgid "VM Role" msgstr "" #: netbox/templates/dcim/devicetype.html:18 -#: netbox/templates/dcim/moduletype.html:29 +#: netbox/templates/dcim/moduletype.html:31 msgid "Model Name" msgstr "" #: netbox/templates/dcim/devicetype.html:25 -#: netbox/templates/dcim/moduletype.html:33 +#: netbox/templates/dcim/moduletype.html:35 msgid "Part Number" msgstr "" From 53aa2c862495999c1b7223602abad9a1cf397d9b Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Jan 2025 08:43:17 -0500 Subject: [PATCH 131/169] Fixes #18329: Pin strawberry-graphql-django to v0.52.0 to resolve upstream bug --- base_requirements.txt | 3 ++- requirements.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/base_requirements.txt b/base_requirements.txt index 169f4196d..4cb355dd5 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -134,7 +134,8 @@ strawberry-graphql # Strawberry GraphQL Django extension # https://github.com/strawberry-graphql/strawberry-django/releases -strawberry-graphql-django +# Pinned to v0.52.0 for suspected upstream bug; see #18329 +strawberry-graphql-django==0.52.0 # SVG image rendering (used for rack elevations) # https://github.com/mozman/svgwrite/blob/master/NEWS.rst diff --git a/requirements.txt b/requirements.txt index e5ffe8386..b875ae5a2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,7 +32,7 @@ rq==2.1.0 social-auth-app-django==5.4.2 social-auth-core==4.5.4 strawberry-graphql==0.256.1 -strawberry-graphql-django==0.53.1 +strawberry-graphql-django==0.52.0 svgwrite==1.4.3 tablib==3.7.0 tzdata==2024.2 From 4456c488f106614ddf98c406018024f9c86add50 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Tue, 7 Jan 2025 15:58:42 -0500 Subject: [PATCH 132/169] Change PrefixTable.vlan to represent the VLAN ID rather than the VLAN object, to enable more useful sorting by VLAN ID rather than site-grouped VLAN objects --- netbox/ipam/tables/ip.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index dbbeb3454..bc343b175 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -200,8 +200,9 @@ class PrefixTable(TenancyColumnsMixin, NetBoxTable): verbose_name=_('VLAN Group') ) vlan = tables.Column( + accessor='vlan__vid', linkify=True, - verbose_name=_('VLAN') + verbose_name=_('VLAN ID') ) role = tables.Column( verbose_name=_('Role'), From f6b8c1966def51cece2a007f8008b9be1a1fc344 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 8 Jan 2025 09:38:24 -0500 Subject: [PATCH 133/169] Use order_by to change ordering behavior of VLAN column rather than changing accessor --- netbox/ipam/tables/ip.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index bc343b175..17ba36de9 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -200,9 +200,9 @@ class PrefixTable(TenancyColumnsMixin, NetBoxTable): verbose_name=_('VLAN Group') ) vlan = tables.Column( - accessor='vlan__vid', + order_by=('vlan__vid', 'vlan__pk'), linkify=True, - verbose_name=_('VLAN ID') + verbose_name=_('VLAN') ) role = tables.Column( verbose_name=_('Role'), From d04fc11c61684b8ebfcace4328087a14458bf747 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 8 Jan 2025 10:19:28 -0500 Subject: [PATCH 134/169] Release v4.2.1 (#18346) * Release v4.2.1 * Add changelog for #18282 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- docs/release-notes/version-4.2.md | 13 ++ netbox/release.yaml | 4 +- netbox/translations/cs/LC_MESSAGES/django.mo | Bin 229001 -> 230181 bytes netbox/translations/cs/LC_MESSAGES/django.po | 174 +++++++++--------- 6 files changed, 105 insertions(+), 90 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index 7cb6057ea..f415f933a 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.2.0 + placeholder: v4.2.1 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index e2145543d..0e0839849 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -39,7 +39,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.2.0 + placeholder: v4.2.1 validations: required: true - type: dropdown diff --git a/docs/release-notes/version-4.2.md b/docs/release-notes/version-4.2.md index fdbc09114..a1dafaf14 100644 --- a/docs/release-notes/version-4.2.md +++ b/docs/release-notes/version-4.2.md @@ -1,5 +1,18 @@ # NetBox v4.2 +## v4.2.1 (2025-01-08) + +### Bug Fixes + +* [#18282](https://github.com/netbox-community/netbox/issues/18282) - Fix ordering of prefixes list by assigned VLAN +* [#18314](https://github.com/netbox-community/netbox/issues/18314) - Fix KeyError exception when rendering pre-saved dashboard (`requires_internet` missing) +* [#18316](https://github.com/netbox-community/netbox/issues/18316) - Fix AttributeError exception when global search results include prefixes and/or clusters +* [#18318](https://github.com/netbox-community/netbox/issues/18318) - Correct navigation breadcrumbs for module type UI view +* [#18324](https://github.com/netbox-community/netbox/issues/18324) - Correct filtering for certain related object listings +* [#18329](https://github.com/netbox-community/netbox/issues/18329) - Address upstream bug in GraphQL API where only one primary IP address is returned within a device/VM list + +--- + ## v4.2.0 (2025-01-06) ### Breaking Changes diff --git a/netbox/release.yaml b/netbox/release.yaml index c7919b91e..4127b0253 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.2.0" +version: "4.2.1" edition: "Community" -published: "2025-01-06" +published: "2025-01-08" diff --git a/netbox/translations/cs/LC_MESSAGES/django.mo b/netbox/translations/cs/LC_MESSAGES/django.mo index d5a4db33b04995480ff2dc5c859441221e56be14..964d8f54c07d09f825b4212b35d61b079f85033e 100644 GIT binary patch delta 67285 zcmXuscfgj@|G@FPr;LVDk%sc5y@z(%N=rkfMI{xfl+2{=B9V{~Nk#~vFACX;A`y|Y zg(wOsigzJ#WFEqY@L9YH2Nf!iIUP4+Ev#@vfy|NE8JlBI z?2far8-9T8u-uUaGW~Hd_QU_-1p3e99aSLHg^Edd0j|PMn16I~6gH;(Soj6Drd+&m zfy^N6jxF#ZY>HoETP#(iK&C79MFUl7tW`p-1xq9IO0Q~SU08??bv#gbjo z5l=^_jOCR|9hE`ftBh{n#^}hpp#hy0<ytz0-4_hLDGBFgK~ z2REY~ZbJjxk9JtFbPDV^bi@_W#at8JCH2t&24QVHAI

    ;Zkhr{(pgsX59D<8(^*D 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≷&UU^DQLoiR&kx=r9QPR|;jE>pmE?^g?;-OEXpUxH z)J-Q>nH;KGu&+qdB{~M@~_6%2{qk@DA&O z6uw~14JLn;_qP->qI92KY(wNF#B7kdS;0A0=okL<_&+eNTZ3w#niYwRctS=a8jv+G zP8@V2;OmRdWb|8E1LAbl&;R zY%c3F%w^>bYto!Qv2?b6XqXb6(ePu~iFlIiwEWONPu%nTD^QfN7RN>ivuG%r6&?uj zF}~1=LFX_5^L&7ySX< zK19P>@CixX89fMIr$bqNcD>NVUeI6~3IrJcExF@tr{bnZJTbTu{#C|v#u|#3RI?O4 z!F&N4kMW<>Wzt7!ujR!tf?`!YzY8+SdQ|ic<+_q0n*yUR%z>b+JCaqIH^kT04!Hy^ z#fM*qEzBkU(EKZOmiUL^uZ3Usl-#KJev%W#Y8=-OW(q;dgJV9um!yFx6j%k;A>ksv zIf%(hGs;mQEjR+-UWC`f`D#U@_?!PJu3Hdv_ z_F70gqTdv#jemp%Hj$XhF4-jJ&4?G_6k2jp$MhSXkEI zS+BJkwg*=L{)1@0*MqqjqO2vm_-n+KBz;5B*Y?_a7rZ3!+95ENW=hjQHj8~EAvy8x zG#8BTn(3{9_n0~x$+-b$h1U&VQhhK#KsN^{7z{bT?e-SFXeN4y`32&+!4D)xF@F?x zUmCIbwt)cFb;*y1aA*q2im47`_lLw#e?>8z&@U6*yB|`_NneA83Ke*RizXCCWk8bn} z9VYm}4!;u-gSQ;>OIxK6 z&YC^AM{57aF~b~L*!9rbu5Ee+k16QCCUbC52meG-gGUeWuOA^e+*tpr8G Date: Thu, 9 Jan 2025 05:02:09 +0000 Subject: [PATCH 135/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 48 ++++++++++---------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 300b70000..2c22df58a 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-08 05:02+0000\n" +"POT-Creation-Date: 2025-01-09 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -766,8 +766,8 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:212 netbox/ipam/forms/filtersets.py:284 #: netbox/ipam/forms/filtersets.py:358 netbox/ipam/forms/filtersets.py:542 #: netbox/ipam/forms/model_forms.py:503 netbox/ipam/tables/ip.py:183 -#: netbox/ipam/tables/ip.py:262 netbox/ipam/tables/ip.py:313 -#: netbox/ipam/tables/ip.py:376 netbox/ipam/tables/ip.py:403 +#: netbox/ipam/tables/ip.py:263 netbox/ipam/tables/ip.py:314 +#: netbox/ipam/tables/ip.py:377 netbox/ipam/tables/ip.py:404 #: netbox/ipam/tables/vlans.py:95 netbox/ipam/tables/vlans.py:208 #: netbox/templates/circuits/circuit.html:34 #: netbox/templates/circuits/virtualcircuit.html:43 @@ -844,7 +844,7 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:122 netbox/ipam/forms/filtersets.py:145 #: netbox/ipam/forms/filtersets.py:176 netbox/ipam/forms/filtersets.py:270 #: netbox/ipam/forms/filtersets.py:313 netbox/ipam/forms/filtersets.py:510 -#: netbox/ipam/tables/ip.py:406 netbox/ipam/tables/vlans.py:205 +#: netbox/ipam/tables/ip.py:407 netbox/ipam/tables/vlans.py:205 #: netbox/templates/circuits/circuit.html:48 #: netbox/templates/circuits/circuitgroup.html:36 #: netbox/templates/circuits/virtualcircuit.html:47 @@ -1078,8 +1078,8 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:292 netbox/ipam/forms/filtersets.py:363 #: netbox/ipam/forms/filtersets.py:550 netbox/ipam/forms/model_forms.py:194 #: netbox/ipam/forms/model_forms.py:220 netbox/ipam/forms/model_forms.py:251 -#: netbox/ipam/forms/model_forms.py:678 netbox/ipam/tables/ip.py:207 -#: netbox/ipam/tables/ip.py:266 netbox/ipam/tables/ip.py:317 +#: netbox/ipam/forms/model_forms.py:678 netbox/ipam/tables/ip.py:208 +#: netbox/ipam/tables/ip.py:267 netbox/ipam/tables/ip.py:318 #: netbox/ipam/tables/vlans.py:99 netbox/ipam/tables/vlans.py:211 #: netbox/templates/circuits/virtualcircuittermination.html:42 #: netbox/templates/dcim/device.html:182 @@ -1191,7 +1191,7 @@ msgstr "" #: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1140 #: netbox/ipam/forms/bulk_import.py:317 netbox/ipam/forms/model_forms.py:282 #: netbox/ipam/forms/model_forms.py:291 netbox/ipam/tables/fhrp.py:64 -#: netbox/ipam/tables/ip.py:322 netbox/ipam/tables/vlans.py:145 +#: netbox/ipam/tables/ip.py:323 netbox/ipam/tables/vlans.py:145 #: netbox/templates/circuits/inc/circuit_termination_fields.html:52 #: netbox/templates/circuits/virtualcircuittermination.html:53 #: netbox/templates/circuits/virtualcircuittermination.html:60 @@ -1831,8 +1831,8 @@ msgstr "" #: netbox/dcim/tables/racks.py:224 netbox/dcim/tables/sites.py:108 #: netbox/extras/tables/tables.py:582 netbox/ipam/tables/asn.py:69 #: netbox/ipam/tables/fhrp.py:34 netbox/ipam/tables/ip.py:82 -#: netbox/ipam/tables/ip.py:224 netbox/ipam/tables/ip.py:279 -#: netbox/ipam/tables/ip.py:347 netbox/ipam/tables/services.py:24 +#: netbox/ipam/tables/ip.py:225 netbox/ipam/tables/ip.py:280 +#: netbox/ipam/tables/ip.py:348 netbox/ipam/tables/services.py:24 #: netbox/ipam/tables/services.py:54 netbox/ipam/tables/vlans.py:121 #: netbox/ipam/tables/vrfs.py:47 netbox/ipam/tables/vrfs.py:72 #: netbox/templates/dcim/htmx/cable_edit.html:89 @@ -3009,7 +3009,7 @@ msgstr "" #: netbox/dcim/tables/devices.py:689 netbox/dcim/tables/devices.py:899 #: netbox/dcim/tables/devices.py:986 netbox/dcim/tables/devices.py:1146 #: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 -#: netbox/ipam/tables/ip.py:328 netbox/ipam/tables/services.py:44 +#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/services.py:44 #: netbox/templates/dcim/interface.html:108 #: netbox/templates/dcim/interface.html:366 #: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 @@ -3688,8 +3688,8 @@ msgstr "" #: netbox/ipam/forms/model_forms.py:480 netbox/ipam/forms/model_forms.py:494 #: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:498 #: netbox/ipam/models/ip.py:719 netbox/ipam/models/vrfs.py:61 -#: netbox/ipam/tables/ip.py:188 netbox/ipam/tables/ip.py:259 -#: netbox/ipam/tables/ip.py:310 netbox/ipam/tables/ip.py:400 +#: netbox/ipam/tables/ip.py:188 netbox/ipam/tables/ip.py:260 +#: netbox/ipam/tables/ip.py:311 netbox/ipam/tables/ip.py:401 #: netbox/templates/dcim/interface.html:152 #: netbox/templates/ipam/ipaddress.html:18 #: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 @@ -6994,8 +6994,8 @@ msgstr "" #: netbox/dcim/tables/devices.py:197 netbox/dcim/tables/devices.py:1099 #: netbox/ipam/forms/bulk_import.py:562 netbox/ipam/forms/model_forms.py:308 -#: netbox/ipam/forms/model_forms.py:321 netbox/ipam/tables/ip.py:306 -#: netbox/ipam/tables/ip.py:373 netbox/ipam/tables/ip.py:396 +#: netbox/ipam/forms/model_forms.py:321 netbox/ipam/tables/ip.py:307 +#: netbox/ipam/tables/ip.py:374 netbox/ipam/tables/ip.py:397 #: netbox/templates/ipam/ipaddress.html:11 #: netbox/virtualization/tables/virtualmachines.py:65 msgid "IP Address" @@ -9658,7 +9658,7 @@ msgstr "" #: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_import.py:181 #: netbox/ipam/forms/filtersets.py:259 netbox/ipam/forms/model_forms.py:217 -#: netbox/ipam/models/vlans.py:272 netbox/ipam/tables/ip.py:204 +#: netbox/ipam/models/vlans.py:272 netbox/ipam/tables/ip.py:205 #: netbox/templates/ipam/prefix.html:56 netbox/templates/ipam/vlan.html:12 #: netbox/templates/ipam/vlan/base.html:6 #: netbox/templates/ipam/vlan_edit.html:10 @@ -10516,8 +10516,8 @@ msgstr "" msgid "Prefixes" msgstr "" -#: netbox/ipam/tables/ip.py:77 netbox/ipam/tables/ip.py:219 -#: netbox/ipam/tables/ip.py:274 netbox/ipam/tables/vlans.py:55 +#: netbox/ipam/tables/ip.py:77 netbox/ipam/tables/ip.py:220 +#: netbox/ipam/tables/ip.py:275 netbox/ipam/tables/vlans.py:55 #: netbox/templates/dcim/device.html:260 #: netbox/templates/ipam/aggregate.html:24 #: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:102 @@ -10542,31 +10542,31 @@ msgstr "" msgid "Scope Type" msgstr "" -#: netbox/ipam/tables/ip.py:211 +#: netbox/ipam/tables/ip.py:212 msgid "Pool" msgstr "" -#: netbox/ipam/tables/ip.py:215 netbox/ipam/tables/ip.py:270 +#: netbox/ipam/tables/ip.py:216 netbox/ipam/tables/ip.py:271 msgid "Marked Utilized" msgstr "" -#: netbox/ipam/tables/ip.py:254 +#: netbox/ipam/tables/ip.py:255 msgid "Start address" msgstr "" -#: netbox/ipam/tables/ip.py:333 +#: netbox/ipam/tables/ip.py:334 msgid "NAT (Inside)" msgstr "" -#: netbox/ipam/tables/ip.py:338 +#: netbox/ipam/tables/ip.py:339 msgid "NAT (Outside)" msgstr "" -#: netbox/ipam/tables/ip.py:343 +#: netbox/ipam/tables/ip.py:344 msgid "Assigned" msgstr "" -#: netbox/ipam/tables/ip.py:379 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/ipam/tables/ip.py:380 netbox/templates/vpn/l2vpntermination.html:16 #: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "" From 80e1fd02bbcde9ab8082cc093536bb6b81f63b76 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 9 Jan 2025 10:26:17 -0500 Subject: [PATCH 136/169] Update docs to indicate PostgreSQL 13+ requirement --- docs/installation/index.md | 2 +- docs/installation/upgrading.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/installation/index.md b/docs/installation/index.md index 76160068a..33888e274 100644 --- a/docs/installation/index.md +++ b/docs/installation/index.md @@ -21,7 +21,7 @@ The following sections detail how to set up a new instance of NetBox: | Dependency | Supported Versions | |------------|--------------------| | Python | 3.10, 3.11, 3.12 | -| PostgreSQL | 12+ | +| PostgreSQL | 13+ | | Redis | 4.0+ | Below is a simplified overview of the NetBox application stack for reference: diff --git a/docs/installation/upgrading.md b/docs/installation/upgrading.md index 5b844f1c3..e6d05738f 100644 --- a/docs/installation/upgrading.md +++ b/docs/installation/upgrading.md @@ -20,7 +20,7 @@ NetBox requires the following dependencies: | Dependency | Supported Versions | |------------|--------------------| | Python | 3.10, 3.11, 3.12 | -| PostgreSQL | 12+ | +| PostgreSQL | 13+ | | Redis | 4.0+ | ## 3. Install the Latest Release From b11f17952732904472279ac4238c1ba0b849c186 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jan 2025 09:53:28 -0500 Subject: [PATCH 137/169] Closes #18362: Create a system job for census reporting --- netbox/core/jobs.py | 48 +++++++++++++++++++++++++++++++++++++-- netbox/netbox/settings.py | 13 ----------- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/netbox/core/jobs.py b/netbox/core/jobs.py index d2b846398..891b1cbdb 100644 --- a/netbox/core/jobs.py +++ b/netbox/core/jobs.py @@ -1,8 +1,11 @@ import logging +import requests +import sys -from netbox.jobs import JobRunner +from django.conf import settings +from netbox.jobs import JobRunner, system_job from netbox.search.backends import search_backend -from .choices import DataSourceStatusChoices +from .choices import DataSourceStatusChoices, JobIntervalChoices from .exceptions import SyncError from .models import DataSource @@ -31,3 +34,44 @@ class SyncDataSourceJob(JobRunner): if type(e) is SyncError: logging.error(e) raise e + + +@system_job(interval=JobIntervalChoices.INTERVAL_DAILY) +class SystemHousekeepingJob(JobRunner): + """ + Perform daily system housekeeping functions. + """ + class Meta: + name = "System Housekeeping" + + def run(self, *args, **kwargs): + # Skip if running in development or test mode + if settings.DEBUG or 'test' in sys.argv: + return + + # TODO: Migrate other housekeeping functions from the `housekeeping` management command. + self.send_census_report() + + @staticmethod + def send_census_report(): + """ + Send a census report (if enabled). + """ + # Skip if census reporting is disabled + if settings.ISOLATED_DEPLOYMENT or not settings.CENSUS_REPORTING_ENABLED: + return + + census_data = { + 'version': settings.RELEASE.full_version, + 'python_version': sys.version.split()[0], + 'deployment_id': settings.DEPLOYMENT_ID, + } + try: + requests.get( + url=settings.CENSUS_URL, + params=census_data, + timeout=3, + proxies=settings.HTTP_PROXIES + ) + except requests.exceptions.RequestException: + pass diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 0682e713d..581cd9ef4 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -5,9 +5,7 @@ import os import platform import sys import warnings -from urllib.parse import urlencode -import requests from django.contrib.messages import constants as messages from django.core.exceptions import ImproperlyConfigured, ValidationError from django.core.validators import URLValidator @@ -583,17 +581,6 @@ if SENTRY_ENABLED: # Calculate a unique deployment ID from the secret key DEPLOYMENT_ID = hashlib.sha256(SECRET_KEY.encode('utf-8')).hexdigest()[:16] CENSUS_URL = 'https://census.netbox.oss.netboxlabs.com/api/v1/' -CENSUS_PARAMS = { - 'version': RELEASE.full_version, - 'python_version': sys.version.split()[0], - 'deployment_id': DEPLOYMENT_ID, -} -if CENSUS_REPORTING_ENABLED and not ISOLATED_DEPLOYMENT and not DEBUG and 'test' not in sys.argv: - try: - # Report anonymous census data - requests.get(f'{CENSUS_URL}?{urlencode(CENSUS_PARAMS)}', timeout=3, proxies=HTTP_PROXIES) - except requests.exceptions.RequestException: - pass # From b12c8c880f77acb5dac4e95c237a2cb654e72e6d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jan 2025 13:55:19 -0500 Subject: [PATCH 138/169] Fixes #18363: Fix assignment of MAC addresses to interfaces via REST API (#18367) * Fixes #18363: Fix assignment of MAC addresses to interfaces via REST API * Add missing API & view tests --- netbox/dcim/api/serializers_/devices.py | 4 +- netbox/dcim/tests/test_api.py | 43 +++++++++++++++++++++ netbox/dcim/tests/test_views.py | 51 +++++++++++++++++++++++++ 3 files changed, 96 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index eb6c4f9bc..1ad51caaa 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -170,8 +170,8 @@ class MACAddressSerializer(NetBoxModelSerializer): class Meta: model = MACAddress fields = [ - 'id', 'url', 'display_url', 'display', 'mac_address', 'assigned_object_type', 'assigned_object', - 'description', 'comments', + 'id', 'url', 'display_url', 'display', 'mac_address', 'assigned_object_type', 'assigned_object_id', + 'assigned_object', 'description', 'comments', ] brief_fields = ('id', 'url', 'display', 'mac_address', 'description') diff --git a/netbox/dcim/tests/test_api.py b/netbox/dcim/tests/test_api.py index c273e02dd..99a446aef 100644 --- a/netbox/dcim/tests/test_api.py +++ b/netbox/dcim/tests/test_api.py @@ -2447,3 +2447,46 @@ class VirtualDeviceContextTest(APIViewTestCases.APIViewTestCase): # Omit identifier to test uniqueness constraint }, ] + + +class MACAddressTest(APIViewTestCases.APIViewTestCase): + model = MACAddress + brief_fields = ['description', 'display', 'id', 'mac_address', 'url'] + bulk_update_data = { + 'description': 'New description', + } + + @classmethod + def setUpTestData(cls): + device = create_test_device(name='Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type='1000base-t'), + Interface(device=device, name='Interface 2', type='1000base-t'), + Interface(device=device, name='Interface 3', type='1000base-t'), + Interface(device=device, name='Interface 4', type='1000base-t'), + Interface(device=device, name='Interface 5', type='1000base-t'), + ) + Interface.objects.bulk_create(interfaces) + + mac_addresses = ( + MACAddress(mac_address='00:00:00:00:00:01', assigned_object=interfaces[0]), + MACAddress(mac_address='00:00:00:00:00:02', assigned_object=interfaces[1]), + MACAddress(mac_address='00:00:00:00:00:03', assigned_object=interfaces[2]), + ) + MACAddress.objects.bulk_create(mac_addresses) + + cls.create_data = [ + { + 'mac_address': '00:00:00:00:00:04', + 'assigned_object_type': 'dcim.interface', + 'assigned_object_id': interfaces[3].pk, + }, + { + 'mac_address': '00:00:00:00:00:05', + 'assigned_object_type': 'dcim.interface', + 'assigned_object_id': interfaces[4].pk, + }, + { + 'mac_address': '00:00:00:00:00:06', + }, + ] diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index bb942c685..b84217882 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -3470,3 +3470,54 @@ class VirtualDeviceContextTestCase(ViewTestCases.PrimaryObjectViewTestCase): cls.bulk_edit_data = { 'status': VirtualDeviceContextStatusChoices.STATUS_OFFLINE, } + + +class MACAddressTestCase(ViewTestCases.PrimaryObjectViewTestCase): + model = MACAddress + + @classmethod + def setUpTestData(cls): + device = create_test_device(name='Device 1') + interfaces = ( + Interface(device=device, name='Interface 1', type='1000base-t'), + Interface(device=device, name='Interface 2', type='1000base-t'), + Interface(device=device, name='Interface 3', type='1000base-t'), + Interface(device=device, name='Interface 4', type='1000base-t'), + Interface(device=device, name='Interface 5', type='1000base-t'), + Interface(device=device, name='Interface 6', type='1000base-t'), + ) + Interface.objects.bulk_create(interfaces) + + mac_addresses = ( + MACAddress(mac_address='00:00:00:00:00:01', assigned_object=interfaces[0]), + MACAddress(mac_address='00:00:00:00:00:02', assigned_object=interfaces[1]), + MACAddress(mac_address='00:00:00:00:00:03', assigned_object=interfaces[2]), + ) + MACAddress.objects.bulk_create(mac_addresses) + + tags = create_tags('Alpha', 'Bravo', 'Charlie') + + cls.form_data = { + 'mac_address': EUI('00:00:00:00:00:04'), + 'description': 'New MAC address', + 'interface_id': interfaces[3].pk, + 'tags': [t.pk for t in tags], + } + + cls.csv_data = ( + "mac_address,device,interface", + "00:00:00:00:00:04,Device 1,Interface 4", + "00:00:00:00:00:05,Device 1,Interface 5", + "00:00:00:00:00:06,Device 1,Interface 6", + ) + + cls.csv_update_data = ( + "id,mac_address", + f"{mac_addresses[0].pk},00:00:00:00:00:0a", + f"{mac_addresses[1].pk},00:00:00:00:00:0b", + f"{mac_addresses[2].pk},00:00:00:00:00:0c", + ) + + cls.bulk_edit_data = { + 'description': 'New description', + } From 571f604ce88d06630b463341eb76f043ec8c53e4 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jan 2025 14:05:23 -0500 Subject: [PATCH 139/169] Fixes #18368: Restore missing fields on REST API serializer for MAC addresses --- netbox/dcim/api/serializers_/devices.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/dcim/api/serializers_/devices.py b/netbox/dcim/api/serializers_/devices.py index 1ad51caaa..c1e9c5f51 100644 --- a/netbox/dcim/api/serializers_/devices.py +++ b/netbox/dcim/api/serializers_/devices.py @@ -171,7 +171,7 @@ class MACAddressSerializer(NetBoxModelSerializer): model = MACAddress fields = [ 'id', 'url', 'display_url', 'display', 'mac_address', 'assigned_object_type', 'assigned_object_id', - 'assigned_object', 'description', 'comments', + 'assigned_object', 'description', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'mac_address', 'description') From 32422d16832b0f30792a3f273b28d531470f4dce Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 9 Jan 2025 14:04:03 -0500 Subject: [PATCH 140/169] Don't cache CACHE_KEY_CATALOG_ERROR if ISOLATED_DEPLOYMENT is True --- netbox/core/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index 713807a82..83914bcee 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -594,7 +594,7 @@ class BasePluginView(UserPassesTestMixin, View): catalog_plugins_error = cache.get(self.CACHE_KEY_CATALOG_ERROR, default=False) if not catalog_plugins_error: catalog_plugins = get_catalog_plugins() - if not catalog_plugins: + if not catalog_plugins and not settings.ISOLATED_DEPLOYMENT: # Cache for 5 minutes to avoid spamming connection cache.set(self.CACHE_KEY_CATALOG_ERROR, True, 300) messages.warning(request, _("Plugins catalog could not be loaded")) From a79d869bd8fa7f3d711873a471cab016afad6aed Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 10 Jan 2025 05:02:08 +0000 Subject: [PATCH 141/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 32 ++++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 2c22df58a..8d07440be 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-09 05:01+0000\n" +"POT-Creation-Date: 2025-01-10 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -11582,63 +11582,63 @@ msgstr "" msgid "Cannot delete stores from registry" msgstr "" -#: netbox/netbox/settings.py:755 +#: netbox/netbox/settings.py:742 msgid "Czech" msgstr "" -#: netbox/netbox/settings.py:756 +#: netbox/netbox/settings.py:743 msgid "Danish" msgstr "" -#: netbox/netbox/settings.py:757 +#: netbox/netbox/settings.py:744 msgid "German" msgstr "" -#: netbox/netbox/settings.py:758 +#: netbox/netbox/settings.py:745 msgid "English" msgstr "" -#: netbox/netbox/settings.py:759 +#: netbox/netbox/settings.py:746 msgid "Spanish" msgstr "" -#: netbox/netbox/settings.py:760 +#: netbox/netbox/settings.py:747 msgid "French" msgstr "" -#: netbox/netbox/settings.py:761 +#: netbox/netbox/settings.py:748 msgid "Italian" msgstr "" -#: netbox/netbox/settings.py:762 +#: netbox/netbox/settings.py:749 msgid "Japanese" msgstr "" -#: netbox/netbox/settings.py:763 +#: netbox/netbox/settings.py:750 msgid "Dutch" msgstr "" -#: netbox/netbox/settings.py:764 +#: netbox/netbox/settings.py:751 msgid "Polish" msgstr "" -#: netbox/netbox/settings.py:765 +#: netbox/netbox/settings.py:752 msgid "Portuguese" msgstr "" -#: netbox/netbox/settings.py:766 +#: netbox/netbox/settings.py:753 msgid "Russian" msgstr "" -#: netbox/netbox/settings.py:767 +#: netbox/netbox/settings.py:754 msgid "Turkish" msgstr "" -#: netbox/netbox/settings.py:768 +#: netbox/netbox/settings.py:755 msgid "Ukrainian" msgstr "" -#: netbox/netbox/settings.py:769 +#: netbox/netbox/settings.py:756 msgid "Chinese" msgstr "" From e75d327f384d0b22ffb17f7e790d953ac81530ca Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 10 Jan 2025 08:22:35 -0500 Subject: [PATCH 142/169] Fixes #18376: Include tagged VLANs in interfaces list for Q-in-Q interfaces --- netbox/dcim/tables/template_code.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py index 449d55e14..4b51cd06a 100644 --- a/netbox/dcim/tables/template_code.py +++ b/netbox/dcim/tables/template_code.py @@ -69,16 +69,18 @@ INTERFACE_FHRPGROUPS = """ """ INTERFACE_TAGGED_VLANS = """ -{% if record.mode == 'tagged' %} +{% load i18n %} +{% if record.mode == 'access' %} +{% elif record.mode == 'tagged-all' %} + {% trans "All" %} +{% else %} {% if value.count > 3 %} {{ value.count }} VLANs {% else %} {% for vlan in value.all %} - {{ vlan }}
    + {{ vlan }}
    {% endfor %} {% endif %} -{% elif record.mode == 'tagged-all' %} - All {% endif %} """ From a75fa53d4d2c84cb4c129571a6da83b0f304ec20 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 9 Jan 2025 08:48:08 -0500 Subject: [PATCH 143/169] Closes #18348: Disable legacy pre-commit hook script --- scripts/git-hooks/pre-commit | 53 +++--------------------------------- 1 file changed, 4 insertions(+), 49 deletions(-) diff --git a/scripts/git-hooks/pre-commit b/scripts/git-hooks/pre-commit index da746b64f..90842a6bd 100755 --- a/scripts/git-hooks/pre-commit +++ b/scripts/git-hooks/pre-commit @@ -1,11 +1,6 @@ #!/bin/sh -# Create a link to this file at .git/hooks/pre-commit to -# force PEP8 validation prior to committing -# -# Ignored violations: -# -# W504: Line break after binary operator -# E501: Line too long +# TODO: Remove this file in NetBox v4.3 +# This script has been maintained to ease transition to the pre-commit tool. exec 1>&2 @@ -14,48 +9,8 @@ RED='\033[0;31m' YELLOW='\033[0;33m' NOCOLOR='\033[0m' -printf "${YELLOW}This script is obsolete and will be removed in a future release.\n" -printf "Please use pre-commit instead:\n" +printf "${YELLOW}The pre-commit hook script is obsolete. Please use pre-commit instead:${NOCOLOR}\n" printf " pip install pre-commit\n" printf " pre-commit install${NOCOLOR}\n" -if [ -d ./venv/ ]; then - VENV="$PWD/venv" - if [ -e $VENV/bin/python ]; then - PATH=$VENV/bin:$PATH - elif [ -e $VENV/Scripts/python.exe ]; then - PATH=$VENV/Scripts:$PATH - fi -fi - -if [ ${NOVALIDATE} ]; then - echo "${YELLOW}Skipping validation checks${NOCOLOR}" - exit $EXIT -fi - -echo "Linting with ruff..." -ruff check netbox/ -if [ $? != 0 ]; then - EXIT=1 -fi - -echo "Checking for missing migrations..." -python netbox/manage.py makemigrations --dry-run --check -if [ $? != 0 ]; then - EXIT=1 -fi - -git diff --cached --name-only | if grep --quiet 'netbox/project-static/' -then - echo "Checking UI ESLint, TypeScript, and Prettier compliance..." - yarn --cwd "$PWD/netbox/project-static" validate - if [ $? != 0 ]; then - EXIT=1 - fi -fi - -if [ $EXIT != 0 ]; then - printf "${RED}COMMIT FAILED${NOCOLOR}\n" -fi - -exit $EXIT +exit 1 From c3efa2149c14f6b55ebb79be72eef6e37c86a072 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 17 Jan 2025 08:28:43 -0500 Subject: [PATCH 144/169] Fixes: #18350 - Remove 'site' and 'provider_network' from CircuitTerminationIndex.display_attrs (#18351) * Remove 'site' and 'provider_network' from CircuitTerminationIndex.display_attrs * Use '_site' and '_provider_network' in display_attrs * Replace private fields with 'termination' --- netbox/circuits/search.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/circuits/search.py b/netbox/circuits/search.py index 2ea11b7fd..486656933 100644 --- a/netbox/circuits/search.py +++ b/netbox/circuits/search.py @@ -34,7 +34,7 @@ class CircuitTerminationIndex(SearchIndex): ('port_speed', 2000), ('upstream_speed', 2000), ) - display_attrs = ('circuit', 'site', 'provider_network', 'description') + display_attrs = ('circuit', 'termination', 'description') @register_search From 993d8f1480be287b4f7347011a6d8af7e1a22150 Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 17 Jan 2025 08:35:17 -0500 Subject: [PATCH 145/169] Fixes: #18373 - Fix validation of site in Assign Device to Cluster flow (#18375) * Fix validation of site in Assign Device to Cluster flow * Validate Location as well as Site scope --- netbox/virtualization/forms/model_forms.py | 32 ++++++++++++++-------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 9edda1fe0..9d53c9382 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -1,4 +1,5 @@ from django import forms +from django.apps import apps from django.contrib.contenttypes.models import ContentType from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ @@ -143,19 +144,26 @@ class ClusterAddDevicesForm(forms.Form): def clean(self): super().clean() - # If the Cluster is assigned to a Site, all Devices must be assigned to that Site. - if self.cluster.site is not None: + # If the Cluster is assigned to a Site or Location, all Devices must be assigned to that same scope. + if self.cluster.scope is not None: for device in self.cleaned_data.get('devices', []): - if device.site != self.cluster.site: - raise ValidationError({ - 'devices': _( - "{device} belongs to a different site ({device_site}) than the cluster ({cluster_site})" - ).format( - device=device, - device_site=device.site, - cluster_site=self.cluster.site - ) - }) + for scope_field in ['site', 'location']: + device_scope = getattr(device, scope_field) + if ( + self.cluster.scope_type.model_class() == apps.get_model('dcim', scope_field) + and device_scope != self.cluster.scope + ): + raise ValidationError({ + 'devices': _( + "{device} belongs to a different {scope_field} ({device_scope}) than the " + "cluster ({cluster_scope})" + ).format( + device=device, + scope_field=scope_field, + device_scope=device_scope, + cluster_scope=self.cluster.scope + ) + }) class ClusterRemoveDevicesForm(ConfirmationForm): From 4a1fea3504769b4eaed2eee14430200c7f89f45d Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 17 Jan 2025 08:45:17 -0500 Subject: [PATCH 146/169] Fixes: #18336 - Perform Rack object validation of u_height and starting_unit on rack_type if present (#18395) * Perform Rack object validation of u_height and starting_unit on rack_type if present * Calculate effective values before doing validation --- netbox/dcim/models/racks.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 78eb0ea4a..7ecbd5d5f 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -374,22 +374,27 @@ class Rack(ContactsMixin, ImageAttachmentsMixin, RackBase): if not self._state.adding: mounted_devices = Device.objects.filter(rack=self).exclude(position__isnull=True).order_by('position') + effective_u_height = self.rack_type.u_height if self.rack_type else self.u_height + effective_starting_unit = self.rack_type.starting_unit if self.rack_type else self.starting_unit + # Validate that Rack is tall enough to house the highest mounted Device if top_device := mounted_devices.last(): - min_height = top_device.position + top_device.device_type.u_height - self.starting_unit - if self.u_height < min_height: + min_height = top_device.position + top_device.device_type.u_height - effective_starting_unit + if effective_u_height < min_height: + field = 'rack_type' if self.rack_type else 'u_height' raise ValidationError({ - 'u_height': _( + field: _( "Rack must be at least {min_height}U tall to house currently installed devices." ).format(min_height=min_height) }) # Validate that the Rack's starting unit is less than or equal to the position of the lowest mounted Device if last_device := mounted_devices.first(): - if self.starting_unit > last_device.position: + if effective_starting_unit > last_device.position: + field = 'rack_type' if self.rack_type else 'starting_unit' raise ValidationError({ - 'starting_unit': _("Rack unit numbering must begin at {position} or less to house " - "currently installed devices.").format(position=last_device.position) + field: _("Rack unit numbering must begin at {position} or less to house " + "currently installed devices.").format(position=last_device.position) }) # Validate that Rack was assigned a Location of its same site, if applicable From 07ad4c1321e77cf46c8b29f87a0f371efa38adc0 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 16 Jan 2025 13:04:26 -0500 Subject: [PATCH 147/169] Make GFK scope field sortable=False on tables where it appears --- netbox/ipam/tables/ip.py | 3 ++- netbox/virtualization/tables/clusters.py | 3 ++- netbox/wireless/tables/wirelesslan.py | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/netbox/ipam/tables/ip.py b/netbox/ipam/tables/ip.py index 17ba36de9..1eefa6b3a 100644 --- a/netbox/ipam/tables/ip.py +++ b/netbox/ipam/tables/ip.py @@ -192,7 +192,8 @@ class PrefixTable(TenancyColumnsMixin, NetBoxTable): ) scope = tables.Column( verbose_name=_('Scope'), - linkify=True + linkify=True, + orderable=False ) vlan_group = tables.Column( accessor='vlan__group', diff --git a/netbox/virtualization/tables/clusters.py b/netbox/virtualization/tables/clusters.py index d07bb4519..665f8fa8b 100644 --- a/netbox/virtualization/tables/clusters.py +++ b/netbox/virtualization/tables/clusters.py @@ -78,7 +78,8 @@ class ClusterTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable): ) scope = tables.Column( verbose_name=_('Scope'), - linkify=True + linkify=True, + orderable=False ) device_count = columns.LinkedCountColumn( viewname='dcim:device_list', diff --git a/netbox/wireless/tables/wirelesslan.py b/netbox/wireless/tables/wirelesslan.py index fe9c0f5fa..ca37b152f 100644 --- a/netbox/wireless/tables/wirelesslan.py +++ b/netbox/wireless/tables/wirelesslan.py @@ -56,7 +56,8 @@ class WirelessLANTable(TenancyColumnsMixin, NetBoxTable): ) scope = tables.Column( verbose_name=_('Scope'), - linkify=True + linkify=True, + orderable=False ) interface_count = tables.Column( verbose_name=_('Interfaces') From 50b7f46fc0971ebe6d6ea6c8a6eaf6d4de3c035d Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 15 Jan 2025 10:18:30 -0500 Subject: [PATCH 148/169] Migrate DEFAULT_FILE_STORAGE to STORAGES --- netbox/netbox/settings.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 581cd9ef4..84b86ba13 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -222,8 +222,18 @@ DATABASES = { # Storage backend # +# Default STORAGES for Django +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", + }, +} + if STORAGE_BACKEND is not None: - DEFAULT_FILE_STORAGE = STORAGE_BACKEND + STORAGES['default']['BACKEND'] = STORAGE_BACKEND # django-storages if STORAGE_BACKEND.startswith('storages.'): From a9f3c74b0c462e4788a7ed364039fc63c3943a21 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 17 Jan 2025 10:08:25 -0500 Subject: [PATCH 149/169] Fixes #18379: Ensure RSS feed content within dashboard widget is sanitized --- netbox/templates/extras/dashboard/widgets/rssfeed.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/netbox/templates/extras/dashboard/widgets/rssfeed.html b/netbox/templates/extras/dashboard/widgets/rssfeed.html index fa602a112..2528c5fc7 100644 --- a/netbox/templates/extras/dashboard/widgets/rssfeed.html +++ b/netbox/templates/extras/dashboard/widgets/rssfeed.html @@ -5,7 +5,7 @@

    {{ entry.title }}
    - {{ entry.summary|safe }} + {{ entry.summary }}
    {% empty %} From 4a13664e0f68701d4aacc9fefe82038f1cb7ea22 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 17 Jan 2025 10:36:22 -0500 Subject: [PATCH 150/169] Closes #18425: Remove the triage priority field from GitHub issue templates --- .github/ISSUE_TEMPLATE/01-feature_request.yaml | 13 ------------- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 13 ------------- 2 files changed, 26 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index f415f933a..2215ab7a1 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -27,19 +27,6 @@ body: - Other validations: required: true - - type: dropdown - attributes: - label: Triage priority - description: > - Issue triage may be prioritized in some cases. Select whichever of the following - conditions applies, if any. - options: - - I volunteer to perform this work (if approved) - - I'm a NetBox Labs customer - - N/A - default: 2 - validations: - required: true - type: textarea attributes: label: Proposed functionality diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 0e0839849..f007b67cc 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -22,19 +22,6 @@ body: - Self-hosted validations: required: true - - type: dropdown - attributes: - label: Triage priority - description: > - Issue triage may be prioritized in some cases. Select whichever of the following - conditions applies, if any. - options: - - I volunteer to perform this work (if approved) - - I'm a NetBox Labs customer - - N/A - default: 2 - validations: - required: true - type: input attributes: label: NetBox Version From 5b9210dfa5f9288a55686c86e582f65dea0386de Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 17 Jan 2025 12:20:24 -0500 Subject: [PATCH 151/169] Fixes #18392: Exclude config contexts assigned to locations for VMs --- netbox/extras/querysets.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/extras/querysets.py b/netbox/extras/querysets.py index 9b3722eef..59be85734 100644 --- a/netbox/extras/querysets.py +++ b/netbox/extras/querysets.py @@ -120,11 +120,12 @@ class ConfigContextModelQuerySet(RestrictedQuerySet): is_active=True, ) + # Apply Location & DeviceType filters only for VirtualMachines if self.model._meta.model_name == 'device': base_query.add((Q(locations=OuterRef('location')) | Q(locations=None)), Q.AND) base_query.add((Q(device_types=OuterRef('device_type')) | Q(device_types=None)), Q.AND) - elif self.model._meta.model_name == 'virtualmachine': + base_query.add(Q(locations=None), Q.AND) base_query.add(Q(device_types=None), Q.AND) base_query.add((Q(roles=OuterRef('role')) | Q(roles=None)), Q.AND) From 2ed4a2b0054887daa7bc46eddc429a452c5ca422 Mon Sep 17 00:00:00 2001 From: atownson <52260120+atownson@users.noreply.github.com> Date: Fri, 17 Jan 2025 13:02:12 -0600 Subject: [PATCH 152/169] Fixes: #18369 - Remove the json filter for protection rules (#18388) * Remove the json filter for protection rules * Configure PROTECTION_RULE config attribute to use ConfigJSONEncoder as serializer * Tweak getattr() --------- Co-authored-by: Jeremy Stretch --- netbox/core/views.py | 5 +++-- netbox/templates/core/inc/config_data.html | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index 83914bcee..cd9cd6c67 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -570,8 +570,9 @@ class SystemView(UserPassesTestMixin, View): return response # Serialize any CustomValidator classes - if hasattr(config, 'CUSTOM_VALIDATORS') and config.CUSTOM_VALIDATORS: - config.CUSTOM_VALIDATORS = json.dumps(config.CUSTOM_VALIDATORS, cls=ConfigJSONEncoder, indent=4) + for attr in ['CUSTOM_VALIDATORS', 'PROTECTION_RULES']: + if hasattr(config, attr) and getattr(config, attr, None): + setattr(config, attr, json.dumps(getattr(config, attr), cls=ConfigJSONEncoder, indent=4)) return render(request, 'core/system.html', { 'stats': stats, diff --git a/netbox/templates/core/inc/config_data.html b/netbox/templates/core/inc/config_data.html index 41471a103..939b8588f 100644 --- a/netbox/templates/core/inc/config_data.html +++ b/netbox/templates/core/inc/config_data.html @@ -103,7 +103,7 @@ {% trans "Protection rules" %} {% if config.PROTECTION_RULES %} -
    {{ config.PROTECTION_RULES|json }}
    +
    {{ config.PROTECTION_RULES }}
    {% else %} {{ ''|placeholder }} {% endif %} From f845b2cf07cd65a109c46632a2540d3647c1c492 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 17 Jan 2025 14:49:37 -0500 Subject: [PATCH 153/169] Release v4.2.2 --- .../ISSUE_TEMPLATE/01-feature_request.yaml | 2 +- .github/ISSUE_TEMPLATE/02-bug_report.yaml | 2 +- base_requirements.txt | 2 -- docs/release-notes/version-4.2.md | 20 ++++++++++++++++++ netbox/project-static/dist/netbox.js | Bin 390886 -> 391058 bytes netbox/project-static/dist/netbox.js.map | Bin 525356 -> 525511 bytes netbox/project-static/package.json | 4 ++-- netbox/project-static/yarn.lock | 16 +++++++------- netbox/release.yaml | 4 ++-- netbox/translations/ru/LC_MESSAGES/django.mo | Bin 301883 -> 301870 bytes netbox/translations/ru/LC_MESSAGES/django.po | 10 ++++----- requirements.txt | 10 ++++----- 12 files changed, 44 insertions(+), 26 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index 2215ab7a1..6212af3b8 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -14,7 +14,7 @@ body: attributes: label: NetBox version description: What version of NetBox are you currently running? - placeholder: v4.2.1 + placeholder: v4.2.2 validations: required: true - type: dropdown diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index f007b67cc..4382a9b76 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -26,7 +26,7 @@ body: attributes: label: NetBox Version description: What version of NetBox are you currently running? - placeholder: v4.2.1 + placeholder: v4.2.2 validations: required: true - type: dropdown diff --git a/base_requirements.txt b/base_requirements.txt index 4cb355dd5..9cf0fbf8b 100644 --- a/base_requirements.txt +++ b/base_requirements.txt @@ -8,8 +8,6 @@ django-cors-headers # Runtime UI tool for debugging Django # https://github.com/jazzband/django-debug-toolbar/blob/main/docs/changes.rst -# Pinned for DNS looukp bug; see https://github.com/netbox-community/netbox/issues/16454 -# and https://github.com/jazzband/django-debug-toolbar/issues/1927 django-debug-toolbar # Library for writing reusable URL query filters diff --git a/docs/release-notes/version-4.2.md b/docs/release-notes/version-4.2.md index a1dafaf14..61f043f3d 100644 --- a/docs/release-notes/version-4.2.md +++ b/docs/release-notes/version-4.2.md @@ -1,5 +1,25 @@ # NetBox v4.2 +## v4.2.2 (2025-01-17) + +### Bug Fixes + +* [#18336](https://github.com/netbox-community/netbox/issues/18336) - Validate new rack height against installed devices when changing a rack's type +* [#18350](https://github.com/netbox-community/netbox/issues/18350) - Fix `FieldDoesNotExist` exception when global search results include a circuit termination +* [#18353](https://github.com/netbox-community/netbox/issues/18353) - Disable fetching of plugin catalog data when `ISOLATED_DEPLOYMENT` is enabled +* [#18362](https://github.com/netbox-community/netbox/issues/18362) - Avoid transmitting census data on every worker restart +* [#18363](https://github.com/netbox-community/netbox/issues/18363) - Fix support for assigning a MAC address to an interface via the REST API +* [#18368](https://github.com/netbox-community/netbox/issues/18368) - Restore missing attributes from REST API serializer for MAC addresses (`tags`, `created`, `last_updated`, and custom fields) +* [#18369](https://github.com/netbox-community/netbox/issues/18369) - Fix `TypeError` exception when rendering the system configuration view with one or more custom classes defined under `PROTECTION_RULES` +* [#18373](https://github.com/netbox-community/netbox/issues/18373) - Fix `AttributeError` exception when attempting to assign host devices to a cluster +* [#18376](https://github.com/netbox-community/netbox/issues/18376) - Fix the display of tagged VLANs in interfaces list for Q-in-Q interfaces +* [#18379](https://github.com/netbox-community/netbox/issues/18379) - Ensure RSS feed dashboard widget content is sanitized +* [#18392](https://github.com/netbox-community/netbox/issues/18392) - Virtual machines should not inherit config contexts assigned to locations +* [#18400](https://github.com/netbox-community/netbox/issues/18400) - Fix support for `STORAGE_BACKEND` configuration parameter +* [#18406](https://github.com/netbox-community/netbox/issues/18406) - Scope column headers in object lists should not be orderable + +--- + ## v4.2.1 (2025-01-08) ### Bug Fixes diff --git a/netbox/project-static/dist/netbox.js b/netbox/project-static/dist/netbox.js index 4661582a3ffd9468ca9a0efe8fdc95c5c3855d0d..7e516f7f4859ffcafee6698af56ca52c89acb58c 100644 GIT binary patch delta 3121 zcmZ`*eQ;FO6`y3|EKtO!fB&1AOvM z&b#N_bI-^9opbKF3sZjf$&_dR_yjQ$FFi3pjFIXm4@g8$yxuoCqdLs|eVq|aA1QvS zQpqta&1BWA-Mg0g28_h&t!kxV`I!|o`oX zHI_C2Z>sdfh2ge5Xa%gcPCHW7Zw(F#uk=LQwpyZ(Y~NN%Z~|%0OI+N32mbUOCcfKu zd?w>WJ+XP`;Ys+3F%?c#N6c7v#B%8)gHL~vj_`YSy(zSp>@LMo;oWzL#XjdOzT5VI zm3Vc}d3^WmEywqxy+sps=8v&h$Q%?NMBv1f(H zSJP!UugoMz(xGpR^G#%r$n!k1S*Ch7 ze`-F-=Q$cF1G7pas&KetK8XvZ`D8-{Oed2JFvR-9rrqvBjy3mHFbPFMq^rHzTIiW~xgC-uz)Z95y4O z>I^4yA?c(@T2v>$2ARBwtb?0BTtw1DDu-&xbu$gy-x-K{8S};C_!l?Em};55u7*I^ zR~<5AE(_=K!?olu+5g?_@fdtdorszrse_}ySX~mI*|!p_5)Q}L6F+S2Tu)X`08M*< zGy&R9>w_dHAin=0QZ-JG4!ZoM1G;yp8@1WOhA024UtB`X%;`TT1^r6WsTr^iz;mW8y^qS&WuVHdxC-wyGrnM4}8) zWUBy^if%e(L$WlzU1*jlfrvnClEmXEzL?n;(`_pTtf*kyDJe)iz7WlpwM0`KkmUX# ziw4$&%%BhnQz;UUH;B#t(iB3qt}ClZ(2Qu)lLGM@kC&A#WopV(sH(LDvS`X!8d!v{=ks7fp!_{$?+2LXfli=yf3VeRL7X!+rEtrZAjIieUkM5>+mQf(bMN2lC4LVpRZ>APqEcXi(`ItRXu z?xGUG$U=j7`FWZL!CTMM3Xt^O6oZm`chj}`Xp=rQV)+B8M=PjzvQQAsaCkTUH+D3P zNu~UtLp@o@)e3mM*oN>QjyRtC_t2)9DCN7m%}BpLWLh1uP81xj)b28^=r^2N%WLr8 z?xBB%gVDVd!;PQcD^lsCkJ3q1IO*C;v>Dt3m*_3d?o0HrsHz`brqf0F4}VS@6>%*F zKUz%lc=&TVfzSAY#@)%g5)Fj;gMnB8J;C1-2z8sj0nrY`SabG$K_`^9>XtufwlmB0 zy4yMfR)^UdVo?CjjJVaNAVB%Qa#josIJrPI09mEYPBG6Rv;HQlk8ZMjvm9ooF2 zP`UmYsRG~9;qcmAm{=N4|1$+$r!?`skWr+(m?w1ZB zX+;~QEm*z0QTjQyHx5br^Cdl`@ke(`lbzX{r6)wQd+m2phG@I*J}Vu>a?9_fm?-;| zvt_sQy;12daSM;UAl*oiei-48Op~WNr~e?e3guf4ODFIOQJtT)xjp9u>?x;$UdgLQI#F8J>^%6^f(>~^`i1pJQs zW_A@upVgZG`}APUYvJdls_tPPP{3fld|J+Ob^UE%eG9nv+o_*lZivl zpO*KF1U>VCjN)?Y&&ipc0(EE_W~kag0pktgZ;hDi>>hK`@`f5fQB0hkWr}zh>|Cbo z6$v#Pm3l0nZB*8$7ph5DP%D7rw>&bnO}$E?q?MHO>syr#{FPRv#JSL_{8%mtVw%QG z*LUkWc2F4@e+`S?)?wKZQ%}NNzr}ks&HU>grO5dxtSnS`MUT>wo*bDr;|td+dHfSg zNlVkT3Xi8mxR8dxY?kzfzucqDlWl~>mj;y?PEoHiCNyso^$=)P~EO(cE z)tHaFO(-F~(!D&y- zR`PU9Gg&ojbFXKfK0UQ|pE_H&yvz!iJuBMW&KjrZj*1%HD%bGqOH-Fq6*L@i-^)B| zujO*N;bvbUoV~U0c6iAfm^@my)Y1x%YNWga4zN}X%)mE3uy(S+)JRC}4tbKvE`P+a z&eHl2jn7DZJkUB3R(`9sBNXxVTFIn{%1E{DuO-Idf&H@yb|6g?Q&$h%i$DFKiSL1f zpUK$KNbNavdIEl8Ohr)D5i=H#SPo+_`Q#T_IDXgRH-z=lBW2hseB@rSIA&kMcmEJr zsh5YY;5&4*0^dI!Eg5exZ;Zu)W)czT5d={*+=Xqn4c8Npcb|Q23=X^YMB(7ElO<%V z&Z^tuR%?ufEXT4`#Vf6YD^ICeGYsZ#N{5sDTKYAs?`DLly=N97rjavaDrf0Ti-p`F zB(;ZWI;#mXP1Bsc&KjM0TZ7EBVv9}I-VsYADtx-_kVv6SbiOi+6xhqMh)jvWS7wu~ zAn#_AQi#6FCcCgo<&YUfw~ywKJ94qSUO-+ahJC7#oJSt)LzBsq3dD^iM4XQAo0hgc zIgONHH8PD%%Z2}laGX>Pp6?*8F$SqIs^U;UgIJcig0uFOe?LdUKcU_oykt-jhZp&%%4df8lzjD zo9WW+mu8YzvS4<`L#FaiB$CU=&LVmCtGAIn5&U}@Oi(~(z>~iURZ=EV`*14xvVrpZN!w zV&BgJnjE8DbH+kpbT50=9x|K*tNeq+1sC%VlH=uAe)%R@jb-CobvAa3Go%2 zCsmLxK2J6)M!@5#=l2YfLi@sbQmcUPzD!JL-E$SZpI#=j3IF>D$>YmU;Cj!Bzb}(O zXyJ#X*^Nyj<7qJxYwwsqe=`o&E1k3q%PuGV5i)B}D5Iycae#BPXx9XY?^{R@g8i?B zv|%)yG<=Kx0ibBw$9g>1l!ZO(e?8moYUHDNNN`ATb{8a2xiO zIDL!Y4BCP|3@sKjH$*ccoxjmd8*#{4J#;F_k{-GUWP1<28~HffLq~ud{`?l&I7Me_ zE4t2d%iWEk7V1`=5i`m*nScSW>Zj|W_jo^@nT={w+nLMN&dGRE#4GxxEc>H=x)^uH z=R8fn2jX8#3;Ekm(}&BDyxw$X(<6$ZLuA^CC)3uEb9BlrgY<{6ntqu2aaRu>rgIS6 z@L?(uj4U*W7oMRLA$ao{S_zVMgkn%~_Yu0j0BzEvMl7!%^=Jk34i*fc84etw|Aa>U zh*ZW;+SHYcT&+aZi$f6p%@*5p?+|UAiBjGeHzU2?plP+oI#6)9(om;qMZf0MT5g^H zY>56A0Y;Bf3^#t|s7R%qHB2Y?u+y#AXcM?6uF<>fBiHC@QB~i$PN$3VANVV6P{g(9 z{QWD+Bwq9d-RewVljt4H8}P^cXb0Xde=u%(`a~xX6U{#M1szw`Vp!gQ*~To>?QHGv zTkU2`kVSztGvZVm1Hj{d%gxr#b)lY?8%@rsuKpi|py`jatc%BDAF#nuU8B-#O)XyrBib0l^NO%(PaEXK`i~UH6)Rc#` zTveqe~a>d;m4@swxuaYg& zUaVf&BK-jB4gJ#b0?7z!eCHu)l3le&+AaFrt3Q{rMaTX9Q_@K+_x@6fiHcucB|GhJ z4oj=V1?+fMnoE#*IN>{{$dm00zmi&n@m;5-b9jJp$3JO7%re=O)Qk$cAD0qAbSq`C1R;h$cXZn2vt$P@9lus0OSUlqVIsLGEC z|D(LJA@~Sti^#@BpZv5~KT;!qCOq`(@&Z9m*2x9=;J?=(dqwufw#iMU;I}^{$LHCf zKPO)<%mY*~9x%|XkYzgU({IS1OZMrvWmgUiKEEIz7s(jJO#$`FDLm&*j!3Fs`$n0$}j#6gBI-H diff --git a/netbox/project-static/dist/netbox.js.map b/netbox/project-static/dist/netbox.js.map index d94269b5df242edad06ee43c5e12a766b88bf50c..a8b2c9569b82fa6c60f5703fae5613871fccf82c 100644 GIT binary patch delta 6452 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 delta 6314 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 a%*uYN@4sOEe`D&)(+jOdM^5iK^M3&90&bcB diff --git a/netbox/project-static/package.json b/netbox/project-static/package.json index 8416d4b4b..f216a4107 100644 --- a/netbox/project-static/package.json +++ b/netbox/project-static/package.json @@ -27,10 +27,10 @@ "bootstrap": "5.3.3", "clipboard": "2.0.11", "flatpickr": "4.6.13", - "gridstack": "11.2.0", + "gridstack": "11.3.0", "htmx.org": "1.9.12", "query-string": "9.1.1", - "sass": "1.83.1", + "sass": "1.83.4", "tom-select": "2.4.1", "typeface-inter": "3.18.1", "typeface-roboto-mono": "1.1.13" diff --git a/netbox/project-static/yarn.lock b/netbox/project-static/yarn.lock index a3ded9bdb..588935331 100644 --- a/netbox/project-static/yarn.lock +++ b/netbox/project-static/yarn.lock @@ -1905,10 +1905,10 @@ graphql@16.10.0: resolved "https://registry.yarnpkg.com/graphql/-/graphql-16.10.0.tgz#24c01ae0af6b11ea87bf55694429198aaa8e220c" integrity sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ== -gridstack@11.2.0: - version "11.2.0" - resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-11.2.0.tgz#8977a6632c521260f064ef171b92c7a8df4f58a9" - integrity sha512-ajwUzd9spR8NXDxfJotHWq9WOYoDOV9o6UJR3ksevNz8cvXNxDtI9H/lC+RN6ijM2DexureLlsG0RpYjBZiOtg== +gridstack@11.3.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/gridstack/-/gridstack-11.3.0.tgz#b110c66bafc64c920fc54933e2c9df4f7b2cfffe" + integrity sha512-Z0eRovKcZTRTs3zetJwjO6CNwrgIy845WfOeZGk8ybpeMCE8fMA8tScyKU72Y2M6uGHkjgwnjflglvPiv+RcBQ== has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" @@ -2667,10 +2667,10 @@ safe-regex-test@^1.0.3: es-errors "^1.3.0" is-regex "^1.1.4" -sass@1.83.1: - version "1.83.1" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.1.tgz#dee1ab94b47a6f9993d3195d36f556bcbda64846" - integrity sha512-EVJbDaEs4Rr3F0glJzFSOvtg2/oy2V/YrGFPqPY24UqcLDWcI9ZY5sN+qyO3c/QCZwzgfirvhXvINiJCE/OLcA== +sass@1.83.4: + version "1.83.4" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.83.4.tgz#5ccf60f43eb61eeec300b780b8dcb85f16eec6d1" + integrity sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA== dependencies: chokidar "^4.0.0" immutable "^5.0.2" diff --git a/netbox/release.yaml b/netbox/release.yaml index 4127b0253..2619279a9 100644 --- a/netbox/release.yaml +++ b/netbox/release.yaml @@ -1,3 +1,3 @@ -version: "4.2.1" +version: "4.2.2" edition: "Community" -published: "2025-01-08" +published: "2025-01-17" diff --git a/netbox/translations/ru/LC_MESSAGES/django.mo b/netbox/translations/ru/LC_MESSAGES/django.mo index 4b62c2a5b1419eab25391b91fe2a9bd4a23066ac..d6454046422926e787cf5958a72490eec887d402 100644 GIT binary patch delta 25062 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 L_}_$3sl5LOtnkw~ diff --git a/netbox/translations/ru/LC_MESSAGES/django.po b/netbox/translations/ru/LC_MESSAGES/django.po index 2cb2074cd..7980f7202 100644 --- a/netbox/translations/ru/LC_MESSAGES/django.po +++ b/netbox/translations/ru/LC_MESSAGES/django.po @@ -12,8 +12,8 @@ # Alexander Ryazanov (alryaz) , 2024 # Vladyslav V. Prodan, 2024 # Jeremy Stretch, 2024 -# Michail Tatarinov, 2024 # Artem Kotik, 2025 +# Michail Tatarinov, 2025 # #, fuzzy msgid "" @@ -22,7 +22,7 @@ msgstr "" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-01-04 05:02+0000\n" "PO-Revision-Date: 2023-10-30 17:48+0000\n" -"Last-Translator: Artem Kotik, 2025\n" +"Last-Translator: Michail Tatarinov, 2025\n" "Language-Team: Russian (https://app.transifex.com/netbox-community/teams/178115/ru/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" @@ -6334,7 +6334,7 @@ msgstr "распределительный щит" #: netbox/dcim/models/power.py:56 msgid "power panels" -msgstr "распределительный щиты" +msgstr "распределительные щиты" #: netbox/dcim/models/power.py:70 #, python-brace-format @@ -9256,7 +9256,7 @@ msgstr "SLAAC" #: netbox/ipam/choices.py:89 msgid "Loopback" -msgstr "Обратная петля" +msgstr "Loopback" #: netbox/ipam/choices.py:91 msgid "Anycast" @@ -11185,7 +11185,7 @@ msgstr "Сети провайдеров" #: netbox/netbox/navigation/menu.py:298 msgid "Power Panels" -msgstr "Распределительный щиты" +msgstr "Распределительные щиты" #: netbox/netbox/navigation/menu.py:309 msgid "Configurations" diff --git a/requirements.txt b/requirements.txt index b875ae5a2..903e4e7fd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ -Django==5.1.4 +Django==5.1.5 django-cors-headers==4.6.0 -django-debug-toolbar==4.4.6 +django-debug-toolbar==5.0.1 django-filter==24.3 django-htmx==1.21.0 django-graphiql-debug-toolbar==0.2.0 @@ -12,7 +12,7 @@ django-rich==1.13.0 django-rq==3.0 django-taggit==6.1.0 django-tables2==2.7.5 -django-timezone-field==7.0 +django-timezone-field==7.1 djangorestframework==3.15.2 drf-spectacular==0.28.0 drf-spectacular-sidecar==2024.12.1 @@ -25,13 +25,13 @@ mkdocstrings[python-legacy]==0.27.0 netaddr==1.3.0 nh3==0.2.20 Pillow==11.1.0 -psycopg[c,pool]==3.2.3 +psycopg[c,pool]==3.2.4 PyYAML==6.0.2 requests==2.32.3 rq==2.1.0 social-auth-app-django==5.4.2 social-auth-core==4.5.4 -strawberry-graphql==0.256.1 +strawberry-graphql==0.258.0 strawberry-graphql-django==0.52.0 svgwrite==1.4.3 tablib==3.7.0 From d11deb66788c35ccb50eccdbd6bd2518733e2801 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 18 Jan 2025 05:02:12 +0000 Subject: [PATCH 154/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 208 +++++++++---------- 1 file changed, 104 insertions(+), 104 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 8d07440be..6b0b5e1d0 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-10 05:01+0000\n" +"POT-Creation-Date: 2025-01-18 05:01+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -242,8 +242,8 @@ msgstr "" #: netbox/virtualization/forms/bulk_import.py:91 #: netbox/virtualization/forms/filtersets.py:74 #: netbox/virtualization/forms/filtersets.py:153 -#: netbox/virtualization/forms/model_forms.py:103 -#: netbox/virtualization/forms/model_forms.py:170 +#: netbox/virtualization/forms/model_forms.py:104 +#: netbox/virtualization/forms/model_forms.py:178 #: netbox/virtualization/tables/virtualmachines.py:33 #: netbox/vpn/forms/filtersets.py:266 netbox/wireless/forms/filtersets.py:88 #: netbox/wireless/forms/model_forms.py:79 @@ -712,7 +712,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:61 #: netbox/virtualization/forms/bulk_import.py:42 #: netbox/virtualization/forms/filtersets.py:54 -#: netbox/virtualization/forms/model_forms.py:64 +#: netbox/virtualization/forms/model_forms.py:65 #: netbox/virtualization/tables/clusters.py:66 #: netbox/vpn/forms/bulk_edit.py:264 netbox/vpn/forms/bulk_import.py:264 #: netbox/vpn/forms/filtersets.py:217 netbox/vpn/forms/model_forms.py:85 @@ -766,8 +766,8 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:212 netbox/ipam/forms/filtersets.py:284 #: netbox/ipam/forms/filtersets.py:358 netbox/ipam/forms/filtersets.py:542 #: netbox/ipam/forms/model_forms.py:503 netbox/ipam/tables/ip.py:183 -#: netbox/ipam/tables/ip.py:263 netbox/ipam/tables/ip.py:314 -#: netbox/ipam/tables/ip.py:377 netbox/ipam/tables/ip.py:404 +#: netbox/ipam/tables/ip.py:264 netbox/ipam/tables/ip.py:315 +#: netbox/ipam/tables/ip.py:378 netbox/ipam/tables/ip.py:405 #: netbox/ipam/tables/vlans.py:95 netbox/ipam/tables/vlans.py:208 #: netbox/templates/circuits/circuit.html:34 #: netbox/templates/circuits/virtualcircuit.html:43 @@ -844,7 +844,7 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:122 netbox/ipam/forms/filtersets.py:145 #: netbox/ipam/forms/filtersets.py:176 netbox/ipam/forms/filtersets.py:270 #: netbox/ipam/forms/filtersets.py:313 netbox/ipam/forms/filtersets.py:510 -#: netbox/ipam/tables/ip.py:407 netbox/ipam/tables/vlans.py:205 +#: netbox/ipam/tables/ip.py:408 netbox/ipam/tables/vlans.py:205 #: netbox/templates/circuits/circuit.html:48 #: netbox/templates/circuits/circuitgroup.html:36 #: netbox/templates/circuits/virtualcircuit.html:47 @@ -978,8 +978,8 @@ msgstr "" #: netbox/templates/dcim/htmx/cable_edit.html:72 #: netbox/templates/ipam/ipaddress_bulk_add.html:27 #: netbox/templates/ipam/vlan_edit.html:30 -#: netbox/virtualization/forms/model_forms.py:79 -#: netbox/virtualization/forms/model_forms.py:221 +#: netbox/virtualization/forms/model_forms.py:80 +#: netbox/virtualization/forms/model_forms.py:229 #: netbox/vpn/forms/bulk_edit.py:78 netbox/vpn/forms/filtersets.py:44 #: netbox/vpn/forms/model_forms.py:63 netbox/vpn/forms/model_forms.py:148 #: netbox/vpn/forms/model_forms.py:414 netbox/wireless/forms/model_forms.py:57 @@ -1078,8 +1078,8 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:292 netbox/ipam/forms/filtersets.py:363 #: netbox/ipam/forms/filtersets.py:550 netbox/ipam/forms/model_forms.py:194 #: netbox/ipam/forms/model_forms.py:220 netbox/ipam/forms/model_forms.py:251 -#: netbox/ipam/forms/model_forms.py:678 netbox/ipam/tables/ip.py:208 -#: netbox/ipam/tables/ip.py:267 netbox/ipam/tables/ip.py:318 +#: netbox/ipam/forms/model_forms.py:678 netbox/ipam/tables/ip.py:209 +#: netbox/ipam/tables/ip.py:268 netbox/ipam/tables/ip.py:319 #: netbox/ipam/tables/vlans.py:99 netbox/ipam/tables/vlans.py:211 #: netbox/templates/circuits/virtualcircuittermination.html:42 #: netbox/templates/dcim/device.html:182 @@ -1099,7 +1099,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:127 #: netbox/virtualization/forms/bulk_import.py:112 #: netbox/virtualization/forms/filtersets.py:162 -#: netbox/virtualization/forms/model_forms.py:194 +#: netbox/virtualization/forms/model_forms.py:202 #: netbox/virtualization/tables/virtualmachines.py:45 #: netbox/vpn/forms/bulk_edit.py:87 netbox/vpn/forms/bulk_import.py:81 #: netbox/vpn/forms/filtersets.py:85 netbox/vpn/forms/model_forms.py:79 @@ -1191,7 +1191,7 @@ msgstr "" #: netbox/dcim/tables/connections.py:65 netbox/dcim/tables/devices.py:1140 #: netbox/ipam/forms/bulk_import.py:317 netbox/ipam/forms/model_forms.py:282 #: netbox/ipam/forms/model_forms.py:291 netbox/ipam/tables/fhrp.py:64 -#: netbox/ipam/tables/ip.py:323 netbox/ipam/tables/vlans.py:145 +#: netbox/ipam/tables/ip.py:324 netbox/ipam/tables/vlans.py:145 #: netbox/templates/circuits/inc/circuit_termination_fields.html:52 #: netbox/templates/circuits/virtualcircuittermination.html:53 #: netbox/templates/circuits/virtualcircuittermination.html:60 @@ -1205,7 +1205,7 @@ msgstr "" #: netbox/templates/wireless/inc/wirelesslink_interface.html:10 #: netbox/templates/wireless/wirelesslink.html:10 #: netbox/templates/wireless/wirelesslink.html:55 -#: netbox/virtualization/forms/model_forms.py:369 +#: netbox/virtualization/forms/model_forms.py:377 #: netbox/vpn/forms/bulk_import.py:297 netbox/vpn/forms/model_forms.py:439 #: netbox/vpn/forms/model_forms.py:448 netbox/wireless/forms/model_forms.py:116 #: netbox/wireless/forms/model_forms.py:158 @@ -1291,7 +1291,7 @@ msgstr "" #: netbox/templates/ipam/vlan.html:16 #: netbox/virtualization/forms/filtersets.py:59 #: netbox/virtualization/forms/filtersets.py:138 -#: netbox/virtualization/forms/model_forms.py:91 +#: netbox/virtualization/forms/model_forms.py:92 #: netbox/vpn/forms/filtersets.py:257 netbox/wireless/forms/filtersets.py:73 msgid "Region" msgstr "" @@ -1309,7 +1309,7 @@ msgstr "" #: netbox/ipam/forms/filtersets.py:430 netbox/ipam/forms/filtersets.py:521 #: netbox/virtualization/forms/filtersets.py:64 #: netbox/virtualization/forms/filtersets.py:143 -#: netbox/virtualization/forms/model_forms.py:97 +#: netbox/virtualization/forms/model_forms.py:98 #: netbox/wireless/forms/filtersets.py:78 msgid "Site group" msgstr "" @@ -1370,7 +1370,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:66 #: netbox/virtualization/forms/bulk_import.py:48 #: netbox/virtualization/forms/filtersets.py:90 -#: netbox/virtualization/forms/model_forms.py:69 +#: netbox/virtualization/forms/model_forms.py:70 #: netbox/virtualization/tables/clusters.py:70 #: netbox/vpn/forms/bulk_edit.py:112 netbox/vpn/forms/bulk_import.py:158 #: netbox/vpn/forms/filtersets.py:116 netbox/vpn/tables/crypto.py:31 @@ -1529,7 +1529,7 @@ msgstr "" #: netbox/circuits/models/circuits.py:290 #: netbox/circuits/models/virtual_circuits.py:144 #: netbox/dcim/models/device_component_templates.py:57 -#: netbox/dcim/models/device_components.py:63 netbox/dcim/models/racks.py:676 +#: netbox/dcim/models/device_components.py:63 netbox/dcim/models/racks.py:681 #: netbox/extras/models/configs.py:45 netbox/extras/models/configs.py:219 #: netbox/extras/models/customfields.py:125 netbox/extras/models/models.py:61 #: netbox/extras/models/models.py:158 netbox/extras/models/models.py:396 @@ -1782,7 +1782,7 @@ msgstr "" #: netbox/vpn/tables/crypto.py:158 netbox/vpn/tables/l2vpn.py:23 #: netbox/vpn/tables/tunnels.py:18 netbox/vpn/tables/tunnels.py:40 #: netbox/wireless/tables/wirelesslan.py:18 -#: netbox/wireless/tables/wirelesslan.py:87 +#: netbox/wireless/tables/wirelesslan.py:88 msgid "Name" msgstr "" @@ -1831,8 +1831,8 @@ msgstr "" #: netbox/dcim/tables/racks.py:224 netbox/dcim/tables/sites.py:108 #: netbox/extras/tables/tables.py:582 netbox/ipam/tables/asn.py:69 #: netbox/ipam/tables/fhrp.py:34 netbox/ipam/tables/ip.py:82 -#: netbox/ipam/tables/ip.py:225 netbox/ipam/tables/ip.py:280 -#: netbox/ipam/tables/ip.py:348 netbox/ipam/tables/services.py:24 +#: netbox/ipam/tables/ip.py:226 netbox/ipam/tables/ip.py:281 +#: netbox/ipam/tables/ip.py:349 netbox/ipam/tables/services.py:24 #: netbox/ipam/tables/services.py:54 netbox/ipam/tables/vlans.py:121 #: netbox/ipam/tables/vrfs.py:47 netbox/ipam/tables/vrfs.py:72 #: netbox/templates/dcim/htmx/cable_edit.html:89 @@ -1840,13 +1840,13 @@ msgstr "" #: netbox/templates/inc/panels/comments.html:5 #: netbox/tenancy/tables/contacts.py:68 netbox/tenancy/tables/tenants.py:46 #: netbox/utilities/forms/fields/fields.py:29 -#: netbox/virtualization/tables/clusters.py:94 +#: netbox/virtualization/tables/clusters.py:95 #: netbox/virtualization/tables/virtualmachines.py:52 #: netbox/vpn/tables/crypto.py:37 netbox/vpn/tables/crypto.py:74 #: netbox/vpn/tables/crypto.py:109 netbox/vpn/tables/crypto.py:140 #: netbox/vpn/tables/crypto.py:173 netbox/vpn/tables/l2vpn.py:37 #: netbox/vpn/tables/tunnels.py:61 netbox/wireless/tables/wirelesslan.py:27 -#: netbox/wireless/tables/wirelesslan.py:65 +#: netbox/wireless/tables/wirelesslan.py:66 msgid "Comments" msgstr "" @@ -1960,14 +1960,14 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:119 #: netbox/virtualization/forms/bulk_import.py:105 #: netbox/virtualization/forms/filtersets.py:133 -#: netbox/virtualization/forms/model_forms.py:184 +#: netbox/virtualization/forms/model_forms.py:192 #: netbox/virtualization/tables/virtualmachines.py:41 netbox/vpn/choices.py:52 #: netbox/vpn/forms/bulk_import.py:86 netbox/vpn/forms/bulk_import.py:283 #: netbox/vpn/forms/filtersets.py:275 netbox/vpn/forms/model_forms.py:91 #: netbox/vpn/forms/model_forms.py:126 netbox/vpn/forms/model_forms.py:237 #: netbox/vpn/forms/model_forms.py:456 netbox/wireless/forms/model_forms.py:102 #: netbox/wireless/forms/model_forms.py:144 -#: netbox/wireless/tables/wirelesslan.py:83 +#: netbox/wireless/tables/wirelesslan.py:84 msgid "Device" msgstr "" @@ -2895,11 +2895,11 @@ msgstr "" msgid "Failed to stop job {id}" msgstr "" -#: netbox/core/views.py:600 +#: netbox/core/views.py:601 msgid "Plugins catalog could not be loaded" msgstr "" -#: netbox/core/views.py:634 +#: netbox/core/views.py:635 #, python-brace-format msgid "Plugin {name} not found" msgstr "" @@ -3009,7 +3009,7 @@ msgstr "" #: netbox/dcim/tables/devices.py:689 netbox/dcim/tables/devices.py:899 #: netbox/dcim/tables/devices.py:986 netbox/dcim/tables/devices.py:1146 #: netbox/extras/tables/tables.py:223 netbox/ipam/tables/fhrp.py:59 -#: netbox/ipam/tables/ip.py:329 netbox/ipam/tables/services.py:44 +#: netbox/ipam/tables/ip.py:330 netbox/ipam/tables/services.py:44 #: netbox/templates/dcim/interface.html:108 #: netbox/templates/dcim/interface.html:366 #: netbox/templates/dcim/location.html:41 netbox/templates/dcim/region.html:37 @@ -3688,8 +3688,8 @@ msgstr "" #: netbox/ipam/forms/model_forms.py:480 netbox/ipam/forms/model_forms.py:494 #: netbox/ipam/models/ip.py:217 netbox/ipam/models/ip.py:498 #: netbox/ipam/models/ip.py:719 netbox/ipam/models/vrfs.py:61 -#: netbox/ipam/tables/ip.py:188 netbox/ipam/tables/ip.py:260 -#: netbox/ipam/tables/ip.py:311 netbox/ipam/tables/ip.py:401 +#: netbox/ipam/tables/ip.py:188 netbox/ipam/tables/ip.py:261 +#: netbox/ipam/tables/ip.py:312 netbox/ipam/tables/ip.py:402 #: netbox/templates/dcim/interface.html:152 #: netbox/templates/ipam/ipaddress.html:18 #: netbox/templates/ipam/iprange.html:40 netbox/templates/ipam/prefix.html:19 @@ -3698,7 +3698,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:243 #: netbox/virtualization/forms/bulk_import.py:177 #: netbox/virtualization/forms/filtersets.py:233 -#: netbox/virtualization/forms/model_forms.py:360 +#: netbox/virtualization/forms/model_forms.py:368 #: netbox/virtualization/models/virtualmachines.py:331 #: netbox/virtualization/tables/virtualmachines.py:113 msgid "VRF" @@ -3735,7 +3735,7 @@ msgstr "" #: netbox/dcim/models/device_components.py:568 #: netbox/ipam/forms/filtersets.py:489 netbox/ipam/forms/model_forms.py:704 #: netbox/templates/ipam/vlantranslationpolicy.html:11 -#: netbox/virtualization/forms/model_forms.py:365 +#: netbox/virtualization/forms/model_forms.py:373 msgid "VLAN Translation Policy" msgstr "" @@ -3777,7 +3777,7 @@ msgstr "" #: netbox/dcim/filtersets.py:1800 netbox/dcim/forms/model_forms.py:1415 #: netbox/virtualization/filtersets.py:279 -#: netbox/virtualization/forms/model_forms.py:303 +#: netbox/virtualization/forms/model_forms.py:311 msgid "Primary MAC address" msgstr "" @@ -4075,7 +4075,7 @@ msgstr "" #: netbox/templates/dcim/rack/base.html:4 #: netbox/templates/dcim/rackreservation.html:19 #: netbox/templates/dcim/rackreservation.html:36 -#: netbox/virtualization/forms/model_forms.py:112 +#: netbox/virtualization/forms/model_forms.py:113 msgid "Rack" msgstr "" @@ -4141,7 +4141,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_import.py:138 #: netbox/virtualization/forms/bulk_import.py:139 #: netbox/virtualization/forms/filtersets.py:193 -#: netbox/virtualization/forms/model_forms.py:214 +#: netbox/virtualization/forms/model_forms.py:222 msgid "Config template" msgstr "" @@ -4166,7 +4166,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_edit.py:142 #: netbox/virtualization/forms/bulk_import.py:128 #: netbox/virtualization/forms/filtersets.py:173 -#: netbox/virtualization/forms/model_forms.py:202 +#: netbox/virtualization/forms/model_forms.py:210 #: netbox/virtualization/tables/virtualmachines.py:49 msgid "Platform" msgstr "" @@ -4187,8 +4187,8 @@ msgstr "" #: netbox/virtualization/forms/filtersets.py:104 #: netbox/virtualization/forms/filtersets.py:128 #: netbox/virtualization/forms/filtersets.py:209 -#: netbox/virtualization/forms/model_forms.py:77 -#: netbox/virtualization/forms/model_forms.py:175 +#: netbox/virtualization/forms/model_forms.py:78 +#: netbox/virtualization/forms/model_forms.py:183 #: netbox/virtualization/tables/virtualmachines.py:37 msgid "Cluster" msgstr "" @@ -4381,21 +4381,21 @@ msgstr "" #: netbox/dcim/forms/bulk_edit.py:1493 netbox/dcim/forms/model_forms.py:1377 #: netbox/ipam/forms/bulk_import.py:174 netbox/ipam/forms/filtersets.py:539 #: netbox/ipam/models/vlans.py:86 netbox/virtualization/forms/bulk_edit.py:222 -#: netbox/virtualization/forms/model_forms.py:327 +#: netbox/virtualization/forms/model_forms.py:335 msgid "VLAN group" msgstr "" #: netbox/dcim/forms/bulk_edit.py:1502 netbox/dcim/forms/model_forms.py:1383 #: netbox/dcim/tables/devices.py:592 #: netbox/virtualization/forms/bulk_edit.py:230 -#: netbox/virtualization/forms/model_forms.py:332 +#: netbox/virtualization/forms/model_forms.py:340 msgid "Untagged VLAN" msgstr "" #: netbox/dcim/forms/bulk_edit.py:1511 netbox/dcim/forms/model_forms.py:1392 #: netbox/dcim/tables/devices.py:598 #: netbox/virtualization/forms/bulk_edit.py:238 -#: netbox/virtualization/forms/model_forms.py:341 +#: netbox/virtualization/forms/model_forms.py:349 msgid "Tagged VLANs" msgstr "" @@ -4408,7 +4408,7 @@ msgid "Remove tagged VLANs" msgstr "" #: netbox/dcim/forms/bulk_edit.py:1534 netbox/dcim/forms/model_forms.py:1401 -#: netbox/virtualization/forms/model_forms.py:350 +#: netbox/virtualization/forms/model_forms.py:358 msgid "Q-in-Q Service VLAN" msgstr "" @@ -4430,13 +4430,13 @@ msgstr "" #: netbox/templates/dcim/interface.html:128 #: netbox/templates/ipam/prefix.html:91 #: netbox/templates/virtualization/vminterface.html:70 -#: netbox/virtualization/forms/model_forms.py:370 +#: netbox/virtualization/forms/model_forms.py:378 msgid "Addressing" msgstr "" #: netbox/dcim/forms/bulk_edit.py:1564 netbox/dcim/forms/filtersets.py:721 #: netbox/dcim/forms/model_forms.py:1436 -#: netbox/virtualization/forms/model_forms.py:371 +#: netbox/virtualization/forms/model_forms.py:379 msgid "Operation" msgstr "" @@ -4448,13 +4448,13 @@ msgstr "" #: netbox/dcim/forms/bulk_edit.py:1566 netbox/dcim/forms/model_forms.py:1437 #: netbox/templates/dcim/interface.html:105 #: netbox/virtualization/forms/bulk_edit.py:249 -#: netbox/virtualization/forms/model_forms.py:372 +#: netbox/virtualization/forms/model_forms.py:380 msgid "Related Interfaces" msgstr "" #: netbox/dcim/forms/bulk_edit.py:1567 netbox/dcim/forms/model_forms.py:1441 #: netbox/virtualization/forms/bulk_edit.py:250 -#: netbox/virtualization/forms/model_forms.py:375 +#: netbox/virtualization/forms/model_forms.py:383 msgid "802.1Q Switching" msgstr "" @@ -4711,13 +4711,13 @@ msgstr "" #: netbox/dcim/forms/bulk_import.py:867 netbox/dcim/forms/model_forms.py:1339 #: netbox/virtualization/forms/bulk_import.py:161 -#: netbox/virtualization/forms/model_forms.py:311 +#: netbox/virtualization/forms/model_forms.py:319 msgid "Parent interface" msgstr "" #: netbox/dcim/forms/bulk_import.py:874 netbox/dcim/forms/model_forms.py:1347 #: netbox/virtualization/forms/bulk_import.py:168 -#: netbox/virtualization/forms/model_forms.py:319 +#: netbox/virtualization/forms/model_forms.py:327 msgid "Bridged interface" msgstr "" @@ -4844,7 +4844,7 @@ msgstr "" #: netbox/virtualization/forms/bulk_import.py:213 #: netbox/virtualization/forms/filtersets.py:217 #: netbox/virtualization/forms/filtersets.py:253 -#: netbox/virtualization/forms/model_forms.py:287 +#: netbox/virtualization/forms/model_forms.py:295 #: netbox/vpn/forms/bulk_import.py:93 netbox/vpn/forms/bulk_import.py:290 msgid "Virtual machine" msgstr "" @@ -5185,7 +5185,7 @@ msgstr "" #: netbox/templates/wireless/wirelesslan.html:26 #: netbox/virtualization/forms/bulk_edit.py:91 #: netbox/virtualization/forms/filtersets.py:46 -#: netbox/virtualization/forms/model_forms.py:78 +#: netbox/virtualization/forms/model_forms.py:79 #: netbox/virtualization/tables/clusters.py:80 #: netbox/wireless/forms/bulk_edit.py:93 netbox/wireless/forms/filtersets.py:37 #: netbox/wireless/forms/model_forms.py:56 @@ -5408,7 +5408,7 @@ msgstr "" #: netbox/templates/vpn/tunneltermination.html:25 #: netbox/virtualization/forms/filtersets.py:202 #: netbox/virtualization/forms/filtersets.py:247 -#: netbox/virtualization/forms/model_forms.py:219 +#: netbox/virtualization/forms/model_forms.py:227 #: netbox/virtualization/tables/virtualmachines.py:105 #: netbox/virtualization/tables/virtualmachines.py:161 netbox/vpn/choices.py:53 #: netbox/vpn/forms/filtersets.py:293 netbox/vpn/forms/model_forms.py:161 @@ -6786,43 +6786,43 @@ msgstr "" msgid "Assigned location must belong to parent site ({site})." msgstr "" -#: netbox/dcim/models/racks.py:383 +#: netbox/dcim/models/racks.py:387 #, python-brace-format msgid "" "Rack must be at least {min_height}U tall to house currently installed " "devices." msgstr "" -#: netbox/dcim/models/racks.py:391 +#: netbox/dcim/models/racks.py:396 #, python-brace-format msgid "" "Rack unit numbering must begin at {position} or less to house currently " "installed devices." msgstr "" -#: netbox/dcim/models/racks.py:399 +#: netbox/dcim/models/racks.py:404 #, python-brace-format msgid "Location must be from the same site, {site}." msgstr "" -#: netbox/dcim/models/racks.py:661 +#: netbox/dcim/models/racks.py:666 msgid "units" msgstr "" -#: netbox/dcim/models/racks.py:687 +#: netbox/dcim/models/racks.py:692 msgid "rack reservation" msgstr "" -#: netbox/dcim/models/racks.py:688 +#: netbox/dcim/models/racks.py:693 msgid "rack reservations" msgstr "" -#: netbox/dcim/models/racks.py:702 +#: netbox/dcim/models/racks.py:707 #, python-brace-format msgid "Invalid unit(s) for {height}U rack: {unit_list}" msgstr "" -#: netbox/dcim/models/racks.py:715 +#: netbox/dcim/models/racks.py:720 #, python-brace-format msgid "The following units have already been reserved: {unit_list}" msgstr "" @@ -6967,14 +6967,14 @@ msgstr "" #: netbox/dcim/tables/sites.py:148 netbox/extras/tables/tables.py:545 #: netbox/netbox/navigation/menu.py:69 netbox/netbox/navigation/menu.py:73 #: netbox/netbox/navigation/menu.py:75 -#: netbox/virtualization/forms/model_forms.py:121 -#: netbox/virtualization/tables/clusters.py:86 +#: netbox/virtualization/forms/model_forms.py:122 +#: netbox/virtualization/tables/clusters.py:87 #: netbox/virtualization/views.py:218 msgid "Devices" msgstr "" #: netbox/dcim/tables/devices.py:74 netbox/dcim/tables/devices.py:122 -#: netbox/virtualization/tables/clusters.py:91 +#: netbox/virtualization/tables/clusters.py:92 msgid "VMs" msgstr "" @@ -6994,8 +6994,8 @@ msgstr "" #: netbox/dcim/tables/devices.py:197 netbox/dcim/tables/devices.py:1099 #: netbox/ipam/forms/bulk_import.py:562 netbox/ipam/forms/model_forms.py:308 -#: netbox/ipam/forms/model_forms.py:321 netbox/ipam/tables/ip.py:307 -#: netbox/ipam/tables/ip.py:374 netbox/ipam/tables/ip.py:397 +#: netbox/ipam/forms/model_forms.py:321 netbox/ipam/tables/ip.py:308 +#: netbox/ipam/tables/ip.py:375 netbox/ipam/tables/ip.py:398 #: netbox/templates/ipam/ipaddress.html:11 #: netbox/virtualization/tables/virtualmachines.py:65 msgid "IP Address" @@ -7058,7 +7058,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine/base.html:27 #: netbox/templates/virtualization/virtualmachine_list.html:14 #: netbox/virtualization/tables/virtualmachines.py:71 -#: netbox/virtualization/views.py:383 netbox/wireless/tables/wirelesslan.py:62 +#: netbox/virtualization/views.py:383 netbox/wireless/tables/wirelesslan.py:63 msgid "Interfaces" msgstr "" @@ -7369,7 +7369,7 @@ msgstr "" #: netbox/dcim/views.py:2250 netbox/extras/forms/model_forms.py:577 #: netbox/templates/extras/configcontext.html:10 -#: netbox/virtualization/forms/model_forms.py:224 +#: netbox/virtualization/forms/model_forms.py:232 #: netbox/virtualization/views.py:424 msgid "Config Context" msgstr "" @@ -9650,7 +9650,7 @@ msgid "Date added" msgstr "" #: netbox/ipam/forms/bulk_edit.py:213 netbox/ipam/forms/model_forms.py:621 -#: netbox/ipam/forms/model_forms.py:668 netbox/ipam/tables/ip.py:200 +#: netbox/ipam/forms/model_forms.py:668 netbox/ipam/tables/ip.py:201 #: netbox/templates/ipam/vlan_edit.html:45 #: netbox/templates/ipam/vlangroup.html:27 msgid "VLAN Group" @@ -9658,7 +9658,7 @@ msgstr "" #: netbox/ipam/forms/bulk_edit.py:218 netbox/ipam/forms/bulk_import.py:181 #: netbox/ipam/forms/filtersets.py:259 netbox/ipam/forms/model_forms.py:217 -#: netbox/ipam/models/vlans.py:272 netbox/ipam/tables/ip.py:205 +#: netbox/ipam/models/vlans.py:272 netbox/ipam/tables/ip.py:206 #: netbox/templates/ipam/prefix.html:56 netbox/templates/ipam/vlan.html:12 #: netbox/templates/ipam/vlan/base.html:6 #: netbox/templates/ipam/vlan_edit.html:10 @@ -10516,8 +10516,8 @@ msgstr "" msgid "Prefixes" msgstr "" -#: netbox/ipam/tables/ip.py:77 netbox/ipam/tables/ip.py:220 -#: netbox/ipam/tables/ip.py:275 netbox/ipam/tables/vlans.py:55 +#: netbox/ipam/tables/ip.py:77 netbox/ipam/tables/ip.py:221 +#: netbox/ipam/tables/ip.py:276 netbox/ipam/tables/vlans.py:55 #: netbox/templates/dcim/device.html:260 #: netbox/templates/ipam/aggregate.html:24 #: netbox/templates/ipam/iprange.html:29 netbox/templates/ipam/prefix.html:102 @@ -10542,31 +10542,31 @@ msgstr "" msgid "Scope Type" msgstr "" -#: netbox/ipam/tables/ip.py:212 +#: netbox/ipam/tables/ip.py:213 msgid "Pool" msgstr "" -#: netbox/ipam/tables/ip.py:216 netbox/ipam/tables/ip.py:271 +#: netbox/ipam/tables/ip.py:217 netbox/ipam/tables/ip.py:272 msgid "Marked Utilized" msgstr "" -#: netbox/ipam/tables/ip.py:255 +#: netbox/ipam/tables/ip.py:256 msgid "Start address" msgstr "" -#: netbox/ipam/tables/ip.py:334 +#: netbox/ipam/tables/ip.py:335 msgid "NAT (Inside)" msgstr "" -#: netbox/ipam/tables/ip.py:339 +#: netbox/ipam/tables/ip.py:340 msgid "NAT (Outside)" msgstr "" -#: netbox/ipam/tables/ip.py:344 +#: netbox/ipam/tables/ip.py:345 msgid "Assigned" msgstr "" -#: netbox/ipam/tables/ip.py:380 netbox/templates/vpn/l2vpntermination.html:16 +#: netbox/ipam/tables/ip.py:381 netbox/templates/vpn/l2vpntermination.html:16 #: netbox/vpn/forms/filtersets.py:240 msgid "Assigned Object" msgstr "" @@ -11582,63 +11582,63 @@ msgstr "" msgid "Cannot delete stores from registry" msgstr "" -#: netbox/netbox/settings.py:742 +#: netbox/netbox/settings.py:752 msgid "Czech" msgstr "" -#: netbox/netbox/settings.py:743 +#: netbox/netbox/settings.py:753 msgid "Danish" msgstr "" -#: netbox/netbox/settings.py:744 +#: netbox/netbox/settings.py:754 msgid "German" msgstr "" -#: netbox/netbox/settings.py:745 +#: netbox/netbox/settings.py:755 msgid "English" msgstr "" -#: netbox/netbox/settings.py:746 +#: netbox/netbox/settings.py:756 msgid "Spanish" msgstr "" -#: netbox/netbox/settings.py:747 +#: netbox/netbox/settings.py:757 msgid "French" msgstr "" -#: netbox/netbox/settings.py:748 +#: netbox/netbox/settings.py:758 msgid "Italian" msgstr "" -#: netbox/netbox/settings.py:749 +#: netbox/netbox/settings.py:759 msgid "Japanese" msgstr "" -#: netbox/netbox/settings.py:750 +#: netbox/netbox/settings.py:760 msgid "Dutch" msgstr "" -#: netbox/netbox/settings.py:751 +#: netbox/netbox/settings.py:761 msgid "Polish" msgstr "" -#: netbox/netbox/settings.py:752 +#: netbox/netbox/settings.py:762 msgid "Portuguese" msgstr "" -#: netbox/netbox/settings.py:753 +#: netbox/netbox/settings.py:763 msgid "Russian" msgstr "" -#: netbox/netbox/settings.py:754 +#: netbox/netbox/settings.py:764 msgid "Turkish" msgstr "" -#: netbox/netbox/settings.py:755 +#: netbox/netbox/settings.py:765 msgid "Ukrainian" msgstr "" -#: netbox/netbox/settings.py:756 +#: netbox/netbox/settings.py:766 msgid "Chinese" msgstr "" @@ -12709,7 +12709,7 @@ msgstr "" #: netbox/templates/dcim/device.html:175 #: netbox/templates/dcim/device_edit.html:64 -#: netbox/virtualization/forms/model_forms.py:222 +#: netbox/virtualization/forms/model_forms.py:230 msgid "Management" msgstr "" @@ -13051,7 +13051,7 @@ msgstr "" #: netbox/templates/dcim/interface.html:81 #: netbox/templates/virtualization/vminterface.html:55 -#: netbox/virtualization/forms/model_forms.py:387 +#: netbox/virtualization/forms/model_forms.py:395 msgid "802.1Q Mode" msgstr "" @@ -14478,13 +14478,13 @@ msgid "Add Cluster" msgstr "" #: netbox/templates/virtualization/clustergroup.html:19 -#: netbox/virtualization/forms/model_forms.py:52 +#: netbox/virtualization/forms/model_forms.py:53 msgid "Cluster Group" msgstr "" #: netbox/templates/virtualization/clustertype.html:19 #: netbox/templates/virtualization/virtualmachine.html:110 -#: netbox/virtualization/forms/model_forms.py:38 +#: netbox/virtualization/forms/model_forms.py:39 msgid "Cluster Type" msgstr "" @@ -14494,7 +14494,7 @@ msgstr "" #: netbox/templates/virtualization/virtualmachine.html:122 #: netbox/virtualization/forms/bulk_edit.py:172 -#: netbox/virtualization/forms/model_forms.py:223 +#: netbox/virtualization/forms/model_forms.py:231 msgid "Resources" msgstr "" @@ -15531,26 +15531,26 @@ msgstr "" msgid "Serial number" msgstr "" -#: netbox/virtualization/forms/model_forms.py:152 +#: netbox/virtualization/forms/model_forms.py:158 #, python-brace-format msgid "" -"{device} belongs to a different site ({device_site}) than the cluster " -"({cluster_site})" +"{device} belongs to a different {scope_field} ({device_scope}) than the " +"cluster ({cluster_scope})" msgstr "" -#: netbox/virtualization/forms/model_forms.py:191 +#: netbox/virtualization/forms/model_forms.py:199 msgid "Optionally pin this VM to a specific host device within the cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:220 +#: netbox/virtualization/forms/model_forms.py:228 msgid "Site/Cluster" msgstr "" -#: netbox/virtualization/forms/model_forms.py:243 +#: netbox/virtualization/forms/model_forms.py:251 msgid "Disk size is managed via the attachment of virtual disks." msgstr "" -#: netbox/virtualization/forms/model_forms.py:397 +#: netbox/virtualization/forms/model_forms.py:405 #: netbox/virtualization/tables/virtualmachines.py:81 msgid "Disk" msgstr "" From 277acd3a3198da87f4e87816bf497be6b66e528e Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 20 Jan 2025 22:49:55 -0600 Subject: [PATCH 155/169] Fixes: #18436 - Prevent unassigning mac address when primary on an interface --- netbox/dcim/models/devices.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index dbcd91ea0..d202d5d9e 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -15,6 +15,7 @@ from django.urls import reverse from django.utils.safestring import mark_safe from django.utils.translation import gettext_lazy as _ +from core.models import ObjectType from dcim.choices import * from dcim.constants import * from dcim.fields import MACAddressField @@ -1522,3 +1523,26 @@ class MACAddress(PrimaryModel): def __str__(self): return str(self.mac_address) + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Denote the original assigned object (if any) for validation in clean() + self._original_assigned_object_id = self.__dict__.get('assigned_object_id') + self._original_assigned_object_type_id = self.__dict__.get('assigned_object_type_id') + + def clean(self, *args, **kwargs): + super().clean() + if self._original_assigned_object_id and self._original_assigned_object_type_id: + assigned_object = getattr(self.assigned_object, 'parent_object', None) + ct = ObjectType.objects.get_for_id(self._original_assigned_object_type_id) + original_assigned_object = ct.get_object_for_this_type(pk=self._original_assigned_object_id) + + if original_assigned_object and not assigned_object: + raise ValidationError( + _("Cannot unassign MAC Address while it is designated as the primary MAC for an object") + ) + elif original_assigned_object and original_assigned_object != assigned_object: + raise ValidationError( + _("Cannot reassign MAC Address while it is designated as the primary MAC for an object") + ) From 22e320084a9906159fdf2770a3c951cd80fc782b Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 20 Jan 2025 23:06:29 -0600 Subject: [PATCH 156/169] Update UI to disable interface assignment when assigned as primary --- netbox/dcim/forms/model_forms.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/netbox/dcim/forms/model_forms.py b/netbox/dcim/forms/model_forms.py index 9bc69e991..5a3a27d25 100644 --- a/netbox/dcim/forms/model_forms.py +++ b/netbox/dcim/forms/model_forms.py @@ -1810,6 +1810,11 @@ class MACAddressForm(NetBoxModelForm): super().__init__(*args, **kwargs) + if instance and instance.assigned_object and instance.assigned_object.primary_mac_address: + if instance.assigned_object.primary_mac_address.pk == instance.pk: + self.fields['interface'].disabled = True + self.fields['vminterface'].disabled = True + def clean(self): super().clean() From bec97df2426e95987959713670eb9debbb3669cf Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Mon, 20 Jan 2025 23:44:36 -0600 Subject: [PATCH 157/169] Fix Tests --- netbox/dcim/models/devices.py | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index d202d5d9e..6ef5ab488 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1534,15 +1534,16 @@ class MACAddress(PrimaryModel): def clean(self, *args, **kwargs): super().clean() if self._original_assigned_object_id and self._original_assigned_object_type_id: - assigned_object = getattr(self.assigned_object, 'parent_object', None) + assigned_object = self.assigned_object ct = ObjectType.objects.get_for_id(self._original_assigned_object_type_id) original_assigned_object = ct.get_object_for_this_type(pk=self._original_assigned_object_id) - if original_assigned_object and not assigned_object: - raise ValidationError( - _("Cannot unassign MAC Address while it is designated as the primary MAC for an object") - ) - elif original_assigned_object and original_assigned_object != assigned_object: - raise ValidationError( - _("Cannot reassign MAC Address while it is designated as the primary MAC for an object") - ) + if original_assigned_object.primary_mac_address: + if not assigned_object: + raise ValidationError( + _("Cannot unassign MAC Address while it is designated as the primary MAC for an object") + ) + elif original_assigned_object != assigned_object: + raise ValidationError( + _("Cannot reassign MAC Address while it is designated as the primary MAC for an object") + ) From b91366129783d34b474d36e5dbf65e0d09016983 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 20 Jan 2025 14:34:20 -0500 Subject: [PATCH 158/169] Fixes #18438: Specify batch_size for migrations which run bulk_update() --- .../migrations/0048_circuitterminations_cached_relations.py | 3 +-- netbox/ipam/migrations/0072_prefix_cached_relations.py | 2 +- .../migrations/0045_clusters_cached_relations.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py index fc1cef0e5..9be254d54 100644 --- a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py +++ b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py @@ -1,4 +1,3 @@ -# Generated by Django 5.0.9 on 2024-10-21 17:34 import django.db.models.deletion from django.db import migrations, models @@ -16,7 +15,7 @@ def populate_denormalized_fields(apps, schema_editor): termination._site_id = termination.site_id # Note: Location cannot be set prior to migration - CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site']) + CircuitTermination.objects.bulk_update(terminations, ['_region', '_site_group', '_site'], batch_size=100) class Migration(migrations.Migration): diff --git a/netbox/ipam/migrations/0072_prefix_cached_relations.py b/netbox/ipam/migrations/0072_prefix_cached_relations.py index e4a789704..58cefb12d 100644 --- a/netbox/ipam/migrations/0072_prefix_cached_relations.py +++ b/netbox/ipam/migrations/0072_prefix_cached_relations.py @@ -15,7 +15,7 @@ def populate_denormalized_fields(apps, schema_editor): prefix._site_id = prefix.site_id # Note: Location cannot be set prior to migration - Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site']) + Prefix.objects.bulk_update(prefixes, ['_region', '_site_group', '_site'], batch_size=100) class Migration(migrations.Migration): diff --git a/netbox/virtualization/migrations/0045_clusters_cached_relations.py b/netbox/virtualization/migrations/0045_clusters_cached_relations.py index 6d0c8ff33..9918bf594 100644 --- a/netbox/virtualization/migrations/0045_clusters_cached_relations.py +++ b/netbox/virtualization/migrations/0045_clusters_cached_relations.py @@ -15,7 +15,7 @@ def populate_denormalized_fields(apps, schema_editor): cluster._site_id = cluster.site_id # Note: Location cannot be set prior to migration - Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site']) + Cluster.objects.bulk_update(clusters, ['_region', '_site_group', '_site'], batch_size=100) class Migration(migrations.Migration): From d1914595f6f30e8fa45e873ec1fa88998e8d89f0 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Tue, 21 Jan 2025 10:15:33 -0600 Subject: [PATCH 159/169] Fixes: #18447 - Fix sorting by `mac_address` field * Disable sorting by `mac_address` for legacy `mac_address` field for Device and VM Interfaces * Ensure `primary_mac_address` field is included in field list for Device and VM Interfaces --- netbox/dcim/tables/devices.py | 12 ++++++++---- netbox/virtualization/tables/virtualmachines.py | 8 ++++++-- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 087132331..4949bec82 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -697,6 +697,10 @@ class DeviceInterfaceTable(InterfaceTable): linkify=True, verbose_name=_('LAG') ) + mac_address = tables.Column( + verbose_name=_('MAC Address'), + orderable=False, + ) actions = columns.ActionsColumn( extra_buttons=INTERFACE_BUTTONS ) @@ -705,10 +709,10 @@ class DeviceInterfaceTable(InterfaceTable): model = models.Interface fields = ( 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', - 'mgmt_only', 'mtu', 'mode', 'mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', - 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', - 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', - 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', + 'mgmt_only', 'mtu', 'mode', 'mac_address', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', + 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', + 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', + 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 116051037..c6fb6cb86 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -113,6 +113,10 @@ class VMInterfaceTable(BaseInterfaceTable): verbose_name=_('VRF'), linkify=True ) + mac_address = tables.Column( + verbose_name=_('MAC Address'), + orderable=False, + ) tags = columns.TagColumn( url_name='virtualization:vminterface_list' ) @@ -120,8 +124,8 @@ class VMInterfaceTable(BaseInterfaceTable): class Meta(NetBoxTable.Meta): model = VMInterface fields = ( - 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', + 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mtu', 'mode', 'description', 'tags', 'vrf', + 'mac_address', 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') From c56a39a1687a7e4787e31f8d7694c81b2acc1e80 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Tue, 21 Jan 2025 10:44:46 -0600 Subject: [PATCH 160/169] Fixes: #18449 - Clean up some formatting errors --- netbox/dcim/base_filtersets.py | 8 ++++---- netbox/dcim/filtersets.py | 4 ++-- netbox/extras/tests/test_customfields.py | 4 ++-- netbox/ipam/models/vlans.py | 4 ++-- netbox/virtualization/forms/model_forms.py | 4 ++-- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/netbox/dcim/base_filtersets.py b/netbox/dcim/base_filtersets.py index c007c0120..df2a6b650 100644 --- a/netbox/dcim/base_filtersets.py +++ b/netbox/dcim/base_filtersets.py @@ -53,10 +53,10 @@ class ScopedFilterSet(BaseFilterSet): label=_('Site (slug)'), ) location_id = TreeNodeMultipleChoiceFilter( - queryset=Location.objects.all(), - field_name='_location', - lookup_expr='in', - label=_('Location (ID)'), + queryset=Location.objects.all(), + field_name='_location', + lookup_expr='in', + label=_('Location (ID)'), ) location = TreeNodeMultipleChoiceFilter( queryset=Location.objects.all(), diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 90a9993c2..60c3c4d38 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1652,8 +1652,8 @@ class MACAddressFilterSet(NetBoxModelFilterSet): if not value.strip(): return queryset qs_filter = ( - Q(mac_address__icontains=value) | - Q(description__icontains=value) + Q(mac_address__icontains=value) | + Q(description__icontains=value) ) return queryset.filter(qs_filter) diff --git a/netbox/extras/tests/test_customfields.py b/netbox/extras/tests/test_customfields.py index d36477da8..8bae8dfc9 100644 --- a/netbox/extras/tests/test_customfields.py +++ b/netbox/extras/tests/test_customfields.py @@ -660,8 +660,8 @@ class CustomFieldAPITest(APITestCase): CustomField( type=CustomFieldTypeChoices.TYPE_BOOLEAN, name='boolean_field', - default=False) - , + default=False + ), CustomField( type=CustomFieldTypeChoices.TYPE_DATE, name='date_field', diff --git a/netbox/ipam/models/vlans.py b/netbox/ipam/models/vlans.py index 4c7f191c9..91e39c6d3 100644 --- a/netbox/ipam/models/vlans.py +++ b/netbox/ipam/models/vlans.py @@ -361,7 +361,7 @@ class VLANTranslationRule(NetBoxModel): ) local_vid = models.PositiveSmallIntegerField( verbose_name=_('Local VLAN ID'), - validators=( + validators=( MinValueValidator(VLAN_VID_MIN), MaxValueValidator(VLAN_VID_MAX) ), @@ -369,7 +369,7 @@ class VLANTranslationRule(NetBoxModel): ) remote_vid = models.PositiveSmallIntegerField( verbose_name=_('Remote VLAN ID'), - validators=( + validators=( MinValueValidator(VLAN_VID_MIN), MaxValueValidator(VLAN_VID_MAX) ), diff --git a/netbox/virtualization/forms/model_forms.py b/netbox/virtualization/forms/model_forms.py index 9d53c9382..291d6dbe8 100644 --- a/netbox/virtualization/forms/model_forms.py +++ b/netbox/virtualization/forms/model_forms.py @@ -150,8 +150,8 @@ class ClusterAddDevicesForm(forms.Form): for scope_field in ['site', 'location']: device_scope = getattr(device, scope_field) if ( - self.cluster.scope_type.model_class() == apps.get_model('dcim', scope_field) - and device_scope != self.cluster.scope + self.cluster.scope_type.model_class() == apps.get_model('dcim', scope_field) and + device_scope != self.cluster.scope ): raise ValidationError({ 'devices': _( From ad4e4e89a7a0124beaa5776ae8c4a459258d2336 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Tue, 21 Jan 2025 11:15:33 -0600 Subject: [PATCH 161/169] Update `VirtualMachineVMInterfaceTable` --- netbox/virtualization/tables/virtualmachines.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index c6fb6cb86..87296ce0d 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -148,11 +148,11 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): class Meta(NetBoxTable.Meta): model = VMInterface fields = ( - 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'mtu', 'mode', 'description', 'tags', - 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', - 'actions', + 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'primary_mac_address', 'mtu', 'mode', + 'description', 'tags', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', + 'tagged_vlans', 'qinq_svlan', 'actions', ) - default_columns = ('pk', 'name', 'enabled', 'mac_address', 'mtu', 'mode', 'description', 'ip_addresses') + default_columns = ('pk', 'name', 'enabled', 'primary_mac_address', 'mtu', 'mode', 'description', 'ip_addresses') row_attrs = { 'data-name': lambda record: record.name, 'data-virtual': lambda record: "true", From adcb6bebd2d5f35de33a698b4b765645aa0a0314 Mon Sep 17 00:00:00 2001 From: Daniel Sheppard Date: Wed, 22 Jan 2025 14:14:56 -0600 Subject: [PATCH 162/169] Remove `mac_address` from tables. --- netbox/dcim/tables/devices.py | 12 ++++-------- netbox/virtualization/tables/virtualmachines.py | 14 +++++--------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 4949bec82..d4f2f74b3 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -697,10 +697,6 @@ class DeviceInterfaceTable(InterfaceTable): linkify=True, verbose_name=_('LAG') ) - mac_address = tables.Column( - verbose_name=_('MAC Address'), - orderable=False, - ) actions = columns.ActionsColumn( extra_buttons=INTERFACE_BUTTONS ) @@ -709,10 +705,10 @@ class DeviceInterfaceTable(InterfaceTable): model = models.Interface fields = ( 'pk', 'id', 'name', 'module_bay', 'module', 'label', 'enabled', 'type', 'parent', 'bridge', 'lag', - 'mgmt_only', 'mtu', 'mode', 'mac_address', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', - 'rf_channel_frequency', 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', - 'cable_color', 'wireless_link', 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', - 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', + 'mgmt_only', 'mtu', 'mode', 'primary_mac_address', 'wwn', 'rf_role', 'rf_channel', 'rf_channel_frequency', + 'rf_channel_width', 'tx_power', 'description', 'mark_connected', 'cable', 'cable_color', 'wireless_link', + 'wireless_lans', 'link_peer', 'connection', 'tags', 'vdcs', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', + 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', 'qinq_svlan', 'actions', ) default_columns = ( 'pk', 'name', 'label', 'enabled', 'type', 'parent', 'lag', 'mtu', 'mode', 'description', 'ip_addresses', diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py index 87296ce0d..335d1de7d 100644 --- a/netbox/virtualization/tables/virtualmachines.py +++ b/netbox/virtualization/tables/virtualmachines.py @@ -113,10 +113,6 @@ class VMInterfaceTable(BaseInterfaceTable): verbose_name=_('VRF'), linkify=True ) - mac_address = tables.Column( - verbose_name=_('MAC Address'), - orderable=False, - ) tags = columns.TagColumn( url_name='virtualization:vminterface_list' ) @@ -125,8 +121,8 @@ class VMInterfaceTable(BaseInterfaceTable): model = VMInterface fields = ( 'pk', 'id', 'name', 'virtual_machine', 'enabled', 'mtu', 'mode', 'description', 'tags', 'vrf', - 'mac_address', 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', - 'tagged_vlans', 'qinq_svlan', 'created', 'last_updated', + 'primary_mac_address', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'qinq_svlan', 'created', 'last_updated', ) default_columns = ('pk', 'name', 'virtual_machine', 'enabled', 'description') @@ -148,9 +144,9 @@ class VirtualMachineVMInterfaceTable(VMInterfaceTable): class Meta(NetBoxTable.Meta): model = VMInterface fields = ( - 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'mac_address', 'primary_mac_address', 'mtu', 'mode', - 'description', 'tags', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', - 'tagged_vlans', 'qinq_svlan', 'actions', + 'pk', 'id', 'name', 'enabled', 'parent', 'bridge', 'primary_mac_address', 'mtu', 'mode', 'description', + 'tags', 'vrf', 'l2vpn', 'tunnel', 'ip_addresses', 'fhrp_groups', 'untagged_vlan', 'tagged_vlans', + 'qinq_svlan', 'actions', ) default_columns = ('pk', 'name', 'enabled', 'primary_mac_address', 'mtu', 'mode', 'description', 'ip_addresses') row_attrs = { From da9b4523276a3e8a644ffa718ec91cda0421a581 Mon Sep 17 00:00:00 2001 From: github-actions <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Jan 2025 05:02:20 +0000 Subject: [PATCH 163/169] Update source translation strings --- netbox/translations/en/LC_MESSAGES/django.po | 204 ++++++++++--------- 1 file changed, 108 insertions(+), 96 deletions(-) diff --git a/netbox/translations/en/LC_MESSAGES/django.po b/netbox/translations/en/LC_MESSAGES/django.po index 6b0b5e1d0..d63e1dd34 100644 --- a/netbox/translations/en/LC_MESSAGES/django.po +++ b/netbox/translations/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-01-18 05:01+0000\n" +"POT-Creation-Date: 2025-01-24 05:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -1402,7 +1402,7 @@ msgstr "" #: netbox/dcim/models/device_components.py:1024 #: netbox/dcim/models/device_components.py:1095 #: netbox/dcim/models/device_components.py:1241 -#: netbox/dcim/models/devices.py:477 netbox/dcim/models/racks.py:221 +#: netbox/dcim/models/devices.py:478 netbox/dcim/models/racks.py:221 #: netbox/extras/models/tags.py:28 msgid "color" msgstr "" @@ -1429,8 +1429,8 @@ msgstr "" #: netbox/circuits/models/virtual_circuits.py:59 netbox/core/models/data.py:52 #: netbox/core/models/jobs.py:85 netbox/dcim/models/cables.py:49 #: netbox/dcim/models/device_components.py:1281 -#: netbox/dcim/models/devices.py:644 netbox/dcim/models/devices.py:1176 -#: netbox/dcim/models/devices.py:1403 netbox/dcim/models/power.py:94 +#: netbox/dcim/models/devices.py:645 netbox/dcim/models/devices.py:1177 +#: netbox/dcim/models/devices.py:1404 netbox/dcim/models/power.py:94 #: netbox/dcim/models/racks.py:288 netbox/dcim/models/sites.py:154 #: netbox/dcim/models/sites.py:270 netbox/ipam/models/ip.py:237 #: netbox/ipam/models/ip.py:508 netbox/ipam/models/ip.py:729 @@ -1560,8 +1560,8 @@ msgstr "" #: netbox/circuits/models/providers.py:98 netbox/core/models/data.py:39 #: netbox/core/models/jobs.py:46 #: netbox/dcim/models/device_component_templates.py:43 -#: netbox/dcim/models/device_components.py:52 netbox/dcim/models/devices.py:588 -#: netbox/dcim/models/devices.py:1335 netbox/dcim/models/devices.py:1398 +#: netbox/dcim/models/device_components.py:52 netbox/dcim/models/devices.py:589 +#: netbox/dcim/models/devices.py:1336 netbox/dcim/models/devices.py:1399 #: netbox/dcim/models/power.py:38 netbox/dcim/models/power.py:89 #: netbox/dcim/models/racks.py:257 netbox/dcim/models/sites.py:142 #: netbox/extras/models/configs.py:36 netbox/extras/models/configs.py:215 @@ -1593,7 +1593,7 @@ msgstr "" msgid "Full name of the provider" msgstr "" -#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:87 +#: netbox/circuits/models/providers.py:28 netbox/dcim/models/devices.py:88 #: netbox/dcim/models/racks.py:137 netbox/dcim/models/sites.py:149 #: netbox/extras/models/models.py:506 netbox/ipam/models/asns.py:23 #: netbox/ipam/models/vlans.py:42 netbox/netbox/models/__init__.py:145 @@ -3532,7 +3532,7 @@ msgstr "" #: netbox/dcim/filtersets.py:1104 netbox/dcim/forms/filtersets.py:819 #: netbox/dcim/forms/filtersets.py:1390 netbox/dcim/forms/filtersets.py:1586 #: netbox/dcim/forms/filtersets.py:1591 netbox/dcim/forms/model_forms.py:1762 -#: netbox/dcim/models/devices.py:1499 netbox/dcim/models/devices.py:1520 +#: netbox/dcim/models/devices.py:1500 netbox/dcim/models/devices.py:1521 #: netbox/virtualization/filtersets.py:196 #: netbox/virtualization/filtersets.py:268 #: netbox/virtualization/forms/filtersets.py:177 @@ -4125,7 +4125,7 @@ msgstr "" msgid "Chassis" msgstr "" -#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/models/devices.py:482 +#: netbox/dcim/forms/bulk_edit.py:619 netbox/dcim/models/devices.py:483 #: netbox/dcim/tables/devices.py:78 msgid "VM role" msgstr "" @@ -5234,7 +5234,7 @@ msgstr "" msgid "Device Role" msgstr "" -#: netbox/dcim/forms/model_forms.py:500 netbox/dcim/models/devices.py:634 +#: netbox/dcim/forms/model_forms.py:500 netbox/dcim/models/devices.py:635 msgid "The lowest-numbered unit occupied by the device" msgstr "" @@ -5417,7 +5417,7 @@ msgstr "" msgid "Virtual Machine" msgstr "" -#: netbox/dcim/forms/model_forms.py:1822 +#: netbox/dcim/forms/model_forms.py:1827 msgid "A MAC address can only be assigned to a single object." msgstr "" @@ -6139,7 +6139,7 @@ msgid "module bays" msgstr "" #: netbox/dcim/models/device_components.py:1178 -#: netbox/dcim/models/devices.py:1224 +#: netbox/dcim/models/devices.py:1225 msgid "A module bay cannot belong to a module installed within it." msgstr "" @@ -6175,14 +6175,14 @@ msgid "inventory item roles" msgstr "" #: netbox/dcim/models/device_components.py:1308 -#: netbox/dcim/models/devices.py:597 netbox/dcim/models/devices.py:1184 +#: netbox/dcim/models/devices.py:598 netbox/dcim/models/devices.py:1185 #: netbox/dcim/models/racks.py:304 #: netbox/virtualization/models/virtualmachines.py:126 msgid "serial number" msgstr "" #: netbox/dcim/models/device_components.py:1316 -#: netbox/dcim/models/devices.py:605 netbox/dcim/models/devices.py:1191 +#: netbox/dcim/models/devices.py:606 netbox/dcim/models/devices.py:1192 #: netbox/dcim/models/racks.py:311 msgid "asset tag" msgstr "" @@ -6223,377 +6223,389 @@ msgstr "" msgid "Cannot assign inventory item to component on another device" msgstr "" -#: netbox/dcim/models/devices.py:58 +#: netbox/dcim/models/devices.py:59 msgid "manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:59 +#: netbox/dcim/models/devices.py:60 msgid "manufacturers" msgstr "" -#: netbox/dcim/models/devices.py:83 netbox/dcim/models/devices.py:382 +#: netbox/dcim/models/devices.py:84 netbox/dcim/models/devices.py:383 #: netbox/dcim/models/racks.py:133 msgid "model" msgstr "" -#: netbox/dcim/models/devices.py:96 +#: netbox/dcim/models/devices.py:97 msgid "default platform" msgstr "" -#: netbox/dcim/models/devices.py:99 netbox/dcim/models/devices.py:386 +#: netbox/dcim/models/devices.py:100 netbox/dcim/models/devices.py:387 msgid "part number" msgstr "" -#: netbox/dcim/models/devices.py:102 netbox/dcim/models/devices.py:389 +#: netbox/dcim/models/devices.py:103 netbox/dcim/models/devices.py:390 msgid "Discrete part number (optional)" msgstr "" -#: netbox/dcim/models/devices.py:108 netbox/dcim/models/racks.py:53 +#: netbox/dcim/models/devices.py:109 netbox/dcim/models/racks.py:53 msgid "height (U)" msgstr "" -#: netbox/dcim/models/devices.py:112 +#: netbox/dcim/models/devices.py:113 msgid "exclude from utilization" msgstr "" -#: netbox/dcim/models/devices.py:113 +#: netbox/dcim/models/devices.py:114 msgid "Devices of this type are excluded when calculating rack utilization." msgstr "" -#: netbox/dcim/models/devices.py:117 +#: netbox/dcim/models/devices.py:118 msgid "is full depth" msgstr "" -#: netbox/dcim/models/devices.py:118 +#: netbox/dcim/models/devices.py:119 msgid "Device consumes both front and rear rack faces." msgstr "" -#: netbox/dcim/models/devices.py:125 +#: netbox/dcim/models/devices.py:126 msgid "parent/child status" msgstr "" -#: netbox/dcim/models/devices.py:126 +#: netbox/dcim/models/devices.py:127 msgid "" "Parent devices house child devices in device bays. Leave blank if this " "device type is neither a parent nor a child." msgstr "" -#: netbox/dcim/models/devices.py:130 netbox/dcim/models/devices.py:392 -#: netbox/dcim/models/devices.py:650 netbox/dcim/models/racks.py:315 +#: netbox/dcim/models/devices.py:131 netbox/dcim/models/devices.py:393 +#: netbox/dcim/models/devices.py:651 netbox/dcim/models/racks.py:315 msgid "airflow" msgstr "" -#: netbox/dcim/models/devices.py:207 +#: netbox/dcim/models/devices.py:208 msgid "device type" msgstr "" -#: netbox/dcim/models/devices.py:208 +#: netbox/dcim/models/devices.py:209 msgid "device types" msgstr "" -#: netbox/dcim/models/devices.py:290 +#: netbox/dcim/models/devices.py:291 msgid "U height must be in increments of 0.5 rack units." msgstr "" -#: netbox/dcim/models/devices.py:307 +#: netbox/dcim/models/devices.py:308 #, python-brace-format msgid "" "Device {device} in rack {rack} does not have sufficient space to accommodate " "a height of {height}U" msgstr "" -#: netbox/dcim/models/devices.py:322 +#: netbox/dcim/models/devices.py:323 #, python-brace-format msgid "" "Unable to set 0U height: Found {racked_instance_count} " "instances already mounted within racks." msgstr "" -#: netbox/dcim/models/devices.py:331 +#: netbox/dcim/models/devices.py:332 msgid "" "Must delete all device bay templates associated with this device before " "declassifying it as a parent device." msgstr "" -#: netbox/dcim/models/devices.py:337 +#: netbox/dcim/models/devices.py:338 msgid "Child device types must be 0U." msgstr "" -#: netbox/dcim/models/devices.py:412 +#: netbox/dcim/models/devices.py:413 msgid "module type" msgstr "" -#: netbox/dcim/models/devices.py:413 +#: netbox/dcim/models/devices.py:414 msgid "module types" msgstr "" -#: netbox/dcim/models/devices.py:483 +#: netbox/dcim/models/devices.py:484 msgid "Virtual machines may be assigned to this role" msgstr "" -#: netbox/dcim/models/devices.py:495 +#: netbox/dcim/models/devices.py:496 msgid "device role" msgstr "" -#: netbox/dcim/models/devices.py:496 +#: netbox/dcim/models/devices.py:497 msgid "device roles" msgstr "" -#: netbox/dcim/models/devices.py:510 +#: netbox/dcim/models/devices.py:511 msgid "Optionally limit this platform to devices of a certain manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:522 +#: netbox/dcim/models/devices.py:523 msgid "platform" msgstr "" -#: netbox/dcim/models/devices.py:523 +#: netbox/dcim/models/devices.py:524 msgid "platforms" msgstr "" -#: netbox/dcim/models/devices.py:571 +#: netbox/dcim/models/devices.py:572 msgid "The function this device serves" msgstr "" -#: netbox/dcim/models/devices.py:598 +#: netbox/dcim/models/devices.py:599 msgid "Chassis serial number, assigned by the manufacturer" msgstr "" -#: netbox/dcim/models/devices.py:606 netbox/dcim/models/devices.py:1192 +#: netbox/dcim/models/devices.py:607 netbox/dcim/models/devices.py:1193 msgid "A unique tag used to identify this device" msgstr "" -#: netbox/dcim/models/devices.py:633 +#: netbox/dcim/models/devices.py:634 msgid "position (U)" msgstr "" -#: netbox/dcim/models/devices.py:641 +#: netbox/dcim/models/devices.py:642 msgid "rack face" msgstr "" -#: netbox/dcim/models/devices.py:662 netbox/dcim/models/devices.py:1419 +#: netbox/dcim/models/devices.py:663 netbox/dcim/models/devices.py:1420 #: netbox/virtualization/models/virtualmachines.py:95 msgid "primary IPv4" msgstr "" -#: netbox/dcim/models/devices.py:670 netbox/dcim/models/devices.py:1427 +#: netbox/dcim/models/devices.py:671 netbox/dcim/models/devices.py:1428 #: netbox/virtualization/models/virtualmachines.py:103 msgid "primary IPv6" msgstr "" -#: netbox/dcim/models/devices.py:678 +#: netbox/dcim/models/devices.py:679 msgid "out-of-band IP" msgstr "" -#: netbox/dcim/models/devices.py:695 +#: netbox/dcim/models/devices.py:696 msgid "VC position" msgstr "" -#: netbox/dcim/models/devices.py:698 +#: netbox/dcim/models/devices.py:699 msgid "Virtual chassis position" msgstr "" -#: netbox/dcim/models/devices.py:701 +#: netbox/dcim/models/devices.py:702 msgid "VC priority" msgstr "" -#: netbox/dcim/models/devices.py:705 +#: netbox/dcim/models/devices.py:706 msgid "Virtual chassis master election priority" msgstr "" -#: netbox/dcim/models/devices.py:708 netbox/dcim/models/sites.py:208 +#: netbox/dcim/models/devices.py:709 netbox/dcim/models/sites.py:208 msgid "latitude" msgstr "" -#: netbox/dcim/models/devices.py:713 netbox/dcim/models/devices.py:721 +#: netbox/dcim/models/devices.py:714 netbox/dcim/models/devices.py:722 #: netbox/dcim/models/sites.py:213 netbox/dcim/models/sites.py:221 msgid "GPS coordinate in decimal format (xx.yyyyyy)" msgstr "" -#: netbox/dcim/models/devices.py:716 netbox/dcim/models/sites.py:216 +#: netbox/dcim/models/devices.py:717 netbox/dcim/models/sites.py:216 msgid "longitude" msgstr "" -#: netbox/dcim/models/devices.py:789 +#: netbox/dcim/models/devices.py:790 msgid "Device name must be unique per site." msgstr "" -#: netbox/dcim/models/devices.py:800 netbox/ipam/models/services.py:71 +#: netbox/dcim/models/devices.py:801 netbox/ipam/models/services.py:71 msgid "device" msgstr "" -#: netbox/dcim/models/devices.py:801 +#: netbox/dcim/models/devices.py:802 msgid "devices" msgstr "" -#: netbox/dcim/models/devices.py:824 +#: netbox/dcim/models/devices.py:825 #, python-brace-format msgid "Rack {rack} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:829 +#: netbox/dcim/models/devices.py:830 #, python-brace-format msgid "Location {location} does not belong to site {site}." msgstr "" -#: netbox/dcim/models/devices.py:835 +#: netbox/dcim/models/devices.py:836 #, python-brace-format msgid "Rack {rack} does not belong to location {location}." msgstr "" -#: netbox/dcim/models/devices.py:842 +#: netbox/dcim/models/devices.py:843 msgid "Cannot select a rack face without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:846 +#: netbox/dcim/models/devices.py:847 msgid "Cannot select a rack position without assigning a rack." msgstr "" -#: netbox/dcim/models/devices.py:852 +#: netbox/dcim/models/devices.py:853 msgid "Position must be in increments of 0.5 rack units." msgstr "" -#: netbox/dcim/models/devices.py:856 +#: netbox/dcim/models/devices.py:857 msgid "Must specify rack face when defining rack position." msgstr "" -#: netbox/dcim/models/devices.py:864 +#: netbox/dcim/models/devices.py:865 #, python-brace-format msgid "A 0U device type ({device_type}) cannot be assigned to a rack position." msgstr "" -#: netbox/dcim/models/devices.py:875 +#: netbox/dcim/models/devices.py:876 msgid "" "Child device types cannot be assigned to a rack face. This is an attribute " "of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:882 +#: netbox/dcim/models/devices.py:883 msgid "" "Child device types cannot be assigned to a rack position. This is an " "attribute of the parent device." msgstr "" -#: netbox/dcim/models/devices.py:896 +#: netbox/dcim/models/devices.py:897 #, python-brace-format msgid "" "U{position} is already occupied or does not have sufficient space to " "accommodate this device type: {device_type} ({u_height}U)" msgstr "" -#: netbox/dcim/models/devices.py:911 +#: netbox/dcim/models/devices.py:912 #, python-brace-format msgid "{ip} is not an IPv4 address." msgstr "" -#: netbox/dcim/models/devices.py:923 netbox/dcim/models/devices.py:941 +#: netbox/dcim/models/devices.py:924 netbox/dcim/models/devices.py:942 #, python-brace-format msgid "The specified IP address ({ip}) is not assigned to this device." msgstr "" -#: netbox/dcim/models/devices.py:929 +#: netbox/dcim/models/devices.py:930 #, python-brace-format msgid "{ip} is not an IPv6 address." msgstr "" -#: netbox/dcim/models/devices.py:959 +#: netbox/dcim/models/devices.py:960 #, python-brace-format msgid "" "The assigned platform is limited to {platform_manufacturer} device types, " "but this device's type belongs to {devicetype_manufacturer}." msgstr "" -#: netbox/dcim/models/devices.py:970 +#: netbox/dcim/models/devices.py:971 #, python-brace-format msgid "The assigned cluster belongs to a different site ({site})" msgstr "" -#: netbox/dcim/models/devices.py:977 +#: netbox/dcim/models/devices.py:978 #, python-brace-format msgid "The assigned cluster belongs to a different location ({location})" msgstr "" -#: netbox/dcim/models/devices.py:985 +#: netbox/dcim/models/devices.py:986 msgid "A device assigned to a virtual chassis must have its position defined." msgstr "" -#: netbox/dcim/models/devices.py:991 +#: netbox/dcim/models/devices.py:992 #, python-brace-format msgid "" "Device cannot be removed from virtual chassis {virtual_chassis} because it " "is currently designated as its master." msgstr "" -#: netbox/dcim/models/devices.py:1199 +#: netbox/dcim/models/devices.py:1200 msgid "module" msgstr "" -#: netbox/dcim/models/devices.py:1200 +#: netbox/dcim/models/devices.py:1201 msgid "modules" msgstr "" -#: netbox/dcim/models/devices.py:1213 +#: netbox/dcim/models/devices.py:1214 #, python-brace-format msgid "" "Module must be installed within a module bay belonging to the assigned " "device ({device})." msgstr "" -#: netbox/dcim/models/devices.py:1340 +#: netbox/dcim/models/devices.py:1341 msgid "domain" msgstr "" -#: netbox/dcim/models/devices.py:1353 netbox/dcim/models/devices.py:1354 +#: netbox/dcim/models/devices.py:1354 netbox/dcim/models/devices.py:1355 msgid "virtual chassis" msgstr "" -#: netbox/dcim/models/devices.py:1366 +#: netbox/dcim/models/devices.py:1367 #, python-brace-format msgid "The selected master ({master}) is not assigned to this virtual chassis." msgstr "" -#: netbox/dcim/models/devices.py:1382 +#: netbox/dcim/models/devices.py:1383 #, python-brace-format msgid "" "Unable to delete virtual chassis {self}. There are member interfaces which " "form a cross-chassis LAG interfaces." msgstr "" -#: netbox/dcim/models/devices.py:1408 netbox/vpn/models/l2vpn.py:37 +#: netbox/dcim/models/devices.py:1409 netbox/vpn/models/l2vpn.py:37 msgid "identifier" msgstr "" -#: netbox/dcim/models/devices.py:1409 +#: netbox/dcim/models/devices.py:1410 msgid "Numeric identifier unique to the parent device" msgstr "" -#: netbox/dcim/models/devices.py:1437 netbox/extras/models/customfields.py:225 +#: netbox/dcim/models/devices.py:1438 netbox/extras/models/customfields.py:225 #: netbox/extras/models/models.py:107 netbox/extras/models/models.py:694 #: netbox/netbox/models/__init__.py:119 msgid "comments" msgstr "" -#: netbox/dcim/models/devices.py:1453 +#: netbox/dcim/models/devices.py:1454 msgid "virtual device context" msgstr "" -#: netbox/dcim/models/devices.py:1454 +#: netbox/dcim/models/devices.py:1455 msgid "virtual device contexts" msgstr "" -#: netbox/dcim/models/devices.py:1483 +#: netbox/dcim/models/devices.py:1484 #, python-brace-format msgid "{ip} is not an IPv{family} address." msgstr "" -#: netbox/dcim/models/devices.py:1489 +#: netbox/dcim/models/devices.py:1490 msgid "Primary IP address must belong to an interface on the assigned device." msgstr "" -#: netbox/dcim/models/devices.py:1521 +#: netbox/dcim/models/devices.py:1522 msgid "MAC addresses" msgstr "" +#: netbox/dcim/models/devices.py:1544 +msgid "" +"Cannot unassign MAC Address while it is designated as the primary MAC for an " +"object" +msgstr "" + +#: netbox/dcim/models/devices.py:1548 +msgid "" +"Cannot reassign MAC Address while it is designated as the primary MAC for an " +"object" +msgstr "" + #: netbox/dcim/models/mixins.py:94 #, python-brace-format msgid "Please select a {scope_type}." From b1e753029527fd55dc32e59817f87e11fabd60c8 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Wed, 22 Jan 2025 19:57:51 -0500 Subject: [PATCH 164/169] Add warning about UTF8 encoding in PostgreSQL --- docs/installation/1-postgresql.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/installation/1-postgresql.md b/docs/installation/1-postgresql.md index 3f826fa8a..aee2baff6 100644 --- a/docs/installation/1-postgresql.md +++ b/docs/installation/1-postgresql.md @@ -62,6 +62,9 @@ GRANT CREATE ON SCHEMA public TO netbox; !!! danger "Use a strong password" **Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation. +!!! danger "Use UTF8 encoding" + Make sure that your database uses `UTF8` encoding (the default for new installations). Especially do not use `SQL_ASCII` encoding, as it can lead to unpredictable and unrecoverable errors. + Once complete, enter `\q` to exit the PostgreSQL shell. ## Verify Service Status From 5fce4eef8ef03c2a746bf7f4752f631fb0294b31 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 23 Jan 2025 19:41:12 -0500 Subject: [PATCH 165/169] Add note about \l command --- docs/installation/1-postgresql.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/installation/1-postgresql.md b/docs/installation/1-postgresql.md index aee2baff6..8ba302909 100644 --- a/docs/installation/1-postgresql.md +++ b/docs/installation/1-postgresql.md @@ -63,7 +63,7 @@ GRANT CREATE ON SCHEMA public TO netbox; **Do not use the password from the example.** Choose a strong, random password to ensure secure database authentication for your NetBox installation. !!! danger "Use UTF8 encoding" - Make sure that your database uses `UTF8` encoding (the default for new installations). Especially do not use `SQL_ASCII` encoding, as it can lead to unpredictable and unrecoverable errors. + Make sure that your database uses `UTF8` encoding (the default for new installations). Especially do not use `SQL_ASCII` encoding, as it can lead to unpredictable and unrecoverable errors. Enter `\l` to check your encoding. Once complete, enter `\q` to exit the PostgreSQL shell. From c2daa7009937e5a878ef9b5ce0b9e56d491653d0 Mon Sep 17 00:00:00 2001 From: Brian Tiemann Date: Thu, 23 Jan 2025 20:13:42 -0500 Subject: [PATCH 166/169] Fix typo in Site Groups docs --- docs/features/facilities.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/features/facilities.md b/docs/features/facilities.md index 4c8dfe265..1421281eb 100644 --- a/docs/features/facilities.md +++ b/docs/features/facilities.md @@ -46,7 +46,7 @@ Regions will always be listed alphabetically by name within each parent, and the Like regions, site groups can be arranged in a recursive hierarchy for grouping sites. However, whereas regions are intended for geographic organization, site groups may be used for functional grouping. For example, you might classify sites as corporate, branch, or customer sites in addition to where they are physically located. -The use of both regions and site groups affords to independent but complementary dimensions across which sites can be organized. +The use of both regions and site groups affords two independent but complementary dimensions across which sites can be organized. ## Sites From 313f44646b82acf8af6d99a58d2fd248ccd62cd2 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 24 Jan 2025 09:18:16 -0500 Subject: [PATCH 167/169] Assign GitHub issue type on creation --- .github/ISSUE_TEMPLATE/01-feature_request.yaml | 1 + .github/ISSUE_TEMPLATE/02-bug_report.yaml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/01-feature_request.yaml b/.github/ISSUE_TEMPLATE/01-feature_request.yaml index 6212af3b8..48a3a859c 100644 --- a/.github/ISSUE_TEMPLATE/01-feature_request.yaml +++ b/.github/ISSUE_TEMPLATE/01-feature_request.yaml @@ -1,5 +1,6 @@ --- name: ✨ Feature Request +type: Feature description: Propose a new NetBox feature or enhancement labels: ["type: feature", "status: needs triage"] body: diff --git a/.github/ISSUE_TEMPLATE/02-bug_report.yaml b/.github/ISSUE_TEMPLATE/02-bug_report.yaml index 4382a9b76..83397944c 100644 --- a/.github/ISSUE_TEMPLATE/02-bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/02-bug_report.yaml @@ -1,5 +1,6 @@ --- name: 🐛 Bug Report +type: Bug description: Report a reproducible bug in the current release of NetBox labels: ["type: bug", "status: needs triage"] body: From b2b47ac740648383ea713369e5b0678461d16f7c Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 24 Jan 2025 09:30:54 -0500 Subject: [PATCH 168/169] Closes #18484: Exempt changes to GitHub templates from CI --- .github/workflows/ci.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aab8bc34f..85070d98e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -3,11 +3,15 @@ name: CI on: push: paths-ignore: + - '.github/ISSUE_TEMPLATE/**' + - '.github/PULL_REQUEST_TEMPLATE.md' - 'contrib/**' - 'docs/**' - 'netbox/translations/**' pull_request: paths-ignore: + - '.github/ISSUE_TEMPLATE/**' + - '.github/PULL_REQUEST_TEMPLATE.md' - 'contrib/**' - 'docs/**' - 'netbox/translations/**' From 57fa1dd18dbaa5c927ceae37b5879044b9f154e1 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 24 Jan 2025 09:58:43 -0500 Subject: [PATCH 169/169] Add remaining issue types --- .github/ISSUE_TEMPLATE/03-documentation_change.yaml | 1 + .github/ISSUE_TEMPLATE/04-translation.yaml | 1 + .github/ISSUE_TEMPLATE/05-housekeeping.yaml | 1 + .github/ISSUE_TEMPLATE/06-deprecation.yaml | 1 + 4 files changed, 4 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/03-documentation_change.yaml b/.github/ISSUE_TEMPLATE/03-documentation_change.yaml index b5a970782..2dea61acc 100644 --- a/.github/ISSUE_TEMPLATE/03-documentation_change.yaml +++ b/.github/ISSUE_TEMPLATE/03-documentation_change.yaml @@ -1,5 +1,6 @@ --- name: 📖 Documentation Change +type: Documentation description: Suggest an addition or modification to the NetBox documentation labels: ["type: documentation", "status: needs triage"] body: diff --git a/.github/ISSUE_TEMPLATE/04-translation.yaml b/.github/ISSUE_TEMPLATE/04-translation.yaml index d07bc399d..72130ae47 100644 --- a/.github/ISSUE_TEMPLATE/04-translation.yaml +++ b/.github/ISSUE_TEMPLATE/04-translation.yaml @@ -1,5 +1,6 @@ --- name: 🌍 Translation +type: Translation description: Request support for a new language in the user interface labels: ["type: translation"] body: diff --git a/.github/ISSUE_TEMPLATE/05-housekeeping.yaml b/.github/ISSUE_TEMPLATE/05-housekeeping.yaml index 777871395..65b983e18 100644 --- a/.github/ISSUE_TEMPLATE/05-housekeeping.yaml +++ b/.github/ISSUE_TEMPLATE/05-housekeeping.yaml @@ -1,5 +1,6 @@ --- name: 🏡 Housekeeping +type: Housekeeping description: A change pertaining to the codebase itself (developers only) labels: ["type: housekeeping"] body: diff --git a/.github/ISSUE_TEMPLATE/06-deprecation.yaml b/.github/ISSUE_TEMPLATE/06-deprecation.yaml index 27e13e5c0..83905a39a 100644 --- a/.github/ISSUE_TEMPLATE/06-deprecation.yaml +++ b/.github/ISSUE_TEMPLATE/06-deprecation.yaml @@ -1,5 +1,6 @@ --- name: 🗑️ Deprecation +type: Deprecation description: The removal of an existing feature or resource labels: ["type: deprecation"] body:

    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 ab>eo6{3pk@e7QMC;(uO84lg$^D*8Xlu2x_G delta 66466 zcmXWkdEiz<`}py@Ptl?j6)Lpv`>K5}?P*U*X`zxzDaw;uh)5)BL@6plC`z^vQkFzn z64}a5WEao-eb4p#{qZ_8=bV{qu9-RK+#fvOhhHiF<%7kuA0J=f)(rozK+#O*WNbYu zlPO*zlR0Y(1^(Y1nS7b*xCD#f3)m1}$JY2S_QY2C@@3A!Yj7NXjfJppUcO8<9Ex<2 z$znmg9*?D%xg}1l#1lC2C?12aB5`Ei!Ik(0&c^xq^JPxQ`~~u5YGO}38fV~X_&@A{ z8?Zb6hwZTYQTZ|h@md^!AL9k|pJ{Y-zD!ptmg9Ilh@J3^g2`L35#{&8V+!TVw4&S= zhvIB(j_+VoELu2UrY&~FZa5bWczcwOFOmWtjy>o~@Yt_|8ySG1wt;c#^AOhDV2fo60Ldi^?dpiiRrZ9X=eFH@3(ZB!hOAE6EW z82*i{(oDhPX@n=BBdHPP4rpcupn;wpPR5FqFGJf~9`z5Q?LC9;h8@|ccpnYmAll$x zXoE+UNR~!#tcotOCQ&~TP5taRe?5BtU1+9OMg6*{e=h1@i~8)YIPodE-M&LRJ`(lC zj!O-lgr2X6W~>p~QP-&Nhi>1|=*VWF0bd>EThTyQpc&ba>a&?G95@$mU>V#SOFqAidGWJQUp}XQKhk$69zhn&B72-PpqY{}l(#I8mu&zD#{Q z6D?nhb#M#1n7&6F{1pwPK&jMmDYW78XaJ4Sxo?gJIxOnXN4MRDXuy}^+3x?VqvA`n zqo2@J{eiC5BBj$vkHr?0Pejl6LmM1}26h2DHUEq9A~djN*d8B8AMwASnJsYw`+qS9 zCv&hI*I_9<+cNLWjV0Ht!PJYM|nRQ(D&$^{*BIA@l(?ywj6q2Lv)d~MYmtyD4&ZydM`%X zy$zkh`_aX@34KIoKjgr<`4x? z=>5N8ZqZdp_n(YaegD^qivH+GN252+4CkV$z8-TUK|8n~9no{>OXqF${)2J;@2D?T zFqE_(C+G#prd* z(SRSombe}b^au3%{8du>g)r-l#W~PZ;zaGR5w@egMK}vxbWfopdj(w+???GZG{AgS zQ>qK189fDUzh;zALj&womHqDpz2n50;W)IT3&YE>IpqcDvwUmR{}}#*uIj?oQb)DX zKw6+{sU6x+5A^=Q;oNH3l!}L_a1Pg_9c@PE>=!hp1*)exD~2{$I;?=6uZ`Z{1RYr` zY=m8~4PJt^@k#XC@iROHPtDdy&*s)xjfy$Qw#eLvm2i9bJ-R4M)XbM@j04aPuE8p} z8K>hX=%O7^D}4p8MPF*aq2CSFYUj(GiDzLS%s$D14IWh|eLlCq>Xa`Gm!Qvw7tjv> zK(DV|H;sHGn%eQ`lwE{oU@n@G1!%?=qtA`I(Z%>M@|B#;yvTvuAz!_8V__^wxg<8h z>gf5i&_y>ET}(64cg9udJ7Ot1(mm+?N7qjyE{k@22HMUjbO7VAr2Bs<2S)fPx@ew8 zNAg1WCOV?MXhUD3529b=e1QfjpySX?lt-tsHX2}m9EB5cEbc%b%?%pn%M5q__vOGv zv=)tU0~*jX;j8HC-WBH$V*|?nU>&U6D5ZKBdjC0Sh9;l`xj4#Kp-;}m=m6GY){ZuF zV9H)b=jH?S#vjmz{zji@g&U{yC!-BDM4#Z=m@HyBWQ*;+yfoSP|T$m4Qv9s_@+et15y7Nx)?WNe>{kOc(iPm?!Ogn z@9r!IK4?~F<*c4#|&(SS$A`N`-=FG1T~7%oNE zPe93+>>Ba2a~tqiAL}Mg5ED;(iC6(vQQR&`jsG zjQxKs2QI2gXk_(sC-_i6JM0(d&qV{Bj$U^yx<+nCKdaZG*Kb2R*oOx8HQN3mbYTCY z_Z`~`-T#$1aOBOkj&{&L%EQo(#-SOSjs|!|)Gt8qTY^r_eQ0}| z0}Z%B+t~lr+ol_vp^m_CJux30@lEKB%h8Beg%6`6-+)fh^Jt*2g}c#qK1Bog2EFdb zIR7V_sq9hh(~ZZY7o3WATqEjF!)lZ}pgYzsERchKj?(H-(-%3*Uf z69dE1Xh2hufU}ty95|A>;q};+^6l6JKSqBvmh6~5rOrSzas#?nZb1WHif*s9QU5d= z;7e!#??(AEEKm6tEbaThWT&)RYoa6VfUe^4Xalp+#kBxk)%T*i_2#0He} zcTO2;g07X*(Eu*S@i-3+^aniE{r@iqrtXw3Y0l2TE|kwix8X8$?ms|p+>eg@Cp5r6 z(2vQ&UDIN$juj}62rol3yexbW&Dax|`}^Nk4s2+9xEHY-LI<)j)${$&fj7Q|?t(q&zAxM- zt>(5^oAO0C7?-0B|BgNfGJVtY;b=6VPH5oW(2fS9*PnxCU?Nt)X;{|%e=`Sm@CbUt zhiJoJM*X+w&*&4+NDrp|=-OCm1xJ;ps8MnJ#Z;Hrw7po(IGTL1^cH4TcaKI3(v&dh;bA36R{yy9*{3n4+o+5 zUxir@p5nld%^%Q5ZPkHkn~g?)bgo2iJb)Kr=|O2Ku0!wt6dmyigVO-&Vg<^L(Tohl zQaA|>bS^sO*A8a?dtwn4ru2Sv8$OBFzlM(ZV>H!=(I?$;Lt;0e`@3b>HR}6Ec?6o# z2~nPcX7W;W8_yfU{`cS>D(rA08sY0`gzutLu@`;xeuD=3SCo$#n(ixyF1iL$Zj0VG z0KIQ?I1L@h6=*xlvK)Bhqv#FKVI6z}U5tOBBRuNNR6Y)E@MJVIbw3E%;%Yh?bg^u8fD8GPaVkg$aBWS~QhNlNgBdkxk9d^bk*cCV6 zwfHwWuz6>tMY<3j(2JORbmQ^v|9u=7*-u!>8_|YO9g)6x`k;YbgD%dS(M7ll&D2(O zq&v_6KR~bl1a0@*DE}7aytC6gr5GOL{;$Y^4b(*=ZiS|}6WTyGbkz>PGB^UA`-{;L zEkxJEZQ&|3b5EkrmCw;Y58_1pA320!Kq8(im^|wU* zD)jot(GEAp`7P*b-xYq2X8JIi!Mt;_se_ZwNzZ{=XaJosw|~+1|7dj1XU6$k&~0}g z8sO7W{|5SJ^?m5u?hiEerADU=ltZ60)zE-jWjSzU?a>Q+p^*(hBb|VDa4|aaYs1^n zsauIQ^bER2UWoDztV($&+U{@YwmX8Zi3VfR50PvW4jkEO*Z>EiPpGTW09K+MKZefX zb5VXR&hJ47@I}=BgkE<9&19jmkzur*T4?=gNc-8$=^WU=AoRv_&4qW`wU&9Ec}Q z&zBj4lduEs#Fp;=<1b39vo{*RXmoBCpo{3~@MrXaQgcR1`B~VR@#4qp9qQSKuOa&6J##FEayc zVyS#QSkRZthS@2QO=zI6paJbdGqEqu|2&)h?**Al(`&ORI@0Rs6RuO#k495D2Yv0{ zgzn=t*c2Z|NBBAV9QhW_#NX%>u<-vUC;;78EB@4WH~Sc!_kP(L-+9v zbaBl`JA4DZ?j7{TPtd9Q9Buf!DF2QIlwn}5onqmM==~MZ^L3*>+mZuUYiBfo0q7IV zFC!zJg*EYVtbh-q4edY!dk;jkvEeOS!>e}Dr! zJd6fV;EH5%tV6jhy7*4VZa5rWJoljizK>?`GjwVWp_%&?bK4HhY=JA&>OUT>uZ~6C z|MfZWhSq3gozRi>!rs^)P5JWhA*@1q6WZZEG>}ijZ=?QKG}V8iYwBNgksfzddVp2J z-2NZHfg`^R&BV3g5_GXVfUf2z(M)W^s`wE)vb=dIkP=vnaw&8m?a<703x}ZXog3xp z^Vt7(cm)+Uyf|EiK43PZBj1T;=%Xlqj&}TGcm&PBF;}O7lt$aF5akBw^{t}5d(@wK zHLKHz#!}&f<-)jdJ{tLL=!ove%Wx-pecx+RD$hcHGhTpZXc3y373lAPZD_}zqwO6+ z=RPw(4X99-14mdKJy8ywv&wNnjj%pC!e;2&Xpi346%D*U+R+3w;ESWYB7799Q~w;g zTMnR4!ffW+^tYZ)Xv0^b0bGZ5@J6hO&&2ry=vw&>os!?tK>kG+SCQ+|`EqD|H8ikB zVf(1>gJd$B8ODJPo`=raw7B33Jd^SbQT__;;4r#Yj#`i!E`z!4gicL;bShe-Den`G zKr=WAy?!Q^aQ|P%fe)4&(QUE~y>Ty^qHm&H_xkkN+!~$pOK=k2g?<+lTA03YT48<4 zQ?Vf~M>Du9&i{kHv>M*PmyrAaJPsP*GOUX`u{-{YK4`k#n9lzXP36PrzJD4W@$*st zdXztm@<_<1 z7vXQ{0FGcD<}FUw9fbx^0$n@h(e@jlA2=Nsv;RFYmWuW`1I@^j=#;#MezE+822%Xy z)L>O~Dw?2cp(A?TICO-w(RQyx1Gp=E5M66ep&9x)%Yhdbxg~W_4$D(+hz8OR9obm4 z!wF~xE=C)^BI<7nmxT|b+wbWpzlz?s8*OhtItAG;Ik2OjF}JO5P31CZgmuu4JEN<( zKROlvLl^1Q=pQ0>Vm9TT$jxZi3`T0ip+)K95ljf(Hn0I z??(gKfWFT^Mmziq-F8Rco~EuDdf$0yJ2RtvCAu3HV=MRnogBE>_QZ)#&_#6+ZTJUt zvHXR-@Z>vE2NSRb z74Vch)10-%PL#Wc3()}IMi<@t=m5S)NBUcw&wp2Xq!&T2FM$r|L^OcPn6;uwoM?{* z(kq;VE}HA({O#dNG==NXhBu0`;Va+dp6GRTFU-+#QUkJftkD0 z2x_8Fx)$gn8-PyD6!foUH(_O5hjs8BoQ|1$(iB{TK4|7*?#YR!d^P$U*%ZE+<-iYx zFVMyGADY4z%TlD>(f9k=*a2rmc_X%?{3dqBW0xlfpd-H{T!m&}13L0o(M)`VwwwKm z1NZNL;Ys(VfEr>o>U*J!YC1aSm!l2L4{t#`Tps5iK|6Xf+!5{%e?`|ukrlbOBme#n z2d2JDs>n=6fA=p(Q}zj(`k&D4bo|P+MovTnsfMnRM%W13U>lqo=O01u+l)@h^XNd{ z#zOA@4>+)a&(PF=k2ZV+eWDeuG4ZR-akJ0PCK?D6AZKv1+se^Lp zTBwe;(;S_;PUv%CK$Zg|IS-9|I{M(b8trH~dc))B+`bsT9qy0wKcemYhd$7bc`%i0 zqnS7j?XWExV1Kl|?5L=if~I^94#lgn27ZEGSZHnfyWNTCl=Vfg9}?wJ*p>2lG$ZTK z0X!4sH>124eLj4T+@HG?paW@$x%Yo74jjShVIMS=gU}1dp&d+#^6V&Ig^uV(w4=Mw z`yRwTxEZ~_@T2K`Npxx|g^eF&{|}?0GZo&r3`gTS^ig~KW9g61UD21+G_=75Xlido zcgu9RqLEHTceHRqjl*>pqQ-cE=YKo4m zJJ!NMSPw4`*I|9iAEON)`&4SMG}>TQbd`5P1Md~*hoKprh;HMHuqIxMx&QuWJqM<2 zGdgE4M)?i2!QEH~KgQgnb#wY0uZ6jV{1<&-6@ES~)=FrAHPHuC z)39Hb16TP4=t!1gZCr={R_J4|3(AL+mbR<0xg#h>!MTD3T>}Tl!v1Ck46{c z1axY%(>QP>%dk3bM?XM*MlUS-Lb|au_N06=PRH@+>-8gaSNwoo@z@trh6Z6r%A?SX zt_(MXFC&3wGkZ92U++&9nG!Fh4$Gn=s~FZt=e7-+kseX*k50)*bi@*j=w+`-_PjW<=dM6K}9jFM!6Qc2>YR_9gN;L0=@qH@Zvas zWt_h*>hDnB|M$fOkD?>oh+S|iI?^I9r)_gQdcFqQanmTbMCbf;wBvqgKqJDjXok)Y zXQJ25#oT}YvycNHFn6FSTN4*-MpO9;+QEBh0H30d(jU;(pZ}EXqP{9R zkXmS9jnDvEyu$vs<1SR#&>%E`;phz)pudV|V0&DLWAG;&f&*Voi}xY)!SWvFwj&zI zFHz2HOLKoTdcHV%zVxVE6_~c80CA==fhfbV9(`b|GmV44~A`MWN%|<`~)3Yl{eA|>Y*cShR$Id z^!n~-07K9K#-an58RxHy^LNDg`{VpZ&%6J3a8MOL2>(My-rP|^R)X%|rSoDK@nNheHz3&&aqbeV!9~uMD49!R1vQJ}8 zJb?Z!s6=*eda^Y_|LQdzJK^I|{~LPYX&HX=#i8z+>=Qs|#eVV4=5p*s5gsrgF zXX%H?xj3HkDx8kRKaVdcY)|K1IXa@7(Nw;SM*17h#VKE=3>`vK z*x*3=;24JeDBp`_;uq|TJr1USsqIcYgL1pC(j#~gdVV#YO#hkRIq(Tr>g)6fu7?KF z3+LryaiPEQ3VfU1`>k*?<w-TdOX0DUE27Vh259@8 zFl)ozIq*??Ci>Ai87tt`SO{065kHDP0iQr0NY9`hZbLiV6Xnm*0Ubg+{2P5R9s6VI zrxJSoX+N_6kK>>-6<#nHOW;H_6PJcpq5&*G16~v^$M%#TMFTw){)J9q{-08yP0>tt zh;pwe5B1+tF@i>C4@6(f|3e451kF%(BL{Z$HCDt^eoZNDhfc-i=(GGL^!&rIHOiOT34H$(^67M;>AXuG{reKvD82R1kkZQw$5G0sLub|coo`_aX@3tbD}pi}cB zdjFs3DnIJ?)IljUfU4+qjnE&tt>gT~_^11SJ_mMu#UCk!3(y8{LQ{S>UWOYm4;%lP z&NmA?hJC_eXnW_P&w(lE0M?^{??>0zmso`UGhcJyqx5iGQ17o4abq-)HkjL{=;Apu z>c^rfor;e9613xM(CZeV8N3T^=P~pN`7D~@Qh&4my`UxsE}nMi;_HI$>mg_d)}*%O)Nuq!$z!zZ({}g1N&i_BWd-YkJise7wrQ_*#C_9Z zXLJhsp^wm!XhYM`xx5DL;AS*)E2F#ty>2Vkzz@)l^7#J-S_aKnBedOY4-SlIL^vOt zQC^RB@D1AFUuZ+c^X26pNY&6M;1G22%|p-Mf@WfExE>AUY4o};(2jpe_1VnPd3m|T zQy=Z9F*-Nh&GRj@isp^HU_F?E0jzI@7 z6wBY5vPn1+m!OOHPc(p2 z3g_jva}~5)9}TD(nu(5RV1v+IG@@``+W+TKVF1(Of|+PWE<+nwh^BT4I)W8w1COHD zZARz*HO##Y(GLGWQ-4g6yxfDWJeuK#QSMkIn@$X*!qt8*+QCe;!>iDa7NR4%J?ig4 z8(NLd^(HjMFNZtO``$($aC^~#96+D2KcfK_$R3j#J`ru`R5XCv=ss$alMdm zQQseXP(BY`3y-4>z81cPwzC_(Z$J9v{0^O>g2$zfE1-+9#&PU_Q`MY`O4uD8!6dYS z8Bv~#c61#&(naXVmxT|Y8C#Fuw*?L4bu`uQp#%Fi&S#EK*B8xlV8dn5j?1Gr)<9F& z7@g~uQQt1?fp$0u9l&Vx!7@GS=b?ctMgzSkTod(=huP;ia9eCgBi)Ava0m_PA9Tb= zl}zVLp(Ck*uKqS?Y6qbyos4#PSvVgJbaA*04eTLg>a&?m=^*n8+TpwC-0wp(@F|*s zuh0&@N7u{|^txk8rSrwnOqN1BD2sMn4GpL<+I}0f-L5&=f4w>IhJk2DqtFY-p*K#B z@+DE88!kXQxD^d(1sdR^QNJbX-#|0CH_G3j*ZqOH@Bc!jQ$r=uhAN-|)r)dVG_Y>y z2z#R=7=TXIFm&q1p;I#pz5j;rPBhR}==NQY2J|#$J=o5H9ejW`_%V9J*XY{#4eg-t z2`Ru+!rJKlEzs+`p&1(#^&`Hu5UF$3dE{1MsDu<$Tdmb9tWVE4+ z!>gkHCNx8Lq9a=o^$&$lpaXag9qC(9{xr%zqxWSClu0Q)7Og0W-gpXnW4)+vkB+2A zlm|t5B)TXkqEj<9&d)&CPBvVOPVN0@J5M14&1SZ8;7E4FiFeSEe~dPG5bfYQw1J<| zj2vAyrMx6st{CNd=s;RyZl6beZ#2Wh(f%gp>e>I(qT+J&hWWV@y#1p7ZZzWi(ab!G zX66Mn(09=LK8o|7V{Vb6_x*{^b%AoRNYV2rVD9~2E-I?V1+~x-H9!|t8#MBsaei3T zk3vT>Im$E9K(0dXUl8?oMExrCiTQAxe++Z~{?Bt!u^o-gX5uxp)Rfd0)XJFt9S?w{w~fDNhGjJ5DPY>FpV zNauTF4a&2yAFjZ`co>^w&x(1uzk*+dr&E3g+hc)B>GQlxI2tQcpT+9#|CJp04-j_X zd04P=Uhc*zIGXaK*a%BjNp?jS+bnbhS7Aqd4hj6hDqVx!`3y1COhbm;0wzqwz}0Kj1Yut!A2u|F1Vl9&4@8Y6KG<=4NZUc-;D-*0B7PM9D?JUrA4>}yHn1b z#{TbuJx<7Gx7|e+w4aNr}eaQigElh6yBM0qg!NS=lj@EWwiHF5qqw4)EvhX0K7g*&A7 z%A;$c75ayYKIr}DV{!NYTn?PWo2gUn+Pu!`#^Pv0wbA;{=m`3u0gOdQJULv5F1m-p z_2Fh5N&O4x{S~{U0X7LccVYkg)*DELDH(-haVC1h-tY%>MESa=sW}A=tR1@Vd*L}a z0uAhW^!|@=D;~l(@X6ED;=Za|n#y(EvZ-Px72f!FShjm!<_pR#a6F#cBR%`CK}UK_ z&lJG%=#-Vm5m+Dl<3jX_xgQ7O>AliaEk(?eKzwi2i{nue|k1oMn6RApf{e4 zPR)dHKHAV~Y=9flfWAW4$luruPaKeTRUaHq`G06&@1yPgg}MLz&oTqkd%1o%5Y5Oe zw4)otWoSq1(1u<_Q~U*1!EfVyi9zYU%Gihc#!!7J?fKEZLa3qeQJPl94J!l8thlkPY|3))%?68!vQ^VTB*#8F5oC>$iTJ%|8 zad;Y8Gpt5=C_1t%n)3V5Mf6ydcZU1IZ^GZvxh`;4y00u6Q1!57HV%5Di)B=}4!!Z; zu+)h38D0zhm>i4-G7Zyv!gx6J1p6&`+}hqtdtDNc73L47=kI?1`tJle<5gxtRka z-h&rlvC-)(_fquRaCca4OkU<)%IDxhY&JGM@wTEJHXE0o2RGs6lwU;K>vV4VJ@6PB zVE*$`yF;-n&!5aa9QcdoOEj|6#;0fZm1v5;K~wlUx~hv!NS=r;wuWO)eXpU{y%Xp6;}GBfzr~3@6H^1j(J8qIUG>+Xk*`Ew8h@Z2bT~f+JOmA7CECG* z=ye;>?U|XB+O34{s#fS!w!_?i|KFDbBOHx3JP94i6=;KZp#iPILijZL=-rBbEB=c9 z@ThP>UgkPngYB{LeiW&e9HoeF=)Ux|L_--Tx2iSSLFOZgy{ z!U-3q2hL?^V7H$kRFvnS zBb|%YaRHu#>v0m6o{`$QBD@h@#7m>R2@T|BWVdBAdpYolR()o=u@#z$ZfGFG(J2}o zPQ%>dL<7Dn%4_2M3up&#V-Gxt=VGIaQ~eV3zIE8s{r?OHc2ww+)KPJC+msJGpf`*` zJDwU|iw3$P%1@xFe-mx*J2dcL(EIbxO6`_F18ju3_kXvj=o^khZ@d)kZ~@xjeQ4^} zq8&dG_1n+}-wMBs`oE)`H#@a+QrHk3U=PfCFey&lfbQqjQQn1~{}vl#u}f3A0~*kn za3cB(>OwT|%hA9Wp@BXSyKS1GK(VcxE^SZFpXk??G4d z2CRf{p{f2k&i{vQ>(X=5Zm5f9us8b77&3?b?+uSrQ30PvN3b95=qEJN!k4A%s-hWb zgw_wlGjM90e*w+Ro9K1B(SiJq#jqItdA=MPNTqB%fa-*;E6g(U->x^sV?UcEUDuQ;O%JH{OSK zyaj!!yn_bxUibz2AUlKwu*4N<Z-JOPC`fA0DUR-LO-n* zqhCOuqJdVKm#%Ax&hcP$Esa0}ydb<7CsCe@x%dAM95kV#>(zddu6lv+==tl> z3~a#MM)8K(BK;dD#wA@V-Ejx{_9}gS>bMaaVCyIkjq+%;oy*XS&WrNmaLM&-3olqsg(FxU z7e0o*cArBtu@im59SDC#*GPed$rI6x)Iw9+3B7Mzcqw}QO_$5{RFyd)( z!7b>%eJtFG-tZ&lcEwHUZ@MR;9p8wib{YCeeF)8H!Nuw4_px{`<<@BZ%J4y?-E8Ku zsCX4^=uNDGd!wAWIW3}M==rAT)O17x8i;mq9@@d1=v3@RzyE(g7vEX8r0Z@&uRDUd z|NY+rx26#uht5rP^u|tT2aiSlRy2V9=t#eh^WAPs-;BetF7-3e09J<2pc&kaF5Yjk zKQ_HRkH^+3-LK?6A(z5jZ2 zN|&P7J&i8*ZJ2G(!7dI4VaYqw{+@tN!6s~o`=VU@uGDZ7w87D6hjY=6=A#+BBiw*P zDepwDtGP4<+#u|P5#@L(#8Y%|*Nt7xjeLsQr6?$kgpw4(vx7%Y{K&v$f==iif_ zq%WfXz~Of^)qR(x--;{H{z@%Rzk)AW&i=oMikGPvj4kiYKqT1LeWk4(~wEzaM^veo=jgX6D5E(f}J{4a!5a95`2Vu^z5NKeawa zJ3RjWWR0+GI53=uruK3)gV#j)7Ibagg>LUh(9G>buiGEzv){)BnN?|7)ARp`iHL>t(JrubX5qo3paQIDqUN{3a^kv5I;5cK-<(12&7yX2Zj z+5cX6Q(U+nEx&|D{w3OBzQ!uC3PVQ+vJ9 z*X}SZfHSfj_@i+)+R+{89~d5t^7G-_Xv#iEJN_OGD6=8G*H1vpjj<|rM|aT_G^1Ce z+jtF{*>}*zoBfdkZ#?#i^dPE&p6HL>cwv-pM%TdOXhS>D2iI@t6jgaLO-*g|{$^;v zgV6RzMtKJMe8?i1%Vt({V8a_zMP?@&;eNEEf6#`iZ%iX^h?YBJ5A1^mumnx{@+g0f zd6d6F+xZ@w;YpiPfPL{qAM%qqD8`Aa(Yd+>P4WF`2X17XA|F3p|ycaAnc^ znxLsa9bH3bqxYYWu9a+fBbIjmFY^GOh!Z=|HLy3zKcNk0HmB=KhBa{@)$Onl-hwWw zyU~tTp!YqFX87gso?-tt<=}QI8sQsQ4KvTCCslRy!gJ8Mo*w1r&^53VeMEnV z22|m>^l8=+egEH$cKoa6<6q@?K4qrvmb7NtY+?U9vd&aYz!7ocRW#B!(K-ASP3aHl z>i!pP_>>pYbuG|U-3uM@Md)?cg%6-VShk`4eTlwh|IJ24dZNA^4#;ohjvY)y~c zGU&eVguU@XtmE})2jAf+{11IAj(Rx-v>a`BH5%AU$dfRe`G5mcbr@ZAC0|L_MsMhZ zqj4mf;up~dzCi=dyqeZX8Fb{e(fb;qYoZTU!l_svZ$<-t3ER8>f8wAi6%DtgMRy+h zDRwV<<4$}Ne?fm*z4%%>{~y{=z3s{2=oHNlUyb^sccgzasxda<{P}1g%kfh8|4t63 zVz1ZJPpfBfF6Aa~q$k&tIEnJ7Xa{}XOg~T-;&94;<8&PIR$lHu%in?ip6I_b{R4=5 zusr4bZ>K4#9FD>408XsrKz~O+5PI%PU$^sc3gzu+YFoaOc0-4-4>}dY(W$sF>aPoL zNAJ5Y%4^Zx)#zfoAH9E5xDCDT zee_BACHg7$4VGp9x7eLl{lGnGD$d@+{%^$vH&Zbi-@?7v?>LVJ^_9UmUJLr|9uGzYXngH|GBLe?H;BeR%*I zV7bp?B zk&PVK!SM(3GG}9Z?1jtF5r2oy*?;H=PCb|ctBMBND9RntHPJW9Q_z6^hu*gsZEs1G zA3DhXpFzcXDqJKrze={mc9eUf9V|d^ybI0LBj_4=22K4Iba8GE4`3V0d0(eTb9?mu z3($;S9xnVkn;N*2ieou(9~#JdtcY9D4i1Drp_%#%4W!05X-b-*85)kx?QC@9H=`Xs zfUd14!-JUn7|nj0BI}D@I2!%pnSwSj7j5wNIR7Xb(6eY}UXA+q(Cfa4`Xf5IW{<4EP@X0g=@5CF>RMq@GWui5j+TLgf6VU6gKpT7*ZSeItzXxsj$M7FC zvxR?10iT4fg&N3p*-ZU(kZB!uM;jcB1~Lj=RMVsWW;B4iqr5HLg`KJY2u*dxAJZS7 z`lH{1YtfGL|CHJp@DsZX6Cy%|6f@8 zmvp{%*c@%Q3l7AyqkcX5K-z-Y;T(L$fvdgq;k?ZGcrNXW=0{7yJB{ z{xIVPP32ksX8qgdxfa}meAHtgWF8V3=Z`3#cFE2BT@+fpSeTWk=`xgh^ zIF1LZPqu~V2%bhe_z?Z-J&10rD*5u~Ivj*u7 zcBUhl$Y$>2z!AQN-mo*B$b62bv{3&1xe=d;p09|ewn@~Vfo5zNn$oFgdzXjTp!eMn z-WzVf-0%NaIq-&0&`cbN3yv+2KmG6apeb8`j(9ElN2EPy!=Ir6{2J$vIVxS(3=Q-g z^!%JC-yE(}_y3NlI2h(XI)85QmB*%>zZz}m8JvOd<0$M?Fx9UMcZ3Jg!15Q$pWB8f zplfCdnxR?ffUm{e|Nh4!4(d~}3NOb!=!eLV!fEcGz@hqt4VJ&LC0ee}Y^VS(bQ;ZkUd zPeRYvLtjp9qdWjlp*#j{cP>`OJFz)FhrWbAs3#wl)Xe&@}844hqMi4a`6vPz$2G9u43%^fmns+RkU_qWc+r@)fL@>T9Cyv_R|o zA^~SJ7jj^#E(>o8?+Z7E+tG&iVIBM#9dY?eso^^4zV3)V$Sy#4!(w!?J%$Fb9sLs8 zkL}$5!z!mI*q!Jidkh`PUubHJR7vII&>JhFf!u{Ya2}2F_9%aXcKj!rp_8hn0agl| zqV0B5_kUjw9LZp`<1yj%@Jh79o6$$@8nlDw!;jGn9zj!EqFS;Mdfh*UYz4!O2m-5NlAr9eufMLFfMH zda2ZjLmDICW6>1ao9qWArT2AFA( zEQtnM4IOb8G=Q_wDLo$zWD2r-vYDB2!6LN5yV2GDFuK}b#J>1JShHceZWh|`wYV2= zLsL7gQM&&N^vU`s8c6BJDe!t|`3%hc^ZyAPxN2wOIe1ri1Rd$fCiydKa4z1BwVI|8 zZbL_M5S@x2&{ zLAkI7THh4i*X_{#-Y4ouh7-^cPDk6jI$Vanwl`r*EYUixsh+Lb|9)KFMTIx!Zj`|0pek=N5+K+YcFdl^!+opD_qr0JDmIGfRP0^I} z4Tqtb8HX;yN$7}f2v>(&!Vk~^{EY7VquQmZYlaSFBD$t73a^U#>@6HP=l7t2e2lrN zKvQ;H`;>tRXa;76*Q37=R-g^=&i$X*6i@At-l_w!GUdC`Z_XEx%<%93bW9Dj zL`U2s%KgyPpA$|-M|deZq8pGO5ScsB03M9-1G@=x z|M&my@qmiQ!mV+^d*}$iKyUml&L4exdM=a+n}6iM~E3pd*`sHh2TNChm#z8{+(yIR8PM|2oe9hYs|Z?kOXu zc4zQS_vx6lqgLZ1hp zV{I&SMrx-C(oZ&XItSh`Buq)jq~w4oC-e-9y&8Ej)V9*%28+K&#b_D_%ptZPT|%O=`~#D?DU1z8~u{H5uM7{vmE%X_5@0egs-4)v+OzfGoA2dbafXVou;TBx~e;(b2|@xlz$!dCyq(i4?{DR zML)%|H^#wcG~zFD3AP-YKXWaWB79?zv*;ezxUzXq54nR|$Xi#V}(a{k=^QHg?6(ki_h9oa89 z99vIKsl5XiQ2qz+#`zbfKgU&@mOpbb<;nO09zdsT&GfWOen8tRcu~sW8Muc2GmAKQ z30us_pBaTm(8YN6%=D9M3C^Q@7_Y(E7pKqjyi4+D{-AsXUW%8_N^|@>_M?3A?9|a@ zH1&^!-=b4c<5JpboyUzF^rT|boHTa@F3X>JmU1h!p+EoM);T~)mNi{Fv#M>|wr$(C zZF9P_ZL8Y0oo(B;t!Zm|8sD??M$W4LU4N`~Y6o}3IX7JbHFu2#v7GDUeZk^!)P`9bepzd{FhOiS&l6k1}db|KAy9lU9z>1)V8-sDc zo`w@Z4YC4M123ozoC5U_`wmoo_+ic?VhT_XXvIL~H3QXWq{ozLpdR5Cfg)T3ieMku z4!jPA0gDZH8kYx)W7ju(0jNPYfT}-g_6;x)`z@FW{AhO45su%J5=8}R!A@WSa6PyN z)UCJPNaxxw1RG($1Y3Y*Mg{tQ*LxjU2RqMb=YBpJ)ZiPzQs7BYJB>2NIe~^Kvs+d?5wk8~wLJ*kWWOM}T zunBk>Obg~1@7RsN)VlxgM@dECIhYxYG{Kp;5U3kTc~FmN!_B`3)NSJ=s7rPm)L>5y z-+&3RKY`k5)QQfGE(NHQDFy1b(-=&t`+sK??Pxlv9p3;&{1%J^eg{PqdXjT8@jwye z1$AO&K^<{RQ1|n0pl;nX1v`U09JpdkbsEM7HE}vn zJ1%Z^O;9(+PN0syH^{Yg?FV&Z3pLHbaG+k$L;~xB3BV9wA5a?{Fpc}a5=P?CYqRN~ z8m%+j4~E9RX!cFBUz`02Oin!Hbf+#YI1W2M7y~>3>YCpL)j0GF=h8#~eH)v>{a;61 z9ES?3Swd@2M>rf*d;^sq3xaiL1-goWL7;BTH$c7l z3^Uu|ZvyJJ(*o3Bo*pQge2h7!ftqYJm;&4jYJf+eZspPEI4?Njfx7W!0+WE{K;^Xu zHP~EG^_R^5&FnOD9sY_AdR$FV^p>l;;TTW@Edn*^8pGY78lDD|fX_kQ+QZCqUiFp) z_4=VBsKzrv$L|p&{j}K zwhz=vTrs>2>T%)`m;g+$(D@`KFQ^B$>Yy&|EKmc^1NEue2{5Vd|358|Xpuu)7A%Xu z3aDHEY_KM{7}PcW4(bx6S?uKJH!KF~5|jn?c+d|V295+1@i-7+2@ly|`lZgswlCxU zuLqt#D22gd%biJwfI7MnW-kWyII$em&X0oOz%!ukw$}~c8HQfr#1n(Mgy{_Pff~G= z*$r24|5rjs9I3$ppk9b912xbGP?sd@N@qvqK;_p4bxB%-8nmm$$AfAx+i)GIqdx#@ z@FSpZGp9j4q=#AMaduXCmE&jx>e@^PM}jB8q+r$6&IbjgO z2dd$1!$*cMLDjtn#pCj1Q`VYqcpgM^@X zvzT4bunNdV`S~vt5qk_rgWB;_vuA^vbg7{i6yYhu>!1dCV)z+UeTel=UU*O^62~wr zsFNz^L+*b~P(;`Z)Qx4R*&_|7fqECb$n0&P8XPh_3F@RS7=8rB7h{8iNkI*e$*?r2 zft$$I{l5!}9vDU&ZdCyLJ}Bbvpl+1$Hab`dlz#}QL6#b>0kyNupz2SU{m}56VZ=>N zUUJZ*qtA2Sl<=06Xr(Q8BZX2*_gm=P3jakDELHV3uyzMwAY z=*`^!rOd^lf(@Vs*$HZA$3PXF1@-uF7u0|uw>a@chABbSWdOyO7u4Vt47-|t2B^VT z8SdZ0{a=o&=6DT?$i3CUNT6Pj#0NDY}s%`|R4bA{{ zvI{}o*7hht6CVIYa2f0bzBIeeHm9(YVINR=LkwqvdI(-`_AyW!xC810UK&Q)?z~^f z4r;L8pm;n3QB*Ju)TE0nunE*)$IZS4>geAahV?r6$w1v0vl-Sfe=krw9RZ4evH3R` z?sxni*Lh301M28rf;y_tpa%MF@kl!yqWFesK;`8$EDUN#WkH=tW5eE{ZaWhVy`b{$ zgT9~t|AL|ke_9~yPA4HTsE5v+hBZLtbvGOYYQXWJPHLX{H-b9iy=ET)bwU@-{|VIK zKNQ#fKg2G_5f#*t#W&0iim19_Jy3;BK{ae|I1tnzlR@P#GJB=jJIvk>s{TBvSKT*3 z-{=3&QAGI5Fv@O+C^@KWp3bm1s1s-aim0t&cThLB0Ty2jYM>2f?+3+y22|aBP_L?A z?&kh4$9D?^>~ZcE5kL_{0d=jCfVzgc3>%q$1gHV$8g2tsch2JXK-GN)butO|I{C># z*#-7;|JP*2aR_T!psgi#F&qu*(kuq`dVe3N9UKSM@S5Q>P$%@&?7)4_j-!JbG$9xl z%mpg1iU&mm4MDwl>3XM#GZ1!k`THSk7I#D@*Q!~f{kC&ZPh!c< z&JC*GQwT)`RSlbhI`Xcdj&7vk2J>GBHOSwF-$2#74>-5-sD{}=`D=n|)Y7mIDE_ey zdR&W8^zz$lcm`C1hoA~ygF2Dlpa?@AbTB5UyJt$n5}@v8%?*cx%3lGB&kL&YLGxet zA@{%MC~EZ0Fx(->PH30~6hU!NgH!}XTmuwg3s8;w8P2u%K2Z7R%)Sb$&r|b%2YrA4 z|Bn;`VGldkEIR1B+Zh%&Y+%?E)Qx8Xs6pm{I*B!gr_BG-@E=f5HeruA14J}T0{Z^{ zZ*~+B6#+$5#jrEzYh*YFRNhKZ1MdKJ0*4H5nE$QecTo3|fTPaa@2H?oBo?R#poB;5 z^?!OCBF=9K0(Fv441ZZX)-fC4n8zVX zk3)@0gDR+D*wOqWKutc?aJJzhP$#ewRQ*0sM|~R92F{!Rk>NW~`9IB$<~i={JTa)o znGMT;B4}#Z15|^NppJeTsDb8#+UYVdCFr&IT~PVYL0!_%=8t~DxfBUO-Do|@P&9D~ z!!n?bwgRZf^frd$K@GIo@F=KDcEj)msDZv){EuO@la4p(xjGiu3(~-C$1auV5Z9!_`2S8~mFaOlVyjlP@870t(Hi>>RuL|3C7WU=Q8G zkjNqVzAYbnm19X38p(GG*K+X^vU;fl5?W7-$T)HiSbcT4TEf9UNajO9U)WU-Tc2ti zA!lef4(t%*X~XkP2*@NgApZwjvY)~pDnQ!de=xP_!|0wN)>7U#tocOp(7q8>H=!+t zeguCj{9VEP}?lAHeFy4K-_QKw5`3dl^q5e)-j;t>u z_p!p-1adKYTnfh8sJgjILJ~VcUI<9`SbhtzE)AmEnJVuyc3SNI)@%*F2js=Y_Y3_s zgOpGr5+MYaY#oh0*m<2KD7nE7PSdbFc3mUlhVY*hr3r71UAt|_!&Y~nMt_sVBa%-F zTD%Eyeu>a^2X7l2J`KF}JT#ez^Bl(^;c3$~9X+|(Cn?%ww}v+i^~@TzLXUz!D-FId zj3hHPdEk?Lz?XpB0yeyS^^H?{W$GoKQ51xvNl%F0Fjd zgtDfOY#=$az!fjpDe;S_z6a=Vb_&VK?MvNhFf@74dR$Ft*pY_SY$6eLSHy@`ncqv^ zKK%SPo9iul9Y}_NlDX)cS$-Kz&J@-P8?vpPLS@5q;17~}>0gFrwW{%u|Axd3X(wx* zj^;0{$yQEh4Do&xKO}cKb@kB0<4bD!r8$8*=-+JUqu4xl`(8bUW1xjLWDCU-Nz9}#?A-FD13#<%Ws3{ zp!TZiOUa#SrxJ}C&r^&E5N;;vkOkD}1_gC!!f&*>Izl>>_b=U}t((op`n!%NyZp z@~3h+%IFA?n&k3FCVby}je{=f&!!{;jBgkE9bPj3CubRC9F|@MNE%bP0m2j%&IxvW z`)E|0_v8-$n1B-_`P1AM6r!tCnpg75*x_pv7MG>s!cRYN8vv3 zJpRb&Q!Orr6zHFcy`*t%NK0aOhGZ#u@rWnKmzY>thFykl9=~#=SBDo)lekq5tlcF&+$V(2Na=41K zma#VDn@htM@GP>%eQ0{mc6))Qi{aWt?4k{t7p}Y7e*}ulK)wjlW2`kK5%WnYOI`xe z5%SJ6*eZf+(F+qR1Zh)NPa6EO8b5Tv=a+^I*_?r9;)oB&LO7aIALPIP-zK3w0l$nl zMQ`TIQCNp2*=XvQ!>0enk)7f8FnAI$A5GuGvlhK6SRDTWYOmmbgWlD4c7T}vU7hC( z#?ZBiNty&3t_=DjdaQODfd$Z$+cN6i9eK9G~7`HDmhnEOLAF!N;rIQ4*IeXDURl%lU^e(V;Qv9*G5Tb2QhZ-?IG2S# zS;I6dStm%;AJ_SpaBOVJTO*U+4U(B=?`Od94EQ&s?eX`=zDdm@d~;dR;R?@AJ1}G< zVhKPm+%?HxhP}r4hll3+f2H6LBx%7x)?fuVk{yqw;FB|{YXiP}1-v!?EWp3qeERff9E4YGN0S+90kQf0^xGvKXVJ<@m0DOGqWhDE^n-WMIvw86Wh!*3qmav275w z_hs=6NL~ik;9!jok$;p_IKj4UhOJi$LoTOD0HldN56Y2(jVg+(KEs51fmz*ajDb4bkEng_&N3Ho^#B&jU zMEtl7!bhw8#|emLG4*(ch)sicEH@wR#>YNmiTNS>z`Ds$$?R07LiP~*FZ`{jd1$$q zJ}GN?e{5rIiT7r?%^ro`nmSK5l>LxZBajov7X~WnI~qP%Kz|Nh2Zr&>Pn7!Db;yZi zO@@+pmYvQeHWiKy#AC3=!2P#1tWJ*r1};im5{cM^5O)1{k(2=EabJj+$B_3Su^H&>G)oVv>mHa~LQ!@vt<@gWey^XTz-|o(oP%O0cu}ACS-Y z{av}?Ij{TwatnN;$wCMkQ|OnKOui3)R`Sw+^KNi*Tz@f977C6sOl77mVMD#fw;h71G@XDy4S0`1eol@0F1lxe z9dKpKZb`-{)7wK|8+|qmb$Ah|_gFNB2&Y$G7)X6GQiJ>+>A=4GC5<3GNbM)$QI04B}rcFVkxFmfy-&{M1+z=lnb_v3TkVgacv&5mn zH{`@duK`BE-eJQ{r{*f0iD-5N&JSQ)`XnM}HtQ34wLLg{5nMuYdoUM7en}qe1lADG zO_7)UgEm|>e3FU|{P(qr#funMENZq`^dp;)Y=pZyd7j!dJwaksRv{#T4@4u0Ede9YGz5>c3m~e=CM0RdyN5qF%?j8lOe6og z#cQHV!cy-D*S|AU7Po{!5Y&Y5FN!Bx(g5Od@#}j?lGendK(wF1O0Z5-yO*4+SvC#&OT4K5xFM6kMZ8 zB?^krWDUAsYT=Uvkh_WIg~0YU#2}h@jH{HB=E@Olz@fxGlAj_R*S|Q8C2<}2?`tVY zURjgQ=p8A_%&s=zi%iXO@R-GQFZyN;{R9vEieXn9APrnm@V%ubRoL`Sv?)*zvTN-4 z9(co&%du<8N*bS=Uez7lGo12s7Ci;UOU|S%C@DyFW~*3)K8G>GGu9~LmtoBehJooI zScHqSloc0$4!clSsqxEwYWe%3uIKQLv3_wvb6zzdtWMM8khHQ363r4qQPdW~`4s*_ zmwYwcLSv=5iTULa4QtT6w>eT_mnQ!kz6#`TrHAA_eZs@bW#v&G zOrPB3NS>0Hh}a)&&pd)nNS3r>9VhV>_AN*xGYso7bp_k$9&-GW#!spvhB&xHw@uUo z>(Q`0T-(T7#TtjbO6MOJr4xm*NqR%$1V$JE-%74mSR8> zW>=DpByO~Z@o0FEHJ#W1BYR6M2aR&D`zXW$dD^;2-B_!+0AD-XZA0oZ`dE1+f_Et# zQ>lGJ?Ho7#&*G?H34)Fs)eMRclGK>ul#sQ+wv7eL;W`gN?u!dUxIPmW%{0i!AUR2HMZ--bCu3E_u19PKu@bDG#Qw%N4V28Y zBQ0Y?q=R%m%{x=`jENtTSCd#H^!51vSY3MZn&6wD`~MJ>8x)K}j|<^&)(eJeiEjWg z$s1y~(XZi8z##nDT~{k~zZA4VuH&!IfO)AsOuT_L9A`YEEl+iK@D)5lqHY8OLCFvZ z7E^c-y-=_QiY;RYU5v1lcI^9kjX?HtkR_P}OAatSBS;$4t_zHk`i%V&EJJK?Fy`sT zI3t)(`H`vX3tuYY4XAy=@=H5>y|Gv7^BPHX9Am7}4D>>*!8TMl8fIdzM>PO?2x~Nr z_-os?pZFX~VT(Vti#m+Dl+?FmGc(cG(&rgGJ<(g}{n|4Mc9QUkB^hLgJd7cJLGpxi zTTJqH^si2eD-I+zh~FhQD)};`}+%7mI)yYdp-7g0DmjNS^vj!|d z+;a~j9!hr{e?wHk8l0y2B4WWM6-EjC+s!$W{CC#uI86?qFM%f`jgq3@wfdvPYSW_~ zwF!w!vXXN|@7KGslQ1L{WtZUyo@9ViBYVf)Za+#Rq5_W7jl7#2_XMpsW73_ylQWDac?4U4%EF^il<93zC z_W{yD_$3`7Y{+o!@x8?t1m4Exr_@}ZuqRRb2YocTZW{JteYX>CO1zSXgtU-MXYE7J zLUB}9F@iZ5syDiq0k5)tQ(T9Y7J_}?P~ugo%ZYu9CM&RGQzt3H>cOy*wqP5u9vs=! z&*$X@FWkQS-!gM-gY+jvOGyes{{qA4 zeI%aKauwQc_0mV8mj?N>+OGI|1 z$yr0Q($*-44V_#u)1R}s|CKw$qT9(#)qBkkI64HIPzC)V{{Z2(LdRf6th8JSe|?%;Qk%#q~eg9fxIFt{j7jzgB7obsFV??unUv-qfncTV*VK5 z0DKb|CL;Q0+hs$1r>U3Rv1=cZ!Y1U+h9@L>*MbdI34cka*5f)v(MfC21-%1>8aO&h zWmxSX?!%C$Ab7>oASV5ckU{>}MFm$v@;LrqNsc?a7zuH#^heo2+A$ zz$>|mzpND9|2mNnhQKI_vQqq%Ci#uv1pbMpduh^}m5803Bd;xWrHK7&Lp{g#%Wpdo z+1c=y$DYfHT%@rifcl}JXSB>oM4E-7t}6a9tm5QOqxK^CJ2lvnSVEtNXHmGCv*JN6DFRG`l4qt2NCf z>w@ubgJ&)NHssBvkEas}r)j#)CRV{*n(VTv!%`s0N6uaRP4G{(U9_~Alfmn0{1?fa zPEI|VMuW2}_HYKgLT+2)v#?h)z-eOV{ICD~1XD?rBxaSNnPf4(zNTNMc!r&f=B8^Xi&DX<k$5?-=8QFxJc!>WJNAXTuT(x^w+$82>%Ye~Sty#H6dMxDP9Y=1Ohm6q!%h@Oq_{LovdwTd zI0eF%_~sbbA?z)zm()k5PI3vJtoZJblNr9ItRH#~9>e;@T8~502f{#-Z(D<ajl5~h+T2Qc&WXUOVViK=H>;nx`k(UIYU$UFB1D={T$Th323pO=< zK6xvA8-r{oWVa!C;`>DPIo4XrPvS{N`WR9V(k7IhOYUIj5rXPe*dy3ycW{Yn$Q#CJ zAF$J6w8bGDFsnA+qCdO588Ksg22cf`1CTngaO( z^2)O|;_E?u3*yJIC0nt(ps$9rIeJt*9}I$A5`*HuSn1hW2$DKd*bM!m6+2lBi+!2A zo_+^-7hfg@3xumab&@2$ug;eh_|DSw8hMSuvNV@u(I;w>qB#8$+Jf8JK`L}F#g8b= z&XR0qZO8Y(E@o$dH^#Waz&?$CBB0nT`39M$U z6ZU=0Leqh)`wab+{HWwfPO}afPgec>T4F1nN1|jPs}98TvELA@Me#h=bnN{Q_F+|K zuw>Zt*-559$vt%ax?t1oqBAqrwuC*~$!5&%wSw-2cuihdGZ(hR)@0}q8`QW&oPQJi^j z4)%qeFX!293w#4Gm)g!Nva{e)Bbe>Az*?H@g!ndt`K68RJR}1yCce=46ps^z>;Hs+ zqyT~MO!f);533?O8^RF7AqYbE%TC*g>{i5k63>V4FPi=X)*|<;9q~u76P%Ks=97LO zUu{mt_b->?LNK1)d}o04V0=jCusSfr6^gRp`$@sIU<5m`ztQ{`IEi>&a2bS2s5^y! z7P;Zke=yV@?4RIgbw<)S;QQ(sLX%K-L^nu`M&WO3^oX5Ahg{Oj@C^C|;t9xoOuRhx zjlr2Ts720mxVp2llQWW`(z4zg-xPA^GL&DU={qW~ajrGb2(UiM)$rxzG?GAi34#X@ zj>cX|@dp~0#1~u!6U#~z_!FB`B;1L#p0w!p_kX=UuhB~*J+Xj zBFT7k$=_xVWRT|ylx zNf@S*)PSU(=@E^v82+LZrSxU+>_~%1=+SHdxz9rwT>3$t+Uip>NHI2fU(2}95c^4v zrxL`H`~=(Dgp-)Q8-(*&71`+t{FT_bKD<3_1ga^FuQs`UNoVy}@a4Bl)QCnm=~0GZ zn=!~IIKAjqh|kb>)PMcYD};84p~O&s6paQ;1TCSq6RY$v5CZie2Fq<%I?Pl)PU{2IF)Yz?MCItlWl zknLmu$#H59lG6jf%hv=TwjBF0`I5xMGs8JTZ!z}M{5`?#thKB*5KN<41}E3m6`$lV z1$oIWU?lS8wIi4QjiC}-?nU(QHoRhss9Vj7${ialN$zI2 zj;zPz#see4&w#f0dB9e-tpD~rB`qIDEs;4%cVgMZP7qi;p8 zYK=ttkrkW#w=~Ic^(c=wQ#jn&keM7f(&7+Sr)ePmSNNM#@CE!u zEDNzacKl-@UQA9Z>I#9WX(rj`fU6q*1n@j0FC*B9cu``Tu)l*-Li0kn0)>enmi#t? zJNP7tz+{j})>CwuT}@(u_2!GruKco&_#XzH#3}&aDDtL+_cjV}--#WxCcZm?w?}+; z*62ZrGQ0PB!)0-giRZmp&OI-jH%u+};}G5u_1(>rczgACUk(*?`DH*dZ zk9J27I#$jd#T#|BJ9ea?H9_vmK^bPca|OK#a!2wmo9QkTGN@pGcX)5j`R;aZ@9_oh z@&Vr1i`@ldcw20DFN)(Wecs(LwfDwXcbr(^JG5xtv|EcL6`OW%@68o4;AU}emudk~ z6L^z%4v6XYcJC5UIi)wwjDU@iy}g$Qj0x?{yguMa7Vocn0T;u08ERZu@3>C^xnl*j z4Hvj5sAc%T^g$Ib1cdXtBLtod6SU-0K(wF?odTi+O&k~yGU!K)zzE){F#}Tsc=yK+ zj2P&>7%wnP!XW1[ge,xe]-0/0/[0-9]1)。トークン " +"{module}が存在する場合、新しいモジュールを作成する際に、自動的に位置の値に置き換えられます。" #: netbox/dcim/forms/model_forms.py:1094 msgid "Console port template" @@ -9131,129 +9134,129 @@ msgstr "L2VPN のエクスポート" msgid "Exporting L2VPN (identifier)" msgstr "L2VPN (識別子) のエクスポート" -#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:281 +#: netbox/ipam/filtersets.py:155 netbox/ipam/filtersets.py:283 #: netbox/ipam/forms/model_forms.py:229 netbox/ipam/tables/ip.py:212 #: netbox/templates/ipam/prefix.html:12 msgid "Prefix" msgstr "プレフィックス" #: netbox/ipam/filtersets.py:159 netbox/ipam/filtersets.py:198 -#: netbox/ipam/filtersets.py:221 +#: netbox/ipam/filtersets.py:223 msgid "RIR (ID)" msgstr "RIR (ID)" #: netbox/ipam/filtersets.py:165 netbox/ipam/filtersets.py:204 -#: netbox/ipam/filtersets.py:227 +#: netbox/ipam/filtersets.py:229 msgid "RIR (slug)" msgstr "RIR (slug)" -#: netbox/ipam/filtersets.py:285 +#: netbox/ipam/filtersets.py:287 msgid "Within prefix" msgstr "プレフィックス内" -#: netbox/ipam/filtersets.py:289 +#: netbox/ipam/filtersets.py:291 msgid "Within and including prefix" msgstr "プレフィックス内およびプレフィックスを含む" -#: netbox/ipam/filtersets.py:293 +#: netbox/ipam/filtersets.py:295 msgid "Prefixes which contain this prefix or IP" msgstr "このプレフィックス / IP を含むプレフィックス" -#: netbox/ipam/filtersets.py:304 netbox/ipam/filtersets.py:572 +#: netbox/ipam/filtersets.py:306 netbox/ipam/filtersets.py:574 #: netbox/ipam/forms/bulk_edit.py:343 netbox/ipam/forms/filtersets.py:196 #: netbox/ipam/forms/filtersets.py:331 msgid "Mask length" msgstr "マスクの長さ" -#: netbox/ipam/filtersets.py:373 netbox/vpn/filtersets.py:427 +#: netbox/ipam/filtersets.py:375 netbox/vpn/filtersets.py:427 msgid "VLAN (ID)" msgstr "VLAN (ID)" -#: netbox/ipam/filtersets.py:377 netbox/vpn/filtersets.py:422 +#: netbox/ipam/filtersets.py:379 netbox/vpn/filtersets.py:422 msgid "VLAN number (1-4094)" msgstr "VLAN 番号 (1-4094)" -#: netbox/ipam/filtersets.py:471 netbox/ipam/filtersets.py:475 -#: netbox/ipam/filtersets.py:567 netbox/ipam/forms/model_forms.py:496 +#: netbox/ipam/filtersets.py:473 netbox/ipam/filtersets.py:477 +#: netbox/ipam/filtersets.py:569 netbox/ipam/forms/model_forms.py:496 #: netbox/templates/tenancy/contact.html:53 #: netbox/tenancy/forms/bulk_edit.py:113 msgid "Address" msgstr "アドレス" -#: netbox/ipam/filtersets.py:479 +#: netbox/ipam/filtersets.py:481 msgid "Ranges which contain this prefix or IP" msgstr "このプレフィックス / IP を含む範囲" -#: netbox/ipam/filtersets.py:507 netbox/ipam/filtersets.py:563 +#: netbox/ipam/filtersets.py:509 netbox/ipam/filtersets.py:565 msgid "Parent prefix" msgstr "親プレフィックス" -#: netbox/ipam/filtersets.py:616 netbox/ipam/filtersets.py:856 -#: netbox/ipam/filtersets.py:1131 netbox/vpn/filtersets.py:385 +#: netbox/ipam/filtersets.py:618 netbox/ipam/filtersets.py:858 +#: netbox/ipam/filtersets.py:1133 netbox/vpn/filtersets.py:385 msgid "Virtual machine (name)" msgstr "仮想マシン (名前)" -#: netbox/ipam/filtersets.py:621 netbox/ipam/filtersets.py:861 -#: netbox/ipam/filtersets.py:1125 netbox/virtualization/filtersets.py:282 +#: netbox/ipam/filtersets.py:623 netbox/ipam/filtersets.py:863 +#: netbox/ipam/filtersets.py:1127 netbox/virtualization/filtersets.py:282 #: netbox/virtualization/filtersets.py:321 netbox/vpn/filtersets.py:390 msgid "Virtual machine (ID)" msgstr "仮想マシン (ID)" -#: netbox/ipam/filtersets.py:627 netbox/vpn/filtersets.py:97 +#: netbox/ipam/filtersets.py:629 netbox/vpn/filtersets.py:97 #: netbox/vpn/filtersets.py:396 msgid "Interface (name)" msgstr "インタフェース (名前)" -#: netbox/ipam/filtersets.py:638 netbox/vpn/filtersets.py:108 +#: netbox/ipam/filtersets.py:640 netbox/vpn/filtersets.py:108 #: netbox/vpn/filtersets.py:407 msgid "VM interface (name)" msgstr "VM インタフェース (名前)" -#: netbox/ipam/filtersets.py:643 netbox/vpn/filtersets.py:113 +#: netbox/ipam/filtersets.py:645 netbox/vpn/filtersets.py:113 msgid "VM interface (ID)" msgstr "VM インタフェース (ID)" -#: netbox/ipam/filtersets.py:648 +#: netbox/ipam/filtersets.py:650 msgid "FHRP group (ID)" msgstr "FHRP グループ (ID)" -#: netbox/ipam/filtersets.py:652 +#: netbox/ipam/filtersets.py:654 msgid "Is assigned to an interface" msgstr "インタフェースに割り当てられているか" -#: netbox/ipam/filtersets.py:656 +#: netbox/ipam/filtersets.py:658 msgid "Is assigned" msgstr "割当済みか" -#: netbox/ipam/filtersets.py:668 +#: netbox/ipam/filtersets.py:670 msgid "Service (ID)" msgstr "サービス (ID)" -#: netbox/ipam/filtersets.py:673 +#: netbox/ipam/filtersets.py:675 msgid "NAT inside IP address (ID)" msgstr "NAT 内部の IP アドレス (ID)" -#: netbox/ipam/filtersets.py:1041 netbox/ipam/forms/bulk_import.py:322 +#: netbox/ipam/filtersets.py:1043 netbox/ipam/forms/bulk_import.py:322 msgid "Assigned interface" msgstr "割当インタフェース" -#: netbox/ipam/filtersets.py:1046 +#: netbox/ipam/filtersets.py:1048 msgid "Assigned VM interface" msgstr "割り当てられた VM インターフェイス" -#: netbox/ipam/filtersets.py:1136 +#: netbox/ipam/filtersets.py:1138 msgid "IP address (ID)" msgstr "IP アドレス (ID)" -#: netbox/ipam/filtersets.py:1142 netbox/ipam/models/ip.py:788 +#: netbox/ipam/filtersets.py:1144 netbox/ipam/models/ip.py:788 msgid "IP address" msgstr "IP アドレス" -#: netbox/ipam/filtersets.py:1167 +#: netbox/ipam/filtersets.py:1169 msgid "Primary IPv4 (ID)" msgstr "プライマリ IPv4 (ID)" -#: netbox/ipam/filtersets.py:1172 +#: netbox/ipam/filtersets.py:1174 msgid "Primary IPv6 (ID)" msgstr "プライマリ IPv6 (ID)" @@ -9477,11 +9480,11 @@ msgstr "割当デバイスのプライマリ IP アドレスにする" #: netbox/ipam/forms/bulk_import.py:330 msgid "Is out-of-band" -msgstr "" +msgstr "帯域外" #: netbox/ipam/forms/bulk_import.py:331 msgid "Designate this as the out-of-band IP address for the assigned device" -msgstr "" +msgstr "これを、割当デバイスの帯域外 IP アドレスとして指定します。" #: netbox/ipam/forms/bulk_import.py:371 msgid "No device or virtual machine specified; cannot set as primary IP" @@ -9489,11 +9492,11 @@ msgstr "デバイスまたは仮想マシンが指定されていないため、 #: netbox/ipam/forms/bulk_import.py:375 msgid "No device specified; cannot set as out-of-band IP" -msgstr "" +msgstr "デバイスが指定されていないため、帯域外IP として設定できません" #: netbox/ipam/forms/bulk_import.py:379 msgid "Cannot set out-of-band IP for virtual machines" -msgstr "" +msgstr "仮想マシンには帯域外 IP を設定できません" #: netbox/ipam/forms/bulk_import.py:383 msgid "No interface specified; cannot set as primary IP" @@ -9501,7 +9504,7 @@ msgstr "インタフェースが指定されていないため、プライマリ #: netbox/ipam/forms/bulk_import.py:387 msgid "No interface specified; cannot set as out-of-band IP" -msgstr "" +msgstr "インターフェイスが指定されていないため、帯域外IP として設定できません" #: netbox/ipam/forms/bulk_import.py:422 msgid "Auth type" @@ -9678,7 +9681,7 @@ msgstr "デバイス/VMのプライマリIPにする" #: netbox/ipam/forms/model_forms.py:314 msgid "Make this the out-of-band IP for the device" -msgstr "" +msgstr "これをデバイスの帯域外IPにする" #: netbox/ipam/forms/model_forms.py:329 msgid "NAT IP (Inside)" @@ -9690,11 +9693,11 @@ msgstr "IP アドレスは 1 つのオブジェクトにのみ割り当てるこ #: netbox/ipam/forms/model_forms.py:398 msgid "Cannot reassign primary IP address for the parent device/VM" -msgstr "" +msgstr "親デバイス/VMのプライマリ IP アドレスを再割り当てできません" #: netbox/ipam/forms/model_forms.py:402 msgid "Cannot reassign out-of-Band IP address for the parent device" -msgstr "" +msgstr "親デバイスに帯域外IP アドレスを再割り当てできません" #: netbox/ipam/forms/model_forms.py:412 msgid "" @@ -9705,7 +9708,7 @@ msgstr "プライマリ IP として指定できるのは、インタフェー msgid "" "Only IP addresses assigned to a device interface can be designated as the " "out-of-band IP for a device." -msgstr "" +msgstr "デバイスの帯域外 IP として指定できるのは、デバイスインタフェイスに割り当てられた IP アドレスのみです。" #: netbox/ipam/forms/model_forms.py:508 msgid "Virtual IP Address" @@ -10087,19 +10090,19 @@ msgstr "scope_typeなしでscope_idを設定することはできません。" #: netbox/ipam/models/vlans.py:105 #, python-brace-format msgid "Starting VLAN ID in range ({value}) cannot be less than {minimum}" -msgstr "" +msgstr "範囲の開始 VLAN ID ({value}) は{minimum}以下であってはなりません " #: netbox/ipam/models/vlans.py:111 #, python-brace-format msgid "Ending VLAN ID in range ({value}) cannot exceed {maximum}" -msgstr "" +msgstr "範囲の終了 VLAN ID ({value}) は{maximum}を超えることはできません " #: netbox/ipam/models/vlans.py:118 #, python-brace-format msgid "" "Ending VLAN ID in range must be greater than or equal to the starting VLAN " "ID ({range})" -msgstr "" +msgstr "範囲の終了 VLAN ID は、開始 VLAN ID ({range})以上である必要があります" #: netbox/ipam/models/vlans.py:124 msgid "Ranges cannot overlap." @@ -12434,11 +12437,11 @@ msgstr "ダウンロード" #: netbox/templates/dcim/device/render_config.html:64 #: netbox/templates/virtualization/virtualmachine/render_config.html:64 msgid "Error rendering template" -msgstr "" +msgstr "エラーレンダリングテンプレート" #: netbox/templates/dcim/device/render_config.html:70 msgid "No configuration template has been assigned for this device." -msgstr "" +msgstr "このデバイスには設定テンプレートが割り当てられていません。" #: netbox/templates/dcim/device_edit.html:44 msgid "Parent Bay" @@ -14091,7 +14094,7 @@ msgstr "仮想ディスクを追加" #: netbox/templates/virtualization/virtualmachine/render_config.html:70 msgid "No configuration template has been assigned for this virtual machine." -msgstr "" +msgstr "このVMには構成テンプレートが割り当てられていません。" #: netbox/templates/vpn/ikepolicy.html:10 #: netbox/templates/vpn/ipsecprofile.html:33 netbox/vpn/tables/crypto.py:166 @@ -15323,19 +15326,19 @@ msgstr "GRE" #: netbox/vpn/choices.py:39 msgid "WireGuard" -msgstr "" +msgstr "WireGuard" #: netbox/vpn/choices.py:40 msgid "OpenVPN" -msgstr "" +msgstr "OpenVPN" #: netbox/vpn/choices.py:41 msgid "L2TP" -msgstr "" +msgstr "L2TP" #: netbox/vpn/choices.py:42 msgid "PPTP" -msgstr "" +msgstr "PPTP" #: netbox/vpn/choices.py:64 msgid "Hub" From f03489f58ee6452f9b0c60d84364f0c67c96b41e Mon Sep 17 00:00:00 2001 From: Thor Selmer Dreier-Hansen <43479811+thordreier@users.noreply.github.com> Date: Fri, 27 Dec 2024 21:11:51 +0100 Subject: [PATCH 110/169] Add distinct() to filtering VLANs by assigned interface (#18274) --- netbox/ipam/filtersets.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/netbox/ipam/filtersets.py b/netbox/ipam/filtersets.py index 033f0a4dc..f65aba407 100644 --- a/netbox/ipam/filtersets.py +++ b/netbox/ipam/filtersets.py @@ -1080,7 +1080,7 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): return queryset.filter( Q(interfaces_as_tagged=value) | Q(interfaces_as_untagged=value) - ) + ).distinct() def filter_vminterface_id(self, queryset, name, value): if value is None: @@ -1088,7 +1088,7 @@ class VLANFilterSet(NetBoxModelFilterSet, TenancyFilterSet): return queryset.filter( Q(vminterfaces_as_tagged=value) | Q(vminterfaces_as_untagged=value) - ) + ).distinct() class ServiceTemplateFilterSet(NetBoxModelFilterSet): From 0cda10a204247993b39f50e5ec9564ec46c87c3d Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 30 Dec 2024 12:36:46 -0500 Subject: [PATCH 111/169] Fixes: #18203 - Validate that scope is selected if scope type is specified (#18254) * Validate that a scope has been selected if a scope_type is specified, on CachedScopeMixin models * Cleaner logic * Call super().clean() after validating scope_type/scope --- netbox/dcim/models/mixins.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/netbox/dcim/models/mixins.py b/netbox/dcim/models/mixins.py index ac4d7dab9..a0fc15a25 100644 --- a/netbox/dcim/models/mixins.py +++ b/netbox/dcim/models/mixins.py @@ -1,6 +1,8 @@ from django.apps import apps from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ValidationError from django.db import models +from django.utils.translation import gettext_lazy as _ from dcim.constants import LOCATION_SCOPE_TYPES __all__ = ( @@ -84,6 +86,16 @@ class CachedScopeMixin(models.Model): class Meta: abstract = True + def clean(self): + if self.scope_type and not self.scope: + scope_type = self.scope_type.model_class() + raise ValidationError({ + 'scope': _( + "Please select a {scope_type}." + ).format(scope_type=scope_type._meta.model_name) + }) + super().clean() + def save(self, *args, **kwargs): # Cache objects associated with the terminating object (for filtering) self.cache_related_objects() From 6f4bec76449c37c484221d0e1a1829f323c99f37 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 30 Dec 2024 12:45:08 -0500 Subject: [PATCH 112/169] Fixes #18278: Restore missing columns on MACAddressTable --- netbox/dcim/tables/devices.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 963150a7a..087132331 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -1155,6 +1155,7 @@ class MACAddressTable(NetBoxTable): class Meta(DeviceComponentTable.Meta): model = models.MACAddress fields = ( - 'pk', 'id', 'mac_address', 'assigned_object_parent', 'assigned_object', 'created', 'last_updated', + 'pk', 'id', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description', 'comments', 'tags', + 'created', 'last_updated', ) - default_columns = ('pk', 'mac_address', 'assigned_object_parent', 'assigned_object') + default_columns = ('pk', 'mac_address', 'assigned_object_parent', 'assigned_object', 'description') From 10748edc3a5e977bea264d5460466e14f01ee508 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 27 Dec 2024 12:17:17 -0500 Subject: [PATCH 113/169] Fixes #18222: Include action data from event rule in webhook and custom script data --- docs/models/extras/eventrule.md | 14 +++++++++++++- netbox/extras/events.py | 12 ++++++++---- netbox/extras/tests/test_event_rules.py | 16 +++++++++++++--- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/docs/models/extras/eventrule.md b/docs/models/extras/eventrule.md index b48e17a1e..9dca04529 100644 --- a/docs/models/extras/eventrule.md +++ b/docs/models/extras/eventrule.md @@ -10,7 +10,7 @@ See the [event rules documentation](../../features/event-rules.md) for more inf A unique human-friendly name. -### Content Types +### Object Types The type(s) of object in NetBox that will trigger the rule. @@ -38,3 +38,15 @@ The event types which will trigger the rule. At least one event type must be sel ### Conditions A set of [prescribed conditions](../../reference/conditions.md) against which the triggering object will be evaluated. If the conditions are defined but not met by the object, no action will be taken. An event rule that does not define any conditions will _always_ trigger. + +### Action Type + +The type of action to take when the rule triggers. This must be one of the following choices: + +* Webhook +* Custom script +* Notification + +### Action Data + +An optional dictionary of JSON data to pass when executing the rule. This can be useful to include additional context data, e.g. when transmitting a webhook. diff --git a/netbox/extras/events.py b/netbox/extras/events.py index f13a3b48f..95170e18d 100644 --- a/netbox/extras/events.py +++ b/netbox/extras/events.py @@ -90,6 +90,10 @@ def process_event_rules(event_rules, object_type, event_type, data, username=Non if not event_rule.eval_conditions(data): continue + # Compile event data + event_data = event_rule.action_data or {} + event_data.update(data) + # Webhooks if event_rule.action_type == EventRuleActionChoices.WEBHOOK: @@ -102,7 +106,7 @@ def process_event_rules(event_rules, object_type, event_type, data, username=Non "event_rule": event_rule, "model_name": object_type.model, "event_type": event_type, - "data": data, + "data": event_data, "snapshots": snapshots, "timestamp": timezone.now().isoformat(), "username": username, @@ -130,7 +134,7 @@ def process_event_rules(event_rules, object_type, event_type, data, username=Non instance=event_rule.action_object, name=script.name, user=user, - data=data + data=event_data ) # Notification groups @@ -138,8 +142,8 @@ def process_event_rules(event_rules, object_type, event_type, data, username=Non # Bulk-create notifications for all members of the notification group event_rule.action_object.notify( object_type=object_type, - object_id=data['id'], - object_repr=data.get('display'), + object_id=event_data['id'], + object_repr=event_data.get('display'), event_type=event_type ) diff --git a/netbox/extras/tests/test_event_rules.py b/netbox/extras/tests/test_event_rules.py index 7f7b0b81f..2565e5bde 100644 --- a/netbox/extras/tests/test_event_rules.py +++ b/netbox/extras/tests/test_event_rules.py @@ -50,21 +50,24 @@ class EventRuleTest(APITestCase): event_types=[OBJECT_CREATED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, - action_object_id=webhooks[0].id + action_object_id=webhooks[0].id, + action_data={"foo": 1}, ), EventRule( name='Event Rule 2', event_types=[OBJECT_UPDATED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, - action_object_id=webhooks[0].id + action_object_id=webhooks[0].id, + action_data={"foo": 2}, ), EventRule( name='Event Rule 3', event_types=[OBJECT_DELETED], action_type=EventRuleActionChoices.WEBHOOK, action_object_type=webhook_type, - action_object_id=webhooks[0].id + action_object_id=webhooks[0].id, + action_data={"foo": 3}, ), )) for event_rule in event_rules: @@ -134,6 +137,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_CREATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data['id']) + self.assertEqual(job.kwargs['data']['foo'], 1) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data['tags'])) self.assertEqual(job.kwargs['snapshots']['postchange']['name'], 'Site 1') self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Bar', 'Foo']) @@ -184,6 +188,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_CREATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], response.data[i]['id']) + self.assertEqual(job.kwargs['data']['foo'], 1) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data[i]['tags'])) self.assertEqual(job.kwargs['snapshots']['postchange']['name'], response.data[i]['name']) self.assertEqual(job.kwargs['snapshots']['postchange']['tags'], ['Bar', 'Foo']) @@ -215,6 +220,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_UPDATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) + self.assertEqual(job.kwargs['data']['foo'], 2) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data['tags'])) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], 'Site 1') self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) @@ -271,6 +277,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_UPDATED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], data[i]['id']) + self.assertEqual(job.kwargs['data']['foo'], 2) self.assertEqual(len(job.kwargs['data']['tags']), len(response.data[i]['tags'])) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], sites[i].name) self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) @@ -297,6 +304,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_DELETED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], site.pk) + self.assertEqual(job.kwargs['data']['foo'], 3) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], 'Site 1') self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) @@ -330,6 +338,7 @@ class EventRuleTest(APITestCase): self.assertEqual(job.kwargs['event_type'], OBJECT_DELETED) self.assertEqual(job.kwargs['model_name'], 'site') self.assertEqual(job.kwargs['data']['id'], sites[i].pk) + self.assertEqual(job.kwargs['data']['foo'], 3) self.assertEqual(job.kwargs['snapshots']['prechange']['name'], sites[i].name) self.assertEqual(job.kwargs['snapshots']['prechange']['tags'], ['Bar', 'Foo']) @@ -358,6 +367,7 @@ class EventRuleTest(APITestCase): self.assertEqual(body['username'], 'testuser') self.assertEqual(body['request_id'], str(request_id)) self.assertEqual(body['data']['name'], 'Site 1') + self.assertEqual(body['data']['foo'], 1) return HttpResponse() From b9abb3200c3d637e86af126e3ca70da1e362b6c7 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 27 Dec 2024 10:44:23 -0500 Subject: [PATCH 114/169] Fixes #18271: Require only encryption OR authentication algorithm when creating an IPSec proposal via REST API --- netbox/vpn/api/serializers_/crypto.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/netbox/vpn/api/serializers_/crypto.py b/netbox/vpn/api/serializers_/crypto.py index c11b8de2b..dac3bc519 100644 --- a/netbox/vpn/api/serializers_/crypto.py +++ b/netbox/vpn/api/serializers_/crypto.py @@ -64,10 +64,12 @@ class IKEPolicySerializer(NetBoxModelSerializer): class IPSecProposalSerializer(NetBoxModelSerializer): encryption_algorithm = ChoiceField( - choices=EncryptionAlgorithmChoices + choices=EncryptionAlgorithmChoices, + required=False ) authentication_algorithm = ChoiceField( - choices=AuthenticationAlgorithmChoices + choices=AuthenticationAlgorithmChoices, + required=False ) class Meta: From e8e3981da53fa5cdfe82a742c8d15e31679a3e1f Mon Sep 17 00:00:00 2001 From: bctiemann Date: Fri, 3 Jan 2025 12:35:04 -0500 Subject: [PATCH 115/169] Fixes: #18289 - Add 'created' and 'last_updated' fields to ModuleTypeTable (#18292) * Add 'created' and 'last_updated' fields to ModuleTypeTable for consistency * Add 'created' and 'last_updated' fields to ModuleTable for consistency --- netbox/dcim/tables/modules.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/tables/modules.py b/netbox/dcim/tables/modules.py index 5b06e08b2..6bd0d53b5 100644 --- a/netbox/dcim/tables/modules.py +++ b/netbox/dcim/tables/modules.py @@ -41,6 +41,7 @@ class ModuleTypeTable(NetBoxTable): model = ModuleType fields = ( 'pk', 'id', 'model', 'manufacturer', 'part_number', 'airflow', 'weight', 'description', 'comments', 'tags', + 'created', 'last_updated', ) default_columns = ( 'pk', 'model', 'manufacturer', 'part_number', @@ -79,7 +80,7 @@ class ModuleTable(NetBoxTable): model = Module fields = ( 'pk', 'id', 'device', 'module_bay', 'manufacturer', 'module_type', 'status', 'serial', 'asset_tag', - 'description', 'comments', 'tags', + 'description', 'comments', 'tags', 'created', 'last_updated', ) default_columns = ( 'pk', 'id', 'device', 'module_bay', 'manufacturer', 'module_type', 'status', 'serial', 'asset_tag', From c3b0de3ebd4ecc85e0eb1453181fb71870997d09 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 3 Jan 2025 13:42:47 -0500 Subject: [PATCH 116/169] Closes #18281: Support group assignment for virtual circuits (#18291) * Rename circuit to member on CircuitGroupAssignment * Support group assignment for virtual circuits * Update release notes * Introduce separate nav menu heading for circuit groups * Add generic relations for group assignments * Remove obsolete code * Clean up bulk import & extend tests --- .../models/circuits/circuitgroupassignment.md | 4 +- docs/release-notes/version-4.2.md | 3 + netbox/circuits/api/serializers_/circuits.py | 21 ++++- netbox/circuits/constants.py | 8 ++ netbox/circuits/filtersets.py | 92 +++++++++++++++---- netbox/circuits/forms/bulk_edit.py | 4 +- netbox/circuits/forms/bulk_import.py | 11 ++- netbox/circuits/forms/filtersets.py | 4 +- netbox/circuits/forms/model_forms.py | 47 +++++++++- netbox/circuits/graphql/types.py | 10 +- .../0051_virtualcircuit_group_assignment.py | 85 +++++++++++++++++ netbox/circuits/models/circuits.py | 37 +++++--- netbox/circuits/models/virtual_circuits.py | 8 ++ netbox/circuits/tables/circuits.py | 12 ++- netbox/circuits/tests/test_api.py | 17 ++-- netbox/circuits/tests/test_filtersets.py | 66 ++++++++++--- netbox/circuits/tests/test_views.py | 24 ++++- netbox/netbox/navigation/menu.py | 9 +- netbox/templates/circuits/circuit.html | 2 +- .../circuits/circuitgroupassignment.html | 6 +- netbox/templates/circuits/virtualcircuit.html | 13 +++ 21 files changed, 403 insertions(+), 80 deletions(-) create mode 100644 netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py diff --git a/docs/models/circuits/circuitgroupassignment.md b/docs/models/circuits/circuitgroupassignment.md index 2aaa375af..c73ba09be 100644 --- a/docs/models/circuits/circuitgroupassignment.md +++ b/docs/models/circuits/circuitgroupassignment.md @@ -8,9 +8,9 @@ Circuits can be assigned to [circuit groups](./circuitgroup.md) for correlation The [circuit group](./circuitgroup.md) being assigned. -### Circuit +### Member -The [circuit](./circuit.md) that is being assigned to the group. +The [circuit](./circuit.md) or [virtual circuit](./virtualcircuit.md) assigned to the group. ### Priority diff --git a/docs/release-notes/version-4.2.md b/docs/release-notes/version-4.2.md index fe138c064..f0ad3766c 100644 --- a/docs/release-notes/version-4.2.md +++ b/docs/release-notes/version-4.2.md @@ -13,6 +13,7 @@ * The `site` and `provider_network` foreign key fields on `circuits.CircuitTermination` have been replaced by the `termination` generic foreign key. * The `site` foreign key field on `ipam.Prefix` has been replaced by the `scope` generic foreign key. * The `site` foreign key field on `virtualization.Cluster` has been replaced by the `scope` generic foreign key. +* The `circuit` foreign key field on `circuits.CircuitGroupAssignment` has been replaced by the `member` generic foreign key. * Obsolete nested REST API serializers have been removed. These were deprecated in NetBox v4.1 under [#17143](https://github.com/netbox-community/netbox/issues/17143). ### New Features @@ -77,6 +78,8 @@ NetBox now supports the designation of customer VLANs (CVLANs) and service VLANs * `/api/ipam/vlan-translation-rules/` * circuits.Circuit * Added the optional `distance` and `distance_unit` fields +* circuits.CircuitGroupAssignment + * Replaced the `circuit` field with `member_type` and `member_id` to support virtual circuit assignment * circuits.CircuitTermination * Removed the `site` & `provider_network` fields * Added the `termination_type` & `termination_id` fields to facilitate termination assignment diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 0365dca33..4f3dc5f35 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -3,7 +3,7 @@ from drf_spectacular.utils import extend_schema_field from rest_framework import serializers from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices, VirtualCircuitTerminationRoleChoices -from circuits.constants import CIRCUIT_TERMINATION_TERMINATION_TYPES +from circuits.constants import CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, CIRCUIT_TERMINATION_TERMINATION_TYPES from circuits.models import ( Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType, VirtualCircuit, VirtualCircuitTermination, @@ -15,7 +15,6 @@ from netbox.api.serializers import NetBoxModelSerializer, WritableNestedSerializ from netbox.choices import DistanceUnitChoices from tenancy.api.serializers_.tenants import TenantSerializer from utilities.api import get_serializer_for_model - from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, ProviderSerializer __all__ = ( @@ -154,14 +153,26 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): - circuit = CircuitSerializer(nested=True) + member_type = ContentTypeField( + queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS) + ) + member = serializers.SerializerMethodField(read_only=True) class Meta: model = CircuitGroupAssignment fields = [ - 'id', 'url', 'display_url', 'display', 'group', 'circuit', 'priority', 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority', 'tags', + 'created', 'last_updated', ] - brief_fields = ('id', 'url', 'display', 'group', 'circuit', 'priority') + brief_fields = ('id', 'url', 'display', 'group', 'member_type', 'member_id', 'member', 'priority') + + @extend_schema_field(serializers.JSONField(allow_null=True)) + def get_member(self, obj): + if obj.member_id is None: + return None + serializer = get_serializer_for_model(obj.member) + context = {'request': self.context['request']} + return serializer(obj.member, nested=True, context=context).data class VirtualCircuitSerializer(NetBoxModelSerializer): diff --git a/netbox/circuits/constants.py b/netbox/circuits/constants.py index 8119bc286..4642c22a3 100644 --- a/netbox/circuits/constants.py +++ b/netbox/circuits/constants.py @@ -1,4 +1,12 @@ +from django.db.models import Q + + # models values for ContentTypes which may be CircuitTermination termination types CIRCUIT_TERMINATION_TERMINATION_TYPES = ( 'region', 'sitegroup', 'site', 'location', 'providernetwork', ) + +CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS = Q( + app_label='circuits', + model__in=['circuit', 'virtualcircuit'] +) diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 825df9558..956e91d76 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -1,4 +1,5 @@ import django_filters +from django.contrib.contenttypes.models import ContentType from django.db.models import Q from django.utils.translation import gettext as _ @@ -7,7 +8,9 @@ from dcim.models import Interface, Location, Region, Site, SiteGroup from ipam.models import ASN from netbox.filtersets import NetBoxModelFilterSet, OrganizationalModelFilterSet from tenancy.filtersets import ContactModelFilterSet, TenancyFilterSet -from utilities.filters import ContentTypeFilter, TreeNodeMultipleChoiceFilter +from utilities.filters import ( + ContentTypeFilter, MultiValueCharFilter, MultiValueNumberFilter, TreeNodeMultipleChoiceFilter, +) from .choices import * from .models import * @@ -365,26 +368,36 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): method='search', label=_('Search'), ) - provider_id = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__provider', - queryset=Provider.objects.all(), - label=_('Provider (ID)'), + member_type = ContentTypeFilter() + circuit = MultiValueCharFilter( + method='filter_circuit', + field_name='cid', + label=_('Circuit (CID)'), ) - provider = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__provider__slug', - queryset=Provider.objects.all(), - to_field_name='slug', - label=_('Provider (slug)'), - ) - circuit_id = django_filters.ModelMultipleChoiceFilter( - queryset=Circuit.objects.all(), + circuit_id = MultiValueNumberFilter( + method='filter_circuit', + field_name='pk', label=_('Circuit (ID)'), ) - circuit = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__cid', - queryset=Circuit.objects.all(), - to_field_name='cid', - label=_('Circuit (CID)'), + virtual_circuit = MultiValueCharFilter( + method='filter_virtual_circuit', + field_name='cid', + label=_('Virtual circuit (CID)'), + ) + virtual_circuit_id = MultiValueNumberFilter( + method='filter_virtual_circuit', + field_name='pk', + label=_('Virtual circuit (ID)'), + ) + provider = MultiValueCharFilter( + method='filter_provider', + field_name='slug', + label=_('Provider (name)'), + ) + provider_id = MultiValueNumberFilter( + method='filter_provider', + field_name='pk', + label=_('Provider (ID)'), ) group_id = django_filters.ModelMultipleChoiceFilter( queryset=CircuitGroup.objects.all(), @@ -399,16 +412,55 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): class Meta: model = CircuitGroupAssignment - fields = ('id', 'priority') + fields = ('id', 'member_id', 'priority') def search(self, queryset, name, value): if not value.strip(): return queryset return queryset.filter( - Q(circuit__cid__icontains=value) | + Q(member__cid__icontains=value) | Q(group__name__icontains=value) ) + def filter_circuit(self, queryset, name, value): + circuits = Circuit.objects.filter(**{f'{name}__in': value}) + if not circuits.exists(): + return queryset.none() + return queryset.filter( + Q( + member_type=ContentType.objects.get_for_model(Circuit), + member_id__in=circuits + ) + ) + + def filter_virtual_circuit(self, queryset, name, value): + virtual_circuits = VirtualCircuit.objects.filter(**{f'{name}__in': value}) + if not virtual_circuits.exists(): + return queryset.none() + return queryset.filter( + Q( + member_type=ContentType.objects.get_for_model(VirtualCircuit), + member_id__in=virtual_circuits + ) + ) + + def filter_provider(self, queryset, name, value): + providers = Provider.objects.filter(**{f'{name}__in': value}) + if not providers.exists(): + return queryset.none() + circuits = Circuit.objects.filter(provider__in=providers) + virtual_circuits = VirtualCircuit.objects.filter(provider_network__provider__in=providers) + return queryset.filter( + Q( + member_type=ContentType.objects.get_for_model(Circuit), + member_id__in=circuits + ) | + Q( + member_type=ContentType.objects.get_for_model(VirtualCircuit), + member_id__in=virtual_circuits + ) + ) + class VirtualCircuitFilterSet(NetBoxModelFilterSet, TenancyFilterSet): provider_id = django_filters.ModelMultipleChoiceFilter( diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 021635a1a..b8e6094f9 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -279,7 +279,7 @@ class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): - circuit = DynamicModelChoiceField( + member = DynamicModelChoiceField( label=_('Circuit'), queryset=Circuit.objects.all(), required=False @@ -292,7 +292,7 @@ class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): model = CircuitGroupAssignment fieldsets = ( - FieldSet('circuit', 'priority'), + FieldSet('member', 'priority'), ) nullable_fields = ('priority',) diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index 7f5ffde6e..428c636b3 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -179,10 +179,19 @@ class CircuitGroupImportForm(NetBoxModelImportForm): class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): + member_type = CSVContentTypeField( + queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS), + label=_('Circuit type (app & model)') + ) + priority = CSVChoiceField( + label=_('Priority'), + choices=CircuitPriorityChoices, + required=False + ) class Meta: model = CircuitGroupAssignment - fields = ('circuit', 'group', 'priority') + fields = ('member_type', 'member_id', 'group', 'priority') class VirtualCircuitImportForm(NetBoxModelImportForm): diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 47ce24d97..1359b7a6a 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -277,14 +277,14 @@ class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): model = CircuitGroupAssignment fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('provider_id', 'circuit_id', 'group_id', 'priority', name=_('Assignment')), + FieldSet('provider_id', 'member_id', 'group_id', 'priority', name=_('Assignment')), ) provider_id = DynamicModelMultipleChoiceField( queryset=Provider.objects.all(), required=False, label=_('Provider') ) - circuit_id = DynamicModelMultipleChoiceField( + member_id = DynamicModelMultipleChoiceField( queryset=Circuit.objects.all(), required=False, label=_('Circuit') diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index e43c37525..94ab4db78 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -251,18 +251,59 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): label=_('Group'), queryset=CircuitGroup.objects.all(), ) - circuit = DynamicModelChoiceField( + member_type = ContentTypeChoiceField( + queryset=ContentType.objects.filter(CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS), + widget=HTMXSelect(), + required=False, + label=_('Circuit type') + ) + member = DynamicModelChoiceField( label=_('Circuit'), - queryset=Circuit.objects.all(), + queryset=Circuit.objects.none(), # Initial queryset + required=False, + disabled=True, selector=True ) + fieldsets = ( + FieldSet('group', 'member_type', 'member', 'priority', 'tags', name=_('Group Assignment')), + ) + class Meta: model = CircuitGroupAssignment fields = [ - 'group', 'circuit', 'priority', 'tags', + 'group', 'member_type', 'priority', 'tags', ] + def __init__(self, *args, **kwargs): + instance = kwargs.get('instance') + initial = kwargs.get('initial', {}) + + if instance is not None and instance.member: + initial['member'] = instance.member + kwargs['initial'] = initial + + super().__init__(*args, **kwargs) + + if member_type_id := get_field_value(self, 'member_type'): + try: + model = ContentType.objects.get(pk=member_type_id).model_class() + self.fields['member'].queryset = model.objects.all() + self.fields['member'].widget.attrs['selector'] = model._meta.label_lower + self.fields['member'].disabled = False + self.fields['member'].label = _(bettertitle(model._meta.verbose_name)) + except ObjectDoesNotExist: + pass + + if self.instance.pk and member_type_id != self.instance.member_type_id: + self.initial['member'] = None + + def clean(self): + super().clean() + + # Assign the selected circuit (if any) + self.instance.member = self.cleaned_data.get('member') + class VirtualCircuitForm(TenancyForm, NetBoxModelForm): provider_network = DynamicModelChoiceField( diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index f2703b207..1cffc8cd4 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -116,12 +116,18 @@ class CircuitGroupType(OrganizationalObjectType): @strawberry_django.type( models.CircuitGroupAssignment, - fields='__all__', + exclude=('member_type', 'member_id'), filters=CircuitGroupAssignmentFilter ) class CircuitGroupAssignmentType(TagsMixin, BaseObjectType): group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')] - circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] + + @strawberry_django.field + def member(self) -> Annotated[Union[ + Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')], + Annotated["VirtualCircuitType", strawberry.lazy('circuits.graphql.types')], + ], strawberry.union("CircuitGroupAssignmentMemberType")] | None: + return self.member @strawberry_django.type( diff --git a/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py new file mode 100644 index 000000000..f8c0fd653 --- /dev/null +++ b/netbox/circuits/migrations/0051_virtualcircuit_group_assignment.py @@ -0,0 +1,85 @@ +import django.db.models.deletion +from django.db import migrations, models + + +def set_member_type(apps, schema_editor): + """ + Set member_type on any existing CircuitGroupAssignments to the content type for Circuit. + """ + ContentType = apps.get_model('contenttypes', 'ContentType') + Circuit = apps.get_model('circuits', 'Circuit') + CircuitGroupAssignment = apps.get_model('circuits', 'CircuitGroupAssignment') + + CircuitGroupAssignment.objects.update( + member_type=ContentType.objects.get_for_model(Circuit) + ) + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0050_virtual_circuits'), + ('contenttypes', '0002_remove_content_type_name'), + ('extras', '0122_charfield_null_choices'), + ] + + operations = [ + migrations.RemoveConstraint( + model_name='circuitgroupassignment', + name='circuits_circuitgroupassignment_unique_circuit_group', + ), + migrations.AlterModelOptions( + name='circuitgroupassignment', + options={'ordering': ('group', 'member_type', 'member_id', 'priority', 'pk')}, + ), + + # Change member_id to an integer field for the member GFK + migrations.RenameField( + model_name='circuitgroupassignment', + old_name='circuit', + new_name='member_id', + ), + migrations.AlterField( + model_name='circuitgroupassignment', + name='member_id', + field=models.PositiveBigIntegerField(), + ), + + # Add content type pointer for the member GFK + migrations.AddField( + model_name='circuitgroupassignment', + name='member_type', + field=models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + limit_choices_to=models.Q(('app_label', 'circuits'), ('model__in', ['circuit', 'virtualcircuit'])), + related_name='+', + to='contenttypes.contenttype', + blank=True, + null=True + ), + preserve_default=False, + ), + + # Populate member_type for any existing assignments + migrations.RunPython(code=set_member_type, reverse_code=migrations.RunPython.noop), + + # Disallow null values for member_type + migrations.AlterField( + model_name='circuitgroupassignment', + name='member_type', + field=models.ForeignKey( + limit_choices_to=models.Q(('app_label', 'circuits'), ('model__in', ['circuit', 'virtualcircuit'])), + on_delete=django.db.models.deletion.PROTECT, + related_name='+', + to='contenttypes.contenttype' + ), + ), + + migrations.AddConstraint( + model_name='circuitgroupassignment', + constraint=models.UniqueConstraint( + fields=('member_type', 'member_id', 'group'), + name='circuits_circuitgroupassignment_unique_member_group' + ), + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 5e910b5d5..8a8e4bdf9 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -1,8 +1,7 @@ from django.apps import apps -from django.contrib.contenttypes.fields import GenericForeignKey +from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation from django.core.exceptions import ValidationError from django.db import models -from django.db.models import Q from django.urls import reverse from django.utils.translation import gettext_lazy as _ @@ -117,6 +116,13 @@ class Circuit(ContactsMixin, ImageAttachmentsMixin, DistanceMixin, PrimaryModel) null=True ) + group_assignments = GenericRelation( + to='circuits.CircuitGroupAssignment', + content_type_field='member_type', + object_id_field='member_id', + related_query_name='circuit' + ) + clone_fields = ( 'provider', 'provider_account', 'type', 'status', 'tenant', 'install_date', 'termination_date', 'commit_rate', 'description', @@ -177,15 +183,23 @@ class CircuitGroup(OrganizationalModel): class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): """ - Assignment of a Circuit to a CircuitGroup with an optional priority. + Assignment of a physical or virtual circuit to a CircuitGroup with an optional priority. """ - circuit = models.ForeignKey( - Circuit, - on_delete=models.CASCADE, - related_name='assignments' + member_type = models.ForeignKey( + to='contenttypes.ContentType', + limit_choices_to=CIRCUIT_GROUP_ASSIGNMENT_MEMBER_MODELS, + on_delete=models.PROTECT, + related_name='+' + ) + member_id = models.PositiveBigIntegerField( + verbose_name=_('member ID') + ) + member = GenericForeignKey( + ct_field='member_type', + fk_field='member_id' ) group = models.ForeignKey( - CircuitGroup, + to='circuits.CircuitGroup', on_delete=models.CASCADE, related_name='assignments' ) @@ -197,16 +211,15 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, null=True ) prerequisite_models = ( - 'circuits.Circuit', 'circuits.CircuitGroup', ) class Meta: - ordering = ('group', 'circuit', 'priority', 'pk') + ordering = ('group', 'member_type', 'member_id', 'priority', 'pk') constraints = ( models.UniqueConstraint( - fields=('circuit', 'group'), - name='%(app_label)s_%(class)s_unique_circuit_group' + fields=('member_type', 'member_id', 'group'), + name='%(app_label)s_%(class)s_unique_member_group' ), ) verbose_name = _('Circuit group assignment') diff --git a/netbox/circuits/models/virtual_circuits.py b/netbox/circuits/models/virtual_circuits.py index ced68c105..04255cd0d 100644 --- a/netbox/circuits/models/virtual_circuits.py +++ b/netbox/circuits/models/virtual_circuits.py @@ -1,5 +1,6 @@ from functools import cached_property +from django.contrib.contenttypes.fields import GenericRelation from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse @@ -50,6 +51,13 @@ class VirtualCircuit(PrimaryModel): null=True ) + group_assignments = GenericRelation( + to='circuits.CircuitGroupAssignment', + content_type_field='member_type', + object_id_field='member_id', + related_query_name='virtual_circuit' + ) + clone_fields = ( 'provider_network', 'provider_account', 'status', 'tenant', 'description', ) diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index dedb1534b..ed9ecde2e 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -188,11 +188,14 @@ class CircuitGroupAssignmentTable(NetBoxTable): linkify=True ) provider = tables.Column( - accessor='circuit__provider', + accessor='member__provider', verbose_name=_('Provider'), linkify=True ) - circuit = tables.Column( + member_type = columns.ContentTypeColumn( + verbose_name=_('Type') + ) + member = tables.Column( verbose_name=_('Circuit'), linkify=True ) @@ -206,6 +209,7 @@ class CircuitGroupAssignmentTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = CircuitGroupAssignment fields = ( - 'pk', 'id', 'group', 'provider', 'circuit', 'priority', 'created', 'last_updated', 'actions', 'tags', + 'pk', 'id', 'group', 'provider', 'member_type', 'member', 'priority', 'created', 'last_updated', 'actions', + 'tags', ) - default_columns = ('pk', 'group', 'provider', 'circuit', 'priority') + default_columns = ('pk', 'group', 'provider', 'member_type', 'member', 'priority') diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 92fbbdedf..291a2596c 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -295,7 +295,7 @@ class ProviderAccountTest(APIViewTestCases.APIViewTestCase): class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): model = CircuitGroupAssignment - brief_fields = ['circuit', 'display', 'group', 'id', 'priority', 'url'] + brief_fields = ['display', 'group', 'id', 'member', 'member_id', 'member_type', 'priority', 'url'] bulk_update_data = { 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, } @@ -330,17 +330,17 @@ class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) @@ -349,17 +349,20 @@ class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): cls.create_data = [ { 'group': circuit_groups[3].pk, - 'circuit': circuits[3].pk, + 'member_type': 'circuits.circuit', + 'member_id': circuits[3].pk, 'priority': CircuitPriorityChoices.PRIORITY_PRIMARY, }, { 'group': circuit_groups[4].pk, - 'circuit': circuits[4].pk, + 'member_type': 'circuits.circuit', + 'member_id': circuits[4].pk, 'priority': CircuitPriorityChoices.PRIORITY_SECONDARY, }, { 'group': circuit_groups[5].pk, - 'circuit': circuits[5].pk, + 'member_type': 'circuits.circuit', + 'member_id': circuits[5].pk, 'priority': CircuitPriorityChoices.PRIORITY_TERTIARY, }, ] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index 6b7866665..d9a5c1bc2 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -648,7 +648,6 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): CircuitGroup(name='Circuit Group 1', slug='circuit-group-1'), CircuitGroup(name='Circuit Group 2', slug='circuit-group-2'), CircuitGroup(name='Circuit Group 3', slug='circuit-group-3'), - CircuitGroup(name='Circuit Group 4', slug='circuit-group-4'), ) CircuitGroup.objects.bulk_create(circuit_groups) @@ -656,7 +655,6 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): Provider(name='Provider 1', slug='provider-1'), Provider(name='Provider 2', slug='provider-2'), Provider(name='Provider 3', slug='provider-3'), - Provider(name='Provider 4', slug='provider-4'), )) circuittype = CircuitType.objects.create(name='Circuit Type 1', slug='circuit-type-1') @@ -664,35 +662,72 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): Circuit(cid='Circuit 1', provider=providers[0], type=circuittype), Circuit(cid='Circuit 2', provider=providers[1], type=circuittype), Circuit(cid='Circuit 3', provider=providers[2], type=circuittype), - Circuit(cid='Circuit 4', provider=providers[3], type=circuittype), ) Circuit.objects.bulk_create(circuits) + provider_networks = ( + ProviderNetwork(name='Provider Network 1', provider=providers[0]), + ProviderNetwork(name='Provider Network 2', provider=providers[1]), + ProviderNetwork(name='Provider Network 3', provider=providers[2]), + ) + ProviderNetwork.objects.bulk_create(provider_networks) + + virtual_circuits = ( + VirtualCircuit( + provider_network=provider_networks[0], + cid='Virtual Circuit 1' + ), + VirtualCircuit( + provider_network=provider_networks[1], + cid='Virtual Circuit 2' + ), + VirtualCircuit( + provider_network=provider_networks[2], + cid='Virtual Circuit 3' + ), + ) + VirtualCircuit.objects.bulk_create(virtual_circuits) + assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], + priority=CircuitPriorityChoices.PRIORITY_TERTIARY + ), + CircuitGroupAssignment( + group=circuit_groups[0], + member=virtual_circuits[0], + priority=CircuitPriorityChoices.PRIORITY_PRIMARY + ), + CircuitGroupAssignment( + group=circuit_groups[1], + member=virtual_circuits[1], + priority=CircuitPriorityChoices.PRIORITY_SECONDARY + ), + CircuitGroupAssignment( + group=circuit_groups[2], + member=virtual_circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) CircuitGroupAssignment.objects.bulk_create(assignments) - def test_group_id(self): - groups = CircuitGroup.objects.filter(name__in=['Circuit Group 1', 'Circuit Group 2']) + def test_group(self): + groups = CircuitGroup.objects.all()[:2] params = {'group_id': [groups[0].pk, groups[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) params = {'group': [groups[0].slug, groups[1].slug]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) def test_circuit(self): circuits = Circuit.objects.all()[:2] @@ -701,12 +736,19 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'circuit': [circuits[0].cid, circuits[1].cid]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_virtual_circuit(self): + virtual_circuits = VirtualCircuit.objects.all()[:2] + params = {'virtual_circuit_id': [virtual_circuits[0].pk, virtual_circuits[1].pk]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + params = {'virtual_circuit': [virtual_circuits[0].cid, virtual_circuits[1].cid]} + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + def test_provider(self): providers = Provider.objects.all()[:2] params = {'provider_id': [providers[0].pk, providers[1].pk]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) params = {'provider': [providers[0].slug, providers[1].slug]} - self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) + self.assertEqual(self.filterset(params, self.queryset).qs.count(), 4) class ProviderNetworkTestCase(TestCase, ChangeLoggedFilterSetTests): diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index 036bebe23..56f874c1a 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -468,6 +468,7 @@ class CircuitGroupAssignmentTestCase( ViewTestCases.DeleteObjectViewTestCase, ViewTestCases.ListObjectsViewTestCase, ViewTestCases.BulkEditObjectsViewTestCase, + ViewTestCases.BulkImportObjectsViewTestCase, ViewTestCases.BulkDeleteObjectsViewTestCase ): model = CircuitGroupAssignment @@ -497,17 +498,17 @@ class CircuitGroupAssignmentTestCase( assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) @@ -517,11 +518,26 @@ class CircuitGroupAssignmentTestCase( cls.form_data = { 'group': circuit_groups[3].pk, - 'circuit': circuits[3].pk, + 'member_type': ContentType.objects.get_for_model(Circuit).pk, + 'member': circuits[3].pk, 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, 'tags': [t.pk for t in tags], } + cls.csv_data = ( + "member_type,member_id,group,priority", + f"circuits.circuit,{circuits[0].pk},{circuit_groups[3].pk},primary", + f"circuits.circuit,{circuits[1].pk},{circuit_groups[3].pk},secondary", + f"circuits.circuit,{circuits[2].pk},{circuit_groups[3].pk},tertiary", + ) + + cls.csv_update_data = ( + "id,priority", + f"{assignments[0].pk},inactive", + f"{assignments[1].pk},inactive", + f"{assignments[2].pk},inactive", + ) + cls.bulk_edit_data = { 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, } diff --git a/netbox/netbox/navigation/menu.py b/netbox/netbox/navigation/menu.py index fbbd3d0b1..559c2860b 100644 --- a/netbox/netbox/navigation/menu.py +++ b/netbox/netbox/navigation/menu.py @@ -279,8 +279,6 @@ CIRCUITS_MENU = Menu( items=( get_model_item('circuits', 'circuit', _('Circuits')), get_model_item('circuits', 'circuittype', _('Circuit Types')), - get_model_item('circuits', 'circuitgroup', _('Circuit Groups')), - get_model_item('circuits', 'circuitgroupassignment', _('Group Assignments')), get_model_item('circuits', 'circuittermination', _('Circuit Terminations')), ), ), @@ -291,6 +289,13 @@ CIRCUITS_MENU = Menu( get_model_item('circuits', 'virtualcircuittermination', _('Virtual Circuit Terminations')), ), ), + MenuGroup( + label=_('Groups'), + items=( + get_model_item('circuits', 'circuitgroup', _('Circuit Groups')), + get_model_item('circuits', 'circuitgroupassignment', _('Group Assignments')), + ), + ), MenuGroup( label=_('Providers'), items=( diff --git a/netbox/templates/circuits/circuit.html b/netbox/templates/circuits/circuit.html index 52c7d9894..d47b380fd 100644 --- a/netbox/templates/circuits/circuit.html +++ b/netbox/templates/circuits/circuit.html @@ -76,7 +76,7 @@ {% trans "Group Assignments" %} {% if perms.circuits.add_circuitgroupassignment %}